PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frequenzerzeugung mit Timer0



spaceduck
09.04.2006, 13:51
Hallo,

ich habe mir mal das Timerberechnungstool installiert. Erzeugen möchte ich eine Frequenz von 40kHz.
Es wurde folgender Quellcode generiert:



$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]

Rage_Empire
09.04.2006, 15:40
sind deine fuses auf externen quarz gestellt?

hrei
09.04.2006, 18:12
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)



$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