Forum: Mikrocontroller und Digitale Elektronik mega644 timer2 problem


von andy (Gast)


Lesenswert?

Hallo ich habe hier einen mega644 mit 12 mhz Quarz.Ich habe testweise 2 
leds abwechselnd im Sekundentakt blinken lassen (mit delay 1000) 
klappt,also mega läuft mit 12 mhz.
Nun mein problem.Den Timer 2 habe ich initialisiert mit

 TCCR2B = (1<<CS22) | (1<<CS21) | (1<<CS20); //Teiler 1024
 TIMSK2 = (1<<TOIE2); //interrupt ein

Die ISR sieht so aus

 ISR (TIMER2_OVF_vect)
{
 frame_counter++;
}

In der main geht er in den sleep.Nach jedem Interupt wird frame_counter 
getestet mit

if (frame_counter == 80) naechstes_Bild();

Die bedingung wird ca. jede halbe Sekunde erfüllt,getestet mit 
abwechselnd leuchtenden leds.
Aber 12mhz geteilt durch 1024 sind 11718 überläufe in der Sekunde.
80 überläufe sollten also ca.0,006 Sekunden sein.Wie kommt es auf eine 
halbe Sekunde?Hab ich was falsch verstanden.

naechstes_Bild() Sieht so aus

 cli();
 frame_counter = 0;
 muster_counter++;
 i0++;
 i1 = 0;
 anzeigen();
 if (muster_counter == 10)
 {
  muster_counter = 0;
  i0 = 0;
 }
  sei();

anzeigen() sieht so aus

 ebene = 1;
 reihe = 1;
 ausgabe = pgm_read_byte(&Bild1 [i0] [i1]);
 ablaufzaehler = 1;
 PORTA = ebene;
 PORTD = reihe;
 PORTB = ausgabe;
 i1++;
 ausgabe = pgm_read_byte(&Bild1 [i0] [i1]);

Wäre nett,wenn mir das jemand erklären könnte.

gruss
andy

von Karl H. (kbuchegg)


Lesenswert?

andy schrieb:

> Aber 12mhz geteilt durch 1024 sind 11718 überläufe in der Sekunde.

Nö sind sie nicht.
Die 1024 sind ja nur dein Vorteiler. Der Zähler zählt in 1 Sekunde 11718 
mal weiter. Aber er muss jedesmal bis 255 zählen, ehe ein Überlauf 
ensteht.

von andy (Gast)


Lesenswert?

Danke,aber er müsste die 80 doch in 0,006 sekunden erreichen oder?

gruss
andy

von Karl H. (kbuchegg)


Lesenswert?

andy schrieb:
> Danke,aber er müsste die 80 doch in 0,006 sekunden erreichen oder?

Nein!

12000000/1024/256 = 45.77

Du kriegst ca 45 Überläufe in der Sekunde

Wenn du dann in jedem Überlauf auch noch bis 80 zählen lässt, dann 
müsste dein if eigentlich alle 2 Sekunden zuschlagen. Wie da jetzt die 
1/2 Sekunde entsteht weiß ich nicht, aber 0.006 Sekunden sind es auf 
keinen Fall.

von andy (Gast)


Lesenswert?

Ah,danke für das beispiel jetzt ist alles klar.

gruss
andy

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.