Archive
こんばんは!
いきなりですが、先日あった怖い話を…

僕は携帯電話を2つ契約しているんですが、それらをA、Bとします。
メインで使用しているのはAで、Bはもっぱら実家にいる家族との専用回線になっています。
ですので、Bは持ち歩かず、いつもベッドのそばに置きっぱなしにしていました。

ある日の夜、ベッドに入り部屋の明かりを消すと、Bのお知らせLEDがピコピコ点滅していることに気がつきました。
どうも着信があったようです。
「家族から電話があったのかな?」
と思って見てみると、前日の夜中(深夜2時半頃)にA(メイン携帯)からの着信が。

「あれ、AからBにかけた覚えなんてないんだけどな…。それに、この時間にはもう寝ていたはずなんだけど…」

その直後、その着信時に留守番電話が入っていることに気がつきました。
疑問に思いながらも再生してみると、ノイズばかりで声は聞こえませんでした。

しかし、30秒くらい再生したところで、ノイズの中に人の声が混ざっている事に気がつきました。
ひどいノイズな上、モゴモゴしてて内容は聞き取れないのですが、その声にはどこか聴き覚えがあって…
次第に少しずつ聞こえるようになって、ようやく気づいたのですが、その声は


僕自身の声でした…


速攻で留守電消去したことは言うまでもありません!(笑)


昔にも、携帯のカメラですっごく怖い写真が撮れちゃったことがあって、もうイヤなんですよ。
なんで最近のお化け系はデジタル化してきてるんですかね(汗)
だって、携帯の音声として残ってるってことは、しっかりA/D変換されちゃってる訳だし、お化けってそれでいいんでしたっけ…?

関連記事
スポンサーサイト
こんにちは!
前回お見せしたソースコードをこっそり書き換えちゃったゆってぃです(コラー!!)
本当に申し訳ありませぬ・・・


さて、今日は前回の続きをお話しましょう。
一応、前回使用したソースコード(修正後)を書いておきますね。


#include "pic.h"

__CONFIG( FOSC_EXTRC & WDTE_OFF & PWRTE_ON & CP_ON);

void main(void){

 //すべての割り込み許可
 GIE = 1;

 //タイマー割り込みを禁止
 T0IE = 0;

 //TIMER0モジュールをタイマーとして使用
 T0CS = 0;

 //プリスケーラをTIMER0モジュール用にセット。PSA = 1 でWDT用になる。
 PSA = 0;

 //CPUクロックを256分周
 OPTION_REG |= 0x07;

 //カウンタ値をリセット
 TMR0 = 0x00;

 //PORTBをすべて出力に。
 TRISA = 0x00;
 TRISB = 0x00;

 //タイマー割り込みを許可
 T0IE = 1;

 while(1);
}

void interrupt tc_int(void){

 //もし、タイマー割り込みなら…
 if(T0IF){
  T0IF = 0;
  PORTA ^= 0xff;
  PORTB ^= 0xff;
  return;
 }
}

今日は

PSA = 0;

から始めましょう。
これは、PIC16F84Aに内蔵されているプリスケーラをタイマーモジュールに使用するか(PSA=0)、ウォッチドックタイマ(以下、WDT)に使用するか(PSA = 1)を選択するレジスタです。
詳細はデータシートの19ページをご覧ください。

さて!ここで、新しい言葉が出てきましたね。
「プリスケーラ」です。

「プリスケーラ」とは、日本語に直すと分周器です。
分周とは、一言で言えば周波数を下げることです。(ちなみに、分周器を発明したのは日本人なんですって!)

ここで
「なんで周波数を下げる必要があるんけ?周波数は早い方がええんちゃうか?」
と思われる方もいらっしゃるでしょう。

まず、タイマー割り込みが発生するタイミングなのですが、TMR0レジスタはたったの8bitしかありません。
つまり、0からカウントを始めても、255までしかカウントアップできないのです。
TMR0レジスタが255の時にさらにタイマークロックが入ると、TMR0レジスタは溢れて0に戻り、それを合図にオーバーフローフラグ(T0IF)が立ち、割り込みハンドラが呼ばれます。
(レジスタの値が1111_1111の時にタイマークロックが入ると、溢れて0000_0000になります。TMR0レジスタが、もしも9bitだったら、1_0000_0000になるはずなんですけどね)

つまり、もしもタイマークロックが早すぎた場合、一瞬でTMR0がオーバーフローして、割り込みハンドラが呼ばれまくります。
これじゃあ、とても使いづらいですよね。(使おうと思えば使えますけど)

ですので、タイマークロックが最適な値になるよう、プリスケーラで最適な値に設定してあげる必要があるんですね。
因みに、ここで周波数を下げるのはタイマークロックのみで、CPUの動作周波数は下がりませんのでご安心ください。

そして、タイマークロックはCPUクロックを基準にしてどのくらい分周させるのか(それを分周比といいます)を決めるのがOPTION REGISTERの0~2ビット目です。
OPTION REGISTERとは、PIC16F84Aの各種機能を設定できるレジスタです。
ゲームが好きな人でしたらご存知かと思いますが、たいていのゲームでは、メニュー画面に「オプション」ってのがありますよね。
BGMや効果音の音量を決めたり、コントローラーのボタン配置を決めたり、画面の明るさを変えたり…。
あれと同じで、たとえば今回のようにタイマークロックの分周比を設定したり、プリスケーラをタイマーモジュールとウォッチドッグタイマのどちらに使うか決めたりするのが、このOPTION REGISTERなのです。
ここで勘の良い人は
「ん?じゃあ、T0CSやPSAもOPTION REGISTERの一部なんじゃないのか?」
とお考えになるでしょう。

正解(みのもんた)

そう、実はOPTION REGISTERは8bitのレジスタなんです。
詳細はデータシートの9ページに書かれていますが、
T0CSはOPTION REGISTERの5ビット目、PSAはOPTION REGISTERの3ビット目なんです。
ですので、今回のようにPSAを0にセットしたい場合は

OPTION_REG &= 0xf7;

と書いても同じです。慣れたプログラマの人だと、この様に書く人も少なくないですね。

今回は、このOPTION REGISTERの0~2ビット目を1で埋めています。

OPTION_REG |= 0x07;

こうすると、CPUクロックを256分周したものを、タイマークロックとして供給することが出来ます。
詳細はデーターシートの9ページをご覧ください。
また、先述の通り、PSA = 1 とした場合は、プリスケーラはタイマーモジュール用ではなくWDT用になります。
その場合、タイマーモジュールにはCPUの動作クロックが分周されずにそのまま入ります。

さて、次は

TMR0 = 0x00

ですね。
これは、タイマークロックが入ってくるとカウントアップ(加算)される8ビットのレジスタです。
こいつが1111_1111の時にさらにタイマークロックが入ると、割り込みハンドラが呼ばれます。
初期値は何もしないと不定なので、0000_0000を入れてあげましょう。

TRISA と TRISB は前にお話したので割愛します。

そして、全てのセッティングが完了したら

T0IE = 1

としてタイマー割り込みを許可してあげましょう。
main関数は、そのあと無限ループに入れてあげます。


いやぁ、今回はボリュームがあって読むのも大変でしょう。
でも、あと少しですから頑張ってくださいね!!


さて、いよいよ割り込みハンドラの記述です。

void interrupt tc_int(void){

 if(T0IF){
  T0IF = 0;
  PORTA ^= 0xff;
  PORTB ^= 0xff;
  return;
 }
}

割り込みハンドラは、コンパイラがわかるようにinterruptというキーワードを付けてあげます。
これを付けないと、割り込みハンドラだと認識してもらえません。
なお、関数名は適当です(笑)
では、さっそく中身を見てみましょう。

まず、

if(T0IF)

です。
PIC16F84Aでは、割り込みが入ると、その割り込み内容によらず、割り込みハンドラ関数が呼ばれます。
ですから、タイマー割り込み以外の割り込みが入っても、(今回の場合は)tc_int()関数が呼ばれてしまうのです。
ですので、この関数内で、一体何の割り込みが発生したのかを判断しなければなりません。
それは、割り込みフラグというフラグを見ればわかります。

たとえば、TMR0がオーバーフローした場合は、T0IFが1になります。
ですので、if(T0IF)というように書き、もしTMR0のオーバーフローで割り込みハンドラが呼ばれたなら、以下の処理をしますのように、if文で制御してあげます。

まず、

T0IF = 0

として、割り込みフラグをクリアしてあげます。
これは割り込みハンドラ内で忘れずに行ってください。
データシートの20ページにも記載があります。(なお、データシートでは、割り込みハンドラをInterrupt Service Routineと記載していますね)

次に、行いたい処理を記述します。
今回は

PORTA ^= 0xff;
PORTB ^= 0xff;

として、出力ポートの出力信号を反転させています。
こうすることで、LEDをペコペコさせているのです。

なお、このマイコンでは、割り込み要因に関わらず割り込みハンドラはひとつしかありません
、他のマイコンでは要因ごとに割り込みハンドラを定義する場合がほとんどです。
ですので、PIC16F84Aではこういう感じで書くんだなぁ、と認識しておいてください。

さて

ざっとこんな感じですが

なんとなく割り込み制御に関して理解できましたでしょうか?

もしもこのつたない説明で理解できたのであれば

あなたは組み込みセンス抜群です!

おそらく、組み込みを始めたばかりの僕がこのサイトを見たとしても

何ひとつ理解できなかったでしょう!(ぉぃ…)

それどころかクソブログと罵っていた可能性すらあります(笑)

最後までお読みいただき、ありがとうございました^^

関連記事
こんばんわ!
もはや寒くて死にそうなゆってぃです。
明日夜の都内の気温はなんと-6度らしいです。
こんなに寒いと、日本人が全員で上空に向かって扇風機を回したら、気圧が高くなってシベリア寒気団を食い止めることが出来ないかと真剣に考えてしまいます(笑)

さて、今日はPICマイコン講座第二回目です。
今日は前回のお知らせどおり、割り込み制御についてお話しますね。
でもその前に、ゆってぃのマイコンに対する自論をお話します。
「んなもん興味ねぇよハゲ!」
という方は、読み飛ばしてしまってください(笑)


まず言いたいこと。
組み込みシステムにおいて、割り込み制御はです。
これはいつも自信なさげなゆってぃでも断言することができます。でも、念のためフォントは小さくしておきます。

というのも、組み込み業界では必ずしも開発対象にOSが乗っているとは限りません。
OSが乗っていないということは、すなわちタスク管理をしてくれるカーネルがいないということで、(一般的には)複数のタスクを並列に実行することは出来ません。
ごくシンプルなシステムならそれでもどうにかなりますが、実際の製品ではそれでは済まない多くの仕様が要求される場合がほとんどです。

じゃ、なんでOS乗せないの?
という疑問は沸くと思いますが、OSを動かすためにはそれなりのCPUやROMやRAMが必要だったり、そもそもOS自体が有償だったりして、どうしてもコストが上昇しちゃうんですね。
また、ハード・ソフト開発の負荷も増えてしまいます。
売値が数万~数十万円のものでしたらわかりませんが、五千円前後レベルの電化製品では数百円のコスト増がかなりクリティカルに効いてきますからね。

話が脇にそれてしまいました(汗)

さて、割り込み処理とは、あらかじめ設定していた事象が発生した際に、現在の処理しているルーチンを一旦停止(退避)し、即座に割り込みハンドラとして記述していた処理が行われる制御をいいます。
割り込みハンドラとは、割り込み要求が発生した場合に行う処理のことを言います。
たとえば、1秒おきにLEDを点滅させたい場合などは、タイマー割り込みが1秒おきに入るようにセットしておき、その割り込みハンドラの中でLEDをペコペコさせれば良い訳です。割り込みハンドラで記述された処理が完了したら、それまでの処理に制御が戻ります。

言葉で説明するよりも、実際にプログラムを見てみましょう。
今回も、ターゲットデバイスは我らがPIC16F84Aです。
このマイコンにはタイマーモジュールが内蔵されており、タイマー割り込みを発生させることが出来ます。
そこで、前回はメインルーチンの中でLEDをペコペコ光らせましたが、今回は割り込みハンドラの中で光らせてみましょう。


#include "pic.h"

__CONFIG( FOSC_EXTRC & WDTE_OFF & PWRTE_ON & CP_ON);

void main(void){

 //すべての割り込み許可
 GIE = 1;

 //タイマー割り込みを禁止
 T0IE = 0;

 //TIMER0モジュールをタイマーとして使用
 T0CS = 0;

 //プリスケーラをTIMER0モジュール用にセット。
 PSA = 0;

 //CPUクロックを256分周
 OPTION_REG |= 0x07;

 //カウンタ値をリセット
 TMR0 = 0x00;

 //PORTBをすべて出力に。
 TRISA = 0x00;
 TRISB = 0x00;

 //タイマー割り込みを許可
 T0IE = 1;

 while(1);
}

void interrupt tc_int(void){

 //もし、タイマー割り込みなら…
 if(T0IF){
  T0IF = 0;
  PORTA ^= 0xff;
  PORTB ^= 0xff;
  return;
 }
}


今回は前回よりもちょっぴり長いですね。
前回と同じように、少しずつ説明していきます。
コンフィグレーションに関しては、前回説明させていただいたので割愛します。
まず

GIE = 1;

です。
このGIEというレジスタは、このマイコンの全ての割り込みにおける許可・非許可を選択するレジスタです。
1をセットすると許可、0をセットすると非許可になります。
こいつが割り込みはダメといったら、たとえ神様であっても割り込むことは出来ません。
このレジスタは起動時は0になっていますので、割り込み処理をするならば、このように1をセットしてあげる必要があります。

次は

T0IE = 0;

です。
T0IEは、タイマー割り込みの許可・非許可を選択するレジスタです(0で禁止、1で許可です)。
「おい、さっきのGIEと何が違うんだ?え?」
そう怒らないで下さい(涙)
GIEは、このマイコン全体の割り込みを取り仕切るレジスタです。
今回のT0IEは、タイマーに関しての割り込みを取り仕切るレジスタです。
つまり、GIEが「割り込みしてもいいよ」と言っても、T0IEが「でも、タイマーは割り込みしちゃダメね」といったら、割り込みは発生しないわけです。

会社でもあるでしょ?
社長が
「私服通勤を可とする!」(GIE = 1)
と言っても、人事部の部長が
「でも、人事部はスーツしかダメね」(T0IE = 0)
と言ったら、人事部の社員は私服で出勤しちゃダメなんです。
このマイコンも、そういうことです。

どうしてこれから使うタイマー割り込みをここで禁止するかというと、まだタイマー割り込みの初期設定が終わってないからです。
一般的に、使用する割り込みの設定を行っている最中は、その割り込みを念のため禁止します。
ですので、今回もまずはタイマー割り込みを禁止しています。(設定後に解除します)

次は

T0CS = 0;

です。
T0CSは、タイマーをどのように使用するか選択するレジスタです。
今回のように0をセットすると、通常のタイマーとして使用できます。
1をセットすると、RA4/T0CKI端子に入ってきた信号のカウンタになります。
詳細はデータシートの19ページをご覧下さい。


さて、眠いので続きはまた後日追記します!!
ごめんなさい!!

関連記事
こんばんは!
飼い猫に爪とぎ用のダンボールを与えたら、部屋がダンボールの屑で壊滅的に散らかってしまったゆってぃです(涙)



さて、今日はPICマイコンの簡単な使い方を紹介します。

電子工作ではみんな大好きPICマイコン。
同じ釜の飯を食い、一枚の布団で夜をすごし、殴り合いの喧嘩をしたこともあったけど、気がついたら一緒に笑っていたPICマイコン。
仕事が始まった当初は組み込みソフトなんて全然わからず、すがる思いで秋月で買ったPIC16F84A。
あのとき彼がいなければ、今の私はなかったことでしょう。
いつのまにか足を一本折ってしまったけれど、それでも元気に動いてくれていたね。

ま、結局仕事でPICを使ったことは一度もないんですけどね。

では早速、PICマイコン講座に入っていきましょう。
なお、今回使用するのはそんな感慨深いPIC16F84A
持ってない人は、秋月の通販で250円で売っているので、ご興味があればポチってください(秋葉原で買うよりラクです。でも、お店で買うとワクワクするので、首都圏内にお住まいの方でしたら、一度は秋葉原へお越しください!)

今日は、PICマイコンのプログラミングを生まれて初めて行う人でも迷うことなく実験できるように、開発環境の導入から、最後はLEDをペコペコさせる簡単なプログラムまでをご説明いたします。
まさにRPGの攻略本的なブログといっても過言ではありません(過言です)

(2012.08.26追記)-------------------

今回はLEDを点滅させるだけですので、PICマイコンの周辺回路は必要最低限の部品で構成しています。
回路図は以下の記事をご参照ください。
【PICマイコン入門(回路編)】
http://technologicaladvance.blog.fc2.com/blog-entry-54.html

------------------------------------------------

ソフトの開発には、MPLAB IDE というMicrochip社が提供しているフリーのIDE(統合開発環境)を使用します。
おい、統合開発環境ってなんじゃ?
これは、一言で言えばソフトウェアを開発するためのソフトウェア(アプリケーション)です(笑)
とりあえず、ソースコードの記述から、コンパイルやリンク、デバッグまでを行うことの出来るアプリケーションだと思っていてください。

(2012.12.29追記)-------------------

現在、Microchip社からは次世代の開発環境であるMPLAB X IDEがリリースされています。
また、コンパイラもXC8という無料(有償版も有り)のコンパイラが提供されています。

詳細は、以下の記事をご覧下さい。

http://technologicaladvance.blog.fc2.com/blog-entry-72.html

------------------------------------------------

まずはこの開発環境をダウンロードしましょう。
ダウンロードは、Microchip社のHPから行うことが出来ます。
Microchip社のダウンロードページ

ひいい!英語だ!!
ゆってぃ「ひ、ひ、ひるむなぁ!すすめぇ!!(ガクブル)」

ページの下のほうに、ファイルへのリンクが貼られた項目があります。
a


赤線を引いたMPLAB IDE vX.XX(Xは新しいバージョンがリリースされると変更されます)を、おもむろにクリックすると、インストーラーをダウンロード出来ます。
適当なフォルダへ入れてください。
ダウンロード完了後、ファイルを解凍して中を見てみると、5つのファイルが入っていることがわかります。
この中から、setup.exeを選択してください。
b


すると、画面が緑色に包まれ、インストールウィザードが起動します。
Nextを押して進みましょう。
(他のアプリを閉じろとか、セキュリティソフトを切れとか書かれています)
c


次に、MPLAB IDEのライセンス認証画面が出てきます。
I accept the terms of the license agreementにチェックをいれ、Nextを押します。
インストール画面2


次に、セットアップタイプの選択画面が出てきます。
Completeにチェックを入れ、Nextを押します。
インストール画面3


次に、ツールのインストールフォルダ選択画面が出てきます。
デフォルトで問題がなければ、そのままNextを押します。
インストール画面4


次に、Maestroソフトウェアのライセンス認証画面が出てきます。
I accept the terms of the license agreementにチェックをいれ、Nextを押します。
インストール画面5


次に、C32コンパイラのライセンス認証画面が出てきます。
I accept the terms of the license agreementにチェックをいれ、Nextを押します。
(ですが、本講義で使うのはHI-TECH Cコンパイラです)
インストール画面5


次に、コピーされるファイル一覧が出来きますので、Nextを押します。
インストール画面7


最後に、インストール完了画面が表示されるので、Finishをフィニーッシュ!!!と叫びながら押してください。
叫び忘れると、インストールが完了しません(嘘です。大嘘です)
インストール画面8


念のため、スタートメニューの中にMicrochipというフォルダが追加され、中にMPLBA IDE vX.XXというフォルダがあり、さらにその中にMPLAB IDEがあることを確認してください。
メニュー


※HI-TECH Cコンパイラは、前はMPLAB IDEに付属されていたのですが、最新バージョンでは付属されていないようです。無料で手に入りますが、個人情報の登録が必要です。
現在は、XC8というコンパイラが無料(有償版も有り)で入手可能ですので、よければこちらもご確認下さい。
その場合は、ソースコードの記述方法が若干変わりますので、こちらの記事をご覧下さい。
http://technologicaladvance.blog.fc2.com/blog-entry-72.html



これでMPLAB IDEのインストールは完了です。
お疲れ様でした^ ^
それでは、ここで10分の休憩をとりましょう。



(10分経過)



・・・ざわ・・・ざわ・・・



(3分経過)



・・・・・・・



はい。静かになるまで3分かかりました。


では、続きにはいりましょう(笑)
(本ブログでは、こうやって要所要所に茶番を挟んでいきますよ。でないと、書いてる僕が疲れちゃうんだもん…)



インストールしたMPLAB IDEをスタートメニューから選択し、起動します。
起動すると、以下の画面が表示されます。
メニューバーの中のProjectを選択してください。
IDEstart.jpg


プルダウンメニューが表示されるので、Project Wizardを選択します。
IDEProject.jpg


すると、プロジェクトウィザードが立ち上がります。
画面にはWelcome!と書かれています。
よろしく!と元気よく声を出した後、次へを選択します。

よろしくと言わなければ、次に進みません。

ここが、入門者の方の引っかかりやすいところです(嘘です。大嘘です)
Wizard1.jpg


次に、ターゲットデバイス選択画面になりますので、プルダウンメニューからPIC16F84Aを選択し、次へを押します。
Wizard2.jpg


次に、ツールチェーン(Toolsuite)選択画面になります。
Active Toolsuiteは、プルダウンメニューからHI-TECH Universal ToolSuiteを選択します。
すると、Toolsuite Contentsの中には、HI-TECH ANSI C Compilerが自動で表示されます。
正しく選択できたら、次へを押します。
r


次に、プロジェクトファイル選択画面になりますので、Browseボタンを押して、適当なフォルダを選択し、次へを押します。
画面の例では、C:\PIC\SAMPLE_PROJECTフォルダに、SAMPLE_PROJECTという名前のプロジェクトファイルを作成しています。
Wizard3.jpg


次に、既存ファイルの追加画面が表示されます。
今回は特にないので、そのまま次へを押します。
Wizard4.jpg


最後に、プロジェクトの設定内容確認画面が表示されますので、完了を押します。
Wizardlast.jpg


すると、Wizardが閉じて次のような画面になります。
mainDisp.jpg



次に、メニューバーのFileからNewを選びます。
new.jpg


テキストエディタが開かれるので、ここにソースコードを記述していきます。
edit.jpg


いやぁ、ここまで長かったですね!!
でも、これでいよいよソースコードの記述に入ることが出来ます!
ここからが本番、ですよ!


このページをご覧になっている皆さんは、恐らく多少のC言語の知識はお持ちかと思います。
「本当に多少しかないぞ。。。if文とfor文、while文くらいしかわからねーからな!」
という方。
ご安心ください!
組み込み系では、ぶっちゃけそれだけ使えれば十分戦えます。
あとは、それらの使い方次第なんです。


それでは、さっそくLEDペコペコプログラムを書いていきましょう!
テキストエディタに、下記のコードを書いてください。
学校の先生みたいなことを言って恐縮ですが、コピペではダメですよ。
自分の手で書くことが重要なんです(ドヤァ)



#include"pic.h"

__CONFIG( FOSC_EXTRC & WDTE_OFF & PWRTE_ON & CP_ON);

void main(void){

int i;

TRISA = 0x00;
TRISB = 0x00;

while(1){
PORTA ^= 0xff;
PORTB ^= 0xff;
for(i=0;i<1000;i++);
}
}




えらそーな事を抜かしておきながら
たったこれだけです。
ソースコードの詳細は後ほど説明しますので、まずは次の手続きに進みましょう。


書き終わりましたら、メニューバーの中からFileを選択し、プルダウンメニューからSave As...を選択します。
save.jpg


そして、先ほどプロジェクトファイルを作成したのと同じフォルダにmain.cという名前で保存します。
画面の例では、C:\PIC\SAMPLE_PROJECTフォルダに保存しています。
saveas2.jpg


次に、書いていただいたmain.cを、今回のプロジェクトに追加します。
ん?書いただけじゃダメなの?
ダメなんです。
書いた後に、きちんとIDEに「今書いたファイルを、プロジェクトに追加してね」と教えてあげないといけないのです。


と言っても、追加は非常に簡単です。
まず、画面上のプロジェクトビューをご覧下さい。
projectview1.jpg


この一番上にあるSourceFilesの上で右クリックし、コンテクストメニュからAdd Files...を選択します。
addFile.jpg


先ほど書いたmain.cを選択しましょう。
addFiledata.jpg


正しくmain.cがプロジェクトに追加されると、プロジェクトビューのSource Filesの下に、main.cが現れます。
projectview.jpg


無事にmain.cがプロジェクトに追加されたら、このプロジェクトにビルドをかけましょう。
メニューバーのProjectを選択し、プルダウンメニューからBuildを選択します。
build.jpg


アウトプットビューに色々とビルド情報が表示されます。
BuildSuccess.jpg


最後に Build successful! と表示されています。
この表示が現れれば、ビルド完了です。
なお、 Build successful! が表示されたら5秒以内ヒャッハー!!と叫んでください。
叫ばないと、ビルドがry


さて!これでプロジェクトのビルドは成功しました!
ここでSAMPLE_PROJECTフォルダの中を見てみると、なんだかよくわからないファイルで僕の部屋のようにちらかりまくりんぐです…
その中に、SAMPLE_PROJECT.hexというデータがあると思います。
こいつが、ダイヤの原石です
このファイルをマイコンに焼きこめば、今回の組み込みプロジェクトは完了です。
回路が間違っていなければ、きちんとLEDが点滅しますよ^ ^



さてさて



それではさらっと流してしまったソースコードについて、詳しく見ていきましょう。
なお、ここから先は片手にPIC16F84Aのデータシートをお持ちください。
データシートは、ここからダウンロードできます。
PIC16F84A DataSheet


ひいい!英語だ!!

ゆってぃ「ひいい!!」


英語で書かれていて読むのが大変ですが
組み込みエンジニアたるもの、英語は絶対に乗り越えなければなりません!(涙)
大変でしょうけど、一緒に頑張りましょう!


では、ソースコードの解説に戻ります。

一応、先ほどのコードをもう一度書きますね。



#include"pic.h"

__CONFIG( FOSC_EXTRC & WDTE_OFF & PWRTE_ON & CP_ON);

void main(void){

int i;

TRISA = 0x00;
TRISB = 0x00;

while(1){
PORTA ^= 0xff;
PORTB ^= 0xff;
for(i=0;i<1000;i++);
}
}




まず2行目の



__CONFIG( FOSC_EXTRC & WDTE_OFF & PWRTE_ON & CP_ON);



PIC16F84Aには、コンフィグレーション(ワード)という動作モードを設定するレジスタが存在します。
まずはこれを設定しなければなりません。
詳細は、データシートの21ページをご覧ください。


設定方法は簡単で、__CONFIG()マクロのカッコの中に、設定内容を&演算子を使って羅列していくだけです。
たとえば、今回は外付け水晶を使用せず、外付けRC発振にてCPUを動かします。
(参考までに、手元の回路ではCEXTは33p、REXT47.3k10kを使用しています)
その場合は、FOSC_EXTRCを指定してあげます。
また、ウォッチドッグタイマは使用しません。
ですので、WDTE_OFFを指定しています。



ここらへんで、皆さんはお考えになるでしょう。
「コンフィグレーションとかいうのを設定しなきゃならないのはわかった。でもよ、FOSC_EXTRCだのWDTE_OFFだの、その単語の書き方はどこに書いてあるんだよ?」


これは、数年前の僕自身も感じたもっともな疑問だと思うんです。


そう、データシートにもHI-TECH C Compilerのユーザーズガイドにも書いてないんです。
困っちゃいますよね。
ここで、HI-TECHをインストールしたフォルダを見ると、複数のフォルダの中にincludeというものが存在します。
その中にね、pic16f84a.hってのがあるんです。
開いてみると、ここで指定したFOSC_EXTRCやらWDTE_OFFやらの定義が出てきます。
要は、単に2バイトのマスクをdefineしていただけなんですね。


