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
Lesezeichen