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


von zeusi (Gast)


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,...

von Karl H. (kbuchegg)


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 :-)

von Kai S. (Firma: ZeuSWarE GmbH) (zeusosc)


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

von Kai S. (Firma: ZeuSWarE GmbH) (zeusosc)


Angehängte Dateien:

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

von Kai S. (Firma: ZeuSWarE GmbH) (zeusosc)


Lesenswert?

ähm,.. hilfe

von Karl H. (kbuchegg)


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.

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.