; ; PIC12F683 ; ; GP0:AN0 ADコンバータ(入力) ; GP1:   充電スイッチ   Low:ON Red LED ; GP2:   負荷スイッチ   Hight:ON Green LED ; GP3:   Emagency SW 30sec Load on ; GP4:   LED control ; GP5:   LED control list P=12f683 #include P12F683.INC __CONFIG _CP_OFF & _CPD_OFF & _WDT_OFF & _BOD_OFF & _IESO_OFF& _PWRTE_OFF & _INTOSCIO & _MCLRE_OFF FREECNTL equ 0x20 ;フリーランカウント L FREECNTH equ 0x21 ; H ADVH equ 0x22 ;000000XX 00000010 10.5V to 15V >> 左寄せで格納、Not use 2Bit ADVL equ 0x23 ;XXXXXXXX total 10bit <> CNT1 equ 0x24 ;Use 5ms Timer CNT2 equ 0x25 ;Use 5ms timer LEDINT equ 0x26 ;Led Control Interval Time TASKCNTL equ 0x27 CHGSTS equ 0x28 ;xxxx000 : STS00 = ;xxxx001 : sts01 ;xxxx010 : sts02 ;xxxx011 : sts03 ;xxxx100 : sts04 ;xxxx101 : sts05 CNT3 equ 0x29 VLTSTS equ 0x2A ;b6=1:LowerVolt VGPIO equ 0x2B ;b7=1:OverCharge GPIO3SW equ 0x2C ;b0=1:Altnate SW PCLATH_TEMP equ 0x50 W_TEMP equ 0x51 STATUS_TEMP equ 0x52 ;Max 5F ; EADR equ 0xA0 EDAT equ 0xA1 VADJ equ 0xA2 ;プログラム領域 0H−FFH org 0x00 bcf STATUS,RP0 goto start ;割り込み処理 org 0x04 movwf W_TEMP ; wレジスタを一時レジスタへ swapf STATUS, W ; STATUSレジスタをwへ clrf STATUS ; バンク0にする movwf STATUS_TEMP ; コピーしたSTATUSレジスタを一時レジスタへ movf PCLATH, W ; PCLATHを保存する movwf PCLATH_TEMP clrf PCLATH ; PCLATHで指定するページも0にする ; 割り込み処理 割り込み原因 BTFSS INTCON,T0IF ; TMR0割込み? goto int_next1 ; timer0 interrut prosess BCF INTCON,T0IF ; 割込みフラグクリア movlw 0xC0 movwf TMR0 movfw CHGSTS sublw 0x90 ;電圧低下,緊急要充電 btfsc STATUS,C ; call chgsts04 ;10.5V以下 LED1,LED2 blink decfsz LEDINT ; goto int_next1 ; movlw 0x02 movwf LEDINT call LedControl incfsz FREECNTL goto int_next1 movlw 0xFC ;Free Run Timer Adast movwf FREECNTL btfsc GPIO,3 ;GPIO3 SW on ?? (abaut30sec) goto int_next11 btfss VLTSTS,6 ;Lower Volt ? goto int_next12 bsf GPIO3SW,0 ;Em-Mode GPIO3SW = on goto int_next1 ;ALTSW Check int_next12 ;Not Lower Volt btfsc GPIO3SW,1 ;ALT SW ?? goto sw_reverse1 bsf GPIO3SW,1 ;ALT SW on goto int_next1 sw_reverse1 bcf GPIO3SW,1 ;ALT SW off goto int_next1 ;30sec Timer int_next11 incfsz FREECNTH ;abaut30sec goto int_next1 bcf GPIO3SW,0 ;EM-SW =off movlw 0xF0 movwf FREECNTH int_next1 ; 他の割り込み要因 何かあれば記述 pop movf PCLATH_TEMP, W ; PCLATHを戻す movwf PCLATH ; swapf STATUS_TEMP, W ; STATUSレジスタをwへ movwf STATUS ; STAUTSレジスタを戻す ; バンクも元に戻る swapf W_TEMP, F ; swapf を2回行うことでwレジスタを戻す swapf W_TEMP, W ; これは STATUSレジスタに影響させないため retfie ; 割り込みからの復帰 ;PIC12F683初期設定 start MOVLW 0x07 MOVWF CMCON0 ;GP2-0はデジタルIO MOVLW 0x01 MOVWF ADCON0 ;ADON=1 AD Converter Start bsf STATUS,RP0 ;Change Page1 MOVLW 0x0B MOVWF TRISIO ; GP0,1,3 = Input,GP2,4,5 = Output movlw 0x02 ;GP1 PullUp movwf WPU ;Pull Up MOVLW 0x07 ; OPTIONレジスタの設定 MOVWF OPTION_REG ; ^GPPU:0 ,INTEDG:0 ,T0CS:0 ,PSA:0 ,PS2-PS0:111 MOVLW 0x21 ;0x01:Clock=31KHz , 0x21:Clock=250KHz , 0x41:CLOCK=1MHz MOVWF OSCCON movlw 0x71 movwf ANSEL ;AN0=Use, Clock=Internal bcf STATUS,RP0 ;Change Page0 CLRF GPIO ; GPIOをクリア movlw 0xC0 ;abaut 500ms interval / 250KHz movwf TMR0 MOVLW 0xA0 MOVWF INTCON ; GIE:1 ,T0IE:1(TMR0割り込み許可) at_start_setting movlw 0xFC movwf FREECNTL movlw 0xF0 movwf FREECNTH movlw 0x02 movwf LEDINT movlw 0x14 movwf TASKCNTL movlw 0x02 movwf GPIO3SW ;b0:Em-sw off , b1:ALT-sw on V_adj bsf STATUS,RP0 clrf EADR call read_eeprom bsf STATUS,RP0 movwf VADJ bcf STATUS,RP0 ;Change Page0 ;メイン処理 main call time_dilay ; decfsz TASKCNTL ; goto main ; movlw 0x14 movwf TASKCNTL call adconvert ;AD Convert btfss GPIO,1 call adj12v ;call if GPIO1=Low bsf STATUS,RP0 movfw VADJ ;Volt Adjust bcf STATUS,RP0 ;Change Page0 addwf ADVH ; movfw ADVH sublw D'104' ;10.5V btfsc STATUS,C ; goto sts90 ;Under 10.5V movfw ADVH sublw D'109' ;11.0V btfsc STATUS,C ; goto sts00 ;Under 11.0V movfw ADVH sublw D'114' ;11.5V btfsc STATUS,C ; goto sts01 movfw ADVH sublw D'129' ;13V btfsc STATUS,C ; goto sts02 movfw ADVH sublw D'134' ;13.5V btfsc STATUS,C ; goto sts03 movfw ADVH sublw D'139' ;14V btfsc STATUS,C ; goto sts04 goto main sts90 bcf VGPIO,2 ;Load off bsf VLTSTS,6 ;Set Lower level movlw 0x90 goto sw_chk sts00 bcf VGPIO,2 ;Load off bsf VLTSTS,6 ;Set Lower level movlw 0x00 goto sw_chk sts01 btfss VLTSTS,6 goto sts01_1 bcf VGPIO,2 ;Load off goto sts01_2 sts01_1 bsf VGPIO,2 ;Load on sts01_2 movlw 0x01 goto sw_chk sts02 movlw 0x02 goto sts02_04 sts03 movlw 0x03 goto sts02_04 sts04 movlw 0x04 sts02_04 bsf VGPIO,2 ;Load on bcf VLTSTS,6 ;Over Charge Flag sw_chk btfsc GPIO3SW,0 ;Em-SW on ?? goto load_on ;to Load on btfss GPIO3SW,1 ;ALT SW off ?? goto load_off ;ALT-SW = off btfsc VGPIO,2 goto load_on load_off bcf GPIO,2 movwf CHGSTS goto main ;Load off load_on bsf GPIO,2 setsts movwf CHGSTS goto main ; ; time_dilay MOVLW 0x08 MOVWF CNT2 TIMLP2 movlw 0x0A movwf CNT1 TIMLP1 DECFSZ CNT1,F GOTO TIMLP1 DECFSZ CNT2,F GOTO TIMLP2 RETURN ; adconvert bcf STATUS,RP0 bsf ADCON0,GO ;AD Convert Start btfsc ADCON0,GO ; goto $-1 bcf PIR1,ADIF ;AD変換割り込みフラグ消去//・・・念のため movf ADRESH,W movwf ADVH ;ADコンバート上位ビット格納,左詰めモード(下位2ビット無視) return LedControl movfw CHGSTS sublw 0x00 ; btfsc STATUS,C ; goto chgsts00 ; movfw CHGSTS sublw 0x01 ; btfsc STATUS,C ; goto chgsts01 ; movfw CHGSTS sublw 0x02 ; btfsc STATUS,C ; goto chgsts02 ; movfw CHGSTS sublw 0x03 ; btfsc STATUS,C ; goto chgsts03 ; movfw CHGSTS sublw 0x04 ; btfsc STATUS,C ; goto chgsts04 ; return chgsts00 bsf GPIO,4 ;off call LED1blink ;on return chgsts01 bcf GPIO,4 ;on bsf GPIO,5 ;off return chgsts02 bcf GPIO,4 ;on bcf GPIO,5 ;on return chgsts03 bcf GPIO,4 ;on call LED1blink ;Blink return chgsts04 call LED1blink ;Blink call LED2blink ;Blink return LED1blink btfsc GPIO,5 goto +3 bsf GPIO,5 return bcf GPIO,5 return LED2blink btfsc GPIO,4 goto +3 bsf GPIO,4 return bcf GPIO,4 return ; ; adj12v movfw ADVH sublw D'120' ;12V 0x78 bsf STATUS,RP0 ;Change Page1 movwf EDAT movwf VADJ ; clrf EADR bcf STATUS,RP0 ;Change Page0 call write_eeprom bcf INTCON,GPIE ;割り込みを無効にする movlw 0xFF movwf CNT3 bsf GPIO,4 ;LED signal write_end bsf GPIO,5 call time_dilay decfsz CNT3 goto $-2 movlw 0xFF movwf CNT3 bcf GPIO,4 ;LED signal write_end bcf GPIO,5 call time_dilay decfsz CNT3 goto $-2 movlw 0xFF movwf CNT3 bsf GPIO,4 ;LED signal write_end bsf GPIO,5 call time_dilay decfsz CNT3 goto $-2 bsf INTCON,GPIE ; 割り込みを有効にする return write_eeprom bsf STATUS,RP0 ;Change Page1 movf EADR,W ; アドレス(00-FF) movwf EEADR movf EDAT,W ; データ movwf EEDAT bcf STATUS,RP0 ;Change Page0 bcf INTCON,GPIE ;割り込みを無効にする bsf STATUS,RP0 ;Change Page1 bsf EECON1,WREN ;書き込みを有効にする movlw 0x55 ;書き込み命令 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1,WR ; 書き込みを開始 btfsc EECON1,WR ;書き込み確認待ちループ goto $-1 bcf STATUS,RP0 ;Change Page0 bsf INTCON,GPIE ; 割り込みを有効にする return read_eeprom bsf STATUS,RP0 ;Change Page1 movfw EADR ; EEPROM アドレス movwf EEADR bsf EECON1,RD ; EEPROM データを読みとる movf EEDAT,W ; EEPROM データ → W レジスタ bcf STATUS,RP0 ;Change Page0 return END