HeSt
30.11.2020, 12:16
Hallo allerseits!
Ich werd nicht schlau ...
Während einer ca. 5 Minuten Pause möchte ich eine LED langsam blinken lassen
um anzuzeigen, dass der Timer1 läuft - das Programm also im Pausenmodus ist.
T1 an sich läuft tadellos, tut was er soll ...
Allerdings kann ich folgendes Problem nicht lösen:
Ich lese TCNT1H in ein Register und möchte ein bestimmtes Bit zum Blinken auswerten.
Nur blinkt da nichts!
Bei TCNT1L funktioniert es einwandfrei, nur bei TCNT1H nicht!!
Wo liegt hier der Hund begraben?
Nachstehendes Progrämmchen dient nur zum Testen ...
Alle paar Sekunden wechselt die Anzeige zwischen TCNT1L und TCNT1H.
Beide werden in R16 eingelesen.
Gruß Heinz
ps: PA2 wegen einer existierenden Platine für T24 zum Testen, sonst egal.
;---------------------------------------------------------
#include "tn24def.inc"
.cseg
.org $0000
rjmp INIT
.org $0008
rjmp T1OVF
;---------------------------------------------------------
INIT:
ldi R16,LOW(RAMEND)
out SPL,R16
ldi R16,$0F ;all out
out DDRA,R16
ldi R16,1
out TIMSK1,R16 ;T1 Ovf enable
clr R16
out TCNT1H,R16
out TCNT1L,R16
ldi R16,4 ;Prescaler /256
out TCCR1B,R16 ;start T1
sei
;-------------
LOOPL:
sbrc R17,0
rjmp looph
in R16,TCNT1L ;hier funktioniert jedes Bit
sbrs R16,7 ;in diesem Fall nur Bit7, damit
cbi PORTA,2 ;man das Blinken gut erkennen kann
sbrc R16,7
sbi PORTA,2
rjmp loopl
LOOPH:
sbrs R17,0
rjmp loopl
in R16,TCNT1H ;hier blinkt's nie
sbrs R16,2 ;egal welches Bit abgefragt wird
cbi PORTA,2
sbrc R16,2
sbi PORTA,2
rjmp looph
;-----------------------------------------------------
T1OVF:
in R20,SREG
sbrc R17,0 ;skip if Bit0 off
rjmp clrb0
sbr R17,1
rjmp t1end
CLRB0:
cbr R17,1
T1END:
out SREG,R20
reti
;-----------------------------------------------------
.EXIT
Ich werd nicht schlau ...
Während einer ca. 5 Minuten Pause möchte ich eine LED langsam blinken lassen
um anzuzeigen, dass der Timer1 läuft - das Programm also im Pausenmodus ist.
T1 an sich läuft tadellos, tut was er soll ...
Allerdings kann ich folgendes Problem nicht lösen:
Ich lese TCNT1H in ein Register und möchte ein bestimmtes Bit zum Blinken auswerten.
Nur blinkt da nichts!
Bei TCNT1L funktioniert es einwandfrei, nur bei TCNT1H nicht!!
Wo liegt hier der Hund begraben?
Nachstehendes Progrämmchen dient nur zum Testen ...
Alle paar Sekunden wechselt die Anzeige zwischen TCNT1L und TCNT1H.
Beide werden in R16 eingelesen.
Gruß Heinz
ps: PA2 wegen einer existierenden Platine für T24 zum Testen, sonst egal.
;---------------------------------------------------------
#include "tn24def.inc"
.cseg
.org $0000
rjmp INIT
.org $0008
rjmp T1OVF
;---------------------------------------------------------
INIT:
ldi R16,LOW(RAMEND)
out SPL,R16
ldi R16,$0F ;all out
out DDRA,R16
ldi R16,1
out TIMSK1,R16 ;T1 Ovf enable
clr R16
out TCNT1H,R16
out TCNT1L,R16
ldi R16,4 ;Prescaler /256
out TCCR1B,R16 ;start T1
sei
;-------------
LOOPL:
sbrc R17,0
rjmp looph
in R16,TCNT1L ;hier funktioniert jedes Bit
sbrs R16,7 ;in diesem Fall nur Bit7, damit
cbi PORTA,2 ;man das Blinken gut erkennen kann
sbrc R16,7
sbi PORTA,2
rjmp loopl
LOOPH:
sbrs R17,0
rjmp loopl
in R16,TCNT1H ;hier blinkt's nie
sbrs R16,2 ;egal welches Bit abgefragt wird
cbi PORTA,2
sbrc R16,2
sbi PORTA,2
rjmp looph
;-----------------------------------------------------
T1OVF:
in R20,SREG
sbrc R17,0 ;skip if Bit0 off
rjmp clrb0
sbr R17,1
rjmp t1end
CLRB0:
cbr R17,1
T1END:
out SREG,R20
reti
;-----------------------------------------------------
.EXIT