Mogą. I to na wiele sposobów. Doświadczeni elektronicy od razu wskażą kilka - od prostego połączenia port-w-port począwszy.
Jednym z elementów wyposażenia mikrokontrolerów AVR, a dokładniej moich dwóch modeli ATtiny2313 i ATmega48P, jest zrealizowany sprzętowo port UART, zgodny logicznie z RS232 (jeśli chodzi o całkowitą zgodność, konieczne jest użycie układu dopasowującego napięcia - można użyć tranzystorów lub MAX232). Obsługa tego portu w BASCOMie jest banalnie prosta. Posłużmy się przykładem. Niech ATmega będzie nadajnikiem, który wysyła przez łącze szeregowe, w odstępach co ok. pół sekundy, kolejne duże litery alfabetu łacińskiego (a przy okazji każdy wysłany znak sygnalizuje zapalająca się na chwilę dioda - schematu i konstrukcji układu z poprzedniego posta nie zmieniałem); wysyłanie liter uruchamiane jest przyciskiem. ATtiny zaś, wyposażony w wyświetlacz LCD, będzie odbiornikiem, który podczas oczekiwania na znak wyświetla napis "Ready...", po odbiorze znaku wyświetla jego kod ASCII i sam znak, a na koniec transmisji, po odebraniu kodu "znaku" Escape, pokazuje przez chwilę napis "End!".
Do wysyłania znaków (pojedynczych, seryjnie) przez port szeregowy służy funkcja Print lub Printbin, do odbierania - Inkey lub Waitkey (ta druga wstrzymuje program do nadejścia nowego znaku - nie polecam). Portów sprzętowych w układach, które tutaj wykorzystałem, nie trzeba konfigurować.
Programy odbiornika i nadajnika możemy sobie przejrzeć na poniższym listingu:
Pamiętajmy o poprawnym połączeniu naszych dwóch układów mikroprocesorowych, szczególnie, gdy każdy korzysta ze swojego źródła zasilania. Musimy połączyć masy obu układów oraz - na krzyż - linie TxD i RxD (w poprzednim wpisie linkowałem karty katalogowe - tam znajdziemy opis wyprowadzeń obu mikrokontrolerów). Kolejna ważna sprawa to parametry transmisji - w zasadzie konfigurowalna jest tylko prędkość; w obu układach powinna być koniecznie ustawiona taka sama wartość. Zmiany wartości możemy dokonać na poziomie środowiska (w odpowiednim okienku - przy okazji dowiemy się, jaka będzie najodpowiedniejsza dla naszego kwarcu/częstotliwości taktowania) lub wpisać w kodzie programu.
Istnieje również możliwość zdefiniowania programowego portu szeregowego - BASCOM dostarcza w tym przypadku bardzo wygodnych narzędzi. Jak zwykle zresztą :)
Jednym z elementów wyposażenia mikrokontrolerów AVR, a dokładniej moich dwóch modeli ATtiny2313 i ATmega48P, jest zrealizowany sprzętowo port UART, zgodny logicznie z RS232 (jeśli chodzi o całkowitą zgodność, konieczne jest użycie układu dopasowującego napięcia - można użyć tranzystorów lub MAX232). Obsługa tego portu w BASCOMie jest banalnie prosta. Posłużmy się przykładem. Niech ATmega będzie nadajnikiem, który wysyła przez łącze szeregowe, w odstępach co ok. pół sekundy, kolejne duże litery alfabetu łacińskiego (a przy okazji każdy wysłany znak sygnalizuje zapalająca się na chwilę dioda - schematu i konstrukcji układu z poprzedniego posta nie zmieniałem); wysyłanie liter uruchamiane jest przyciskiem. ATtiny zaś, wyposażony w wyświetlacz LCD, będzie odbiornikiem, który podczas oczekiwania na znak wyświetla napis "Ready...", po odbiorze znaku wyświetla jego kod ASCII i sam znak, a na koniec transmisji, po odebraniu kodu "znaku" Escape, pokazuje przez chwilę napis "End!".
Do wysyłania znaków (pojedynczych, seryjnie) przez port szeregowy służy funkcja Print lub Printbin, do odbierania - Inkey lub Waitkey (ta druga wstrzymuje program do nadejścia nowego znaku - nie polecam). Portów sprzętowych w układach, które tutaj wykorzystałem, nie trzeba konfigurować.
Programy odbiornika i nadajnika możemy sobie przejrzeć na poniższym listingu:
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
' Test UART - nadajnik (ATmega48P + ULN2803 + 3*LED) | |
$regfile = "m48pdef.dat" | |
$crystal = 4000000 | |
$baud = 9600 | |
$hwstack = 40 | |
$swstack = 16 | |
$framesize = 32 | |
$eeprom | |
Alfabet: | |
Data 65 , 66 , 67 , 68 , 69 , 70 , 71 , 72 , 73 , 74 , 75 , 76 | |
Data 77 , 78 , 79 , 80 , 81 , 82 , 83 , 84 , 85 , 86 , 87 , 88 | |
Data 89 , 90 , 27 | |
$data | |
Config Portc = &B0111111 | |
Portc = &B0000000 | |
Config Portd.2 = Input | |
Portd.2 = 1 | |
Dim Adres As Byte , Tmp As Byte | |
Dim Dioda As Byte | |
Dim Znak As Byte | |
Dim I As Byte | |
Adres = Loadlabel(alfabet) | |
Tmp = Adres | |
Do | |
Debounce Pind.2 , 0 , Wyslij , Sub | |
Loop | |
End | |
Wyslij: | |
For I = 1 To 27 | |
Readeeprom Znak , Tmp | |
Printbin Znak | |
If Dioda = 0 Then | |
Portc = 4 | |
Elseif Dioda = 2 Then | |
Portc = 1 | |
Else | |
Portc = 2 | |
End If | |
Incr Dioda | |
Dioda = Dioda Mod 3 | |
Waitms 500 | |
Incr Tmp | |
Next I | |
Tmp = Adres | |
Dioda = 0 | |
Portc = 0 | |
Return |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
' Test UART - odbiornik (ATtiny2313 + wyświetlacz LCD) | |
$regfile = "attiny2313.dat" | |
$crystal = 4000000 | |
$baud = 9600 | |
$hwstack = 40 | |
$swstack = 16 | |
$framesize = 32 | |
Config Lcd = 16 * 1a | |
Dim Znak As Byte | |
Cls | |
Cursor Off | |
Lcd "Ready..." | |
Do | |
Znak = Inkey() | |
If Znak > 0 Then | |
If Znak <> 27 Then | |
Cls | |
Lcd "CHR: " + Znak + " " + Chr(znak) | |
Else | |
Cls | |
Lcd "End!" | |
Waitms 1000 | |
Cls | |
Lcd "Ready..." | |
End If | |
End If | |
Loop | |
End |
Istnieje również możliwość zdefiniowania programowego portu szeregowego - BASCOM dostarcza w tym przypadku bardzo wygodnych narzędzi. Jak zwykle zresztą :)
Komentarze
Prześlij komentarz