050216
Dependencies: MODSERIAL mon-050216 mbed timer0-050216
Fork of mbed_blinky by
Diff: main.cpp
- Revision:
- 11:be852b7b7692
- Parent:
- 10:cfd15bd4762a
--- a/main.cpp Fri Feb 05 16:52:41 2016 +0000
+++ b/main.cpp Thu Mar 10 20:35:49 2016 +0000
@@ -1,128 +1,181 @@
-// RS485 Link für modeserial
-// https://developer.mbed.org/cookbook/MODSERIAL
+// Hardware: IOX.mini
+// Projekt: Galliker LC4 tore
+// CPU: LPC1768
+// Modul: main.cpp
+// Anwendung: Torsteuerung
#include "mbed.h"
#include "main.h"
#include "timer0.h"
#include "mon.h"
-#include "rs_485.h"
+#include "MODSERIAL.h"
+
+struct di_struct
+{
+ bool aktiv; // Flag zur Steuerung
+ bool old; // alter Wert vom Eingang für Flankenerkennung
+ bool flag; // Flag für Zeitsteuerung
+};
+
+#define AUS 1
+#define EIN 0
-DigitalOut led1(LED1,1);
-DigitalOut led2(LED2,1);
-DigitalOut led3(LED3,1);
-DigitalOut led4(LED4,1);
-DigitalOut led5(LED5,1);
-DigitalOut led6(LED6,1);
-DigitalOut led7(LED7,1);
+DigitalOut led_in1(LED2,AUS);
+DigitalOut led_in2(LED3,AUS);
+DigitalOut led_in3(LED4,AUS);
+DigitalOut led_in4(LED5,AUS);
-DigitalOut out1(OUT1,0); // max 500mA schaltet gegen GND
+DigitalOut led_out1(LED7,AUS); // die LED's out2 bis out4 sind direkt den Ausgängen zugeordnet
+
+DigitalOut led1(LED1,AUS);
+DigitalOut led6(LED6,AUS);
+
+DigitalOut out1(OUT1,0); // max 500mA schaltet gegen GND
DigitalOut out2(OUT2,0);
DigitalOut out3(OUT3,0);
DigitalOut out4(OUT4,0);
-DigitalIn in1(IN1); // 0 oder 24V
-DigitalIn in2(IN2);
-DigitalIn in3(IN3);
-DigitalIn in4(IN4);
+DigitalIn IN_1(IN1); // 0 oder 24V
+DigitalIn IN_2(IN2);
+DigitalIn IN_3(IN3);
+DigitalIn IN_4(IN4);
-MODSERIAL pc(TXD, RXD); // tx, rx
-timer0 down_timer; // Timer für Zeitsteuerung
-rs_485 RS485_BUS; // RS485 BUS
+MODSERIAL pc(TXD, RXD); // tx, rx
+timer0 down_timer; // Timer für Zeitsteuerung
monitor mon;
-void led_aus(void)
-{
- led1 = 1;
- led2 = 1;
- led3 = 1;
- led4 = 1;
- led5 = 1;
- led6 = 1;
- led7 = 1;
- out2 = 0;
- out3 = 0;
- out4 = 0;
-}
+//=====================================================================================
+// Globale Variablen
+bool in, flag_ablauftimer;
+struct di_struct in1; // Eingang 1
+struct di_struct in2; // Eingang 2
-uint8_t i = 1;
+//------------------------------------------------------------------------------------
int main() {
pc.baud(115200);
- pc.printf("\nHello IOX.mini\n");
-
- down_timer.SetCountdownTimer(1,1,500); // Timer für LED
+
+ pc.printf("\nGalliker LC4 tore V0.0_a");
+ pc.printf("\n build at "__DATE__" "__TIME__" ");
+
+ in1.old = 1; // 1 im Ruhezustand
+ in2.old = 1; // 1 im Ruhezustand
+
+ in1.flag = false;
+ in2.flag = false;
+
+ flag_ablauftimer = false;
+
+ down_timer.SetCountdownTimer(0,1,500); // Timer für LED
+ down_timer.SetCountdownTimer(1,1,500); // Timer für Eingänge lesen
while(1) {
mon.monPC(); // Eingaben abfragen und auswerten
- //RS485_BUS.execute(); // RS485 Bus
+
+ // RS485_BUS.execute(); // RS485 Bus
//--------------------------------------------------------------------------
// LED für Statusanzeige
- if (down_timer.GetTimerStatus(1) == 0)
+ if (down_timer.GetTimerStatus(0) == 0)
+ {
+ down_timer.SetCountdownTimer(0,1,500); // alle 500ms
+ led1 = !led1;
+ }
+
+ //-------------------------------------------------------------------------------
+ // Eingänge abfragen und Aktionen ableiten
+
+ if (down_timer.GetTimerStatus(1) == 0)
{
- // RS485.printf("\n %02x",i);
+ down_timer.SetCountdownTimer(1,1,10); // ms Timer * 10 => ergibt 10 ms
+
+ //==============================================================================================
+ // Impuls auf IN1 = OUT1 für 1s auf EIN
+ //
+ // Wenn Impuls auf IN0, dann wird ein Ablauftimer aktiviert (1,5h)
+ // - nach Ablauf dieser Zeit = OUT1 für 1s auf EIN
+ // - sofern nicht vorher ein Impuls von IN1 registriert wurde
+ //
+ // Ablauftimer ist Timer 4
+
+ in = IN_1;
+ if (in != in1.old) // negative Flanke an IN1
+ {
+ in1.old = 0;
+ led_in1 = EIN;
+ out1 = 1;
+ led_out1 = EIN;
+ down_timer.SetCountdownTimer(2,1,1000); // 1 Sekunde
+ in1.flag = true;
+ down_timer.SetCountdownTimer(4,3,90); // 1,5 Stunden
+ flag_ablauftimer = true;
+ out3 = 1; // LED Taster (Ablaufzeit aktiviert)
+ pc.printf("\n negative Flanke IN1 \n");
+
+ }
- down_timer.SetCountdownTimer(1,1,50); // alle 500ms
- // pc.printf("\nLED #%d",i);
- switch (i)
+ if (in && !in1.old) // positive Flanke an IN1
+ {
+ in1.old = 1;
+ led_in1 = AUS;
+ pc.printf("\n positve Flanke IN1 \n");
+ }
+
+ if (in1.flag && (down_timer.GetTimerStatus(2) == 0))
{
-
- case 1:
- i = 2;
- led_aus();
- led1 = 0;
- break;
- case 2:
- i = 3;
- led_aus();
- led2 = 0;
- break;
- case 3:
- i = 4;
- led_aus();
- led3 = 0;
- break;
- case 4:
- i = 5;
- led_aus();
- led4 = 0;
- break;
- case 5:
- i = 6;
- led_aus();
- led5 = 0;
- break;
- case 6:
- i = 7;
- led_aus();
- led6 = 0;
- break;
- case 7:
- i = 8;
- led_aus();
- led7 = 0;
- break;
- case 8: // Die LED's sind mit den Ausgängen verbunden und werden mit 1 geschaltet
- i = 9;
- led_aus();
- out2 = 1;
- break;
- case 9:
- i = 10;
- led_aus();
- out3 = 1;
- break;
- case 10:
- i = 1;
- led_aus();
- out4 = 1;
- break;
- } // end switch
- } // end if(down_timer
+ in1.flag = false;
+ out1 = 0;
+ led_out1 = AUS;
+ }
+
+ //==============================================================================================
+ // Impuls auf IN2 = OUT2 für 1s auf EIN
+ //
+
+ in = IN_2;
+ if (in != in2.old) // negative Flanke an IN2
+ {
+ in2.old = 0;
+ led_in2 = EIN;
+ out2 = 1;
+ down_timer.SetCountdownTimer(3,1,1000); // 1 Sekunde
+ in2.flag = true;
+ flag_ablauftimer = false; // Ablaufzeit wird unterbrochen
+ pc.printf("\n negative Flanke IN2 \n");
+ }
+
+ if (in && !in2.old) // positive Flanke an IN2
+ {
+ in2.old = 1;
+ led_in2 = AUS;
+ pc.printf("\n positve Flanke IN2 \n");
+ }
+
+ if (in2.flag && (down_timer.GetTimerStatus(3) == 0))
+ {
+ in2.flag = false;
+ out2 = 0;
+ }
+
+ //==============================================================================================
+ // prüfen ob Ablaufzeit vorbei, falls ja, die Ausgang out2 für eine Sekunde auf 1 setzen
+ //
+
+ if (flag_ablauftimer && (down_timer.GetTimerStatus(4) == 0))
+ {
+ flag_ablauftimer = false;
+ out2 = 1;
+ out3 = 0; // LED Taster (Zeit abgelaufen)
+ down_timer.SetCountdownTimer(3,1,1000); // 1 Sekunde
+ in2.flag = true;
+ }
+
+ }
+
} // end while(1)
}
