;オートバイギアポジション表示 Ver 1.11 NAO TECHUNOHUT 2007-02-12(祝) ; ;[プログラム概要] ; ・オートバイ用のギアポジションを表示するプログラム。 ; ・7セグメントLEDで表示する。【アノードコモン用】 ; ・1速〜6速表示。ニュートラルはゼロ表示。 ; ;   A ;   ─ ; F│G│B ;   ─ ; E│ │C ;   ─ .DP E D - C B A F G ;   D ra,# X X X X X X X X b ; ; 0/ 0 0 0 0 0 0 0 1 ; 1/ 1 1 0 0 0 1 1 1 ; 2/ 0 0 0 1 0 0 1 0 ; 3/ 1 0 0 0 0 0 1 0 ; 4/ 1 1 0 0 0 1 0 0 ; 5/ 1 0 0 0 1 0 0 0 ; 6/ 0 0 0 0 1 0 0 0 ; E/ 0 0 0 1 1 0 0 0 ; ; ・オシレーターは基本的に内部 RC 31.25kHzを使用する。(1命令処理時間 0.000128秒) ; (1番遅い設定だが、これで十分である。) ; ・各ギア間に不感帯部があり、チェンジの瞬間発生する。その時間を考慮。 ; ・ギアポジション入力はRBのプルアップ機能を使用する。 ; ・ウォッチドックタイマーを使用する。(エラー時、約1秒で点滅するように調整する) ; ;[PIC選定その他仕様] ; ・PIC16F88-I/P使用。(秋月電子通商で230円/個) ; ・MCLRは外配線を簡略するため内部接続モードとする。 ; ┌─┰─┐ ; 7LED_A RA2 ┥ ┝ RA1 7LED_F ; 7LED_B RA3 ┥ ┝ RA0 7LED_G ; 7LED_C RA4 ┥ ┝ RB7 7LED_E ; (未使用) (#04)┥PIC ┝ RB6 7LED_D ; Vss ┥ 16F88┝ Vdd 5.0V ; ニュートラル入力 RB0 ┥ ┝ RB7 (未使用) ; 1速入力 RB1 ┥ ┝ RB6 6速入力 ; 2速入力 RB2 ┥ ┝ RB5 5速入力 ; 3速入力 RB3 ┥ ┝ RB4 4速入力 ; └───┘ ; ※#04(RA5)は入力のみなので注意 ; ;-------PIC初期状態確認-----------------;(△:変更必要) ;Bank 0 ; tmr0 xxxxxxxx ; タイマー0の状態 ; status 00011xxx ; Bankセレクト設定、各旗の状態 ; porta xxx00000 ;△RAピン出力状態(xは不定) ; portb 00xxxxxx ;△RBピン出力状態(xは不定) ; intcon 0000000x ; 割り込み他、設定 ; pir1 -0000000 ; 旗状態(A/D、タイマー、 ; pir2 00-0---- ; EEメモリー、他) ; tmr1l xxxxxxxx ; タイマー1下位8bitの状態 ; tmr1h xxxxxxxx ; タイマー1上位8bitの状態 ; t1con --000000 ; タイマー1コントロール関係設定 ; tmr2 00000000 ; タイマー2の状態 ; t2con -0000000 ; タイマー2コントロール関係設定 ; sspbuf xxxxxxxx ; 装置内通信SPI通信機能 ; sspcon 00000000 ;  ; ccpr1l xxxxxxxx ;  ; ccpr1h xxxxxxxx ;  ; ccp1con --000000 ; キャプチャ/コンペア/PWM ; adresh xxxxxxxx ; A/D変換値9、10bit? ; adcon0 000000-0 ; A/Dコントロール関係設定 ;Bank 1 ; option_reg 11111111 ; プルアップ、プリスケーラー比率他、設定 ; trisa 11111111 ;△RAピンI/O制御設定(1は入力) ; trisb 11111111 ;△RBピンI/O制御設定(1は入力) ; pie1 -0--0000 ; A/D、CCP、タイマー、EEメモリーの ; pie2 ---0---- ; 割り込み使用するしない設定 ; pcon ------qq ; パワーオン、低電圧リセットの? ; osccon -000-0-- ; 内部RCオシレーター周波数設定 ; osctune --000000 ; 内蔵RCオシレーター微調整 ; pr2 11111111 ;  ; sspadd 00000000 ;  ; sspstat 00000000 ;  ; txsta 0000-010 ; spbrg 00000000 ; ansel -1111111 ;△アナログorデジタルI/O設定 ; cmcon 00000111 ; cvrcon 000-0000 ; adresl xxxxxxxx ; A/D変換値0〜8bit ; adcon1 00--0000 ; A/Dピン設定 ;Bank 2 ; wdtcon ---01000 ; ウォッチドックタイマー分周 ; eedata xxxxxxxx ; EEメモリーの状態 Lo? ; eeadr xxxxxxxx ; EEメモリーのアドレス位置 Lo ; eedath --xxxxxx ; EEメモリーの状態 Hi? ; eeadrh -----xxx ; EEメモリーのアドレス位置 Hi ;Bank 3 ; eecon1 x--xx000 ; EEメモリー関係設定 ; eecon2 -------- ; EEメモリー関係設定? ; ;[凡例] (自分で分かりやすいように目印を付ける) ; mXXX:メモリー rXXX:ラベル sXXX:サブルーチン vXXX:変数 ★:調整箇所など ; ; CVASM16アセンブラ用記述 ;-------PICコンフィギュレーション設定---; include '16f88.inc' fuses _intrc_io ;オシレーター設定→内蔵、ピンはra6設定 fuses _wdt_on ;ウォッチドックタイマー→有効 fuses _pwrte_on ;電源投入72ms間リセット→有効 fuses _mclr_off ;MCLR端子(リセット)→設定しない fuses _boden_off ;低電圧リセット(約4V以下)→無効 fuses _lvp_off ;低電圧プログミング(5V)→無効 fuses _cpd_off ;eepromのコードプロテクト→無効 fuses _wrt_enable_off ;eeconのFlashメモリ可能→しない fuses _debug_off ;インサーキットデバックモード→無効 fuses _ccp1_rb2 ;PWMピン選定(_rb2or_rb3) fuses _cp_off ;コードプロテクト→無効 fuses _fcmen_off ;フェイルセーフクロックモニター? fuses _ieso_off ;内部/外部スイッチオーバーモード? id '0111' ;Ver1.11 ;-------プログラムメモリー割当----------; mGEAR = 20h ; mERROR_C = 21h ; ;-------代入数設定----------------------; vERROR_C = 150 ;★不感帯時間調整(エラー消灯に影響あり) ;=======プログラム初期設定==============; clr wdt ;ウォッチドックタイマー mov ra,#11011111b ;7セグ表示無 mov mGEAR,#255 ;あり得ないギア数を入れておく mov mERROR_C,#vERROR_C ;エラーカウター setb rp0 ;ページ変更(Bank 1へ) ;Bank 1 mov option_reg,#01111111b ;RB入力プルアップ設定 mov trisa,#00100000b ;RAはすべて出力ピンに設定 ; mov trisb,#11111111b ;RBはすべて入力ピンに設定 mov ansel,#00000000b ;RBはすべてデジタルピンに設定 clrb rp0 ;ページ変更(Bank 0へ戻す) setb rp1 ;ページ変更(Bank 2へ) ;Bank 2 mov wdtcon,#00000100b ;1:128 clrb rp1 ;ページ変更(Bank 0へ戻す) ;Bank 0 ;↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ; ;***[ メインループ ]********************; ;ギアポジションチェックの繰り返し rREPEAT jnb rb.0,rGEAR_0 ;ニュートラルか? rRE_1 jnb rb.1,rGEAR_1 ;1速か? rRE_2 jnb rb.2,rGEAR_2 ;2速か? rRE_3 jnb rb.3,rGEAR_3 ;3速か? rRE_4 jnb rb.4,rGEAR_4 ;4速か? rRE_5 jnb rb.5,rGEAR_5 ;5速か? rRE_6 jnb rb.6,rGEAR_6 ;6速か? rERROR djnz mERROR_C,rREPEAT ; mov ra,#00011000b ;「E」表示 clr wdt ;ウォッチドックタイマー jmp $ ; ;***** ;7セグメントLED表示 rGEAR_0 clr wdt ;ウォッチドックタイマー cje mGEAR,#0,rREPEAT ;既に「0」表示になっていれば何もしない mov ra,#00000001b ;「0」表示 mov mGEAR,#0 ; mov mERROR_C,#vERROR_C ;エラーカウターを元に戻しておく jmp rREPEAT ; rGEAR_1 clr wdt ;ウォッチドックタイマー cje mGEAR,#1,rRE_1 ;既に「1」表示になっていれば何もしない mov ra,#11000111b ;「1」表示 mov mGEAR,#1 ; mov mERROR_C,#vERROR_C ;エラーカウターを元に戻しておく jmp rRE_1 ; rGEAR_2 clr wdt ;ウォッチドックタイマー cje mGEAR,#2,rRE_2 ;既に「2」表示になっていれば何もしない mov ra,#00010010b ;「2」表示 mov mGEAR,#2 ; mov mERROR_C,#vERROR_C ;エラーカウターを元に戻しておく jmp rRE_2 ; rGEAR_3 clr wdt ;ウォッチドックタイマー cje mGEAR,#3,rRE_3 ;既に「3」表示になっていれば何もしない mov ra,#10000010b ;「3」表示 mov mGEAR,#3 ; mov mERROR_C,#vERROR_C ;エラーカウターを元に戻しておく jmp rRE_3 ; rGEAR_4 clr wdt ;ウォッチドックタイマー cje mGEAR,#4,rRE_4 ;既に「4」表示になっていれば何もしない mov ra,#11000100b ;「4」表示 mov mGEAR,#4 ; mov mERROR_C,#vERROR_C ;エラーカウターを元に戻しておく jmp rRE_4 ; rGEAR_5 clr wdt ;ウォッチドックタイマー cje mGEAR,#5,rRE_5 ;既に「5」表示になっていれば何もしない mov ra,#10001000b ;「5」表示 mov mGEAR,#5 ; mov mERROR_C,#vERROR_C ;エラーカウターを元に戻しておく jmp rRE_5 ; rGEAR_6 clr wdt ;ウォッチドックタイマー cje mGEAR,#6,rRE_6 ;既に「6」表示になっていれば何もしない mov ra,#00001000b ;「6」表示 mov mGEAR,#6 ; mov mERROR_C,#vERROR_C ;エラーカウターを元に戻しておく jmp rRE_6 ; ;***[ メインループここまで ]************; ;↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ ;