Forum: Mikrocontroller und Digitale Elektronik AVR Timer interrupt nach 5 sekunden


von Christian (Gast)


Lesenswert?

Hallo,

ich habe eine kurze Frage bezüglich Interrupts, Timer interrupt oder 
Compare interrupts.

Ich bräuchte einen Interrupt nach ca. 5 sec. (genau werde ich das noch 
ausrechen). Allerdings komme ich mit den prescalern nicht in die 
gewünschten Zeiten. Nun habe ich schon gelesen, dass man am einfachsten 
eine Variable hochzählt um auf die geünschte Zeit zu kommen.
Nur wie kann ich einen Interrupt auslösen wenn die Variable meinen Wert 
ereicht hat?
Also mir ist klar dass ich mittels Interrupt die Variable hochzähle nur 
nicht wie ich bei meinem Wert einen interrupt auslöse der dann meinen 
gewünschten Code ausfürt...

Bisher habe ich Arduinos benutzt und dort interrupts mit der millis() 
methode ausgelöst. Dort ist es ja eigenlich auch nur eine variable die 
mit dem Timer hochgezählt wird, oder?

Sorry, ich stehe gerade auf dem Schlauch, kann jemand mal mein Hirn 
anschupsen.

Danke Christian

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Du kannst mittels Portpin immer einen externen Interrupt oder Pinchange 
Interrupt auslösen. Du müsstest deinen Timerinterrupt so schreiben, das 
er hochzählt und dann nach den 5 Sekunden am Portpin wackelt.
Kostet allerdings einen Pin, den du aber evtl. sowieso schon hast, denn 
du willst ja nach den 5 Sekunden irgendwas anstellen.

von m.n. (Gast)


Lesenswert?

Christian schrieb:
> Sorry, ich stehe gerade auf dem Schlauch, kann jemand mal mein Hirn
> anschupsen.

http://www.mino-elektronik.de/Generator/takte_impulse.htm#bsp2

von Andreas B. (bitverdreher)


Lesenswert?

Du zählst im Timer Interrupt einen  Zähler hoch. Beim Erreichen eines 
bestimmten Wertes (= Deines Teilers) setzt Du ein Flag und den Zähler 
wieder auf 0 zurück.
Im Hauptprogramm wird nun dieses Flag ausgewertet. Nach Ausführung 
Deiner gewollten Aktion setzt Du dieses Flag im Hauptprogramm wieder 
zurück.

Gruß
Andreas

von Ulrich F. (Gast)


Lesenswert?

Ich glaube, du verwendest den Begriff Interrupt falsch.
> Bisher habe ich Arduinos benutzt und dort interrupts mit der
> millis() methode ausgelöst.
Zumindest deutet dieses darauf hin.

> Nur wie kann ich einen Interrupt auslösen wenn die Variable meinen Wert
> ereicht hat?
Gar nicht !?!?

Frage in der Hauptschleife diese Variable ab.
Und dann tu das was dann nötig ist.

von Peter D. (peda)


Lesenswert?

Christian schrieb:
> Ich bräuchte einen Interrupt nach ca. 5 sec.

Nein, Du willst was machen nach 5s.
Der Interrupt kann ruhig öfter auftreten, z.B. alle 100ms und wenn darin 
eine statische Variable bis 50 gezählt hat, sind die 5s um.

von Düsendieb (Gast)


Lesenswert?

Der Interrupt wird hat alle 100mS oder was es so hergibt aufgerufen und 
nur wenn die Variable 50 anzeigt (5 Sec) wird der interessante 
Programmteil in der Interrupt Routine ausgeführt

von Peter D. (peda)


Lesenswert?

Matthias Sch. schrieb:
> Du müsstest deinen Timerinterrupt so schreiben, das
> er hochzählt und dann nach den 5 Sekunden am Portpin wackelt.

Warum sollte jemand diesen Weg der maximalen Umständlichkeit gehen?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Peter Dannegger schrieb:
> Warum sollte jemand diesen Weg der maximalen Umständlichkeit gehen?

Weil er geschrieben hat, das er einen Interrupt braucht. Flag ist auch 
gut (und so würde ich es machen), aber er schreibt das nun mal so.

von Andreas B. (bitverdreher)


Lesenswert?

Peter Dannegger schrieb:
>
> Warum sollte jemand diesen Weg der maximalen Umständlichkeit gehen?

Weil er dann nach 5s eine echten IRQ hat (nämlich den PIN change IRQ).
Und das war ja die Frage des TO's ;-)

