ページ 11

C言語でPICプログラムのシミュレート

Posted: 2007年11月11日(日) 10:46
by YUKI
こんにちは。YUKIと言います。
現在PICプログラミングをやっているのですが、シミュレートが上手くいかず困っています。
コンパイラはMPLAB IDE v7.52を使っています。コンパイルは成功したのですが、シミュレートで思ったとおりの動作になりません。スイッチ操作をしてLEDの点灯パターンを変化させるという単純なプログラムですが、
スイッチのHigh/Lowの擬似入力をしてシミュレートしてもスイッチの状態が無視されてしまいます。
プログラムが悪いのかシミュレート方法が間違っているのかわかりませんが、取りあえずプログラムに誤りがあるか見ていただきたいです。
RB0~3がLED,RB4がブザー,RB6~9がスイッチです。
尚、シミュレートする際はwait時間を減らしています。
シミュレートしてて、おかしかった所はif文やgo to文がスイッチ操作しても無視されてしまうところです。
プログラミング初心者なので見苦しいかもしれませんが、以下がソースです。
//Clock 117920000[Hz]
//一秒間に行う命令数約3000万
#include<p30f2012.h>

void main(void)
{
unsigned i, j,a,b,c,d,cnt;
//全LED出力に設定
TRISBbits.TRISB0 = 0;
TRISBbits.TRISB1 = 0;
TRISBbits.TRISB2 = 0;
TRISBbits.TRISB3 = 0;
//ブザー出力に設定
TRISBbits.TRISB4 = 0;
PORTBbits.RB4 = 0; //ブザー消音
//全LED点灯
PORTBbits.RB0 = 1; //LED1
PORTBbits.RB1 = 1; //LED2
PORTBbits.RB2 = 1; //LED3
PORTBbits.RB3 = 1; //LED4
//全SW入力に設定
TRISBbits.TRISB6 = 1; //SW1
TRISBbits.TRISB7 = 1; //SW2
TRISBbits.TRISB8 = 1; //SW3
TRISBbits.TRISB9 = 1; //SW4


for(i=0;i<60000;i++){ //経過時間判定
for(j=0;j<500*5;j++){
;
if(PORTBbits.RB6 ==1 || PORTBbits.RB7 ==1
|| PORTBbits.RB8 ==1 || PORTBbits.RB9 ==1)
goto _exit; //スイッチ操作したら_exitにジャンプ
}
}
while(1){ //0.5s毎にLED全点滅
for(i=0;i<60000;i++){
for(j=0;j<50*5;j++){
;
}
}
PORTBbits.RB0 = ~PORTBbits.RB0;
PORTBbits.RB1 = ~PORTBbits.RB1;
PORTBbits.RB2 = ~PORTBbits.RB2;
PORTBbits.RB3 = ~PORTBbits.RB3;
if(PORTBbits.RB6 == 1 || PORTBbits.RB7 ==1 //スイッチ操作したら脱出
|| PORTBbits.RB8 == 1 || PORTBbits.RB9 ==1)
break;
}


while(1){
_exit:;
cnt = 0;
/***チャタリング除去開始***/
while(cnt<10){
a = PORTBbits.RB6; //各スイッチの状態記憶
b = PORTBbits.RB7;
c = PORTBbits.RB8;
d = PORTBbits.RB9;
for(i=0;i<60000;i++){
;
}
if(a == PORTBbits.RB6 || b == PORTBbits.RB7
|| c == PORTBbits.RB8 || d == PORTBbits.RB9 )
cnt++;
else
cnt = 0;
}
/***チャタリング除去終了***/
if(PORTBbits.RB6 == 1 || PORTBbits.RB7 == 0
|| PORTBbits.RB8 == 0 || PORTBbits.RB9 == 0){ //SW(ON:1 OFF:2,3,4)
PORTBbits.RB0 = 0; //LED(ON:2,3,4 OFF:1)
PORTBbits.RB1 = 1;
PORTBbits.RB2 = 1;
PORTBbits.RB3 = 1;
}
else if(PORTBbits.RB6 == 1 || PORTBbits.RB7 == 1
|| PORTBbits.RB8 == 0 || PORTBbits.RB9 ==0){ //SW(ON:1,2 OFF:3,4)
PORTBbits.RB0 = 0; //LED(ON:3,4 OFF:1,2)
PORTBbits.RB1 = 0;
PORTBbits.RB2 = 1;
PORTBbits.RB3 = 1;
}
else if(PORTBbits.RB6 == 1 || PORTBbits.RB7 == 1
|| PORTBbits.RB8 == 1 || PORTBbits.RB9 == 0){ //SW(ON:1,2,3 OFF:SW4)
PORTBbits.RB0 = 0; //LED(ON:4 OFF:1,2,3)
PORTBbits.RB1 = 0;
PORTBbits.RB2 = 0;
PORTBbits.RB3 = 1;
}
else if(PORTBbits.RB6 == 1 || PORTBbits.RB7 == 1
|| PORTBbits.RB8 == 1 || PORTBbits.RB9 == 1){ //SW(ON:1,2,3,4)
PORTBbits.RB0 = 0;//LED(OFF:1,2,3,4)
PORTBbits.RB1 = 0;
PORTBbits.RB2 = 0;
PORTBbits.RB3 = 0;
}
else {
a = PORTBbits.RB6; //各スイッチの状態記憶
b = PORTBbits.RB7;
c = PORTBbits.RB8;
d = PORTBbits.RB9;
PORTBbits.RB4 = 1; //ブザー音開始
for(i=0;i<60000;i++){
for(j=0;j<500*5;j++){
;
}
}
PORTBbits.RB4 = 0; //ブザー音停止
while(1){
for(i=0;i<60000;i++){
for(j=0;j<50*5;j++){
;
}
}
PORTBbits.RB0 = ~PORTBbits.RB0;
PORTBbits.RB1 = ~PORTBbits.RB1;
PORTBbits.RB2 = ~PORTBbits.RB2;
PORTBbits.RB3 = ~PORTBbits.RB3;
if(a != PORTBbits.RB6 || b != PORTBbits.RB7
|| c != PORTBbits.RB8 || d != PORTBbits.RB9 )
break;
}
}
}
}

