Quellcode

Download der Arduino-Dateien zum Flashen der Mikrocontrollerboards:

/*

 * ________________________________________________________________________________

 * Projektarbeit: Informationstechniklabor WS16/17

 * Projektcode: 03-00-EMS-Mobil-Entwicklung

 * Auftraggeber: Nico Metzler

 * Betreuer: Prof. J. Walter

 * Teammitglieder: N. Heidelberger, M.Kempf

 * Datum: 21.10.16

 ________________________________________________________________________________

 *  Kurzbeschreibung:

 * Das Programm bestimmt durch die Druckhäufigkeit des MODE-Tasters den zu verwendeten Modes.

 * Wenn der Taster nicht gedrückt wurde, befindet man sich im Puls-Pause-Betrieb. Wird der Taster einmal gedrückt, wechselt man in den Dauerpuls-Betrieb und die MODE-LED geht an.

 * Wird der ON/OFF-Taster gedrückt, startet der CurieTimerONE und springt nach 175 µs in die jeweilige ISR, welche Modeabhängig ist.

 * Wärend der Timer läuft und das biphasische Rechtecksignal ausgegeben wird, ist die Modeauswahl blockiert.

 * Wird der ON/OFF-Taster erneut gedrückt, wird der CurieTimerONE gestoppt und die Ausgänge auf LOW gesetzt.

 * Beim Überlauf des CurieTimerONEs, wird im Dauerpulsmode die ISR dauerpuls() aufgerufen, welche zunächst 11,375ms wartet

 * um dann für 175µs den Ausgang1 auf HIGH und den Ausgang2 auf LOW setzt und im nächsten Überlauf die Ausgänge zu invertieren.

 * Im Puls-Pause-Mode wird die ISR pulspause()aufgerufen welche zunächst eine Wartezeit von 4s einhält um dann anschließend für 4s die funktion dauerpuls() aufruft.

 */

 

 

#include <CurieTimerOne.h>

 

// INPUTS

const int mode = 3;                       // MODE-Taster

const int onoff = 8;                      // ON/OFF-Taster

 

//OUTPUTS

const int onoff_led = 7;                  // ON/OFF-LED

const int mode_led = 2;                   // MODE-LED

const int ausgabe_1 = 10;                 // Ausgabe-Pin 1

const int ausgabe_2 = 11;                 // Ausgabe-Pin 2

 

// SYTEMVAR

int state_onoff = LOW;                    // Status ON/OFF-Taster

int laststate_onoff = LOW;                // letzter Status ON/OFF-Taster zur Flankenerkennung

int slopecount_onoff = 0;                 // Flankenzähler ON/OFF-Taster

int reading_onoff = 0;                    // Tasterstatus ON/OFF

unsigned long lastDebounceTime_onoff = 0; // Prozesszeit letzter ON/OFF-Tasterbetätigung zum entprellen

int state_mode = LOW;                     // Status MODE-Taster

int laststate_mode = LOW;                 // letzter Status MODE-Taster zur Flankenerkennung

int slopecount_mode = 0;                  // Flankenzähler MODE-Taster

int reading_mode = 0;                     // Tasterstatus MODE

unsigned long lastDebounceTime_mode = 0;  // Prozesszeit letzter MODE-Tasterbetätigung zum entprellen

int interrupt_counter_dauer = 0;          // Interrupt-Zähler für Dauerpuls-Betrieb

unsigned int interrupt_counter_pause = 0; // Interrupt-Zähler für PulsPause-Betrieb

unsigned long debounceDelay = 50;         // Tastenprellzeit

int run_state = 0;                        // Blockiervariable für MODE-Wechsel

 

// SETUP

void setup()

{

  pinMode(mode,INPUT);                    // MODE-Taster als INPUT

  pinMode(onoff,INPUT);                   // ON/OFF-Taster als INPUT

 

  pinMode(onoff_led,OUTPUT);              // ON/OFF-LED als OUTPUT

  pinMode(mode_led,OUTPUT);               // MODE-LED als OUTPUT

  pinMode(ausgabe_1,OUTPUT);              // Ausgabe 1 als OUTPUT

  pinMode(ausgabe_2,OUTPUT);              // Ausgabe 2 als OUTPUT

 

  digitalWrite(onoff_led,LOW);            // ON/OFF-LED ausschalten

  digitalWrite(mode_led,LOW);             // MODE-LED ausschalten

  digitalWrite(ausgabe_1,LOW);            // Ausgabe 1 auf LOW setzen

  digitalWrite(ausgabe_2,LOW);            // Ausgabe 2 auf LOW setzen

 

  Serial.begin(9600);

 

}

 

 

// MAIN-ROUTINE

void loop()

