00001 ;******************************************* 00002 ; PIC12F629 テストプログラム 00003 ;******************************************* 00004 ; 00005 ; PIC12F629のピン配置 00006 ; 00007 ;Pin1 Vdd +2V to +5.5V 電源 00008 ; 2 GP5, T1CKI, OSC1, CLKIN 00009 ; 3 GP4, T1G, OSC2, CLKOUT 00010 ; 4 GP3, MCLR, Vpp 00011 ; 5 GP2, T0CLI, INT, COUT 00012 ; 6 GP1, CIN-, ICSPCLK 00013 ; 7 GP0, CIN+, ICSPDAT 00014 ; 8 Vss 0V 電源 00015 00016 list p=12f629 ; 翻訳時にリストファイルを作る 00017 #include "p12f629.inc" ; 12F629用定義ファイルを読み込む 00018 errorlevel -302 ; 翻訳時に302エラーが出ないようにする 00019 2007 3F84 00020 __CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT 00021 00022 radix dec ; 省略時の数値表現を10進数にします。 00023 00024 ;---------- RAM AREA ---------- 00000020 00025 u_ram equ 0x20 ; ramは20H番地から 00000020 00026 w_temp equ u_ram 00000021 00027 s_temp equ u_ram+1 00028 00029 ;---------- PROGARAM ---------- 0000 00030 vc_reset: 0000 00031 org 0 ; リセット後はここからプログラムを開始 0000 2804 00032 goto start 00033 0004 00034 org 4 ; 割り込みはここから(今回は使わない) 0004 00035 start: ; 電源投入直後の「準備の処理」 0004 1283 00036 bcf STATUS,RP0 ; バンク0 に切り換える 0005 0185 00037 clrf GPIO ; 一旦 GPIO を クリア(00000000) 0006 1683 00038 bsf STATUS,RP0 ; バンク1 に切り換える 0007 3018 00039 movlw B'00011000' ; GP3,4 = 入力(1), GP0,1,2,5 = 出力(0)に設定 0008 0085 00040 movwf TRISIO ; TRISO ← w 0009 3010 00041 movlw B'00010000' ; GP4 をプルアップに設定 000A 0095 00042 movwf WPU ; WPU ← w 000B 1381 00043 bcf OPTION_REG,NOT_GPPU ; ウィークプルアップを使うに設定 000C 1283 00044 bcf STATUS,RP0 ; バンク0 に戻す 00045 000D 00046 main: ; ここから「メインの処理」 000D 1A05 00047 btfsc GPIO,GP4 ; GP4ビットが0なら次命令をスキップ 000E 2811 00048 goto ledoff ; GP4ビットが1の時のみledoffにジャンプ 000F 00049 ledon: 000F 1285 00050 bcf GPIO,GP5 ; GP5ビットに 0を書き込む(LED点灯) 0010 280D 00051 goto main ; main に戻る 0011 00052 ledoff: 0011 1685 00053 bsf GPIO,GP5 ; GP5ビットに 1を書き込む(LED消灯) 0012 280D 00054 goto main ; main に戻る 00055 00056 END ; プログラムの終了●リロケータブルな記述方法(12F675の場合)
Address Value Source ------- ------- ---------------------------------------------------- ;*************************************************** ; PIC12F675 テストプログラム(チャタリング対策付き) ; ・・・タイマー及びキー入力割り込みを使用 ;*************************************************** ; ; PIC12F675のピン配置(12F629のA/Dコンバータ付き) ;Pin1 Vdd +2V to +5.5V 電源 ; 2 GP5, T1CKI, OSC1, CLKIN ; 3 GP4, AN3, T1G, OSC2, CLKOUT ; 4 GP3, MCLR, Vpp ; 5 GP2, AN2, T0CLI, INT, COUT ; 6 GP1, AN1, CIN-, Vref, ICSPCLK ; 7 GP0, AN0, CIN+, ICSPDAT ; 8 Vss 0V 電源 ;=================================================== list p=12f675 ; 翻訳時にリストファイルを作る include "p12f675.inc" ; 12F675用定義ファイルを読み込む errorlevel -302 ; 翻訳時に302エラーが出ないようにする 002007 3f84 __CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT radix dec ; 省略時の数値表現を10進数にする ;---------- CONST ------------- STRCNT equ 10 ; 時間待ちカウンタの初期値(200mS) STRTM0 equ 178 ; タイマー0のカウント初期値(20ms毎) ; 256 - 20mS/(0.001mS x 256) ;---------- RAM AREA ---------- group1 udata_shr ; <ここからユーザーメモリの割り当て> w_temp res 1 ; 割り込み時のwレジスタの一時待機場所 s_temp res 1 ; 割り込み時のSTATUSレジスタの待機場所 tmcnt res 1 ; 時間待ちカウンタ chatflg res 1 ; チャタリング待機中フラグ keyflg res 1 ; キー入力確定フラグ ;---------- PROGARAM ---------- vreset code 0 ; code は、「ここからプログラム」の意味 000000 2822 goto start ;---------- INTALUPT OPERATION ---------- intope code 4 ; 割り込み処理の開始番地 push: 000004 00a0 movwf w_temp ; メイン処理で使用していた wレジスタを待避 000005 0803 movf STATUS,w ; 同じくSTATUSレジスタを待避 000006 00a1 movwf s_temp ; s_temp ← w int_gpio: ; <入力ピン割り込み処理> 000007 1c0b btfss INTCON,GPIF ; 入力ピン割り込みか?(GPIF=1ならskip) 000008 2814 goto inttm0 ; ・・でなければ、タイマー割り込み処理へ 000009 100b bcf INTCON,GPIF ; 入力ピン割り込みフラグをクリア 00000a 1a23 btfsc chatflg,GP4 ; チャタリング処理中か?(GP4=0ならskip) 00000b 281d goto pop ; ・・処理中なら、何もしない 00000c 1623 bsf chatflg,GP4 ; チャタリング処理中フラグをセット 00000d 300a movlw STRCNT ; 時間待ちカウンタに初期値を 00000e 00a2 movwf tmcnt ; tmcnt ← w inttmset: ; <タイマー初期値セットのエントリー> 00000f 30b2 movlw STRTM0 ; タイマー0に初期値をセット 000010 0081 movwf TMR0 ; TMR0 ← w 000011 168b bsf INTCON,T0IE ; タイマー割り込みを許可 000012 118b bcf INTCON,GPIE ; 入力ピン割り込みを禁止 000013 281d goto pop ; 割り込みから戻る inttm0: ; <タイマー割り込み処理> 000014 1d0b btfss INTCON,T0IF ; タイマー0割り込みか?(T0IF=1ならskip) 000015 281d goto pop ; ・・でなければ、割り込みから戻る 000016 110b bcf INTCON,T0IF ; タイマー0割り込みフラグをクリア 000017 0ba2 decfsz tmcnt,f ; カウンタを1つ減らす 000018 280f goto inttmset ; 0でなければ再度タイマー待ちへ 000019 1223 bcf chatflg,GP4 ; チャタリング待ちフラグをクリア ; btfss GPIO,GP4 ; GP4=1ならskip(再確認が必要なら) 00001a 1624 bsf keyflg,GP4 ; キーデータ入力フラグをセット 00001b 128b bcf INTCON,T0IE ; タイマー0割り込みを禁止 00001c 158b bsf INTCON,GPIE ; 入力ピン割り込みを許可 pop: 00001d 0821 movf s_temp,w ; 割り込み前のSTATUSレジスタを復帰 00001e 0083 movwf STATUS ; STATUS ← w 00001f 0ea0 swapf w_temp,f ; 割り込み前のwレジスタを復帰 000020 0e20 swapf w_temp,w ; フラグが変化しないswap命令を使用 000021 0009 retfie ; retfie命令で メイン処理へ戻る ;---------- MAIN OPERATION ---------- start: ; 電源投入直後の「準備の処理」 000022 1283 bcf STATUS,RP0 ; バンク0 に切り換える 000023 0185 clrf GPIO ; 一旦 GPIO を クリア(00000000)する 000024 3007 movlw B'00000111' ; コンパレータ使用しないに設定 000025 0099 movwf CMCON ; CMCON ← w 000026 1683 bsf STATUS,RP0 ; バンク1 に切り換える 000027 3018 movlw B'00011000' ; GP3,4 = 入力, GP0,1,2,5 = 出力に設定 000028 0085 movwf TRISIO ; TRISO ← w 000029 019f clrf ANSEL ; アナログ入力を使用しないに設定 00002a 3010 movlw B'00010000' ; GP4をウィークプルアップ 00002b 0095 movwf WPU ; WPU ← w 00002c 3007 movlw B'00000111' ; WPU使用、プリスケーラを256に 00002d 0081 movwf OPTION_REG ; OPTION ← w 00002e 3010 movlw B'00010000' ; GP4をキー入力割り込み許可 00002f 0096 movwf IOC ; IOC ← w 000030 1283 bcf STATUS,RP0 ; バンク0 に戻す 000031 01a3 clrf chatflg ; chatflgフラグを全てクリア 000032 01a4 clrf keyflg ; keyflgフラグを全てクリア 000033 158b bsf INTCON,GPIE ; 入力ピン割り込みを許可 000034 178b bsf INTCON,GIE ; グローバル割り込みを許可 main: 000035 0885 movf GPIO,f ; GPIOにデータをラッチさせる 000036 1e24 btfss keyflg,GP4 ; keyflgのGP4=1なら次命令をskip 000037 2835 goto main ; スイッチ入力がないのでmainに戻る 000038 1224 bcf keyflg,GP4 ; keyflgフラグをクリア 000039 1e85 btfss GPIO,GP5 ; GPIOのGP5=1なら次命令をskip 00003a 283d goto ledoff ; GP5=0 ならledoffへ ledon: 00003b 1285 bcf GPIO,GP5 ; GPIOのGP5に0を書き込む(LED点灯) 00003c 2835 goto main ; main に戻る ledoff: 00003d 1685 bsf GPIO,GP5 ; GPIOのGP5に1を書き込む(LED消灯) 00003e 2835 goto main ; main に戻る END ; プログラムの終了