Re:C言語でPICプログラムのシミュレート

Posted: 2007年11月11日(日) 14:08
by YUKI
入力ポートと出力ポートを別の変数にしたら、取りあえず
if文、goto文はうまく判別するようになりました。
あとは出力の確認をするところですが、シミュレートがうまくできない状態です。

Re:C言語でPICプログラムのシミュレート

Posted: 2007年11月11日(日) 21:24
by YUKI
すいません、質問しといて申し訳ないのですが
自己解決できました。
わざわざ記事を読んでくれた方がおりましたら、無駄な時間を使わせてすいませんでした。
また分からないことがあったらよろしくお願いします。

Re:C言語でPICプログラムのシミュレート

Posted: 2007年11月11日(日) 22:22
by 管理人
力及ばずすみません(_ _||)
ただ待機する部分は無駄なfor文ではなく、Sleep関数を使えばいいのではないでしょうか。
#include <windows.h>
を書いて、
sleep(int n);
nはミリ秒です。1000で一秒です。違う意味のfor文でしたらすみません(_ _|||)

Re:C言語でPICプログラムのシミュレート

Posted: 2007年11月11日(日) 23:46
by YUKI
返信ありがとうございます。
waitする関数はもう作りました。
上記のプログラムは色々と誤りがあったようで、それを治したら入力に関するシミュレートはできました。
あとはプログラムの問題では無く、MPLABでの出力のシミュレートの仕方だけが分からないだけなので、
なんとか自力で頑張ってみます。

Re:C言語でPICプログラムのシミュレート

Posted: 2007年11月12日(月) 00:18
by たかぎ
解決したようで何よりです。
ところで、

> 管理人さん
> ただ待機する部分は無駄なfor文ではなく、Sleep関数を使えばいいのではないでしょうか。
> #include <windows.h>
> を書いて、
> sleep(int n);
> nはミリ秒です。1000で一秒です。違う意味のfor文でしたらすみません(_ _|||)

PICはごく小さなマイクロコントローラなので、Windowsはもちろん、OSが搭載されることは稀です。
(PICシリーズの比較的ハイエンドなものであれば、μITRONぐらいなら載ります。)
一応、下記も参照してみてください。
http://ja.wikipedia.org/wiki/PIC_(%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9)
↑リンクが上手くいかないようなので、コピペしてください。

Re:C言語でPICプログラムのシミュレート

Posted: 2007年11月12日(月) 00:33
by 管理人
そうなのですか、p30f2012.hが何をするライブラリなのかも知らなかったので、回答違いな発言をしてしまったようですみません(_ _|||)
なるほど、こんな小さなチップをコントロールするものだったんですね。
これはOSが搭載される事はほとんどなさそうですね;