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