Forum: Mikrocontroller und Digitale Elektronik Timer atmega168PA


von Tobias x. (dertobias)


Lesenswert?

Hallo liebe Community,

Nachdem ich mir das Tutorial hier zu den Timern durchgelesen habe, frage 
ich mich, ob timer für meine Anwendung von nutzen sind.
Ich habe eine Schleife mit lauter Pin abfragen, die alle 200ms abgefragt 
werden sollen. Ich hatte mir jetzt gedacht, ganz an den anfang einen 
Timer zu stellen, der sobald die 200 ms um sind, wieder mit den abfragen 
von vorne beginnt. Es sei denn, eine der Abfragen liefert ein Ergebnis 
und es wird in ein Unterprogramm gesprungen. wenn das der Fall ist, soll 
der Timer nicht wieder einen Interrupt auslösen. Erst wenn das 
Unterprogramm fertig ist, soll der timer wieder neu gestartet werden.
NAch dem Tutorial wenn ich mich da nicht verlesen habe, läuft dieser 
Timer dauerhaft udn macht immer alle 200ms dann einen Interrupt. Kann 
man das unterbinden, und ihm mit irgendeinem BEfehl sagen jetzt fang an 
zu zählen und jetzt hör auf?

Vielen Lieben Dank

derTobi

von Krapao (Gast)


Lesenswert?

Selbstverständlich kann man das. Sogar auf mehrere Arten, ja nach Gusto.

Man kann dem Timer den Takt abdrehen, also Prescaler auf 0 stellen. Oder 
man kann das Enable des Timerinterrupts auf disable stellen. Oder man 
kann Interrupts global disablen. Oder man kann in der Timer-ISR direkt 
einen Rücksprung machen...

Beim Neustart des Timers setzt man dann den Timerzähler zurück auf auf 0 
und macht die Maßnahme rückgängig mit der man den Timer abgeschaltet 
hatte.

Klug kommt mir diese Programmlogik aber nicht vor. Allerdings kann ich 
mir dein Programm aber auch nicht so recht vorstellen. Normalerweise 
lässt man den Timer wie eine Armbanduhr durchlaufen und merkt sich 
"Jetzt" und "Dann"... Ein durchlaufender Timer hat den Charme, dass das 
nebenläufig zu deinen Unterprogrammen etwas tun kann z.B. ständig die 
Pins überwachen, so dass du ein rasch reagierendes Programm mit 
Unterbrechungsmöglichkeiten schreiben kannst - wenn du willst.

von Tobias x. (dertobias)


Lesenswert?

Prinzipiell wäre eine andauernde Pinabfrage auch nicht verkehrt. Aber 
hatte immer gedacht, das so ein Prozessor irgendwie immernur straight 
einen befehl abarbeiten kann. Weil parallel irgendwelche befehle 
abarbeiten zu lassen ohne timer geht ja nicht oder? und wenn man den 
timer nutzt geht das dann? das er die ports abfragt aber gleichzeitig 
noch z.b. leds nach gewissen bitmustern der reihe nach einschalten kann?
Und dann müsste es so sein, das eine gewisse LED abfolge erst zuende 
ablaufen soll, bevor die pins wieder abgefragt werden dürfen.
funktioniert das mit dem ausschalten eigentlich auch mti dem sei befehl 
irgendwie? das ich ganz am anfang mit sei die interrupts freischalte, 
und sobald ich im unterprogramm bin dann irgendwie abschalten? (gibt es 
da einen gegenbefehl zum sei? also zum abschalten?)
Sodas ich sobald ich im Unterprogramm bin sage keine interrupts 
erlauben. Bis ich an dem Punkt bin wo er die Schalter wieder abfragen 
soll?

Vielen Dank schonmal für die fixe Antwort

von Krapao (Gast)


Lesenswert?

Der Timer ist eine Hardware im µC, die autonom arbeiten kann. Nur wenn 
der eingestellte Interrupt auftritt, wird eine Programmroutine dafür 
angesprungen. Wenn man diese besondere Programmroutine kurz 
programmiert, geht kaum was von der Rechenleistung für das eigentliche 
Programm "verloren".

Selbstverständlich gibt es den Gegenbefehl zum sei. Das ist aber alles 
im Tutorial bei den Timern und Interrupts erklärt. Genauso sind dort die 
wenigen Fälle erklärt, in denen es Sinn macht, die manche Interrupts 
kurzzeitig zu sperren.

von H.Joachim S. (crazyhorse)


Lesenswert?

Allerdings macht es i.a. wenig Sinn, einen ganzen Timer zu opfern, um 
alle 200ms irgendeine Kleinigkeit zu machen.
Es gibt eigentlich immer mehrere Sachen zyklisch zu bearbeiten.
Falls nichts besonders zeitkritisches dabei ist, nehme ich gern einen 
1ms oder 500µs Timerinterrupt.

Und dort zählst du statische Variablen hoch, in deinem Fall eben bi 200.
Bei 200 wird der zurückgesetzt und ein flag gesetzt, dass 200ms um sind.
Mit anderen Prozessen wird genauso verfahren, alle vom selben Timer 
gesteuert.

von Rolf H. (flash01)


Angehängte Dateien:

Lesenswert?

