- ベストアンサー
PICでLEDの点滅について
http://okwave.jp/qa/q2987225.html を参考にして、C言語で作成しようとしているときに、コピーアンドペーストしたにもかかわらず、ビルドは成功しますが、LEDが点滅しません。何が悪いのか見当がつきません。ただ、いろいろなソースを試してみましたが、ビルドは成功しますが実行時に期待通りに動きません。どうもコンパイラの設定辺りが怪しいのですが、どなたかわかる方が居られたらアドバイスをいただけますようよろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
申し訳ないですが、この質問内容ではズバリ解決ができるような回答は引き出せないと思いますよ… 状況も現象も詳しいことは記述されていませんし。(開発環境とか。あと実行時にどういう挙動をしたか、コンパイルエラーならばその時のメッセージ、などです) まぁ…原因の見当もつかない状態なのに詳細を書けと言われても「無理だろ!」と思われるでしょうけど…(私も同じ立場ならそう思うでしょうし;) とりあえず、本文の中に開発環境と今使っているマイコンの種類、現在の状況を書いていただくだけでもだいぶ回答の付きやすさは違うと思いますよ。今後のご質問の時にでもお役立てください。 どこかのソースをコピーされたのでしたら、掲載サイトのURL(ソースを直接貼るとスペースの表示の関係とかで非常に見づらかったりするので…)とその時のコンパイル結果(エラーメッセージが出たのなら全文そのままコピペを推奨)・実行時の挙動などがあれば見る側にもわかりやすいです。 さて。 16F84AはMPLABで昔ちょろっとやったぐらいなので、あんまり人のこと言えたほど私も詳しくはないのですが……私なりにいくつか思ったことを挙げてみます。↑で偉そうなこと言った割に詳しくなくてすいません-_-; ないとは思いますが、マイコンの種類がそもそも違っていたり…とか。 文法は間違っていないからコンパイルは通るけれど、そもそもターゲットマイコンが違うのでバイナリを書き込んでも動作しない、と。 ビルドには成功しているようなのでIDE(と言うよりはコンパイラ)は正しい設定のようですが、ライティングソフトの方で指定をし忘れていたり…ということがあります。私が初めてPIC触った時はこの辺だけで相当長いことつまずきました… ハードウェア・回路面で問題があることもあります。 おそらく学校、ブレットボードを使っての実習なのではないでしょうか。 電源の種類を間違えたり、抵抗の差し忘れなんかでマイコン本体が壊れてしまっていたとか、結線を間違えていた、なんてのは良くあることですし。 あと、これはMPLAB限定ですが、バージョンによってはパス名に日本語が入っているとうまくいかなかったり(どううまくいかないのかは忘れたので今回とは関係ないかもです;)、ということもあります。 コードについてはコメントしようがないので、今思いつく感じではこんなものでしょうか。
お礼
ご親切に回答していただいて有難うございました。 開発環境はMPLAB、CCS社のCCSCコンパイラです。コンパイルできてHEXファイルも作成されているのですが回路に組み込むとうんともすんとも言いません。 解決したとはいえないのですが、一応載せておきます。 現在わたしは、CCS社のコンパイラを使っていましたが、質問のと おりの状況です。そこで、少しお金を出して、「キットで遊ぼう電子回路、新PIC入門C言語編」を購入しました。HITEC社のコンパイラをインストール等を行い、サンプルコードをコピペしました。そのままでは動かなかったので、「C:\Program Files\HI-TECH Software\PICC\9.81\include\legacy」のパスの中のpic16f62xa.hをインクルードするとビルド成功しました。それをPICに書き込み回路にセットすると動作しました。HITEC社のC言語のコンパイラは動作しましたが、CCS社のC言語のコンパイラは未だに動作しません。 以下が、HITEC社のコンパイラで動作したソースです。 #include <pic.h> #include <pic16f6x.h>//適当にコピーしてください。 __CONFIG ( UNPROTECT & LVPDIS & BOREN & MCLREN & PWRTEN & WDTDIS & INTIO ); void main (void) { int counter=0; // 1,2,17,18端子を入出力端子に設定 CMCON = 0x07; // 電圧レベルの初期設定 PORTA = 0xFF; PORTB = 0xFF; // 入出力設定 TRISA = 0x03; TRISB = 0x00; // 永久ループ while(1) { switch(counter) { case 0: RB0=1; RB1=1; RB2=0; RB3=0; break; case 1: RB0=0; RB1=1; RB2=1; RB3=0; break; case 2: RB0=0; RB1=0; RB2=1; RB3=1; break; case 3: RB0=1; RB1=0; RB2=0; RB3=1; break; } while(RA1!=1){} counter++; if(counter==4) { counter=0; } while(RA1!=0){} } }
補足
その後について、、、いろいろやってみた結果、コンフィグレーションワードがおかしかったようでした。とりあえず、動作しました。有難うございました。 いちおうCCSCコンパイラの動作したコードを載せておきます。 #include<16F628A.h> #include <stdio.h> #fuses INTRC_IO,NOWDT,PUT,NOPROTECT,NOMCLR,LVP,BROWNOUT,MCLR, //////// Fuses: NOWDT,WDT,PUT,NOPUT,LP,XT,HS,EC_IO,INTRC_IO,INTRC,RC_IO,RC //////// Fuses: NOMCLR,MCLR,NOBROWNOUT,BROWNOUT,NOLVP,LVP,CPD,NOCPD,PROTECT //////// Fuses: NOPROTECT //PWRTEN & WDTDIS void main (void) { int counter=0; // 1,2,17,18端子を入出力端子に設定 //CMCON = 0x07; // 電圧レベルの初期設定 output_a(0xff); output_b(0xff); set_tris_a(0x03); set_tris_b(0x00); // 永久ループ while(1) { switch(counter) { case 0: output_high(PIN_B0); output_high(PIN_B1); output_low(PIN_B2); output_low(PIN_B3); break; case 1: output_low(PIN_B0); output_high(PIN_B1); output_high(PIN_B2); output_low(PIN_B3); break; case 2: output_low(PIN_B0); output_low(PIN_B1); output_high(PIN_B2); output_high(PIN_B3); break; case 3: output_high(PIN_B0); output_low(PIN_B1); output_low(PIN_B2); output_high(PIN_B3); break; } while(input(PIN_A1)!=1){} counter++; if(counter==4) { counter=0; } while(input(PIN_A1)!=0){} } }