Anfänger braucht Hilfe bei AT89C5131 - Interrupts in Assembler

OP #1871550
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
OP
Danke für die Hilfe!
Ich war auf dem richtigen Weg, aber falsch angewendet.
Ich habe "cpl P0,A" versucht.
KEIL brachte aber ständig eine Fehlermeldung.

Jetzt muss ich mir nur noch einen Kopf zu meinem zweiten Problem machen.


MfG
Blacky27
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
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
Kann man mit dem Carry-Flag machen:
1
ExInt0:
2
        jnc     _m1        ; CY = 0: nach rechts
3
        rl      a          ; nach links
4
        anl     c, acc.7   ; CY = 0 wenn ACC.7 = 0
5
        sjmp    _m2
6
_m1:    rr      a          ; nach rechts
7
        orl     c, /acc.0  ; CY = 1 wenn ACC.0 = 0
8
_m2:    mov     p0, a
9
        reti


Peter
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.