timer1 ist langsamer als systemtakt

Gast #1670596
Lesenswert?
• ▲
▼
Hallo zusammen,
ich hoffe dass ihr mir helfen könnt

atmeg8 mit quarz 3686400Hz prescaler=1024   3686400hz/1024=3600
normalerweise soll das programm mir für 1s gz=3600
aus gz=ueberlauf*56535+tcnt1 ausgeben. dh vor einem ein überlauf 
sogar.aber ich bekomme 1016.
ich bin....

//---------------------------------------------------------------------- 
--------------------------
#include "i2cUs.h"
#include "lcd.h"
#include <avr/interrupt.h>
#include <avr/delay.h>

char ch[20]="\0";
char cl[20]="\0";
volatile unsigned char ueberlauf=0;



ISR (TIMER1_OVF_vect)
{

  ueberlauf++;
  TCNT1 = 0;

}

int main(void)


    TCNT1=0;   //  Timer Daten Register Timer1 High auf 0 Setzen
    TCCR1B |= (1<<CS12)|(1<<CS10); //Timer Starten mit Vorteiler 1024
    _delay_ms(1000);//zum testen der zeit
    TCCR1B &= ~((1<<CS12)|(1<<CS11)|(1<<CS10));//stop des counters
   TIMSK |= (1<<TOIE1);
   sei();

                lcdInit();
                lcdGoto(1,4) ;
                itoa(TCNT1,ch,10)
                itoa(ueberlauf,cl,10);
                lcdWriteText(ch);//aktuelle Zählerstand
                lcdGoto(2,4) ;
                lcdWriteText(cl);//anzahl von überlauf


return 0;

}

vielen dank im voraus.
#1670608
Lesenswert?
• ▲
▼
F_CPU korrekt definiert?

Ohne Definition geht er von einem Default von 1MHz aus, damit wartet 
dann dein _delay_ms() um ca. Faktor 3,6 zu wenig, das würde mit deinem 
Zählerwert hinkommen.

Ausserdem solltest du den Overflow-Interrupt vor dem Delay aktivieren, 
sonst könnte er auch dann nicht auslösen, wenn es wirklich zu einem 
Overflow käme ;-)

Andreas
Gast #1670635
Lesenswert?
• ▲
▼
blubb schrieb:
> ist SEHR SEHR ungenau
SEHR SEHR genaue aussage...

@samir:
- lies mal deine compiler-warnings.
- der main funktion fehlt die öffnende {
- ueberlauf ist ein char, damit 8bit breit und kann nicht größer als
  255 werden...
- timer-register musst du weder initialisieren, noch zurücksetzen.
- deiner formel für die zeit fehlt eine 1. siehe datenblatt.
Gast #1671867
Lesenswert?
• ▲
▼
samir schrieb:
> atmeg8 mit quarz 3686400Hz prescaler=1024   3686400hz/1024=3600
> normalerweise soll das programm mir für 1s gz=3600
> aus gz=ueberlauf*56535+tcnt1 ausgeben. dh vor einem ein überlauf
> sogar.aber ich bekomme 1016.
> ich bin....

Wenn man bei einem 8 Bit-Counter/Timer mit ISR auf Überlauf wartet, ist 
die Rechnung:

3686400hz/1024/256

die isr wird 1x aufgerufen, wenn der Timer überläuft. Im Falle von 8 bit 
also alle 256 x 3686400/1024stel Hz (im Besten Fall, wenn nicht durch 
andere Interrupts unterbrochen).

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.