Forum: Mikrocontroller und Digitale Elektronik timer1 ist langsamer als systemtakt


von samir (Gast)


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.

von Andreas F. (aferber)


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

von blubb (Gast)


Lesenswert?

_delay_ms(1000);//zum testen der zeit

ist SEHR SEHR ungenau

steht auch in der delay.h

von Michael M. (Gast)


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.

von Karl H. (kbuchegg)


Lesenswert?

Und natürlich die übliche Frage:
Ist der Quarz über die Fusebits auch aktiviert?

von Hotte (Gast)


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).

von Michael M. (Gast)


Lesenswert?

ist der timer1 nicht ein 16bit-typ?

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.