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

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