Forum: Mikrocontroller und Digitale Elektronik Binäre Augabe


von Steffen (Gast)


Lesenswert?

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?

von Tom (Gast)


Lesenswert?

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

von Steffen (Gast)


Lesenswert?

Ja, zu 100% beantwortet. Vielen vielen Dank!

von Tom (Gast)


Lesenswert?

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

von Steffen (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.