{

  //HMI

  //Auswahl Mode

 if (run_state == 0)                        // MODE-Auswahl blockiert?

  {

    reading_mode = digitalRead(mode);       // MODE-Taster auslesen

    if(reading_mode != laststate_mode)      // Tasterstatus geändert?

    {

      lastDebounceTime_mode = millis();     // Prozesszeit auslesen

    }

    if((millis()-lastDebounceTime_mode) > debounceDelay)  // debounceDelay-Zeit abgelaufen?

    {

      if(reading_mode != state_mode)        // Taster tatsächlich betätigt?

      {

        state_mode = reading_mode;          // reading-Wert speichern

        if( state_mode == LOW)              // Fallende Flanke?

        {

          slopecount_mode ++;               // Flankenzähler um 1 erhöhen

          switch (slopecount_mode)          // Mode-Auswahl

          {

            case 1:                         // Dauerpuls

            {

              digitalWrite(mode_led,HIGH);  // MODE-LED anschalten

              break; 

            }

            default:                        // Pulspause

            {

              digitalWrite(mode_led,LOW);   // MODE-LED ausschalten

              slopecount_mode = 0;          // Flankenzähler auf 0 zurücksetzen

              break;

            } 

          } 

        }

      }

    }

  }

 

  // ON/OFF

  reading_onoff = digitalRead(onoff);       // ON/OFF-Taster auslesen

  if (reading_onoff != laststate_onoff)     // Tasterstatus geändert?

  {

    lastDebounceTime_onoff = millis();      //Prozesszeit auslesen

  }

  if ((millis() - lastDebounceTime_onoff) > debounceDelay)    // debounceDelay-Zeit abgelaufen?

  {

    if (reading_onoff != state_onoff)       // Taster tatsächlich betätigt?

    {

      state_onoff = reading_onoff;          // reading-Wert speichern

      if (state_onoff == LOW)               // Fallende Flanke?

      {

        slopecount_onoff ++;                //Flankenzähler um 1 erhöhen

        switch (slopecount_onoff)

        {

          case 1:                                    // 1.Flanke

          {

            interrupt_counter_pause = 0;             // Interrupt-Zähler auf 0 setzen

            interrupt_counter_dauer = 0;             // Interrupt-Zähler Dauerimpuls auf 0 setzen

            run_state = 1;                           // MODE-Auswahl blockieren

            digitalWrite(onoff_led,HIGH);            // ON/OFF-LED anschalten

            if( slopecount_mode == 0)                // PulsPause-Betrieb ?

            {   

              CurieTimerOne.initialize(175);             // Timer1 mit 175µs initialisieren

              CurieTimerOne.attachInterrupt(pulspause);  // Interrupt erlauben und als ISR pulspause aufrufen

            }

            else                                         //Dauerpuls-Betrieb?

            {

              CurieTimerOne.initialize(175);             // Timer1 mit 175µs initialisieren

              CurieTimerOne.attachInterrupt(dauerpuls);  // Interrupt erlauben und als ISR dauerpuls aufrufen

            }

            break;          

          }

          default:                                // andere Flanke?

          {

            CurieTimerOne.stop();                 // Timer1 stoppen

            digitalWrite(onoff_led,LOW);          // ON/OFF-LED ausschalten

            run_state = 0;                        // MODE-Auswahl wieder freigeben

            digitalWrite(ausgabe_1,LOW);          // Ausgabe 1 auf LOW setzen

            digitalWrite(ausgabe_2,LOW);          // Ausgabe 2 auf LOW setzen

            slopecount_onoff = 0;                 // Flankenzähler auf 0 zurücksetzen

            break;   

      }    

    } 

  } } }

  laststate_onoff = reading_onoff;            // ON/OFF-Tasterstatus als vorherigen Wert deklarieren

  laststate_mode = reading_mode;              // MODE-Tasterstatus als vorherigen Wert deklarieren

}

 

//Interrupt-Service-Routinen

void pulspause()                             // PulsPause-Betrieb

{

  interrupt_counter_pause ++ ;               // Interrupt-Zähler erhöhen

  if (interrupt_counter_pause < 22857)       // 4s Wartezeit

  {

    digitalWrite(ausgabe_1,LOW);             // Ausgabe 1 auf LOW setzen

    digitalWrite(ausgabe_2,LOW);             // Ausgabe 2 auf LOW setzen

  }

  else                                       // 4s abgelaufen?

  {

    dauerpuls();                             // Dauerpuls aufrufen

    if (interrupt_counter_pause == 45714)    // 8s abgelaufen?

    {

      interrupt_counter_pause = 0;           // Interrupt-Zähler auf null zurücksetzen

    } 

  }

}

 

void dauerpuls()                            // Dauerpuls-Betrieb

{

  {

    interrupt_counter_dauer ++ ;            // Interrupt-Zähler erhöhen

    switch (interrupt_counter_dauer)

    {

      case 66:                              // 11,4 ms abgelaufen?

      {

        digitalWrite(ausgabe_1,HIGH);       // Ausgabe 1 auf HIGH setzen

        digitalWrite(ausgabe_2,LOW);        // Ausgabe 2 auf LOW setzen

        break;

      }

     case 67:

      {

        digitalWrite(ausgabe_1,LOW);        // Ausgabe 1 auf LOW setzen

        digitalWrite(ausgabe_2,HIGH);       // Ausgabe 2 auf HIGH setzen

        interrupt_counter_dauer = 0;        // Inrerrupt-Zähler zurücksetzen

        break;

      }

      default:

      {

        digitalWrite(ausgabe_1,LOW);        // Ausgabe 1 auf LOW setzen

        digitalWrite(ausgabe_2,LOW);        // Ausgabe 2 auf LOW setzen

        break;

      } 

   }

  }  

}