Go Down

Topic: Im Programm weiterschalten bei Flanke Low-High an Pin ? (Read 717 times) previous topic - next topic

elektron_

Hallo,

ich möchte ein Programm (Funktion) haben daß jedes mal einen Schritt weiterschaltet wenn Input Pin 2 eine Flanke von Low nach High hat. Diese Funktion wird aus dem loop genau dann aufgerufen wenn der Pin  2 High wird. Folgenden Code habe ich probiert - funktioniert aber nicht. Wahrscheinlich sind es die "leeren" while Schleifen die keine so gute Idee sind...  =(

Das serial.Print ist vorerst nur mal für den Monitor - damit ich ein wenig sehe was passiert  :D

Code: [Select]

void dtmfin(void)
  {
     
  int bita;                // Bit vom DTMF Baustein
  int bitb;                // Bit vom DTMF Baustein
  int bitc;                // Bit vom DTMF Baustein
  int bitd;                // Bit vom DTMF Baustein
 
 
  bita = digitalRead (3);
  bitb = digitalRead (4);
  bitc = digitalRead (5);
  bitd = digitalRead (6);
  DTA = bita + (2 * bitb) + (4 * bitc) + (8 * bitd);
 
  Serial.print("DTMF 1.Stelle: ");
  Serial.println(DTA);
 
 
  while (digitalRead (2) == HIGH)
  {
  }

  while (digitalRead (2) == LOW)
  {
  }
 
  bita = digitalRead (3);
  bitb = digitalRead (4);
  bitc = digitalRead (5);
  bitd = digitalRead (6);
  DTB = bita + (2 * bitb) + (4 * bitc) + (8 * bitd);
 
  Serial.print("DTMF 2.Stelle: ");
  Serial.println(DTA);
 
  while (digitalRead (2) == HIGH)
  {
  }
  while (digitalRead (2) == LOW)
  {
  }
 
  bita = digitalRead (3);
  bitb = digitalRead (4);
  bitc = digitalRead (5);
  bitd = digitalRead (6);
  DTC = bita + (2 * bitb) + (4 * bitc) + (8 * bitd);
 
  Serial.print("DTMF 3.Stelle: ");
  Serial.println(DTA);
   
  }


Wie programmiert man das richtig?
Schön wäre zusätzlich noch wenn die ganze Funktion abgebrochen wird wenn nicht innerhalb einiger Sekunden alle 3 Schritte durchlaufen sind - damit nicht das Programm komplett hängen bleibt nur wenn eine der Flanken mal nicht kommt...

Danke,
Christian
Elektronik funktioniert intern mit Rauch.
Beweis: Wenn der Rauch herauskommt ist es kaputt...

nur als Idee... Pin2 ist ja (zum Glück  ;) ) ein Interrupt-Pin am 328. Kannst Du per attachInterrupt(0, aufzurufende_Funktion, RISING); eine Funktion aufrufen, die z.B. ein Flag setzt, das Du dann weiter verwenden kannst?

michael_x

Das Problem ist eher, dass du die Flankenwechsel-Erkennung über
  while (digitalRead(2) == HIGH) ; // warte hier beliebig lange
machst.

Quote
Wahrscheinlich sind es die "leeren" while Schleifen die keine so gute Idee sind...
Gut erkannt ;)

Wenn du statt dessen deine Funktion so schreibst, dass sie den vorigen Zustand mit dem aktuellen vergleicht und bei Wechsel einen Zusandszähler weiter schaltet und das bisschen DTA/B/C lesen macht, ist sie immer sofort fertig und du kannst "parallel" von loop aus beliebige andere ( genauso schnelle) Sachen machen, oder deine Zeitüberwachung, oder ...

loop ruft dann deine Funktion immer auf:

Code: [Select]
boolean oldStatus;
byte step; // Schritt-Nr für den nächsten Flankenwechsel : 0 1 2
void dtmfin()
{
   boolean newStatus =  digitalRead (2);
   if (newStatus != oldStatus)
   {
       if (newStatus == HIGH)
       {
       switch (step)
         {
         case 0:
          DTA = collectBits();
          step = 1;
          break;
         case 1:
          DTB = collectBits();
          step = 2;
          break;
         case 2:
          DTC = collectBits();
          step = 0;
          break;
        }       
      }
   oldStatus = newStatus;
   }   
}

Go Up