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
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.
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
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.
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.
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
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
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.
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.