mikrocontroller.net

Forum: Compiler & IDEs timer/interrupt im interrupt ein/ausschalten?


Autor: duundich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es sollen zwei Taster an einer batteriebetriebenen Fernbedienung
entprellt und ausgewertet werden.

Wie stelle ich das elegant an?

Insbesondere das Zusammenspiel der einzelnen Interruptquellen ist mir
nicht ganz klar; ich möchte die Tasten zuersteinmal mit Peter D.s Code
entprellen, und auch seine Zeitauswertung benutzen. Außerdem soll
geprüft werden, ob beide Tasten gleichzeitig gedrückt werden.

Ich habe mir das so vorgestellt:

sleep
pcint! (durch taste)

pcint ausschalten
timerint einschalten

timerinterrupt läuft 4 mal (variable):
wenn negativ -> timerint 0; pcint 1; sleep
sonst:

ist eine oder beide tasten gedrückt.

beide -> code senden; timerint 0; pcint 1; sleep

eine:

feststellen, ob vor <zeit> losgelassen.

code senden; timerint 0; pcint 1; sleep


nach <zeit> gedrückt:

code senden bis losgelassen. ende..


Wie ich das jetzt aber in Code umsetze, ist mir leider nicht klar -
Könnte mir da bitte jemand helfen? Speziell was das Timing der
Überprüfung betrifft, habe ich keine Vorstellung zur Umsetzung.

Ist es üblich, die Interrupts / Timer einfach nach Belieben ein und
auszuschalten? Über das Interruptregister oder im Falle des Timers
durch Ausschalten des Prescalers?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Timer läuft ständig durch, auch wenn nichts an den
Tasten passiert.
Im main() hockt der µC in der obligaten while-Schleife.
Ganz konkret hockt der dort in einem sleep. Aus diesem
sleep wird der µC alle heiligen Zeiten durch den Timer
erlöst, der dann seine ISR abarbeitet und die Tasten-
entprellung bzw. auswertung macht. Danach geht es im
main() nach dem sleep weiter. Der Code dort prüft ob
mit dem Tastendruck irgendwas anzufangen ist. Wenn ja
macht er das, wenn nein eben nicht. Danach beginnt
die while-Schleife wieder von vorne und der µC stösst
auf den sleep() und legt sich wieder schlafen. Solange
bis der nächste Timer-Interrupt ....

Autor: duundich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke, nee, das geht ja nicht so einfach, ich möchte energie sparen.
deshalb ja die ganze geschichte mit pcint. der schlaf ist also eher
winterschlaf.

die timergeschichte kommt, wenn er aus dem winterschlaf erwacht ist.
ich könnte natürlich erstmal die timergeschichte nehmen, und dann den
winterschlaf einbauen.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nun, es steht dir natürlich frei, nach n Durchläufen
durch die Timer-ISR ohne Aktion, den 'Schlafstatus' soweit zu
verschärfen, dass er nur mehr mit einem Pin change Interrupt wieder
erwacht. Das ändert aber am Prinzip nicht viel.

Autor: duundich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hast recht :-) sorum gedacht, ist es nicht mehr so kompliziert

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.