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 | }
|