; ******************************************************** ; ** Name: einsatz.asm ** ; ** Version: V1.07 vom 21/01/2009 ** ; ** Project: Einsatz-Fahrzeug PKW ** ; ** ** ; ******************************************************** ; ** Sven Brandt ** ; ******************************************************** ; ** Prozessor: Pic 12F629 / Microchip ** ; ** 1 cycle = 1 us (4 MHz internal Osc) ** ; ** ** ; ** IR: RB0 for Input-Signal ** ; ** TIMER0 for detection of idle-state ** ; ** ** ; ** Timer: 0 for detection of idle-state ** ; ** 1 for PWM ** ; ******************************************************** ; Copyright (C) 2003-2009 Sven Brandt ; This program is free software; you can redistribute it and/or ; modify it under the terms of the GNU General Public License version 2 ; as published by the Free Software Foundation. ; This program is distributed in the hope that it will be useful, ; but WITHOUT ANY WARRANTY; without even the implied warranty of ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ; GNU General Public License for more details. ;#define test ; Mode Nummer Funktion von Ausgang Nummer ; # 1 2 3 4 5 ; GPIO 5 4 2 1 0 ; 00000 5 x Blaulicht (alt)+Blinker 1 Rundum Rundum Rundum Rundum Rundum ; 00001 4 x Blaulicht (alt)+Blinker 2 Rundum Rundum Rundum Blinker Rundum ; 00010 4 x Blaulicht (alt)+Frontlicht 3 Rundum Rundum Rundum Rundum Frontlicht ; 00011 3 x Blaulicht (alt)+Frontlicht 4 Rundum Rundum Rundum Blinker Frontlicht ; 10000 5 x Blaulicht (neu)+Blinker 5 Strobo Strobo Strobo Strobo Strobo ; 10001 4 x Blaulicht (neu)+Blinker 6 Strobo Strobo Strobo Blinker Strobo ; 10010 4 x Blaulicht (neu)+Frontlicht 7 Strobo Strobo Strobo Strobo Frontlicht ; 10011 3 x Blaulicht (neu)+Frontlicht 8 Strobo Strobo Strobo Blinker Frontlicht ; 10100 neu Strobo Strobo Fern-L Fern-R Strobo ; 10101 neu Strobo Strobo Fern-L Fern-R K-LED ; 10110 neu Strobo-L Strobo-R Fern-L Fern-R Strobo ; 10111 neu Strobo-L Strobo-R Fern-L Fern-R K-LED ; 11000 5 x Blaulicht (neu)+Blinker 9 Strobo-L Strobo-R Strobo Strobo Strobo ; 11001 4 x Blaulicht (neu)+Blinker 10 Strobo-L Strobo-R Strobo Blinker Strobo ; 11010 4 x Blaulicht (neu)+Frontlicht 11 Strobo-L Strobo-R Strobo Strobo Frontlicht ; 11011 3 x Blaulicht (neu)+Frontlicht 12 Strobo-L Strobo-R Strobo Blinker Frontlicht ; 11100 13 Strobo-L Strobo-R Strobo-L Strobo-R Strobo ; 11101 14 Strobo-L Strobo-R Strobo-L Strobo-R K-LED ; 11110 15 Strobo-L Strobo-R Strobo-L Strobo-R Frontlicht ; ||||| ; ||||+-- #0 = 1 -> Ausgang 4 = Blinker ; |||+--- #1 = 1 -> Ausgang 5 = Frontlicht ; ||+---- #2 = 1 -> Ausgang 3&4 = Strobo R/L ; |+----- #3 = 1 -> Ausgang 1$2 = Strobo R/L ; +------ #4 = 1 -> Strobo-Mode ; ******************************************************** ; History: ; V1.07 - New blink concept ; V1.06 - inverted Strobo corrected ; V1.04 - Output 5: new Modes (inverted Strobo) ; V1.03 - more Modes again ; V1.02 - more Modes (Nov.2006) ; V1.01 - add mode-switching ; V1.00 - created from andreas.asm V1.00 ; ******************************************************** #include LIST p=12f629 ; Controller __idlocs h'0107' ; PIC Device ID ERRORLEVEL 0,-302 ; Errorlevel __config b'00000111001100' ; Programmer-Configuration ; ++---------------- #13-#12 BG1:BG0: Bandgap Calibration bits ; |||||||||||| >00 = Lowest bandgap voltage ; |||||||||||| 11 = Highest bandgap voltage ; +++------------- #11-#9 Unimplemented: Read as 0 ; +------------ #8: CPD: Data Code Protection bit (2) ; |||||||| >1 = Data memory code protection is disabled ; |||||||| 0 = Data memory code protection is enabled ; +----------- #7: CP: Code Protection bit ; ||||||| >1 = Program Memory code protection is disabled ; ||||||| 0 = Program Memory code protection is enabled ; +---------- #6: BODEN: Brown-out Detect Enable bit ; |||||| >1 = BOD enabled ; |||||| 0 = BOD disabled ; +--------- #5: MCLRE: GP3/MCLR pin function select ; ||||| 1 = GP3/MCLR pin function is MCLR ; ||||| >0 = GP3/MCLR pin function is digital I/O ; +-------- #4: PWRTE: Power-up Timer Enable bitd ; |||| 1 = PWRT disabled ; |||| >0 = PWRT enabled ; +------- #3: WDTE: Watchdog Timer Enable bit ; ||| >1 = WDT enabled ; ||| 0 = WDT disabled ; +++---- #2-#0: FOSC2:FOSC0: Oscillator Selection bits ; >100 = INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, ; I/O function on GP5/OSC1/CLKIN ; ******************************************************** ; ** Files Assignment ** ; ******************************************************** R_STATUS equ 2ah ; Status-Flags: ; * * * * * * ; : /----------\ : /----------\ : /----------\ FRONTLIGHT ;-----/ : : \----------/ : : \----------/ : \---- ; :#4 :#3 :#4 :#3 :#4 :#3 ; ;Time *: TMR1H <> ZERO and R_COUNT=0 ;#3: FRONTLIGHT fade out/off ;#4: FRONTLIGHT fade in/on ; ;PWM detail, here Fade in (Fade out = inverted Signal): ; 0 1 2 3 4 5 6 7 Value of R_COUNT ; :-: :--: :---: :----: :-----: :-----: :------::----- ; : : : : : : : : : : : : : :: ; -: :------: :-----: :----: :---: :--: :-: :: ; 1 2 3 2 3 2 3 2 3 2 3 2 3 3 ;@1: LED on, R_COUNT=0 ;@2: LED off ;@3: LED on, R_COUNT increment every 2ms R_PWMVALUE equ 2bh ; PWM-Value from Table-Read R_COUNT equ 28h ; Counter for PWM R_CNT_F1 equ 30h ; Counter for FLASH1 R_FLAG_F1 equ 31h ; FLAGS for FLASH1 R_CNT_F2 equ 32h ; Counter for FLASH2 R_FLAG_F2 equ 33h ; FLAGS for FLASH2 R_CNT_F3 equ 34h ; Counter for FLASH3 R_FLAG_F3 equ 35h ; FLAGS for FLASH3 R_CNT_F4 equ 36h ; Counter for FLASH4 R_FLAG_F4 equ 37h ; FLAGS for FLASH4 R_CNT_F5 equ 38h ; Counter for FLASH5 R_FLAG_F5 equ 39h ; FLAGS for FLASH5 R_FLAG equ 3ah ; Flags ; #0: Out 1/2 im Wechsel Strobo ; #1: Out 3/4 im Wechsel Strobo ; #6: Strobo-Mode ; #7: Out 3/4 im Wechsel Frontlicht R_F_SW1 equ 41h ; Flags for Button R_CNT_SW1 equ 42h ; Counter for Button R_MODE equ 45h ; Register for flashing-mode R_MODE_FLAG equ 46h ; Flags for flashig modes W_TEMP equ 50h ; saving W-Register STATUS_TEMP equ 51h ; saving status-Register ; ******************************************************** ; ** Bit Assignment ** ; ******************************************************** ;Output: OUT1 equ d'5' ; OUT2 equ d'4' ; OUT3 equ d'2' ; OUT4 equ d'1' ; OUT5 equ d'0' ; ;Input: BUTTON equ d'3' ;Timing: T_FLASH1 equ d'245' ; (1..255) duration of long off-time for FLASH1 T_BREAK1 equ d'45' ; (1..255) duration of short off-time for FLASH1 T_FLASH2 equ d'255' ; (1..255) duration of long off-time for FLASH2 T_BREAK2 equ d'55' ; (1..255) duration of short off-time for FLASH2 T_FLASH3 equ d'120' ; (1..255) duration of long off-time for FLASH3 T_BREAK3 equ d'50' ; (1..255) duration of short off-time for FLASH3 T_FLASH4 equ d'200' ; (1..255) duration of for FLASH4 T_BREAK4 equ d'30' ; (1..255) duration of short off-time for FLASH4 T_FLASH5 equ d'240' ; (1..255) duration of for FLASH5 T_BREAK5 equ d'40' ; (1..255) duration of short off-time for FLASH5 T_FLASH equ d'10' ; duration of a flash T_FLASH_I1 equ d'70' ; duration of a inverted flash #1 T_BREAK5_I equ d'110' ; (1..255) duration of short off-time for FLASH5 T_FLASH_I2 equ d'20' ; duration of a inverted flash #2 T_FLASH5_I equ d'100' ; (1..255) duration of for FLASH5 ; ******************************************************** ; ** Reset Vector ** ; ******************************************************** org 0000h ; Position (Reset Vector) goto start ; ******************************************************** ; ** Interupt Service Routine ISR ** ; ******************************************************** org 0004h ; Interupt Vector ; ----- Saving STATUS and W ---------------------- movwf W_TEMP ; Saving W swapf STATUS,W ; STATUS -> W movwf STATUS_TEMP ; Saving STATUS bcf STATUS,RP0 ; -> BANK 0 ; ----- Restore STATUS and W --------------------- posret clrf TMR0 ; clear Timer swapf STATUS_TEMP,W ; saved STATUS in W movwf STATUS ; w -> STATUS SWAPF W_TEMP,F ; W_TEMP -> W, without.. SWAPF W_TEMP,W ; .. changing Z-Flag retfie ; ******************************************************** ; ** Programm ** ; ******************************************************** org 0040h ; Memory-Position ; ----------------------------- ; --- clear memory $20..$59 --- ; ----------------------------- start movlw h'20' ; memory start adress movwf FSR next_clr clrf INDF ; clear incf FSR,F movlw h'60' ; Anzahl der Adressen subwf FSR,W ; W = FSR - W = FSR - h'5F' btfss STATUS,C ; if C=0, -> FSR < h'5F' goto next_clr ; next bit ; -------------------- ; --- start values --- ; -------------------- bsf R_STATUS,4 movlw h'ff' ; clear counter movwf R_CNT_SW1 ; .. to FF ; ******************************************************** ; ** Konfiguration PORTS ** ; ******************************************************** bsf STATUS,RP0 ; -> BANK 1 clrf TRISIO ; TRIS-Reg. (all Output) bsf TRISIO,BUTTON ; Input bcf STATUS,RP0 ; -> BANK 0 ; ******************************************************** ; ** Konfiguration COMPARATOR ** ; ******************************************************** movlw B'00000111' ; +--------- #7: Unimplemented: Read as ‘0’ ; +-------- #6: COUT: Comparator Output bit ; |||| | When CINV=0 1 = VIN+ > VIN- ; |||| | 0 = VIN+ < VIN- ; |||| | When CINV=1 0 = VIN+ > VIN- ; |||| | 1 = VIN+ < VIN- ; +------- #5: Unimplemented: Read as ‘0’ ; +------ #4: CINV: Comparator Output Inversion bit ; || | 1 = Output inverted ; || | 0 = Output not inverted ; +----- #3: CIS: Comparator Input Switch bit ; | | When CM2:CM0 = 110 or 101: ; | | 1 = VIN- connects to CIN+ ; | | 0 = VIN- connects to CIN- ; +++-- #2-#0: CM2:CM0: Comparator Mode bits ; >111 = Comparator Off movwf CMCON ; CNCON-Reg. konfigurieren ; ******************************************************** ; ** Konfiguration TIMER / WDT / Pull-Ups ** ; ******************************************************** movlw B'11000000' ; +--------- #7: GPPU: GPIO Pull-up Enable bit ; ||||| | >1 = GPIO pull-ups are disabled ; ||||| | 0 = GPIO pull-ups are enabled by individual port latch values ; +-------- #6: INTEDG: Interrupt Edge Select bit ; |||| | >1 = Interrupt on rising edge of GP2/INT pin ; |||| | 0 = Interrupt on falling edge of GP2/INT pin ; +------- #5: T0CS: TMR0 Clock Source Select bit ; ||| | 1 = Transition on GP2/T0CKI pin ; ||| | >0 = Internal instruction cycle clock (CLKOUT) ; +------ #4: T0SE: TMR0 Source Edge Select bit ; || | 1 = Increment on high-to-low transition on GP2/T0CKI pin ; || | >0 = Increment on low-to-high transition on GP2/T0CKI pin ; +----- #3: PSA: Prescaler Assignment bit ; | | 1 = Prescaler is assigned to the WDT ; | | >0 = Prescaler is assigned to the TIMER0 module ; +++-- #2-#0: PS2:PS0: Prescaler Rate Select bits ; Bit |TMR0 Rate|WDT Rate ; ----+---------+-------- ; > 000 | 1 : 2 | 1 : 1 ; 001 | 1 : 4 | 1 : 2 ; 010 | 1 : 8 | 1 : 4 ; 011 | 1 : 16 | 1 : 8 ; 100 | 1 : 32 | 1 : 16 ; 101 | 1 : 64 | 1 : 32 ; 110 | 1 : 128 | 1 : 64 ; 111 | 1 : 256 | 1 : 128 bsf STATUS,RP0 ; -> BANK 1 movwf OPTION_REG ; OPTION-Reg. konfigurieren bcf STATUS,RP0 ; -> BANK 0 movlw B'00110001' ; +--------- #7: Unimplemented: Read as ‘0’ ; +-------- #6: TMR1GE: Timer1 Gate Enable bit ; |||| | >If TMR1ON = 0: This bit is ignored ; |||| | If TMR1ON = 1: ; |||| | 1 = Timer1 is on if T1G pin is low ; |||| | 0 = Timer1 is on ; ++------ #5-#4: T1CKPS1:T1CKPS0: Timer1 Input Clock Prescale Select bits ; ||| | >11 = 1:8 Prescale Value ; ||| | 10 = 1:4 Prescale Value ; ||| | 01 = 1:2 Prescale Valueue ; ||| | 00 = 1:1 Prescale Value ; +----- #3: T1OSCEN: LP Oscillator Enable Control bit ; | | If INTOSC without CLKOUT oscillator is active: ; | | 1 = LP oscillator is enabled for Timer1 clock ; | | >0 = LP oscillator is off ; | | Else: This bit is ignored ; +---- #2: T1SYNC: Timer1 External Clock Input Synchronization Control bit ; || >if TMR1CS = 0: This bit is ignored. Timer1 uses the internal clock. ; +--- #1: TMR1CS: Timer1 Clock Source Select bit ; | 1 = External clock from T1OSO/T1CKI pin (on the rising edge) ; | >0 = Internal clock (FOSC/4) ; +-- #0: TMR1ON: Timer1 On bit ; >1 = Enables Timer1 ; 0 = Stops Timer1 movwf T1CON ; T1CON-Reg. konfigurieren clrf TMR1L clrf TMR1H ; ******************************************************** ; ** Konfiguration INTERRUPT ** ; ******************************************************** movlw B'00000000' ; +--------- #7: GIE: Global Interrupt Enable bit ; ||||||| 1 = Enables all un-masked interrupts ; ||||||| >0 = Disables all interrupts ; +-------- #6: PEIE: Peripherial Interrupt Enable bit ; |||||| 1 = Enables all unmasked peripherial interrupts ; |||||| >0 = Disables all peripherial interrupts ; +------- #5: T0IE: TMR0 Overflow Interrupt Enable bit ; ||||| 1 = Enables the TMR0 interrupt ; ||||| >0 = Disables the TMR0 interrupt ; +------ #4: INTE: GP2/INT External Interrupt Enable bit ; |||| 1 = Enables the GP2/INT external interrupt ; |||| >0 = Disables the GP2/INT external interrupt ; +----- #3: GPIE: Port Change Interrupt Enable bit ; ||| 1 = Enables the GPIO port change interrupt ; ||| >0 = Disables the GPIO port change interrupt ; +---- #2: T0IF: TMR0 overflow interrupt flag bit ; || 1 = TMR0 has overflowed (must be cleared in software) ; || 0 = TMR0 did not overflow ; +--- #1: INTF: GP2/INT External Interrupt Flag bit ; | 1 = The GP2/INT external interrupt occurred (must be cleared in software) ; | 0 = The GP2/INT external interrupt did not occur ; +-- #0: GPIF: Port Change Interrupt Flag bit ; 1 = When at least one of the GP5:GP0 pins changed state ; (must be cleared in software) ; 0 = None of the GP5:GP0 pins have changed state movwf INTCON ; INTCON-Reg. konfigurieren movlw B'00000000' ; +--------- #7: EEIE: EE Write Complete Interrupt Enable Bit ; ||||||| 1 = Enables the EE write complete interrupt ; ||||||| >0 = Disables the EE write complete interrupt ; +-------- #6: ADIE: A/D Converter Interrupt Enable bit (PIC12F675 only) ; 1 = Enables the A/D converter interrupt ; >0 = Disables the A/D converter interrupt ; +------- #5: Unimplemented: Read as ‘0’ ; +------ #4: Unimplemented: Read as ‘0’ ; +----- #3: CMIE: Comparator Interrupt Enable bit ; 1 = Enables the comparator interrupt ; >0 = Disables the comparator interrupt ; +---- #2: Unimplemented: Read as ‘0’ ; +--- #1: Unimplemented: Read as ‘0’ ; +-- #0: TMR1IE: TMR1 Overflow Interrupt Enable bit ; 1 = Enables the TMR1 overflow interrupt ; >0 = Disables the TMR1 overflow interrupt bsf STATUS,RP0 ; -> BANK 1 movwf PIE1 ; PIE1-Reg. konfigurieren bcf STATUS,RP0 ; -> BANK 0 ; ******************************************************** ; ** read R_MODE from EEPROM ** ; ******************************************************** bsf STATUS,RP0 ; -> BANK 1 movlw h'31' movwf EEADR ; Adress to read bsf EECON1,RD ; initiate reading movf EEDATA,W ; EEDATA into W bcf STATUS,RP0 ; -> BANK 0 movwf R_MODE ; ..into R_MODE movlw b'00000000' ; check mode subwf R_MODE,W ; if mode 0 btfsc STATUS,Z ; .. then goto loop ; .. jump movlw b'00000001' ; check mode subwf R_MODE,W ; if mode 1 btfsc STATUS,Z ; .. then goto loop ; .. jump movlw b'00000010' ; check mode subwf R_MODE,W ; if mode 2 btfsc STATUS,Z ; .. then goto loop ; .. jump movlw b'00000011' ; check mode subwf R_MODE,W ; if mode 3 btfsc STATUS,Z ; .. then goto loop ; .. jump movlw b'00010000' ; check mode subwf R_MODE,W ; if mode 4 btfsc STATUS,Z ; .. then goto loop ; .. jump movlw b'00010001' ; check mode subwf R_MODE,W ; if mode 5 btfsc STATUS,Z ; .. then goto loop ; .. jump movlw b'00010010' ; check mode subwf R_MODE,W ; if mode 6 btfsc STATUS,Z ; .. then goto loop ; .. jump movlw b'00010011' ; check mode subwf R_MODE,W ; if mode 7 btfsc STATUS,Z ; .. then goto loop ; .. jump movlw b'00010100' ; check mode subwf R_MODE,W ; if mode 7 btfsc STATUS,Z ; .. then goto loop ; .. jump movlw b'00010101' ; check mode subwf R_MODE,W ; if mode 7 btfsc STATUS,Z ; .. then goto loop ; .. jump movlw b'00010110' ; check mode subwf R_MODE,W ; if mode 7 btfsc STATUS,Z ; .. then goto loop ; .. jump movlw b'00010111' ; check mode subwf R_MODE,W ; if mode 7 btfsc STATUS,Z ; .. then goto loop ; .. jump movlw b'00011000' ; check mode subwf R_MODE,W ; if this mode btfsc STATUS,Z ; .. then goto loop ; .. jump movlw b'00011001' ; check mode subwf R_MODE,W ; if this mode btfsc STATUS,Z ; .. then goto loop ; .. jump movlw b'00011010' ; check mode subwf R_MODE,W ; if this mode btfsc STATUS,Z ; .. then goto loop ; .. jump movlw b'00011011' ; check mode subwf R_MODE,W ; if this mode btfsc STATUS,Z ; .. then goto loop ; .. jump movlw b'00011100' ; check mode subwf R_MODE,W ; if this mode btfsc STATUS,Z ; .. then goto loop ; .. jump movlw b'00011101' ; check mode subwf R_MODE,W ; if this mode btfsc STATUS,Z ; .. then goto loop ; .. jump movlw b'00011110' ; check mode subwf R_MODE,W ; if this mode btfsc STATUS,Z ; .. then goto loop ; .. jump ; movlw b'00011111' ; check mode ; subwf R_MODE,W ; if this mode ; btfsc STATUS,Z ; .. then ; goto loop ; .. jump clrf R_MODE ; ******************************************************** ; ** Main Loop ** ; ******************************************************** loop clrwdt ; clear Watchdog-Timer ; ***** check switch mode ***** check_sw1 btfsc GPIO,BUTTON goto check_sw1_1 ;*** SW1 is low *** check_sw1_0 movlw d'10' addwf R_CNT_SW1,F btfsc STATUS,C ; check for CARRY goto check_sw1_2 ; if R_CNT_SW1 > 255 then jump goto loop_0 ;*** SW1 is high (active) *** check_sw1_1 btfsc R_F_SW1,0 ; .. if flag goto loop_0 ; .. then jump movlw d'10' subwf R_CNT_SW1,F btfss STATUS,C ; check for CARRY goto check_sw1_3 ; if R_CNT_SW1 < 0 then jump goto loop_0 ;*** SW1 is not active *** check_sw1_2 bcf R_F_SW1,0 ; clear flag movlw h'ff' ; set counter movwf R_CNT_SW1 ; .. to FF goto loop_0 ;*** SW1 is active *** check_sw1_3 bsf R_F_SW1,0 ; set flag clrf R_CNT_SW1 ; clear counter call change_mode ; "change mode" goto loop_0 ; ***** create 2ms slot ***** loop_0 ; movlw b'00010100' ; check mode ; movwf R_MODE #ifndef test movf TMR1H,F btfsc STATUS,Z ; if TMR1H <> ZERO goto loop clrf TMR1H ; .. then reset to ZERO ; *** every 2 ms *** #endif mode00 movlw b'00000000' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if not the same goto mode01 bcf R_FLAG,0 ; wenn gesetzt, dann übernimmt out1_2_blink den out2 bcf R_FLAG,1 ; wenn gesetzt, dann übernimmt out3_4_blink den out4 bcf R_FLAG,6 ; wenn gesetzt, dann Blinken als Strobo (sonst Rundum) call out1_2_blink call out2_blink call out3_4_blink ; call out3_4_frontlight call out4_blink ; call out4_blinker call out5_blink ; call out5_kled ; call out5_frontlight mode01 movlw b'00000001' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if not the same goto mode02 bcf R_FLAG,0 ; wenn gesetzt, dann übernimmt out1_2_blink den out2 bcf R_FLAG,1 ; wenn gesetzt, dann übernimmt out3_4_blink den out4 bcf R_FLAG,6 ; wenn gesetzt, dann Blinken als Strobo (sonst Rundum) call out1_2_blink call out2_blink call out3_4_blink ; call out3_4_frontlight ; call out4_blink call out4_blinker call out5_blink ; call out5_kled ; call out5_frontlight mode02 movlw b'00000010' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if not the same goto mode03 bcf R_FLAG,0 ; wenn gesetzt, dann übernimmt out1_2_blink den out2 bcf R_FLAG,1 ; wenn gesetzt, dann übernimmt out3_4_blink den out4 bcf R_FLAG,6 ; wenn gesetzt, dann Blinken als Strobo (sonst Rundum) call out1_2_blink call out2_blink call out3_4_blink ; call out3_4_frontlight call out4_blink ; call out4_blinker ; call out5_blink ; call out5_kled call out5_frontlight mode03 movlw b'00000011' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if not the same goto mode16 bcf R_FLAG,0 ; wenn gesetzt, dann übernimmt out1_2_blink den out2 bcf R_FLAG,1 ; wenn gesetzt, dann übernimmt out3_4_blink den out4 bcf R_FLAG,6 ; wenn gesetzt, dann Blinken als Strobo (sonst Rundum) call out1_2_blink call out2_blink call out3_4_blink ; call out3_4_frontlight ; call out4_blink call out4_blinker ; call out5_blink ; call out5_kled call out5_frontlight mode16 movlw b'00010000' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if not the same goto mode17 bcf R_FLAG,0 ; wenn gesetzt, dann übernimmt out1_2_blink den out2 bcf R_FLAG,1 ; wenn gesetzt, dann übernimmt out3_4_blink den out4 bsf R_FLAG,6 ; wenn gesetzt, dann Blinken als Strobo (sonst Rundum) call out1_2_blink call out2_blink call out3_4_blink ; call out3_4_frontlight call out4_blink ; call out4_blinker call out5_blink ; call out5_kled ; call out5_frontlight mode17 movlw b'00010001' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if not the same goto mode18 bcf R_FLAG,0 ; wenn gesetzt, dann übernimmt out1_2_blink den out2 bcf R_FLAG,1 ; wenn gesetzt, dann übernimmt out3_4_blink den out4 bsf R_FLAG,6 ; wenn gesetzt, dann Blinken als Strobo (sonst Rundum) call out1_2_blink call out2_blink call out3_4_blink ; call out3_4_frontlight ; call out4_blink call out4_blinker call out5_blink ; call out5_kled ; call out5_frontlight mode18 movlw b'00010010' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if not the same goto mode19 bcf R_FLAG,0 ; wenn gesetzt, dann übernimmt out1_2_blink den out2 bcf R_FLAG,1 ; wenn gesetzt, dann übernimmt out3_4_blink den out4 bsf R_FLAG,6 ; wenn gesetzt, dann Blinken als Strobo (sonst Rundum) call out1_2_blink call out2_blink call out3_4_blink ; call out3_4_frontlight call out4_blink ; call out4_blinker ; call out5_blink ; call out5_kled call out5_frontlight mode19 movlw b'00010011' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if not the same goto mode20 bcf R_FLAG,0 ; wenn gesetzt, dann übernimmt out1_2_blink den out2 bcf R_FLAG,1 ; wenn gesetzt, dann übernimmt out3_4_blink den out4 bsf R_FLAG,6 ; wenn gesetzt, dann Blinken als Strobo (sonst Rundum) call out1_2_blink call out2_blink call out3_4_blink ; call out3_4_frontlight ; call out4_blink call out4_blinker ; call out5_blink ; call out5_kled call out5_frontlight mode20 movlw b'00010100' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if not the same goto mode21 bcf R_FLAG,0 ; wenn gesetzt, dann übernimmt out1_2_blink den out2 bcf R_FLAG,1 ; wenn gesetzt, dann übernimmt out3_4_blink den out4 bsf R_FLAG,6 ; wenn gesetzt, dann Blinken als Strobo (sonst Rundum) call out1_2_blink call out2_blink ; call out3_4_blink call out3_4_frontlight ; call out4_blink ; call out4_blinker call out5_blink ; call out5_kled ; call out5_frontlight mode21 movlw b'00010101' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if not the same goto mode22 bcf R_FLAG,0 ; wenn gesetzt, dann übernimmt out1_2_blink den out2 bcf R_FLAG,1 ; wenn gesetzt, dann übernimmt out3_4_blink den out4 bsf R_FLAG,6 ; wenn gesetzt, dann Blinken als Strobo (sonst Rundum) call out1_2_blink call out2_blink ; call out3_4_blink call out3_4_frontlight ; call out4_blink ; call out4_blinker ; call out5_blink call out5_kled ; call out5_frontlight mode22 movlw b'00010110' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if not the same goto mode23 bsf R_FLAG,0 ; wenn gesetzt, dann übernimmt out1_2_blink den out2 bcf R_FLAG,1 ; wenn gesetzt, dann übernimmt out3_4_blink den out4 bsf R_FLAG,6 ; wenn gesetzt, dann Blinken als Strobo (sonst Rundum) call out1_2_blink ; call out2_blink ; call out3_4_blink call out3_4_frontlight ; call out4_blink ; call out4_blinker call out5_blink ; call out5_kled ; call out5_frontlight mode23 movlw b'00010111' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if not the same goto mode24 bsf R_FLAG,0 ; wenn gesetzt, dann übernimmt out1_2_blink den out2 bcf R_FLAG,1 ; wenn gesetzt, dann übernimmt out3_4_blink den out4 bsf R_FLAG,6 ; wenn gesetzt, dann Blinken als Strobo (sonst Rundum) call out1_2_blink ; call out2_blink ; call out3_4_blink call out3_4_frontlight ; call out4_blink ; call out4_blinker ; call out5_blink call out5_kled ; call out5_frontlight mode24 movlw b'00011000' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if not the same goto mode25 bsf R_FLAG,0 ; wenn gesetzt, dann übernimmt out1_2_blink den out2 bcf R_FLAG,1 ; wenn gesetzt, dann übernimmt out3_4_blink den out4 bsf R_FLAG,6 ; wenn gesetzt, dann Blinken als Strobo (sonst Rundum) call out1_2_blink ; call out2_blink call out3_4_blink ; call out3_4_frontlight call out4_blink ; call out4_blinker call out5_blink ; call out5_kled ; call out5_frontlight mode25 movlw b'00011001' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if not the same goto mode26 bsf R_FLAG,0 ; wenn gesetzt, dann übernimmt out1_2_blink den out2 bcf R_FLAG,1 ; wenn gesetzt, dann übernimmt out3_4_blink den out4 bsf R_FLAG,6 ; wenn gesetzt, dann Blinken als Strobo (sonst Rundum) call out1_2_blink ; call out2_blink call out3_4_blink ; call out3_4_frontlight ; call out4_blink call out4_blinker call out5_blink ; call out5_kled ; call out5_frontlight mode26 movlw b'00011010' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if not the same goto mode27 bsf R_FLAG,0 ; wenn gesetzt, dann übernimmt out1_2_blink den out2 bcf R_FLAG,1 ; wenn gesetzt, dann übernimmt out3_4_blink den out4 bsf R_FLAG,6 ; wenn gesetzt, dann Blinken als Strobo (sonst Rundum) call out1_2_blink ; call out2_blink call out3_4_blink ; call out3_4_frontlight call out4_blink ; call out4_blinker ; call out5_blink ; call out5_kled call out5_frontlight mode27 movlw b'00011011' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if not the same goto mode28 bsf R_FLAG,0 ; wenn gesetzt, dann übernimmt out1_2_blink den out2 bcf R_FLAG,1 ; wenn gesetzt, dann übernimmt out3_4_blink den out4 bsf R_FLAG,6 ; wenn gesetzt, dann Blinken als Strobo (sonst Rundum) call out1_2_blink ; call out2_blink call out3_4_blink ; call out3_4_frontlight ; call out4_blink call out4_blinker ; call out5_blink ; call out5_kled call out5_frontlight mode28 movlw b'00011100' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if not the same goto mode29 bsf R_FLAG,0 ; wenn gesetzt, dann übernimmt out1_2_blink den out2 bsf R_FLAG,1 ; wenn gesetzt, dann übernimmt out3_4_blink den out4 bsf R_FLAG,6 ; wenn gesetzt, dann Blinken als Strobo (sonst Rundum) call out1_2_blink ; call out2_blink call out3_4_blink ; call out3_4_frontlight ; call out4_blink ; call out4_blinker call out5_blink ; call out5_kled ; call out5_frontlight mode29 movlw b'00011101' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if not the same goto mode30 bsf R_FLAG,0 ; wenn gesetzt, dann übernimmt out1_2_blink den out2 bsf R_FLAG,1 ; wenn gesetzt, dann übernimmt out3_4_blink den out4 bsf R_FLAG,6 ; wenn gesetzt, dann Blinken als Strobo (sonst Rundum) call out1_2_blink ; call out2_blink call out3_4_blink ; call out3_4_frontlight ; call out4_blink ; call out4_blinker ; call out5_blink call out5_kled ; call out5_frontlight mode30 movlw b'00011110' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if not the same goto mode31 bsf R_FLAG,0 ; wenn gesetzt, dann übernimmt out1_2_blink den out2 bsf R_FLAG,1 ; wenn gesetzt, dann übernimmt out3_4_blink den out4 bsf R_FLAG,6 ; wenn gesetzt, dann Blinken als Strobo (sonst Rundum) call out1_2_blink ; call out2_blink call out3_4_blink ; call out3_4_frontlight ; call out4_blink ; call out4_blinker ; call out5_blink ; call out5_kled call out5_frontlight mode31 movlw b'00011111' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if not the same goto mode32 bsf R_FLAG,0 ; wenn gesetzt, dann übernimmt out1_2_blink den out2 bsf R_FLAG,1 ; wenn gesetzt, dann übernimmt out3_4_blink den out4 bsf R_FLAG,6 ; wenn gesetzt, dann Blinken als Strobo (sonst Rundum) ; call out1_2_blink ; call out2_blink ; call out3_4_blink ; call out3_4_frontlight ; call out4_blink ; call out4_blinker ; call out5_blink ; call out5_kled ; call out5_frontlight mode32 movlw b'00010000' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if not the same goto mode33 bsf R_FLAG,0 ; wenn gesetzt, dann übernimmt out1_2_blink den out2 bsf R_FLAG,1 ; wenn gesetzt, dann übernimmt out3_4_blink den out4 bsf R_FLAG,6 ; wenn gesetzt, dann Blinken als Strobo (sonst Rundum) ; call out1_2_blink ; call out2_blink ; call out3_4_blink ; call out3_4_frontlight ; call out4_blink ; call out4_blinker ; call out5_blink ; call out5_kled ; call out5_frontlight mode33 goto loop ; endless loop ; ******************************************************** ; ** SUB - Routines ** ; ******************************************************** ;********************************* ;** Routine: change_mode ** ;** change & check R_MODE and ** ;** save into EEPROM $31 ** ;********************************* change_mode incf R_MODE,F ; +1 movlw b'00000100' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if Z=0, -> R_MODE <> wert goto change001 ; ...then jump movlw b'00010000' movwf R_MODE change001 ; movlw b'00010100' ; subwf R_MODE,W ; W = R_MODE - W ; btfss STATUS,Z ; if Z=0, -> R_MODE <> wert ; goto change002 ; ...then jump ; movlw b'00011000' ; movwf R_MODE change002 movlw b'00011111' subwf R_MODE,W ; W = R_MODE - W btfss STATUS,Z ; if Z=0, -> R_MODE <> wert goto change003 ; ...then jump movlw b'00000000' movwf R_MODE change003 bcf INTCON,GIE ; disable IRs ; **** write R_MODE **** movf R_MODE,W bsf STATUS,RP0 ; -> BANK 1 bsf EECON1,WREN ; enable write movwf EEDATA ; R_MODE into EEDATA movlw h'31' movwf EEADR ; define EEADR (Adress) movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1,WR ; start writing btfsc EECON1,WR goto $-1 ; wait for finish bcf EECON1,WREN ; disable write bcf STATUS,RP0 ; -> BANK 0 bsf INTCON,GIE ; enable IRs return ;********************************* ;** Routine: out1_2_blink ** ;********************************* out1_2_blink incf R_CNT_F1,F ; +1 movlw T_FLASH ; if subwf R_CNT_F1,W ; .. R_CNT_F1 < T_FLASH btfss STATUS,C ; .. then return ; return ; LED off (wenn R_CNT >= T_FLASH) btfss R_FLAG_F1,1 bcf GPIO,OUT1 ; .. FLASH1 off btfsc R_FLAG_F1,1 bcf GPIO,OUT2 ; .. FLASH2 off movlw T_FLASH1 ; Time between 2 Flashes (long time) btfss R_FLAG_F1,0 ; if short off-Time needed (Strobo double-flash) movlw T_BREAK1 ; Time between 2 Flashes (short time) subwf R_CNT_F1,W ; if R_CNT_F1 < T_FLASHx / T_BREAKx btfss STATUS,C ; .. then return ; return ; LED on (wenn R_CNT >= T_FLASHx / T_BREAKx) incf R_FLAG_F1,F ; toggle FLAG (#0=1 -> Long time, #1=1 -> R-L) btfss R_FLAG,0 ; if not "Strobo R/L-Mode" bcf R_FLAG_F1,1 ; .. clear flag for R-L selection movlw b'00000001' btfss R_FLAG,6 ; if not "Strobo"-Mode movwf R_FLAG_F1 ; .. set flag for long time/ clear R-L selection btfss R_FLAG_F1,1 bsf GPIO,OUT1 ; .. FLASH1 on btfsc R_FLAG_F1,1 bsf GPIO,OUT2 ; .. FLASH2 on clrf R_CNT_F1 return ;********************************* ;** Routine: out2_blink ** ;********************************* out2_blink incf R_CNT_F2,F ; +1 movlw T_FLASH ; if subwf R_CNT_F2,W ; .. R_CNT_F2 < T_FLASH btfss STATUS,C ; .. then return ; return ; LED off (wenn R_CNT >= T_FLASH) ; btfss R_FLAG_F2,1 bcf GPIO,OUT2 ; .. FLASH1 off ; btfsc R_FLAG_F2,1 ; bcf GPIO,OUT2 ; .. FLASH2 off movlw T_FLASH2 ; Time between 2 Flashes (long time) btfss R_FLAG_F2,0 ; if short off-Time needed (Strobo double-flash) movlw T_BREAK2 ; Time between 2 Flashes (short time) subwf R_CNT_F2,W ; if R_CNT_F2 < T_FLASHx / T_BREAKx btfss STATUS,C ; .. then return ; return ; LED on (wenn R_CNT >= T_FLASHx / T_BREAKx) incf R_FLAG_F2,F ; toggle FLAG (#0=1 -> Long time, #1=1 -> R-L) ; btfss R_FLAG,0 ; if not "Strobo R/L-Mode" ; bcf R_FLAG_F2,1 ; .. clear flag for R-L selection movlw b'00000001' btfss R_FLAG,6 ; if not "Strobo"-Mode movwf R_FLAG_F2 ; .. set flag for long time/ clear R-L selection ; btfss R_FLAG_F2,1 bsf GPIO,OUT2 ; .. FLASH1 on ; btfsc R_FLAG_F2,1 ; bsf GPIO,OUT2 ; .. FLASH2 on clrf R_CNT_F2 return ;********************************* ;** Routine: out3_4_blink ** ;********************************* out3_4_blink incf R_CNT_F3,F ; +1 movlw T_FLASH ; if subwf R_CNT_F3,W ; .. R_CNT_F3 < T_FLASH btfss STATUS,C ; .. then return ; return ; LED off (wenn R_CNT >= T_FLASH) btfss R_FLAG_F3,1 bcf GPIO,OUT3 ; .. FLASH1 off btfsc R_FLAG_F3,1 bcf GPIO,OUT4 ; .. FLASH2 off movlw T_FLASH3 ; Time between 2 Flashes (long time) btfss R_FLAG_F3,0 ; if short off-Time needed (Strobo double-flash) movlw T_BREAK3 ; Time between 2 Flashes (short time) subwf R_CNT_F3,W ; if R_CNT_F3 < T_FLASHx / T_BREAKx btfss STATUS,C ; .. then return ; return ; LED on (wenn R_CNT >= T_FLASHx / T_BREAKx) incf R_FLAG_F3,F ; toggle FLAG (#0=1 -> Long time, #1=1 -> R-L) btfss R_FLAG,1 ; if not "Strobo R/L-Mode" bcf R_FLAG_F3,1 ; .. clear flag for R-L selection movlw b'00000001' btfss R_FLAG,6 ; if not "Strobo"-Mode movwf R_FLAG_F3 ; .. set flag for long time/ clear R-L selection btfss R_FLAG_F3,1 bsf GPIO,OUT3 ; .. FLASH1 on btfsc R_FLAG_F3,1 bsf GPIO,OUT4 ; .. FLASH2 on clrf R_CNT_F3 return ;********************************* ;** Routine: out4_blink ** ;********************************* out4_blink incf R_CNT_F4,F ; +1 movlw T_FLASH ; if subwf R_CNT_F4,W ; .. R_CNT_F4 < T_FLASH btfss STATUS,C ; .. then return ; return ; LED off (wenn R_CNT >= T_FLASH) ; btfss R_FLAG_F4,1 bcf GPIO,OUT4 ; .. FLASH1 off ; btfsc R_FLAG_F4,1 ; bcf GPIO,OUT4 ; .. FLASH2 off movlw T_FLASH4 ; Time between 2 Flashes (long time) btfss R_FLAG_F4,0 ; if short off-Time needed (Strobo double-flash) movlw T_BREAK4 ; Time between 2 Flashes (short time) subwf R_CNT_F4,W ; if R_CNT_F4 < T_FLASHx / T_BREAKx btfss STATUS,C ; .. then return ; return ; LED on (wenn R_CNT >= T_FLASHx / T_BREAKx) incf R_FLAG_F4,F ; toggle FLAG (#0=1 -> Long time, #1=1 -> R-L) ; btfss R_FLAG,1 ; if not "Strobo R/L-Mode" ; bcf R_FLAG_F4,1 ; .. clear flag for R-L selection movlw b'00000001' btfss R_FLAG,6 ; if not "Strobo"-Mode movwf R_FLAG_F4 ; .. set flag for long time/ clear R-L selection ; btfss R_FLAG_F4,1 bsf GPIO,OUT4 ; .. FLASH1 on ; btfsc R_FLAG_F4,1 ; bsf GPIO,OUT4 ; .. FLASH2 on clrf R_CNT_F4 return ;********************************* ;** Routine: out5_blink ** ;********************************* out5_blink incf R_CNT_F5,F ; +1 movlw T_FLASH ; if subwf R_CNT_F5,W ; .. R_CNT_F5 < T_FLASH btfss STATUS,C ; .. then return ; return ; LED off (wenn R_CNT >= T_FLASH) ; btfss R_FLAG_F5,1 bcf GPIO,OUT5 ; .. FLASH1 off ; btfsc R_FLAG_F5,1 ; bcf GPIO,OUT5 ; .. FLASH2 off movlw T_FLASH5 ; Time between 2 Flashes (long time) btfss R_FLAG_F5,0 ; if short off-Time needed (Strobo double-flash) movlw T_BREAK5 ; Time between 2 Flashes (short time) subwf R_CNT_F5,W ; if R_CNT_F5 < T_FLASHx / T_BREAKx btfss STATUS,C ; .. then return ; return ; LED on (wenn R_CNT >= T_FLASHx / T_BREAKx) incf R_FLAG_F5,F ; toggle FLAG (#0=1 -> Long time, #1=1 -> R-L) ; btfss R_FLAG,1 ; if not "Strobo R/L-Mode" ; bcf R_FLAG_F5,1 ; .. clear flag for R-L selection movlw b'00000001' btfss R_FLAG,6 ; if not "Strobo"-Mode movwf R_FLAG_F5 ; .. set flag for long time/ clear R-L selection ; btfss R_FLAG_F5,1 bsf GPIO,OUT5 ; .. FLASH1 on ; btfsc R_FLAG_F5,1 ; bsf GPIO,OUT5 ; .. FLASH2 on clrf R_CNT_F5 return ;********************************** ;** Routine: out5_kled ** ;********************************** out5_kled incf R_CNT_F5,F ; +1 movlw T_FLASH_I2 ; if btfss R_FLAG_F5,0 ; if short off-Time needed (Strobo double-flash) movlw T_FLASH_I1 ; Time between 2 Flashes (short time) subwf R_CNT_F5,W ; .. R_CNT_F5 < T_FLASH btfss STATUS,C ; .. then return ; return ; LED off (wenn R_CNT >= T_FLASH) ; btfss R_FLAG_F5,1 bcf GPIO,OUT5 ; .. FLASH1 off ; btfsc R_FLAG_F5,1 ; bsf GPIO,OUT5 ; .. FLASH2 off movlw T_FLASH5_I ; Time between 2 Flashes (long time) btfss R_FLAG_F5,0 ; if short off-Time needed (Strobo double-flash) movlw T_BREAK5_I ; Time between 2 Flashes (short time) subwf R_CNT_F5,W ; if R_CNT_F5 < T_FLASHx / T_BREAKx btfss STATUS,C ; .. then return ; return ; LED on (wenn R_CNT >= T_FLASHx / T_BREAKx) incf R_FLAG_F5,F ; toggle FLAG (#0=1 -> Long time, #1=1 -> R-L) ; btfss R_FLAG,1 ; if not "Strobo R/L-Mode" ; bcf R_FLAG_F5,1 ; .. clear flag for R-L selection movlw b'00000001' btfss R_FLAG,6 ; if not "Strobo"-Mode movwf R_FLAG_F5 ; .. set flag for long time/ clear R-L selection ; btfss R_FLAG_F5,1 bsf GPIO,OUT5 ; .. FLASH1 on ; btfsc R_FLAG_F5,1 ; bcf GPIO,OUT5 ; .. FLASH2 on clrf R_CNT_F5 return ;********************************* ;** Routine: out4_blinker ** ;********************************* out4_blinker movf R_CNT_F4,W ; get R_CNT_F4 into W-Register decfsz R_CNT_F4,F ; if T_BILTZ4 is over.. return movf GPIO,W xorlw b'00000010' ; toggle OUT4 movwf GPIO movlw T_FLASH4 ; .. and movwf R_CNT_F4 ; .. reload coumter return ;******************************* ;** Routine: out3_4_frontlight** ;******************************* out3_4_frontlight incfsz R_COUNT,F ; if R_COUNT = 0 goto out3_4_front_1 ; .. then change R_STATUS ;***** PWM-Time ON & new Status ***** incf R_COUNT,F ; R_COUNT starts with '1' bcf STATUS,C ; clear Carry and rlf R_STATUS,F ; .. rotate left btfsc R_STATUS,5 ; if #5 bsf R_STATUS,3 ; .. change to #3 bcf R_STATUS,5 ; .. and delete #5 out3_4_front_1 call TABLE ; get PWM-value from table movwf R_PWMVALUE movlw d'19' btfsc R_STATUS,3 subwf R_PWMVALUE,F ;***** PWM-Time ON ***** movlw b'01101000' ; check status #3,#5,#6 andwf R_STATUS,W ; = fade out FRONTLIGHT btfsc STATUS,Z goto out3_4_001 bcf GPIO,OUT4 ; FRONTLIGHT off bsf GPIO,OUT3 ; FRONTLIGHT off out3_4_001 bcf R_STATUS,6 ; clear all bits > #5 movf R_PWMVALUE,W ; get PWM-Value into W-Register subwf TMR1L,W ; W = TMR1L - W btfsc STATUS,C ; if C=1, -> TMR1L > PWM-Value goto out3_4_front_2 ; ... then out3_4_front_2 movlw b'00010100' ; check status #2,#4 andwf R_STATUS,W ; = fade in FRONTLIGHT btfsc STATUS,Z goto out3_4_002 bsf GPIO,OUT4 ; FRONTLIGHT on bcf GPIO,OUT3 ; FRONTLIGHT on out3_4_002 out3_4_front_2 movf TMR1H,F btfss STATUS,Z ; if TMR1H <> ZERO return ; return clrwdt ; clear Watchdog-Timer movf R_PWMVALUE,W ; get PWM-Value into W-Register subwf TMR1L,W ; W = TMR1L - W btfss STATUS,C ; if C=0, -> TMR1L < PWM-Value goto out3_4_front_2 ; ... then out3_4_front_2 ; ***** PWM-Time ready ***** movlw b'00010100' ; check status #2,#4 andwf R_STATUS,W ; = fade in FRONTLIGHT btfsc STATUS,Z goto out3_4_003 bcf GPIO,OUT4 ; FRONTLIGHT off bsf GPIO,OUT3 ; FRONTLIGHT off out3_4_003 movlw b'00101000' ; check status #3,#5 andwf R_STATUS,W ; = fade out FRONTLIGHT btfsc STATUS,Z goto out3_4_004 bsf GPIO,OUT4 ; FRONTLIGHT on bcf GPIO,OUT3 ; FRONTLIGHT on out3_4_004 return ;******************************* ;** Routine: out5_frontlight ** ;******************************* out5_frontlight incfsz R_COUNT,F ; if R_COUNT = 0 goto out5_front_1 ; .. then change R_STATUS ;***** PWM-Time ON & new Status ***** incf R_COUNT,F ; R_COUNT starts with '1' bcf STATUS,C ; clear Carry and rlf R_STATUS,F ; .. rotate left btfsc R_STATUS,5 ; if #5 bsf R_STATUS,3 ; .. change to #3 bcf R_STATUS,5 ; .. and delete #5 out5_front_1 call TABLE ; get PWM-value from table movwf R_PWMVALUE movlw d'19' btfsc R_STATUS,3 subwf R_PWMVALUE,F ;***** PWM-Time ON ***** movlw b'01101000' ; check status #3,#5,#6 andwf R_STATUS,W ; = fade out FRONTLIGHT btfss STATUS,Z bcf GPIO,OUT5 ; FRONTLIGHT off bcf R_STATUS,6 ; clear all bits > #5 movf R_PWMVALUE,W ; get PWM-Value into W-Register subwf TMR1L,W ; W = TMR1L - W btfsc STATUS,C ; if C=1, -> TMR1L > PWM-Value goto out5_front_2 ; ... then out5_front_2 movlw b'00010100' ; check status #2,#4 andwf R_STATUS,W ; = fade in FRONTLIGHT btfss STATUS,Z bsf GPIO,OUT5 ; FRONTLIGHT on out5_front_2 movf TMR1H,F btfss STATUS,Z ; if TMR1H <> ZERO return ; return clrwdt ; clear Watchdog-Timer movf R_PWMVALUE,W ; get PWM-Value into W-Register subwf TMR1L,W ; W = TMR1L - W btfss STATUS,C ; if C=0, -> TMR1L < PWM-Value goto out5_front_2 ; ... then out5_front_2 ; ***** PWM-Time ready ***** movlw b'00010100' ; check status #2,#4 andwf R_STATUS,W ; = fade in FRONTLIGHT btfss STATUS,Z bcf GPIO,OUT5 ; FRONTLIGHT off movlw b'00101000' ; check status #3,#5 andwf R_STATUS,W ; = fade out FRONTLIGHT btfss STATUS,Z bsf GPIO,OUT5 ; FRONTLIGHT on return ; ******************************************************** ; ** Tabelle for PWM for LEDs ** ; ******************************************************** org 0x02fc TABLE movlw b'00000011' ; load PCLATH with High Adress movwf PCLATH decf R_COUNT,w ; R_COUNT (1..255) -> (0..254) addwf PCL,f ; Parameter fuer Excel retlw d'20' ; #0 retlw d'23' ; #1 retlw d'27' ; #2 retlw d'30' ; #3 retlw d'33' ; #4 retlw d'37' ; #5 retlw d'40' ; #6 retlw d'43' ; #7 retlw d'46' ; #8 retlw d'49' ; #9 retlw d'52' ; #10 retlw d'55' ; #11 retlw d'58' ; #12 retlw d'61' ; #13 retlw d'64' ; #14 retlw d'66' ; #15 retlw d'69' ; #16 retlw d'72' ; #17 retlw d'75' ; #18 retlw d'77' ; #19 retlw d'80' ; #20 retlw d'82' ; #21 retlw d'85' ; #22 retlw d'87' ; #23 retlw d'90' ; #24 retlw d'92' ; #25 retlw d'95' ; #26 retlw d'97' ; #27 retlw d'99' ; #28 retlw d'102' ; #29 retlw d'104' ; #30 retlw d'106' ; #31 retlw d'108' ; #32 retlw d'111' ; #33 retlw d'113' ; #34 retlw d'115' ; #35 retlw d'117' ; #36 retlw d'119' ; #37 retlw d'121' ; #38 retlw d'123' ; #39 retlw d'125' ; #40 retlw d'127' ; #41 retlw d'129' ; #42 retlw d'131' ; #43 retlw d'132' ; #44 retlw d'134' ; #45 retlw d'136' ; #46 retlw d'138' ; #47 retlw d'140' ; #48 retlw d'141' ; #49 retlw d'143' ; #50 retlw d'145' ; #51 retlw d'146' ; #52 retlw d'148' ; #53 retlw d'150' ; #54 retlw d'151' ; #55 retlw d'153' ; #56 retlw d'154' ; #57 retlw d'156' ; #58 retlw d'157' ; #59 retlw d'159' ; #60 retlw d'160' ; #61 retlw d'162' ; #62 retlw d'163' ; #63 retlw d'164' ; #64 retlw d'166' ; #65 retlw d'167' ; #66 retlw d'168' ; #67 retlw d'170' ; #68 retlw d'171' ; #69 retlw d'172' ; #70 retlw d'174' ; #71 retlw d'175' ; #72 retlw d'176' ; #73 retlw d'177' ; #74 retlw d'178' ; #75 retlw d'180' ; #76 retlw d'181' ; #77 retlw d'182' ; #78 retlw d'183' ; #79 retlw d'184' ; #80 retlw d'185' ; #81 retlw d'186' ; #82 retlw d'187' ; #83 retlw d'188' ; #84 retlw d'189' ; #85 retlw d'190' ; #86 retlw d'191' ; #87 retlw d'192' ; #88 retlw d'193' ; #89 retlw d'194' ; #90 retlw d'195' ; #91 retlw d'196' ; #92 retlw d'197' ; #93 retlw d'198' ; #94 retlw d'199' ; #95 retlw d'200' ; #96 retlw d'201' ; #97 retlw d'202' ; #98 retlw d'202' ; #99 retlw d'203' ; #100 retlw d'204' ; #101 retlw d'205' ; #102 retlw d'206' ; #103 retlw d'206' ; #104 retlw d'207' ; #105 retlw d'208' ; #106 retlw d'209' ; #107 retlw d'209' ; #108 retlw d'210' ; #109 retlw d'211' ; #110 retlw d'212' ; #111 retlw d'212' ; #112 retlw d'213' ; #113 retlw d'214' ; #114 retlw d'214' ; #115 retlw d'215' ; #116 retlw d'216' ; #117 retlw d'216' ; #118 retlw d'217' ; #119 retlw d'218' ; #120 retlw d'218' ; #121 retlw d'219' ; #122 retlw d'219' ; #123 retlw d'220' ; #124 retlw d'221' ; #125 retlw d'221' ; #126 retlw d'222' ; #127 retlw d'222' ; #128 retlw d'223' ; #129 retlw d'223' ; #130 retlw d'224' ; #131 retlw d'224' ; #132 retlw d'225' ; #133 retlw d'225' ; #134 retlw d'226' ; #135 retlw d'226' ; #136 retlw d'227' ; #137 retlw d'227' ; #138 retlw d'228' ; #139 retlw d'228' ; #140 retlw d'229' ; #141 retlw d'229' ; #142 retlw d'230' ; #143 retlw d'230' ; #144 retlw d'231' ; #145 retlw d'231' ; #146 retlw d'231' ; #147 retlw d'232' ; #148 retlw d'232' ; #149 retlw d'233' ; #150 retlw d'233' ; #151 retlw d'234' ; #152 retlw d'234' ; #153 retlw d'234' ; #154 retlw d'235' ; #155 retlw d'235' ; #156 retlw d'235' ; #157 retlw d'236' ; #158 retlw d'236' ; #159 retlw d'236' ; #160 retlw d'237' ; #161 retlw d'237' ; #162 retlw d'238' ; #163 retlw d'238' ; #164 retlw d'238' ; #165 retlw d'239' ; #166 retlw d'239' ; #167 retlw d'239' ; #168 retlw d'239' ; #169 retlw d'240' ; #170 retlw d'240' ; #171 retlw d'240' ; #172 retlw d'241' ; #173 retlw d'241' ; #174 retlw d'241' ; #175 retlw d'241' ; #176 retlw d'242' ; #177 retlw d'242' ; #178 retlw d'242' ; #179 retlw d'243' ; #180 retlw d'243' ; #181 retlw d'243' ; #182 retlw d'243' ; #183 retlw d'244' ; #184 retlw d'244' ; #185 retlw d'244' ; #186 retlw d'244' ; #187 retlw d'245' ; #188 retlw d'245' ; #189 retlw d'245' ; #190 retlw d'245' ; #191 retlw d'245' ; #192 retlw d'246' ; #193 retlw d'246' ; #194 retlw d'246' ; #195 retlw d'246' ; #196 retlw d'247' ; #197 retlw d'247' ; #198 retlw d'247' ; #199 retlw d'247' ; #200 retlw d'247' ; #201 retlw d'248' ; #202 retlw d'248' ; #203 retlw d'248' ; #204 retlw d'248' ; #205 retlw d'248' ; #206 retlw d'248' ; #207 retlw d'249' ; #208 retlw d'249' ; #209 retlw d'249' ; #210 retlw d'249' ; #211 retlw d'249' ; #212 retlw d'250' ; #213 retlw d'250' ; #214 retlw d'250' ; #215 retlw d'250' ; #216 retlw d'250' ; #217 retlw d'250' ; #218 retlw d'250' ; #219 retlw d'251' ; #220 retlw d'251' ; #221 retlw d'251' ; #222 retlw d'251' ; #223 retlw d'251' ; #224 retlw d'251' ; #225 retlw d'251' ; #226 retlw d'252' ; #227 retlw d'252' ; #228 retlw d'252' ; #229 retlw d'252' ; #230 retlw d'252' ; #231 retlw d'252' ; #232 retlw d'252' ; #233 retlw d'252' ; #234 retlw d'253' ; #235 retlw d'253' ; #236 retlw d'253' ; #237 retlw d'253' ; #238 retlw d'253' ; #239 retlw d'253' ; #240 retlw d'253' ; #241 retlw d'253' ; #242 retlw d'254' ; #243 retlw d'254' ; #244 retlw d'254' ; #245 retlw d'254' ; #246 retlw d'254' ; #247 retlw d'254' ; #248 retlw d'254' ; #249 retlw d'254' ; #250 retlw d'254' ; #251 retlw d'254' ; #252 retlw d'255' ; #253 retlw d'255' ; #254 END