123456789101112131415161718192021222324252627282930313233343536373839404142 |
- ; оригинал для 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
|