Arduino Uno Timer1 benutzen

OP #4695542
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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.
OP #4695585
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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
Lesenswert?
• ▲
▼
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

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