Pages: [1]   Go Down
Author Topic: Im Programm weiterschalten bei Flanke Low-High an Pin ?  (Read 611 times)
0 Members and 1 Guest are viewing this topic.
Austria
Offline Offline
Full Member
***
Karma: 6
Posts: 107
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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...  smiley-cry

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

Code:
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
Logged

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

Germany
Offline Offline
Newbie
*
Karma: 0
Posts: 8
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

nur als Idee... Pin2 ist ja (zum Glück  smiley-wink ) 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?
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink

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:
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;
   }   
}
Logged

Pages: [1]   Go Up
Jump to: