Anfänger braucht Hilfe bei AT89C5131 - Interrupts in Assembler

OP #1871550
Lesenswert?

Hallo,
ich bin noch sehr neu in der Materie und hoffe, dass meine Frage deshalb 
nicht allzu "sinnlos" ist.
In der Schule programmieren wir gerade verschiedene Interrupts 
(Unterbrechung, Timer).
Wir haben jetzt ein Programm geschrieben, bei dem pro Tastendruck eine 
LED leuchtet und automatisch immer um eine Stufe nach links rückt. 
Soweit so gut.
Ich habe das jetzt auf meinem Board (USB-Flashboard von ELektor) 
getestet. Die Schaltung funktioniert, allerdings leuchten alle LEDs auf, 
bis auf eine. Und diese eine "nichtleuchtende LED" verschiebt sich mit 
jedem Tastendruck nach links. Es bewegt sich quasi ein "Loch". Es gibt 
doch sicher eine Möglichkeit, damit nur eine LED leuchtet, und diese 
sich nach links verschiebt.

Das zweite Problem:
Wie kann ich dem Controller mitteilen, dass die LEDs nach erreichen der 
linken Seite, wieder automatisch nach rechts laufen.
Mein Gedankengang >> es muss irgendwas mit dem carry flag zu tun haben.
Wenn das cf=0 dann laufe nach links, wenn cf=1 dann laufe nach rechts.
Klingt einfach, aber.......

Mein Programm sieht folgendermaßen aus:

----------------------------
code_s  segment code
        cseg at 0000h
        ljmpf main

        org 0003h
        ljmp ExInt0

        org 0100h
        rseg code_s

main:   mov A,#128
        setb IT0
        setb EX0
        setb EA

loop:   sjmp loop

ExInt0: rl A
        mov P0,A
        reti

end
------------------------------

Für Hilfe wäre ich sehr dankbar!!!

MfG
Blacky27
#1871827
Lesenswert?

Klaus Xx schrieb:
> Wenn das cf=0 dann laufe nach links, wenn cf=1 dann laufe nach rechts.

Das Carryflag wir nur gesetzt, wenn eine 1 herausgeschoben wird. Da du 
in deinem Fall binär gesehen nur eine 1 im Akkumulator drin hast, wird 
das CF nur gesetzt, wenn du beim Shiften die 1 rechts oder links 
herausschiebst. Das könnte man als Indikator für einen Richtungswechsel 
nutzen.

EDIT:
Allerdings müsstest du dann mit RLC und RRC shiften.
OP #1871845
Lesenswert?

Das mache ich doch mit dem Befehl "rl A".
Damit schiebe ich doch den Wert von Bit 1 über Bit 2 bis nach Bit 8.
Nach Bit 8 wird dann das carry flag gesetzt. Oder habe ich da im 
Unterricht was falsch verstanden?
Ich weiß nur nicht, wie ich das carry flag überprüfe. Irgendwo muss ich 
dem Controller ja mitteilen, wenn cf=1 >> rr A, bzw. cf=0 >> rl A.

MfG
Blacky27
#1871870
Lesenswert?

Klaus Xx schrieb:
> Das mache ich doch mit dem Befehl "rl A".
> Damit schiebe ich doch den Wert von Bit 1 über Bit 2 bis nach Bit 8.
> Nach Bit 8 wird dann das carry flag gesetzt. Oder habe ich da im
> Unterricht was falsch verstanden?


Das carryflag dürfte nicht verändert werden, wenn du mit rl und rr 
schiebst.

Schau mal im Instuction-Set nach:
http://www.win.tue.nl/~aeb/comp/8051/set8051.html#51rl

Gruß Skriptkiddy

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren