ホームに戻る
PIC16F88 の覚え書き
0、はじめに
PIC16F84aは入門としてはよく使われます。
しかし、PIC16F88のほうが高機能で安価です。
また、外部クロックが必要ないのはお手軽です。
細かい解説は「PIC16F84a の覚え書き」に任せて、
ここではPIC16F88での違いを主に書いていきます。
1、特徴
16F88の主な特徴は内部クロックを使用できること。
内部クロックを使用することによりピンを2つ減らせます。
また、アナログ入力が可能です。
7チャンネルがアナログ入力として選択できます。
解像度は10ビットです。
初期設定がすべてアナログ入力になっているところに注意。
アナログ入力はデジタルに切り替え可能。
RA5は入力のみで出力に使用できない。
コンパレータ入力が2つ使用できます。
SPI、I2C通信に対応しています。
256bytesのEEPROMを内蔵。
16F84aの汎用RAMの先頭は0Chですが、
16F88の汎用RAMの先頭は020hになります。
2、電源
2Vから5.5Vで動作します。
5pinが+、14pinが-。
3、書き込み
pickit2との接続対応
1: 4pin
2: 14pin
3: 5pin
4: 13pin
5: 12pin
6: 接続せず
3、内部クロック
内部クロックを使用する場合には、
コンフィギュレーションワードを以下のようにセットする。
_CONFIG _CONFIG1, _INTRC_CLKOUT
OSCCONレジスタで周波数を設定。
下位bit4から上位bit6までにセット。
000:31.25kHz
001:125kHz
010:250kHz
011:500kHz
100:1MHz
101:2MHz
110:4MHz
111:8MHz
BSF STATUS,RP0
MOVLW B'01110000' ; 8MHzに設定
MOVWF OSCCON
BCF STATUS,RP0
OSCTUNEレジスタで速度の微調整ができますが、
詳細は書きません。
4、タイマー
PICの1命令は4クロックである。
よって、クロックが8MHzのとき1命令は4/8=0.5μsとなる。
以下のルーチンは800命令を実行するので、
0.5μsが800回で400μs=0.4msとなる。
「MOVLW D'200'」に256以上の数値は入らないので注意。
スタックが8段までなのにも気をつけたい。
T1 EQU 020H
T2 EQU 021H
T3 EQU 022H
; 0.4ms
TIME04
MOVLW D'200' ; 1
MOVWF T1 ; 1
TIMELOOP1 ; (200-1)回繰り返す
NOP ; 1
DECFSZ T1, F ; 1
GOTO TIMELOOP1 ; 2
RETURN ; 2
5、アナログ入力
アナログ入力は基準電圧の上と下を設定し、
電圧がその間のどの位置にあるかを10bit値で得ることができる。
使用できるのは以下の7つのpin。
17pin:AN0
18pin:AN1
1pin :AN2
2pin :AN3
3pin :AN4
12pin:AN5
13pin:AN6
ANSELレジスタの下位bit0から上位bit6に1を立てるとアナログ入力。
0だとデジタル入出力になる。
; 1pinをアナログ入力に
BSF STATUS,RP0
MOVLW B'00000100'
MOVWF ANSEL
BCF STATUS,RP0
7pinあるものの同時に使えるのは1pinのみ。
どのアナログ入力の電圧を読むかはADCON0レジスタで設定する。
bit3からbit5で設定する。
000のときAN0を使用、001のときAN1を使用となる。
ADCON1レジスタで基準電圧や測定結果の格納方法を指定できる。
結果はADRESH、ADRESLレジスタに入る。
普通はADRESHとADRESLの上位2bitの10bitに結果が入る。
精度が必要なければADRESHのみ使用して、
下位の2bitを切り捨てるほうがやりやすいかもしれない。
6、テンプレ
LIST P=PIC16F88
INCLUDE P16F88.INC
__CONFIG _CONFIG1, _INTRC_IO & _WDT_OFF & _PWRTE_ON & _CP_OFF & _MCLR_OFF & _LVP_OFF & _DEBUG_OFF
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
T1 EQU 020H
T2 EQU 021H
T3 EQU 022H
ORG 0
MAIN
BSF STATUS,RP0
CLRF ANSEL
CLRF TRISA
CLRF TRISB
MOVLW B'01110000'
MOVWF OSCCON
BCF STATUS,RP0
LOOP
MOVLW B'00000001'
MOVWF PORTA
CALL TIME1000
MOVLW B'00000010'
MOVWF PORTA
CALL TIME1000
GOTO LOOP
; 0.4ms
TIME04
MOVLW D'200'
MOVWF T1
TIMELOOP1
NOP
DECFSZ T1, F
GOTO TIMELOOP1
RETURN
; 20ms
TIME20
MOVLW D'50'
MOVWF T2
TIMELOOP2
CALL TIME04
DECFSZ T2, F
GOTO TIMELOOP2
RETURN
; 1m
TIME1000
MOVLW D'50'
MOVWF T3
TIMELOOP3
CALL TIME20
DECFSZ T3, F
GOTO TIMELOOP3
RETURN
END