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



さて、今日は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ペコペコプログラムの応用編を書いています(まだ途中ですが…汗)
よければご参照ください^^

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

関連記事
スポンサーサイト
コメント
ひーはー
Re: タイトルなし
>おのたかひろさん

ありがとうございます!(笑)
初心者
こんにちは
初めまして
仕事等で制御装置を使っています
こちらのページを見させて頂きました
そこでお聞きしたいのですが、picを学びたいと思っておりますが、何から始めれば良いでしょうか?
また、どちらかの書籍でオススメ等ございますでしょうか?

良かったらご教授頂けませんでしょうか?
よろしくお願いします
>初心者さん

当ブログをご覧頂き、誠にありがとうございます^^
PICは入門学習用としては非常に優れたマイコンですので、すぐにご使用いただけると思います。
少々長くなるので、別途ご連絡いたしますね。
管理人のみ閲覧できます
このコメントは管理人のみ閲覧できます
エラー出過ぎてbuild出来ません師匠
portaやらなんやらがもうエラーです
Re: タイトルなし
> 無理無理無理! さん

コメントありがとうございます^^
が…そんなにエラーが出ちゃいましたか(汗)

PORTAが未定義エラーになるのであれば、まずはpic.hをインクルードしているかどうかをご確認ください。
「そもそもpic.hなんてないよ~!」ってことであれば、もしかしたら指定しているコンパイラがHI-TECH ANSI C Compilerでは無い可能性があります><
MPLAB IDEのプロジェクトウィザードからプロジェクトを作成しているのであれば、「Step Two」の画面で「Active Toolsuite」のメニューから「HI-TECH Universal ToolSuite」を選択してください。

あ、因みに、開発環境はMPLAB IDEでしょうか?
それとも、MPLAB X IDEですか?
ゆってぃさん、返信ありがとうございます
度々で申し訳ないのですが
試してみたのですがHI-TECH ANSI C Compilerのインストールの方法が分かりません
開発環境は先ほど両刀使いになりました
Re: タイトルなし
HI-TECH ANSI C Compilerは、数年前までは入手できたのですが、今はXCコンパイラに置き換わってしまったみたいです><
ですので、申し訳ないですがXCコンパイラで試してみてください。

(Microchip社のページ)
http://www.microchip.com/Developmenttools/ProductDetails.aspx?PartNO=SW500010

-----

また、開発環境を2つとも準備されたのでしたら、ぜひMPLAB X IDEの方を使用しましょう!
それと、XCシリーズのコンパイラは、無償版が簡単に手に入りますので(無償なので、最適化はかけられませんが…)、ダウンロード・インストールしてご使用下さい。
なお、PIC10/12/16/18系ならXC8コンパイラを、PIC24系ならXC16を、PIC32系ならXC32をご使用くださいね^^

(ダウンロードページ)
https://www.microchip.com/pagehandler/en-us/family/mplabx/

もしかしたらご確認いただいたかもしれませんが、こちらの記事にMP LAB Xの使用方法を書きました。
ちょっとわかりづらいですが、良ければご参照下さい。
http://technologicaladvance.blog.fc2.com/blog-entry-72.html

試してみて頂いて、また何かわからない点がございましたら、いつでもご連絡くださいね^^
回路は動いてくれませんでしたが
picには無事書き込みできました
一生コンパイルできないんだと思い始めていましたから嬉しいです
この御恩は一生忘れません
Re: タイトルなし
それは良かったです^^
周辺回路やレジスタ設定などでわからないことがあれば、またご連絡下さい。

頑張ってくださいね~!
何も知らないほんとの初心者です
何も知らない初心者です。
でもc言語がちょっとだけできます。
もし良かったら助けて欲しいです。

秋月って楽しいですよね!
ディズニーランドに行くなら秋月行きたいですw
実はディズニーランドには行ったことがないのですが・・・


長くなりましたが、本題です。
2014年度の目標として、「picをやってみよう」と思うのですが、何を買えばよいのかわかりません。
ライター(pcとpicをつなげるやつ)って買うんですよね?
ほかに必要な物があれば教えて下さい!
急ぎではないのでゆっくりで大丈夫です!

こんな私ですみません!
よろしくお願いします!
Re: 何も知らないほんとの初心者です
> 柳田さん

コメントありがとうございます!

