Forum: Mikrocontroller und Digitale Elektronik Timer Overflow problem 8515


von Ferhat Incal (Gast)


Lesenswert?

Hallo,

                     Ich habe das folgende Problem. Der timer lauft 
immer ungefaehr 20000 schritte und loest einen interrupt, leider auch 
wenn ich timer1 mit einem niedrigeren wert initialisiere.Das 
aussergewöhnliche daran ist dass das Programm im Avr studio Simulator 
problemlos funtioniert. Also wenn ich Starttimer1(255) angebe lauft das 
program genau 45 sekunden und wenn ich starttimer1(20) angebe lauft 
kuerzer und loest einen interrupt aus. Nur wenn ich das Programm zum 
STK5000 schicke dann lauft egal wie nur 19 sekunden (also 20000 
schritte)

MAche ich was falsch ?

danke im voraus.

Ferhat


                      Clock= 3.69Mhz
                      Prescaler CLK/1024
                      Compiler: AVR GNU C ver 3.0.8




                      SIGNAL(SIG_OVERFLOW1) /* signal handler overflow 
*/
                      {
                      outp((0<<CS12) |(0<<CS11) |(0<<CS10), TCCR1B);
                      outp(255, TCNT1L);
                      outp(0, TCNT1H);
                      Timer1overflow=1;

                      }

                      void StartTimer1(unsigned char bitti)
                      {
                      unsigned char tmp;
                      if (Timer1overflow==2)
                      {
                      tmp=255-bitti;
                      outp(255, TCNT1L); /* reset Counter1 Low Byte */
                      outp(tmp, TCNT1H); /* reset Counter1 High Byte */
                      outp((1<<CS12) |(0<<CS11) |(1<<CS10), TCCR1B);
                      Timer1overflow=0;
                      }
                      }


                      int main(void)
                      {
                      Timer1overflow=2;

                      stState=99;
                      uart_init();
                      sei(); /* enable interrupts */
                      for (;;)

                      {

                      if (stState==99)
                      {
                      StartTimer1(255);
                      if (Timer1Overflow==1) 
{stState=0;Timer1Overflow=2;};
                      }


                      uart_send("test",4);


                      }

von Andreas Juhl (Gast)


Lesenswert?

Also ich denke DU machst den folgenden fehler, aber ich bin mir nicht
ganz sicher. Beim ATmega16 muss man zum Beispiel muss man bei allen 16
bit timer registern erst das High byte schreiben, dann das low byte.
vielleicht ist das auch bei Dir so!

BSP:

ldi r16, $00
ldi r17, $00
out TNCT1H, r17
out TNCT1L, r16

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.