Arduino Uno Timer1 benutzen

OP #4695542
Hallo,

ich will einen 16Bit Timer nutzen und einen Interrupt ca. alle 4sek 
erzeugen.
Bei 16Mhz des Arduino Uno sollte es bei Timer1 mit einem Prescaler von 
1024 funktionieren...tut es leider bei mir nicht. Ich erhalte alle 33ms 
einen Interrupt wenn ich in das TCCR1B-Register den Wert 5 lade, das 
entspricht CS10 und CS12 gleich 1.
Versuche ich mit:
"TCCR1B |= ((1<<CS12) | (1<<CS10));"
das Register zu laden funktioniert der Timer nicht. Ich habe deshalb mir 
das Register auf die serielle Schnittstelle schreiben lassen und siehe 
da es wird der Wert 7 geladen -> also 111
Ich verstehe nicht wo die Fehler liegen!

Meine Fragen sind:
1.) Wieso kann ich das Register nicht laden wie es in C üblich ist, bzw. 
wie schreibe ich es richtig?

2.) Warum bekomme ich anstatt alle 4sek einen Überlauf-Interrupt alle 
33ms?


PS: Ich nutze die Arduino Software
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
volatile long Zeit1=0;
4

5
void setup() {
6
//TCCR1B |= ((1<<CS12) | (1<<CS10));     // Prescaler 1024
7
TCCR1B = 5;
8
TIMSK1=(1<<TOIE1);
9
interrupts();
10
Serial.begin(9600);
11
Serial.println("Start");
12
Serial.println(TCCR1B);
13

14

15

16
}
17

18
void loop() {
19

20
  // put your main code here, to run repeatedly:
21
while(1){
22
  };
23

24
}
25
ISR(TIMER1_OVF_vect){
26
  Zeit1=millis();
27
  Serial.println(Zeit1); 
28
  }
Gast #4695566
Zi P. schrieb:
> und siehe
> da es wird der Wert 7 geladen -> also 111
> Ich verstehe nicht wo die Fehler liegen!

Lösche mal alle Timer1 Register auf Null bevor du sie
konfigurierst.

Eventuell hat der Arduino durch den Bootloader eine
"Vorgeschichte" die ihn nicht so aussehen lässt als ob
er gerade einen Reset bekommen hat.
Gast #4695570
Arduinoquäler schrieb:
> Eventuell hat der Arduino durch den Bootloader eine
> "Vorgeschichte" die ihn nicht so aussehen lässt als ob
> er gerade einen Reset bekommen hat.

Nicht durch den Bootloader.
Aber durch den init Code.
Der Timer1 und auch 2 wird für PWM vorbereitet.
Gast #4695575
Der Timer 1 wird u.a. für die millis() Funktion benutzt.
Also vorher die Timerregister löschen.
1
TCCR1A = 0x0000;
2
TCCR1B = 0x0000;
Dann klappt das auch.
Gast #4695576
Arduino F. schrieb:
> Nicht durch den Bootloader.

Stimmt eigentlich. Meine eigenen Experimente die den Bootloader
benutzen bestätigen diese Aussage ....

Aber wenn die Arduino-Init schon im Timer1 herumwerkelt ist
das schon eine tolle Falle ....
OP #4695585
Danke für eure Antworten!

Ich habe die Timer Register TCCR1A und B gelöscht, anschließend gesetzt 
und es funktioniert. Ich wäre im Leben nicht drauf gekommen diese zu 
löschen...ich hatte gedacht, dass sie leer sind wie bei einem normalen 
AVR.

Für millis(); wird ein anderer Timer verwendet denn ich kann immer noch 
damit messen wenn ich Timer1 überschrieben habe.

Grüße
Gast #4695684
Arduinoquäler schrieb:
> Aber wenn die Arduino-Init schon im Timer1 herumwerkelt ist
> das schon eine tolle Falle ....

Das kann man verhindern.
Auch die Belegung von Timer0.
Durch weglassen von setup() und loop(), stattdessen eine main() 
einführen.

Viele der Arduino Features funktionieren dann allerdings nicht mehr (wie 
erwartet).
#4695722
Das ist übersichtlicher als man glaubt..

Timer0 ist nur für Micros() und Millis(), da viele Libraries für das 
Timing auf die beiden Aufbauen funktioniert dann nix mehr..

Die Timer1 und Timer2 sind lediglich für PWM/FastPwm "Vorbereitet" und 
auf den richtigen Divider gestellt, benötigt wird das nur bei 
writeAnalog.

Ich selbst habe Timer2 für die Timings eingestellt.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.