mikroCでPICを使ってみる
by K.I
2009/01/15
Index
- PICで簡単なテストボードを作るための説明用として作成。
- アセンブラを使うならば、MicroChip純正のMPLABを使えば良いが、今回はCコンパイラを使うことにした。
- とりあえず評価版が使える、PICのCコンパイラとして、
- MicroChip純正 C18 →PIC18系しか使えない
- CCSの CCS-C →PIC用のCとして実績があり使いやすいが、クセがある
- HI-TECHの PICC-Lite →これは1回だけ使ったことがある
- microEkekTronikaの mikroC →統合環境になっている
- C18は、PIC18系しか使えないのでNG。HI-TECH Cも以前はデバイスが限られていたが、今は殆どOKのようだ。
- MicroChip純正、CCS、PICCは、MicroChipの統合環境MPLABに組み込んで使う1。
- mikroCは、とりあえず簡単な統合環境になってる様で、ちょっと試すのには良さそうなので、これでやってみる。
- 評価版は2Kbyteまでの制限があるが、試験的に使うのは問題ない。
1そうじゃない使い方も出来ると思うけど
[top]
- mikroC 8.2の ダウンロード。
- 解凍したインストーラを実行してインストール。基本的に全部デフォルトで。
- MikroCコンパイラに続いて、PICFLASH、Lv18PICFLASH、PICFLASHdriverのインストールも続けて促されるが、
- IC-progを解凍すると、実行ファイル(icprog.exe)だけが入っている。
- これを例えば、IC-prog用のフォルダC:\ProgramFiles\icprog106B\とかに入れておく。
- NT-2000用ドライバをを解凍して、icprog.sysをIC-prog用フォルダに入れる。
- icprog.exeを実行すると、最初だけdriverをインストールするかどうか聞いてくるので、Yesボタンを押す。
- 念のため、Settingsメニュー→Options→Miscタブで、Enable NT/2000/XP Driverにチェックが入っているかどうか確認。
[top]
- PICには色々なデバイスがあるが、今回はPIC16F628でテストボードを作る。
- 16F84の後継といわれるらしいが、とりあえず手持ちの石がコレだったのが理由。
- 特徴
- 18pinDIP(SOP,SSOP,QFPもある)
- 内蔵4MHzCR発振回路内蔵
- RA,RBポート合わせて、最大16bit入出力可能(RA5は入力専用)
- USART,コンパレータ,EEPROM内蔵
- PICはリセット回路を内蔵しているので、以下のようにリセットが掛かる。
- 起動時にPOR(PowerOnReset)が掛かる。
- それからPWRT(PowerUpTimer)で、約72msリセットが掛かる。
- それからOST(OscillatorStartupTimer)で、1024クロック分の時間リセットが掛かる。→4MHzで約256us
- これらにより、約72ms+αのリセットが掛かることになる。
- BrownoutResetを有効にすると、電源電圧低下で自動的に約72msのリセットが掛かる。
- MCLR端子を有効にしておくと、外部から強制的にリセットを掛けることも出来る。
- デバッグを考えて敢えてリセット回路を付加した。
- デバッグしないなら、おそらく外部リセット回路は無くても大丈夫だと思う。→MCLR端子を無効にしておく
- 入力4ピン、出力4ピンだけ用意した。
- 将来的に、USARTを使う可能性を考えて、端子だけ出しておく。
- ブレッドボードで作成が容易になるように、入出力ピン配置を決めた。
[top]
- コンフィグレーションレジスタは、プログラムからの書き換えが出来ないので、書込み時に設定する必要がある。
- MCLR端子を有効にして、外部リセット可能にする。
- INTOSC(内蔵発振回路)を有効にする。
- コンフィグレーションの設定方法については、コンパイラによって結構違いがある。
- RB0〜RB3を入力に、RB4〜RB7を出力端子に設定する。
- TRISBレジスタの、bit0〜3を1に、bit4〜7を0にする
- Project→New Project...
- ProjectName: 任意のプロジェクト名を設定
- ProjectPath: 任意のディレクトリを設定
- Description: コメントを記述
- Device: P16F628
- Clock: 004.000000
- コンフィグレーションレジスタ設定2
- _BODEN_OFF
- _CP_OFF
- _PWRTE_ON
- _WDT_OFF
- _LVP_OFF
- _MCLRE_ON
- _INTRC_OSC_NOCLKOUT
- _HS_OSC
- これで、ProjectNameで指定した名前の空の.cファイルが生成される。
2IC-progで書込むので、この設定はおそらく無意味。
[top]
- キー入力があった時に、以下のような波形を出力するプログラムを作る。
- とりあえずSW1が押された時に、以下の端子から波形出力されるようにする。
RB5 SMD
RB6 SDI
RB7 SCK
- 無限ループでキー入力待ちして、キーが押されたら出力ルーチンを実行する。
#define Q_CK 1
#define H_CK 2
unsigned char key;
void setup_port() {
TRISA = 0b00000000; // RA Output
TRISB = 0b00001111; // RB4-7:Output, RB0-3:Input
PORTA = 0b00000000; // RA=00000000
PORTB = 0b11110000; // RB=11110000
CMCON = 0b00000111; // ComparatorMode OFF
OPTION_REG.F7 = 0; // RB Pull-Up
PCON.F3 = 1; // INTOSC 4MHz
}
unsigned char switch_read() {
return(~PORTB&0xF0>>4);
}
void sck_out(unsigned char n) {
unsigned char i;
for (i=0; i<n ;i++) {
PORTB.F7 = 1;
Delay_ms(H_CK);
PORTB.F7 = 0;
Delay_ms(H_CK);
}
}
void output_1(void) {
sck_out(10);
PORTB.F7 = 1;
Delay_ms(Q_CK);
PORTB.F6 = 0;
Delay_ms(Q_CK);
PORTB.F7 = 0;
Delay_ms(H_CK);
sck_out(5);
PORTB.F7 = 1;
Delay_ms(H_CK);
PORTB.F7 = 0;
Delay_ms(Q_CK);
PORTB.F6 = 1;
Delay_ms(Q_CK);
sck_out(10);
}
void main() {
setup_port();
while(1) {
key = switch_read();
switch (key) {
case 1:
output_1();
break;
default:
break;
}
}
}
- Project→Build、或はBuildProjectボタン(歯車みたいなアイコン)を押すとコンパイルされる。
- エラーがある場合は、Messageウィンドウに表示されるので、ダブルクリックするとエラー行に飛ぶ。
- エラー修正→再Buildを、エラーが無くなるまで繰返す。
- コンパイルが成功すると、Messageウィンドウに以下のような表示が出る。
Suiccess[Release Build]
Used ROM: 182 [8%]
Free ROM: 1865 [92%]
- 'ProjectName'.hexファイルが生成される。
[top]
- ICprogを起動する。
- デバイスとして、PIC 16F628を選択
- OpenFileで、コンパイルで生成された.hexファイルを読込み。
- Oscillator: IntRC I/O
- Code Protect: CP OFF
- Fuses: PWRT,MCLR のみチェックする
- ProgramAllボタン(チップに稲妻)を押す。
[top]
- 入力端子はシュミットトリガなので若干改善されるが、キー入力にはチャタリングがある。
- 本来はチャタリング処理が必要だが、今回はシーケンスが長いので、一応動作する。
- 本来はタイマ割り込み等で、チャタリング処理を行うべき。
- 外部リセット回路は省略可能だが、その場合はMCLRを無効にすること。
- USARTを使う場合は、SW2,SW3は使用出来ない。
- CCS-Cでは、デバイス名のヘッダファイルをインクルードする必要があるが、
- MicroCでは、Project生成時に指定したデバイスのヘッダが自動的にインクルードされる。
- コンフィグレーションレジスタの設定も、Project設定時に行う。
- これは便利なように感じるが、プログラムのソースファイルに設定が残らないため、
- 保守性を考えると、CCS-Cのようにソース中に書く方が良いと思う。
- 但し統合環境を含んでいるので、MPLABに組み込むよりは手軽に使うことが出来る。
[top]
[Homeに戻る]