Программная имитация
Пример 9.1. Программная имитация Р5232-совместимого последовательного порта, цит. по [www.atmel.com AVR305]
;**** APPLICATIONNOTEAVR305 ************************ . *
;* Название : Полудуплексный программный UART
;* Версия : 1.20
;* Последнее обновление : 97.08.27
;* Целевое устройство : Все микроконтроллеры AVR . *
;* Адрес поддержки : avr@atmel.com . *
;* Размер кода : 32 слова
;* Мин. Регистров : О
;* Макс. Регистров : 4 .
;* Прерывания : Не используются
;* Описание
;* Этот пример содержит эффективный с точки зрения объема кода программный UART.
;* Программа-пример получает один символ и передает его назад.
.include "1200def.inc" .***** определения контактов
.equ RxD =0 /Контакт приема PDO .equ TxD =1 ;Контакт передачи PD1
.*****
Глобальные регистровые переменные
.def bitcnt =R16 ;счетчик битов
.def temp =R17 промежуточный регистр
.def Txbyte =R18 ;Передаваемые данные
def Rxbyte =.<19 /Полученные данные .cseg
.org
0
* "putchar" *
* Эта подпрограмма передает байт из регистра "Txbyte"
* Количество стоповых битов определяется константой sb *
* Количество слов :14 включая возврат
* Количество циклов :Зависит от частоты передачи
* Мин. Регистров :Нет
* Макс. Регистров :2 (bitcnt,Txbyte)
* Указатели :Не используются
.equ sb =1 ;Кол-во стоповых битов (1, 2, ...)
putchar: Idi bitcnt,9+sb ;1+8+sb com Txbyte ;Инвертировать все sec ;Стартовый бит
putcharO: brcc putchar1 ;Если перенос установлен cbi PORTD,TxD ; передать 'О' rjmp putchar2 ;иначе
putcharl: sbi PORTD,TxD ; передать '!' пор
Putchar2: rcall UART_delay /Задержка в один бит real! UART_delay
Isr Txbyte /Получить следующий бит dec bitcnt /Если не все биты переданы brne putcharO ; послать следующий ;иначе
.Leu ; возврат
* "getchar"
?
* Эта подпрограмма получает один байт и возвращает его в "Rxbyte" *
* Кол-во слов :14 включая возврат
* Кол-во циклов :Зависит от скорости приема
* Мин. Регистров :Нет
* Макс. Регистров :2 (bitcnt,Rxbyte)
* Указатели :Не используются
getchar: Idi bitcnt,9 ;8 бит данных + 1 столовый
*
getcharl: sbic PIND,RxD ;Ждать стартового бита rjmp getcharl
rcall UART_delay ;задержка в 0.5 бита
getchar2: rcall UART_delay /задержка в один бит rcall UART__delay
clc /очистить перенос
sbic PIND,RxD ;если вход RX = 1
sec
dec bitcnt ;Если бит столовый breq getcharS ; возврат
/иначе
ror Rxbyte ; сдвинуть бит в Rxbyte rjmp getchar2 ; получить следующий
getcharS: ret
I "UART_delay"
*
I Эта подпрограмма задержки генерирует требуемую задержку между битами
* при передаче и приеме байтов. Полное время исполнения определяется I константой "Ь":
*3*Ь + 7 cycles (включая rcall и ret)
*
f Кол-во слов :4 включая возврат
* Мин. Регистров :Нет
* Макс. Регистров :1 (temp)
* Указатели :Не используются
Допустимые значения Ь:
1 MHz crystal: 9600 bps - b=14 19200 bps - b=5 28800 bps - b=2
2 MHz crystal: 19200 bps - b=14 28800 bps - b=8 57600 bps - b=2
4 MHz crystal: 19200 bps - b=31 28800 bps - b=19 57600 bps - b=8 115200 bps - b=2
•equ ь =31 ;19200 bps @ 4 MHz crystal
UART_delay: Idi temp,b uART_delayl: dec temp Brne UART delayl
ret
;***** Исполнение программы начинается здесь ;***** Тестовая программа
reset: sbi PORTD,TxD ;Установить контакты порта sbi DDRD,TxD
Idi Txbyte,12 /Очистить терминал rcall putchar
forever: rcall getchar mov Txbyte,Rxbyte
rcall putchar ;Воспроизвести полученный символ
rjmp forever