Hallo zusammen, ich habe bezüglich des Datenempfangs bei besagtem µC das Problem, dass das Register UDR (FIFO-Speicher) nur 3 Byte aufnehmen kann. Ich möchte gerne 10Byte empfangen, aber es werden nur drei Interrupts ausgelöst. Kann mir jemand einen Anstoß geben, wie ich diese Problem umgehen kann? Vielen Dank schonmal Grüße occino
Der Interrupt wird ausgelöst sobald ein Byte im Schieberegister liegt, richtig? Wenn du das Byte dann ausliest, also z.B. in den SRAM kopiert, wird das Flagbit gelöscht und der Interrupt beim nächsten empfangenen Byte erneut gesetzt. Holst du das Byte nicht sofort ab wenn es im UDR liegt ist der natürlich irgendwann voll und weiß nicht wohin mit den neuen Daten.
occino schrieb: > Ich möchte gerne 10Byte empfangen, aber es werden nur drei Interrupts > ausgelöst. Kann mir jemand einen Anstoß geben, wie ich diese Problem > umgehen kann? ...ähhm.. zwischenspeichern? Wenn die Größe immer fest ist eine Pufferstruktur fester Größe ('array' oder 'struct')? in der ISR: Byte empfangen -> in den Puffer packen, wenn voll dann das Puffer-jetzt-bitte-auswerten-Flag setzen in main/..: falls Puffer-jetzt-bitte-auswerten-Flag gesetzt dann den Puffer verarbeiten HTH
Mist, ich habe vergessen zusagen, dass ich in Assembler entwickle, aber schonmal danke für die raschen Antworten. Vielleicht hilft es mir schon. occino
guest schrieb: > Der Interrupt wird ausgelöst sobald ein Byte im Schieberegister liegt, > richtig? Ja, da bin ich mir nicht ganz sicher. Ich habe das Gefühl, dass erst alles in den Buffer geschrieben wird und dann für jedes Byte ein Interrupt ausgelöst wird. Dann wäre es schon zu spät, den UDR Fifo auszulesen. Natürlich gehen nur drei Byte in den Fifo-Speicher, ergo bekomme ich auch nur die erste drei Byte
Wie kommst du darauf dass drei unterschiedliche Bytes in den Buffer passen? Die empfangenen Daten werden automatisch vom SR in den Buffer übertragen sobald dieser voll ist (also z.B. 8 bits empfangen hat) und dann wird das RXC Flag gesetzt und der passende Interrupt ausgelöst wenn man das RXCIE Bit in UCSRB gesetzt hat. Die Daten sind zu dem Zeitpunkt also schon "komplett nach unten durchgerutscht" und müssen sofort ausgelesen werden. Da führt kein Weg dran vorbei wenn man keine Daten verlieren möchte.
occino schrieb:
> Mist, ich habe vergessen zusagen, dass ich in Assembler entwickle,
Macht nichts.
Die Technik ist die Gleiche, egal ob du in Assembler oder in C
programmierst.
In der ISR muss das empfangene Byte aus dem UDR Register geholt werden.
Die 3 Bytes, die der µC selber zwischenspeichern kann, vergisst du am
besten gleich wieder. Die dienen nur dazu, den Fall abzufangen, dass die
ISR's momentan gesperrt sind und das UDR nicht sofort ausgelesen werden
kann. Der Prozessor verschafft deinem Programm so ein wenig Luft, damit
du nicht hektisch das UDR immer sofort auslesen musst. Aber als
Zwischenlager um darin Daten aufzubewahren, bis ein Datensatz komplett
übertragen wurde, taugt das nichts.
Danke für die Antworten, ich habe nun mein Fehler gefunden. Ich arbeite zum debuggen mit dem jtag mkII und genau das ist der Knackpunkt. Das Auslesen aus dem UDR passiert ja erst beim debuggen. Der Buffer ist dann bereits voll und es sind schon bytes verloren gegangen. In "Echtzeit" funktioniert alles perfekt. Ich hab quasi ein Problem geschaffen wo garkeins war (-; Grüße occino
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.