Forum: Mikrocontroller und Digitale Elektronik Mega128 - serielle Kommunikation mit BASCOM


von Alex (Gast)


Lesenswert?

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.

von alex (Gast)


Lesenswert?

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

von Alex (Gast)


Lesenswert?

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

von Gerd Laschinski (Gast)


Lesenswert?

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

von alex (Gast)


Lesenswert?

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)

von Alex (Gast)


Lesenswert?

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

von Gerd Laschinski (Gast)


Lesenswert?

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

von alex (Gast)


Lesenswert?

lol ich depp - geistig verwirrt wie immer. :)

von Gerd Laschinski (Gast)


Lesenswert?

Fehler in meiner Antwort 12:52 Uhr entdeckt:

das "nicht" vor "mit Byte = Inkey()" streichen.

Gerd

von alex (Gast)


Lesenswert?

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 :)

von Alex (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.