PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Tiny24 tcnt1h



HeSt
30.11.2020, 11: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

Searcher
30.11.2020, 15:55
Wo liegt hier der Hund begraben?


...
rjmp loopl
in R16,TCNT1L
in R16,TCNT1H ;hier blinkt's nie
sbrs R16,2 ;egal welches Bit abgefragt wird
...



Hallo,

möglicherweise am fehlenden Auslesen des TCNT1L Registers. Das triggert erst das AVR-interne Übertragen des TCNT1H Registers. Näheres findet man im Datenblatt zum entsprechenden AVR (Um welchen geht es denn eigentlich) bei "Accessing 16-Bit registers" im Timer1 Kapitel.

Ich habe das mal grün markiert, wo ich meine, daß es da hin muß.

Gruß
Searcher

HeSt
30.11.2020, 19:00
möglicherweise am fehlenden Auslesen des TCNT1L Registers.

Hi Searcher,

BINGO!

Das ist es! Kam leider auch nicht auf die Idee nachzulesen, weil ich bislang keine speziellen Anwendungen mit 16Bit-Timern programmiert hab und mit den bisherigen Anwendungen keine Probleme hatte.
Wieder was dazu gelernt!
DANKE!!!

14.3
Accessing 16-bit Registers
To do a 16-bit write, the high byte must be written before the low byte. For a 16-bit read, the low byte must be read before the high byte.

Übrigens, es handelt sich um einen ATTiny24. Ich war zu schnell beim Thema. Kann leider T24 nicht mehr auf Tiny24 ändern.

Gruß Heinz