mega8 timer0 math

Gast #1212630
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
#1212633
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.