秋月の楽しさを共有出来る方がいて、すごく嬉しいです^^
因みに、僕もディズニーランドは1度しか行った事ないですよ(笑)

今年の目標がPICでのモノづくりとは、実に素晴らしいことですね!
微力ではありますが、是非ご協力させてください。

記事の方でも書きましたが、C言語がちょっとでも出来れば、組み込み開発はスタートできますよ!
少し長くなってしまうので、別途ご連絡いたしますね。
お世話になってます(なりたいデス)
前略、
突然ですが、PICを使ってイロイロやれたら、FB!
と、思っているお爺さんです(66歳前期高齢者)。

30歳ころから、C言語を使えたら、ええなぁ。
と、憬れてまいりましたが、一向に進展、進歩なく、もちろん実践もなく、今に至ってます(ー_ー)!!

遅すぎることは無いか?
多少の懸念は、有りますが、もし、このインターネットの環境が有効ならば、
教えに縋りたい思いです。


よしなに、願います。


デハ、では、 de 野兎


PS.

  なお、ja2njfは、アマチュア無線のコールサインです。

  また、
  野兎は、希望の館 野兎治療院(鍼灸師)の俳号でもあります。

Re: お世話になってます(なりたいデス)
> 野兎さん

お返事が遅くなってしまい、申し訳ありません><

いやいや、お爺さんなんてとんでもないです!
遅すぎるなんて事はございません。
C言語は非常にシンプルなプログラム言語なので、すぐに使えるようになると思います。
それ故、真に使いこなすのは難しい、なかなか奥が深いプログラム言語でもありますが。

人様に何かを教えられるほどの技量はございませんが、何かご不明な点があれば、いつでもご連絡下さい^^
コンニチワ
おじゃまします。はたちのはんぺんです。
PICもC言語も電気の知識も一切ない状態で、興味から 某 鈴木○哉氏 のPICとC言語に関する書籍に胸躍らせ、初めに出てきた制作例の6ページにも及ぶプログラムの破壊的なわけわからなさに屈してからはや3年。似たような書籍もわけわからなすぎて買っては放置買っては放置を繰り返す日々。
講義等を通してc言語については多少理解したつもりでいたが、未だに本に書いてあるモノが
なぜこれが必要なのか、
なぜこの順番なのか、
どんな意味やねーん(お花畑)
ということが多すぎることによる怒りと悲しみを背負ったはんぺんです。
参考にさせていただきますので、よろしくお願いいたします。

あと、コンフィグレーションの書き方が書籍と若干違っていたのですが書き方はいくつかあるということですか?
例えばWDTE_OFF が書籍では WDTDIS 等。
Re: コンニチワ
> はんぺん20 さん

コメントありがとうございます^^
マイコンのプログラムだと、レジスタに値をセットする順番等が重要になってきたりするので、なかなか慣れるまでは大変ですよね><
でも、自転車と同じで、慣れちゃえばどうってことないです^^
大変なのは、最初だけですよ!頑張れ!

ご質問の兼ですが、コンフィグレーションの書き方は、コンパイラによって異なります。
また、同じコンパイラでも、バージョンによっても異なります。
この記事では、HI-TECH Cコンパイラのバージョンは9.82を使用しているので、

(インストールディレクトリ/HI-TECH Software\PICC\9.82\include/pic16f84a.hより抜粋)
#define WDTE_OFF 0xFFFB

と定義されていますが、9.80以前のものはWDTDISで定義されています。
ですので、少し古い参考書などでは、WDTDISで表記されてるんじゃないかな?
でも、残念ながら互換性はないので、9.81以降でWDTDISを記述したら、コンパイルエラーが出ると思います…。

因みに、今はHI-TECH CコンパイラではなくXCコンパイラが主流になっているので、XCコンパイラを使用したほうが良いと思います^^

詳しくは、以下の記事をご覧下さい。
http://technologicaladvance.blog.fc2.com/blog-entry-72.html
実行速度なんかについて
書籍などを見ながら勉強中ですが、一つ疑問に思ったので質問させてください。
20MHzの発振子を使用した場合、例えば
for文で i を一つインクリメントするのにかかる時間はどれくらいなのか、等ということです。
恐らく、中学高校で習った
 T [s] = 1 / f [Hz]
