Timer1 beim Arduino Uno (ATmega328) zählt nur bis 255?!

OP #3590629
Lesenswert?

Hi,

um verschiedene Programmereignisse genau getimed auszuführen lasse ich 
einen 16-Bit Timer nebenherlaufen und resette ihn z.B. alle 300 
Timer-Takte wobei ich gleich noch z.B. eine Variable hochzählen lasse.

  if(TCNT1 >= 300)
  {
    TCNT1 = 0;
    eine_variable++;
  }

Leider scheint das nicht zu funktionieren. Er zählt die Variable nicht 
hoch. Wenn ich anstelle von >=300 mal 200 probier funktioniert es. Bei 
254 funktioniert es auch. Bei 255 verdächtigerweise schon nicht mehr, 
was mich zum Schluss kommen lässt, dass er die TCNT1-Variable 
möglicherweise wie eine 8-Bit Variable behandelt.

Wo ist mein Denkfehler?

lg
OP #3590645
Lesenswert?

Gestartet wird der Timer übrigens mit

// Timer1, 16Mhz, Prescaler 64, 250000 counts per second, 250 counts per 
ms
TCCR1B = (1 << CS11) | (1 << CS10);

Der Serial-Monitor ist ja ganz praktisch.. hier habe ich eine 
Debug-Ausgabe erzeugt:

unsigned int timerval = TCNT1H << 8 | TCNT1L;
Serial.println(timerval);

Dieses mal habe ich das 16-Bit Register aufgesplittet. TCNT1H scheint 
jedoch leer zu sein, ich bekomme nur Zahlen von 0 bis 255.

Das zeigt ebenso
Serial.print(TCNT1L);
Serial.print("   ");
Serial.println(TCNT1H);

sowie
Serial.print(TCNT1);

Was ist da los?
#3590877
Lesenswert?

Und dann erhebt sich auch noch die Frage, ob das Arduino System diesen 
Timer nicht für sich selbst nutzt.
Die Funktion millis() implementiert ja so etwas wie eine Systemuhr. 
Irgendwo muss die ja die Millisekunden hernehmen. Naheliegend wäre, dass 
dazu ein Timer benutzt wird.
#3592485
Lesenswert?

Karl Heinz schrieb:
> Und dann erhebt sich auch noch die Frage, ob das Arduino System diesen
> Timer nicht für sich selbst nutzt.

Ja, die Arduino-Software verwendet Timer0 für die mitlaufenden Zeiten in 
den Funktionen millis() und micros() und die delays mit delay() und 
delayMicroseconds().

Timer1 wird von der mitgelieferten "Servo"-Library verwendet, falls man 
diese nutzt, um Modellbau-Servos anzusteuern.

Timer2 wird von der tone() Funktion zur Tonerzeugung genutzt, falls die 
tone()-Funktion aufgerufen wird.

Außerdem sind die Timer bei Arduino immer bestimmten PWM-Ausgängen 
zugeordnet, wenn man die Arduino-Komfortfunktionen zur PWM-Erzeugung 
verwendet. Auf den Arduino-Boards mit Atmega328 sind dies:
Pins 5 und 6:  Timer0
Pins 9 und 10: Timer1
Pins 11 und 3: Timer2

Wenn man auch Timer0 zur freien Verfügung haben möchte, muß man auch mit 
der Arduino-Software ein "klassisches" Programm schreiben mit einer 
main() Funktion statt mit den Funktionen setup() und loop().

Sobald man ein Programm mit setup() und loop() schreibt, bindet die 
Arduino-Software den Arduino-Softwareunterbau ein und initialisiert 
Timer0 und alle Komfortfunktionen in den Arduino-Libraries sind frei 
verwendbar.

Wenn man dagegen ein Programm mit "main()" schreibt, kann die Hardware 
frei programmiert werden, einschließlich Timer0.

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