PIC16F88 を扱う仕事が超短期スケジュールでしたがあったのでメモ

開発環境 MPLAB 8.8 + HI-TECH C

ヘッダー宣言

#include <htc.h>
#include “pic16f88.h”
#include “stdio.h”

PIC Config Bit

__CONFIG(FOSC_INTOSCIO & WDTE_OFF & PWRTE_OFF & MCLRE_ON & BOREN_OFF & CPD_OFF & WRT_OFF & DEBUG_ON & CP_OFF & LVP_OFF);
__CONFIG(IESO_OFF & FCMEN_OFF);

ICD2でデバッグ。内部クロック(8MHz)駆動。

Timer1割り込み処理

void interrupt isr(void)
{
if (TMR1IE == 1 && TMR1IF == 1)
{
TMR1IF = 0;
}
}

関数名は関係なし。「interrupt」が付いてればそれが割り込み処理として機能する。

つまり、全割り込みがこの関数に飛んで来るため割り込みフラグクリア等の処理は「どの割り込みが原因か?」を判別して処理する必要がある。

Timer1初期化

T1CON = 0x10;

//T1RUN = 0;    system clock status (SystemClock)
//T1CKPS = 01B;    プリスケール (1/2 -> 1 count = 1 usec)
//T1OSCEN = 0;    oscillator enable (Enable)
//T1SYNC = 0    外部クロック同期(OFF)
//TMR1CS = 0;    クロックソース(内部クロック)
//TMR1ON = 0;    カウント停止
TMR1 = 0;    // カウンタクリア
TMR1IE = 1;        // 割り込み許可
GIE = 1;
PEIE = 1;

GIE&PEIEを立てないと割り込みが機能しない。

TMR1ONを立てるとカウント開始。

TMR1がカウンタ

プリスケール1/2 &駆動クロック8MHzだと丁度1カウント=1usecになるので計算が楽になる。

PEIEを立てる必要があることに気が付くまで時間がかかって、初期のデバッグでウンウン唸ってました(汗)

T1CONの設定をミスってると、ICD2とPIC間のコミュニケーションが不安定になるとゆう現象有り。

ICD2を使っても、ブレークポイントは一箇所のみ。あとはステップ実行と有効/無効を切り替えてなんとかする。

初期デバッグは出来るだけMPLAB上のシミュレータ(stimulus)を使った方が楽。

信号シミュレータ Stimulus は Debuggerに「MPLAB SIM」を選択する事で、Debuggerメニューから呼び出せる。

“Asynch” – 指定したピンやレジスタの信号をボタンを押したタイミングで変更できる。スイッチ類のシミュレートに便利

“Pin/Register Action”

“Advanced Pin/Register”

“Clock Stimulus” - 波形信号を作り出す。少々設定が面倒。一定周期の信号のシミュレートに便利

“Register Injection”

“Register Trace”

 

信号状態はViewから呼び出せる以下の2つのツールで見れる

Simulator Trace

Simulator Logic Analyzer – 指定したピンの信号を波形で見れる