PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer im CTC-Mode



BoGe-Ro
27.06.2011, 07: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

Searcher
27.06.2011, 08:53
Hallo,
würd sagen, der Prescaler ist falsch gesetzt. Für 64 müßte es Tccr0 = &B00001100 heißen. Gegenwärtig ist er auf 32 und damit läuft der Timer doppelt so schnell.

Gruß
Searcher

BoGe-Ro
27.06.2011, 09:07
Hallo Searcher,

bei dem Wert für das Register TCCR0 habe ich mich an folgender Tabelle orientiert. (Datenblatt ATMega32, Seite 82)

19183
Meiner Meinung nach Prescaler = 64.

Gruß BoGe-Ro

Searcher
27.06.2011, 09:21
Oh ha,
hatte Deine Erläuterung nicht genau genug gelesen und nach

$regfile = "M128def.dat"

im Mega128 Datenblatt nachgeschaut. Für Mega32 solltest Du $regfile ändern?

Gruß
Searcher

BoGe-Ro
27.06.2011, 09:34
ohhh - mea culpa!

Du hast natürlich recht und trotz meiner falschen Beschreibung richtig verstanden und erklärt.

Das Projekt soll auf einem ATMega32 laufen, die Vortests unternehm ich zur Zeit auf einem ATMega128.
Somit habe ich das falsche Datenblatt offen :rolleyes:.

Besten Dank für deine Hilfe!