www.mikrocontroller.net

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


Autor: Peter L. (aicde)
Datum:

Bewertung
0 lesenswert
nicht 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!
   while (P4 == 0x00)
   {
   P1 = 0x02;        // 1.Fußgängerampeln rot
   P2 = 0x02;        // 2.Fußgängerampeln rot

  P5 = 0x24;             
  warte1ms (10000);
    P5 = 0x34;
  warte1ms (5000);
    P5 = 0x0C;
    warte1ms (5000);
      P5 = 0x14;
    warte1ms (5000);
      P5 = 0x24;
      warte1ms (10000);
        P5 = 0x26;
      warte1ms (5000);
        P5 = 0x21;
        warte1ms (5000);
          P5 = 0x22;
        warte1ms (10000);

  }


  if (P40 == 1)          // Ampel 1 Fußgänger    
  {
   a=1;
   while (a==1)
   {
    P5 = 0x11;              
    warte1ms (5000);  // 1.Auto Ampel gelb  2.Auto Ampel grün
                    
    P5 = 0x21;
    warte1ms (15000);     // 1.Auto Ampel rot   2.Auto Ampel grün
    
    P1 = 0x01;              
          warte1ms (15000);     // 1.Fußgängerampel grün
    P40 = 0;
    a=0;
   }
  }


  if (P41 == 1)          // Ampel 2 Fußgänger
  {
   b=1;
         while (b==1)
   {
    P5 = 0x22;              
    warte1ms (5000);  // 2.Auto Ampel gelb  1.Auto Ampel grün
                    
    P5 = 0x0C;
    warte1ms (15000);  // 2.Auto Ampel rot   1.Auto Ampel grün
                    
    P2 = 0x01;              
    warte1ms (15000);  // 2.Fußgängerampel grün
    P41 = 0;
    b=0;
   }
  }


Autor: einer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: einer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aua

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

Autor: Peter L. (aicde)
Datum:

Bewertung
0 lesenswert
nicht 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.
anfrage = 0;

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

    anfrage = 0; // erledigt
  }
}

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.

Autor: einer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.