Hallo Leute,
ich finde das mit den Timern immer wieder interessant.
Habe mich erst mal mit Timer 0 vom Tiny2313 beschäftigt
und mir dazu einen Maske.asm erstellt
Der Befehl cli setzt Bit 7 im Status Register zu Low und sperrt
das Interrupt.

Grüße

Rolf

von Tobias x. (dertobias)


Lesenswert?

Das heißt ich könnte mir soeinen Timer einstellen, der theoretisch meine 
ganzen eingänge einmal abfragt, wartet, bis die 200ms zuende sind, und 
dann im Code Weitergeht?
Und wenn ich in ein Unterprogramm springe wo nicht unterbrochen werden 
darf, setzt ich am Anfang des Unterprogramms ein
cli();
und am Ende des UProgramms wenn der Timer wieder loslegen soll wieder 
ein
sei();
Ist das so richtig?

Weil habe leider das Problem das eine Hardware zum testen noch nicht 
fertig ist, und ich mit dem AVR Studio leider das mit dem 
testen/debuggen des Programmes nicht hinbekomme im bezug auf Timer

Gruß

Tobi

von Karl H. (kbuchegg)


Lesenswert?

Tobias xxx schrieb:
> Das heißt ich könnte mir soeinen Timer einstellen, der theoretisch meine
> ganzen eingänge einmal abfragt, wartet, bis die 200ms zuende sind, und
> dann im Code Weitergeht?

Die Frage ist: was hast du da dauernd mit deinem Warten.

Generell will man im meistens ja nicht warten. Genau deswegen benutzt 
man ja einen Timer.

> cli();
> und am Ende des UProgramms wenn der Timer wieder loslegen soll wieder
> ein
> sei();
> Ist das so richtig?

Jein.
Der Timer zählt ja trotzdem weiter. Alles was du verhinderst ist, dass 
dieser Code vom Timer unterbrochen werden kann.



Erzähl doch mal genauer, was du eigentlich machen willst.
Ich hab so ein Gefühl in der Magengegend, dass da im Moment ein 
riesengroßes Missverständnis am ausbrüten ist.

von Karl H. (kbuchegg)


Lesenswert?

Tobias

Da sind ein paar Aussagen in dem was du schreibst, die mich stutzig 
machen

> Weil parallel irgendwelche befehle abarbeiten zu lassen ohne timer
> geht ja nicht oder? und wenn man den timer nutzt geht das dann?

Nein, auch dann geht das nicht.

Dein AVR-µC kann immer nur einen Befehl nach dem anderen abarbeiten.

Eine Analogie wäre zb

  du kannst immer nur eine Handlung machen.
  Jetzt stellst du dir einen Wecker (das wäre der Timer), der dich
  regelmässig daran erinnert, etwas zu tun. zb Blumen giessen.

  Leutet der Wecker, lässt du sofort alles stehen und liegen und gehst
  Blumen giessen. Wenn du damit fertig bist, kehrst du wieder zurück
  zu dem was du vorher getan hast.


Einziger Unterschied: Bei dir dürfen Unterbrechnungen wahrscheinlich 
nicht öfter als alle 30 Sekunden erfolgen. Bei deinem µC kann das aber 
runter bis auf ein paar µs gehen. Für dich als langsamen Mensch sieht es 
dann so aus, als ob der µC mehrere Dinge gleichzeitig macht.

von Tobias x. (dertobias)


Lesenswert?

Ok, jetzt habe ich zumindest etwas mehr die timer verstanden vielen 
Dank.
Habe den ganzen kram jetzt endlich mal mit unserem lehrer auch 
besprechen können, und er hat mir noch eine andere möglichkeit 
aufgezeigt, wie ich mein Vorhaben realisieren kann. Aber vielen dank für 
die ganzen erklärungen zu den timern.

von Lutz (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Tobias xxx schrieb:
>> Das heißt ich könnte mir soeinen Timer einstellen, der theoretisch meine
>> ganzen eingänge einmal abfragt, wartet, bis die 200ms zuende sind, und
>> dann im Code Weitergeht?
>
> Die Frage ist: was hast du da dauernd mit deinem Warten.
>
> Generell will man im meistens ja nicht warten. Genau deswegen benutzt
> man ja einen Timer.

Es gibt ja aber auch noch das (hier wohl nicht gemeinte) Problem von 
delays. Man muß also tatsächlich z.B. 480 µs warten, bis man z.B. wieder 
einen Sensor beschicken darf. Das Programm soll also tatsächlich auch an 
dieser Stelle stehen bleiben, bis die Zeit um ist. Da ist es vom Prinzip 
her egal, wie man die Zeit totschlägt. In dieser Zeit kann der Prozessor 
nichts anderes machen (außer auf andere Interrupts zu reagieren). Von 
der Genauigkeit her wird man aber auch hierzu meistens einen Timer 
wählen.

H.joachim Seifert schrieb:
> Falls nichts besonders zeitkritisches dabei ist, nehme ich gern einen
> 1ms oder 500µs Timerinterrupt.
>
> Und dort zählst du statische Variablen hoch, in deinem Fall eben bi 200.
> Bei 200 wird der zurückgesetzt und ein flag gesetzt, dass 200ms um sind.
> Mit anderen Prozessen wird genauso verfahren, alle vom selben Timer
> gesteuert.

Das doofe dabei ist, man muß für jeden "Prozeß" eine eigene globale 
Zählvariable einfügen muß.

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.