PIC16F88の使い方メモ
たぶんこんな感じ。適当なのでおかしいと思ったら確認推奨。
基本的なこと
ポートAは6bit。ポートBは8bit。
(ex)
PORTA = 0b000000; //PortA クリア
PORTB = 0b00000000; //PortB クリア
TRISA = 0b000000; //PortA 出力
TRISB = 0b00000010; //PortB RB1は入力 後は出力
ANSELレジスタ:AN0~6をA/D変換の端子として使うかどうか。
(ex)
ANSEL = 0b00000000; //すべてデジタルIO
OPTION_REGレジスタ:色々設定する。(Detasheet 2.2.2.2 OPTION_REG参照)
bit 7 : RBPU(負論理)
ポートBプルアップ設定。
1:プルアップOFF 0:入力になってる端子をプルアップ
bit 6 : INTEDG
interrupt(割り込み)端子使用時のエッジ選択。
1:立ち上がり 0:立ち下がり
bit 5 : T0CS
タイマー0のクロック選択。
1:外部クロック(T0CKI)を使用 0:命令実行クロックを使用
bit 4 : T0SE
タイマー0のクロックエッジ選択。T0CKI使用時。
1:立ち下がり 0:立ち上がり
bit 3 : PSA
プリスケーラの用途設定。
1:WDT 0:TMR0
bit 2~0 : PS2~PS0
プリスケーラの比率設定。
(ex)
OPTION_REG = 0b00000011; //TMR0プリスケーラ1:16 PortBプルアップ
コンフィグレーションビット
15.1 Configuration Bits参照
コードプロテクション。読み込み禁止。
CCP1ピンの選択。RB0かRB3。
デバッグ機能を使うかどうか。
ONにするとRB6とRB7はデバッガ用になってIOに使えない。
Writeプロテクション。書き込み禁止。
Data EE Memoryのコードプロテクション。読み込み禁止。
Low-Voltage Programming の設定。
ONにするとRB3はPGMピンになる。
ブラウンアウトリセットの設定。
MCLRを使うかどうか。ONにするとRA5はMCLR。
OFFにするとRA5として使えて、内部的にMCLRはVddと直結する。
パワーアップタイマー。
ウォッチドッグタイマー。
内蔵発信なら_INTRC_IO
セラロックなら_HS_OSC
だと思う。
Internal External Switchover mode
外部クロックが安定するまでは内蔵クロックを使う。的な?
Fail-Safe Clock Monitor
外部クロックが途切れたときは内蔵クロックを使う。的な?
TMR0の使い方
カウント値はTMR0レジスタに保管されてる。
オーバーフローで割り込みをかけて時間を計る場合の例。
OPTION_REGでプリスケーラを設定しておく。
(ex)
OPTION_REG = 0b00000011; //TMR0プリスケーラ1:16
割り込み関連のレジスタを設定。
(ex)
INTCON.TMR0IE = 1; //タイマ割り込み許可
INTCON.GIE = 1; //全体的に割り込み許可
カウント値の設定の仕方。
カウントの周波数はクロック周波数の4分の1になっている。
クロックが20MHzなら5MHz=(たぶん)0.2usでカウント。
そこにさらにプリスケーラがかかる。1:16なら312.5kHz=(たぶん)3.2usでカウント。
つまり、(時間) = 3.2us x (カウント数)となるわけ。
数えたいカウント数をTMR0にマイナスをつけて代入する。
(ex)
TMR0 = -150; // 150カウント数えたらオーバーフローする
とにかく割り込みが発生するとvoid interrupt()が呼び出される。
何による割り込みがわからないので、TMR0IFを見てタイマー0割り込みだと判断する。
判断後はTMR0IFをクリアするのを忘れないように。
(ex)
void interrupt(){
if (INTCON.TMR0IF) { //割り込み原因がTMR0割り込みの場合
INTCON.TMR0IF = 0; //割り込みフラグをクリア
・・・以降割り込み処理
内蔵発信器を使う場合
Device Flag
_INTRC_IO が INTIO2に対応かな? (OSC1 -> RA7, OSC2 -> RA6)
OSCCONのIRCF0~2で周波数を設定。 (4.6.1 OSCCON Register参照)
最終更新:2009年02月16日 14:23