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
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
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.
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
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.
Danke für deine Antwort. Was sollte ich als Puffer verwenden? Wie könnte so etwas aussehen? Freundliche Grüße Mario Spyridon
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.