;************************************************************** ; ; -=[ KFZ-Innenlichtdimmer ]=- V2.07 24.09.2003 ; ; (C) by CoolChip ; ;************************************************************** ; ; Taktfrequenz: 20MHz ; ; Pinbelegung ; ---------------------------------- ; PORTA: 0 * ; 1 * ; 2 * ; 3 * ; 4 * ; 5 * ; 6 OSC2 ; 7 OSC1 ; ; PORTB: 0 INP Anlasser an(1) - aus(0) ; 1 INP Tür auf(1) - zu(0) ; 2 * ; 3 PWM *LICHT* ; 4 IN Schloss_auf aktiv(1) - nope(0) ; 5 IN Schloss_zu aktiv(1) - nope(0) ; 6 IN SU Schlüssel steckt(1) - abgezogen(0) ; 7 OUT Status LED ; ;************************************************************** ; Befehle für COMPILER oder BURNER ; processor 16f628 #include ERRORLEVEL -302 ;SUPPRESS BANK SELECTION MESSAGES ; ; Boden on, Code Protection off, Data Protectioon off, Power-on-Timer on, ; Watchdog off, Low-Power-Programming off, Master Cear off, HS-Oscillator ; __CONFIG _BODEN_ON & _CP_OFF & _DATA_CP_OFF & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _HS_OSC ; ;************************************************************** ; Variablen festlegen 20h ... 5Fh ; counter equ 0x20 ; Interrupt-Counter light equ 0x21 ; Abdimm-Counter #2 xflags equ 0x22 ; Platz für zusätzliche Flags W_save equ 0x23 ; Backup für Akku Status_save equ 0x24 ; Backup für Status-Bits loops equ 0x26 ; Zähler für Warteschleife loops2 equ 0x27 ; Zähler für untere Warteschleife ; Flag bits (FLAGS) ; #define motor xflags, 0 ; Motorzustand-Flag ; ;*********************************************************************** ; Sprung zum Programmanfang org 0x0000 goto init ;*********************************************************************** ; Interruptroutine org 0x0004 movwf W_save ; erstmal Backup machen swapf STATUS,W bcf STATUS, RP0 ; Bank0 movwf Status_save ; --eigentliche Interruptroutine-- incf counter, f ; wenn counter überläuft sind 3,33 sec um btfsc STATUS, Z ; übergelaufen? incf light, f ; ja - light um 1 erhöhen bcf INTCON, T0IF ; interrupt löschen ; --------------------------------- swapf Status_save, w ; Backup einspielen ;) movwf STATUS swapf W_save,f swapf W_save,w retfie ; ;************************************************************** ; Initialisierung ; init ; ** Port für LED vorbereiten ** bsf STATUS, RP0 ; Bank1 movlw B'01111111' ; PortB RB7 Output movwf TRISB bcf STATUS, RP0 ; Bank0 bcf PORTB, RB7 ; LED ausschalten ; ** PWM vorbereiten ** ; Frequenz auf 78,12 kHz einstellen bsf STATUS,RP0 ; Bank1 movlw d'63' movwf PR2 ; 78,12 kHz bcf STATUS,RP0 ; Bank0 ; Tastverhältnis auf 0% einstellen movlw d'0' movwf CCPR1L ; 0% ; PWM MODE mit CCP1 initialisieren clrf CCP1CON ; CCP1-Modus aus bsf CCP1CON,CCP1M3 ; CCP1-Modus PWM-Mode bsf CCP1CON,CCP1M2 ; RC2/CCP1 Hauptschalter an bsf STATUS,RP0 ; Bank1 bcf TRISB, 3 ; TRISB<3> clear enables Output bcf STATUS,RP0 ; Bank0 ; Vorteiler 1:1 und Timer2 einschalten bcf T2CON,T2CKPS0 ; Vorteiler 1:1 bcf T2CON,T2CKPS1 bsf T2CON,TMR2ON ; Timer2 ein ; ** Timer0 vorbereiten - für Interrupt/Dimm-aus Zeit ** bsf STATUS, RP0 ; Bank 1 bcf OPTION_REG, T0CS ; interner Takt/4 bcf OPTION_REG, PSA ; Vorteiler am Timer0 an bsf OPTION_REG, PS2 bsf OPTION_REG, PS1 bsf OPTION_REG, PS0 ; Vorteiler 256:1 bcf STATUS, RP0 ; Bank 0 ; ** Sonstige Register/Flags löschen ** clrf counter ; den Abdimm-Counter resetten clrf light ; Lichtstatus auf 0 bcf motor ; Motorstatusbit auf 0 ; ** ENDE der Initalisierung - Signal movlw d'32' ; Tastverhältnis auf 50% einstellen movwf CCPR1L bsf PORTB, RB7 ; LED anschalten call pause250 bcf PORTB, RB7 ; LED ausschalten call pause250 bsf PORTB, RB7 ; LED anschalten call pause250 bcf PORTB, RB7 ; LED ausschalten call pause250 bsf PORTB, RB7 ; LED anschalten call pause250 bcf PORTB, RB7 ; LED ausschalten movlw d'0' ; Tastverhältnis auf 0% einstellen movwf CCPR1L call pause250 ; kleine Pause call pause250 call pause250 call pause250 ; ;************************************************************** ; PROGRAMMTEIL #1 *Warten auf anschalten* ; waitforon ; Abfrage btfsc PORTB, 0 ; Anlasser an? goto motor_an btfsc PORTB, 1 ; Tür auf? goto tuer_auf btfsc PORTB, 4 ; Aufschließen? goto schloss_auf btfsc PORTB, 5 ; Zuschließen? goto schloss_zu btfsc motor ; Motor war/ist an? goto key_abfrage goto waitforon ; Nein! key_abfrage btfss PORTB, 6 ; Schlüssel abgezogen? goto key_out goto waitforon ; Nein! ; ;************************************************************** ; Anschalt-Events ; ; Motor wird gestartet motor_an bsf motor ; Motor ist an goto waitforon ; Tür ist auf tuer_auf call pause250 ; Warten btfss PORTB, 1 ; Immernoch auf goto waitforon ; Ne, war Wackler call dimm_an btfsc motor goto zwischen_prg goto l_timer ; Schloss wird geöffnet schloss_auf call dimm_an goto l_timer ; Schloss wird geschlossen schloss_zu call pause250 call pause250 call pause250 call f_flash call f_flash call f_flash goto waitforon ; Schlüssel wurde abgezogen - Motor war vorher an key_out call dimm_an bcf motor ; Motor ist aus goto l_timer ; ;************************************************************** ; ZWISCHENPROGRAMM *Tür auf während Motor an* ; zwischen_prg bsf motor ; Motor ist an ; Abfrage: btfss PORTB, 1 ; Tür zu? goto tuer_zu3 btfss PORTB, 6 ; Schlüssel abgezogen? goto key_out3 goto zwischen_prg ; Nein! ; ;************************************************************** ; Exit-Events *Zwischenprogramm* ; ; Tür ist wieder zu tuer_zu3 call dimm_faus goto waitforon ; Motor wurde abgeschaltet key_out3 bcf motor ; Motor ist aus goto l_timer ; ;************************************************************** ; PROGRAMMTEIL #2 *Warten auf abschalten* ; l_timer clrf TMR0 ; Timer0 auf 0 Setzen call int_an ; Interrupt für Timer0 einschalten waitforoff ; Abfrage: btfsc PORTB, 1 ; Tür noch auf? goto tuer_auf2 btfsc PORTB, 4 ; Aufschließen? goto schloss_auf2 btfsc PORTB, 5 ; Zuschließen? goto schloss_zu2 btfsc PORTB, 0 ; Anlasser an? goto motor_an2 movlw d'5' ; Wert für Licht-an-Zeit subwf light, w btfsc STATUS, Z ; 13 sec um? goto verz_absch ; Ja goto waitforoff ; Nein! ; ;************************************************************** ; Auschalt-Events ; ; Tür geht/ist auf auf während Licht an tuer_auf2 btfsc PORTB, 0 ; Anlasser an? call zwischen_prg clrf light goto waitforoff ; Schloss wird geöffnet während Licht an schloss_auf2 clrf light goto waitforoff ; Schloss wird geschlossen schloss_zu2 call int_aus call dimm_aus clrf light call pause250 call f_flash call f_flash call f_flash goto waitforon ; Motor wird gestartet motor_an2 call int_aus call dimm_faus bsf motor ; Motor ist an clrf light goto waitforon ; Licht war lange genug an verz_absch call int_aus call dimm_aus clrf light goto waitforon ; ;************************************************************** ; Dimmer-Routinen ; ; Andimmen dimm_an incf CCPR1L, f ; PWM einstellen call pause50 movlw d'64' subwf CCPR1L, w btfss STATUS, Z ; Zero Flag an? goto dimm_an ; Nein! bsf PORTB, RB7 ; LED anschalten return ; Schnell Andimmen dimm_fan movlw d'4' addwf CCPR1L, f ; PWM einstellen call pause50 movlw d'64' subwf CCPR1L, w btfss STATUS, Z ; Zero Flag an? goto dimm_fan ; Nein! bsf PORTB, RB7 ; LED anschalten return ; Ausdimmen dimm_aus decf CCPR1L, f ; PWM einstellen call pause50 btfss STATUS, Z ; Zero Flag an? goto dimm_aus ; Nein! bcf PORTB, RB7 ; LED ausschalten return ; Schnell Ausdimmen dimm_faus movlw d'4' subwf CCPR1L, f ; PWM einstellen call pause50 btfss STATUS, Z ; Zero Flag an? goto dimm_faus ; Nein! bcf PORTB, RB7 ; LED ausschalten return ; ;************************************************************** ; Zusatz-Module ; ; Frankreich-Blinker f_flash ; Kurz aufblitzen clrf CCPR1L ; Lampe aus bcf PORTB, RB7 ; LED ausschalten movlw d'64' ; Lampe an movwf CCPR1L bsf PORTB, RB7 ; LED anschalten call pause50 ; Pause call pause50 clrf CCPR1L ; Lampe aus bcf PORTB, RB7 ; LED ausschalten ; Kurze Pause call pause50 ; Auf die Hälfte hochdimmen ff_andimm movlw d'4' addwf CCPR1L, f ; PWM einstellen call pause50 movlw d'32' subwf CCPR1L, w btfss STATUS, Z ; Zero Flag an? goto ff_andimm ; Nein! bsf PORTB, RB7 ; LED anschalten ; Kurze Pause call pause50 ; Wieder abdimmen ff_abdimm movlw d'4' subwf CCPR1L, f ; PWM einstellen call pause50 btfss STATUS, Z ; Zero Flag an? goto ff_abdimm ; Nein! bcf PORTB, RB7 ; LED ausschalten ; Zurück zum Hauptprogramm return ; ;************************************************************** ; Interrupt-Routinen ; ; Timer0-Interrupt an int_an bcf INTCON, T0IF ; wird gesetzt bei Interrupt bsf INTCON, T0IE ; Timer0 Int bsf INTCON, GIE ; Global Int return ; Timer0-Interrupt aus int_aus bcf INTCON, T0IE ; Timer0 Int bcf INTCON, GIE ; Global Int return ; ;************************************************************** ; Pause-Routine ; ; Pause von 250 ms pause250 movlw D'250' ; 250 ms Pause movwf loops call wai return ; Pause von 50 ms pause50 movlw D'50' ; 50 ms Pause movwf loops call wai return ; Pause von 1 ms pause1 movlw D'1' ; 1 ms Pause movwf loops call wai return ; Warteschleife für 1 ms wai movlw D'249' ; Zeitkonstante für 1 ms movwf loops2 wai2 nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop decfsz loops2, F ; 1 ms vorbei? goto wai2 ; nein, noch nicht decfsz loops, F ; 250 ms vorbei? goto wai ; nein, noch nicht return ; das Warten hat ein Ende ; ;************************************************************** ; ENDE ; org 0x2100 de "KFZ-Innenlichtdimmer (C) 2003 by CoolChip" end