070914

Dependencies:   FreescaleIAP MODSERIAL mbed monitor timer0

Fork of 17_PT1000 by Temp27

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 // Version 1.0   erstellt am 25.04.2015
00002 // 01.05.15 den Eingäng 4 auf 2 verlegt
00003 //          den Eingang 5 auf 1 verlegt
00004 
00005 #include "mbed.h"
00006 #include "main.h"
00007 #include "timer0.h"
00008 #include "monitor.h"
00009 #include "MODSERIAL.h"
00010 
00011 // timer 2 => optischer Alarm Periode = 500 entspricht Blinkfrequnz von 1 Selunde
00012 #define OA_PERIODE 500
00013 // timer 3 => Minimale Zeit für den akustischen Alarm in ms >> soll 10000 entspricht 10 Sekunden
00014 #define AA_NIN 10000
00015 // timer 4 => Verzögerung für des Entriegeln des Tasters. In dieser Zeit wird dann kein neuer
00016 // akustischer Alarm ausgelöst
00017 #define AA_DELAY 10000
00018 
00019 #define NEED_CONSOLE_OUTPUT 1   // Set this if you need debug messages on the console
00020                                 // mit Debug wird die Programmgröße von 32,8k um ca. 300 Byte vergrößert
00021                                 // dies ist nicht bedeutend, aber auch die Ausführungszeit der Ausgabebefehle
00022                                 // benötigt CPU Zeit
00023 #if NEED_CONSOLE_OUTPUT
00024   #define DEBUG(...) { pc.printf(__VA_ARGS__); }
00025 #else
00026   #define DEBUG(...)    // nothing
00027 #endif                  // #if NEED_CONSOLE_OUTPUT 
00028 
00029 //------------------------------------------------------------------------------
00030 // Anlegen von Klassen
00031 
00032 timer0 down_timer;                              // Zeitsteuerung
00033 MODSERIAL pc(USBTX, USBRX);                     // tx, rx
00034 
00035 monitor mon;
00036 
00037 Timer t;                                        // Zeitmessung für Entprellen
00038 
00039 //------------------------------------------------------------------------------
00040 // Zuordnung von Eingängen und Ausgängen
00041 
00042 DigitalOut LED(PTE30);
00043 
00044 DigitalOut OUT1(PTC6);      // nicht belegt
00045 DigitalOut OUT2(PTC5);      // LED Rot
00046 DigitalOut OUT3(PTC4);      // LED Grün
00047 DigitalOut OUT4(PTC3);      // LED Gelb
00048 DigitalOut OUT5(PTC2);      // Summer
00049 DigitalOut OUT6(PTC1);      // Relais
00050 
00051 DigitalIn IN1(PTC7);        // Notaus, schaltet gegen 24V =>            24V oder 1 ist der Ruhezustand
00052 DigitalIn IN2(PTD4);        // Sabotageschalter, schaltet gegen 24V =>  24V oder 1 ist Ruhezustand
00053 DigitalIn IN3(PTD5);        // KABA Türöffner Signal =>                 24V oder 1 ist Ruheezustand
00054 DigitalIn IN4(PTD6);        // nicht belegt                             
00055 DigitalIn IN5(PTD7);        // nicht belegt 
00056 
00057 DigitalInOut rst(PTA4);     //Connect this to the reset pin
00058 
00059 //------------------------------------------------------------------------------
00060 // Globale Variablen
00061 
00062 bool in;
00063 
00064 struct di_struct in1;      // Eingang 1
00065 struct di_struct in2;      // Eingang 2
00066 struct di_struct in3;      // Eingang 3
00067 
00068 //------------------------------------------------------------------------------
00069 //
00070 
00071 int main()
00072 {
00073     rst.input();     // SW watchdog ist derzeit nicht erforderlich
00074     
00075     //------------------------------------------------------------------------------
00076     // RS232 Schnittstellt welche auf den CMSIS-DAP (USB Port) weitergeleitet wird
00077     //
00078     pc.baud(115200);
00079     pc.printf("\n N1380 was compiled on %s  %s \n", __DATE__,__TIME__);
00080 
00081 
00082     //--------------------------------------------------------------------
00083     //  Anfangswerte setzen
00084 
00085     in1.old = 1;        // 1 im Ruhezustand
00086     in1.aktiv = 0;      
00087     in1.filter = 0;
00088     in1.optischer_alarm = 0;
00089     in1.summer = 0;
00090     
00091     in2.old = 1;        // 1 im Ruhezustand
00092     in2.aktiv = 0;      
00093     in2.filter = 0;
00094     in2.optischer_alarm = 0;
00095     in2.summer = 0;
00096 
00097     in3.old = 1;        // 1 im Ruhezustand
00098     in3.aktiv = 0;      
00099     in3.filter = 0;
00100     
00101     //--------------------------------------------------------------------
00102     // Softwaretimer für die Zeitsteuerung anlegen
00103 
00104     down_timer.SetCountdownTimer(0,1,500);      // 1 ms Timer * 500 => ergibt 500 ms
00105     down_timer.SetCountdownTimer(1,1,10);       // 1 ms Timer * 10 => ergibt 10 ms
00106     down_timer.SetCountdownTimer(2,1,0);        // 1 ms Timer => reserviert für optischen Alarm
00107     down_timer.SetCountdownTimer(3,1,0);        // 1 ms Timer => reserviert für akustischen Alarm
00108     down_timer.SetCountdownTimer(4,1,0);        // 1 ms Timer => reserviert für nach Entriegelung
00109     
00110     //--------------------------------------------------------------------
00111     // Schleife fuer die Datenerfassung
00112 
00113     while(1) 
00114     {
00115         //-------------------------------------------
00116         // Prüfen ob Zeichen eingegeben wurden
00117         // wird in der aktiven Version ausgeblendet, ist nur zum Testen
00118         
00119         mon.get_line();
00120 
00121         //-------------------------------------------
00122         // timer 0 steuert die LED auf dem Board mit der Takrate 0,5 Sekunden
00123 
00124         if (down_timer.GetTimerStatus(0) == 0) {
00125             down_timer.SetCountdownTimer(0,1,500);
00126             LED = !LED;
00127             
00128         }
00129 
00130         //-------------------------------------------
00131         // Eingänge abfragen und Aktionen ableiten
00132         // down
00133 
00134         if (down_timer.GetTimerStatus(1) == 0) 
00135         {
00136             //down_timer 1 mit 10 ms gesetzt
00137             down_timer.SetCountdownTimer(1,1,10);
00138 
00139             //------------------------------------------------
00140             // IN1  Nottaster auswerten, null im Ruhezustand
00141             // wird mit der negativen Flanke aktiviert
00142             // das Signal muss mindestens 10ms anliegen, damit es akzeptiert wird
00143         
00144             in = IN1;
00145             
00146             
00147             if(!in && in1.old)       // Öffner im Ruhezustand 24 V >> durch Drücken wird eine neg. Flanke erzeugt
00148             {
00149                 in1.old = 0;
00150                 in1.aktiv = 1;       // Taster ist betätigt
00151                 in1.optischer_alarm = 1;
00152                 in1.summer = 1;
00153                 down_timer.SetCountdownTimer(3,1,AA_NIN);  // Zeit für Softtimer auf 10 Sekunden setzen
00154                 DEBUG("\n negative Flanke IN1 \n");
00155             }
00156 
00157             if (in && !in1.old) {     // Öffner im Ruhenzustand 24 V >> durch Rückstellen enteht eine pos. Flanke
00158                 in1.old = 1;
00159                 in1.aktiv = 0;        // Taster ist zurückgesetzt
00160                 
00161                 in1.summer = 0;
00162                 down_timer.SetCountdownTimer(4,1,AA_DELAY);  // Zeit für Entriegelung, Haube innerhalb von 10 Sekunden schließen
00163                 DEBUG("\n positve Flanke IN1 \n");
00164             }
00165             
00166             // optischer Alarm ausschalten, wenn IN3 wieder 0 bekommt ==> Quittierung
00167 
00168             if (in1.optischer_alarm && in3.aktiv) 
00169             {
00170                 in1.optischer_alarm = 0;
00171                 DEBUG("\n IN1 mit IN3 quittiert \n");
00172             }
00173 
00174 
00175             //------------------------------------------------
00176             // IN2 Sabotageschalter, 24V ist Ruhezustand
00177             // wird mit der negativen Flanke aktiviert
00178             // das Signal muss mindestens 10ms anliegen, damit es akzeptiert wird
00179             
00180             in = IN2;
00181             
00182             
00183             if(!in && in2.old)          // Eingang neg. Flanke
00184             {    
00185                 in2.old = 0;            // 0 im aktivierten Modus
00186                 in2.aktiv = 1;          // Eingang ist aktiv
00187                 in2.optischer_alarm = 1;
00188                 in2.summer = 1;
00189                 down_timer.SetCountdownTimer(3,1,AA_NIN);  // Zeit für Softtimer auf 10 Sekunden setzen
00190                 DEBUG("\n negative Flanke IN2 \n");
00191             }
00192 
00193             if (in && !in2.old)         // Eingang mit pos. Flanke
00194             {    
00195                 in2.old = 1;            // 1 im Ruhezustand   
00196                 in2.aktiv = 0;          // Eingang ist inaktiv
00197                 in2.summer = 0;
00198                 DEBUG("\n positve Flanke IN2 \n");
00199             }
00200 
00201             if (in2.aktiv && !in2.summer && !in1.summer && (down_timer.GetTimerStatus(4) == 0))
00202             {
00203                 in2.summer = 1; 
00204                 down_timer.SetCountdownTimer(3,1,AA_NIN);  // Zeit für Softtimer auf 10 Sekunden setzen ( zum Testen auf 2 Sek. gesetzt )  
00205                 DEBUG("\n IN2 Summer aktiviert \n");
00206             }
00207             
00208             // nur zurückschalten, wenn IN3 wieder 1 ==> Quittierung
00209 
00210             if (in2.optischer_alarm && in3.aktiv) {
00211                 in2.optischer_alarm = 0;
00212                 DEBUG("\n IN2 mit IN3 quittiert \n");
00213             }
00214 
00215             //------------------------------------------------
00216             // IN3 Signalstation, Öffner => 1 ist Ruheezustand
00217 
00218             in = IN3;
00219 
00220             if(in && !in3.old)        // Eingang pos. Flanke
00221             {   
00222                 in3.old = 1;
00223                 in3.aktiv = 0;        // Eingang ist Ruhezustand
00224                 
00225             }
00226 
00227             if (!in && in3.old)       // Eingang mit neg Flanke
00228             {
00229                 in3.old = 0;
00230                 in3.aktiv = 1;        // Eingang ist aktiv    
00231             }
00232 
00233 
00234             //---------------------------------------------------------------------------------------------------------------------------------------
00235             // Die Eingänge sind nun gelesen, jetzt kommt das Steuern der Ausgaänge
00236             //
00237             
00238             //------------------------------------------------
00239             // Rot/Grüne LED (verriegelt/entriegelt):
00240             // rot      Tor ist verriegelt
00241             // grün     Tor ist entriegelt
00242 
00243             //  1. IN3 auf 1 = OUT2 ein und OUT3 aus   Rot an / Grün aus   (verriegelt)
00244             
00245             if(!in3.aktiv) {   
00246                 OUT2 = LED_EIN;
00247                 OUT3 = LED_AUS;
00248             } 
00249             
00250             //  2. IN3 auf 0 = OUT2 aus und OUT3 ein   Rot aus / Grün an   (entriegelt)
00251             //  3. IN5 auf 1 = OUT2 aus und OUT3 ein   Rot aus / Grün an   (entriegelt)
00252             
00253             if (in3.aktiv || in1.aktiv) {          
00254                 OUT2 = LED_AUS;
00255                 OUT3 = LED_EIN;
00256             }
00257             
00258             //------------------------------------------------
00259             //  Gelbe LED (optischer Alarm):
00260 
00261             if (in1.optischer_alarm || in2.optischer_alarm)  // sobald der optische Alarm aus Eingang 1 oder Eingang 2 akiviert wurde, diesen in Blinkmode schalten
00262             {    
00263                 if (down_timer.GetTimerStatus(2) == 0) 
00264                 {
00265                     down_timer.SetCountdownTimer(2,1,OA_PERIODE);  // Zeit für Softtimer auf eine Sekunde setzen
00266                     OUT4 = !OUT4;
00267                 }
00268             } 
00269             else 
00270             {
00271                 OUT4 = LED_AUS;
00272             }
00273 
00274             //------------------------------------------------
00275             // Summer (OUT5 +24V)
00276 
00277             if (in1.summer || in2.summer || (down_timer.GetTimerStatus(3) != 0))  // sobald der Eingang 1 oder Eingang 2 akiviert ist oder der Timer
00278             {                                                                     // noch aktiv ist, den Summer aktivieren
00279                 OUT5 = 1;
00280             } 
00281             else 
00282             {
00283                 OUT5 = 0;
00284             }
00285             
00286             //------------------------------------------------
00287             // Relais K1:
00288             // Der Kontakt des Nottasters wird weitergegeben
00289 
00290             if (in1.aktiv) {  // 1.  IN1 auf 0 = OUT6 (K1) ein
00291                 OUT6 = 0;
00292             } else {          // 2.  IN1 auf 1 = OUT6 aus
00293                 OUT6 = 1;
00294             }
00295 
00296         } // end if (downtimer ...
00297         
00298     } // end while
00299 
00300 } // end main
00301