Forum: Mikrocontroller und Digitale Elektronik Atmega32 Timer 0 zu langsam?


von Paul Baumann (Gast)


Lesenswert?

Ich habe hier das Problem, daß bei einem Atmega32, der mit 16MHz-Quarz
betrieben wird, der Timer 0-Interrupt mit zu geringer Frequenz "läuft".
Das bedeutet, daß die LED an PortD.6 mit weniger als 1 Hz blinkt, wobei
ich dort ca 157 Hz erwartete. (16000000/1024/100)
d.h. Takt/Vorteiler/100

Ich habe das Programm so weit abgemagert, daß man nur das dafür Nötige
hat, um andere Fehlerquellen auszuschließen. CKLPTR hat der Atmega32
m.W. nicht. Ich habe aber weder einen 2. Kontroller noch einen Oszi
hier, um zu messen, ob der Quarz schwingt. Fuses sind mit dem AVR-Studio
gesetzt und stehen auf: High-Fuse:CF Low-Fuse:DF

Sieht jemand den Fehler, den ich offenbar mache?

Kopf kratz
Paul


'*** Testprogramm wegen dem Timer0


$regfile "m32def.dat"
$crystal = 16000000
'systemtakt 16MHz = 16000000Hz

Declare Sub Taster_1
'Declare Sub Taster_2
'Declare Sub Taster_3
'declariert die Subroutinen

Config Portd.6 = Output
Config Portd.5 = Output
'ausgänge festlegen

Config Portd.2 = Input
Config Portd.3 = Input
Config Portd.4 = Input
'eingänge festlegen

Portd.2 = 1
Portd.3 = 1
Portd.4 = 1
'Pullup am Pind2-4 einschalten


Dim Zaehler As Integer


'Timer0 einrichten

Tccr0.cs00 = 1
Tccr0.cs02 = 1       'Prescaler=1024
Timsk.toie0 = 1      'Timer0 Überlauf Interrupt erlauben
Sreg.7 = 1           'Interrupts global erlauben

On Timer0 Tim0_isr

'Hauptprogramm
'****************************************************************
Do


       Debounce Pind.2 , 0 , Taster_1 , Sub 'Test LED an PortD.5


Loop

End

'***Interrupt_Routine*************************************************** 
********
Tim0_isr:

Incr Zaehler

 If Zaehler = 100 Then
   Toggle Portd.6
   Zaehler = 0
 End If

Return


'*** Sub-Menue 
*****************************************************************

Sub Taster_1

   Toggle Portd.5

End Sub

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Paul Baumann schrieb:
> (16000000/1024/100)

DENKFEHLER !

Es muss 16000000/1024/256/100 heissen, da der Timerüberlauf erst nach 
256 Counts statt findet.

von Stefan E. (sternst)


Lesenswert?

Paul Baumann schrieb:
> Das bedeutet, daß die LED an PortD.6 mit weniger als 1 Hz blinkt, wobei
> ich dort ca 157 Hz erwartete. (16000000/1024/100)
> d.h. Takt/Vorteiler/100

Weil deine Rechnung schlicht falsch ist. Da fehlt ein /256.

von Paul Baumann (Gast)


Lesenswert?

@Magnetus

Mensch Danke!
Och ich Rindvieh....so Etwas Blödes habe ich lange nicht mehr gemacht.

MfG Paul

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Paul Baumann schrieb:
> @Magnetus
>
> Mensch Danke!

Biddeschöön.

> Och ich Rindvieh....so Etwas Blödes habe ich lange nicht mehr gemacht.

Manchmal sieht man halt den Wald vor lauter Bäumen nicht...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.