Hallo,
ich bin dabei, für ST7 einen Led-Blinker zu schreiben, leider blinkt da
nichts. Ich bin mir im klaren darüber, daß heir niemand den ST7
verwendet, jedoch finde ich, daß der Assembler gut zu verstehen ist.
Vielleicht habe ich ja einen logischen Fehler eingebaut, der mir nicht
ins Auge springen will. Hier also der Codeauszug:
1 | main: ; Unser Einsprungspunkt "Main"
| 2 | rsp ; Stackpointer zurücksetzen
| 3 | ld A,#255
| 4 | ld PADDR,A ; Port A als Ausgang konfigurieren
| 5 | ld A,#0
| 6 | ld PAOR,A ; Port A Option "Open Drain"
| 7 | ld PADR,A ; Port A Ausgabe Null (LED leuchtet)
| 8 | rim
| 9 | ld A,LTICR
| 10 | ld A,#$30 ; Wert für Lite Timer f8
| 11 | ld LTCSR1,A ; Timer-Register beladen
| 12 | TimerInterrupt:
| 13 | ld A,PADR ; Port A in Register laden
| 14 | xor A,#$FF ; Port ver-xor-en
| 15 | ld PADR,A ; Ausgabe
| 16 | test: jp test
|
Иван S. schrieb:
> Vielleicht habe ich ja einen logischen Fehler eingebaut, der mir nicht
> ins Auge springen will.
Ja.
1.
In nen Interrupt läuft man nicht rein.
2.
Ein Interrupt braucht am Ende ein RETI, sonst weiß die CPU nicht, daß
der Interrupt verlassen wurde.
Peter
Peter Dannegger schrieb:
> 1.
> In nen Interrupt läuft man nicht rein.
Mann, ich weiss nicht was ich mir heute gedacht habe.
> 2.
> Ein Interrupt braucht am Ende ein RETI, sonst weiß die CPU nicht, daß
> der Interrupt verlassen wurde.
Heute ist wohl nicht mein Tag, wie peinlich mir das alles ist.
Danke für Deine Hilfe.
Hmm, Stunden später blinkt es immer noch nicht. Es wird aber in den
Interrupthandler gesprungen, denn die LED leuchtet. Jedoch leuchtet sie
permanent. Auch eine Verzögerungsschleife in der Interruptroutine (ich
weiss, nicht sehr elegant, ist aber nur zum Testen) bringt keine
Abhilfe.
Vielleicht soll ich es für heute einfach bleiben lassen.
1 | main: ; Unser Einsprungspunkt "Main"
| 2 | rsp ; Stackpointer zurücksetzen
| 3 | ld A,#255
| 4 | ld PADDR,A ; Port A als Ausgang konfigurieren
| 5 | ld PAOR,A ; Port A Option "Open Drain"
| 6 | ld PADR,A ; Port A Ausgabe (LED dunkel)
| 7 | rim ; Enable Interrupt
| 8 | ld A,LTICR
| 9 | ld A,#0
| 10 | ld LTARR,A
| 11 | ld A,#$20 ; Wert für Lite Timer Control Register A
| 12 | ld LTCSR1,A ; Timer-Register beladen
| 13 | ld A,#2 ; Timer Interrupt aktivieren
| 14 | ld LTCSR2,A
| 15 | gogo: jp gogo
| 16 | Timer: ld A,PADR ; Port A auslesen
| 17 | xor A,#%11111111 ; ver-xor-en
| 18 | ld PADR,A ; Ausgabe
| 19 | ld A,#255
| 20 | dec1: dec A
| 21 | jrne dec1
| 22 | ld A,#255
| 23 | dec2: dec A ; Verzögerungsschleifen
| 24 | jrne dec2
| 25 | ld A,#255
| 26 | dec3: jrne dec3
| 27 | iret
|
> dec3: jrne dec3
Da fe lt ein 'dec A'.
Hazeh Zimmerer schrieb:
>> dec3: jrne dec3
>
> Da fe lt ein 'dec A'.
Ja, da habe ich mich wohl verschrieben. Ich habe es jetzt aufgegeben. Es
lag nämlich doch nicht am Timer-Interrupt. Ich habe einfach mal
probiert, eine LED mittels einfacher Portausgabe zum leuchten zu bringen
und schon das funktioniert nicht. Einmal leuchtet die LED, einmal nicht.
Selbst wenn ich mit dem selben Programm flashe funktioniert es mal, und
mal nicht.
1 | main: ; Unser Einsprungspunkt "Main"
| 2 | rsp ; Stackpointer zurücksetzen
| 3 | ld A,#$FF
| 4 | ld PADDR,A ; Port A als Ausgang konfigurieren
| 5 | ld PAOR,A ; Port A Option "Open Drain"
| 6 | ld A,#$00
| 7 | ld PADR,A ; Port A Ausgabe (LED leuchtet)
| 8 | jp main
|
Dabei ist dieser code so simpel. Keine Ahnung, was da falsch läuft.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|