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.