Forum: Mikrocontroller und Digitale Elektronik atmega 162 | mehr als 3 byte empfangen


von occino (Gast)


Lesenswert?

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

von guest (Gast)


Lesenswert?

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.

von g457 (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?


von occino (Gast)


Lesenswert?

Mist, ich habe vergessen zusagen, dass ich in Assembler entwickle,
aber schonmal danke für die raschen Antworten.
Vielleicht hilft es mir schon.

occino

von occino (Gast)


Lesenswert?

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

von guest (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von occino (Gast)


Lesenswert?

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