Napisanie programu
umożliwiającego przesłanie danych przez port UART w kompilatorze
Bascom wydaje się być bardzo proste, ale tak nie jest. Powodem próby
wyjaśnienia problemów, jest współpraca modułów Bluetooth (XM-15B, HC-5,
HC-6) z mikrokontrolerem. Transmisja danych odbywa się przez port UART.
Połączenia należy krosować czyli wykonać następująco:
- moduł Bluetooth TxD -> RxD UART,
- moduł Bluetooth RxD -> TxD UART,
- Vcc - U=5 V,
- GND - masa układu mikrokontrolera (GND).
Zacząć należy od wyboru
rodzaju portu software/hardware. Następnie musimy zdecydować czy otwarte
zostaną dwa kanały transmisji danych, czy jeden dwukierunkowy. Jeżeli
wybieramy dwa kanały, to pierwszy używany jest do wysyłania danych (For Output), a
drugi do odbierania (For Input). Możemy wybrać jeden kanał dwukierunkowy
(For Binary), jednak wiąże się to z koniecznością wyboru wspomagania
sprzętowego dla UATR. Przykładowo dla mikrokonrolera ATMega32 są to piny
14 i 15 opisane RxD oraz TxD. Na końcu należy zadbać o otwarcie kanałów i odpowiednie
ich zamknięcie oraz aktywację przerwań (Enable Interrupts) jednak nie
zawsze. W omawianych poniżej metodach wybrano sprzętowe
wspomaganie transmisji danych przez konfigurację - hardware.
Config Com1 = 9600, Synchrone = 0, Parity = None,
Stopbits = 1, Databits = 8, Clockpol = 0 (dokładny opis w pliku pomocy
F1)
Open "COM1:" For Binary As #1
To jest otwarcie dwukierunkowego kanału o nazwie #1.
Close #1
Tak zamykamy kanał #1 i należy tę komendę umieścić na końcu całego kodu.
Open "comd.0:9600,8,n,1" For Input As #1
Open "comd.1:9600,8,n,1" For Output As #2
To jest otwarcie osobnych kanałów #1 i #2 oraz jednoczesna konfiguracja
transmisji:
comd.1 - port
com w PORTD.1
9600 - Baud
Rate,
8 - ramka ośmio bitowa,
n - brak bitu
parzystości,
1 - jeden bit
stopu.
Close #1
Close #2
zamykają odpowiednio kanały #1 i #2.
Kompilator Baskom zawiera następujące komendy i funkcje umożliwiające
komunikację przez port UART:
Input #1, zmienna
- ZATRZYMUJE! działanie programu w tym miejscu i oczekuje
na dane,
Get #1, zmienna -
pobiera jeden znak z portu UART,
Print #2, zmienna -
wpisuje dane do portu UART.
Ischarwaiting - sprawdza czy w buforze UART znajduje się znak.
Do wyżej wymienionych problemów dochodzi decyzja o buforowaniu
transmisji lub działaniu bezpośrednim.
Config Serialin = Buffered , Size = 10
Przykładowy fragment programu:
Open "COMD.0:9600,8,n,1" For Input As #1
Open "COMD.1:9600,8,n,1" For Output As #2
Gosub Disp
Do
Input #1 , Znaki Noecho
If Znaki = "Sw11" Then
Porta.0 = 0
Print #2 , "Led1 1"
End If
Gosub Disp
Print #1, Znaki
Loop
End
Disp:
Cls
Lcd "Znaki - " ; Znaki
Return
Close #1
Close #2
Istnieje możliwość "uwolnienia" działania programu od zatrzymania przez
buforowanie portu UART lub aktywację polecenia $Timeout. Wpisanie
większej wartości, powoduje wydłużenie czasu oczekiwania na uwolnienie.
Limit czasu nie jest podawany w sekundach ani mikrosekundach, lecz jest
liczbą względną. Jej wartość zależy od częstotliwości generatora
taktującego i wymagań stawianych programowi.
[..cd..]