Due Pulsgenerator gibt keine Pulsfolge aus

Hallo,
ich würde mir gerne mit dem Arduino Due ein Pulsgenerator bauen, den ich über die Serielle Schnittstelle steuern kann. Im Moment kann ich aber nur einzelne Impulse ausgeben und bekomme keine Impulsfolgen hin. Erkenne aber leider im Moment nicht wo mein Denkfehler ist. Vielleicht hat Jemand eine Idee.

#define NOP __asm__ __volatile__ ("nop\n\t");

  char input[40];  // puffer für die Daten
  char current;     // puffer für empfangenes Zeichen
  int incount = 0;  // Zähler zum schreiben in den Puffer
  bool lineComplete = false; // 
  int pulse = 0 ;
  long i = 0;  
  int z =0;
  int l =0;

void setup() {                 
  pinMode(12, OUTPUT);
  pinMode(14, OUTPUT);
  pinMode(15, OUTPUT); 
 
  Serial.begin(57600);
 
  
  REG_PIOD_OWER = 0xFFFF; 
}

void loop() {
  

  
  
  
  while (Serial.available() > 0) {
     
     int pulse = Serial.read(); 
    
     switch (pulse) {
   
     case '0':
           
         //for(long i; i <999999999; i++){  
   
    REG_PIOD_ODSR = 100110000;
    REG_PIOD_ODSR = 100110000;
    REG_PIOD_ODSR = 100110000;
    REG_PIOD_ODSR = 100110000;
    REG_PIOD_ODSR = 100110000;
    REG_PIOD_ODSR = 100110000;
    REG_PIOD_ODSR = 100110000;
    REG_PIOD_ODSR = 100110000;
    REG_PIOD_ODSR = 100110000;
    REG_PIOD_ODSR = 100110000;
    REG_PIOD_ODSR = 100110000;
    REG_PIOD_ODSR = 100110000;
    REG_PIOD_ODSR = 100110000;
    NOP
    NOP
    NOP  
    REG_PIOD_ODSR = 000000000; 
 
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000;  
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000;  
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000;  
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000;
                       //     };
                          i=0;  
                          Serial.print("0");
    break; 
    
    
    
    
    case '1':
    
    //   for(int z; z <100000 ; z++){  
    
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    REG_PIOD_ODSR = 100100000;
    
    NOP
    NOP
    NOP  
    REG_PIOD_ODSR = 000000000; 
  
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000;  
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000;  
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000;  
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000;
                          //       }; 
                                z =0; 
                                Serial.print("1");
    break;
    
      case '2':
    
   //    for(int l; l <100; l++){  
    
    REG_PIOD_ODSR = 100010000;
    REG_PIOD_ODSR = 100010000;
    REG_PIOD_ODSR = 100010000;
    REG_PIOD_ODSR = 100010000;
    REG_PIOD_ODSR = 100010000;
    REG_PIOD_ODSR = 100010000;
    REG_PIOD_ODSR = 100010000;
    REG_PIOD_ODSR = 100010000;
    REG_PIOD_ODSR = 100010000;
    REG_PIOD_ODSR = 100010000;
    REG_PIOD_ODSR = 100010000;
    REG_PIOD_ODSR = 100010000;
    REG_PIOD_ODSR = 100010000;
    REG_PIOD_ODSR = 100010000;
    REG_PIOD_ODSR = 100010000;
    REG_PIOD_ODSR = 100010000;
    REG_PIOD_ODSR = 100010000;
    REG_PIOD_ODSR = 100010000;
    
    NOP
    NOP
    NOP  
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000;  
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000;  
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000;  
    REG_PIOD_ODSR = 000000000; 
    REG_PIOD_ODSR = 000000000;
                           //    };  
                               l=0;
                               Serial.println("case 2");
    break;
 
            
    default:
    Serial.println("Bitte geben sie ein Pulssignal ein, welches aus 2, 0, 1 besteht!")  ;  
        

       }   
         } 

  }

logikr: Erkenne aber leider im Moment nicht wo mein Denkfehler ist. Vielleicht hat Jemand eine Idee.

Mit einer loop-Funktion nach diesem Schema:

void loop() {
  while (Serial.available() > 0) {
    // ellenlanger Rattenschwanz an Anweisungen
  } 

}

macht die loop-Funktion gar nichts, wenn sich nicht mindestens ein Zeichen im seriellen Eingangspuffer befindet.

Das Zeichen im seriellen Eingangspuffer verschwindet beim Auslesen. Danach ist der serielle Eingangspuffer leer und in der loop passiert nichts mehr. Bis das nächste Zeichen eintrifft.

Ist es dann sinnvoll noch ein Zeichen hinter die Eingabe dran zu hängen oder wie kann ich das verhindern

logikr: Ist es dann sinnvoll noch ein Zeichen hinter die Eingabe dran zu hängen oder wie kann ich das verhindern

Du mußt wissen, wie die Programmlogik sein soll.

Wenn die Programmlogik sein soll (so hast Du es gepostet): - Mache nur etwas, wenn über Serial ein Zeichen ankommt - Sonst mache nix Dann mußt Du jedesmal über Serial ein Zeichen senden, wenn etwas passieren soll. So hast Du Deine Programmlogik gepostet.

Wenn die Programmlogik sein soll: - Wenn über Serial ein Zeichen ankommt dann ändere das, was gemacht werden soll - Mache das, was gemacht werden soll Dann muß immer dann, wenn über Serial ein Zeichen empfangen wird, eine Statusvariable (bei Dir: pulse) geändert werden, und unabhängig davon, ob sich der Status geändert hat oder nicht, der Code ausgeführt werden, mit dem etwas passieren soll.

Beispiel:

void loop() {
  // Serial auslesen, wenn vorhanden
  if (Serial.available() > 0) pulse= Serial.read(); 
  // Und egal ob ein neues Zeichen auf Serial gesendet wurde oder nicht, 
  //den Wert abarbeiten, auf den "pulse" nun gesetzt ist
  // das kann entweder der alte Wert sein, oder ein von Serial neu ausgelesener Wert
  switch (pulse) {
    case '0':
      // hier den Ablauf für '0'
      break; 
    case '1':
      // hier den Ablauf für '1'
      break; 
    case '2':
      // hier den Ablauf für '2'
      break; 
    default:
      // hier der Ablauf für sonstige Fälle
  }   
}

Dann hat die Variable "pulse", die übrigens oben im Programm von Dir auch als globale Variable definiert wurde und innerhalb der loop daher nicht nochmals deklariert wird, einerseits stets einen zugewiesenen Wert. Entweder den alten Wert, oder falls ein serielles Zeichen anliegt, wird für "pulse" ein neuer Wert ausgelesen.

Und die switch-case-Anweisung wird bei jedem loop-Durchlauf abgearbeitet, was völlig unabhängig davon ist, ob ein serielles Zeichen vorhanden ist oder nicht.

So hat das Programm dann die Logik: - Falls ein serielles Zeichen empfangen wurde: Ändere "pulse" - Und danach führe den Code aus, abhängig vom Wert der Variablen "pulse"

Ah Ok jetzt hab ich es verstanden vielen Dank :)

ich habe heute mal wieder den Code ausprobiert , da ist mir aufgefallen dass sich das Problem doch etwas anders darstellt. Ich will einmal eine EIngabe machen z.b. 0110011220121 und diese dann als folge von entsprechenden Impulsen ausgebe. Wenn ich jetzt Puls so übernehme habe ich ja nur 1 Impuls und kann ja nicht mehrere direct hintereinander ohne pause ausgeben oder?