soft_uart.asm 1.8 KB

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