Forum: Mikrocontroller und Digitale Elektronik Timer1 beim Arduino Uno (ATmega328) zählt nur bis 255?!


von Paul H. (powl)


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

: Bearbeitet durch User
von Paul H. (powl)


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?

: Bearbeitet durch User
von Mirco C. (Firma: s@Td) (mcontroller)


Lesenswert?

Was steht den in TCCR1A? Vill. bist du im 8Bit PWM Mode gelandet wenn 
WGM10 gesetzt ist.

von Thomas E. (thomase)


Lesenswert?

Paul Hamacher schrieb:
> Wo ist mein Denkfehler?
Daß du glaubst, ohne den kompletten Code könnte dir irgendjemand helfen.
Der Timer hat 16 Betriebsarten. Unter denen sind einige, bei denen das 
von dir geschilderte Verhalten vollkommen richtig ist.

mfg.

von Karl H. (kbuchegg)


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.

von Paul H. (powl)


Lesenswert?

Bingo.

Hatte gar nicht daran gedacht bzw. gewusst, dass der Arduino 
standardmäßig schon mitlaufende Timerfunktionen implementiert. millis() 
nutzt wohl in der Tat den Timer1. Ich nutze jetzt einfach bequem die 
millis-Funktion mit.

Danke!

lg

von Jürgen S. (jurs)


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.

von Paul H. (powl)


Lesenswert?

gute info! steht das auch irgendwo? per google hab ich nicht direkt was 
gefunden. kann mir ja mal anschauen was in TCCR1A so steht.

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.