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
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
Was steht den in TCCR1A? Vill. bist du im 8Bit PWM Mode gelandet wenn WGM10 gesetzt ist.
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.
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.