mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR - TIMER0 - ISR_OVF_vect - ATMEGA16A


Autor: Sebastian S. (sebian19)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag zusammen,
ich habe so meine Probleme mit Timern und deshalb frage ich mal hier 
nach. Ich habe einen Atmega16A mit 12MHz. Ich möchte, das beim start 
einer Eingabe über einen gewissen PORT (per Tastenfeld), der Timer 
startet. Während der Timer 2s lang läuft, soll die Eingabe über das 
Tastenfeld in ein Array abgespeichert werden. Nach den 2s, soll dann auf 
einem LCD-Display die Eingabe angezeigt werden und der Timer sollte 
stoppen, damit er wieder starten kann, wenn erneut eine Eingabe startet. 
Zwischen stoppen und starten soll 1s vergehen (per Delay). Mein Problem 
ist jetzt nur der Timer selber, der Rest ist kein Problem.
Könnte mir also jemand helfen, wie man das am besten macht? Damit beim 
Timer nach 2s ein Interrupt auslöst, weiß ich wie es geht, mein Problem 
ist, dass der Timer anschließend aufhören soll und erst wieder ab der 
nächsten Eingabe startet. Kann ich also den Timer stoppen und dann erst 
wieder über ein if() starten?

mfg Sebastian Schneider

Autor: H.Joachim S. (crazyhorse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast die Sache mit den Timern noch nicht richtig verstanden.
Und mit Timer0 kommst du eh nicht auf 2s bei 12MHz.

edit: link vergessen:
https://www.mikrocontroller.net/articles/AVR-Tutorial:_Timer

: Bearbeitet durch User
Autor: Sebastian S. (sebian19)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, danke erstmal für die Antwort. Wie schon gesagt, hab ich so meine 
Probleme mit den Timern. Wie könnte ich dann realisieren, dass ich nur 
diese zwei Sekunden zweit habe von der ersten bis zur letzten Eingabe?
Edit: bzw. wäre es zum Beispiel möglich, dass ich erst nach mehrerem 
auslösen der Interrupt die Aktion setzte. Also auf diese Weise auf die 
2s komme?
lg Sebi

: Bearbeitet durch User
Autor: TimerBenutzerVerwender (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
H.Joachim S. schrieb:
> Und mit Timer0 kommst du eh nicht auf 2s bei 12MHz.

Dann kann er ja den Timer1 verwenden.

Oder wenn es nicht supergenau gehen soll, den Timer 0
merhmals aneinanderstückeln.

Autor: Sebastian S. (sebian19)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja es ist nicht so genau. Da es halt nur darum geht, dass man z.B nicht 
10s lang ganz langsam etwas eingeben kann. Man sollte einfach z.B 
ziffern in einer Zeit von etwa 2s eingeben.

: Bearbeitet durch User
Autor: Arduino Fanboy D. (ufuf)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian S. schrieb:
> Edit: bzw. wäre es zum Beispiel möglich, dass ich erst nach mehrerem
> auslösen der Interrupt die Aktion setzte. Also auf diese Weise auf die
> 2s komme?

Ja, das würde ich als den goldenen Weg betrachten.
Und irgendwie stoppen, muss man den auch nicht.
Der kann im Hintergrund weiter ticken.

Hilft auch beim entprellten der Tastatur, oder beim Bau eines delay().

: Bearbeitet durch User
Autor: Sebastian S. (sebian19)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Arduino Fanboy D.
Danke für deine Antwort. Jetzt weiß ich glaub wie ich es hin bekomme. 
Sollte ich es nicht schaffen, werde ich hier nochmals schreiben.
Lg Sebi

Autor: Thomas F. (igel)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stelle den Timer0 z.B auf 10ms ein. Mit dem Compare-Modus kann man das 
ausreichend genau hinbekommen.

In der Timer-Interrupt-Routine zählst du dann einfach nur eine Variable 
hoch. Dort kann man dann bei Bedarf auch Tastenabfragen und 
Tastenentprellung mit unterbringen.

In der Main-Routine überprüft man dan ob die Variable schon 200 erreicht 
hat. Dann sind 2s vergangen und man kann irgendwas machen, auch die 
Variable mit neuem Startwert laden.

: Bearbeitet durch User
Autor: Jörn P. (jonnyp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei 12 MHz und 2 Sekunden müßtest du (geschätzt)den prescaler 
(Teiler)für Timer_1 auf 1024 einstellen. Das Eingeben des Teilerfaktors 
startet auch den Timer.
Das Eingeben des Faktors 0 stopt den Timer.

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.

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