Forum: Mikrocontroller und Digitale Elektronik Arduino Uno Timer1 benutzen


von Zi P. (zippo)


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
  }

von Arduinoquäler (Gast)


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.

von Einer K. (Gast)


Lesenswert?

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.

von Schlunz (Gast)


Lesenswert?

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.

von Arduinoquäler (Gast)


Lesenswert?

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

von Arduinoquäler (Gast)


Lesenswert?

Schlunz schrieb:
> Der Timer 1 wird u.a. für die millis() Funktion benutzt.

... und ich dachte immer Timer 0 wäre dafür zuständig.

von Zi P. (zippo)


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

von Arduino Anfänger (Gast)


Lesenswert?

ist er ja auch....

von Arduinoquäler (Gast)


Lesenswert?

Zi P. schrieb:
> wie bei einem normalen AVR.

Das ist ein normaler AVR.

Nur kurz nach dem Einschalten schon mal "benutzt".

von Schlunz (Gast)


Lesenswert?

Asche auf mein Haupt!
Ihr habt ja Recht, für millis() ist der Timer 0 zuständig.

von Arduinoquäler (Gast)


Lesenswert?

Schlunz schrieb:
> Asche auf mein Haupt!

Schön wenn du Reue zeigst.

von Einer K. (Gast)


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).

von Arduinoquäler (Gast)


Lesenswert?

Arduino F. schrieb:
> Das kann man verhindern.

Ich weiss. Aber andere eben nicht.

Arduino F. schrieb:
> Viele der Arduino Features funktionieren dann allerdings nicht mehr

Daher habe ich meine eigenen Foltermethoden ....

von Philipp K. (philipp_k59)


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.

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.