Hallo, ich ein Problem bei dem ich ziemlich ratlos bin. Es geht um AVR ASM. Ich hab eine 32 bit Zahl in den Register r22 (h) bis r19 (l). Die möchte ich gerne Bitweise mit zwei LEDs ausgeben. Dabei sollen führenden Nullen unterdrück werden. Ein Beispiel mit 8 bit: 0b00110100. Die ersten beiden Nullen werden ignoriert, es erfolgt keine Ausgabe. Dann passiert folgendes LED1 leuchtet Pause, keine LED leutet LED1 leuchtet Pause, keine LED leutet LED0 leuchtet Pause, keine LED leutet LED1 leuchtet Pause, keine LED leutet LED0 leuchtet Pause, keine LED leutet LED0 leuchtet Pause, keine LED leutet Ich glaube, das Prinzip ist klar. Aber wie setze ich das um?
Hallo Steffen, ganz grob so: 1. Du rollst die Bits von "rechts" nach "links" durch alle Register mit Hilfe des Carry-Flags:
1 | rol r19 |
2 | rol r20 |
3 | rol r21 |
4 | rol r22 ; Das höchstwertige Bit Deiner 32-Bit-Zahl ist jetzt im Carry-Flag |
2. Da Du jetzt das auszugebende Bit im Carry-Flag hast, kannst Du über einen bedingten Sprungbefehl jetzt Deine Aktion auswählen... z.B:
1 | brcs SPRUNGMARKE_LED1_EINSCHALTEN ; Springe, wenn Carry-Flag gesetzt |
2 | rjmp SPRUNGMARKE_LED0_EINSCHALTEN |
3. Jetzt lässt Du den MC eine Pause machen... 4. ...dann schaltest Du den LEDs wieder aus 5. ...dann springst Du wieder zu Punkt 1 6. ...und das ganze wiederholst Du 32 Mal Wie Du die LEDs einschaltet ist Dir vermutlich klar. Wie Du eine Pause realisierst, das setze ich jetzt auch mal als bekannt voraus. Frage beantwortet ? Gruß Tom
Steffen schrieb: > Dabei sollen führenden Nullen > > unterdrück werden ...das habe ich eben übersehen. Da musst Du Dir noch einen "Merker" bauen, ob Du beim Durchrollen der Bits noch im Bereich der führenden Nullen bist. Also vor dem Durchrollen der Bits den Merker auf "JA" setzen (noch vor Punkt 1) und bei Eintreffen eines 1-Bits den Merker auf "NEIN". Beim Eintreffen eines 0-Bits im Carry-Flag musst Du dann entscheiden: - Wenn Merker auf "Ja", dann nichts ausgeben und keine Pause machen - Wenn Merker auf "Nein", dann LED für Bit 0 einschalten und Pause machen (Hoffe das war jetzt verständlich) Gruß Tom
Ja, das mit "Merker" hab ich mir schon selbst so gedacht wie du es geschrieben hast. Wollte dafür das T bit im Statusregister benutzen. Ich glaube für solche Sachen ist das gedacht. Aber trotzdem danke, dass du nochmal "nachgelegt" hast ;)
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.