Forum: Mikrocontroller und Digitale Elektronik Timer problem


von Bruck (Gast)


Lesenswert?

Hallo,
ich habe mich etwas umgeschaut, aber keine richtige lösung zu meinem 
problem gefunden ...

Schilderung:

Ich habe auf meinem Atemga z.B ein programm, dass nach 10 sekunden eine 
z.B. LED anmacht ... nach weiteren 50 sekunden wieder ausschaltet

Doch wenn jetzt ein Taster gedrückt wird, soll die LED schlagartig 
ausgehen.

Bei mir passiert folgendes:
LED geht nach 10 sekunden an
nach 50 sekunden wieder aus
Wenn aber der schalter während einer solchen Zeitschleife gedrückt wird, 
passiert nichts

Beispielcode

Do
Waitms 10000
Portd.1 = 1
Waits 50
Portd.1 = 0
If Pind.2 = 1 then
Portd.1 = 0

Ich denke das liegt daran, dass es wie eine "Liste" gelesen wird, und 
somit das ganze an den waitms befehlen die Zeit stehen bleibt

Wie kann ich das ganze umgehen?

von AVerr (Gast)


Lesenswert?

Pseudocode:
1
loop
2
  led aus
3
  10s warten
4
  led an
5
  loop mit i=0 ... 5000
6
    10ms warten ( oder einen anderen kurzen Zeitraum )
7
    wenn Taste gedrückt loop abbrechen
8
    i um eins erhöhen
9
  loop end
10
loop end
wäre eine Möglichkeit

von Bruck (Gast)


Lesenswert?

Hmm,
da muss ich mir mal ein paar gedanken dazu machen,
da ich ca. 15 min lange Ports zufällig an/aus machen muss

Wollte ein immer gleiches ablaufmuster benutzen, und die zeiten mit 
einer rnd variable verändern ...


Kann ich eine solange zeitspanne überhaupt mit einem uC lösen?


Das ganze sollte mit so einer schleife funktionieren, aber muss mir das 
ganze noch genauer durch den kopf gehen lassen :)

Bin für weitere vorschläge offen

von AVerr (Gast)


Lesenswert?

Na gut, dann die schönere Variante:
Ein Timer, z.B. Timer1 der jede Sekunde einen Interrupt generiert.
In der ISR setzt er ein Flag ( secFlag ) auf 1, um zu signalisieren, 
dass mal wieder eine Sekunde um ist
1
volatile uint8_t secFlag = 0;
2
3
int main()
4
{
5
  uint8_t currentSec = 0;
6
7
  while(1)
8
  {
9
    if(secFlag == 1)
10
    {
11
      // Jede Sekunde wird dieser Teil 1 Mal ausgeführt
12
      secFlag = 0;
13
    }
14
    // Hier kann nebenbei noch anderes passieren
15
  }
16
17
  return 0;
18
}

von AVerr (Gast)


Lesenswert?

Ach, die Variable currentSec kann verwedet werden, um zu Zählen, wie 
weit man gerade ist.

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.