mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Arduino Uno Timer1 benutzen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Zi P. (zippo)


Bewertung
0 lesenswert
nicht 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
#include <avr/io.h>
#include <avr/interrupt.h>
volatile long Zeit1=0;

void setup() {
//TCCR1B |= ((1<<CS12) | (1<<CS10));     // Prescaler 1024
TCCR1B = 5;
TIMSK1=(1<<TOIE1);
interrupts();
Serial.begin(9600);
Serial.println("Start");
Serial.println(TCCR1B);



}

void loop() {

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

}
ISR(TIMER1_OVF_vect){
  Zeit1=millis();
  Serial.println(Zeit1); 
  }

von Arduinoquäler (Gast)


Bewertung
0 lesenswert
nicht 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 Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Der Timer 1 wird u.a. für die millis() Funktion benutzt.
Also vorher die Timerregister löschen.
TCCR1A = 0x0000;
TCCR1B = 0x0000;
Dann klappt das auch.

von Arduinoquäler (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
ist er ja auch....

von Arduinoquäler (Gast)


Bewertung
0 lesenswert
nicht 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)


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

von Arduinoquäler (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Schlunz schrieb:
> Asche auf mein Haupt!

Schön wenn du Reue zeigst.

von Arduino Fanboy D. (ufuf)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.