Zaslání 4hodnot A,B,C,D přes RS232 a příjemdo Atmega8 bascom
Moderátor: Moderátoři
Zaslání 4hodnot A,B,C,D přes RS232 a příjemdo Atmega8 bascom
prosím Vás o metodologickou radu:
Jak realizovat komunikaci mezi dvěmi čipy,přičemž:
ATMEGA8 č.1
odesílá přes RS232 najednou 4 hodnoty
A,B,C,D
ATMEGA8 č.2
přijímá tyto 4 hodnoty a vypisuje na terminálu do jednoho řádku.
Otázka je, jak prosím realizovat metodologicky správně to, aby
v ATMEGA č.2 program dokázal, po výpisu čísel do řádku v terminálu v této podobě : A=2, B=3, C=45, D=5,
je vzít opět jako čísla, se kterými je možné počítat a bude vědět, že číslo 2 je A, číslo 3 je B, číslo 45 je C, číslo 5 je D?
Je jedinná možnost tyto čísla načítat postupně?
Prosím Vás o radu,
děkuji
takže jeden po druhém musím načíst =
čekám na znak A
pošlu znak A
znak A přijat
přijatý znak = A
čekám na znak ¨B
pošlu znak B
znak B přijat
přijatý znak=B
a další...
je to tak?
děkuji
michalino píše:...dělám v BASCOMu, tak to soudím jen dle toho...
Nj to je tipicky tmářský přístup moderních programátorů, kteří tvrdí, že učit se programovat v ASM a seznámit se s HW je v dnešní době úplný nesmysl, vždyť ve vyšších jazycích můžeme programovat platformě nezávisle, toto je potom důsledek
Linka RS232 musí fungovat spolehlivě, jinak je to zbytečná dřina. Na obou koncích musí být nastavená stejná rychlost, správné napěťové úrovně, do UARTu nesmíš zapsat dřív, dokud neodvysílal předchozí znak (ale na to by Bascom měl pamatovat nějakým buffrem).
Pokud chceš s přijatým znakem později pracovat, musíš ho po příjmu uložit do nějaké proměnné, z terminálu už ho nazpět nedostaneš.
Měl by ses ujistit, že první přijatý znak je opravdu počátek té série, zvlášť když je komunikace nespolehlivá. Třeba nultým znakem STX a závěrečným EOT (viz tabulka ASCII).
Hodně štěstí!
michalino píše:Děkuji za podrobnou odpověď...zkusím jít krok za krokem...jeden z problémů je ten, že pokud neustále atmega posílá přes uart data, 4 čísla, pak opravdu jednou za cca 10 sekund, hlavně po změně stavu se nějaké parazitní data namísto správných čísel dostanou...to ale musím ještě vychytat, aby se to správně popsalo, každopádně Vám děkuji za námět
Ahoj Michalino, koukám, že jsi koncepci propojení dvou Atmeg nedal pokoj
Co posíláš jako proud dat po té RS232? Obzvláště v oblasti meteorologie? Nestačilo by ta data poslat jednou za čas? A ošetřit jejich odeslání a přijetí?
zdravím Vás,
tedy s radostí k věci:
posílám hodnoty klasickým příkaze print:
A=500
B=400
C=420
D=150
Print "Prvni hodnota-" ; A ; ".." ; "Druha hodnota-" ; B ; ".." ; "Treti hodnota-" ; C ; ".." ; "Ctvrta hodnota-" ; D
na terminálu se mi samozřejmě krásně zobrazí tyto hodnoty, které posílá atmega1 na terminál, ale pokud to pošlu do atmega2 pomocí uartu, tak potřebuju, aby atmega2 věděla, že A je tolik, B tolik, C tolik a D tolik...
přesně jak píšete, zahájit vysílání, počkat si na první čííslo, pokud bude přijato, čekat na druhé, atd...tedy bude toto nejefektivnější řešení a nejprofesionálnější? Ptám se z pohledu té "meteorologie"
Ostatní už jste mě naučili...respektive s kodem se pobiju a kdyz uz to nevydrzim, tak poprosim o radu, zatim metodologie
-
Návštěvník
Tak to neposílej 🤐 printem, ale nějak normálně, třeba jako 8 bytů, pokud jsou to čtyři 16bitový integery.michalino píše:tedy s radostí k věci:
posílám hodnoty klasickým příkaze print:
A=500
B=400
C=420
D=150
Print "Prvni hodnota-" ; A ; ".." ; "Druha hodnota-" ; B ; ".." ; "Treti hodnota-" ; C ; ".." ; "Ctvrta hodnota-" ; D
To je jako to napsat na papír, naskenovat a rozpoznávat OCR.
tak jsem nasimuloval program na simulátoru v bascomu a vypadlo z něj toto, myslíte si, že je to dobrá cesta k přijetí čísla-čísel na UART a použití dále tohoto čísla k počítání .....? Čísla budou 4, zde je princip přijetí jednoho čísla a počítání s tímto jedním číslem:
Dim Rx_char As Byte
Dim Instring As String * 10
Dim Varval As Integer
Do
If Ischarwaiting() = 1 Then
Rx_char = Inkey() ' stisknu klávesu 4 a simuluju přijetí čísla 4
Print "Stiskl jsi (na rs 232 bylo posláno číslo:)"
Printbin Rx_char ' 4
Instring = Str(rx_char) ' prevod znaku ze stringu na pocitatelny format
Varval = Val(instring) ' prevod znaku ze stringu na pocitatelny format
Varval = Binval(varval)
Varval = Varval * Varval ' Provedu nějaký výpočet 4 * 4
Print Varval ' vytisknu výpočet 16
End If
Loop
End
a další číslo přijde na řadu...
je to tak v pořádku nebo existuje lepší varianta a anonyme, jak jsi to myslel prosím Ty?
děkuji