が個々の、あるいは全体のプログラムの処理速度だろうと解釈しておりますが、そのようなところ(もろもろの計算式など)が知りたいです。
よろしくお願いします。
Re: 実行速度なんかについて
> Qさん

コメントありがとうございます。
結構ディープな質問ですね(笑)
この話題を真面目に語り始めると記事が10本くらい書けちゃうので、簡単にご説明しますね。

恐らくQさんはご理解されていると思いますが、20MHzの発振子を付けたからといって、CPUが20MHzで動作する訳ではありません。
多くの場合、PLL回路にて逓倍し、より高いクロックをCPUへ供給します。
ですので、コード実行速度を求める時には、外付け発振子の周波数ではなく、実際にCPUへ供給されているクロックの周波数を基準に考えます。
ここでは、仮に100MHzとしましょう。つまり、1周期は10nsecです。

次に、for文でiをひとつインクリメントした時の時間ですが、実行時間を見積もる時にはC言語ベースで考えるのではなく、「コンパイルして出力された命令数」で考えます。
といっても、コンパイルすると機械語になるので、逆アセンブルした結果を元に計算します。
ところが、プログラムの仕方によって、同じ処理であっても1命令で済むこともあれば、複数命令に膨れ上がることもあります。
(例えば、ビットアライメントを無視したへたくそなプログラムを組むと、命令数がぐっと増えたりします)
つまり、C言語では1行で書けるような簡単な式であっても、機械語に直すと必ずしも1命令とは限らないので、C言語から実行時間を求めるのは困難です。業務などで厳密な時間を見積もる必要がある場合は、必ず逆アセの結果から見積もってください。
なお、ここでは簡単のため、1命令であったとします。

PICマイコンの場合、パイプライン制御を考えなければ、1命令を実行するのに2サイクルが必要です。
※サイクルとは、プログラムから命令を読み出したり、命令を実行したりする一連の処理です。

そして、一般的に1サイクルには4クロック必要です。
(「1.命令の取り出し」->「2.命令の解読」->「3.命令の実行」->「4.演算結果書き出し」)
ここらへんはCPUの構造を知らないとなかなか理解が難しいと思いますが、ご興味があれば是非調べてみてください。
遊びでよいので、一度FPGAで簡単なCPUを作ってみると、理解が進みますよ。
もしQさんが学生さんなら、ここまで理解してれば就職してから即戦力です!

話を戻すと、1命令を実行するのに8クロックが必要ということです。
(ただし、実際はパイプラインで動作しますので、分岐がなければ実質4クロックで実行できます)
つまり、CPUへの供給が100MHzなら、10nsec×8クロックなので、80nsecということですね。
(ただし、実際はパイプラインで動作するので、見かけ上は40nsecになります)

ざっくりですが、こんな感じです。
わかり易く説明できなくてごめんなさい。。。
ありがとうございます!
サイクルやクロックなどはうろ覚えでよく理解しておりませんでしたが、その辺を考えるものなんですね。もっと単純に考えておりました。
ありがとうございました!
はじめましてkumaと申します。
趣味でAudioをやっていてDAコンバーターを作りたいのですが最近のICは起動時に初期設定をI2C通信で書き込まないとまともに動作しません。それで色々調べているとPICでそれが出来そうだと分かったのですが今まで触った事がない私なのですが何とかその環境を作りたいのですがLED点灯とかすっ飛ばして(笑)出来ないものでしょうか?
Re: タイトルなし
> kumaさん

コメントありがとうございます^^
オーディオですか!深い趣味をお持ちですね!
I2CでDAコンバータの設定をするだけなら、開発環境の導入を考えると、PICよりArduinoの方がはるかにラクだと思います。
レジスタを意識しなくても、はじめからI2Cを使用するライブラリを備えていますので。
(参考)http://www.musashinodenpa.com/arduino/ref/

PICでやる場合は、この記事で取り上げたPIC16F84Aでやろうとするとかなり苦しいので、I2Cをサポートしているマイコン(例えば、PIC18F24K20など)を使用します。
今度、I2Cの使い方の記事を書きますね。
cが苦手でも克服しないと
ありがとうございます、Cの入り口として助かりました。私、PICでアセンブラならかなりのことはできると自負していますが、Cの必要性は感じています。たまたま古いMPLAB IDE V8.70がPCにインストールされていまして順調に試すこたができましたが、最近入手できるのはXIDEで、すっかり様子が違います。最近バージョンに対応したものはありませんか?
Re: cが苦手でも克服しないと
> uraraさん

