;********************************************************************************************* ; MPLABアセンブラ用 Ver2(16F628A用) H17.10.15 17:20 ; ; ; 【 機 能 】 リバースミラーユニット ; ; 【 履 歴 】 Ver1 ; ・通常のミラーSWは使用可能 ; ・リバース信号入力にて、ドアミラーモーター下信号発信 ; ・リバース信号入力切れ後に数秒はその状態を保持 ; ・その後、通常位置へミラーモーター上信号発信で復帰 ; ・なお、運転席/助手席ミラーの制御対象は標準のSWで選択 ; ・ミラー倒立SWon(12V)で上記機能をキャンセル ; ; 【 PIC 】 PIC16F628A用 ; ; 【 ボード 】 リバースミラー専用基板 ; ; 【 言 語 】 MPLAB用アセンブル + マクロ使用(pic_macro3.asmを使用) ; ; 【 I/Oピン】PIC16F62x/62xA ;   ------------ ; 上下左右M GND用Tr =|RA2 RA1|= 上下M GND用Tr ;          =|RA3 RA0|= バック信号(バックで12v) ;          =|RA4 RA7|= (NON) *但しツェナーダイオード接続済 ;     =|RA5 RA6|= (NON) ; - in =|Vss Vdd|= + in ;         =|RB0 RB7|= ;  上下左右M 12V用Tr =|RB1 RB6|= ; 上下M 12V用Tr    =|RB2 RB5|= ; 左右M 切断用Tr =|RB3 RB4|= 設定SW ; ------------ ;********************************************************************************************* ; CONFIG設定(PIC16F62xA) ; ; 【 発振子設定 】 ; _INTRC_OSC_NOCLKOUT :内部発振子4MHz ; _HS_OSC :外部発振子4〜20MHz(セラロック接続時) ;  注)通常は上記2つのみ使用(以下参考まで) ; _RC_OSC_CLKOUT :RA6/OSC2をCLKOUT、RA7/OSC1を抵抗器を接続して内蔵4MHzを使用 ; _RC_OSC_NOCLKOUT :RA6/OSC2をI/O、RA7/OSC1を抵抗器を接続して内蔵5MHzを使用 ; 【 MCLRE設定 】 ; _MCLRE_ON :MCLRピンとして使用 ; _MCLRE_OFF :RA5ピンとして使用(RA5はInputピン専用) ;--------------------------------------------------------------------------------------------- ;CONFIG設定 LIST p=16F628A,R=DEC ;使用PICはPIC16F628A,デフォルトは10進数 #include ;16F628Aインクルード #include ;マクロファイルをインクルード __CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _LVP_OFF & _BODEN_OFF & _CP_OFF & _DATA_CP_ON ;変数宣言 tim0 EQU 020H ; タイマーカウンター1 tim1 EQU 021H ; タイマーカウンター2 tim2 EQU 022H ; タイマーカウンター3 tim_dn EQU 023H ; タイマーカウンター4 tim_dy EQU 024H ; タイマーカウンター5 E_DATA EQU 034H ; EEPROM書込データ一時保持変数 E_ADRS EQU 035H ; EEPROMデータ開始アドレス downtime EQU 036H ; ミラー下用タイマー plustime EQU 037H ; ミラー上下時間差タイマー delaytime EQU 038H ; ミラー位置保持タイマー customcnt EQU 039H ; 設定用カウンタ #DEFINE SW PORTB,4 ; 設定用SW(通常5v通電) #DEFINE LR_M_cut PORTB,3 ; 左右モーターカット用(ONでカット) #DEFINE UD_M_12v PORTB,2 ; 上下モーター12v(ONで12v) #DEFINE UDLR_12v PORTB,1 ; 上下左右モーター12v(ONで12v) #DEFINE UDLR_GND PORTA,2 ; 上下左右モーターGND(OFFでGND) #DEFINE UD_M_GND PORTA,1 ; 上下モーターGND(ONでGND) #DEFINE BACK PORTA,0 ; バック信号(バックで12v入力) #DEFINE CANCEL PORTA,7 ; キャンセルSW(キャンセル時は12v入力) ;*********************************************************************************************************** org 00h goto start ;リセット時にはSTARTへ org 04h goto start ;割込時にはSTARTへ(割込不使用) ;---------------------------------------------------------------------------------------------------------- ; リセット時処理 ;---------------------------------------------------------------------------------------------------------- start set_port TRISA,00100001b ; PORTA,0,5,6:入力(5は入力のみ) set_port TRISB,00010000b ; PORTB,4は入力、他は出力 port_DIG ; PORTAをデジタルに設定 mov_fl customcnt,0 ; 設定カウンタリセット call read_EEPROM ; EEPROMの読込 call Relay5 ; PICリセット確認用 ;---------------------------------------------------------------------------------------------------------- ; メイン処理 ;---------------------------------------------------------------------------------------------------------- main call Mirrer_normal ; ミラー通常状態へ sb SW ; 設定SW確認(押下で0v) goto custom ; 0vで設定へ nop sb BACK ; バック信号のチェック goto main ; バック信号無しはループ goto Reverse ; バック信号有りは次へ goto main ;*********************************************************** ;各動作時のリレー状態図 * ;----------------------------------------------------------* ; リレー名 通常 ミラー下 ミラー上 * ; LR_M_cut OFF ON ON * ; UD_M_12v OFF OFF ON * ; UD_M_GND OFF ON OFF * ; UDLR_M_12v OFF ON OFF * ; UDLR_M_GND ON ON OFF * ;*********************************************************** Mirrer_down bsf LR_M_cut bcf UD_M_12v bsf UD_M_GND bsf UDLR_12v bsf UDLR_GND return Mirrer_up bsf LR_M_cut bsf UD_M_12v bcf UD_M_GND bcf UDLR_12v bcf UDLR_GND return Mirrer_normal bcf LR_M_cut bcf UD_M_12v bcf UD_M_GND bcf UDLR_12v bsf UDLR_GND return ;---------------------------------------------------------------------------------------------------------- ; バック時の処理 ;---------------------------------------------------------------------------------------------------------- Reverse call Mirrer_down ; ミラーモーター下へ動作 mov_ff tim_dn,downtime ; 設定時間(設定数×100ms) add_fl tim_dn,5 call wait_timer ; をこの状態で保持する call Mirrer_normal ;ReverseCheck ; snb BACK ; バック信号チェック ; goto ReverseCheck ; goto MirReturn MirReturn mov_ff tim_dy,delaytime ; 設定時間(設定数×1s) add_fl tim_dy,3 call delay_timer call Mirrer_up ; ミラーモーター上へ動作 mov_ff tim_dn,downtime ; 設定時間(設定数×100ms) add_fl tim_dn,4 call wait_timer ; をこの状態で保持する mov_ff tim_dn,plustime call plus_timer ; をこの状態で保持する call Mirrer_normal ; ミラー通常状態へ goto main ;---------------------------------------------------------------------------------------------------------- ; 各種設定 custom snb SW goto custom bcf UDLR_GND ; リレーの初期設定 call wait100ms_4MHz call wait100ms_4MHz snb SW goto incdata call wait1s_4MHz sb SW goto inc_custom inc_custom call Relay1 call wait100ms_4MHz call wait100ms_4MHz call Relay2 inc customcnt cje_fl customcnt,4,write_ROM goto custom ;------------------------------------------------------------------------------------ incdata cje_fl customcnt,1,inc_down cje_fl customcnt,2,inc_plus cje_fl customcnt,3,inc_delay cje_fl customcnt,4,write_ROM goto custom ;------------------------------------------------------------------------------------ inc_down inc downtime ; downtime = downtime + 1 call Relay1 cje_fl downtime,11,dt_clr goto custom dt_clr mov_fl downtime,1 call Relay5 goto custom ;------------------------------------------------------------------------------------ inc_plus inc plustime ; plustime = plustime + 1 call Relay2 cje_fl plustime,8,pt_clr cje_fl plustime,4,pt_center goto custom pt_clr mov_fl plustime,1 call Relay5 goto custom pt_center call Relay1 call Relay2 goto custom ;------------------------------------------------------------------------------------ inc_delay inc delaytime ; delaytime = delaytime + 1 call Relay1 call Relay2 cje_fl delaytime,8,lt_clr goto custom lt_clr mov_fl delaytime,1 call Relay5 goto custom ;------------------------------------------------------------------------------------ write_ROM call write_EEPROM call Relay5 call Relay5 mov_fl customcnt,0 ; 設定カウンタリセット goto main ;---------------------------------------------------------------------------------------------------------- ;動作確認用リレー動作 Relay1 bsf UDLR_GND ; リレーの初期設定 call wait100ms_4MHz bcf UDLR_GND ; リレーの初期設定 call wait100ms_4MHz return Relay2 bsf UDLR_GND ; リレーの初期設定 call wait100ms_4MHz bcf UDLR_GND ; リレーの初期設定 call wait100ms_4MHz bsf UDLR_GND ; リレーの初期設定 call wait100ms_4MHz bcf UDLR_GND ; リレーの初期設定 call wait100ms_4MHz return Relay5 bsf UDLR_GND ; リレーの初期設定 call wait100ms_4MHz bcf UDLR_GND ; リレーの初期設定 call wait100ms_4MHz bsf UDLR_GND ; リレーの初期設定 call wait100ms_4MHz bcf UDLR_GND ; リレーの初期設定 call wait100ms_4MHz bsf UDLR_GND ; リレーの初期設定 call wait100ms_4MHz bcf UDLR_GND ; リレーの初期設定 call wait100ms_4MHz bsf UDLR_GND ; リレーの初期設定 call wait100ms_4MHz bcf UDLR_GND ; リレーの初期設定 call wait100ms_4MHz bsf UDLR_GND ; リレーの初期設定 call wait100ms_4MHz bcf UDLR_GND ; リレーの初期設定 call wait100ms_4MHz return ;*** タイマー用サブルーティン **************************************************************************** ;-------------------------------------------------- wait25us_4MHz mov_fl tim0,2 wa30_4MHz mov_fl tim1,2 wa31_4MHz djnz tim1,wa31_4MHz djnz tim0,wa30_4MHz return ;-------------------------------------------------- wait100ms_4MHz mov_fl tim0,250 wa100m1_4 mov_fl tim1,132 wa100m2_4 djnz tim1,wa100m2_4 djnz tim0,wa100m1_4 return ;-------------------------------------------------- wait1s_4MHz mov_fl tim0,50 wa1s1_4 mov_fl tim1,147 wa1s2_4 mov_fl tim2,44 wa1s3_4 djnz tim2,wa1s3_4 djnz tim1,wa1s2_4 djnz tim0,wa1s1_4 return ;-------------------------------------------------- wait_timer wait1 nop call wait100ms_4MHz djnz tim_dn,wait1 return ;-------------------------------------------------- plus_timer waitp nop call wait25us_4MHz djnz tim_dn,waitp return ;-------------------------------------------------- delay_timer waitd nop call wait1s_4MHz djnz tim_dy,waitd return ;--------------------------------------------------------------------------------- ; EEPROMから各設定データの取得処理 ;--------------------------------------------------------------------------------- read_EEPROM clrf E_ADRS call EEPROM_read ; データ取得処理 mov_ff downtime,E_DATA ; downtimeにセット inc E_ADRS call EEPROM_read ; データ取得処理 mov_ff plustime,E_DATA ; plustimeにセット inc E_ADRS call EEPROM_read ; データ取得処理 mov_ff delaytime,E_DATA ; delaytimeにセット return ;--------------------------------------------------------------------------------- ; EEPROMデータ読出(定型処理:PIC16F62x,62xA用) ;--------------------------------------------------------------------------------- EEPROM_read movf E_ADRS,0 ; w = E_ADRS bsf STATUS,RP0 ; page1切替 movwf EEADR ; EEADR = w bsf EECON1,RD ; 読込許可 movf EEDATA,0 ; w = EEDATA bcf STATUS,RP0 ; page0切替 movwf E_DATA ; E_DATA = w return ;--------------------------------------------------------------------------------- ; 各設定データのEEPROMへの書込処理 ;--------------------------------------------------------------------------------- write_EEPROM clrf E_ADRS ; 書込アドレスリセット mov_ff E_DATA,downtime ; E_DATA = downtime call EEPROM_write ; EEPROMへ書込み inc E_ADRS ; 書込アドレスリセット mov_ff E_DATA,plustime ; E_DATA = plustime call EEPROM_write ; EEPROMへ書込み inc E_ADRS ; 書込アドレスリセット mov_ff E_DATA,delaytime ; E_DATA = delaytime call EEPROM_write ; EEPROMへ書込み return ;--------------------------------------------------------------------------------- ; EEPROMデータ書込(定型処理:PIC16F62x,62xA用) ;--------------------------------------------------------------------------------- EEPROM_write movf E_DATA,0 ; w = 書込データ bsf STATUS,RP0 ; page1切替 movwf EEDATA ; EEDATA = w bcf STATUS,RP0 ; page0切替 movf E_ADRS,0 ; w = E_ADRS bsf STATUS,RP0 ; page1切替 movwf EEADR ; EEADR = w bsf EECON1,WREN ; 書込許可 movlw 55h ; (定型処理) movwf EECON2 ;   〃 movlw 0aah ;   〃 movwf EECON2 ;   〃 bsf EECON1,WR ; 書込終了確認フラグ eewait btfsc EECON1,WR ; 書込み終了待ちloop goto eewait ; 書込未終了→書込終了待ち bcf EECON1,WREN ; 書込不許可 bcf STATUS,RP0 ; page0切替 return ;--------------------------------------------------------------------------------- ;EEPROM初期値の宣言 ; モーター下移動時間設定= 1 org 2100h de 3,4,2 end