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.