Go Down

Topic: Im Programm weiterschalten bei Flanke Low-High an Pin ? (Read 781 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy