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?
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
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
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.