www.mikrocontroller.net

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


Autor: occino (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: occino (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: occino (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: guest (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: occino (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.