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,...
.... > 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 :-)
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
..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
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.