BoGe-Ro
27.06.2011, 08:51
Hallo Forum,
ich möchte mit einem ATMega32 im CTC-Mode mit Timer0 einen 1 ms - Takt zu erzeugen.
Mit Taktfrequenz=16MHz würde ich einen Prescaler von 64 nutzen und den Vergleichswert auf 249 stellen.
f.1ms = 16MHz / (Prescaler * (OCR0+1))
der auf das wesentliche reduzierte Programm-Code:
$regfile = "M128def.dat"
$crystal = 16e6
$hwstack = 128
$swstack = 128
$framesize = 128
Led Alias Portc.0 : Config Led = Output : Led = 1
'### Timer0 - Zeittakt 1ms ################################################## ###
Tccr0 = &B00001011 'CTC-Mode, Prescaler=64
Ocr0 = 249 'Vergleichswert
Timsk.ocie0 = 1 'Output Compare Interrupt enable
On Oc0 Isr_timer0
Dim Timer0_cnt As Word
Dim Pulse_out As Byte
'################################################# ##############################
Enable Interrupts
Do
If Pulse_out = 1 Then
Pulse_out = 0
Led = 0
Waitms 50
Led = 1
End If
Loop
End
Isr_timer0:
Incr Timer0_cnt
If Timer0_cnt = 10000 Then
Timer0_cnt = 0
Pulse_out = 1
End If
Return
Zum Test mit Stoppuhr wollte ich nun alle 10 Sekunden eine LED aufblitzen lassen.
Tatsächlich geschieht dies aber in 5-Sekunden-Intervallen.
Warum treten die Interrupts doppelt so schnell auf wie erwartet/errechnet?
besten Dank
BoGe-Ro
ich möchte mit einem ATMega32 im CTC-Mode mit Timer0 einen 1 ms - Takt zu erzeugen.
Mit Taktfrequenz=16MHz würde ich einen Prescaler von 64 nutzen und den Vergleichswert auf 249 stellen.
f.1ms = 16MHz / (Prescaler * (OCR0+1))
der auf das wesentliche reduzierte Programm-Code:
$regfile = "M128def.dat"
$crystal = 16e6
$hwstack = 128
$swstack = 128
$framesize = 128
Led Alias Portc.0 : Config Led = Output : Led = 1
'### Timer0 - Zeittakt 1ms ################################################## ###
Tccr0 = &B00001011 'CTC-Mode, Prescaler=64
Ocr0 = 249 'Vergleichswert
Timsk.ocie0 = 1 'Output Compare Interrupt enable
On Oc0 Isr_timer0
Dim Timer0_cnt As Word
Dim Pulse_out As Byte
'################################################# ##############################
Enable Interrupts
Do
If Pulse_out = 1 Then
Pulse_out = 0
Led = 0
Waitms 50
Led = 1
End If
Loop
End
Isr_timer0:
Incr Timer0_cnt
If Timer0_cnt = 10000 Then
Timer0_cnt = 0
Pulse_out = 1
End If
Return
Zum Test mit Stoppuhr wollte ich nun alle 10 Sekunden eine LED aufblitzen lassen.
Tatsächlich geschieht dies aber in 5-Sekunden-Intervallen.
Warum treten die Interrupts doppelt so schnell auf wie erwartet/errechnet?
besten Dank
BoGe-Ro