software uart bascom attiny25
OPEN
, SERIN
/SEROUT
lub własnych procedur „bit-bang”. Mikrokontroler i ograniczenia
• ATtiny25 (2 kB Flash, 128 B RAM) nie ma modułu USART; posiada tylko Timer0/1 i uniwersalny interfejs USI.
• Software UART obciąża CPU; każda ramka 10 bitów przy 9600 baud zajmuje ≈ 1,04 ms.
Model czasowy UART
• Start (0), 8 bitów danych (LSB-first), stop (1). Precyzja ±2 % dla zegara.
• W BASCOM biblioteka swuart.lbx
wykorzystuje Timer0 i przerwanie pin-change (RX).
Implementacja w BASCOM
$regfile = "attiny25.dat"
$crystal = 8000000 ' dokładny takt!
$hwstack = 32 : $swstack = 10 : $framesize = 40
'--- definicja pinów -------------------------------------------------------
Const TxPin = Portb.0 'Tx PB0 (nóżka 5 DIP)
Const RxPin = Portb.1 'Rx PB1 (nóżka 6 DIP)
'--- kanały software UART --------------------------------------------------
Open "comb.0:9600,8,n,1" For Output As #1 'TX
Open "comb.1:9600,8,n,1" For Input As #2 'RX (opcjonalnie)
Do
Print #1 , "Hello from ATtiny25", CrLf
If Ischarwaiting(#2) Then
Dim c As Byte : c = Inkey(#2)
Print #1 , "RX=" ; Chr(c)
End If
Waitms 1000
Loop
• Jeżeli potrzebujesz tylko nadawania – otwórz wyłącznie kanał TX (mniej kodu, szybsza praca).
• SEROUT TxPin ,9600 ,Data
/SERIN RxPin ,9600 ,Var
‑ alternatywa przy prostych aplikacjach.
USI jako pół-dupleksowy UART
! .include "usi_uart.asm"
lub użyć komend INLINE. Testowanie i kalibracja
• Oscyloskop/analizator logiczny: sprawdź czas bitu (powinno być 104 µs dla 9600).
• Kalibracja RC-oscylatora: odczyt OSCCAL
, skoryguj fusy lub wpisz wartość w OSCCAL = &Hxx
. Dla prędkości > 19200 baud zalecany kwarc 7,3728 MHz lub 9,216 MHz.
Praktyczne zastosowania
▪ Repozytoria online (2023-2024) oferują zoptymalizowane biblioteki:
– ArminJo/ATtinySerialOut → jedynie TX, 115 200 baud przy 16 MHz.
– BecomingMaker – pełny USI-UART TX/RX, kompatybilny z Tiny25/45/85.
▪ W nowych rodzinach AVR 0/1-series (np. ATtiny202) firma Microchip wróciła do pełnego USART – w przyszłych projektach warto rozważyć migrację, zamiast „męczyć” soft-UART.
▪ Kompilator BASCOM-AVR 2.1.9.9 (kwiecień 2024) dodał dyrektywę CONFIG SERIALIN = INTERRUPT
, usprawniając bufor 32 B dla programu odbiornika.
• Porównanie czasów (8 MHz):
Baud | Błąd RC ±10 % | Błąd po kalibracji ±1 % | Czas znaku |
---|---|---|---|
2400 | ±0,5 % | ±0,05 % | 4,17 ms |
9600 | ±2,0 % | ±0,2 % | 1,04 ms |
19200 | ±4,1 % (ryzyko błędów) | ±0,4 % | 0,52 ms |
• Analogia: Soft-UART to „morse’owy telegraf” – procesor musi „stuknąć” każdy bit w dokładnym rytmie, więc nie może w tym czasie robić nic innego.
Implementacja
a) Zacznij od TX-only; gdy działa – dodaj RX.
b) Wyłącz zbędne przerwania (Config Timer1 = Off
) podczas transmisji.
c) Buforuj dane w RAM przed wysyłką, aby skrócić blokujące wywołania Print
.
Najlepsze praktyki
– Stosuj makro Disable Interrupts : Print ... : Enable Interrupts
dla długich bloków TX.
– Testuj z konwerterem USB-TTL opartego na FTDI (szybsza enumeracja, stabilny driver).
Wyzwania
• Kolizje RX/TX w half-duplex – dodaj opóźnienie > 3 znaki pomiędzy kierunkami.
• Przeciążenie timerów – soft-PWM na Timer0 koliduje z biblioteką UART; przenieś PWM na Timer1.
• Porównanie wydajności: software UART vs. USI-UART vs. nowy AVR0-series z USART.
• Implementacja enkapsulacji HDLC lub SLIP na soft-UART dla prostych sieci sensorów.
• Przetestuj biblioteki:
– https://github.com/ArminJo/ATtinySerialOut
– https://becomingmaker.com/usi-serial-uart-attiny85/
– Nota aplikacyjna AVR307 (Microchip).
Programowy UART w BASCOM-AVR na ATtiny25 jest możliwy i praktyczny do prostych zadań debug- lub komunikacyjnych: wybierz piny, ustaw dokładny zegar, zastosuj komendy OPEN
/SERIN
/SEROUT
lub moduł USI, trzymaj się 9600 baud, testuj oscyloskopem. Przy większych wymaganiach (przepustowość, pełny dupleks, niski udział CPU) rozważ migrację do mikrokontrolera z wbudowanym USART lub implementację USI-UART.