Порты передачи данных
Пример 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