MPLAB C18のテスト、PIC18F452でLED点滅ピコピコ - MP3プレーヤー自作

Posted by kyosuke at 02/12 2008
>>次の記事: Easy MP3を使っちゃおう
>>前の記事: MP3プレーヤーをPICマイコンで自作、始めの一歩



前回、“MP3プレーヤーをPICマイコンで自作、始めの一歩”
http://toolible.net/monozukuri/articles/39<br /> では、必要なモノをインストールしただけ。

今回は、MPLAB C18を初めて使うということなので
ごくごく簡単なプログラムを書いてPICに書き込んで、
ブレッドボードでテストしてみます。

そういうときは、
迷わずLEDをピコピコ点滅するプログラムです。






ダウンロードしたPDFファイル、
MPLAB C18 (v3.00) C Compiler Getting Started
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en010014&part=SW006011
を見ながらプログラムを書きます。

日本語版↓
http://ww1.microchip.com/downloads/en/DeviceDoc/51288C_JP.pdf<br />

MPLAB C18ガイドのPDFですが、
微妙にバージョンあっていませんが、
気にせずいきましょう。


下記が、そのサンプルのプログラム。

#include <p18f452.h>

#pragma config WDT = OFF

void main(void){
	TRISA = 0;
	PORTA = 0x00;
	PORTA = 0x5A;
	while(1);
}

ビルドしてみる
Error - processor types do not agree across all input files.


・・・
エラー出ました。

うーん、10分ほど悩んだ結果、
リンカーの指定を間違えていました。

WorkspaceにあるLinker Scriptのフォルダに、
18f452.lkrではなく、18c452.lkrを入れちゃってました。

リンカーを指定し直すと、
普通にビルドしてくれました。

HEXファイルも吐き出しているから、
基本的にこれをPICに書き込めばテスト終了。


PORTAが出力で0x5Aになっているから
01011010という感じでLEDが点灯し続けるでしょう。



これでは、あまりにも芸がなさすぎなので、
せめてLEDを1秒間隔でピコピコ点灯させてみます。


この1秒間隔っていうのば難しいというか、めんどくさい。


PIC18F452は40MHzまで出せる。
内部クロックでやり過ごそうと思ったら、
PIC18F452には内部クロックない気がする。

MPLAB C18にDelayさせる関数があっても良いと思う。


探してみる。
あったよ。

delays.h
Delay10TCY() // 17Cxx only
Delay10TCYx()
Delay100TCYx()
Delay1KTCYx()
Delay10KTCYx()


http://www.picgames.org/modules/tinyd1/index.php?id=28
によると、

> C18 では時間でディレイを指定することが出来ず、
> 何命令文のNOP(何もしない命令)を実行するか、
> という指定になります

> 8MHz÷4(4サイクルで1命令を実行)=2MHz
> つまり 2MHzに1回命令が実行される

> 1命令にかかる時間は 1÷2MHz = 0.5μs
> つまり1命令の実行に0.5マイクロ秒かかる



僕の場合、
10MHzで1秒間の遅延を発生させたいわけだから、
1/2.5MHz=0.4us
1命令で0.4usかかると。

それを1秒にしたいから、
2500000回、つまり2500k回の命令を出す。

引数は1-255までの間だから、
Delay10KTCYx(250)
とすれば、1秒間の遅延が発生することになるね。



1秒ごとにLEDを点滅させるプログラム(エラー版)
#include <p18f452.h>
#include <delay.h>
#pragma config WDT = OFF

void main(void){
	TRISA = 0;
	while(1){
		PORTA == 0x00
		Delay10KTCYx(250)
		PORTA = 0xFF;
		Delay10KTCYx(250)
	}
}

ビルドしてみる。
Error [1027] unable to locate 'delay.h'

また、エラー出た。

なんでロケートできないんだよ、
このボケェッ

と、いったい誰に言ってるんだか・・・。



やっぱりボケは僕だった。
delay.hではなくて、delays.h

さらに、;を忘れているし、なぜか==を唱えているし。。。



1秒ごとにLEDを点滅させるプログラム(ビルドできる版)
#include <p18f452.h>
#include <delays.h>
#pragma config WDT = OFF

void main(void){
	TRISA = 0;
	while(1){
		PORTA = 0x00;
		Delay10KTCYx(250);
		PORTA = 0xFF;
		Delay10KTCYx(250);
	}
}

上のコードはちゃんとビルドしました。


