Frequenzerzeugung mit Timer0
Hallo,
ich habe mir mal das Timerberechnungstool installiert. Erzeugen möchte ich eine Frequenz von 40kHz.
Es wurde folgender Quellcode generiert:
Code:
$regfile = "m8def.dat"
$crystal = 4000000
Config Timer0 = Timer , Prescale = 1
Config Pinc.2 = Output
Led3 Alias Portc.2
On Timer0 Timer_irq
Const Timervorgabe = 156
Enable Timer0
Enable Interrupts
Timer_irq:
Timer0 = Timervorgabe
Toggle Led3
Return
Mit dem Scope messe ich 12,14kHz. Selbst wenn ich den Vorgabewert des Timers auf 250 erhöhe steigert
das die Frequenz nur auf 14kHz. Ich steige einfach nicht dahinter wo das problem liegt. Der Quellcode ist
vom Prinzip okay, aber warum kommen die 40kHz nicht?
[/code]
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
zum Einen hast Du zur Berchnung 40000 benutzt, das entspricht 20000 Hertz bei Toggle, zum Anderen berücksichtigst Du nicht, daß für das Sprigen in die ISR, das Pushen der Register und bis zum Abschluss des Beschreibens des Timers insgesamt über 40 Prozessortakte vergehen.
Bei 4 MHz Prozessortakt und Timer0 wirst Du auf diese Art keine genauen 40kHz erreichen können. Timer1 und ein höherer Prozessortakt wären notwendig.
Grüße
Henrik
Edit und PS:
Zur Vervollständigung:
Unter diesen Voraussetzungen komme ich z.B. auf recht genaue 50kHz.
Die 50kHz deshalb um Dir etwas Reserven nach oben zu lassen.
(siehe Oszilloskopschnappschuss im Anhang)
Code:
$regfile = "m32def.dat"
$crystal = 7372800
...
Config Timer1 = Timer , Prescale = 8
On Timer1 Timer_irq Nosave
...
...
Config Timer1 = Timer , Prescale = 1
Timervorgabe = 65462 + 32 'für 100kHz bzw. 50kHz bei Toggle
'------------ händisches Registerretten --------
Timer_irq:
$asm
push R24
push R25
push R26
push R27
push XH
push XL
in R24, SREG
push R24
$end Asm
Timer1 = Timervorgabe
Toggle Portb.0
$asm
pop R24
Out Sreg , R24
pop XL
pop XH
pop R27
pop R26
pop R25
pop R24
$end Asm
Return