PICプログララム入門 東海北陸地区国立学校等技術職員合同研修 目次 1) Pic命令語の説明概略 2) レジスタの構成 3) プログラム (入力・出力の例題) 4) MPLABの使用法 (HEXデータ作成) 5) Picへの書き込み・動作チェック 6) 応用プログラムも作成 7) 実習 PIC一覧 価格 命令長12ビット 命令長14ビット 命令長16ビット 18CXXX 14000 17CXXX 16C92X 16F8XX 16C7XX 16C6XX 16C62X 16C5X 12C5XX 16F8X 16C55X 12C6XX 性能の高さ 命令アーキテクチャ 13 命令コード バイト処理命令 0 7 d f 13 ビット処理命令 0 命令コード b f 13 0 命令コード リテラル処理命令他 k 13 ジャンプ命令 命令コード 0 k PIC製品一覧 4 2 1 2 1 SPI SPI,SSART SPI 4 5 8 1 SPI,USART 1 2 SPI,USART 1 2 USART 4 USARTTx2 2 64 128 256 8 (10bit) 12 PICの用途 民生機器 TV、ビデオ ステレオ CDプレーヤ リモコン ビデオゲーム 電子レンジ 洗濯機、乾燥機 掃除機 OA機器 マウス トラックボール キーボード コピー制御 ディスクドライブ バーコードリーダ FAX 産業機器 モーター制御 コンプレッサ制御 ロボット制御 カードリーダー 汎用メータ 16F84の構成 プログラムメモリ プログラムカウンタ 8レベルスタック 命令レジスタ ファイルレジスタ 8ビット MUX STATUSレジスタ MUX 命令デコーダ コントローラ IC内部 IC外部 データバス FSRレジスタ A L X Wレジスタ 入出力ポート RA4∼RA0 RB7∼RB0 メモリマップ アドレス 00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh 0Ch アドレス 80h 81h 82h 83h 84h 85h 86h 87h 88h 89h 8Ah 8Bh 8Ch TMR0 PCL STATUS FSR PORTA PORTB OPTION PCL STATUS FSR TRISA TRISB EEDATA EEADR PCLATH INTCON EECON1 EECON2 PCLATH INTCON ファイル レジスタ バンク0に マップされ ている CFh バンク1 4Fh バンク0 特殊レジスタ一覧 バンク0 アドレス 00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh バンク1 アドレス 80h 81h 82h 83h 84h 85h 86h 87h 88h 89h 8Ah 8Bh 名称 INDF TMRO PCL STATUS FSR PORTA PORTB EEDATA EEADR PCLACH INTCON ビット7 ビット6 ビット5 ビット4 ビット3 ビット2 ビット1 ビット0 FSRの内容のアドレスのデータメモリ 8ビットリアルタイム・クロック/カウンタ プログラムカウンタ(PC)の下位8ビット IRP RP1 RP0 TO PD Z DC C 間接データメモリアドレスポインタ − − − RA4/TOCKI RA3 RA2 RA1 RA0 RB7 5B6 RB5 RB4 RB3 RB2 RB1 RB0/INT 使用しない EEDATAEEPROMデータレジスタ EEADREEPROMアドレスレジスタ − − − プログラムカウンタ(PC)の上位5ビットへの書き込みバッファ GLE EEIE T0TE INTE EBIE T0IF INTF RBIF 名称 ビット7 ビット6 ビット5 ビット4 ビット3 ビット2 ビット1 FSRの内容のアドレスのデータメモリ INDF INTEDG T0CS T0SE PSA PS2 PS1 OPTION_REG RBPU PCL プログラムカウンタ(PC)の下位8ビット STATUS IRP RP1 RP0 TO PD Z DC FSR 間接データメモリアドレスポインタ TRISA − − − PORTAデータ入出力設定レジスタ TRISB PORTBデータ入出力設定レジスタ 使用しない EECON1 − − − EEIF WRERR WREN WR EECON2 PCLACH − − − PCの上位5ビットへの書き込みバッファ INTCON GIE EEIE T0IE INTE RBIE T0IF INTF バンク0とバンク1の両方にあるレジスタは同一で、どちらからもアクセスできる ビット0 PS0 C RD RBIF 例題構成 例題 1)スイッチA 入れたら点灯 2)スイッチB 入れたら消灯 1)2)の繰り返しを作成 使用ポート 出力 :RB1 ↓ RB7 RA0 RA1 RA4 RB0 制御 対象 消灯スイッチ RA2 1 18 RA1 RA3 2 17 RA0 RA4/T0CKI 3 16 OSC1/CLKIN MCLR 4 15 OSC2/CLKOUT Vss 5 14 Vdd RB0/INT 6 13 RB7 RB1 7 12 RB6 RB2 8 11 RB5 RB3 9 10 RB4 PIC16F84 入力1 :RA2 入力2 :RA3 未使用ポート 点灯スイッチ フローチャート RA2 入力待ち スタート RA2=on 初期設定 No Yes ランプ点灯 Bポート = ON RA3 入力待ち RA3=on Yes Bポート = OFF No ランプ消灯 アセンブラの書き方1/2 ラベル ニーモニック MAIN [] BSF [] CLRF [] MOVLW [] MOVWF [] BCF [] CLRF [] CLRF オペランド STATUS, RP0 TRISB 0CH TRISA STATUS, RP0 PORTA PORTB コメント ;Bポートクリア ;Aポートの設定データ準備 ;Aポート設定データのセット ;バンク0に切り替え ;Aポートクリア ;Bポートクリア アセンブラの書き方2/2 ラベル ニーモニック オペランド コメント ラベル :プログラムメモリに対して、アドレスの代わりに用いる 記述ルール 行の先頭より記述 英文字・アンダーバーで始まる半角32文字以内 大文字・小文字は区別する ニーモニック:命令の内容 記述ルール:ラベルとの間を1文字以上の空白をあける オペランド :命令に対応する f:d:b:k 記述 コメント 記述ルール :コメントを記述 :セミコロン“;”以降がコメントとなる 疑似命令 アセンブラに対する制御命令の記載 INCLUDE命令 :指定したファイルのソースプログラムを読み込む _CONFIG命令 :基本状態、プロテクト設定をする ORG命令 :機械語を格納するプログラムメモリの先頭番地を指定する END命令 :ソースプログラムの終了を示す EQU命令 :数値をラベルとして割り当てる INCファイル例 保存されている場所 W F ¥MPLAB IDE ¥MCHIP_TOOLS ¥PIC16F84A.INC EQU EQU H'0000' H'0001' ;----- Register Files-----------------------------------------------------INDF TMR0 PCL STATUS FSR EQU H'0000' EQU H'0001' EQU H'0002' EQU EQU H'0003' H'0004' PORTA EQU H'0005' PORTB EQU H'0006' EEDATA EQU H'0008‘ ;----- STATUS Bits -------------------------------------------------------IRP EQU H'0007‘ NOT_TO EQU H'0004 RP1 EQU H'0006‘ NOT_PD EQU H'0003 RP0 EQU H'0005' Z EQU H'0002‘ C EQU H'0000' DC EQU H'0001' 特殊機能 特殊メモリ IDワード コンフィグレーション IDワード プログラム実行中は読み書きできない、ライタでのみ可能 メモリ領域 2000Hから2003H(4ワード) プログラム製造年月日 バージョン番号 プログラム管理用番号 メモリチックサム コンフィギュレーション・ワード 13 CP (PIC16F84) 0 POWER WDTE FOSC1 FOSC0 アドレス 2007H CPn DP BODEN PWRTE MCLRE WDTE FOSC1 FOSC0 プログラム領域のプロテクト EPROMのデータメモリのプロテクト ブラウンアウトリセット機能の設定 電源オンリセット機能の設定 MCLRピンの機能の選択 ウオッチドッグタイマの設定 発振素子回路の指定 発振素子回路の指定 MPLABの記載例 _ _CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF _HS_OSC _WTD_OFF _PWRTE_ON _CP_OFF 発振モード LIST HSモード ウオッチドッグタイマーをOFF設定 電源ONリセット機能をON設定 プログラム領域のプロテクトOFF LP XT HS RC 200kH以下 4MHz以下 4M∼20MHz RC発振 低電力/水晶発振 水晶/セラミック 高周波水晶/セラミック 1MHz以下 LIST P=PIC16F84A MPLABのバージョンにより記述要 例題1/ ;--------------------------------------------------------------------------------------------; ON・OFFスイッチ入力及び出力の練習プログラム ;--------------------------------------------------------------------------------------------INCLUDE P16F84A.INC list P=PIC16F84A _ _CONFIG _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF GPR_1 EQU GPR_2 EQU GPR_3 EQU ORG 0 GOTO 0Ch 0Dh 0Eh MAIN ;定義文 ;リセットベクタ(0番地)を指定 ;MAINへ行く 例題2/ MAIN BSF CLRF MOVLW MOVWF BCF CLRF CLRF PBS1 BTFSC GOTO MOVLW MOVWF PBS2 BTFSC GOTO MOVLW MOVWF GOTO END STATUS,RP0 TRISB 0Ch TRISA STATUS,RP0 PORTA PORTB PORTA,2 PBS1 0FEh PORTB PORTA,3 PBS2 0h PORTB PBS1 ;バンク1に切り替え ;Bポートクリア>Bポート全部を出力設定 ;Aポートの設定データ準備 ;RA2とRA3を入力ポートに設定 ;バンク0に切り替え ;Aポートクリア ;Bポートクリア ;RA2 入力待ち (点灯) ;RA2が0なら次の命令スキップ ;Bポートデータ準備(全LED点灯) ;Bポートデータセット ;RA3 入力待ち (消灯) ;RA3が0なら次の命令スキップ ;Bポートデータ準備(全LED消灯) ;Bポートデータセット ;戻る HEXファイル例 0 1 2 3 4 5 6 7 0000: 1683 0186 300C 0085 1283 0185 0186 1905 ・・・・・・・・・・・・・・・・ 0008: 2807 1003 3001 0086 201F 0D06 1D85 2807 ・・・・・・・・・・・・・・・・ 0010: 1C03 280B 2809 30F9 008C 0000 0B8C 2815 ・・・・・・・・・・・・・・・・ 0018: 0008 30F9 008D 2013 0B8D 281B 0008 3002 ・・・・・・・・・・・・・・・・ 0020: 008E 2019 0B8E 2821 0008 3FFF 3FFF 3FFF ・・・・・・・!・・・・・・・・ 0028: 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF ・・・・・・・・・・・・・・・・ 0030: 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF ・・・・・・・・・・・・・・・・ 0038: 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF ・・・・・・・・・・・・・・・・ 0040: 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF ・・・・・・・・・・・・・・・・ 0048: 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF ・・・・・・・・・・・・・・・・ 0050: 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF 3FFF ・・・・・・・・・・・・・・・・ MAIN 12行目 13行目 BSF ビット処理命令 STATUS,RP0 BSF f,d f : STATUS d : RP0 03h レジスタマップ参照 5ビット目を1hにする バンク1に変更される バンク0 アドレス 00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh 名称 INDF TMRO PCL STATUS FSR PORTA PORTB EEDATA EEADR PCLACH INTCON ビット7 ビット6 ビット5 ビット4 ビット3 ビット2 ビット1 ビット0 FSRの内容のアドレスのデータメモリ 8ビットリアルタイム・クロック/カウンタ プログラムカウンタ(PC)の下位8ビット IRP RP1 RP0 TO PD Z DC C 間接データメモリアドレスポインタ − − − RA4/TOCKI RA3 RA2 RA1 RA0 RB7 5B6 RB5 RB4 RB3 RB2 RB1 RB0/INT 使用しない EEDATAEEPROMデータレジスタ EEADREEPROMアドレスレジスタ − − − プログラムカウンタ(PC)の上位5ビットへの書き込みバッファ GLE EEIE T0TE INTE EBIE T0IF INTF RBIF STATUSレジスタ bit7 IRP bit0 RP1 RP0 TO PD Z DC C キャリービット ディジットキャリービット ゼロビット パワーダウンモード復旧フラグ タイムアウトフラグ 0∼3バンク指定 間接アドレッシングでのバンク指定 14行目 CLRF TRISB バイト処理命令 CLRF f f : TRISB 86h番地を0hにする 出力設定になる バンク1 アドレス 80h 81h 82h 83h 84h 85h 86h 87h 88h 89h 8Ah 8Bh 名称 INDF OPTION_REG PCL STATUS FSR TRISA TRISB EECON1 EECON2 PCLACH INTCON ビット7 ビット6 ビット5 ビット4 ビット3 ビット2 FSRの内容のアドレスのデータメモリ RBPU INTEDG T0CS T0SE PSA PS2 プログラムカウンタ(PC)の下位8ビット IRP RP1 RP0 TO PD Z 間接データメモリアドレスポインタ − − − PORTAデータ入出力設定レジスタ PORTBデータ入出力設定レジスタ 使用しない − − − EEIF WRERR WREN − GIE − EEIE − T0IE PCの上位5ビットへの書き込みバッファ INTE RBIE T0IF ビット1 ビット0 PS1 PS0 DC C WR RD INTF RBIF 15行目 MOVLW リテラル処理命令 MOVLW 16行目 0Ch k MOVWF k: 0Ch 0Ch を Wに入れる TRISA バイト処理命令 MOVWF f f : TRISA 85番地に0Chが入る (Ch=1100) バンク1 アドレス 80h 81h 82h 83h 84h 85h 86h 87h 88h 89h 8Ah 8Bh 名称 INDF OPTION_REG PCL STATUS FSR TRISA TRISB EECON1 EECON2 PCLACH INTCON ビット7 ビット6 ビット5 ビット4 ビット3 ビット2 FSRの内容のアドレスのデータメモリ RBPU INTEDG T0CS T0SE PSA PS2 プログラムカウンタ(PC)の下位8ビット IRP RP1 RP0 TO PD Z 間接データメモリアドレスポインタ − − − PORTAデータ入出力設定レジスタ PORTBデータ入出力設定レジスタ 使用しない − − − EEIF WRERR WREN − GIE − EEIE − T0IE PCの上位5ビットへの書き込みバッファ INTE RBIE T0IF ビット1 ビット0 PS1 PS0 DC C WR RD INTF RBIF 17行目 BCF STATUS , RPO ビット処理命令 BCF f,b f : STATUS d : RP0 83h 5ビット目を0 バンク0に変更される バンク1 アドレス 80h 81h 82h 83h 84h 85h 86h 87h 88h 89h 8Ah 8Bh 名称 INDF OPTION_REG PCL STATUS FSR TRISA TRISB EECON1 EECON2 PCLACH INTCON ビット7 ビット6 ビット5 ビット4 ビット3 ビット2 FSRの内容のアドレスのデータメモリ RBPU INTEDG T0CS T0SE PSA PS2 プログラムカウンタ(PC)の下位8ビット IRP RP1 RP0 TO PD Z 間接データメモリアドレスポインタ − − − PORTAデータ入出力設定レジスタ PORTBデータ入出力設定レジスタ 使用しない − − − EEIF WRERR WREN − GIE − EEIE − T0IE PCの上位5ビットへの書き込みバッファ INTE RBIE T0IF ビット1 ビット0 PS1 PS0 DC C WR RD INTF RBIF 18行目 CLRF バイト処理命令 CLRF バンク0 アドレス 00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh 名称 INDF TMRO PCL STATUS FSR PORTA PORTB EEDATA EEADR PCLACH INTCON PORTA f f : TRISA 85番地に0hが入る ビット7 ビット6 ビット5 ビット4 ビット3 ビット2 ビット1 ビット0 FSRの内容のアドレスのデータメモリ 8ビットリアルタイム・クロック/カウンタ プログラムカウンタ(PC)の下位8ビット IRP RP1 RP0 TO PD Z DC C 間接データメモリアドレスポインタ − − − RA4/TOCKI RA3 RA2 RA1 RA0 RB7 5B6 RB5 RB4 RB3 RB2 RB1 RB0/INT 使用しない EEDATAEEPROMデータレジスタ EEADREEPROMアドレスレジスタ − − − プログラムカウンタ(PC)の上位5ビットへの書き込みバッファ GLE EEIE T0TE INTE EBIE T0IF INTF RBIF 19行目 CLRF バイト処理命令 CLRF バンク0 アドレス 00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh 名称 INDF TMRO PCL STATUS FSR PORTA PORTB EEDATA EEADR PCLACH INTCON PORTB f f : TRISB 86番地に0hが入る ビット7 ビット6 ビット5 ビット4 ビット3 ビット2 ビット1 ビット0 FSRの内容のアドレスのデータメモリ 8ビットリアルタイム・クロック/カウンタ プログラムカウンタ(PC)の下位8ビット IRP RP1 RP0 TO PD Z DC C 間接データメモリアドレスポインタ − − − RA4/TOCKI RA3 RA2 RA1 RA0 RB7 5B6 RB5 RB4 RB3 RB2 RB1 RB0/INT 使用しない EEDATAEEPROMデータレジスタ EEADREEPROMアドレスレジスタ − − − プログラムカウンタ(PC)の上位5ビットへの書き込みバッファ GLE EEIE T0TE INTE EBIE T0IF INTF RBIF 20行目 PBS1 21行目 BTFSC ビット処理命令 BTFSC f , b バンク0 アドレス 00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh 名称 INDF TMRO PCL STATUS FSR PORTA PORTB EEDATA EEADR PCLACH INTCON ラベル PORTA , 2 f : PORTA B: 2 0 : スキップ 1 : 次の行 ビット7 ビット6 ビット5 ビット4 ビット3 ビット2 ビット1 ビット0 FSRの内容のアドレスのデータメモリ 8ビットリアルタイム・クロック/カウンタ プログラムカウンタ(PC)の下位8ビット IRP RP1 RP0 TO PD Z DC C 間接データメモリアドレスポインタ − − − RA4/TOCKI RA3 RA2 RA1 RA0 RB7 5B6 RB5 RB4 RB3 RB2 RB1 RB0/INT 使用しない EEDATAEEPROMデータレジスタ EEADREEPROMアドレスレジスタ − − − プログラムカウンタ(PC)の上位5ビットへの書き込みバッファ GLE EEIE T0TE INTE EBIE T0IF INTF RBIF 22行目 PBS1 BTFSC GOTO MOVLW MOVWF PORTA,2 PBS1 0FEh PORTB ;RA2 入力待ち (点灯) ;RA2が0なら次の命令スキップ ;Bポートデータ準備(全LED点灯) ;Bポートデータセット +V スイッチ OFF スイッチ ON H L 1 18 RA1 RA3 2 17 RA0 RA4/T0CKI 3 16 OSC1/CLKIN MCLR 4 15 OSC2/CLKOUT Vss 5 14 Vdd RB0/INT 6 13 RB7 RB1 7 12 RB6 RB2 8 11 RB5 RB3 9 10 RB4 PIC16F84 RA2 23行目 MOVLW リテラル処理命令 MOVLW 24行目 MOVWF バイト処理命令 MOVWF バンク0 アドレス 00h 01h 02h 03h 04h 05h 06h 07h 08h 09h 0Ah 0Bh 名称 INDF TMRO PCL STATUS FSR PORTA PORTB EEDATA EEADR PCLACH INTCON 0FEh k k: 0FEh FEh を Wに入れる PORTB f f : PORTB 06番地にFEhが入る ビット7 ビット6 ビット5 ビット4 ビット3 ビット2 ビット1 ビット0 FSRの内容のアドレスのデータメモリ 8ビットリアルタイム・クロック/カウンタ プログラムカウンタ(PC)の下位8ビット IRP RP1 RP0 TO PD Z DC C 間接データメモリアドレスポインタ − − − RA4/TOCKI RA3 RA2 RA1 RA0 RB7 5B6 RB5 RB4 RB3 RB2 RB1 RB0/INT 使用しない EEDATAEEPROMデータレジスタ EEADREEPROMアドレスレジスタ − − − プログラムカウンタ(PC)の上位5ビットへの書き込みバッファ GLE EEIE T0TE INTE EBIE T0IF INTF RBIF 消灯待ち PBS1 BTFSC GOTO MOVLW MOVWF PBS2 BTFSC GOTO MOVLW MOVWF GOTO END PORTA,2 PBS1 0FEh PORTB PORTA,3 PBS2 0h PORTB PBS1 ;RA2 入力待ち (点灯) ;RA2が0なら次の命令スキップ ;Bポートデータ準備(全LED点灯) ;Bポートデータセット ;RA3 入力待ち (消灯) ;RA3が0なら次の命令スキップ ;Bポートデータ準備(全LED消灯) ;Bポートデータセット ;戻る CALL文 処理1の書き方 スタート CALL SUB1 処理1 CALL SUB1 処理1 終了 SUB1 ・ ・ ・ Return :ラベル名 :元に戻る タイマーの考え方の基本 4サイクル=1命令実行 (8サイクル=1命令実行) TIMER NOP NOP NOP RETURN 必要に合わせて変更 0.1μs(10MHz) 4サイクル必要命令 :0.4μs :0.4μs + 0.4μs =0.8μs :0.8μs + 0.4μs =1.2 μs :1.2μs + 0.8μs =2 μs MOVLW 0F9h MOVWF GRP_1 TIMLP1 :0.4秒作成時の数 NOP DECFSZ GRP_1 GOTO TIMLP1 RETURN 8サイクル必要命令 F :減算を繰り返す RLF命令 バイト処理命令 RLF f , d Fレジスタの内容をキャリーフラグを含めて左に1ビット移動する X 1 1 0 0 1 1 1 0 0 1 1 1 0 0 RLF命令実効 類似命令 0 0 RRF命令 : 移動方向が右に1ビット移動 X OPTION_REG レジスタ bit7 bit0 RBPU INTEDG TOCS TOSE PSA PS2 PS1 PS0 プリスケーラ値 プリスケーラ切替指定 TMR0の入力エッジ指定1:立下がりエッジ 0:立上がりエッジ TMR0のクロック選択 1:TOCKIピンの入力 0:内部クロック INT割込エッジ指定 1:立上がりエッジ 0:立下がりエッジ PORT Bのプルアップ指定 1:プルアップしない 0:プルアップする
© Copyright 2024 Paperzz