--- S:\Torsteuerung Lorenz\Steuerung.c --------------------------------------------------------- 1: /* TITLE "Steuerung Garagentor" 2: 3: VERSION 0.1 / für PIC 16F1826 ( 18 Pins ) 4: 5: Belegung I/O: 6: 7: RA0 Motoranschluss 1 Rückmeldung RB0 Überstrom auf (Low-Aktiv) 8: RA1 Endschalter auf (Low-Aktiv) RB1 frei 9: RA2 Überstrom zu (Low-Aktiv) RB2 LED (High-Aktiv) 10: RA3 externer Schalter (High-Aktiv) RB3 Motorrelais 2 (High-Aktiv) 11: RA4 Sicherheitsschalter (High-Aktiv) RB4 Lichtrelais (High-Aktiv) 12: RA5 RESET RB5 Motorrelais 1 (High-Aktiv) 13: RA6 Endschalter zu (Low-Aktiv) RB6 ICSPC 14: RA7 Motoranschluss 2 Rückmeldung RB7 ICSPD 15: 16: Eingangssignal Zustand Aktion 17: Taster Stop Licht an, Motor an (entgegen letzter Richtung) 18: Bewegung Stop, Lichttimer starten 19: Überstrom Rauf Stop, Licht blinken 20: Runter Stop, 5 sec. rauf, Licht blinken 21: Sicherheitsschalter Rauf Stop, Licht blinken 22: Runter Stop, 5 sec. rauf, Licht blinken 23: Endschalter Stop, Lichttimer starten 24: Motoranschluss Soll = Ist nichts unternehmen 25: Soll <> Ist Stop, Licht blinken 26: 27: Reset offen letzte Richtung = auf 28: sonst letzte Richtung = zu 29: Laufzeittimer Stop, Licht blinken 30: 31: 32: Fehlermeldungen: Anzahl der Blinkimpulse der LED 33: 34: 0: alles OK 35: 3: Überstrom auf 36: 4: Überstrom zu 37: 5: Sicherheitsschalter ausgelöst 38: 6: Motoransteuerung IST <> SOLL 39: 7: Endschalter nicht in vorgegebener Zeit erreicht 40: 8: Zustand 0 41: 42: 43: Zustände: 44: 45: 0 Initialisierung 46: 1 Stop unterwegs 47: 2 Stop oben 48: 3 Stop unten 49: 4 hoch fahrend 50: 5 runter fahrend 51: 6 5 Sekunden hoch starten 52: 7 hoch fahrend 5 Sekunden 53: 54: 55: 56: alter Zustand Zusatzbedingung Aktion neuer Zustand 57: 0 Programmstart 1, 2 oder 3 58: 1 Taster=1, Not=0, Neustart=0, Richtung=auf Tor auf, Licht an 4 59: 1 Taster=1, Not=0, Neustart=0, Richtung=zu Tor zu, Licht an 5 60: 1 Endschalter oben Richtung=zu 2 61: 1 Endschalter unten Richtung=auf 3 62: 1 beide Endschalter Tor Stop, Licht blinken 0 63: 2 Taster=1, Not=0, Neustart=0 Tor zu, Licht an 5 64: 2 Endschalter unten Tor Stop, Licht blinken 0 65: 3 Taster=1, Not=0, Neustart=0 Tor auf, Licht an 4 66: 3 Endschalter oben Tor Stop, Licht blinken 0 67: 4 Taster=1, Not=0, Neustart=0 Tor Stop, Richtung=zu, Licht an 1 68: 4 Überstrom auf, Anlaufstrom vorbei Tor Stop, Richtung=zu, Fehler 3, Licht blinken, Licht an 1 69: 4 Not=1 Tor Stop, Fehler 5, Licht blinken, Licht an 1 70: 4 Ende oben Tor Stop, Richtung=zu, Licht an 2 71: 4 Ende unten Tor Stop, Licht blinken 0 72: 5 Taster=1, Not=0, Neustart=0 Tor Stop, Richtung=auf, Licht an 1 73: 5 Überstrom zu, Anlaufstrom vorbei Tor Stop, Richtung=auf, Fehler 4, Licht blinken, Licht an 6 74: 5 Not=1 Tor Stop, Richtung=auf, Fehler 5, Licht blinken, Licht an 6 75: 5 Ende unten Tor Stop, Richtung=auf, Licht an 3 76: 5 Ende oben Tor Stop, Licht blinken 0 77: 6 Neustart = 0 Tor auf, 5 Sekunden starten, Licht an 7 78: 7 Taster=1, Neustart=0 Tor Stop, Licht blinken, Licht an 1 79: 7 Ende oben Tor Stop, Richtung=zu, Licht blinken, Licht an 2 80: 7 Ende unten Tor Stop, Licht blinken 0 81: 7 Timeout5 Tor Stop, Licht blinken, Licht an 1 82: 7 Überstrom auf, Anlaufstrom vorbei Tor Stop, Richtung=zu, Fehler 3, Licht blinken, Licht an 1 83: Motorfehler, kein Endschalter Tor Stop, Richtung umdrehen, Fehler 6, Licht blinken, Licht an 1 84: Motorfehler, Endschalter oben Tor Stop, Richtung zu, Fehler 6, Licht blinken, Licht an 2 85: Motorfehler, Endschalter unten Tor Stop, Richtung auf, Fehler 6, Licht blinken, Licht an 3 86: kein Endschalter in 1min Tor Stop, Richtung umdrehen, Fehler 7, Licht blinken, Licht an 1 87: 88: 89: 90: Bei falscher Laufrichtung RB3 gegen RB5 und RA0 gegen RA7 in #define tauschen. 91: Endschalter Aktiv-Pegel bestimmen und in Tasten_lesen entsprechend ändern. 92: 93: 94: Takt: Intern = 4 MHz 95: 1 Befehlszyklus = 1µs = 4 * ( 1 / 4 MHz ) 96: 97: Timerfaktoren: 98: Timer 0: ohne Prescaler, -> 1MHz, -> 1µs, Überlauf alle 256µs 99: 100: */ 101: 102: #define _XTAL_FREQ 4000000 103: #include 104: #include 105: 106: #define spannung_zu RA0 107: #define ende_oben RA1 108: #define strom_auf RA2 109: #define schalter_extern RA3 110: #define sicherheit RA4 111: #define ende_unten RA6 112: #define spannung_auf RA7 113: #define strom_zu RB0 114: #define led LATB2 115: #define relais_auf LATB3 116: #define licht LATB4 117: #define relais_zu LATB5 118: #define endschalterzustand 0 //Endschalter erreicht 119: #define eingangsdauer 200 //in ms (250) 120: #define relaisdauer 500 //in ms (200) 121: #define blinkdauer 10000 //in ms (10000) 122: #define lichtdauer 120000 //in ms (120000) 123: #define bewegungsdauer 60000 //in ms (60000) 124: #define fuenfdauer 5000 //in ms (5000) 125: 126: __CONFIG (FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_ON & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF); 127: //__CONFIG (FOSC_INTOSC & WDTE_ON & PWRTE_ON & MCLRE_ON & CP_OFF & CPD_OFF & BOREN_ON & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF); 128: __CONFIG (WRT_OFF & PLLEN_OFF & STVREN_ON & BORV_HI & LVP_OFF); 129: 130: 131: /* Variablen */ 132: /* 1 Bit */ 133: volatile bit endschalter_oben = 0; //Flag für Endschalter oben erreicht 134: volatile bit endschalter_unten = 0; //Flag für Endschalter unten erreicht 135: volatile bit millisekunde = 0; //Flag für 1 Millisekunde 136: volatile bit ms500_start = 0; //Flag für Start der 0,5 Sekunden Pause 137: volatile bit ms500_aktiv = 0; //Flag für 0,5 Sekunden Pause läuft 138: volatile bit richtung = 0; //aktuelle Richtung, 0 = auf, 1 = zu 139: volatile bit taste_ende_oben = 0; //Zustand des oberen Endschalters, 0 = nicht erreicht, 1 = erreicht 140: volatile bit taste_ende_unten = 0; //Zustand des unteren Endschalters, 0 = nicht erreicht, 1 = erreicht 141: volatile bit taste_extern = 0; //Zustand des externen Schalters, 0 = nicht aktiviert, 1 = aktiviert 142: volatile bit taste_extern_aktiviert = 0; //externer Schalter Übergang von offen nach zu, 0 = nein, 1 = ja 143: volatile bit taste_extern_alt = 0; //alter Zustand des externen Schalters, 0 = nicht aktiviert, 1 = aktiviert 144: volatile bit taste_sicherheit = 0; //Zustand des Sicherheitsschalters, 0 = nicht aktiviert, 1 = aktiviert 145: volatile bit taste_sicherheit_aktiviert = 0; //Sicherheitsschalter Übergang von zu nach offen, 0 = nein, 1 = ja 146: volatile bit taste_sicherheit_alt = 0; //alter Zustand des Sicherheitsschalters, 0 = nicht aktiviert, 1 = aktiviert 147: volatile bit timeout_bewegung = 0; //Zeit für Bewegungs-Timeout abgelaufen 148: volatile bit timeout_bewegung_aktiv = 0; //Zeit für Bewegungstimer läuft 149: volatile bit timeout_bewegung_start = 0; //Zeit für Bewegungs-Timeout starten 150: volatile bit timeout_blinken_aktiv = 0; //Zeit für Blinken läuft 151: volatile bit timeout_blinken_start = 0; //Zeit für Blinken starten 152: volatile bit timeout_fuenf = 0; //Zeit für 5 Sekunden hochfahren abgelaufen 153: volatile bit timeout_fuenf_aktiv = 0; //Zeit für 5 Sekunden hochfahren läuft 154: volatile bit timeout_fuenf_start = 0; //Zeit für 5 Sekunden hochfahren starten 155: volatile bit timeout_licht_aktiv = 0; //Zeit für Lichttimer läuft 156: volatile bit timeout_licht_start = 0; //Zeit für Nachleuchten starten 157: volatile bit timeout_motor = 0; //Zeit für Motorkontroll-Timeout abgelaufen 158: volatile bit timeout_motor_aktiv = 0; //Zeit für Motortimer läuft 159: volatile bit timeout_motor_start = 0; //Zeit für Motorkontroll-Timeout starten 160: /* 8 Bit */ 161: volatile unsigned char fehlermeldung = 0; //Anzahl Blinksignale LED als Fehlermeldung 162: volatile unsigned char taste_ende_oben_aktiv = 0; //Anzahl ms die der obere Endschalter aktiviert ist 163: volatile unsigned char taste_ende_oben_inaktiv = 0; //Anzahl ms die der obere Endschalter nicht aktiviert ist 164: volatile unsigned char taste_ende_unten_aktiv = 0; //Anzahl ms die der untere Endschalter aktiviert ist 165: volatile unsigned char taste_ende_unten_inaktiv = 0; //Anzahl ms die der untere Endschalter nicht aktiviert ist 166: volatile unsigned char taste_extern_aktiv = 0; //Anzahl ms die der externe Schalter aktiviert ist 167: volatile unsigned char taste_extern_inaktiv = 0; //Anzahl ms die der externe Schalter nicht aktiviert ist 168: volatile unsigned char taste_sicherheit_aktiv = 0; //Anzahl ms die der Sicherheitsschalter aktiviert ist 169: volatile unsigned char taste_sicherheit_inaktiv = 0; //Anzahl ms die der Sicherheitsschalter nicht aktiviert ist 170: volatile unsigned char timer_0 = 0; //Zähler für Überläufe Timer 0 171: volatile unsigned char zustand = 0; //Aktueller Zustand, 0: Initialisierung, 1: Stop unterwegs, 2: Stop oben, 3: Stop unten, 4: hoch fahrend, 5: runter fahrend 172: /* 16 Bit */ 173: volatile unsigned short ende_hoch_zaehler = 0; //Zählvariable für Motorbewegung Öffnen für Endschalter 174: volatile unsigned short ende_runter_zaehler = 0; //Zählvariable für Motorbewegung Schliessen für Endschalter 175: volatile unsigned short fehlermeldung_zaehler = 0; //Zählvariable für LED-Blinken 176: volatile unsigned short timeout_bewegung_zaehler = 0; //Zählvariable für Bewegungstimeout 177: volatile unsigned short timeout_blinken_zaehler = 0; //Zählvariable für Blinktimeout 178: volatile unsigned short timeout_fuenf_zaehler = 0; //Zählvariable für 5-Sekundentimeout 179: volatile unsigned short timeout_motor_zaehler = 0; //Zählvariable für Relaistimeout 180: volatile unsigned short zaehler_500ms = 0; //Zählvariable für 500 ms Pause 181: /* 24 Bit */ 182: volatile unsigned short long timeout_licht_zaehler = 0; //Zählvariable für Lichttimeout 183: 184: 185: /* Torbewegung starten und Licht einschalten*/ 186: void tor_auf(void) 187: { 188: relais_zu = 0; //Relais für "Zu" ausschalten 520 0022 MOVLB 0x2 521 128D BCF 0xd, 0x5 189: relais_auf = 1; //Relais für "Auf" einschalten 522 158D BSF 0xd, 0x3 190: licht = 1; //Licht einschalten 523 160D BSF 0xd, 0x4 191: timeout_bewegung_start = 1; //Flag für Bewegungs-Timeout starten setzen 524 1472 BSF 0x72, 0 192: taste_extern_aktiviert = 0; //Auf Tastendruck reagiert, Anforderung zurücksetzen 525 10F1 BCF 0x71, 0x1 193: timeout_motor_start = 1; //Timer für Relaisüberprüfung starten 526 1573 BSF 0x73, 0x2 194: ms500_start = 1; //0,5 Sekunden Pause für Beruhigung 527 1670 BSF 0x70, 0x4 195: return; 196: } 528 0008 RETURN 197: 198: void tor_zu(void) 199: { 200: relais_auf = 0; //Relais für "Auf" ausschalten 517 0022 MOVLB 0x2 518 118D BCF 0xd, 0x3 201: relais_zu = 1; //Relais für "Zu" einschalten 519 168D BSF 0xd, 0x5 202: licht = 1; //Licht einschalten 51A 160D BSF 0xd, 0x4 203: timeout_bewegung_start = 1; //Flag für Bewegungs-Timeout starten setzen 51B 1472 BSF 0x72, 0 204: taste_extern_aktiviert = 0; //Auf Tastendruck reagiert, Anforderung zurücksetzen 51C 10F1 BCF 0x71, 0x1 205: timeout_motor_start = 1; //Timer für Relaisüberprüfung starten 51D 1573 BSF 0x73, 0x2 206: ms500_start = 1; //0,5 Sekunden Pause für Beruhigung 51E 1670 BSF 0x70, 0x4 207: return; 208: } 51F 0008 RETURN 209: 210: void tor_stop(void) 211: { 212: relais_auf = 0; //Relais für "Auf" ausschalten 50E 0022 MOVLB 0x2 50F 118D BCF 0xd, 0x3 213: relais_zu = 0; //Relais für "Zu" einschalten 510 128D BCF 0xd, 0x5 214: licht = 1; //Licht einschalten 511 160D BSF 0xd, 0x4 215: timeout_licht_start = 1; //Lichttimer starten 512 17F2 BSF 0x72, 0x7 216: timeout_bewegung_aktiv = 0; //Bewegungstimer stoppen 513 13F1 BCF 0x71, 0x7 217: timeout_bewegung_start = 0; 514 1072 BCF 0x72, 0 218: ms500_start = 1; //0,5 Sekunden Pause für Beruhigung 515 1670 BSF 0x70, 0x4 219: return; 220: } 516 0008 RETURN 221: 222: void tor_stop_null(void) 223: { 224: relais_zu = 0; 52F 0022 MOVLB 0x2 530 128D BCF 0xd, 0x5 225: relais_auf = 0; 531 118D BCF 0xd, 0x3 226: zustand = 0; //Zustand: 0 532 01F8 CLRF 0x78 227: timeout_blinken_start = 1; //Blinken starten 533 1572 BSF 0x72, 0x2 228: return; 229: } 534 0008 RETURN 230: 231: /* Einlesen der Tastenzustände */ 232: void tasten_lesen(void) 233: { 234: if (ende_oben == endschalterzustand) //Endschalter Oben erreicht? 45A 0020 MOVLB 0 45B 188C BTFSC 0xc, 0x1 45C 2C5E GOTO 0x45e 45D 2C5F GOTO 0x45f 45E 2C6D GOTO 0x46d 235: { 236: taste_ende_oben_aktiv++; //ja, Aktiv-Zähler plus eins 45F 3001 MOVLW 0x1 460 00F6 MOVWF 0x76 461 0876 MOVF 0x76, W 462 07B3 ADDWF 0x33, F 237: taste_ende_oben_inaktiv = 0; //ja, Inaktiv-Zähler auf Null 463 01B4 CLRF 0x34 238: if (taste_ende_oben_aktiv > 50) 464 3033 MOVLW 0x33 465 0233 SUBWF 0x33, W 466 1C03 BTFSS 0x3, 0 467 2C69 GOTO 0x469 468 2C6A GOTO 0x46a 469 2C7A GOTO 0x47a 239: { 240: taste_ende_oben = 1; //Endschalter Oben erreicht 46A 1770 BSF 0x70, 0x6 46B 2C7A GOTO 0x47a 241: } 242: } 46C 2C7A GOTO 0x47a 243: else 244: { 245: taste_ende_oben_inaktiv++; //nein, Inaktiv-Zähler plus eins 46D 3001 MOVLW 0x1 46E 00F6 MOVWF 0x76 46F 0876 MOVF 0x76, W 470 07B4 ADDWF 0x34, F 246: taste_ende_oben_aktiv = 0; //nein, Aktiv-Zähler auf Null 471 01B3 CLRF 0x33 247: if (taste_ende_oben_inaktiv > 50) 472 3033 MOVLW 0x33 473 0234 SUBWF 0x34, W 474 1C03 BTFSS 0x3, 0 475 2C77 GOTO 0x477 476 2C78 GOTO 0x478 477 2C7A GOTO 0x47a 248: { 249: taste_ende_oben = 0; //Endschalter Oben erreicht 478 1370 BCF 0x70, 0x6 479 2C7A GOTO 0x47a 250: } 251: } 252: 253: if (schalter_extern == 0) //Externer Schalter offen? 47A 198C BTFSC 0xc, 0x3 47B 2C7D GOTO 0x47d 47C 2C7E GOTO 0x47e 47D 2C8C GOTO 0x48c 254: { 255: taste_extern_inaktiv++; //ja, Inaktiv-Zähler plus eins 47E 3001 MOVLW 0x1 47F 00F6 MOVWF 0x76 480 0876 MOVF 0x76, W 481 07B8 ADDWF 0x38, F 256: taste_extern_aktiv = 0; //ja, Aktiv-Zähler auf Null 482 01B7 CLRF 0x37 257: if (taste_extern_inaktiv > eingangsdauer) 483 30C9 MOVLW 0xc9 484 0238 SUBWF 0x38, W 485 1C03 BTFSS 0x3, 0 486 2C88 GOTO 0x488 487 2C89 GOTO 0x489 488 2C99 GOTO 0x499 258: { 259: taste_extern = 0; //Externer Schalter nicht gedrückt 489 1071 BCF 0x71, 0 48A 2C99 GOTO 0x499 260: } 261: } 48B 2C99 GOTO 0x499 262: else 263: { 264: taste_extern_aktiv++; //nein, Aktiv-Zähler plus eins 48C 3001 MOVLW 0x1 48D 00F6 MOVWF 0x76 48E 0876 MOVF 0x76, W 48F 07B7 ADDWF 0x37, F 265: taste_extern_inaktiv = 0; //nein, Inaktiv-Zähler auf Null 490 01B8 CLRF 0x38 266: if (taste_extern_aktiv > eingangsdauer) 491 30C9 MOVLW 0xc9 492 0237 SUBWF 0x37, W 493 1C03 BTFSS 0x3, 0 494 2C96 GOTO 0x496 495 2C97 GOTO 0x497 496 2C99 GOTO 0x499 267: { 268: taste_extern = 1; //Externer Schalter gedrückt 497 1471 BSF 0x71, 0 498 2C99 GOTO 0x499 269: } 270: } 271: 272: if ((taste_extern == 1) && (taste_extern_alt == 0)) 499 1C71 BTFSS 0x71, 0 49A 2C9C GOTO 0x49c 49B 2C9D GOTO 0x49d 49C 2CA8 GOTO 0x4a8 49D 1971 BTFSC 0x71, 0x2 49E 2CA0 GOTO 0x4a0 49F 2CA1 GOTO 0x4a1 4A0 2CA8 GOTO 0x4a8 273: { 274: if (sicherheit == 1) //Sicherheitstaste geschlossen -> alles I.O. 4A1 1E0C BTFSS 0xc, 0x4 4A2 2CA4 GOTO 0x4a4 4A3 2CA5 GOTO 0x4a5 4A4 2CA8 GOTO 0x4a8 275: { 276: taste_sicherheit_aktiviert = 0; //evtl. vorhandene Meldung über geöffnete Sicherheitstaste löschen 4A5 1271 BCF 0x71, 0x4 277: taste_extern_aktiviert = 1; //Taste wurde gerade grdrückt 4A6 14F1 BSF 0x71, 0x1 4A7 2CA8 GOTO 0x4a8 278: } 279: } 280: taste_extern_alt = taste_extern; 4A8 1871 BTFSC 0x71, 0 4A9 2CAB GOTO 0x4ab 4AA 2CAD GOTO 0x4ad 4AB 1571 BSF 0x71, 0x2 4AC 2CAE GOTO 0x4ae 4AD 1171 BCF 0x71, 0x2 281: 282: if (sicherheit == 1) //Sicherheitsschalter offen? 4AE 0020 MOVLB 0 4AF 1E0C BTFSS 0xc, 0x4 4B0 2CB2 GOTO 0x4b2 4B1 2CB3 GOTO 0x4b3 4B2 2CC1 GOTO 0x4c1 283: { 284: taste_sicherheit_inaktiv++; //ja, Inaktiv-Zähler plus eins 4B3 3001 MOVLW 0x1 4B4 00F6 MOVWF 0x76 4B5 0876 MOVF 0x76, W 4B6 07BA ADDWF 0x3a, F 285: taste_sicherheit_aktiv = 0; //ja, Aktiv-Zähler auf Null 4B7 01B9 CLRF 0x39 286: if (taste_sicherheit_inaktiv > eingangsdauer) 4B8 30C9 MOVLW 0xc9 4B9 023A SUBWF 0x3a, W 4BA 1C03 BTFSS 0x3, 0 4BB 2CBD GOTO 0x4bd 4BC 2CBE GOTO 0x4be 4BD 2CCE GOTO 0x4ce 287: { 288: taste_sicherheit = 0; //Sicherheitsschalter nicht gedrückt 4BE 11F1 BCF 0x71, 0x3 4BF 2CCE GOTO 0x4ce 289: } 290: } 4C0 2CCE GOTO 0x4ce 291: else 292: { 293: taste_sicherheit_aktiv++; //nein, Aktiv-Zähler plus eins 4C1 3001 MOVLW 0x1 4C2 00F6 MOVWF 0x76 4C3 0876 MOVF 0x76, W 4C4 07B9 ADDWF 0x39, F 294: taste_sicherheit_inaktiv = 0; //nein, Inaktiv-Zähler auf Null 4C5 01BA CLRF 0x3a 295: if (taste_sicherheit_aktiv > eingangsdauer) 4C6 30C9 MOVLW 0xc9 4C7 0239 SUBWF 0x39, W 4C8 1C03 BTFSS 0x3, 0 4C9 2CCB GOTO 0x4cb 4CA 2CCC GOTO 0x4cc 4CB 2CCE GOTO 0x4ce 296: { 297: taste_sicherheit = 1; //Sicherheitsschalter gedrückt 4CC 15F1 BSF 0x71, 0x3 4CD 2CCE GOTO 0x4ce 298: } 299: } 300: 301: if ((taste_sicherheit == 1) && (taste_sicherheit_alt == 0)) 4CE 1DF1 BTFSS 0x71, 0x3 4CF 2CD1 GOTO 0x4d1 4D0 2CD2 GOTO 0x4d2 4D1 2CD7 GOTO 0x4d7 4D2 1AF1 BTFSC 0x71, 0x5 4D3 2CD5 GOTO 0x4d5 4D4 2CD6 GOTO 0x4d6 4D5 2CD7 GOTO 0x4d7 302: { 303: taste_sicherheit_aktiviert = 1; //Sicherheitsschalter hat ausgelöst 4D6 1671 BSF 0x71, 0x4 304: } 305: taste_sicherheit_alt = taste_sicherheit; 4D7 19F1 BTFSC 0x71, 0x3 4D8 2CDA GOTO 0x4da 4D9 2CDC GOTO 0x4dc 4DA 16F1 BSF 0x71, 0x5 4DB 2CDD GOTO 0x4dd 4DC 12F1 BCF 0x71, 0x5 306: 307: if (ende_unten == endschalterzustand) //Endschalter Unten erreicht? 4DD 0020 MOVLB 0 4DE 1B0C BTFSC 0xc, 0x6 4DF 2CE1 GOTO 0x4e1 4E0 2CE2 GOTO 0x4e2 4E1 2CF0 GOTO 0x4f0 308: { 309: taste_ende_unten_aktiv++; //ja, Aktiv-Zähler plus eins 4E2 3001 MOVLW 0x1 4E3 00F6 MOVWF 0x76 4E4 0876 MOVF 0x76, W 4E5 07B5 ADDWF 0x35, F 310: taste_ende_unten_inaktiv = 0; //ja, Inaktiv-Zähler auf Null 4E6 01B6 CLRF 0x36 311: if (taste_ende_unten_aktiv > 50) 4E7 3033 MOVLW 0x33 4E8 0235 SUBWF 0x35, W 4E9 1C03 BTFSS 0x3, 0 4EA 2CEC GOTO 0x4ec 4EB 2CED GOTO 0x4ed 4EC 2CFE GOTO 0x4fe 312: { 313: taste_ende_unten = 1; //Endschalter Unten erreicht 4ED 17F0 BSF 0x70, 0x7 4EE 2CFE GOTO 0x4fe 314: } 315: } 4EF 2CFE GOTO 0x4fe 316: else 317: { 318: taste_ende_unten_inaktiv++; //nein, Inaktiv-Zähler plus eins 4F0 3001 MOVLW 0x1 4F1 00F6 MOVWF 0x76 4F2 0876 MOVF 0x76, W 4F3 07B6 ADDWF 0x36, F 319: taste_ende_unten_aktiv = 0; //nein, Aktiv-Zähler auf Null 4F4 01B5 CLRF 0x35 320: if (taste_ende_unten_inaktiv > 50) 4F5 3033 MOVLW 0x33 4F6 0236 SUBWF 0x36, W 4F7 1C03 BTFSS 0x3, 0 4F8 2CFA GOTO 0x4fa 4F9 2CFB GOTO 0x4fb 4FA 2CFE GOTO 0x4fe 321: { 322: taste_ende_unten = 0; //Endschalter Unten erreicht 4FB 13F0 BCF 0x70, 0x7 4FC 2CFE GOTO 0x4fe 323: } 4FD 2CFE GOTO 0x4fe 324: } 325: return; 326: } 4FE 0008 RETURN 327: 328: /* Eingänge einlesen und Timer hochzählen und auswerten*/ 329: void zeit_und_tasten(void) 330: { 331: tasten_lesen(); //Einlesen der Zustände der Eingänge 335 3184 MOVLP 0x4 336 245A CALL 0x45a 337 3183 MOVLP 0x3 332: if (timeout_bewegung_aktiv) //Bewegungstimer läuft 338 1FF1 BTFSS 0x71, 0x7 339 2B3B GOTO 0x33b 33A 2B3C GOTO 0x33c 33B 2B4D GOTO 0x34d 333: { 334: timeout_bewegung_zaehler++; //eins hoch zählen 33C 3001 MOVLW 0x1 33D 0020 MOVLB 0 33E 07A9 ADDWF 0x29, F 33F 3000 MOVLW 0 340 3DAA ADDWFC 0x2a, F 335: if (timeout_bewegung_zaehler > bewegungsdauer) //Zähler abgelaufen? 341 30EA MOVLW 0xea 342 022A SUBWF 0x2a, W 343 3061 MOVLW 0x61 344 1903 BTFSC 0x3, 0x2 345 0229 SUBWF 0x29, W 346 1C03 BTFSS 0x3, 0 347 2B49 GOTO 0x349 348 2B4A GOTO 0x34a 349 2B4D GOTO 0x34d 336: { 337: timeout_bewegung_aktiv = 0; //Zähler inaktiv 34A 13F1 BCF 0x71, 0x7 338: timeout_bewegung = 1; //Timeout eingetreten 34B 1771 BSF 0x71, 0x6 34C 2B4D GOTO 0x34d 339: } 340: } 341: 342: if (timeout_blinken_aktiv) //Blinktimer läuft 34D 1CF2 BTFSS 0x72, 0x1 34E 2B50 GOTO 0x350 34F 2B51 GOTO 0x351 350 2B73 GOTO 0x373 343: { 344: timeout_blinken_zaehler++; //eins hoch zählen 351 3001 MOVLW 0x1 352 0020 MOVLB 0 353 07AB ADDWF 0x2b, F 354 3000 MOVLW 0 355 3DAC ADDWFC 0x2c, F 345: licht = ((timeout_blinken_zaehler >> 9) & 0b00000001); //Zustandswechsel alle 0,5sec. 356 082C MOVF 0x2c, W 357 00BD MOVWF 0x3d 358 082B MOVF 0x2b, W 359 00BC MOVWF 0x3c 35A 3009 MOVLW 0x9 35B 36BD LSRF 0x3d, F 35C 0CBC RRF 0x3c, F 35D 0B89 DECFSZ 0x9, F 35E 2B5B GOTO 0x35b 35F 183C BTFSC 0x3c, 0 360 2B62 GOTO 0x362 361 2B65 GOTO 0x365 362 0022 MOVLB 0x2 363 160D BSF 0xd, 0x4 364 2B67 GOTO 0x367 365 0022 MOVLB 0x2 366 120D BCF 0xd, 0x4 346: if (timeout_blinken_zaehler > blinkdauer) //Zähler abgelaufen? 367 3027 MOVLW 0x27 368 0020 MOVLB 0 369 022C SUBWF 0x2c, W 36A 3011 MOVLW 0x11 36B 1903 BTFSC 0x3, 0x2 36C 022B SUBWF 0x2b, W 36D 1C03 BTFSS 0x3, 0 36E 2B70 GOTO 0x370 36F 2B71 GOTO 0x371 370 2B73 GOTO 0x373 347: { 348: timeout_blinken_aktiv = 0; //Zähler inaktiv 371 10F2 BCF 0x72, 0x1 372 2B73 GOTO 0x373 349: } 350: } 351: 352: if (timeout_fuenf_aktiv) //5-Sekundentimer läuft 373 1E72 BTFSS 0x72, 0x4 374 2B76 GOTO 0x376 375 2B77 GOTO 0x377 376 2B88 GOTO 0x388 353: { 354: timeout_fuenf_zaehler++; //eins hoch zählen 377 3001 MOVLW 0x1 378 0020 MOVLB 0 379 07AD ADDWF 0x2d, F 37A 3000 MOVLW 0 37B 3DAE ADDWFC 0x2e, F 355: if (timeout_fuenf_zaehler > fuenfdauer) //Zähler abgelaufen? 37C 3013 MOVLW 0x13 37D 022E SUBWF 0x2e, W 37E 3089 MOVLW 0x89 37F 1903 BTFSC 0x3, 0x2 380 022D SUBWF 0x2d, W 381 1C03 BTFSS 0x3, 0 382 2B84 GOTO 0x384 383 2B85 GOTO 0x385 384 2B88 GOTO 0x388 356: { 357: timeout_fuenf_aktiv = 0; //Zähler inaktiv 385 1272 BCF 0x72, 0x4 358: timeout_fuenf = 1; //Timeout eingetreten 386 15F2 BSF 0x72, 0x3 387 2B88 GOTO 0x388 359: } 360: } 361: 362: if (timeout_licht_aktiv) //Lichttimer läuft 388 1F72 BTFSS 0x72, 0x6 389 2B8B GOTO 0x38b 38A 2B8C GOTO 0x38c 38B 2BA9 GOTO 0x3a9 363: { 364: timeout_licht_zaehler++; //eins hoch zählen 38C 3001 MOVLW 0x1 38D 0020 MOVLB 0 38E 07A0 ADDWF 0x20, F 38F 3000 MOVLW 0 390 1803 BTFSC 0x3, 0 391 3001 MOVLW 0x1 392 07A1 ADDWF 0x21, F 393 3000 MOVLW 0 394 1803 BTFSC 0x3, 0 395 3001 MOVLW 0x1 396 07A2 ADDWF 0x22, F 365: if (timeout_licht_zaehler > lichtdauer) //Zähler abgelaufen? 397 3001 MOVLW 0x1 398 0222 SUBWF 0x22, W 399 1D03 BTFSS 0x3, 0x2 39A 2BA1 GOTO 0x3a1 39B 30D4 MOVLW 0xd4 39C 0221 SUBWF 0x21, W 39D 1D03 BTFSS 0x3, 0x2 39E 2BA1 GOTO 0x3a1 39F 30C1 MOVLW 0xc1 3A0 0220 SUBWF 0x20, W 3A1 1C03 BTFSS 0x3, 0 3A2 2BA4 GOTO 0x3a4 3A3 2BA5 GOTO 0x3a5 3A4 2BA9 GOTO 0x3a9 366: { 367: timeout_licht_aktiv = 0; //Zähler inaktiv 3A5 1372 BCF 0x72, 0x6 368: licht = 0; //Timeout eingetreten 3A6 0022 MOVLB 0x2 3A7 120D BCF 0xd, 0x4 3A8 2BA9 GOTO 0x3a9 369: } 370: } 371: 372: if (ms500_aktiv) 3A9 1DF0 BTFSS 0x70, 0x3 3AA 2BAC GOTO 0x3ac 3AB 2BAD GOTO 0x3ad 3AC 2BBD GOTO 0x3bd 373: { 374: zaehler_500ms++; 3AD 3001 MOVLW 0x1 3AE 0020 MOVLB 0 3AF 07B1 ADDWF 0x31, F 3B0 3000 MOVLW 0 3B1 3DB2 ADDWFC 0x32, F 375: if (zaehler_500ms > 1000) 3B2 3003 MOVLW 0x3 3B3 0232 SUBWF 0x32, W 3B4 30E9 MOVLW 0xe9 3B5 1903 BTFSC 0x3, 0x2 3B6 0231 SUBWF 0x31, W 3B7 1C03 BTFSS 0x3, 0 3B8 2BBA GOTO 0x3ba 3B9 2BBB GOTO 0x3bb 3BA 2BBD GOTO 0x3bd 376: { 377: ms500_aktiv = 0; 3BB 11F0 BCF 0x70, 0x3 3BC 2BBD GOTO 0x3bd 529 0064 CLRWDT 378: } 379: } 52A 0180 CLRF 0 380: 52B 3101 ADDFSR 0, 0x1 381: if (timeout_motor_aktiv) //Motortimer läuft 3BD 1CF3 BTFSS 0x73, 0x1 3BE 2BC0 GOTO 0x3c0 3BF 2BC1 GOTO 0x3c1 3C0 2BD2 GOTO 0x3d2 52C 0B89 DECFSZ 0x9, F 382: { 52D 2D2A GOTO 0x52a 383: timeout_motor_zaehler++; //eins hoch zählen 3C1 3001 MOVLW 0x1 3C2 0020 MOVLB 0 3C3 07AF ADDWF 0x2f, F 3C4 3000 MOVLW 0 3C5 3DB0 ADDWFC 0x30, F 52E 3400 RETLW 0 384: if (timeout_motor_zaehler > relaisdauer) //Zähler abgelaufen? 3C6 3001 MOVLW 0x1 3C7 0230 SUBWF 0x30, W 3C8 30F5 MOVLW 0xf5 3C9 1903 BTFSC 0x3, 0x2 3CA 022F SUBWF 0x2f, W 3CB 1C03 BTFSS 0x3, 0 3CC 2BCE GOTO 0x3ce 3CD 2BCF GOTO 0x3cf 3CE 2BD2 GOTO 0x3d2 385: { 386: timeout_motor_aktiv = 0; //Zähler inaktiv 3CF 10F3 BCF 0x73, 0x1 387: timeout_motor = 1; //Timeout eingetreten 3D0 1473 BSF 0x73, 0 3D1 2BD2 GOTO 0x3d2 4FF 01F0 CLRF 0x70 388: } 500 01F1 CLRF 0x71 389: } 501 01F2 CLRF 0x72 390: 502 01F3 CLRF 0x73 391: if (timeout_bewegung_start == 1) //Bewegungstimer starten 3D2 1C72 BTFSS 0x72, 0 3D3 2BD5 GOTO 0x3d5 3D4 2BD6 GOTO 0x3d6 3D5 2BDC GOTO 0x3dc 392: { 393: timeout_bewegung_start = 0; //Flag zurücksetzen 3D6 1072 BCF 0x72, 0 394: timeout_bewegung_zaehler = 0; //Zähler zurücksetzen 3D7 0020 MOVLB 0 3D8 01A9 CLRF 0x29 3D9 01AA CLRF 0x2a 503 01F9 CLRF 0x79 395: timeout_bewegung_aktiv = 1; //Bewegungstimer läuft 3DA 17F1 BSF 0x71, 0x7 3DB 2BDC GOTO 0x3dc 396: } 397: 398: if (timeout_blinken_start == 1) //Blinktimer starten 3DC 1D72 BTFSS 0x72, 0x2 3DD 2BDF GOTO 0x3df 3DE 2BE0 GOTO 0x3e0 3DF 2BE6 GOTO 0x3e6 504 3020 MOVLW 0x20 399: { 505 0084 MOVWF 0x4 400: timeout_blinken_start = 0; //Flag zurücksetzen 3E0 1172 BCF 0x72, 0x2 506 3000 MOVLW 0 401: timeout_blinken_zaehler = 0; //Zähler zurücksetzen 3E1 0020 MOVLB 0 3E2 01AB CLRF 0x2b 3E3 01AC CLRF 0x2c 507 0085 MOVWF 0x5 402: timeout_blinken_aktiv = 1; //Blinktimer läuft 3E4 14F2 BSF 0x72, 0x1 3E5 2BE6 GOTO 0x3e6 508 301C MOVLW 0x1c 403: } 509 3185 MOVLP 0x5 50A 2529 CALL 0x529 50B 3184 MOVLP 0x4 404: 405: if (timeout_fuenf_start == 1) //5-Sekundentimer starten 3E6 1EF2 BTFSS 0x72, 0x5 3E7 2BE9 GOTO 0x3e9 3E8 2BEA GOTO 0x3ea 3E9 2BF0 GOTO 0x3f0 406: { 407: timeout_fuenf_start = 0; //Flag zurücksetzen 3EA 12F2 BCF 0x72, 0x5 408: timeout_fuenf_zaehler = 0; //Zaehler zurücksetzen 3EB 0020 MOVLB 0 3EC 01AD CLRF 0x2d 3ED 01AE CLRF 0x2e 409: timeout_fuenf_aktiv = 1; //Timer aktiv 3EE 1672 BSF 0x72, 0x4 3EF 2BF0 GOTO 0x3f0 410: } 50C 0020 MOVLB 0 411: 50D 281A GOTO 0x1a 412: if (timeout_licht_start == 1) //Lichttimer starten 3F0 1FF2 BTFSS 0x72, 0x7 3F1 2BF3 GOTO 0x3f3 3F2 2BF4 GOTO 0x3f4 3F3 2BFE GOTO 0x3fe 413: { 414: timeout_licht_start = 0; //Flag zuzrücksetzen 3F4 13F2 BCF 0x72, 0x7 415: timeout_licht_zaehler = 0; //Zaehler zurücksetzen 3F5 3000 MOVLW 0 3F6 0020 MOVLB 0 3F7 00A0 MOVWF 0x20 3F8 3000 MOVLW 0 3F9 00A1 MOVWF 0x21 3FA 3000 MOVLW 0 3FB 00A2 MOVWF 0x22 416: timeout_licht_aktiv = 1; //Timer aktiv 3FC 1772 BSF 0x72, 0x6 3FD 2BFE GOTO 0x3fe 417: } 418: 419: if (timeout_motor_start == 1) //Motortimer starten 3FE 1D73 BTFSS 0x73, 0x2 3FF 2C01 GOTO 0x401 400 2C02 GOTO 0x402 401 2C08 GOTO 0x408 420: { 421: timeout_motor_start = 0; //Flag zurücksetzen 402 1173 BCF 0x73, 0x2 422: timeout_motor_zaehler = 0; //Zaehler zurücksetzen 403 0020 MOVLB 0 404 01AF CLRF 0x2f 405 01B0 CLRF 0x30 423: timeout_motor_aktiv = 1; //Timer aktiv 406 14F3 BSF 0x73, 0x1 407 2C08 GOTO 0x408 424: } 425: 426: if (ms500_start) 408 1E70 BTFSS 0x70, 0x4 409 2C0B GOTO 0x40b 40A 2C0C GOTO 0x40c 40B 2C12 GOTO 0x412 427: { 428: ms500_aktiv = 1; 40C 15F0 BSF 0x70, 0x3 429: ms500_start = 0; 40D 1270 BCF 0x70, 0x4 430: zaehler_500ms = 0; 40E 0020 MOVLB 0 40F 01B1 CLRF 0x31 410 01B2 CLRF 0x32 411 2C12 GOTO 0x412 431: } 432: 433: if (fehlermeldung_zaehler > ((fehlermeldung+2)*1024)) //ein Durchlauf fertig (x mal (512ms LED an, 512ms LED aus)) + 2048ms Pause 412 0879 MOVF 0x79, W 413 0020 MOVLB 0 414 00BC MOVWF 0x3c 415 01BD CLRF 0x3d 416 300A MOVLW 0xa 417 35BC LSLF 0x3c, F 418 0DBD RLF 0x3d, F 419 0B89 DECFSZ 0x9, F 41A 2C17 GOTO 0x417 41B 083C MOVF 0x3c, W 41C 3E00 ADDLW 0 41D 00BE MOVWF 0x3e 41E 3008 MOVLW 0x8 41F 3D3D ADDWFC 0x3d, W 420 00BF MOVWF 0x3f 421 0828 MOVF 0x28, W 422 023F SUBWF 0x3f, W 423 1D03 BTFSS 0x3, 0x2 424 2C27 GOTO 0x427 425 0827 MOVF 0x27, W 426 023E SUBWF 0x3e, W 427 1803 BTFSC 0x3, 0 428 2C2A GOTO 0x42a 429 2C2B GOTO 0x42b 42A 2C2E GOTO 0x42e 434: { 435: fehlermeldung_zaehler = 0; //zurücksetzen, neuer Durchlauf 42B 01A7 CLRF 0x27 42C 01A8 CLRF 0x28 42D 2C2E GOTO 0x42e 436: } 437: fehlermeldung_zaehler++; //Zähler erhöhen 42E 3001 MOVLW 0x1 42F 07A7 ADDWF 0x27, F 430 3000 MOVLW 0 431 3DA8 ADDWFC 0x28, F 438: if (fehlermeldung_zaehler < (fehlermeldung*1024)) //noch im blinken 432 0879 MOVF 0x79, W 433 00BC MOVWF 0x3c 434 01BD CLRF 0x3d 435 300A MOVLW 0xa 436 35BC LSLF 0x3c, F 437 0DBD RLF 0x3d, F 438 0B89 DECFSZ 0x9, F 439 2C36 GOTO 0x436 43A 083D MOVF 0x3d, W 43B 0228 SUBWF 0x28, W 43C 1D03 BTFSS 0x3, 0x2 43D 2C40 GOTO 0x440 43E 083C MOVF 0x3c, W 43F 0227 SUBWF 0x27, W 440 1803 BTFSC 0x3, 0 441 2C43 GOTO 0x443 442 2C44 GOTO 0x444 443 2C56 GOTO 0x456 439: { 440: led = ((fehlermeldung_zaehler >> 9) & 0b00000001); //Zustand LED, Wechsel alle 512ms 444 0828 MOVF 0x28, W 445 00BD MOVWF 0x3d 446 0827 MOVF 0x27, W 447 00BC MOVWF 0x3c 448 3009 MOVLW 0x9 449 36BD LSRF 0x3d, F 44A 0CBC RRF 0x3c, F 44B 0B89 DECFSZ 0x9, F 44C 2C49 GOTO 0x449 44D 183C BTFSC 0x3c, 0 44E 2C50 GOTO 0x450 44F 2C53 GOTO 0x453 450 0022 MOVLB 0x2 451 150D BSF 0xd, 0x2 452 2C55 GOTO 0x455 453 0022 MOVLB 0x2 454 110D BCF 0xd, 0x2 441: } 455 2C59 GOTO 0x459 442: else 443: { 444: led = 0; //LED aus für Pause nach Meldung 456 0022 MOVLB 0x2 457 110D BCF 0xd, 0x2 458 2C59 GOTO 0x459 445: } 446: return; 447: } 459 0008 RETURN 448: 449: 450: /* H A U P T P R O G R A M M*/ 451: 452: void main(void) 453: { 454: 455: /* Initialisierung*/ 456: SPLLEN = 0; //PLL aus 01A 0021 MOVLB 0x1 01B 1399 BCF 0x19, 0x7 457: 458: IRCF3 = 1; // >| 01C 1719 BSF 0x19, 0x6 459: IRCF2 = 1; // | 4MHz 01D 1699 BSF 0x19, 0x5 460: IRCF1 = 0; // | 01E 1219 BCF 0x19, 0x4 461: IRCF0 = 1; // >| 01F 1599 BSF 0x19, 0x3 462: 463: SCS1 = 0; // >| Quelle: laut Config 020 1099 BCF 0x19, 0x1 464: SCS0 = 0; // >| 021 1019 BCF 0x19, 0 465: 466: LATA =0b00000000; //alle Low 022 0022 MOVLB 0x2 023 018C CLRF 0xc 467: LATB =0b00000000; //alle Low 024 018D CLRF 0xd 468: TRISA =0b11111111; //alle Eingang 025 30FF MOVLW 0xff 026 0021 MOVLB 0x1 027 008C MOVWF 0xc 469: TRISB =0b00000001; //RB7..RB1 Ausgang, RB0 Eingang 028 3001 MOVLW 0x1 029 008D MOVWF 0xd 470: nWPUEN = 0; //Pull-up individuell 02A 1395 BCF 0x15, 0x7 471: INTEDG = 0; //falling edge 02B 1315 BCF 0x15, 0x6 472: TMR0CS = 0; //Timer0 intern 02C 1295 BCF 0x15, 0x5 473: TMR0SE = 0; //Timer0-edge rise 02D 1215 BCF 0x15, 0x4 474: PSA = 1; //kein prescaler für timer0 02E 1595 BSF 0x15, 0x3 475: 476: PS2 = 0; // >| 02F 1115 BCF 0x15, 0x2 477: PS1 = 0; // | prescaler 1:2 030 1095 BCF 0x15, 0x1 478: PS0 = 0; // >| 031 1015 BCF 0x15, 0 479: 480: ANSELA =0b00000000; //alle digital 032 0023 MOVLB 0x3 033 018C CLRF 0xc 481: ANSELB =0b00000000; //alle digital 034 018D CLRF 0xd 482: WDTCON =0b00010100; //Watchdogtimer auf 1 Sekunde, Softwarewatchdog aus 035 3014 MOVLW 0x14 036 0021 MOVLB 0x1 037 0097 MOVWF 0x17 483: GIE = 0; //Global disabled 038 138B BCF 0xb, 0x7 484: PEIE = 1; //Peripheral Interrupt disabled 039 170B BSF 0xb, 0x6 485: TMR0IE = 1; //Timer0-Interrupt enabled 03A 168B BSF 0xb, 0x5 486: INTE = 0; //Externer Intterupt disabled 03B 120B BCF 0xb, 0x4 487: IOCIE = 0; //Interrupt On Change disabled 03C 118B BCF 0xb, 0x3 488: TMR0IF = 0; //Flag für Timer0 löschen 03D 110B BCF 0xb, 0x2 489: INTF = 0; //Flag für externen Interrupt löschen 03E 108B BCF 0xb, 0x1 490: IOCIF = 0; //Flag für Intterupt On Change löschen 03F 100B BCF 0xb, 0 491: fehlermeldung = 0; //Fehler löschen 040 01F9 CLRF 0x79 492: fehlermeldung_zaehler = 0; //Durchlauf für Fehlermeldung an Anfang 041 0020 MOVLB 0 042 01A7 CLRF 0x27 043 01A8 CLRF 0x28 493: richtung = 0; //"Zu" als nächste Richtung festlegen 044 12F0 BCF 0x70, 0x5 494: zustand = 1; 045 01F8 CLRF 0x78 046 1403 BSF 0x3, 0 047 0DF8 RLF 0x78, F 495: ms500_aktiv = 0; //Tor steht, Position unbekannt 048 11F0 BCF 0x70, 0x3 496: timer_0 = 0; //Zähler zurücksetzen 049 01BB CLRF 0x3b 497: if (ende_oben == endschalterzustand) //Tor in oberer Endstellung? 04A 188C BTFSC 0xc, 0x1 04B 284D GOTO 0x4d 04C 284E GOTO 0x4e 04D 2854 GOTO 0x54 498: { 499: richtung = 1; //"Zu" als nächste Richtung 04E 16F0 BSF 0x70, 0x5 500: zustand = 2; //am oberen Ende 04F 3002 MOVLW 0x2 050 00F7 MOVWF 0x77 051 0877 MOVF 0x77, W 052 00F8 MOVWF 0x78 053 2854 GOTO 0x54 501: } 502: if (ende_unten == endschalterzustand) //Tor in unterer Endstellung? 054 1B0C BTFSC 0xc, 0x6 055 2857 GOTO 0x57 056 2858 GOTO 0x58 057 285E GOTO 0x5e 503: { 504: zustand = 3; //am unteren Ende 058 3003 MOVLW 0x3 059 00F7 MOVWF 0x77 05A 0877 MOVF 0x77, W 05B 00F8 MOVWF 0x78 505: richtung = 0; //"Auf" als nächste Richtung 05C 12F0 BCF 0x70, 0x5 05D 285E GOTO 0x5e 506: } 507: GIE = 1; //Interrupt enabled 05E 178B BSF 0xb, 0x7 508: led = 1; 05F 0022 MOVLB 0x2 060 150D BSF 0xd, 0x2 061 2862 GOTO 0x62 509: //zustand = 2; //am oberen Endschalter 510: /* Endlosschleife*/ 511: while (1) //Endlosschleife 333 2862 GOTO 0x62 512: { 513: if (millisekunde > 0) //wieder eine Millisekunde rum 062 1D70 BTFSS 0x70, 0x2 063 2865 GOTO 0x65 064 2866 GOTO 0x66 065 288C GOTO 0x8c 514: { 515: zeit_und_tasten(); //Tasteneinlesen und Timer hochzählen 066 3183 MOVLP 0x3 067 2335 CALL 0x335 068 3180 MOVLP 0 516: if ((spannung_auf == 1) && (spannung_zu == 0)) //Motor fährt hoch? 069 0020 MOVLB 0 06A 1F8C BTFSS 0xc, 0x7 06B 286D GOTO 0x6d 06C 286E GOTO 0x6e 06D 2877 GOTO 0x77 06E 180C BTFSC 0xc, 0 06F 2871 GOTO 0x71 070 2872 GOTO 0x72 071 2877 GOTO 0x77 517: { 518: ende_hoch_zaehler++; //ja, Zähler erhöhen 072 3001 MOVLW 0x1 073 07A3 ADDWF 0x23, F 074 3000 MOVLW 0 075 3DA4 ADDWFC 0x24, F 519: } 076 287A GOTO 0x7a 520: else 521: { 522: ende_hoch_zaehler = 0; //nein, Zähler auf 0 077 01A3 CLRF 0x23 078 01A4 CLRF 0x24 079 287A GOTO 0x7a 523: } 524: if ((spannung_auf == 0) && (spannung_zu == 1)) //Motor fährt hoch? 07A 1B8C BTFSC 0xc, 0x7 07B 287D GOTO 0x7d 07C 287E GOTO 0x7e 07D 2887 GOTO 0x87 07E 1C0C BTFSS 0xc, 0 07F 2881 GOTO 0x81 080 2882 GOTO 0x82 081 2887 GOTO 0x87 525: { 526: ende_runter_zaehler++; //ja, Zähler erhöhen 082 3001 MOVLW 0x1 083 07A5 ADDWF 0x25, F 084 3000 MOVLW 0 085 3DA6 ADDWFC 0x26, F 527: } 086 288A GOTO 0x8a 528: else 529: { 530: ende_runter_zaehler = 0; //nein, Zähler auf 0 087 01A5 CLRF 0x25 088 01A6 CLRF 0x26 089 288A GOTO 0x8a 531: } 532: millisekunde = 0; //Flag zurücksetzen 08A 1170 BCF 0x70, 0x2 08B 288C GOTO 0x8c 533: } 534: 535: if (zustand == 0) //Zustand 0 geht nicht 08C 08F8 MOVF 0x78, F 08D 1D03 BTFSS 0x3, 0x2 08E 2890 GOTO 0x90 08F 2891 GOTO 0x91 090 2892 GOTO 0x92 536: { 537: NOP();//fehlermeldung = 8; //Blinkanzahl für Fehlermeldung setzen 091 0000 NOP 538: } 539: 540: if (taste_ende_oben == 1) //oberer Endschalter erreicht 092 1F70 BTFSS 0x70, 0x6 093 2895 GOTO 0x95 094 2896 GOTO 0x96 095 2897 GOTO 0x97 541: { 542: endschalter_oben = 1; //Flag setzen 096 1470 BSF 0x70, 0 543: } 544: 545: if (taste_ende_unten == 1) //unterer Endschalter erreicht 097 1FF0 BTFSS 0x70, 0x7 098 289A GOTO 0x9a 099 289B GOTO 0x9b 09A 289D GOTO 0x9d 546: { 547: endschalter_unten = 1; //Flag setzen 09B 14F0 BSF 0x70, 0x1 09C 289D GOTO 0x9d 548: } 549: 550: if (ende_hoch_zaehler > 500) //Tor fährt länger als 0,5sek hoch 09D 3001 MOVLW 0x1 09E 0020 MOVLB 0 09F 0224 SUBWF 0x24, W 0A0 30F5 MOVLW 0xf5 0A1 1903 BTFSC 0x3, 0x2 0A2 0223 SUBWF 0x23, W 0A3 1C03 BTFSS 0x3, 0 0A4 28A6 GOTO 0xa6 0A5 28A7 GOTO 0xa7 0A6 28A9 GOTO 0xa9 551: { 552: endschalter_unten = 0; //Flag zurücksetzen 0A7 10F0 BCF 0x70, 0x1 0A8 28A9 GOTO 0xa9 553: } 554: 555: if (ende_runter_zaehler > 500) //Tor fährt länger als 0,5sek runter 0A9 3001 MOVLW 0x1 0AA 0226 SUBWF 0x26, W 0AB 30F5 MOVLW 0xf5 0AC 1903 BTFSC 0x3, 0x2 0AD 0225 SUBWF 0x25, W 0AE 1C03 BTFSS 0x3, 0 0AF 28B1 GOTO 0xb1 0B0 28B2 GOTO 0xb2 0B1 28B4 GOTO 0xb4 556: { 557: endschalter_oben = 0; //Flag zurücksetzen 0B2 1070 BCF 0x70, 0 0B3 28B4 GOTO 0xb4 558: } 559: 560: if (zustand == 1) 0B4 0878 MOVF 0x78, W 0B5 3A01 XORLW 0x1 0B6 1D03 BTFSS 0x3, 0x2 0B7 28B9 GOTO 0xb9 0B8 28BA GOTO 0xba 0B9 2919 GOTO 0x119 561: { 562: if ((taste_extern_aktiviert == 1) &&\ 0BA 1CF1 BTFSS 0x71, 0x1 0BB 28BD GOTO 0xbd 0BC 28BE GOTO 0xbe 0BD 28E7 GOTO 0xe7 0BE 19F1 BTFSC 0x71, 0x3 0BF 28C1 GOTO 0xc1 0C0 28C2 GOTO 0xc2 0C1 28E7 GOTO 0xe7 0C2 19F0 BTFSC 0x70, 0x3 0C3 28C5 GOTO 0xc5 0C4 28C6 GOTO 0xc6 0C5 28E7 GOTO 0xe7 0C6 1B70 BTFSC 0x70, 0x6 0C7 28C9 GOTO 0xc9 0C8 28CA GOTO 0xca 0C9 28E7 GOTO 0xe7 0CA 1BF0 BTFSC 0x70, 0x7 0CB 28CD GOTO 0xcd 0CC 28CE GOTO 0xce 0CD 28E7 GOTO 0xe7 0CE 1870 BTFSC 0x70, 0 0CF 28D1 GOTO 0xd1 0D0 28D2 GOTO 0xd2 0D1 28E7 GOTO 0xe7 0D2 18F0 BTFSC 0x70, 0x1 0D3 28D5 GOTO 0xd5 0D4 28D6 GOTO 0xd6 0D5 28E7 GOTO 0xe7 563: (taste_sicherheit == 0) &&\ 564: (ms500_aktiv == 0) &&\ 565: (taste_ende_oben == 0) &&\ 566: (taste_ende_unten == 0) &&\ 567: (endschalter_oben == 0) &&\ 568: (endschalter_unten == 0)) 569: { 570: if (richtung == 0) 0D6 1AF0 BTFSC 0x70, 0x5 0D7 28D9 GOTO 0xd9 0D8 28DA GOTO 0xda 0D9 28DE GOTO 0xde 571: { 572: tor_auf(); //Öffnen und Licht an 0DA 3185 MOVLP 0x5 0DB 2520 CALL 0x520 0DC 3180 MOVLP 0 0DD 28DE GOTO 0xde 573: } 574: if (richtung == 1) 0DE 1EF0 BTFSS 0x70, 0x5 0DF 28E1 GOTO 0xe1 0E0 28E2 GOTO 0xe2 0E1 28E7 GOTO 0xe7 575: { 576: tor_zu(); //Schließen und Licht an 0E2 3185 MOVLP 0x5 0E3 2517 CALL 0x517 0E4 3180 MOVLP 0 0E5 28E7 GOTO 0xe7 577: } 0E6 28E7 GOTO 0xe7 578: } 579: if ((endschalter_oben == 1) || (taste_ende_oben == 1)) //oberer Endschalter (Fehler) 0E7 1870 BTFSC 0x70, 0 0E8 28EA GOTO 0xea 0E9 28EB GOTO 0xeb 0EA 28EF GOTO 0xef 0EB 1F70 BTFSS 0x70, 0x6 0EC 28EE GOTO 0xee 0ED 28EF GOTO 0xef 0EE 28F5 GOTO 0xf5 580: { 581: richtung = 1; //neue Richtung "zu" 0EF 16F0 BSF 0x70, 0x5 582: zustand = 2; //Zustand: Steht oben 0F0 3002 MOVLW 0x2 0F1 00F7 MOVWF 0x77 0F2 0877 MOVF 0x77, W 0F3 00F8 MOVWF 0x78 0F4 28F5 GOTO 0xf5 583: } 584: if ((endschalter_unten == 1) || (taste_ende_unten == 1)) //unterer Endschalter (Fehler) 0F5 18F0 BTFSC 0x70, 0x1 0F6 28F8 GOTO 0xf8 0F7 28F9 GOTO 0xf9 0F8 28FD GOTO 0xfd 0F9 1FF0 BTFSS 0x70, 0x7 0FA 28FC GOTO 0xfc 0FB 28FD GOTO 0xfd 0FC 2903 GOTO 0x103 585: { 586: richtung = 0; //neue Richtung "auf" 0FD 12F0 BCF 0x70, 0x5 587: zustand = 3; //Zustand: Steht unten 0FE 3003 MOVLW 0x3 0FF 00F7 MOVWF 0x77 100 0877 MOVF 0x77, W 101 00F8 MOVWF 0x78 102 2903 GOTO 0x103 588: } 589: if (((endschalter_oben == 1) || (taste_ende_oben == 1)) &&\ 103 1870 BTFSC 0x70, 0 104 2906 GOTO 0x106 105 2907 GOTO 0x107 106 290B GOTO 0x10b 107 1F70 BTFSS 0x70, 0x6 108 290A GOTO 0x10a 109 290B GOTO 0x10b 10A 2919 GOTO 0x119 10B 18F0 BTFSC 0x70, 0x1 10C 290E GOTO 0x10e 10D 290F GOTO 0x10f 10E 2914 GOTO 0x114 10F 1FF0 BTFSS 0x70, 0x7 110 2912 GOTO 0x112 111 2913 GOTO 0x113 112 2919 GOTO 0x119 113 2914 GOTO 0x114 590: ((endschalter_unten == 1) || (taste_ende_unten == 1))) //beide Endschalter 591: { 592: tor_stop_null(); 114 3185 MOVLP 0x5 115 252F CALL 0x52f 116 3180 MOVLP 0 117 2919 GOTO 0x119 593: } 118 2919 GOTO 0x119 594: } 595: 596: if (zustand == 2) 119 0878 MOVF 0x78, W 11A 3A02 XORLW 0x2 11B 1D03 BTFSS 0x3, 0x2 11C 291E GOTO 0x11e 11D 291F GOTO 0x11f 11E 2945 GOTO 0x145 597: { 598: if ((taste_extern_aktiviert == 1) &&\ 11F 1CF1 BTFSS 0x71, 0x1 120 2922 GOTO 0x122 121 2923 GOTO 0x123 122 2937 GOTO 0x137 123 19F1 BTFSC 0x71, 0x3 124 2926 GOTO 0x126 125 2927 GOTO 0x127 126 2937 GOTO 0x137 127 19F0 BTFSC 0x70, 0x3 128 292A GOTO 0x12a 129 292B GOTO 0x12b 12A 2937 GOTO 0x137 12B 1BF0 BTFSC 0x70, 0x7 12C 292E GOTO 0x12e 12D 292F GOTO 0x12f 12E 2937 GOTO 0x137 12F 18F0 BTFSC 0x70, 0x1 130 2932 GOTO 0x132 131 2933 GOTO 0x133 132 2937 GOTO 0x137 599: (taste_sicherheit == 0) &&\ 600: (ms500_aktiv == 0) &&\ 601: (taste_ende_unten == 0) &&\ 602: (endschalter_unten == 0)) 603: { 604: tor_zu(); //Schließen und Licht an 133 3185 MOVLP 0x5 134 2517 CALL 0x517 135 3180 MOVLP 0 136 2937 GOTO 0x137 605: } 606: if ((endschalter_unten == 1) || (taste_ende_unten == 1)) 137 18F0 BTFSC 0x70, 0x1 138 293A GOTO 0x13a 139 293B GOTO 0x13b 13A 2940 GOTO 0x140 13B 1FF0 BTFSS 0x70, 0x7 13C 293E GOTO 0x13e 13D 293F GOTO 0x13f 13E 2945 GOTO 0x145 13F 2940 GOTO 0x140 607: { 608: tor_stop_null(); 140 3185 MOVLP 0x5 141 252F CALL 0x52f 142 3180 MOVLP 0 143 2945 GOTO 0x145 609: } 144 2945 GOTO 0x145 610: } 611: 612: if (zustand == 3) 145 0878 MOVF 0x78, W 146 3A03 XORLW 0x3 147 1D03 BTFSS 0x3, 0x2 148 294A GOTO 0x14a 149 294B GOTO 0x14b 14A 2971 GOTO 0x171 613: { 614: if ((taste_extern_aktiviert == 1) &&\ 14B 1CF1 BTFSS 0x71, 0x1 14C 294E GOTO 0x14e 14D 294F GOTO 0x14f 14E 2963 GOTO 0x163 14F 19F1 BTFSC 0x71, 0x3 150 2952 GOTO 0x152 151 2953 GOTO 0x153 152 2963 GOTO 0x163 153 19F0 BTFSC 0x70, 0x3 154 2956 GOTO 0x156 155 2957 GOTO 0x157 156 2963 GOTO 0x163 157 1B70 BTFSC 0x70, 0x6 158 295A GOTO 0x15a 159 295B GOTO 0x15b 15A 2963 GOTO 0x163 15B 1870 BTFSC 0x70, 0 15C 295E GOTO 0x15e 15D 295F GOTO 0x15f 15E 2963 GOTO 0x163 615: (taste_sicherheit == 0) &&\ 616: (ms500_aktiv == 0) &&\ 617: (taste_ende_oben == 0) &&\ 618: (endschalter_oben == 0)) 619: { 620: tor_auf(); //Öffnen und Licht an 15F 3185 MOVLP 0x5 160 2520 CALL 0x520 161 3180 MOVLP 0 162 2963 GOTO 0x163 621: } 622: if ((endschalter_oben == 1) || (taste_ende_oben == 1)) 163 1870 BTFSC 0x70, 0 164 2966 GOTO 0x166 165 2967 GOTO 0x167 166 296C GOTO 0x16c 167 1F70 BTFSS 0x70, 0x6 168 296A GOTO 0x16a 169 296B GOTO 0x16b 16A 2971 GOTO 0x171 16B 296C GOTO 0x16c 623: { 624: tor_stop_null(); 16C 3185 MOVLP 0x5 16D 252F CALL 0x52f 16E 3180 MOVLP 0 16F 2971 GOTO 0x171 625: } 170 2971 GOTO 0x171 626: } 627: 628: if (zustand == 4) 171 0878 MOVF 0x78, W 172 3A04 XORLW 0x4 173 1D03 BTFSS 0x3, 0x2 174 2976 GOTO 0x176 175 2977 GOTO 0x177 176 29D2 GOTO 0x1d2 629: { 630: if ((taste_extern_aktiviert == 1) &&\ 177 1CF1 BTFSS 0x71, 0x1 178 297A GOTO 0x17a 179 297B GOTO 0x17b 17A 298C GOTO 0x18c 17B 19F1 BTFSC 0x71, 0x3 17C 297E GOTO 0x17e 17D 297F GOTO 0x17f 17E 298C GOTO 0x18c 17F 19F0 BTFSC 0x70, 0x3 180 2982 GOTO 0x182 181 2983 GOTO 0x183 182 298C GOTO 0x18c 631: (taste_sicherheit == 0) &&\ 632: (ms500_aktiv == 0)) 633: { 634: tor_stop(); 183 3185 MOVLP 0x5 184 250E CALL 0x50e 185 3180 MOVLP 0 635: taste_extern_aktiviert = 0; //auf Tastendruck reagiert, Anforderung zurücksetzen 186 10F1 BCF 0x71, 0x1 636: richtung = 1; //neue Richtung "zu" 187 16F0 BSF 0x70, 0x5 637: zustand = 1; //neuen Zustand setzen 188 01F8 CLRF 0x78 189 1403 BSF 0x3, 0 18A 0DF8 RLF 0x78, F 18B 298C GOTO 0x18c 638: } 639: if ((strom_auf == 0) &&\ 18C 0020 MOVLB 0 18D 190C BTFSC 0xc, 0x2 18E 2990 GOTO 0x190 18F 2991 GOTO 0x191 190 29A2 GOTO 0x1a2 191 19F0 BTFSC 0x70, 0x3 192 2994 GOTO 0x194 193 2995 GOTO 0x195 194 29A2 GOTO 0x1a2 640: (ms500_aktiv == 0)) 641: { 642: tor_stop(); 195 3185 MOVLP 0x5 196 250E CALL 0x50e 197 3180 MOVLP 0 643: richtung = 1; //neue Richtung "zu" 198 16F0 BSF 0x70, 0x5 644: zustand = 1; //neuen Zustand setzen 199 01F8 CLRF 0x78 19A 1403 BSF 0x3, 0 19B 0DF8 RLF 0x78, F 645: fehlermeldung = 3; //Blinkanzahl für Fehlermeldung setzen 19C 3003 MOVLW 0x3 19D 00F7 MOVWF 0x77 19E 0877 MOVF 0x77, W 19F 00F9 MOVWF 0x79 646: timeout_blinken_start = 1; //Blinken starten 1A0 1572 BSF 0x72, 0x2 1A1 29A2 GOTO 0x1a2 647: } 648: if (taste_sicherheit == 1) 1A2 1DF1 BTFSS 0x71, 0x3 1A3 29A5 GOTO 0x1a5 1A4 29A6 GOTO 0x1a6 1A5 29B2 GOTO 0x1b2 649: { 650: tor_stop(); 1A6 3185 MOVLP 0x5 1A7 250E CALL 0x50e 1A8 3180 MOVLP 0 651: zustand = 1; //neuen Zustand setzen 1A9 01F8 CLRF 0x78 1AA 1403 BSF 0x3, 0 1AB 0DF8 RLF 0x78, F 652: fehlermeldung = 5; //Blinkanzahl für Fehlermeldung setzen 1AC 3005 MOVLW 0x5 1AD 00F7 MOVWF 0x77 1AE 0877 MOVF 0x77, W 1AF 00F9 MOVWF 0x79 653: timeout_blinken_start = 1; //Blinken starten 1B0 1572 BSF 0x72, 0x2 1B1 29B2 GOTO 0x1b2 654: } 655: if ((taste_ende_oben == 1) ||\ 1B2 1B70 BTFSC 0x70, 0x6 1B3 29B5 GOTO 0x1b5 1B4 29B6 GOTO 0x1b6 1B5 29BB GOTO 0x1bb 1B6 1C70 BTFSS 0x70, 0 1B7 29B9 GOTO 0x1b9 1B8 29BA GOTO 0x1ba 1B9 29C4 GOTO 0x1c4 1BA 29BB GOTO 0x1bb 656: (endschalter_oben == 1)) 657: { 658: tor_stop(); 1BB 3185 MOVLP 0x5 1BC 250E CALL 0x50e 1BD 3180 MOVLP 0 659: richtung = 1; //neue Richtung "zu" 1BE 16F0 BSF 0x70, 0x5 660: zustand = 2; //neuen Zustand setzen 1BF 3002 MOVLW 0x2 1C0 00F7 MOVWF 0x77 1C1 0877 MOVF 0x77, W 1C2 00F8 MOVWF 0x78 1C3 29C4 GOTO 0x1c4 661: } 662: if ((taste_ende_unten == 1) ||\ 1C4 1BF0 BTFSC 0x70, 0x7 1C5 29C7 GOTO 0x1c7 1C6 29C8 GOTO 0x1c8 1C7 29CD GOTO 0x1cd 1C8 1CF0 BTFSS 0x70, 0x1 1C9 29CB GOTO 0x1cb 1CA 29CC GOTO 0x1cc 1CB 29D2 GOTO 0x1d2 1CC 29CD GOTO 0x1cd 663: (endschalter_unten == 1)) 664: { 665: tor_stop_null(); 1CD 3185 MOVLP 0x5 1CE 252F CALL 0x52f 1CF 3180 MOVLP 0 1D0 29D2 GOTO 0x1d2 666: } 1D1 29D2 GOTO 0x1d2 667: } 668: 669: if (zustand == 5) 1D2 0878 MOVF 0x78, W 1D3 3A05 XORLW 0x5 1D4 1D03 BTFSS 0x3, 0x2 1D5 29D7 GOTO 0x1d7 1D6 29D8 GOTO 0x1d8 1D7 2A36 GOTO 0x236 670: { 671: if ((taste_extern_aktiviert == 1) &&\ 1D8 1CF1 BTFSS 0x71, 0x1 1D9 29DB GOTO 0x1db 1DA 29DC GOTO 0x1dc 1DB 29ED GOTO 0x1ed 1DC 19F1 BTFSC 0x71, 0x3 1DD 29DF GOTO 0x1df 1DE 29E0 GOTO 0x1e0 1DF 29ED GOTO 0x1ed 1E0 19F0 BTFSC 0x70, 0x3 1E1 29E3 GOTO 0x1e3 1E2 29E4 GOTO 0x1e4 1E3 29ED GOTO 0x1ed 672: (taste_sicherheit == 0) &&\ 673: (ms500_aktiv == 0)) 674: { 675: tor_stop(); 1E4 3185 MOVLP 0x5 1E5 250E CALL 0x50e 1E6 3180 MOVLP 0 676: taste_extern_aktiviert = 0; //auf Tastendruck reagiert, Anforderung zurücksetzen 1E7 10F1 BCF 0x71, 0x1 677: richtung = 1; //neue Richtung "zu" 1E8 16F0 BSF 0x70, 0x5 678: zustand = 1; //neuen Zustand setzen 1E9 01F8 CLRF 0x78 1EA 1403 BSF 0x3, 0 1EB 0DF8 RLF 0x78, F 1EC 29ED GOTO 0x1ed 679: } 680: if ((strom_zu == 0) &&\ 1ED 0020 MOVLB 0 1EE 180D BTFSC 0xd, 0 1EF 29F1 GOTO 0x1f1 1F0 29F2 GOTO 0x1f2 1F1 2A04 GOTO 0x204 1F2 19F0 BTFSC 0x70, 0x3 1F3 29F5 GOTO 0x1f5 1F4 29F6 GOTO 0x1f6 1F5 2A04 GOTO 0x204 681: (ms500_aktiv == 0)) 682: { 683: tor_stop(); 1F6 3185 MOVLP 0x5 1F7 250E CALL 0x50e 1F8 3180 MOVLP 0 684: richtung = 0; //neue Richtung "zu" 1F9 12F0 BCF 0x70, 0x5 685: zustand = 6; //neuen Zustand setzen 1FA 3006 MOVLW 0x6 1FB 00F7 MOVWF 0x77 1FC 0877 MOVF 0x77, W 1FD 00F8 MOVWF 0x78 686: fehlermeldung = 4; //Blinkanzahl für Fehlermeldung setzen 1FE 3004 MOVLW 0x4 1FF 00F7 MOVWF 0x77 200 0877 MOVF 0x77, W 201 00F9 MOVWF 0x79 687: timeout_blinken_start = 1; //Blinken starten 202 1572 BSF 0x72, 0x2 203 2A04 GOTO 0x204 688: } 689: if (taste_sicherheit == 1) 204 1DF1 BTFSS 0x71, 0x3 205 2A07 GOTO 0x207 206 2A08 GOTO 0x208 207 2A16 GOTO 0x216 690: { 691: tor_stop(); 208 3185 MOVLP 0x5 209 250E CALL 0x50e 20A 3180 MOVLP 0 692: richtung = 0; //neue Richtung "auf" 20B 12F0 BCF 0x70, 0x5 693: zustand = 6; //neuen Zustand setzen 20C 3006 MOVLW 0x6 20D 00F7 MOVWF 0x77 20E 0877 MOVF 0x77, W 20F 00F8 MOVWF 0x78 694: fehlermeldung = 5; //Blinkanzahl für Fehlermeldung setzen 210 3005 MOVLW 0x5 211 00F7 MOVWF 0x77 212 0877 MOVF 0x77, W 213 00F9 MOVWF 0x79 695: timeout_blinken_start = 1; //Blinken starten 214 1572 BSF 0x72, 0x2 215 2A16 GOTO 0x216 696: } 697: if ((taste_ende_unten == 1) ||\ 216 1BF0 BTFSC 0x70, 0x7 217 2A19 GOTO 0x219 218 2A1A GOTO 0x21a 219 2A1F GOTO 0x21f 21A 1CF0 BTFSS 0x70, 0x1 21B 2A1D GOTO 0x21d 21C 2A1E GOTO 0x21e 21D 2A28 GOTO 0x228 21E 2A1F GOTO 0x21f 698: (endschalter_unten == 1)) 699: { 700: tor_stop(); 21F 3185 MOVLP 0x5 220 250E CALL 0x50e 221 3180 MOVLP 0 701: richtung = 0; //neue Richtung "auf" 222 12F0 BCF 0x70, 0x5 702: zustand = 3; //neuen Zustand setzen 223 3003 MOVLW 0x3 224 00F7 MOVWF 0x77 225 0877 MOVF 0x77, W 226 00F8 MOVWF 0x78 227 2A28 GOTO 0x228 703: } 704: if ((taste_ende_oben == 1) ||\ 228 1B70 BTFSC 0x70, 0x6 229 2A2B GOTO 0x22b 22A 2A2C GOTO 0x22c 22B 2A31 GOTO 0x231 22C 1C70 BTFSS 0x70, 0 22D 2A2F GOTO 0x22f 22E 2A30 GOTO 0x230 22F 2A36 GOTO 0x236 230 2A31 GOTO 0x231 705: (endschalter_oben == 1)) 706: { 707: tor_stop_null(); 231 3185 MOVLP 0x5 232 252F CALL 0x52f 233 3180 MOVLP 0 234 2A36 GOTO 0x236 708: } 235 2A36 GOTO 0x236 709: } 710: 711: if ((zustand == 6) &&\ 236 0878 MOVF 0x78, W 237 3A06 XORLW 0x6 238 1D03 BTFSS 0x3, 0x2 239 2A3B GOTO 0x23b 23A 2A3C GOTO 0x23c 23B 2A49 GOTO 0x249 23C 19F0 BTFSC 0x70, 0x3 23D 2A3F GOTO 0x23f 23E 2A40 GOTO 0x240 23F 2A49 GOTO 0x249 712: (ms500_aktiv == 0)) 713: { 714: tor_auf(); //Öffnen und Licht an 240 3185 MOVLP 0x5 241 2520 CALL 0x520 242 3180 MOVLP 0 715: timeout_fuenf_start = 1; //Fünf Sekunden auf fahren 243 16F2 BSF 0x72, 0x5 716: zustand = 7; //neuen Zustand setzen 244 3007 MOVLW 0x7 245 00F7 MOVWF 0x77 246 0877 MOVF 0x77, W 247 00F8 MOVWF 0x78 248 2A49 GOTO 0x249 717: } 718: 719: if (zustand == 7) 249 0878 MOVF 0x78, W 24A 3A07 XORLW 0x7 24B 1D03 BTFSS 0x3, 0x2 24C 2A4E GOTO 0x24e 24D 2A4F GOTO 0x24f 24E 2AA4 GOTO 0x2a4 720: { 721: if ((taste_extern_aktiviert == 1) &&\ 24F 1CF1 BTFSS 0x71, 0x1 250 2A52 GOTO 0x252 251 2A53 GOTO 0x253 252 2A60 GOTO 0x260 253 19F0 BTFSC 0x70, 0x3 254 2A56 GOTO 0x256 255 2A57 GOTO 0x257 256 2A60 GOTO 0x260 722: (ms500_aktiv == 0)) 723: { 724: tor_stop(); 257 3185 MOVLP 0x5 258 250E CALL 0x50e 259 3180 MOVLP 0 725: taste_extern_aktiviert = 0; //auf Tastendruck reagiert, Anforderung zurücksetzen 25A 10F1 BCF 0x71, 0x1 726: zustand = 1; //neuen Zustand setzen 25B 01F8 CLRF 0x78 25C 1403 BSF 0x3, 0 25D 0DF8 RLF 0x78, F 727: timeout_blinken_start = 1; //Blinken starten 25E 1572 BSF 0x72, 0x2 25F 2A60 GOTO 0x260 728: } 729: if ((taste_ende_oben == 1) ||\ 260 1B70 BTFSC 0x70, 0x6 261 2A63 GOTO 0x263 262 2A64 GOTO 0x264 263 2A69 GOTO 0x269 264 1C70 BTFSS 0x70, 0 265 2A67 GOTO 0x267 266 2A68 GOTO 0x268 267 2A73 GOTO 0x273 268 2A69 GOTO 0x269 730: (endschalter_oben == 1)) 731: { 732: tor_stop(); 269 3185 MOVLP 0x5 26A 250E CALL 0x50e 26B 3180 MOVLP 0 733: richtung = 1; //neue Richtung "zu" 26C 16F0 BSF 0x70, 0x5 734: zustand = 2; //neuen Zustand setzen 26D 3002 MOVLW 0x2 26E 00F7 MOVWF 0x77 26F 0877 MOVF 0x77, W 270 00F8 MOVWF 0x78 735: timeout_blinken_start = 1; //Blinken starten 271 1572 BSF 0x72, 0x2 272 2A73 GOTO 0x273 736: } 737: if ((taste_ende_unten == 1) ||\ 273 1BF0 BTFSC 0x70, 0x7 274 2A76 GOTO 0x276 275 2A77 GOTO 0x277 276 2A7C GOTO 0x27c 277 1CF0 BTFSS 0x70, 0x1 278 2A7A GOTO 0x27a 279 2A7B GOTO 0x27b 27A 2A80 GOTO 0x280 27B 2A7C GOTO 0x27c 738: (endschalter_unten == 1)) 739: { 740: tor_stop_null(); 27C 3185 MOVLP 0x5 27D 252F CALL 0x52f 27E 3180 MOVLP 0 27F 2A80 GOTO 0x280 741: } 742: if (timeout_fuenf == 1) //Fünf Sekunden hochfahren beendet 280 1DF2 BTFSS 0x72, 0x3 281 2A83 GOTO 0x283 282 2A84 GOTO 0x284 283 2A8D GOTO 0x28d 743: { 744: tor_stop(); 284 3185 MOVLP 0x5 285 250E CALL 0x50e 286 3180 MOVLP 0 745: zustand = 1; //Zustand setzen 287 01F8 CLRF 0x78 288 1403 BSF 0x3, 0 289 0DF8 RLF 0x78, F 746: timeout_blinken_start = 1; //Blinken starten 28A 1572 BSF 0x72, 0x2 747: timeout_fuenf = 0; //Flag zurücksetzen 28B 11F2 BCF 0x72, 0x3 28C 2A8D GOTO 0x28d 748: } 749: if ((strom_auf == 0) &&\ 28D 0020 MOVLB 0 28E 190C BTFSC 0xc, 0x2 28F 2A91 GOTO 0x291 290 2A92 GOTO 0x292 291 2AA4 GOTO 0x2a4 292 19F0 BTFSC 0x70, 0x3 293 2A95 GOTO 0x295 294 2A96 GOTO 0x296 295 2AA4 GOTO 0x2a4 750: (ms500_aktiv == 0)) 751: { 752: tor_stop(); 296 3185 MOVLP 0x5 297 250E CALL 0x50e 298 3180 MOVLP 0 753: richtung = 1; //neue Richtung "zu" 299 16F0 BSF 0x70, 0x5 754: zustand = 1; //neuen Zustand setzen 29A 01F8 CLRF 0x78 29B 1403 BSF 0x3, 0 29C 0DF8 RLF 0x78, F 755: fehlermeldung = 3; //Blinkanzahl für Fehlermeldung setzen 29D 3003 MOVLW 0x3 29E 00F7 MOVWF 0x77 29F 0877 MOVF 0x77, W 2A0 00F9 MOVWF 0x79 756: timeout_blinken_start = 1; //Blinken starten 2A1 1572 BSF 0x72, 0x2 2A2 2AA4 GOTO 0x2a4 757: } 2A3 2AA4 GOTO 0x2a4 758: } 759: 760: if (timeout_motor == 1) //Wartezeit für Relaisüberprüfung abgelaufen 2A4 1C73 BTFSS 0x73, 0 2A5 2AA7 GOTO 0x2a7 2A6 2AA8 GOTO 0x2a8 2A7 2B1F GOTO 0x31f 761: { 762: if ((relais_auf != spannung_auf) || (relais_zu != spannung_zu)) //Test ob IST = SOLL 2A8 0020 MOVLB 0 2A9 1B8C BTFSC 0xc, 0x7 2AA 2AAC GOTO 0x2ac 2AB 2AAE GOTO 0x2ae 2AC 3001 MOVLW 0x1 2AD 2AAF GOTO 0x2af 2AE 3000 MOVLW 0 2AF 00F7 MOVWF 0x77 2B0 0022 MOVLB 0x2 2B1 198D BTFSC 0xd, 0x3 2B2 2AB4 GOTO 0x2b4 2B3 2AB6 GOTO 0x2b6 2B4 3001 MOVLW 0x1 2B5 2AB7 GOTO 0x2b7 2B6 3000 MOVLW 0 2B7 0677 XORWF 0x77, W 2B8 1D03 BTFSS 0x3, 0x2 2B9 2ABB GOTO 0x2bb 2BA 2ABC GOTO 0x2bc 2BB 2AD0 GOTO 0x2d0 2BC 0020 MOVLB 0 2BD 180C BTFSC 0xc, 0 2BE 2AC0 GOTO 0x2c0 2BF 2AC2 GOTO 0x2c2 2C0 3001 MOVLW 0x1 2C1 2AC3 GOTO 0x2c3 2C2 3000 MOVLW 0 2C3 00F7 MOVWF 0x77 2C4 0022 MOVLB 0x2 2C5 1A8D BTFSC 0xd, 0x5 2C6 2AC8 GOTO 0x2c8 2C7 2ACA GOTO 0x2ca 2C8 3001 MOVLW 0x1 2C9 2ACB GOTO 0x2cb 2CA 3000 MOVLW 0 2CB 0677 XORWF 0x77, W 2CC 1903 BTFSC 0x3, 0x2 2CD 2ACF GOTO 0x2cf 2CE 2AD0 GOTO 0x2d0 2CF 2B1D GOTO 0x31d 763: { 764: if ((taste_ende_oben == 0) &&\ 2D0 1B70 BTFSC 0x70, 0x6 2D1 2AD3 GOTO 0x2d3 2D2 2AD4 GOTO 0x2d4 2D3 2AEE GOTO 0x2ee 2D4 1BF0 BTFSC 0x70, 0x7 2D5 2AD7 GOTO 0x2d7 2D6 2AD8 GOTO 0x2d8 2D7 2AEE GOTO 0x2ee 2D8 1870 BTFSC 0x70, 0 2D9 2ADB GOTO 0x2db 2DA 2ADC GOTO 0x2dc 2DB 2AEE GOTO 0x2ee 2DC 18F0 BTFSC 0x70, 0x1 2DD 2ADF GOTO 0x2df 2DE 2AE0 GOTO 0x2e0 2DF 2AEE GOTO 0x2ee 765: (taste_ende_unten == 0) &&\ 766: (endschalter_oben == 0) &&\ 767: (endschalter_unten == 0)) 768: { 769: tor_stop(); 2E0 3185 MOVLP 0x5 2E1 250E CALL 0x50e 2E2 3180 MOVLP 0 770: richtung = richtung ^ 1; //Richtung umdrehen 2E3 3020 MOVLW 0x20 2E4 06F0 XORWF 0x70, F 771: zustand = 1; //neuen Zustand setzen 2E5 01F8 CLRF 0x78 2E6 1403 BSF 0x3, 0 2E7 0DF8 RLF 0x78, F 772: fehlermeldung = 6; //Blinkanzahl für Fehlermeldung setzen 2E8 3006 MOVLW 0x6 2E9 00F7 MOVWF 0x77 2EA 0877 MOVF 0x77, W 2EB 00F9 MOVWF 0x79 773: timeout_blinken_start = 1; //Blinken starten 2EC 1572 BSF 0x72, 0x2 2ED 2AEE GOTO 0x2ee 774: } 775: if ((taste_ende_oben == 1) ||\ 2EE 1B70 BTFSC 0x70, 0x6 2EF 2AF1 GOTO 0x2f1 2F0 2AF2 GOTO 0x2f2 2F1 2AF7 GOTO 0x2f7 2F2 1C70 BTFSS 0x70, 0 2F3 2AF5 GOTO 0x2f5 2F4 2AF6 GOTO 0x2f6 2F5 2B05 GOTO 0x305 2F6 2AF7 GOTO 0x2f7 776: (endschalter_oben == 1)) 777: { 778: tor_stop(); 2F7 3185 MOVLP 0x5 2F8 250E CALL 0x50e 2F9 3180 MOVLP 0 779: richtung = 1; //Richtung "zu" 2FA 16F0 BSF 0x70, 0x5 780: zustand = 2; //neuen Zustand setzen 2FB 3002 MOVLW 0x2 2FC 00F7 MOVWF 0x77 2FD 0877 MOVF 0x77, W 2FE 00F8 MOVWF 0x78 781: fehlermeldung = 6; //Blinkanzahl für Fehlermeldung setzen 2FF 3006 MOVLW 0x6 300 00F7 MOVWF 0x77 301 0877 MOVF 0x77, W 302 00F9 MOVWF 0x79 782: timeout_blinken_start = 1; //Blinken starten 303 1572 BSF 0x72, 0x2 304 2B05 GOTO 0x305 783: } 784: if ((taste_ende_unten == 1) ||\ 305 1BF0 BTFSC 0x70, 0x7 306 2B08 GOTO 0x308 307 2B09 GOTO 0x309 308 2B0E GOTO 0x30e 309 1CF0 BTFSS 0x70, 0x1 30A 2B0C GOTO 0x30c 30B 2B0D GOTO 0x30d 30C 2B1D GOTO 0x31d 30D 2B0E GOTO 0x30e 785: (endschalter_unten == 1)) 786: { 787: tor_stop(); 30E 3185 MOVLP 0x5 30F 250E CALL 0x50e 310 3180 MOVLP 0 788: richtung = 0; //Richtung "auf" 311 12F0 BCF 0x70, 0x5 789: zustand = 3; //neuen Zustand setzen 312 3003 MOVLW 0x3 313 00F7 MOVWF 0x77 314 0877 MOVF 0x77, W 315 00F8 MOVWF 0x78 790: fehlermeldung = 6; //Blinkanzahl für Fehlermeldung setzen 316 3006 MOVLW 0x6 317 00F7 MOVWF 0x77 318 0877 MOVF 0x77, W 319 00F9 MOVWF 0x79 791: timeout_blinken_start = 1; //Blinken starten 31A 1572 BSF 0x72, 0x2 31B 2B1D GOTO 0x31d 792: } 31C 2B1D GOTO 0x31d 793: } 794: timeout_motor = 0; //Flag zurücksetzen 31D 1073 BCF 0x73, 0 31E 2B1F GOTO 0x31f 795: } 796: 797: if (timeout_bewegung == 1) //Zeit abgelaufen ohne Endschalter erreicht 31F 1F71 BTFSS 0x71, 0x6 320 2B22 GOTO 0x322 321 2B23 GOTO 0x323 322 2B31 GOTO 0x331 798: { 799: tor_stop(); 323 3185 MOVLP 0x5 324 250E CALL 0x50e 325 3180 MOVLP 0 800: richtung = richtung ^ 1; //Richtung umdrehen 326 3020 MOVLW 0x20 327 06F0 XORWF 0x70, F 801: zustand = 1; //neuen Zustand setzen 328 01F8 CLRF 0x78 329 1403 BSF 0x3, 0 32A 0DF8 RLF 0x78, F 802: fehlermeldung = 7; //Blinkanzahl für Fehlermeldung setzen 32B 3007 MOVLW 0x7 32C 00F7 MOVWF 0x77 32D 0877 MOVF 0x77, W 32E 00F9 MOVWF 0x79 803: timeout_blinken_start = 1; //Blinken starten 32F 1572 BSF 0x72, 0x2 330 2B31 GOTO 0x331 804: } 805: CLRWDT(); 331 0064 CLRWDT 332 2862 GOTO 0x62 806: } 807: } 334 2818 GOTO 0x18 808: 809: 810: 811: /*I N T E R R U P T*/ 812: 813: 814: /* Interrupthandling*/ 815: void interrupt t0(void) 816: { 004 3180 MOVLP 0 005 0020 MOVLB 0 006 087F MOVF 0x7f, W 007 00F5 MOVWF 0x75 817: timer_0++; 008 3001 MOVLW 0x1 009 00F4 MOVWF 0x74 00A 0874 MOVF 0x74, W 00B 07BB ADDWF 0x3b, F 818: if (timer_0 >= 4) //1 ms vorbei 00C 3004 MOVLW 0x4 00D 023B SUBWF 0x3b, W 00E 1C03 BTFSS 0x3, 0 00F 2811 GOTO 0x11 010 2812 GOTO 0x12 011 2814 GOTO 0x14 819: { 820: timer_0 = 0; //Zähler zurücksetzen 012 01BB CLRF 0x3b 821: millisekunde = 1; //Flag für Millisekunde setzen 013 1570 BSF 0x70, 0x2 822: } 823: TMR0IF = 0; //Interrupt-Flag löschen 014 110B BCF 0xb, 0x2 824: return; 825: } 015 0875 MOVF 0x75, W