Иллюстрированный самоучитель по теории операционных систем

Порты передачи данных

Пример 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;Стартовый бит
putchar0: brcc putchar1;Если перенос установлен cbi PORTD,TxD; передать '0' rjmp putchar2;иначе
putchar1: sbi PORTD,TxD; передать '!' пор
Putchar2: rcall UART_delay /Задержка в один бит real! UART_delay
Isr Txbyte /Получить следующий бит dec bitcnt /
Если не все биты переданы brne putchar0; послать следующий; иначе
.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 Эта подпрограмма задержки генерирует требуемую задержку между битами
* при передаче и приеме байтов. Полное время исполнения определяется константой "b":
*3*b + 7 cycles (включая rcall и ret)
*
f Кол-во слов:4 включая возврат
* Мин. Регистров:Нет
* Макс. Регистров:1 (temp)
* Указатели:Не используются
Допустимые значения b:
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 b =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
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.