Kopia 2313_rs_05.bas.txt

Bascom i szybka transmisja po RS232

No to zaczynamy po raz kolejny. Coś takiego jak stworzyłeś to niestety za szybko nie będzie działać. Mega z kwarcem rs 14 z groszami działa naprawdę szybko i można zrobić bardzo dużo w jedna sekundę. Do odbierania i wysyłania danych można sobie napisać własną procedurę - nawet w bascomie i jest ona sporo szybsza i działa rewelacyjnie. Deklarujemy przerwania od rs'a:On Urxc Rs_rx_ok On Utxc Rs_tx_ok Deklarujemy zmienne:Dim Rs_rx_bufor As Byte Dim Rs_tx_bufor(30) As Byte 'na wszelki wiecej Dim Rs_tx_licznik As Byte Dim Rs_tx_ograniczenie As Byte Przerwanie od rx:Rs_rx_ok: If Udr = "i" Then Rs_tx_licznik = 2 : Rs_tx_ograniczenie = 25 'ustaw poczatek w stringu do wyslania Reset Ucr.4 Udr = Rs_tx_bufor(1) 'poczatek wiadomosci Else Rs_rx_bufor = Udr End If Return Przerwanie od tx:Rs_tx_ok: If Rs_tx_licznik > Rs_tx_ograniczenie Then Rs_tx_licznik = 1 Set Ucr.4 Else Udr = Rs_tx_bufor(rs_tx_licznik) : Incr Rs_tx_licznik End If Return Deklarujemy sobie jakieś napisy początkowe(przed pętlą główną): Rs_tx_bufor(1) = "0" Rs_tx_bufor(2) = "0" Rs_tx_bufor(3) = ":" Rs_tx_bufor(4) = "0" Rs_tx_bufor(5) = "0" Rs_tx_bufor(6) = ":" Rs_tx_bufor(7) = "0" Rs_tx_bufor(8) = "0" Rs_tx_bufor(9) = ":" Rs_tx_bufor(10) = "0" Rs_tx_bufor(11) = "0" Rs_tx_bufor(12) = ":" Rs_tx_bufor(13) = "0" Rs_tx_bufor(14) = "0" Rs_tx_bufor(15) = ":" Rs_tx_bufor(16) = "0" Rs_tx_bufor(17) = "0" Rs_tx_bufor(18) = ":" Rs_tx_bufor(19) = "0" Rs_tx_bufor(20) = "0" Rs_tx_bufor(21) = ":" Rs_tx_bufor(22) = "0" Rs_tx_bufor(23) = "0" Rs_tx_bufor(24) = &h0A 'CR Rs_tx_bufor(25) = &h0d 'LF Przykład z pliku napisanego dla tiny2313 - dlatego takie nazwy rejestrów. Konfiguracje prędkości i ustawienia wysyłania, załączenia przerwań podpatrz w załączonym pliku. Dobrze ci idzie ale poanalizuj jeszcze trochę datasheet do twojego uC. Dodano po 5 : Do moderatora: wiem że złamałem regulamin (wysyłanie post pod postem) ale tak chyba będzie bardziej czytelne - inaczej wychodzi straszny tasiemiec. -------------------------------------------------------------------------------------- Programik działa tak ze normalnie w pętli coś tam może sobie robić (najpewniej analizować zmienne, przerabiać je na hex i wstawiać w odpowiednie miejsca do bufora(tam gdzie w przykładzie są zera). W momencie nadejścia literki "i" ustawia sobie odpowiednio liczniki i ograniczenia liczników i wysyła jeden znak(pierwszy). W momencie jak wyśle wystąpi przerwanie nadania (nadawania), zwiększy licznik, sprawdzi czy już ma być koniec (ograniczenie) i albo zakończy albo wyśle kolejny znak z bufora. Tak to działa i działa bardzo dobrze.


$regfile = " 2313def.dat "
$crystal = 6000000
$baud = 2400
'$sim
'-------------------------------------------------------------------------------
On Urxc Rs_rx_ok
On Utxc Rs_tx_ok
'-------------------------------------------------------------------------------
Dim Rs_rx_bufor As Byte

Dim Rs_tx_bufor(16) As Byte
Dim Rs_tx_licznik As Byte
Dim Rs_tx_ograniczenie As Byte

Dim Rs_tx_konwersja_wejscie As Byte
Dim Rs_tx_konwersja_wyjscie As Byte

Dim Rs_obroty As Byte
Dim Rs_predkosc As Byte
Dim Rs_napiecie As Byte
Dim Rs_temperatura As Byte
Dim Rs_wyprzedzenie As Byte
'-------------------------------------------------------------------------------
Gosub Rs_tx_refresh
'-------------------------------------------------------------------------------
'Config Pind.0 = Input
'Config Pind.1 = Output
Ddrd = & B11111110
Portd = & B11111101
Enable Urxc
Set Ucr.4
Enable Utxc
Set Ucr.3
Enable Interrupts
'-------------------------------------------------------------------------------
Do
Rs_obroty = Rs_obroty + 3
' Incr Rs_obroty
' Rs_obroty = 11
If Rs_obroty & gt; 200 Then Incr Rs_predkosc
' Rs_predkosc = 22
' Rs_napiecie = 133
If Rs_obroty & lt; 80 Then
Rs_napiecie = 128
Elseif Rs_obroty & gt; 190 Then
Rs_napiecie = Rs_napiecie + 3
Else
Rs_napiecie = Rs_napiecie + 1
End If
Rs_temperatura = 140
Rs_wyprzedzenie = 48
Gosub Rs_tx_refresh
' Waitms 255
Waitms 255
Loop
'-------------------------------------------------------------------------------
Rs_tx_refresh:
Rs_tx_bufor(1) = " i "
Rs_tx_konwersja_wejscie = Rs_obroty : Gosub Rs_tx_konwersja_dziel : Gosub Rs_tx_konwersja
Rs_tx_bufor(2) = Rs_tx_konwersja_wyjscie
Rs_tx_konwersja_wejscie = Rs_obroty : Gosub Rs_tx_konwersja
Rs_tx_bufor(3) = Rs_tx_konwersja_wyjscie
Rs_tx_bufor(4) = " , "
Rs_tx_konwersja_wejscie = Rs_predkosc : Gosub Rs_tx_konwersja_dziel : Gosub Rs_tx_konwersja
Rs_tx_bufor(5) = Rs_tx_konwersja_wyjscie
Rs_tx_konwersja_wejscie = Rs_predkosc : Gosub Rs_tx_konwersja
Rs_tx_bufor(6) = Rs_tx_konwersja_wyjscie
Rs_tx_bufor(7) = " , "
Rs_tx_konwersja_wejscie = Rs_napiecie : Gosub Rs_tx_konwersja_dziel : Gosub Rs_tx_konwersja
Rs_tx_bufor(8) = Rs_tx_konwersja_wyjscie
Rs_tx_konwersja_wejscie = Rs_napiecie : Gosub Rs_tx_konwersja
Rs_tx_bufor(9) = Rs_tx_konwersja_wyjscie
Rs_tx_bufor(10) = " , "
Rs_tx_konwersja_wejscie = Rs_temperatura : Gosub Rs_tx_konwersja_dziel : Gosub Rs_tx_konwersja
Rs_tx_bufor(11) = Rs_tx_konwersja_wyjscie
Rs_tx_konwersja_wejscie = Rs_temperatura : Gosub Rs_tx_konwersja
Rs_tx_bufor(12) = Rs_tx_konwersja_wyjscie
Rs_tx_bufor(13) = " , "
Rs_tx_konwersja_wejscie = Rs_wyprzedzenie : Gosub Rs_tx_konwersja_dziel : Gosub Rs_tx_konwersja
Rs_tx_bufor(14) = Rs_tx_konwersja_wyjscie
Rs_tx_konwersja_wejscie = Rs_wyprzedzenie : Gosub Rs_tx_konwersja
Rs_tx_bufor(15) = Rs_tx_konwersja_wyjscie
Rs_tx_bufor(16) = & H0D 'ENTER
Return
'-------------------------------------------------------------------------------
Rs_tx_konwersja:
Rs_tx_konwersja_wejscie = Rs_tx_konwersja_wejscie And & B00001111
If Rs_tx_konwersja_wejscie & lt; 10 Then
Rs_tx_konwersja_wyjscie = Rs_tx_konwersja_wejscie + 48 '0..9
Else
Rs_tx_konwersja_wyjscie = Rs_tx_konwersja_wejscie + 55 'A..F
End If
Return
'-------------------------------------------------------------------------------
Rs_tx_konwersja_dziel:
Rs_tx_konwersja_wejscie = Rs_tx_konwersja_wejscie And & B11110000
Rotate Rs_tx_konwersja_wejscie , Right , 4
Return
'-------------------------------------------------------------------------------
Rs_rx_ok:
If Udr = " i " Then
Rs_tx_licznik = 2 : Rs_tx_ograniczenie = 16 'ustaw poczatek w stringu do wyslania
Reset Ucr.4
Udr = Rs_tx_bufor(1) 'poczatek wiadomosci
Else
Rs_rx_bufor = Udr
End If
Return
'-------------------------------------------------------------------------------
Rs_tx_ok:
If Rs_tx_licznik & gt; Rs_tx_ograniczenie Then
Rs_tx_licznik = 1
Set Ucr.4
Else
Udr = Rs_tx_bufor(rs_tx_licznik) : Incr Rs_tx_licznik
End If
Return
'-------------------------------------------------------------------------------


Download file - link to post