Forum: Mikrocontroller und Digitale Elektronik Ampelschaltung Tastersignal solange anstehen bis Abfrage


von Peter L. (aicde)


Lesenswert?

Hallo,

ich habe ein Problem bei einer Ampelschaltung:

Wie muss ich das Programm schreiben damit das einmalige Tastersignal von 
P40 oder P41, also die Variable a oder b solange auf 1 ansteht bis das 
Programm zu dieser Abfrage gelaufen ist?

Danke im vorraus!
1
   while (P4 == 0x00)
2
   {
3
   P1 = 0x02;        // 1.Fußgängerampeln rot
4
   P2 = 0x02;        // 2.Fußgängerampeln rot
5
6
  P5 = 0x24;             
7
  warte1ms (10000);
8
    P5 = 0x34;
9
  warte1ms (5000);
10
    P5 = 0x0C;
11
    warte1ms (5000);
12
      P5 = 0x14;
13
    warte1ms (5000);
14
      P5 = 0x24;
15
      warte1ms (10000);
16
        P5 = 0x26;
17
      warte1ms (5000);
18
        P5 = 0x21;
19
        warte1ms (5000);
20
          P5 = 0x22;
21
        warte1ms (10000);
22
23
  }
24
25
26
  if (P40 == 1)          // Ampel 1 Fußgänger    
27
  {
28
   a=1;
29
   while (a==1)
30
   {
31
    P5 = 0x11;              
32
    warte1ms (5000);  // 1.Auto Ampel gelb  2.Auto Ampel grün
33
                    
34
    P5 = 0x21;
35
    warte1ms (15000);     // 1.Auto Ampel rot   2.Auto Ampel grün
36
    
37
    P1 = 0x01;              
38
          warte1ms (15000);     // 1.Fußgängerampel grün
39
    P40 = 0;
40
    a=0;
41
   }
42
  }
43
44
45
  if (P41 == 1)          // Ampel 2 Fußgänger
46
  {
47
   b=1;
48
         while (b==1)
49
   {
50
    P5 = 0x22;              
51
    warte1ms (5000);  // 2.Auto Ampel gelb  1.Auto Ampel grün
52
                    
53
    P5 = 0x0C;
54
    warte1ms (15000);  // 2.Auto Ampel rot   1.Auto Ampel grün
55
                    
56
    P2 = 0x01;              
57
    warte1ms (15000);  // 2.Fußgängerampel grün
58
    P41 = 0;
59
    b=0;
60
   }
61
  }

von einer (Gast)


Lesenswert?

Du musst dir in einer variablen merken ob eine taste gedrückt wurde.



anfrage = 0;

dann
while (1) {
  if (anfrage == 0) {
    ...
  }
  if (anfrage != 0) {
    ...

    anfrage = 0; // erledigt
  }
}


anstatt
warte1ms (5000);

for (n=1;n<5000;n++) {
   if (P40 == 1) {
      anfrage |= 1;
  }
   if (P41 == 1) {
      anfrage |= 2;
  }
}


anfrage hat die werte 0 keine taste 1 eine 2 die andere 3 beide

Leichte C syntaxfehler bitte ich zu entschuldigen da ich eigentlich nur 
PASCAL kann.

von einer (Gast)


Lesenswert?

aua

for (n=1;n<5000;n++) {
   if (P40 == 1) {
      anfrage |= 1;
  }
   if (P41 == 1) {
      anfrage |= 2;
  }
  wait1ms(1);
}

von Peter L. (aicde)


Lesenswert?

Das verstehe ich nicht ganz denn damit fragst du ja auch einfach nur 
Bedingungen ab ohne die den Zustand der Variable bis zur Abfrage 
beizubehalten.
1
anfrage = 0;
2
3
dann
4
while (1) {
5
  if (anfrage == 0) {
6
    ...
7
  }
8
  if (anfrage != 0) {
9
    ...
10
11
    anfrage = 0; // erledigt
12
  }
13
}

Ich hatte mir das so gedacht der Taster wird einmal gedrückt wärend des 
Durchlaufens der Ampel. Dann wird überprüft ob der Taster gedrückt wurde 
falls ja wird jetzt die Fußgängerampel auf grün geschaltet, sonst halt 
nicht.

von einer (Gast)


Lesenswert?

In jeder Warteschleife nach meinem Muster werden die Taster abgefragt 
und der Zustand in anfrage gemerkt.

Diesen zustand kannst du dann hinterher auswerten.

Ist so noch nicht ganz optimal sollte aber reichen um weiterzukommen.

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.