Forum: Mikrocontroller und Digitale Elektronik Problem mit Timer


von Иван S. (ivan)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

Иван 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

von Иван S. (ivan)


Lesenswert?

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.

von Иван S. (ivan)


Lesenswert?

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

von Hc Z. (mizch)


Lesenswert?

> dec3:   jrne dec3

Da fe lt ein 'dec A'.

von Иван S. (ivan)


Lesenswert?

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.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.