弊ブログをご覧頂き、誠にありがとうございます^^
MPLAB X IDEに関しては、v1.51という古いバージョンではございますが、過去に記事を書きました。
http://technologicaladvance.blog.fc2.com/blog-entry-72.html

2017/3/13本日現在の最新バージョンはv3.55ですが、基本的な操作性は変わっていないと思います。
(コンフィグレーションビットの設定などは、IDEではなくコンパイラ依存なので、XCコンパイラをご使用戴ければビルドも問題がないかと存じます)

ただ、v1.51と最新版のv3.55で、操作性に完全に互換があるかはわからないので、後日、こちらでも実験してみます。
cが苦手でも克服しないと2
ありがとうございます。早速XC8 V1.90で確かめてみました。無事hexファイルを得ました。V3.55ではなぜかうまくいきませんでした。私の考えている次のステップはタイマー割込、デバイスを替え、AD変換やアセンブラとCの結合というか共存、I2Cでの通信を考えています。まだよちよちで先は長いですね。目標はWINnet社のイーサネットコントローラーをPSIで接続し、TCPIPで通信することです。できるか?
cが苦手でも克服しないと2その後XC8_V3.55でうまくいきました
XC8 V3.55でもうまくいきました。失礼しました、V1.90でOKだったのでCソースをコピペしたつもりが、部分的にミスしていました。
Re: cが苦手でも克服しないと2その後XC8_V3.55でうまくいきました
> uraraさん

良かったです^^
WINnet社を存じ上げないのですが、TCP/IP通信をするならイーサコントローラを内蔵したPIC18Fシリーズが良いかと思います。
キモとなるTCP/IPのプロトコルスタックも、マイクロチップ社から提供されています。
http://www.microchip.com/mplab/microchip-libraries-for-applications
今後とも、弊ブログをよろしくお願いいたします。
cで割込関連を検索したら、またこちらに
ゆってぃ様のブログに大変お世話になっております。検索エンジンで PIC C 割込 関連で検索した結果、またこちらの記事にたどりつきました。

アドレス末尾-19.htmlと-20.htmlでソースを訂正したとありますが、どちらもプリントアウトして透かして重ねるてみたのですが違いがわかりませんでした。そのままではコンパイルでエラーが出ていましたが、こちらで何とか解決しました。でも大変参考になりました。改めて感謝申し上げます。

イーサネットコントローラーはWIZnet社の間違いでした。WIZnet社(韓国の会社)のW5100又はW5500はプロトコル・スタックを内臓していて、使う側としてはアプリケーションレベル開発に集中できるらしいですので安いPIC16F系でも実現可能かと考えています。もちろん紹介していただきましたPIC18Fシリーズもチャレンジしてみるつもりです。後閑哲也氏の18Fに関する書籍(技術評論社)も手元にありますが、MPLAB_C18が今となっては入手できなくて躓いています。
Re: cで割込関連を検索したら、またこちらに
> uraraさん

別の記事もご覧戴き、ありがとうございます^^
こちらの記事はHI-TECH Cコンパイラを前提に書いた記事なので、XCコンパイラではビルドは通りませんね…お手数をおかけしました。

また、WIZnet社のモジュールも拝見しました。便利そうなモジュールですね^^
SPIに対応していればOKとのことですので、ロースペックなマイコンでも実現は可能かと思います。

PICの参考書は古いものが多く、最新のIDEやコンパイラに対応しているものはなかなか見かけませんが
少なくともコーディングレベルにおけるコンパイラの差は
①#pragma指令(特にコンフィグレーションビットの指定方法。コンパイラマニュアルに書いてあります)
②レジスタアクセスのマクロ定義(コンパイラ付属のヘッダファイル群を読めば、ご理解いただけると思います)
くらいなものなので、その部分だけ読み替えれば、古い参考書も十分役立つと思います。
(ただし、逆アセンブルした結果などは、コンパイラやバージョンによってまちまちになるのでご注意下さい)

何かご不明な点がございましたら、またご連絡を戴ければ幸いです^^
コメントの投稿
トラックバック URL
トラックバック
ご訪問者様
プロフィール

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

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

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

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

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

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