Hallo,

ich wollte einen ATtiny2313 so programmieren, das die LED am PINB 0 im Sekundentakt blinkt. Leider liegt die Blinkfrequenz 4x niedriger.

Ich dachte, wenn ich den Hardwarezähler so vorstelle, dass er nur noch 125 Takte bis zum Überlauf und somit zum Auslösen des Interrupts zählt, könnte ich durch weiteres Teilen / 125 den Sekundentakt bekommen.

4 000 000 / 256 / 125 / 125 = 1


Kann mal jemand schauen, was an dem Code oder meinen Überlegungen nicht stimmt?

.include "tn2313def.inc"

.def rSreg = R1
.def rTCNT0 = R16
.def Leds = R17
.def rVT1 = R18
.def temp = R19

rjmp main ; Springe zum Anfang

; Die Interrupt-Vektoren
reti ; Int0-Interrupt
reti ; Int1-Interrupt
reti ; TC1-Capture
reti ; TC1-Compare A
reti ; TC1-Overvlow
reti ; TC0-Overvlow
reti ; UART0 RX
reti ; UART0 UDRE
reti ; UART Tx
reti ; Analog COMP
reti ; PCINT
reti ; Timer/Counter1 Compare Match B
rjmp timer0_overflow ; Timer/Counter0 Compare Match A
reti ; Timer/Counter0 Compare Match B
reti ; USI Start
reti ; USI Overflow
reti ; EEReady
reti ; WDT Overflow


main:
ldi temp, LOW(RAMEND) ; Stackpointer initialisieren
out SPL, temp


ldi temp, 0xFF ; Port B auf Ausgang
out DDRB, temp

ldi leds, 0xFF

ldi temp, 4 ; Teiler auf Frequenz / 256 setzen
out TCCR0, temp

ldi temp, 0b00000001 ; TOIE0: Interrupt bei Timer Overflow
out TIMSK, temp
ldi rTCNT0, 131 ; Voreinstellung des Hardwarezählers
sei ; Interrupts aktivieren

loop:
OUT PORTB, Leds
rjmp loop


timer0_overflow:
in rSreg,SREG ; Status retten

OUT TCNT0, rTCNT0 ; Hardwarezähler so stellen, dass bei 125 Impulsen der Überlauf erfolgt
inc rVT1 ; unteres Byte erhoehen
cpi rVT1,125 ; Wenn 125 erreicht, ist 1 Sekunde um: (4000000 / 256 / 125/ 125 = 1)
BRCS intret ; nein, warte nachsten Int ab
clr rVT1 ; unterer Zaehler auf Null
dec Leds ; Register dekrementieren

intret:
out SREG,rSreg ; Status wieder herstellen
reti ; Rueckkehr vom Interrupt



MfG LotharK