www.mikrocontroller.net

Forum: Compiler & IDEs mega8 timer0 math


Autor: JG (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: zwieblum (Gast)
Datum:

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

Autor: JG (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl heinz Buchegger

Spitzenklasse Deine Erklaerung.
Jetzt hab ich es verstanden.

Herzlichen Dank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.