Forum: Compiler & IDEs mega8 timer0 math


von JG (Gast)


Lesenswert?

Ich glaube ich steh auf dem Schlauch.

ich versuch gerade die Timer vom mega8 zu verstehen.
... Und moechte das diese tun was ich programmiere.
(warscheinlich tun sie das, aber ich hab irgendwo ein Denkfehler und 
weiss nicht wo)
=> kein konkretes Projekt nur sehen was geschieht

Nach allem was ich im DB und hier im Forum gelesen habe sollte es wie 
folgt gehen.

Hardware: Grundschaltung mit 16Mhz Crystal und 2x22pF nach Grund

#include <avr/io.h>
#include <avr/interrupt.h>


ISR(TIMER0_OVF_vect){
    PORTD ^= (1<<PD1);
}

int main(){

        DDRD |= (1 << PD0) | (1 << PD1) ;
        TCCR0 |= (1<<CS01);    //  prescaling 8
        TIMSK |= (1<<TOIE0);

  PORTD |= (1<<PD2);
  PORTD |= (1<<PD3);

  sei();

    for (;;) {                           /* loop forever */

    }
}

Erwartet:
16MHz/8 = 2MHz am Pin PD1

Ergebnis:
(an XTAL2 liegen 15.997 MHz)

an PD1 3.90kHz

Zu naiv? Nicht verstanden was da passiert? DB nicht verstanden?
Der AVR hat sein eigenes Leben?


Vielleicht kann mir jemand auf die Spruenge helfen.


Danke

von Karl H. (kbuchegg)


Lesenswert?

JG wrote:

> Erwartet:
> 16MHz/8 = 2MHz am Pin PD1

Falsch.
Der Prescaler ist nur dafür zuständig, wie schnell der Timer zählt.
Der Timer zählt mit 16/8 = 2Mhz

Er zählt also laufend 0, 1, 2, 3, 4, 5, 6, 7, 8 .....
Und wenn es keine Beschränkungen geben würde, würde er in einer Sekunde 
bis 2000000 zählen.

Aber es gibt Beschränkungen. Der Timer kann physikalisch bedingt nur bis 
255 zählen. Danach löst er einen Overflow aus und fängt wieder bei 0 an.

Wie oft passiert denn das daher? (Die Frage ist also: Wenn er in 1 
Sekunde bis 2000000 zählen kann, wie oft schafft er es dann in 1 Sekunde 
von 0 bis 255 zu zählen?)

2000000 / 256 = 7812.5

In einer Sekunde werden also 7812.5 mal die Timerobergrenze von 255 
erreicht. Und jedesmal wenn das passiert, wird ein Overflow Interrupt 
ausgelöst. Als Folge davon wird in deinem Programm die ISR aufgerufen. 
Und da du bei jedem Overflow den Pin nur toggelst, braucht es zwei 
Overflow Interrupts, bis eine komplette 'Welle' fertig ist.

  7812.5 / 2  = 3906.25 Hz

von zwieblum (Gast)


Lesenswert?

so rein überschlagsmäßig: 16 mhz quarz. 2 mhz pinwackeln. heißt alle 8 
zyklen ein interrupt. wie soll sich das ausgehen ?

von JG (Gast)


Lesenswert?

@Karl heinz Buchegger

Spitzenklasse Deine Erklaerung.
Jetzt hab ich es verstanden.

Herzlichen Dank

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.