• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Abfallverzögerung Mit Tiny13

kirby27b

Geocacher
Hallo,

wer ist denn so freundlich und kann mir ein Programm, für Bascom, schreiben mit dem ich eine Abfallverzögerung ( um die 10sec) für einen Ausgang erstellen kann. Wenn möglich mit komentaren so das ich ( atmel/Microcontroller Anfänger) den Ablauf nachvervolgen kann und daraus lernen.

Danke Olaf
 

Windi

Geoguru
Hab mir gerade überlegt dass das ja eigentlich nicht schwer ist.
Wenn Taste gedrückt dann Ausgang setzen.
Wenn Taste losgelassen dann 10 Sekunden warten und dann Ausgang löschen.

Aber so einfach ist es nicht. Es kann ja sein dass innerhalb der 10 Sekunden Wartezeit die Taste erneut betätigt wird und dann soll der Zeittakt ja von neuem laufen.

Jetzt ist mir aber zu spät bzw. zu früh um mir darüber genauere Gedanken zu machen. Evtl morgen bzw. heute. Das sinnvollste wäre wohl ein Timer und eine Interruptroutine.
 

thomas_st

Geowizard
Windi schrieb:
Hab mir gerade überlegt dass das ja eigentlich nicht schwer ist.
Wenn Taste gedrückt dann Ausgang setzen.
Wenn Taste losgelassen dann 10 Sekunden warten und dann Ausgang löschen.

Aber so einfach ist es nicht. Es kann ja sein dass innerhalb der 10 Sekunden Wartezeit die Taste erneut betätigt wird und dann soll der Zeittakt ja von neuem laufen.

Jetzt ist mir aber zu spät bzw. zu früh um mir darüber genauere Gedanken zu machen. Evtl morgen bzw. heute. Das sinnvollste wäre wohl ein Timer und eine Interruptroutine.
Jep. Da ich mich mit Bascom nicht so auskenne, von mir daher nur Pseudocode:
Code:
Hauptprogramm:
  Tasten IO auf Eingang;
  LED IO auf Ausgang;
  Timer auf 50ms initialisieren;
  Timer ISR setzen;
  Endlosschleife;
End Hauptprogramm.

ISR Timer:
  Abfragen Tasten IO;
  if Taste == Gedrückt:
    Zähler auf 200; // 10s / 50ms = 200
  if Zähler > 0:
    Zähler = Zähler - 1;
    LED An;
  else
    LED Aus;
End ISR.
Ich denke mal so müsste das funktionieren.

Viele Grüße,
Thomas(_st)
 
OP
K

kirby27b

Geocacher
Hallo,

erst schon einmal Danke. Also für mein Anligen ist es eher sogar nicht nötig das die Zeit bei nochmaligen drücken wieder neu beginnt. Also was ich mir vorstelle ist, Taste drücken, Zeit läuft ab und kann dann erst wieder neu gestartet werden.

Danke Olaf
 

thomas_st

Geowizard
kirby27b schrieb:
erst schon einmal Danke. Also für mein Anligen ist es eher sogar nicht nötig das die Zeit bei nochmaligen drücken wieder neu beginnt. Also was ich mir vorstelle ist, Taste drücken, Zeit läuft ab und kann dann erst wieder neu gestartet werden.
Soll der Ausgang auch gelöscht werden, wenn die Taste noch gedrückt ist oder nicht? Wie soll es denn aussehen?. Ich versuche das mal deutlich zu machen (T ist die Taste; L ist die LED):
Code:
Ausschaltverzögerung:
          _____
T:    ___|     |_____________
          ____________
L:    ___|            |______

Einschaltverzögerung:
          ____________
T:    ___|            |______
                 _____
L:    __________|     |______


Ein- und Ausschaltverzögerung:
          ___
T:    ___|   |_______________
                 ___
L:    __________|   |________

     |----------------------> t
Viele Grüße,
Thomas(_st)
 
OP
K

kirby27b