Gruß
Andreas

von Peter D. (peda)


Lesenswert?

Andreas B. schrieb:
> Weil er dann nach 5s eine echten IRQ hat

Er ist doch bereits in einem echten Timerinterrupt, echter gehts nicht.

von Andreas B. (bitverdreher)


Lesenswert?

Peter Dannegger schrieb:
> Er ist doch bereits in einem echten Timerinterrupt, echter gehts nicht.

Aber in diesem Interrupt eben öfters als alle 5s. Meine Antwort war auch 
nicht so ganz ernst gemeint. Wenn Du darauf abzielst daß die Frage des 
TO's an sich schon unsinning ist, gebe ich Dir Recht.
Ich glaube wir sollten erst einmal den TO fragen, was er denn nun genau 
vorhat.

Gruß
Anreas

von Heinz L. (ducttape)


Lesenswert?

Ja, aber was hindert ihn dran im Timerinterrupt auch noch zu prüfen ob 
nach dem Hochzählen der Variable diese den "Sollwert" übersteigt? Also 
alle Sekunde Reg15 hochzählen und wenn's kleiner 5 ist, interrupt 
beenden, sonst eben ... tjo, was auch immer nach 5 Sekunden passieren 
soll tun.

von Christian (Gast)


Lesenswert?

Hi Leute,

alles klar, danke für das Lösen des Hirnknotens.

Ich konnte nicht früher antworten, bin ja auf der Arbeit :)

Im Prinzip kann ich in der Hauptschleife mit dem Flag arbeiten, so 
Zeitkritisch ist es bei mir nicht... und so komplex ist diese auch 
nicht, dass es zu lange dauern würde bis sie abgearbeitet ist.

Aber letztenendes ist das Portpinwacklen doch gar nicht so falsch, wenn 
man wirklich zeitkritisch eteas ausgeführt haben möchte, da dann die 
Hauptschleife, egal wo sie wohl sein mag, unterbrochen wird, richtig?

Anyway, das dürft Ihr mir gerne beantworten oder nicht. Geholfen habt 
Ihr mir schon und ich weiss wie ich nun weitermache. Vielen Dank!


Gruss Christian

von Andreas B. (bitverdreher)


Lesenswert?

Das hast Du scheinbar immer noch nicht verstanden.
Portwackeln nimmt Dir einem Port weg und nützt Dir nichts.
Wenn Du unbedingt während des Interrupt etwas ausführen willst (erkläre 
mal, warum), kannst Du dort eine Zähler hochzählen und solange dieser 
nicht erreicht ist, wieder aus der IRQ heraus springen.
Das macht man aber nur, wenn diese Routine im IRQ kurz ist.

Gruß
Andreas

von Christian (Gast)


Lesenswert?

Andreas B. schrieb:
> kannst Du dort eine Zähler hochzählen und solange dieser
> nicht erreicht ist, wieder aus der IRQ heraus springen.

Ahhh, richtig... ist ja viel einfacher. Hatte die Antworten nur 
überflogen.

Thnx,

Christian

von Andreas B. (bitverdreher)


Lesenswert?

Christian schrieb:
> .... Hatte die Antworten nur
> überflogen.

Das motiviert nicht sonderlich, hier im  Forum zu helfen.

Gruß
Andreas

von Christian (Gast)


Lesenswert?

Andreas B. schrieb:
> Das motiviert nicht sonderlich, hier im  Forum zu helfen.

Bitte den Zusammenhang sehen. Ich bin wie gesagt auf der Arbeit und kann 
nicht die ganze Zeit im Forum mitlesen. Heute Abend habe ich mehr Zeit 
(Elektronik ist für mich ein Hobby, arbeiten tue ich etwas anderes).
Allerdings wollte ich nach so vielen Antworten wenigstens ein Feedback 
geben, da es mindestens genauso demotivierend ist, wenn sich der TO nach 
zufriedenstellender Antwort nicht mehr meldet.

Ich freue mich immre sehr um eine Antwort, wenn ich nicht weiter komme 
und kann mich noch mal bedanken...

Christian

von Andreas B. (bitverdreher)


Lesenswert?

Na, ok, ich habe hier auch eine andere Tageszeit.
Dann ist es aber auch besser, zu lesen und darauf zu antworten wenn man 
auch tatsächlich die Zeit dazu hat.
Ansonsten arten solche Threads sonst so aus, daß aufgrund nicht richtig 
gelesener und durchdachter Antworten die Helfer unwillig werden.

Gruß
Andreas

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.