Die folgende Blinker sollte die LEDs jeweils eine Sekunde ein und eine Sekunde ausschalten. Es wird der default Takt, also kein externer Quarz verwendet.
Tatsächlich läuft der Blinker in 4 Minuten etwa 6 Sekunden vor. Das ist ein Fehler von 2,5%!!! Liegt das an der Ungenauigkeit des Taktes oder hab ich einen Fehler gemacht?
Edit: Setze ich den Comparewert auf 125 statt 124, dann kommt das ganz gut hin. Aber das ist meiner Meinung nach falsch, oder?
Tatsächlich läuft der Blinker in 4 Minuten etwa 6 Sekunden vor. Das ist ein Fehler von 2,5%!!! Liegt das an der Ungenauigkeit des Taktes oder hab ich einen Fehler gemacht?
Code:
.NOLIST
.INCLUDE "m168padef.inc"
.LIST
.EQU F_CPU = 1000000 ; Systemtakt in Hz
.DEF A = R16
.DEF ssave = R15
.DEF leds = R20
.DEF cnt = R21
.ORG 0
rjmp Reset
.org OC0Aaddr
rjmp OC0A_ISR ; Timer Overflow Handler
.ORG INT_VECTORS_SIZE
Reset:
ldi A, LOW(RAMEND)
out SPL, A
ldi A, HIGH(RAMEND)
out SPH, A
ldi A, 0xFF ; Port B auf Ausgang
out DDRB, A
ldi leds, 0xFF
out PORTB, leds
; Berechnung für F_CPU = 1000000
; 1000000 = 64*125*125
ldi cnt, 124 ; 125 = (0..124)
out OCR0A, cnt
inc cnt
ldi A, (1<<OCIE0A) ; Interrupt bei Compare Match A
sts TIMSK0, A
ldi A, (1<<WGM01) ; CTC mode
out TCCR0A, A
ldi A, (1<<CS01)|(1<<CS00) ; Teiler 64
out TCCR0B, A
sei
MainLoop:
rjmp MainLoop
OC0A_ISR:
in ssave, SREG
dec cnt
brne goon
ldi cnt, 125
com leds
out PORTB, leds
goon:
out SREG, ssave
reti
Edit: Setze ich den Comparewert auf 125 statt 124, dann kommt das ganz gut hin. Aber das ist meiner Meinung nach falsch, oder?