hallo forianer, ich muss für ein projekt eine serielle kommunikation aufbauen. master wird der Mega128, empfänger ist ein DSP (programmiert ein kollege). nun ist es für mich das erste mal, so etwas zu programmieren. ein wenig habe ich schon geschafft: als sender habe ich unser geplantes bedienteil verwendet, als empfänger das gleiche gerät. der sender sendet via print einen string, dieser wird vom empfänger mit input auf dem lcd dargestellt (allerdings mit irgendwelchem zeichenkram dazwischen, dessen herkunft ungeklärt ist (1byte lang) - stoppbit ?). ich benutze bei beiden den hardwareuart rxd0/txd0. ------------------------ empfängercode: Dim S As String * 10 Baud = 19200 Do Input S Lcd S <--- auf dem display steht immer "%m%moin" wobei das % für ein einstelliges seltsames zeichen steht.. Wait 2 Cls Toggle Led_rot Loop ------------------- sendercode: Dim S As String * 10 S = "moin" Baud = 19200 Do Print S Lcd S <--- auf dem display steht immer "moinmoinmoinmoin..." - soweit ok Waitms 500 Toggle Led_rot Loop ------------------------ ziel ist es, 2 byte rauszugeben, danach 2 byte zu empfangen und wieder von vorn. die pakete bestehen aus 1 adressbyte und 1 datenbyte. der master soll auf einen seriellen bus an einen receiver senden, dieser antwortet dann mit einem ähnlichen datenpaket. selbstverständlich, wenn keine antwort kommt, muss nach einer gewissen zeit darauf reagiert werden... wie bekommt man so etwas hin ? kann mir da bitte jemand ein paar tips geben ? die bytes sollen einfach binär weiterverwendet werden. folgende punkte habe ich noch nicht ganz geblickt: - welche befehle nimmt man den nun: open, print, input, serin, serout ? - wie stelle ich start und stoppbits ein oder sind die bei dem hardwareuart fest ? - wie funktioniert der puffer im uart ? wenn ich zwei byte empfange, wie bekomme ich das mit ? muss ich immer lauschen oder wie würdet ihr sowas lösen ? ich will ja nur genau 2 byte empfangen und auswerten.
also, ich habe jetzt bald alle programmierbeispiele aus dem AVR bascom buch durch, und doch verstehe ich nicht ganz, wie es nun am besten funktionieren könnte. kann mir den nicht einer mal zumindest einen tip geben ? arbeiten tue ich natürlich selber, aber so ein hint zum richtigen lösungsweg / ansatz könnte ich schon brauchen. bitte liebguck
also, so weit meine theorie: ich sende 2 byte mittels hardware uart mit printbin, und warte dann auch antwort, indem ich mit ischarwaitung den inputbuffer überprüfe. wenn der eins ist, lese ich 2 byte (1 word) wieder ein und kann das weiterverarbeiten. kann das so hinhauen ? enable interrupts Config Serialin = Buffered , Size = 2 dim a as word 'sendedaten dim c as word 'empfangene daten baud=19200 'senden von daten bei bedarf mit printbin A 'warten auf antwort (vermutlich in isr auszuführen ?!) b=ischarwaiting() if b=1 then inputbin c endif
Hallo Alex, Dein Programm sieht ganz gut aus. Der Printbin-Befehl macht das, was Du willst. Alternativ geht auch Print chr(b1) ; chr(b2) ; wobei das ; am Ende der Zeile das LF und CR unterdrückt. b1 und b2 sind zwei Bytes. Durch Config Serialin = Buffered, Size = 2 legt Bascom einen Puffer an, der per ISR gefüllt wird. Du kannst Size durchaus größer machen. Die Abfrage b=ischarwaiting() liefert 0 zurück, wenn der Puffer leer ist. Daher mußt Du diesen Teil in eine Schleife packen. Gruß Gerd
danke für die hinweise, ich setzte mich sofort mal ran, das zu implementieren - die nächsten fragen kommen sicherlich am frühen nachmittag ! ;o)
hallo gerd, ich bin schon etwas weiter. auf board 1 (master) läuft nun folgendes: '*********************************************************************** ******** '* Hauptprogramm MASTER '*********************************************************************** ******** Cls Displaybeleuchtung = 1 Dim Byte1 As Byte Dim Byte2 As Byte Byte1 = 1 Byte2 = 2 Baud = 19200 Do If Taste_s1 = 0 Then Led_rot = 1 Printbin Byte1 Lcd "sende byte1" Locate 2 , 1 Lcd Byte1 Wait 1 Cls Led_rot = 0 End If If Taste_s2 = 0 Then Led_rot = 1 Printbin Byte2 Lcd "sende byte2" Locate 2 , 1 Lcd Byte2 Wait 1 Cls Led_rot = 0 End If Loop End das board sendet also (nach meinem verständnis) bei tastendruck s1/s2 entweder byte 1 oder byte 2. laut skop sendet es auch (irgendwas was dem entsprechen könnte ;) das slave programm hatte ich mir (zum testen und verständnis erlangen) so vorgestellt, das, wenn ein zeichen im buffer ist, die led rot mir das sagt. dann wollte ich per tastendruck die zeichen einlasen und auf dem display rausschmeissen. das klappt irgendwie nicht - display bleibt leer, lediglich der cursor geht manchmal auf 2,1 - ab und an bleibt auch die gelbe led aus bzw. an, das programm hängt dann also. (ich habs auch mit inputbin und printbin getestet). habe ich da einen gedankenfehler ? noch ne frage: wenn zeichen im buffer sind und ich zeichen auslese, wird der buffer dann geleert ? das system habe ich noch nicht ganz verstanden, glaube ich (und du glaubst das vermutlich auch ;) '*********************************************************************** ******** '* Hauptprogramm SLAVE '*********************************************************************** ******** Displaybeleuchtung = 1 Config Serialin = Buffered , Size = 2 Dim Byte1 As Byte Dim Byte2 As Byte Dim B As Byte Baud = 19200 Do B = Ischarwaiting() If B = 1 Then Led_rot = 1 End If If Taste_s1 = 0 Then Cls Waitms 500 End If If Taste_s2 = 0 Then Input Byte1 Input Byte2 Cls Locate 1 , 1 Print Byte1 Locate 2 , 1 Print Byte2 Led_rot = 0 Wait 2 'alternativ print chr(byte1);chr(byte2); ? End If Waitms 300 Toggle Led_gelb Loop End
Hallo Alex, also so genau habe ich mich mit dem Puffer auch noch nicht beschäftigt, es hat halt jedesmal funktioniert. Das ausgelesene Byte wird aus dem Puffer herausgenommen, Du mußt nichts machen. Ich habe aber das Auslesen nicht mit Byte = Inkey() durchgeführt. Dein Display bleibt übrigens leer, weil Du "Print" anstelle von "LCD" verwendest: Du schreibst die Daten wieder auf die serielle Schnittstelle. Gruß Gerd
Fehler in meiner Antwort 12:52 Uhr entdeckt: das "nicht" vor "mit Byte = Inkey()" streichen. Gerd
hallo gerd, das hatte ich mir bereits gedacht :) funktioniert alles bestens ! lediglich speichert der buffer nur (n-1) zeichen, aber das ist vermutlich ein zählfehler in der bibliothek. kommunikation jedenfalls klappt perfekt, keine falschen zeichen etc. der unterschied zwischen inkey und inputbin ist ja lediglich, das inputbin auf die vervollständigung seiner variable wartet, während inkey zur not auch einfach die nullen von "nichts da" einliest. perfekt, vielen vielen dank ! der rest ist nun nur noch fleißarbeit, prüfsummen, befehle, adressen der slaves etc :)
noch ne frage zu dem thema: ich benutze ja nun das printbin-kommando, um die datenpakete seriell rauszuschieben. kann man mit bascom zufällig die logik vom rs232 umdrehen ? also wie im open-kommando (INVERTED) ?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.