ですので、
「俺はロックなんだ!そんなdefineに甘えるわけにはいかねぇ!」
という方は

__CONFIG( 0xFFFF & 0xFFFB & 0xFFF7 & 0xC00F );

と書いても同じですが、後でそのコードを読んだ方がイラっとするのでオススメできません。
そしておそらく、それはあなた自身の可能性が高いです(笑)

そんな感じでコンフィグレーションの設定が終わりましたら、いよいよメインルーチンです。
int i;
ここは、説明無しでいいですよね(笑)


次の
TRISA = 0x00;
TRISB = 0x00;
は、PIC16F84AのI/Oポートの設定をしています。

つまり、入力(Input)端子として使うのか、出力(Output)端子として使うのか、ということですね。
ここで、データシートの15ページを見ると、PORTAに関しての説明が書かれています。


今回必要な部分だけ要約すると
「PORTAは5ビットだよ」
「TRISAを0にセットすると出力ポート、1にセットすると入力ポートになるよ」
と書かれています。(TOEIC600点にも満たないゆってぃの英語力が正しければ)


今回は簡単のために、PORTA・PORTBともに全ての端子を出力に設定しています。


次に
while(1){

PORTA ^= 0xff;

PORTB ^= 0xff;

for(i=0;i<1000;i++);

}

ですが、これは出力している信号を定期的に反転させているだけです。
ここは簡単ですね。


で、もうソースは終わりです(笑)
きちんとビルドが通ったら、出来たhexファイルをマイコンに書き込んであげれば完了です。
マイコンの書き込み方は、他のサイト様をご参照ください。
気が向いたらこのブログにも掲載予定です!)
あとは、電源を与えて外付けのRCを付けて、適当な出力ポートに抵抗+LEDを直列につなげて下さい。
あと、リセット端子は基本的にプルアップで大丈夫です。
ここがオープンになってると、正しく動作しません。



最後に注意!!

このマイコンは、各出力ポートからは最大で25mAしか電流を流すことが出来ません。
また、PORTAは全体で50mAしか出力できません。
つまり、もしも2ポートで50mA流しちゃったら、後の3ポートからは電流を引っ張っちゃダメということです。
詳しくはデータシートの49ページをご覧ください。


ですから、LEDを光らせるためにポートに適当な抵抗とLEDをつなげるときは、電流値に気をつけて下さいね。
(本当はトランジスタで制御してあげるのが一番なのだけど)
電源が5Vなら、300~400Ωで選ぶと良いでしょう。


というわけで、今日はここまでです。
次回は、割り込み制御についてお話しますね。


最後まで読んでくれてありがとう!!><


--

以下に、LEDペコペコプログラムの応用編を書いています(まだ途中ですが…汗)
よければご参照ください^^

オブジェクト指向風の書き方

関連記事
ご訪問者様
プロフィール

ゆってぃ

Author:ゆってぃ
経歴7年の組み込み系・制御系エンジニアです。
("ど素人"という文言は取りました…笑)
ソフトウェア開発経験ゼロの状態から、なんとか実務がこなせるようになってきた現在に至るまでの経験を、備忘録代わりに綴っていきたいと思います。
入門者の方、大歓迎!
(上級者の方、ごめんなさい…)

あと、ブログには全然関係ないですが、Bumpy Headというバンドのギターをやっています。
ライブ情報なんかも書いたりすることがあるので、その時に「行ってもいいよ~」といった感じのコメントを戴けると、泣いて喜びます(泣)
ブログ読んでくださってる方なら、チケット代サービスしちゃいます!

最後に…滅多に流用することは無いでしょうが、このブログに書かれているソースは、特に指定の無い限りMITライセンスとします。ただし、一部それ以外のものもございますのでご注意下さい。
※ブログのリンク先にあるコードに関しては、リンク先のポリシーに従ってください。

最新記事
最新コメント
カテゴリ
RSSリンクの表示
メールフォーム

名前:
メール:
件名:
本文:

twitter
リンク
ブロとも申請フォーム
スポンサードリンク