; оригинал для attiny13 9.6 MHz ;;; Soft UART -- Побитно передаем байт из TXB ; на линии всегда 1. стартовый бит = 0. потом 8 бит данных, стоп-бит = 1. ; данные инверсные - 0=1, 1=0. хотя в этом алгоритме -- прямые ; похоже, что инверсия только на физ. уровне. т.е. у нас -- прямые... ; проверить в протеусе!!! SoftUART: PUSHF push tmp1 cbi PortB,TX ; стартовый бит ldi tmp1,8 ; 8 бит данных LOSL: push temp ; 2 | 115 тактов для 38400, 73 для 57600 (ошибка -0.4%) ldi temp,11 ; 1 | 27 для 38400, 11 для 57600, 6 для 115200 LOS0: nop ; 1 \ для 38400 и 115200 - 1 nop nop ; 1 | для 57600 - 3 nop-а nop ; 1 | - осталось 108/66 тактов dec temp ; 1 | brne LOS0 ; 2 / 1 pop temp ; 2 | ; nop ; 1 | Для 115200 nop ; 1 | --- конец цикла задержки. вход и выход - 7 тактов lsr TXB ; 1 мл бит вперёд brcc LOUT0 ; 1/2 если C не установлен - выводим 0 sbi PortB,TX ; 2 вывели 1 rjmp LOEC ; 2 конец цикла LOUT0: cbi PortB,TX ; 2 вывели 0 nop ; 1 для выравнивания тактов LOEC: nop ; 1 для круглого счёта dec tmp1 ; 1 brne LOSL ; 2, 1 при выходе ; 10 тактов == 2,083 мкс на 1 бит, 9 тактов == 1,875 мкс на 1 бит ; 83.3 - 57600; 125 - 38400; 250 - 19200; 500 - 9600; 41.6 - 115200 ; на скорости 57600 можно успеть передать 28 байт за время 1-го прервания ; ~56 байт, 42-10=32 такта, 32-... (ошибка +1%) sbi PortB,TX ; стоповый бит pop tmp1 POPF ret