Geocacher
thomas_st (T ist die Taste; L ist die LED):[code schrieb:
Ausschaltverzögerung:
_____
T: ___| |______________
____________
L: ___| |_______

___________________
T: ___| |
____________
L: ___| |_______



|----------------------> t
[/code]
Viele Grüße,
Thomas(_st)
Hallo,

also der Ablauf soll so sein, daß der Ausgang nach drücken der Taste noch 10sec eingeschaltet bleibt. Das Abschalten soll auch erfolgen wenn die Taste aus welchem Grund auch immer noch gedrückt ist.Wobei ein erneutes Einschalten grundsätzlich erst nach ablauf der Zeitverzögerung möglich sein soll.

Ach ja was waren das noch für Zeiten als man Zeitablaufschemata für Programmschaltwerke zeichnen musste :D aber so hat man wenigstens eine gemeinsame Grundlage was ich meine...obwohl das wäre auch noch ein cache " ordne die gefundenen Kurvenscheibe richtig auf der welle an und lese den Zustand der Meldeleuchten nach 45Grad drehung ab :???:

Danke Olaf
 

stonewood

Geowizard
kirby27b schrieb:
also der Ablauf soll so sein, daß der Ausgang nach drücken der Taste noch 10sec eingeschaltet bleibt. Das Abschalten soll auch erfolgen wenn die Taste aus welchem Grund auch immer noch gedrückt ist.Wobei ein erneutes Einschalten grundsätzlich erst nach ablauf der Zeitverzögerung möglich sein soll.
Das ist doch ganz einfach, das heißt doch nur daß der Ausgang nicht sofort sondern erst nach 10 Sekunden eingeschaltet wird.
Also einfach 10 Sekunden warten nachdem die Taste gedrückt wurde.

Code:
Abfragen Tasten IO;
  if Taste == Gedrückt:
    waitms(10000)
    LED an;
  else
    LED Aus;
End ISR.
 

Windi

Geoguru
kirby27b schrieb:
Code:
Ausschaltverzögerung:
          _____
T:    ___|     |______________
          ____________
L:    ___|            |_______

          ___________________
T:    ___|                   |
          ____________
L:    ___|            |_______



     |----------------------> t
Das ist dann eine sog. flankengetriggerte Ausschaltverzögerung.
 

thomas_st

Geowizard
stonewood schrieb:
kirby27b schrieb:
also der Ablauf soll so sein, daß der Ausgang nach drücken der Taste noch 10sec eingeschaltet bleibt. Das Abschalten soll auch erfolgen wenn die Taste aus welchem Grund auch immer noch gedrückt ist.Wobei ein erneutes Einschalten grundsätzlich erst nach ablauf der Zeitverzögerung möglich sein soll.
Das ist doch ganz einfach, das heißt doch nur daß der Ausgang nicht sofort sondern erst nach 10 Sekunden eingeschaltet wird.
Nöp. So wie ich es verstehe, soll die LED eingeschaltete werden, sobald die Taste gedrückt wird und dann egal ob die Taste losgelassen wurde oder weiter gedrückt wird nach 10s augeschaltet werden.
stonewood schrieb:
Code:
[...]
    waitms(10000)
[...]
End ISR.
Das gefällt mir jetzt aber gar nicht :p

Mein Programm (wieder nur Pseudocode) setzt diesmal auf zwei IRQs - einen Timer- und den Pinchange-IRQ:
Code:
global int Zähler;

Begin Hauptprogramm:
  Pinchange-IRQ für Tasten IO einschalten und PC-ISR setzen;
  eventuell noch Tasten IO auf Eingang;
  Zähler = 0;
  LED IO auf Ausgang;
  Timer auf 50ms initialisieren;
  Timer ISR setzen;
  Endlosschleife dabei Controller immer wieder schlafen legen;
End Hauptprogramm.

Begin ISR PC:
  if Taste gedrückt: // da der PC-IRQ auf LH wie auch HL-Flanken reagiert, müssen wir 
                     // noch abfragen, ob die Taste gedrück oder losgelassen wurde
    if Zähler == 0:  // Zähler ist 0 -> dann kann es ja losgehen
      Zähler = 200;  // 10s / 50ms = 200
end ISR PC.

Begin ISR Timer:
  if Zähler > 0:     
    Zähler = Zähler - 1;
    LED An;
  else
    LED Aus;
End ISR Timer.
Das Teil wird jetzt nicht exakt 10s eingeschaltet sein sondern eventuell 50ms weniger (wenn der PC-IRQ im Bezug auf den Timer IRQ etwas ungünstig kommt, wenn das wichtig ist, solltest Du eventuell den Timer IRQ kürzer wählen (und dann auch über die 200 nochmal meditieren). Ansonsten sollte der Schlafmodus in der Endlosschleife so gewählt sein, dass der PC- wie auch der Timer-IRQ den Controller aufwecken können.

Viele Grüße,
Thomas(_st)
 
OP
K

kirby27b

Geocacher
Hallo,

tja da ich mit dem "Pseudocode" zwar gedanklich, aber Programiertechnisch nichts anfangen kann habe ich mir mal das " AVR Microcontroler Lehrbuch " von Roland Walter zugelegt. Werde mir wohl doch zuerst mal ein paar Grundlagen anlesen. Trotzdem allen vilen Dank für die Bemühungen.
Aaaaber zu aller erst gehts morgen mal ne Woche zum Cachen nach England ( Stonehenge ) und evtl. nen kleiner Abstecher zu den Iren.

Grüße Olaf
 
Oben