mega644 timer2 problem

Gast #2122698
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
#2122708
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren