Forum: Mikrocontroller und Digitale Elektronik XBee - Datenverluste über AVR-µC (ATmega32L)


von Mario S. (spyridon)


Lesenswert?

Hi,

ich habe zwei XBee-Module die über die Minimalbeschaltung (VCC, IN, OUT, 
GND) laufen. Einer ist als Coordinator und der andere als End Device 
eingestellt. Daten werden in beide Richtungen über das Terminal von 
X-CTU richtig gesendet und empfangen. Über den PC funktioniert es super!
Aber über zwei AVR-µC werden nur die ersten 3Bytes und das letzte Byte 
von insgesammt 6Bytes zum anderen AVR-µC übertragen. Die übrigen 2Bytes 
gehen auf der Strecke verloren. Warum?
Bin über jede Antwort erfreut.
Danke sehr.

Mit freundlichen Grüßen
Mario Spyridon

von Mario S. (spyridon)


Lesenswert?

Hallo,

ich habe wohl den Fehler gefunden und bräuchte weiterhin Hilfe.

Also der AVR-µC der als Transmitter arbeitet funktioniert super. Das 
X-CTU Terminalprogramm empfängt alles. Nur der AVR-µC der als Empfänger 
arbeitet empfängt nicht alle Daten. Egal ob die Daten vom X-CTU 
Terminalprogramm oder dem AVR-µC (Transmitter) stammen. Mein verdacht 
ist, dass der Empfangspuffer vom USART im ATmega32L nicht schnell genug 
entleert werden kann, wenn ein 6Byte Datenpacket gesendet wird. Wenn die 
Daten Byteweise übertragen werden, kommen die Daten richtig an. Hat 
jemand für mich eine Lösung?
Danke sehr.

Mit freundlichen Grüßen
Mario Spyridon

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Dazu müsstest du erstmal schreiben, wie du die Daten denn derzeit
ausliest.

Sinnvoll wäre ein interruptgesteuertes Auslesen.

Ich schiebe das mal ins µC-Forum, denn es ist ja ganz offensichtlich
ein Controller- und kein HF-Problem.

von Mario S. (spyridon)


Lesenswert?

Die Daten werden über USART mit folgender Routine empfangen:

USART_Receive:
; Wait for data to be received
sbis UCSRA, RXC
rjmp USART_Receive
; Get and return received data from buffer
in r16, UDR
ret

Die empfangenen Daten stehen dann in Register r16. Diese werden dann in 
einer anderen Routine auf einem LCD-Display angezeigt. Wie gesagt 
vermute ich, dass die Daten nicht schnell genug aus dem Puffer 
ausgelesen werden können, sodass noch nicht gelesene Daten überschrieben 
werden. Gibt es eine elegante Methode um mehrere Bytes hintereinander 
korrekt zu empfangen?

Freundliche Grüße
Mario Spyridon

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Mario Spyridon wrote:

> Die empfangenen Daten stehen dann in Register r16. Diese werden dann in
> einer anderen Routine auf einem LCD-Display angezeigt.

Klar: wenn die Anzeige aufs LCD dann wartet, bis das LCD die Daten
korrekt übernommen hat, dann sind inzwischen drei weitere Zeichen
zur UART reingelaufen...

Wie schon geschrieben: benutze eine UART-Interruptroutine, die die
Zeichen in einen Puffer füllt.

von Mario S. (spyridon)


Lesenswert?

Danke für deine Antwort.

Was sollte ich als Puffer verwenden?
Wie könnte so etwas aussehen?

Freundliche Grüße
Mario Spyridon

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Mario Spyridon wrote:

> Was sollte ich als Puffer verwenden?

Sinnvollerweise SRAM. ;-)

> Wie könnte so etwas aussehen?

Bitte suche mal die Weiten des Internet (und der Codesammlungen)
nach dem Stichwort "Ringpuffer" (bzw. ring buffer) ab.

von Mario S. (spyridon)


Lesenswert?

Okay, danke.

So versuche ich es mal.

Mit freundlichen Grüßen
Mario Spyridon

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.