PIC18F452のコンフイギュレーションの書き方
http://www.hi-ho.ne.jp/hida/pic16.htm&lt;br />
CONFIG OSC = HS
CONFIG OSCS = OFF   ; OFF は Disabled ON は Enabled
CONFIG PWRT = OFF
CONFIG BOR = ON
CONFIG WDT = OFF
CONFIG WDTPS = 25
CONFIG CCP2MUX = OFF
CONFIG STVR = OFF
CONFIG LVP = OFF
CONFIG DEBUG = OFF
CONFIG CP0 = OFF
CONFIG CP1 = OFF
CONFIG CP2 = OFF
CONFIG CP3 = OFF
CONFIG CPB = OFF
CONFIG CPD = OFF
CONFIG WDT0 = OFF
CONFIG WDT1 = OFF
CONFIG WDT2 = OFF
CONFIG WDT3 = OFF
CONFIG WDTB = OFF
CONFIG WDTC = OFF
CONFIG WDTD = OFF
CONFIG EBTR0 = OFF
CONFIG EBTR1 = OFF
CONFIG EBTR2 = OFF
CONFIG EBTR3 = OFF
CONFIG EBTRB = OFF



見た感じほとんどいらなそうなコンフィグ。
OSCとWDT、BORくらいを設定しておけば、あとはOKな気がする。



コンフィグを含んだLED点滅プログラム、コンプリート版
#include <p18f452.h>
#include <delays.h>
#pragma config OSC = HS
#pragma config WDT = OFF
#pragma config BOR = OFF

void main(void){
	TRISA = 0;
	while(1){
		PORTA = 0x00;
		Delay10KTCYx(250);
		PORTA = 0xFF;
		Delay10KTCYx(250);
	}
}



さて、こいつを秋月のPICライターでPIC18F452に書き込んで、
ブレッドボードに必要なモノを配置して、
自作の定電圧電源を入れる。

・・・


LED、光らない。。
光っても、かなり不安定に点滅する。。


うわ、ちょい、いろいろやってみた結果、
コンデンサをVdd-Vss間に挟んでいなかったからだった。


プラスとマイナスの間に電解コンデンサを挟むのは、
ノイズを抑え、電圧を一定に保つためだったような。。


おそらく、セラロックの発振が回路全体に飛び火して、
マイコンの動作を不安定にさせたものと思われる。


まぁ、とにかく文句を言わずに、
マイコンにはVdd-Vss間に電解コンデンサを挟んでおけという話でした。


LED点滅用の回路図

Pic18f452_led


実物

P1010002


>>次の記事: Easy MP3を使っちゃおう
>>前の記事: MP3プレーヤーをPICマイコンで自作、始めの一歩
MPLAB C18のテスト、PIC18F452でLED点滅ピコピコへのコメント

ccs-cを使っていたのですが、PIC18を組むにあたりC18を使うことになり、こちらのページを参考にさせていただきました。<br /> おかげさまで独習するより、ずいぶんと時間が短縮できたと思います。<br /> ありがとうございました。

dream at 03/08 2009





MP3プレーヤー自作のモノ作り記事

No_image
SDカードのリード(読み込み)トライアル 玉砕中!
やっかいだ、&lt;br /&gt; やっかいだ、&lt;br /&gt; ほとほとやっかいだ。&lt;br /&gt; &lt;br /&gt; SDカードから、&lt;br /&gt; ...
続きを読む>>SDカードのリード(読み込み)トライアル 玉砕中!
Posted by kyosuke at 04/07 2008

Sdslot_thumb
SDメモリカードスロットを電子工作用に変換
秋月で買っといた、 SDメモリカードスロットを、 ブレッドボードにブッ刺せるようにしました。 それだけー。 材料費300円くらい。 表 [[37]] 裏 [[38]...
続きを読む>>SDメモリカードスロットを電子工作用に変換
Posted by kyosuke at 03/31 2008

Mp3_thumb
Easy MP3を使っちゃおう
前回のMP3自作エントリーから早一ヶ月半、 “MPLAB C18のテスト、PIC18F452でLED点滅ピコピコ” http://toolible.net/monozukuri/articles/...
続きを読む>>Easy MP3を使っちゃおう
Posted by kyosuke at 03/26 2008

Pic18f452_led_thumb
MPLAB C18のテスト、PIC18F452でLED点滅ピコピコ
現在のページです
Posted by kyosuke at 02/12 2008

No_image
MP3プレーヤーをPICマイコンで自作、始めの一歩
昔から作ってみたいと思っているモノの1つに、 MP3プレーヤーがあります。 なぜかというと、 フラッシュメモリとファイルシステムの操作を学びたかったから。 FATならびにフラッシュメモ...
続きを読む>>MP3プレーヤーをPICマイコンで自作、始めの一歩
Posted by kyosuke at 02/10 2008