www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART asm ATmega32 mehrere bytes empfangen?


Autor: zeusi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jo hoi,.. hoffe es ist noch jemand wach ;)
also ein byte zu empfangen und je nach wertigkeit eine funktion 
ausführen funzt,.. jetzt wollte ich mehrere bytes empfangen und diese 
verarbeiten,...
ok,.. mein ansatz war:

erstma speicherzuweisung
.dseg
rxd_buffer:.BYTE 4
.cseg

sooo der interrupt kommt

int_RXD: ldi ZL,LOW(rxd_buffer)
         ldi ZH,HIGH(rxd_buffer)

(axo mal nebenbei,... wieso wird im tutorial das speicherlabel mit 2 
multipliziert??? á la shiftleft ???)

         in get, UDR
         tst get  ;wenn NULL dann raus , halt ohne terminierungszeiche
         breq wech

         st Z+,get
         rjmp int_RXD
wech:
        ;den pointer muss ich ja wieder an den anfang setzen
        ldi ZL,low(rxd_buffer)
        ldi ZH,high(rxd_buffer)
        ;dann will ich mal gucken wat so daaa is
        call check
        feddich
        ret
check:
       ld temp,Z+
       tst temp
       breq check_end

      ;ich will es hier an dieser stelle mal wieder zurück ans terminal
      ;ausgeben
      mov send,temp
      call sendbyte
      rjmp check

check_end: ret


soooo,.. ich arbeite das erste mal mit den Z pointern (r31:r30)
wo is mein fehler, da es ja net funzt,...

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

Bewertung
0 lesenswert
nicht lesenswert
....
>         st Z+,get
>         rjmp int_RXD

schau mal wo du da hinspringst und was dort
passiert.

> int_RXD: ldi ZL,LOW(rxd_buffer)
>          ldi ZH,HIGH(rxd_buffer)

Ich bin ziemlich sicher, dass du das nächste zu empfangende
Byte nicht an dieselbe Stelle wie das vorhergehende speichern
möchtest :-)

Autor: Kai Scheddin (zeusosc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ahhhhhh....... jo ankopffass
also währe wahrscheinlich
int_RXD: ldi ZL,low(rxd_buffer)
         ldi ZH,high(rxd_buffer)

noch_eine_runde:
         in get,UDR

         tst get
         breq wech

         st Z+,get
         rjmp noch_eine_runde

besser,.... manno mann,... danke...
nochmal kurz zu der frage mit den speicherlabels,..
man hat mir gesagt dass mann im tutorial das label mal 2 multipliziert 
um in den speicherbereich 2 mal 8bit zu packen,.. oder wie???
soo ich checke erstmal ob die korrektur läuft..


daaaaaaaaaaanke,...
(blöde semantik,... und das noch nachts ;P     )
mfg kai

Autor: Kai Scheddin (zeusosc)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
..och mann,... könnt ihr mir weiterhelfen??
also,..
ich sende ihm beliebige 4 bytes des standart ASCII zahlen-oder 
buchstabensatzes zb.: 1234 oder huhu
so die antwort lautet:

\•âs•Vè÷jãj•_èó

danach reagiert der controller gar net mehr, dann muss ich einen Hrdw 
reset mache, OBWOHL nach simulator alles bestens sein sollte... wein


mfg  kai

Autor: Kai Scheddin (zeusosc)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ähm,.. hilfe

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

Bewertung
0 lesenswert
nicht lesenswert
> int_RXD: ldi ZL,low(rxd_buffer)
>          ldi ZH,high(rxd_buffer)
>
> noch_eine_runde:
>          in get,UDR
>
>          tst get
>          breq wech
>
>          st Z+,get
>          rjmp noch_eine_runde

Das ist doch Quatsch (fällt mir erst jetzt auf).

Du arbeitest doch Interrupt getrieben. D.h. der µC informiert
dich mit einem Interrupt, dass ein neues Zeichen eingetroffen
ist. Also wirst du hier sicher keine Schleifen drehen um auf
das nächste Zeichen zu warten. Ausserdem: Deine Schleife
läuft und läuft und läuft und bei jedem Durchgang holt
es sich den Wert von UDR, egal ob da ein Zeichen vorliegt
oder nicht.

Du musst das anders machen.
In der Interrupt Funktion wird das Zeichen geholt
getestet ob das das letzte Zeichen der Übertragung war
(0 ist da denkbar ungeeignet, CR (0x0a) ist da schon
wesentlich besser, denn das kannst du auf einem Terminal
auch eingeben) und wenn es noch nicht das Ende ist,
dann wird das Zeichen hinten an den Buffer angehängt.
Dazu musst du dir natürlich irgendwo merken, wie voll
der Buffer schon ist, bzw. wo das nächste Zeichen hin
muss. Und dann: return from Interrupt.

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.