070914

Dependencies:   FreescaleIAP MODSERIAL mbed monitor timer0

Fork of 17_PT1000 by Temp27

Committer:
rs27
Date:
Fri May 08 07:48:19 2015 +0000
Revision:
19:8e4e6fe34857
Parent:
18:939d3df56218
080515

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rs27 19:8e4e6fe34857 1 // Version 1.0 erstellt am 25.04.2015
rs27 19:8e4e6fe34857 2 // 01.05.15 den Eingäng 4 auf 2 verlegt
rs27 19:8e4e6fe34857 3 // den Eingang 5 auf 1 verlegt
rs27 0:e248310dfcdb 4
rs27 0:e248310dfcdb 5 #include "mbed.h"
rs27 19:8e4e6fe34857 6 #include "main.h"
rs27 0:e248310dfcdb 7 #include "timer0.h"
rs27 0:e248310dfcdb 8 #include "monitor.h"
Sven3010 18:939d3df56218 9 #include "MODSERIAL.h"
rs27 0:e248310dfcdb 10
rs27 19:8e4e6fe34857 11 // timer 2 => optischer Alarm Periode = 500 entspricht Blinkfrequnz von 1 Selunde
rs27 19:8e4e6fe34857 12 #define OA_PERIODE 500
rs27 19:8e4e6fe34857 13 // timer 3 => Minimale Zeit für den akustischen Alarm in ms >> soll 10000 entspricht 10 Sekunden
rs27 19:8e4e6fe34857 14 #define AA_NIN 10000
rs27 19:8e4e6fe34857 15 // timer 4 => Verzögerung für des Entriegeln des Tasters. In dieser Zeit wird dann kein neuer
rs27 19:8e4e6fe34857 16 // akustischer Alarm ausgelöst
rs27 19:8e4e6fe34857 17 #define AA_DELAY 10000
rs27 0:e248310dfcdb 18
rs27 19:8e4e6fe34857 19 #define NEED_CONSOLE_OUTPUT 1 // Set this if you need debug messages on the console
rs27 19:8e4e6fe34857 20 // mit Debug wird die Programmgröße von 32,8k um ca. 300 Byte vergrößert
rs27 19:8e4e6fe34857 21 // dies ist nicht bedeutend, aber auch die Ausführungszeit der Ausgabebefehle
rs27 19:8e4e6fe34857 22 // benötigt CPU Zeit
rs27 19:8e4e6fe34857 23 #if NEED_CONSOLE_OUTPUT
rs27 19:8e4e6fe34857 24 #define DEBUG(...) { pc.printf(__VA_ARGS__); }
rs27 19:8e4e6fe34857 25 #else
rs27 19:8e4e6fe34857 26 #define DEBUG(...) // nothing
rs27 19:8e4e6fe34857 27 #endif // #if NEED_CONSOLE_OUTPUT
Sven3010 18:939d3df56218 28
rs27 6:f53dd76c8806 29 //------------------------------------------------------------------------------
rs27 6:f53dd76c8806 30 // Anlegen von Klassen
Sven3010 4:46365f765d30 31
rs27 2:f48d2eb0cc55 32 timer0 down_timer; // Zeitsteuerung
rs27 19:8e4e6fe34857 33 MODSERIAL pc(USBTX, USBRX); // tx, rx
rs27 6:f53dd76c8806 34
rs27 19:8e4e6fe34857 35 monitor mon;
rs27 19:8e4e6fe34857 36
rs27 10:84387eed15b5 37 Timer t; // Zeitmessung für Entprellen
rs27 0:e248310dfcdb 38
rs27 6:f53dd76c8806 39 //------------------------------------------------------------------------------
rs27 6:f53dd76c8806 40 // Zuordnung von Eingängen und Ausgängen
rs27 6:f53dd76c8806 41
rs27 19:8e4e6fe34857 42 DigitalOut LED(PTE30);
rs27 0:e248310dfcdb 43
rs27 19:8e4e6fe34857 44 DigitalOut OUT1(PTC6); // nicht belegt
rs27 19:8e4e6fe34857 45 DigitalOut OUT2(PTC5); // LED Rot
rs27 19:8e4e6fe34857 46 DigitalOut OUT3(PTC4); // LED Grün
rs27 19:8e4e6fe34857 47 DigitalOut OUT4(PTC3); // LED Gelb
rs27 19:8e4e6fe34857 48 DigitalOut OUT5(PTC2); // Summer
rs27 19:8e4e6fe34857 49 DigitalOut OUT6(PTC1); // Relais
rs27 0:e248310dfcdb 50
rs27 19:8e4e6fe34857 51 DigitalIn IN1(PTC7); // Notaus, schaltet gegen 24V => 24V oder 1 ist der Ruhezustand
rs27 19:8e4e6fe34857 52 DigitalIn IN2(PTD4); // Sabotageschalter, schaltet gegen 24V => 24V oder 1 ist Ruhezustand
rs27 19:8e4e6fe34857 53 DigitalIn IN3(PTD5); // KABA Türöffner Signal => 24V oder 1 ist Ruheezustand
rs27 19:8e4e6fe34857 54 DigitalIn IN4(PTD6); // nicht belegt
rs27 19:8e4e6fe34857 55 DigitalIn IN5(PTD7); // nicht belegt
rs27 0:e248310dfcdb 56
rs27 19:8e4e6fe34857 57 DigitalInOut rst(PTA4); //Connect this to the reset pin
rs27 6:f53dd76c8806 58
rs27 6:f53dd76c8806 59 //------------------------------------------------------------------------------
rs27 6:f53dd76c8806 60 // Globale Variablen
rs27 6:f53dd76c8806 61
rs27 19:8e4e6fe34857 62 bool in;
rs27 2:f48d2eb0cc55 63
rs27 19:8e4e6fe34857 64 struct di_struct in1; // Eingang 1
rs27 19:8e4e6fe34857 65 struct di_struct in2; // Eingang 2
rs27 19:8e4e6fe34857 66 struct di_struct in3; // Eingang 3
rs27 0:e248310dfcdb 67
rs27 2:f48d2eb0cc55 68 //------------------------------------------------------------------------------
rs27 2:f48d2eb0cc55 69 //
rs27 0:e248310dfcdb 70
rs27 19:8e4e6fe34857 71 int main()
rs27 0:e248310dfcdb 72 {
rs27 19:8e4e6fe34857 73 rst.input(); // SW watchdog ist derzeit nicht erforderlich
Sven3010 3:72a65324d50d 74
rs27 2:f48d2eb0cc55 75 //------------------------------------------------------------------------------
rs27 2:f48d2eb0cc55 76 // RS232 Schnittstellt welche auf den CMSIS-DAP (USB Port) weitergeleitet wird
rs27 2:f48d2eb0cc55 77 //
rs27 19:8e4e6fe34857 78 pc.baud(115200);
rs27 19:8e4e6fe34857 79 pc.printf("\n N1380 was compiled on %s %s \n", __DATE__,__TIME__);
rs27 0:e248310dfcdb 80
rs27 19:8e4e6fe34857 81
rs27 19:8e4e6fe34857 82 //--------------------------------------------------------------------
rs27 19:8e4e6fe34857 83 // Anfangswerte setzen
rs27 6:f53dd76c8806 84
rs27 19:8e4e6fe34857 85 in1.old = 1; // 1 im Ruhezustand
rs27 19:8e4e6fe34857 86 in1.aktiv = 0;
rs27 19:8e4e6fe34857 87 in1.filter = 0;
rs27 19:8e4e6fe34857 88 in1.optischer_alarm = 0;
rs27 19:8e4e6fe34857 89 in1.summer = 0;
rs27 0:e248310dfcdb 90
rs27 19:8e4e6fe34857 91 in2.old = 1; // 1 im Ruhezustand
rs27 19:8e4e6fe34857 92 in2.aktiv = 0;
rs27 19:8e4e6fe34857 93 in2.filter = 0;
rs27 19:8e4e6fe34857 94 in2.optischer_alarm = 0;
rs27 19:8e4e6fe34857 95 in2.summer = 0;
rs27 19:8e4e6fe34857 96
rs27 19:8e4e6fe34857 97 in3.old = 1; // 1 im Ruhezustand
rs27 19:8e4e6fe34857 98 in3.aktiv = 0;
rs27 19:8e4e6fe34857 99 in3.filter = 0;
rs27 2:f48d2eb0cc55 100
rs27 2:f48d2eb0cc55 101 //--------------------------------------------------------------------
rs27 19:8e4e6fe34857 102 // Softwaretimer für die Zeitsteuerung anlegen
rs27 6:f53dd76c8806 103
rs27 19:8e4e6fe34857 104 down_timer.SetCountdownTimer(0,1,500); // 1 ms Timer * 500 => ergibt 500 ms
rs27 19:8e4e6fe34857 105 down_timer.SetCountdownTimer(1,1,10); // 1 ms Timer * 10 => ergibt 10 ms
rs27 19:8e4e6fe34857 106 down_timer.SetCountdownTimer(2,1,0); // 1 ms Timer => reserviert für optischen Alarm
rs27 19:8e4e6fe34857 107 down_timer.SetCountdownTimer(3,1,0); // 1 ms Timer => reserviert für akustischen Alarm
rs27 19:8e4e6fe34857 108 down_timer.SetCountdownTimer(4,1,0); // 1 ms Timer => reserviert für nach Entriegelung
rs27 2:f48d2eb0cc55 109
rs27 0:e248310dfcdb 110 //--------------------------------------------------------------------
rs27 0:e248310dfcdb 111 // Schleife fuer die Datenerfassung
rs27 19:8e4e6fe34857 112
rs27 0:e248310dfcdb 113 while(1)
rs27 0:e248310dfcdb 114 {
rs27 19:8e4e6fe34857 115 //-------------------------------------------
rs27 19:8e4e6fe34857 116 // Prüfen ob Zeichen eingegeben wurden
rs27 19:8e4e6fe34857 117 // wird in der aktiven Version ausgeblendet, ist nur zum Testen
rs27 19:8e4e6fe34857 118
rs27 19:8e4e6fe34857 119 mon.get_line();
rs27 19:8e4e6fe34857 120
rs27 19:8e4e6fe34857 121 //-------------------------------------------
rs27 19:8e4e6fe34857 122 // timer 0 steuert die LED auf dem Board mit der Takrate 0,5 Sekunden
rs27 19:8e4e6fe34857 123
rs27 19:8e4e6fe34857 124 if (down_timer.GetTimerStatus(0) == 0) {
rs27 19:8e4e6fe34857 125 down_timer.SetCountdownTimer(0,1,500);
rs27 19:8e4e6fe34857 126 LED = !LED;
rs27 19:8e4e6fe34857 127
rs27 19:8e4e6fe34857 128 }
rs27 19:8e4e6fe34857 129
rs27 19:8e4e6fe34857 130 //-------------------------------------------
rs27 19:8e4e6fe34857 131 // Eingänge abfragen und Aktionen ableiten
rs27 19:8e4e6fe34857 132 // down
rs27 19:8e4e6fe34857 133
rs27 19:8e4e6fe34857 134 if (down_timer.GetTimerStatus(1) == 0)
rs27 19:8e4e6fe34857 135 {
rs27 19:8e4e6fe34857 136 //down_timer 1 mit 10 ms gesetzt
rs27 19:8e4e6fe34857 137 down_timer.SetCountdownTimer(1,1,10);
Sven3010 18:939d3df56218 138
rs27 19:8e4e6fe34857 139 //------------------------------------------------
rs27 19:8e4e6fe34857 140 // IN1 Nottaster auswerten, null im Ruhezustand
rs27 19:8e4e6fe34857 141 // wird mit der negativen Flanke aktiviert
rs27 19:8e4e6fe34857 142 // das Signal muss mindestens 10ms anliegen, damit es akzeptiert wird
rs27 6:f53dd76c8806 143
rs27 19:8e4e6fe34857 144 in = IN1;
rs27 6:f53dd76c8806 145
rs27 6:f53dd76c8806 146
rs27 19:8e4e6fe34857 147 if(!in && in1.old) // Öffner im Ruhezustand 24 V >> durch Drücken wird eine neg. Flanke erzeugt
rs27 16:3a4350104b68 148 {
rs27 19:8e4e6fe34857 149 in1.old = 0;
rs27 19:8e4e6fe34857 150 in1.aktiv = 1; // Taster ist betätigt
rs27 19:8e4e6fe34857 151 in1.optischer_alarm = 1;
rs27 19:8e4e6fe34857 152 in1.summer = 1;
rs27 19:8e4e6fe34857 153 down_timer.SetCountdownTimer(3,1,AA_NIN); // Zeit für Softtimer auf 10 Sekunden setzen
rs27 19:8e4e6fe34857 154 DEBUG("\n negative Flanke IN1 \n");
rs27 19:8e4e6fe34857 155 }
rs27 19:8e4e6fe34857 156
rs27 19:8e4e6fe34857 157 if (in && !in1.old) { // Öffner im Ruhenzustand 24 V >> durch Rückstellen enteht eine pos. Flanke
rs27 19:8e4e6fe34857 158 in1.old = 1;
rs27 19:8e4e6fe34857 159 in1.aktiv = 0; // Taster ist zurückgesetzt
Sven3010 4:46365f765d30 160
rs27 19:8e4e6fe34857 161 in1.summer = 0;
rs27 19:8e4e6fe34857 162 down_timer.SetCountdownTimer(4,1,AA_DELAY); // Zeit für Entriegelung, Haube innerhalb von 10 Sekunden schließen
rs27 19:8e4e6fe34857 163 DEBUG("\n positve Flanke IN1 \n");
rs27 6:f53dd76c8806 164 }
rs27 6:f53dd76c8806 165
rs27 19:8e4e6fe34857 166 // optischer Alarm ausschalten, wenn IN3 wieder 0 bekommt ==> Quittierung
rs27 19:8e4e6fe34857 167
rs27 19:8e4e6fe34857 168 if (in1.optischer_alarm && in3.aktiv)
rs27 16:3a4350104b68 169 {
rs27 19:8e4e6fe34857 170 in1.optischer_alarm = 0;
rs27 19:8e4e6fe34857 171 DEBUG("\n IN1 mit IN3 quittiert \n");
rs27 12:d5a745de5380 172 }
rs27 12:d5a745de5380 173
rs27 19:8e4e6fe34857 174
rs27 19:8e4e6fe34857 175 //------------------------------------------------
rs27 19:8e4e6fe34857 176 // IN2 Sabotageschalter, 24V ist Ruhezustand
rs27 19:8e4e6fe34857 177 // wird mit der negativen Flanke aktiviert
rs27 19:8e4e6fe34857 178 // das Signal muss mindestens 10ms anliegen, damit es akzeptiert wird
Sven3010 18:939d3df56218 179
rs27 19:8e4e6fe34857 180 in = IN2;
Sven3010 18:939d3df56218 181
Sven3010 18:939d3df56218 182
rs27 19:8e4e6fe34857 183 if(!in && in2.old) // Eingang neg. Flanke
rs27 19:8e4e6fe34857 184 {
rs27 19:8e4e6fe34857 185 in2.old = 0; // 0 im aktivierten Modus
rs27 19:8e4e6fe34857 186 in2.aktiv = 1; // Eingang ist aktiv
rs27 19:8e4e6fe34857 187 in2.optischer_alarm = 1;
rs27 19:8e4e6fe34857 188 in2.summer = 1;
rs27 19:8e4e6fe34857 189 down_timer.SetCountdownTimer(3,1,AA_NIN); // Zeit für Softtimer auf 10 Sekunden setzen
rs27 19:8e4e6fe34857 190 DEBUG("\n negative Flanke IN2 \n");
Sven3010 18:939d3df56218 191 }
rs27 19:8e4e6fe34857 192
rs27 19:8e4e6fe34857 193 if (in && !in2.old) // Eingang mit pos. Flanke
rs27 19:8e4e6fe34857 194 {
rs27 19:8e4e6fe34857 195 in2.old = 1; // 1 im Ruhezustand
rs27 19:8e4e6fe34857 196 in2.aktiv = 0; // Eingang ist inaktiv
rs27 19:8e4e6fe34857 197 in2.summer = 0;
rs27 19:8e4e6fe34857 198 DEBUG("\n positve Flanke IN2 \n");
Sven3010 18:939d3df56218 199 }
rs27 19:8e4e6fe34857 200
rs27 19:8e4e6fe34857 201 if (in2.aktiv && !in2.summer && !in1.summer && (down_timer.GetTimerStatus(4) == 0))
Sven3010 18:939d3df56218 202 {
rs27 19:8e4e6fe34857 203 in2.summer = 1;
rs27 19:8e4e6fe34857 204 down_timer.SetCountdownTimer(3,1,AA_NIN); // Zeit für Softtimer auf 10 Sekunden setzen ( zum Testen auf 2 Sek. gesetzt )
rs27 19:8e4e6fe34857 205 DEBUG("\n IN2 Summer aktiviert \n");
Sven3010 18:939d3df56218 206 }
Sven3010 18:939d3df56218 207
rs27 19:8e4e6fe34857 208 // nur zurückschalten, wenn IN3 wieder 1 ==> Quittierung
rs27 19:8e4e6fe34857 209
rs27 19:8e4e6fe34857 210 if (in2.optischer_alarm && in3.aktiv) {
rs27 19:8e4e6fe34857 211 in2.optischer_alarm = 0;
rs27 19:8e4e6fe34857 212 DEBUG("\n IN2 mit IN3 quittiert \n");
rs27 19:8e4e6fe34857 213 }
Sven3010 18:939d3df56218 214
rs27 19:8e4e6fe34857 215 //------------------------------------------------
rs27 19:8e4e6fe34857 216 // IN3 Signalstation, Öffner => 1 ist Ruheezustand
rs27 19:8e4e6fe34857 217
rs27 19:8e4e6fe34857 218 in = IN3;
rs27 19:8e4e6fe34857 219
rs27 19:8e4e6fe34857 220 if(in && !in3.old) // Eingang pos. Flanke
rs27 19:8e4e6fe34857 221 {
rs27 19:8e4e6fe34857 222 in3.old = 1;
rs27 19:8e4e6fe34857 223 in3.aktiv = 0; // Eingang ist Ruhezustand
Sven3010 18:939d3df56218 224
Sven3010 18:939d3df56218 225 }
rs27 19:8e4e6fe34857 226
rs27 19:8e4e6fe34857 227 if (!in && in3.old) // Eingang mit neg Flanke
rs27 19:8e4e6fe34857 228 {
rs27 19:8e4e6fe34857 229 in3.old = 0;
rs27 19:8e4e6fe34857 230 in3.aktiv = 1; // Eingang ist aktiv
rs27 19:8e4e6fe34857 231 }
rs27 19:8e4e6fe34857 232
rs27 19:8e4e6fe34857 233
rs27 19:8e4e6fe34857 234 //---------------------------------------------------------------------------------------------------------------------------------------
rs27 19:8e4e6fe34857 235 // Die Eingänge sind nun gelesen, jetzt kommt das Steuern der Ausgaänge
rs27 19:8e4e6fe34857 236 //
Sven3010 18:939d3df56218 237
rs27 19:8e4e6fe34857 238 //------------------------------------------------
rs27 19:8e4e6fe34857 239 // Rot/Grüne LED (verriegelt/entriegelt):
rs27 19:8e4e6fe34857 240 // rot Tor ist verriegelt
rs27 19:8e4e6fe34857 241 // grün Tor ist entriegelt
rs27 19:8e4e6fe34857 242
rs27 19:8e4e6fe34857 243 // 1. IN3 auf 1 = OUT2 ein und OUT3 aus Rot an / Grün aus (verriegelt)
rs27 19:8e4e6fe34857 244
rs27 19:8e4e6fe34857 245 if(!in3.aktiv) {
rs27 19:8e4e6fe34857 246 OUT2 = LED_EIN;
rs27 19:8e4e6fe34857 247 OUT3 = LED_AUS;
rs27 19:8e4e6fe34857 248 }
rs27 19:8e4e6fe34857 249
rs27 19:8e4e6fe34857 250 // 2. IN3 auf 0 = OUT2 aus und OUT3 ein Rot aus / Grün an (entriegelt)
rs27 19:8e4e6fe34857 251 // 3. IN5 auf 1 = OUT2 aus und OUT3 ein Rot aus / Grün an (entriegelt)
rs27 19:8e4e6fe34857 252
rs27 19:8e4e6fe34857 253 if (in3.aktiv || in1.aktiv) {
rs27 19:8e4e6fe34857 254 OUT2 = LED_AUS;
rs27 19:8e4e6fe34857 255 OUT3 = LED_EIN;
rs27 19:8e4e6fe34857 256 }
rs27 19:8e4e6fe34857 257
rs27 19:8e4e6fe34857 258 //------------------------------------------------
rs27 19:8e4e6fe34857 259 // Gelbe LED (optischer Alarm):
rs27 19:8e4e6fe34857 260
rs27 19:8e4e6fe34857 261 if (in1.optischer_alarm || in2.optischer_alarm) // sobald der optische Alarm aus Eingang 1 oder Eingang 2 akiviert wurde, diesen in Blinkmode schalten
rs27 19:8e4e6fe34857 262 {
rs27 19:8e4e6fe34857 263 if (down_timer.GetTimerStatus(2) == 0)
rs27 19:8e4e6fe34857 264 {
rs27 19:8e4e6fe34857 265 down_timer.SetCountdownTimer(2,1,OA_PERIODE); // Zeit für Softtimer auf eine Sekunde setzen
rs27 19:8e4e6fe34857 266 OUT4 = !OUT4;
rs27 19:8e4e6fe34857 267 }
rs27 19:8e4e6fe34857 268 }
rs27 19:8e4e6fe34857 269 else
rs27 19:8e4e6fe34857 270 {
rs27 19:8e4e6fe34857 271 OUT4 = LED_AUS;
rs27 19:8e4e6fe34857 272 }
rs27 19:8e4e6fe34857 273
rs27 19:8e4e6fe34857 274 //------------------------------------------------
rs27 19:8e4e6fe34857 275 // Summer (OUT5 +24V)
rs27 19:8e4e6fe34857 276
rs27 19:8e4e6fe34857 277 if (in1.summer || in2.summer || (down_timer.GetTimerStatus(3) != 0)) // sobald der Eingang 1 oder Eingang 2 akiviert ist oder der Timer
rs27 19:8e4e6fe34857 278 { // noch aktiv ist, den Summer aktivieren
rs27 19:8e4e6fe34857 279 OUT5 = 1;
rs27 19:8e4e6fe34857 280 }
rs27 19:8e4e6fe34857 281 else
rs27 19:8e4e6fe34857 282 {
rs27 19:8e4e6fe34857 283 OUT5 = 0;
rs27 19:8e4e6fe34857 284 }
rs27 19:8e4e6fe34857 285
rs27 19:8e4e6fe34857 286 //------------------------------------------------
rs27 19:8e4e6fe34857 287 // Relais K1:
rs27 19:8e4e6fe34857 288 // Der Kontakt des Nottasters wird weitergegeben
rs27 19:8e4e6fe34857 289
rs27 19:8e4e6fe34857 290 if (in1.aktiv) { // 1. IN1 auf 0 = OUT6 (K1) ein
rs27 19:8e4e6fe34857 291 OUT6 = 0;
rs27 19:8e4e6fe34857 292 } else { // 2. IN1 auf 1 = OUT6 aus
rs27 19:8e4e6fe34857 293 OUT6 = 1;
rs27 19:8e4e6fe34857 294 }
rs27 19:8e4e6fe34857 295
rs27 19:8e4e6fe34857 296 } // end if (downtimer ...
rs27 19:8e4e6fe34857 297
rs27 0:e248310dfcdb 298 } // end while
rs27 0:e248310dfcdb 299
rs27 19:8e4e6fe34857 300 } // end main
rs27 19:8e4e6fe34857 301