Eugen B. schrieb:
> das hatte ich auch vor, aber wie genau?
> hab das zwar hier in tut gelesen aber leider begreife ich das nicht :(
Was genau begreifst du nicht?
Ein Grundprinzip vieler Timeranwendungen besteht darin, dass eine ISR in
regelmässigen Zeitabständen aufgerufen wird. So wie das Ticken des
Sekundenzeigers einer Uhr.
Und über dieses regelmässige Ticken, welches dir eine Basiszeiteinheit
verschafft, musst du deine Applikation abwickeln.
Wie machst du das denn mit einer Uhr?
Wenn das Ziehsignal weggeht, stellst du eine gedachte Stoppuhr auf 60.
Und mit jedem Tick deiner Hauptuhr zählst du die Stoppuhr um 1 runter.
Solange bis du dann endlich irgendwann einmal bei 0 angekommen bist und
du die LED von grün auf blau zurückschaltest.
Und dasselbe kannst du auch mit deiner Lichtschranke machen.
d.h. die Frage die sich stellt lautet:
Bei jedem Ticken meiner Hauptuhr, was habe ich zu tun?
* nachprüfen ob die Stoppuhr für das Ziehsignal ungleich 0 ist
(denn dann läuft diese)
* ist sie ungleich 0, dann um 1 verringern
* wenn sie dadurch auf 0 gekommen ist: Led auf blau umschalten
* nachprüfen ob die Stoppuhr für die Lichtschranke ungleich 0 ist
(denn dann läuft diese)
* ist sie ungleich 0, dann um 1 verringern
* wenn sie dadurch auf 0 gekommen ist: Led auf blau umschalten
und da du alle diese Punkte jede einzelne Sekunde, getrieben von deiner
Hauptuhr ausführst, spielt es keine Rolle mehr, wann genau das
Ziehsignal bzw. die Lichschranke von blau auf grün/rot gewechselt wurde.
Du stellst die LED um und stellst die jeweilige Stoppuhr auf 60. Die
Vorschrift, die du nebenher bei jedem Sekundentick abarbeitest sorgt für
das verzögerte ausschalten.
Deine Hauptuhr (der Timer) tickt jetzt nicht jede 1 Sekunde, sondern
etwas schneller. Das macht aber nichts. Ds sind nur andere Zahlenwerte,
das Prinzip ist nach wie vor dasselbe.
Register für die Ziehsignal-Stoppuhr sei zb R23
Register für die Lichtschranke-Stoppuhr sei zb R24
Timer-ISR
R23 gleich 0 ?
| nein: R23 decrementieren
| ist es jetzt 0?
| ja: LED grün/blau auf blau umschalten
v
R24 gleich 0 ?
| nein: R24 decrementieren
| ist es jetzt 0?
| ja: LED rot/blau auf blau umschalten
v
reti
main:
Eingangpin Ziehsignal abfragen
Ziehsignal da?
ja: LED grün/blau auf grün umschalten
R23 auf 60 Sekunden setzen
Eingangspin Lichtschranke abfragen
Behälter leer?
ja: LED rot/blau auf rot umschalten
R24 auf 60 Sekunden setzen
rjmp main
Und das wars schon. Das realisiert deine Ausschaltverzögerung. In der
Hauptschleife wird das jeweilige Stoppuhr Register ständig erneut auf 60
Sekunden gesetzt - solange das entsprechende Eingangssignal vorhanden
ist. Ist es nicht vorhanden, dann unterbleibt das Zurücksetzen auf 60.
Gleichzeitig wird aber vom Timer regelmässig die ISR aufgerufen und
zählt die Stoppuhr runter. Wird in der Hauptschleife die Stoppuhr nicht
wieder auf 60 zurück gesetzt, denn kann die ISR auch ungestört runter
zählen und wird irgendwann bei 0 sein. Und dann löst sie die
Ausschaltaktion aus.
Ganz einfach.
In dem Moment, in dem du bei "Zeitsteuerung" an Warteschleifen denkst,
bist du meistens verraten und verkauft. "Zeitsteuerungen" funktionieren
fast immer über den Weg, dass man sich mit einem Timer eine "Basisuhr"
macht die regelmässig in Form eines Aufrufs der ISR tickt. Und in der
ISR muss man dann einen Weg finden, wie man durch ANalyse des jetzigen
Zeitpunktes entscheiden kann was zu tun ist.
Also: Ab ins Tutorial und nachlesen wie man
* einen Timer einschaltet
* den Timer konfiguriert, dass er eine ISR anspringt
* man eine ISR schreibt
* die Berechnungen macht, damit man auch die gewünschten Zeiten
erhält.
Als Vorübung ist zb das Blinken jede Sekunde einer LED zu sehen
(natürlich Timer getrieben). Wenn du das hast, hast du schon viel über
Timer gelernt.