- ベストアンサー
PIC 16F84AでLEDが点滅しない原因と解決方法
- PIC 16F84AでLEDが点滅しない原因と解決方法について詳しく説明します。
- PIC 16F84AでLEDが点滅しない場合、コンフィギレーションの間違いが考えられます。
- コンパイルや書き込みは成功しているが、LEDが点滅しない場合には、セラロックの設定やポートの設定を再確認することをおすすめします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
No5です。 ああ、すみません、「高速クリスタル」と書いてしまいましたが、クリスタル(水晶)発振子とセラミック発振子で設定に違いはありません。 セラロックでも(周波数が3.5MHz以上なら)同じくHSです。 このHSという名前ですが、 まずそもそもPIC16F84Aでは、FOSCの選択肢として ・RC RC発振器 ・HS 高速クリスタル/セラミック発振子 (3.5MHz以上) ・XT クリスタル/セラミック発振子 ・LP 低出力クリスタル の4つがあります。 これはデータシートに載っている名前なのですが、C言語では「RC」に対して「EXTRC」という別の名前を使っているようですね。 PICのC言語には詳しくないのですが、どこかに「HS」に対応するC言語での名前が載っていませんか? なお「FOSC_INTOSCIO」は内蔵クロックが搭載されたPIC専用の設定ですね。16F84Aには内蔵クロックはありません。
その他の回答 (5)
- SortaNerd
- ベストアンサー率43% (1185/2748)
> コンフィギレーションに決定的な間違いがあるのではないか? あたりです。 > #pragma config FOSC = EXTRC // Oscillator Selection bits (RC oscillator) コンフィギュレーションがRC発振用なのにセラロックをつけているので、これでは動きません。 コンフィギュレーションを高速クリスタル用(HS)にするか、 発振器をRC発振(抵抗+コンデンサ)に取り替えてください。 なお、No3さんも指摘しているように、「PWRTE = OFF」も、ONにすべきです。 これで動かなくなるわけではありませんが、たまに変な動きをするようになるかもしれません。
補足
ありがとう御座います。ご回答頂きました点が、まさに現在の私くしの理解できていない部分であります。 今回使用しましたセラミック発信器(セラロック20MHZ、村田製作所製、マルツより購入)を使ってあります。クリスタルも用意しましたが作成する工程がありましたので、参考資料にありました使い勝手のいいセラロックを使いました。 コンフィギュレーションの設定は、設定ツールからコピーアンドペーストしました。20MHZの外付をということでしたので、他の資料を参考に、XTAL_FREQ20000000を追加しました。 コンフィギュレーションの中のFOSC=EXTRCは何について設定を宣言しているのだろうか XTAL_FREQの外付け発信器の設定とどんな関係なのか、また別の12F683の参考資料のなかにコンフィギュレーションの中のFOSC_INTOSCIOがありまして、内臓クロックを使うとありました。こんな程度の知識で理解不足のまま質問相談をしてしまいました。それから、delay_ms(1000) は___delay_ms(1000)のミスコピーです。 以上この程度のレベルの者ですので、お手数かけてすみませんがつぎの点について教えていただけませんか。 「コンフィギュレーションがRC発振用なのにセラロックをつけているので、これでは動きません コンフィギュレーションを高速クリスタル用(HS)にするか」 今回のソースコードが正しいものとして、セラロックを使った場合のコンフィギュレーションはどのように 設定したらよいでしょうか、コンフィギュレーションの修正変更はできないものでしょうか? コンフィギュレーション設定等に、セラミック発信器使用とクリスタル発信器使用のとき、コードの記述 にどのような違いが発生しますか? 以上の点について教えて頂けませんか。お忙しいところ申し訳ありません。 (別途、高速クリスタル用(HS)にといても取組たいと思います)
- asciiz
- ベストアンサー率70% (6803/9674)
>症状は、ぜんぜん点灯も、点滅もしません ふと思ったんですが、LEDに直列で付けてる1kΩ抵抗は計算の上で出したものでしょうか。 LEDが発光するための順方向電圧・電流ともに定格があるので、LED型番により、適切な抵抗を選ばないと光りません。 >http://www.marutsu.co.jp/user/led.php 必要な抵抗値を求めるのに、LED型番とそのデータシートが必要になります。 5V~GNDの間に、そのLEDと抵抗を直列接続させてみて、光りますか?
お礼
ありがとう御座いました。早速開いてみました実に分かり易く理解できました。いいサイトを教えて頂き感謝しています。 1kΩの抵抗ですが、参考資料には2kΩとありましたが手元に1kΩしかありませんでしたので1kΩとしました。それから抵抗を1kΩ以下のもので試みましたがだめでした。 5V~GNDの間に、そのLEDと抵抗を直列接続させてみました。点灯します。 他の方からも親切なご指導をいただいております、今後ともよろしくお願いいたします。
No.2 です。 仮にこのソースをコンパイルできるまで修正したとします。 なぜ、PWRTE = OFF にしているのでしょう。 こうするとパワーオンリセットが働かなくなるので、外部回路でリセットしない限り正常動作しません。 ところが回路の説明のほうを見ると、MCLR端子にリセット回路がついていないので、マイコンは動きませんよ。
お礼
ありがとう御座います。早速 PWRTE = ON にしました。 他の方からのご指摘をいただきましたのでそれも合わせ現在問題解決に取り組んでいます。 今後ともよろしくお願いいたします。
少なくともこのソースではコンパイルエラーで次に進みませんが、 そのあたりは大丈夫なのでしょうか。 >#define_XTAL_FREQ 20000000 ↓ #define _XTAL_FREQ 20000000 Delay_ms(1000); これと Delay_(1000); これは? 自作関数ですか?
補足
ありがとう御座います。 #define_XTAL_FREQ 20000000については、参考資料に「20MHZのセラミック発信器を接続する。」とありましたので、他の資料を参考に自分が設定しました。 Delay_ms(1000)は、___Delay_ms(1000)が正当でミスコピーです。 デジタル回路は難しいの一言です。 今後ともよろしくお願い致します。
- asciiz
- ベストアンサー率70% (6803/9674)
先日の質問に回答させていただいた者ですが。 delay関数は、 Delay_ms() でも Delay_() でもなく、__delay_ms() だと思いましたが。 __delay_ms(1000); と書いてみるとどうでしょうか? また、LEDが点滅しないというのは、点きっぱなしですか、消えっぱなしですか? もし、点きっぱなしなら、Delay_ms()等の定義が無効で、まったくディレイしていない、超高速の点滅状態であると考えられます。 消えっぱなしの場合は、点滅させる前に、点けるところからですが。
お礼
ありがとうと御座います。ご指導いただきありがとうございました。おかげ様で前に進みました 、がまたまた止まってしまいました。残念です。 、関数は __delay_ms(1000) としてあります。コピーミスです。申し訳ありません。 症状は、ぜんぜん点灯も、点滅もしません 素人ですが、一応テスターをあてると それぞれのLEDからRA1, RA0 のピンまではそれぞぞ5Vの電圧がかかっていました。また、PORTA = 0x01 とすればRA0は5V,RA1は0V、となりRA1に接続のLEDだけが点灯するとありましたのでそれも試しましたが駄目でした。__delay_ms(1000); を除いて試みましたがこれもだめでした。 このような状況です、ブレッドボードをなんども確認もしましたがどこか勘違いをしているのか、PIC側がピンRA1,RA0がHのままでLにならないのかも?なんて思ったり、しています。
お礼
ありがとう御座いました。周波数について整理できました。 何とかしてLEDの点滅ができるようになりたいと思っています。 多くの方からの教えを頂いたことも併せさらに勉強したいと思います。 今後ともよろしくお願い致します。