'**************************************************************** '* Name : Nachlauf Software * '* Autor : Tomtom DL1MFK * '* Notice : Copyright (c) 2009 * '* : All Rights Reserved * '* Datum : 29.09.2009 * '* Version : V0.4a * '* Bemer- : Sync-Nachlaufsteuerung für Zugspitze * '* kungen : nach 30 60 90 Sekunden schaltet ein Relais mehr ab* '* 'PIC: 16F628A 'Releis: V23100 'INP von PIC heißt: LOW=Kurzgeschlossen mit masse HIGH=hängt in Luft oder auf +5 'Neuprogramierung soll so aussehen: 'Port 1. 90sec rele soll nicht nur 90sec aktiv bleiben, sonder solange INP auf LOW ist, und danach wenn ' INP auf HIGH geht noch 90sec nachlaufen, dann fehlt runter. In nachlaufzeit hat PIC INP LOW zustand priorität, ' das heißt wenn ein sync kommt nachlaufzeit wird unterbrochen und fängt von vorne an. 'Port 2. 60sec 'Port 3. 22sec '* : * '* : * '* : * '* : * '**************************************************************** DEFINE OSC 4 '****************************************************** '* 'Variable * '****************************************************** i var word Port_Flags var byte Pin_Status var Port_Flags.0 Pin_Status_alt var Port_Flags.1 Sync_an var Port_Flags.2 Trigger_passiert var Port_Flags.3 Syncreset var Port_Flags.4 wsave var byte $20 system ssave var byte bank0 system psave var byte bank0 system goto Init '****************************************************** '* ISR * '****************************************************** DEFINE INTHAND myint ' Assembly language interrupt handler asm ; Save W, STATUS and PCLATH registers myint: movwf wsave swapf STATUS, W clrf STATUS movwf ssave movf PCLATH, W movwf psave ; Insert interrupt code here ; Save and restore FSR if used Endasm Trigger_passiert = 1 'Flag für ISR-Ausgelöst setzen Pin_status_alt = Pin_Status 'alten Sync-Zustand sichern Pin_status = portb.0 If Pin_status_alt = 1 and Pin_status = 0 then Sync_an = 1 'Sync liegt an endif asm ; Restore PCLATH, STATUS and W registers movf psave, W movwf PCLATH swapf ssave, W movwf STATUS swapf wsave, F swapf wsave, W endasm INTCON = %10010000 'Enable INTE asm retfie endasm '****************************************************** '* Initialisierung * '****************************************************** Init: OPTION_REG=%00000000 ' PORT B auf Pullups geschaltet CMCON = 7 ' Schaltet die PortA-Pins auf I/O, OPTION_REG.6=0 'Trigger suf fallende Flanke INTCON = %10010000 'Enable INTE TRISB = %00000001 PORTB.5=0 ' Relais aus PORTB.6=0 ' Relais aus PORTB.7=0 ' Relais aus Port_Flags = 0 ' alle Flags aus Pin_status = Portb.0 Pause 100 ' Abwarten ' PORTB.5 = 1 ' PORTB.6 = 1 ' PORTB.7 = 1 ' Pause 1000 ' PORTB.5 = 0 ' PORTB.6 = 0 ' PORTB.7 = 0 ' Pause 1000 ' PORTB.5 = 1 ' PORTB.6 = 1 ' PORTB.7 = 1 ' Pause 1000 ' PORTB.5 = 0 ' PORTB.6 = 0 ' PORTB.7 = 0 ' Pause 1000 ' PORTB.5 = 1 ' PORTB.6 = 1 ' PORTB.7 = 1 ' Pause 1000 ' PORTB.5 = 0 ' PORTB.6 = 0 ' PORTB.7 = 0 ' Pause 1000 '****************************************************** '* Hauptprogramm * '****************************************************** loop: If Trigger_passiert = 1 then Trigger_passiert = 0 'Rücksetzen 'wenn Sync anliegt dann alles an if sync_an = 1 then Sync_an = 0 If portb.7 = 1 then goto loop ' andere Ports nicht mehr einschalten wenn ' Sender noch ein PORTB.5 = 1 PORTB.6 = 1 PORTB.7 = 1 For i = 1 to 22 'nach 22 sec CW-Kennung aus Pause 1000 next PORTB.5=0 ' Relais aus nach 22 sec For i = 1 to 38 Pause 1000 next PORTB.6=0 ' Relais aus nach 60 sec endif endif 'Wenn Sync abgefallen und Sender ein dann Sender aus nach 90 sec if portb.7 = 1 and portb.0 = 1 then For i = 1 to 90 'Falls Sync wieder da ist wieder einschalten if Trigger_passiert=1 then Trigger_passiert=0 goto loop endif Pause 1000 next PORTB.7=0 ' Relais also Sender aus endif Goto loop ' Hauptschleife end