mikroCでPIC16F84A
初期設定とか準備
メニューかツールバーのNew Projectからいろいろ設定。
Project Name
プロジェクトの名前を設定。メインのプログラムのファイル名にもなる。
ex)LED_Blink
Project Path
ファイルの保存場所。Browseから選択。
プロジェクトごとに別のフォルダにした方が良いかも。
ex)D:\workspace\PIC\LED_Blink\
Description
プロジェクトの説明。無くても大丈夫。
Device
使うPICを選択。P16F84とP16F84Aは別物なので注意。
ex)P16F84A
Clock
使用するクロックの周波数を設定。Delayとかの計算に使われてる?
単位は[MHz]です。
ex) 020.000000
Device Flags
コンフィグレーションワードとも言う。PICの機能設定する場所。
コードプロテクション。ONにするとPICライターとかで読み込み出来なくなる。
製品とかでプログラムを隠したい場合にはONかな?
(推奨)_CP_OFF
パワーアップタイマー。電源投入後しばらくリセットをかけてくれる。
電源オン直後は動作が不安定になるので普通使う。
(推奨)_PWRTE_ON
Watchdog Timer。プログラムの暴走を監視する用途に使う。
ロボコン用途ではほとんど使われない。通常OFF。
(推奨)_WDT_OFF
クロック発振器の設定。
ロボコンとかで通常使うであろうセラロック(青い3端子)の場合はHS_OSC。
(大抵は)_HS_OSC
プログラム作成
Port I/O
バイト単位でアクセスするとき。0x??って書けば16進数。
(おすすめ) 0b????と書くと2進数で指定できる。左が上位、右が下位ビット。
(ex1)
PORTA = 0; //Port A の出力をすべてLowにする。
PORTB = 0xff; //Port B の出力をすべてHighにする。
(ex2:おすすめ)
PORTA = 0b00000; //2進数を使った指定。PortAは5ビット。
PORTB = 0b00001100; //PortBは8ビット。Bit2とBit3をHigh。
ビット単位でアクセスするとき。
POATx.Fy で、Port x の ビット y にアクセス。
(ex)
PORTA.F0 = 1; //Port A Bit 0 をHighにする。
if(PORTB.F1 == 0) //Port B Bit 1 がLowだったら…
入出力設定
TRISレジスタに設定する。
0:出力、1:入力。H8とは逆。
(ex)
TRISA = 0b00000; //Port A すべて出力
TRISB = 0b00000011; //Port B 下位2ビットのみ入力
内蔵プルアップ
オプションレジスタの7bitにあるRBPUに設定。
PortBで入力にしたビットを全部プルアップ。
プルアップ設定は負論理(データシートでRBPUの上に線が付いてる)なので、
ゼロにするとプルアップON。
(ex)
OPTION_REG = 0b00000111; //OptionReg PortB Pullup(B7)
ボタン入力(チャタリング除去)
内蔵関数Buttonを使うと便利。
(ex)
if( Button(&PORTB, 3, 1, 0) ) PORTA.F0 = 1;
//RB3が0だったら、RA0を1にする。
Button(&ポート名, 知りたいビット, 除去時間[ms], 0)
と指定すると、ポートが0になると関数は255という数値を返す。オフなら0。
こんな感じに使うと便利?
(ex:ボタンを押すたびにLEDをON←→OFFするプログラム)
#define SW1_ON Button(&PORTB, 4, 1, 0)
#define SW1_OFF Button(&PORTB, 4, 1, 1)
if(SW1_OFF) lastsw = 1;
if(lastsw && SW1_ON){
PORTA.F0 = ~PORTA.F0;
lastsw = 0;
}
ディレイ、時間稼ぎ関数
mikroCには内蔵のディレイ関数がある。
(ex)
Delay_ms(10); //10ms待機
Delay_us(10); //10us待機
タイマー0
カウント値はTMR0レジスタに保管されてる。
8bitのカウンタなので、指定できる数値は0〜255まで。(255 = 2の8乗-1)
C言語的にはTMR0はunsigned char型になってる。
OPTION_REGでプリスケーラを設定しておく。
下位3bitがプリスケーラの設定。(2.3.2 OPTION REGISTER参照)
(ex)
OPTION_REG = 0b00000111; //TMR0プリスケーラ1:256
カウント値の設定の仕方
カウントの周波数はクロック周波数の4分の1になっている。
つまりクロックが 20[MHz] なら 5[MHz]=0.2[usec] でカウント。
そこにさらにプリスケーラがかけられる。プリスケーラとは、カウント周波数を遅くする回路のこと。
1:256なら 5[MHz] / 256 されて、19.5[kHz]=25.6[usec] でカウント。
つまり、(計測したい時間) = 25.6[usec] x (カウント数) となる。
例えば、1[msec]だったら、1[msec] / 25.6[usec] = 39 カウント
数えたいカウント数をTMR0にマイナスをつけて代入する。
オーバーフローが発生すると、INTCON.T0IFが1になる。
つまり、T0IFをクリアしてから、T0IFが1になるまで待っていれば時間がはかれる。
(ex)
TMR0 = -39; // 39カウント数えたらオーバーフローする
INTCON.T0IF = 0; // オーバーフローフラグ クリア
while(INTCON.T0IF==0); // オーバーフローするまで繰り返し
オーバーフローで割り込みをかける場合
割り込み関連のレジスタを設定。
(ex)
INTCON.T0IE = 1; //タイマ割り込み許可
INTCON.GIE = 1; //全体的に割り込み許可
まず、割り込みが発生するとvoid interrupt()が呼び出される。
すべての割り込みでこの関数が呼び出される。
T0IFが1だったら、タイマー0割り込みだと判断できる。
判断後はT0IFをクリアするのを忘れないように。
(ex)
void interrupt(){
if (INTCON.T0IF) { //割り込み原因がTMR0割り込みの場合
INTCON.T0IF = 0; //割り込みフラグをクリア
・・・以降割り込み処理
(TMR0IFじゃ無かったです…)
ビルド(コンパイル)
ツールバーの歯車アイコンをクリック。Build Project(Ctrl+F9)
エラーがあると下に表示される。
(要確認)最後の行を改行してないとエラーになる?
書き込み
プロジェクトディレクトリにプロジェクト名.HEXが作成される。
ライタプログラムを起動して、読み込んで書き込む。
参考ページ
最終更新:2009年02月20日 16:59