mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer Overflow problem 8515


Autor: Ferhat Incal (Gast)
Datum:

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


                      }

Autor: Andreas Juhl (Gast)
Datum:

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

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.