• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PIC出力Hi←→Low時、5V←→0Vにならない)

PIC出力時に5Vから0Vにならず、0Vから5Vにならない問題

このQ&Aのポイント
  • PICマイコンの出力をプログラム上で1から0に変えると、5V->0.6V~2.1Vになり、0から1に変えると、0V->1V~2.3Vになる問題が発生しています。
  • ピンの設定、プログラムを簡単に確認しましたが、出力の切り替え時に問題が起きているようです。
  • デジタルテスターで測定すると、発振しているような症状があり、周波数は86.3kHzです。なぜ発振しているのかは分かりません。

質問者が選んだベストアンサー

  • ベストアンサー
  • unagi-pie
  • ベストアンサー率41% (166/397)
回答No.4

>LATAbits.LATA = 0x00; >LATAbits.LATA = 0xff; ←ダメ(ポートAは1V~2.3V) これ、1回実行するだけでなくてループになってませんか? "1"出して"0"出して、をループすれば発振と同じことが起きます。 上の例は"1"を出してる時間の方が長くなるのでテスタの電圧表示はやや高くなり >LATAbits.LATA = 0xff; >LATAbits.LATA = 0x00; ←ダメ(ポートAは0.6V~2.1V) の場合はやや低くなるのは頷けます。

maruyama0422
質問者

お礼

回答ありがとうございます。 確かにすごく頷けるのですが、ループにはしていません。 まったくその通り、ループしてしまっているかのような挙動なんですけどね・・・。 そういえば、以前16F84AというPICマイコンを使っていた時に、例えば RA1 = 1; RA5 = 0; というふうに連続してピンの出力を切り替えると、うまく動作しなかったので、 RA1 = 1; DelayMs(10); RA5 = 0; と、すこしDelayで待ってあげると正常に動作したことがありました。 それを思い出し、試しに LATAbits.LATA = 0x00; DelayMs(10); LATAbits.LATA = 0xff; と、Delayを入れたところ、なんと今度はDelayの部分でプログラムが止まって(?)しまいました。 止まってしまったというか、まるで止まったかのような挙動を見せました。 つまり0x00のまま変わらないのです。 逆も同じで LATAbits.LATA = 0xff; DelayMs(10); LATAbits.LATA = 0x00; だと0xffのままになります。 ただこの場合、出力が発振するような挙動は見せなくなりましたが。 まったく理解ができません。。。 おそらくプログラム的に何かがおかしいのだと思うのですが。。。 また何かわかったことがありましたらご教授お願いします。

maruyama0422
質問者

補足

回答と補足が逆になってしまってすみません! 原因が分かりました! なんと! unagi-pie様のおっしゃる通り、ループしていることが原因で発振していたようです! ですが、私はwhile文やfor文などのループするようなプログラムは組んでいません。 しかし、お礼で書いた「Delayを挟むと発信しなくなるが、出力が変わらなくなる」というのも、よくよく考えれば、 LATAbits.LATA = 0x00; DelayMs(10); LATAbits.LATA = 0xff; だと0x00の時間がかなり伸びて、0xffの時間が相対的に短くなり、結果的に0x00のままであるように見えているのだと気づきました。 そこで、このよくわからないループを意地でも止めるべく、 int i; if(i==0) { LATAbits.LATA = 0x00; DelayMs(10); LATAbits.LATA = 0xff; i++; } このようなプログラムにしてみました。 これならループしても2回目はifの条件を満たさなくなるのでスルーされます。 その結果、発振せず無事に出力が変わるようになりました! 素晴らしい! それにしてもなぜループされるんでしょうかねぇ・・・ プログラムが終わると自動的にリセットでもかかるんでしょうか?

すると、全ての回答が全文表示されます。

その他の回答 (4)

noname#215107
noname#215107
回答No.5

PICのプログラムは、どのOSから呼び出されたわけでもないので、プログラムの終了はユーザーが指定する必要があります。 通常は無限ループにするか、HALT命令でスリープモードへ移行させるなど、何らかの指示が必要です。 手動でリセットするまで、本当に何もさせなくていい場合は、プログラムの最後にwhile(1)を入れてもいいです。でも、これだと電池を食いますのスリープにしたほうがいいでしょう。 今回の質問の例で無限ループになっているのは、コンパイルされたmain関数の機械語プログラムが配置されているメモリ位置よりも後ろの部分にもともと存在している意味のない数値列をCPUが機械語として解釈した結果の動作でしょうね。

maruyama0422
質問者

お礼

なるほど・・・ まだまだ知らないことばかりですね。 これからはちゃんと注意しようと思います。

すると、全ての回答が全文表示されます。
  • mimazoku_2
  • ベストアンサー率20% (1908/9138)
回答No.3

これが、参考になるかも知れません。 オープンコレクタ http://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%B3%E3%83%AC%E3%82%AF%E3%82%BF

maruyama0422
質問者

お礼

参考にさせていただきます。

すると、全ての回答が全文表示されます。
  • mimazoku_2
  • ベストアンサー率20% (1908/9138)
回答No.2

すいません、私、そういったマイコンを使えません。 ですが、知っている事をお知らせしますので、ご確認ください。 >・出力に設定しているピンは全て開放している。 原因は、ここにあるかと思います。 通常、使わないピンであっても「プルアップ抵抗」が必要です。 論理的には、問題ないと思われますが、確か「オープンコレクタ」という回路になっていたかと思うので、「安定化」目的で、プルアップが必要になります。 解放時に特に「プルダウン」指定が無い場合、基本的にプルアップしないといけません。 電源から、10KΩくらいの抵抗を各端子(端子数分ね。)に付けて、同じ命令を出してみてください。

maruyama0422
質問者

お礼

回答ありがとうございます。 うーん、かなり悩みましたが、PICマイコンのピンはI/Oポートで、出力時は0Vと5Vの選択ができます。 5Vの出力ができるということは、おそらくオープンコレクタではない・・・?という考えにたどり着きました。 オープンコレクタの場合、5Vの出力は出来ないからです。 もしオープンコレクタだったとしても、5Vの出力ができるということは、内部で既にプルアップされているのではないでしょうか。 なぜ単純に試してみないのかというと、この18F4520と同じシリーズである18F2420では、プルアップ抵抗は一切つけていないのにも関わらずキチンと動作しているからなんです。 (18F4520と18F2420はなんとデータシートが兼用になっている) 調べてみても、PICマイコンの出力ポートはプルアップしなければいけない、という記事を見ませんし・・・。 なんとも言えません。 抵抗も端子の数ないので、どうしても解決しなかったら、抵抗を買ってきて試そうと思います。

すると、全ての回答が全文表示されます。
  • angkor_h
  • ベストアンサー率35% (551/1557)
回答No.1

マイコン基盤でしょうか。 そのポート出力ICの型名(本体印刷)を見て、ネットでデータシートを検索してみてください。 ロジック1とはアクティブを意味します。 過去のTTLでは、その動作はLowアクティブでした。 Lowアクティブ出力とは0Vを意味し、電流吸い込みです。 また、Lowは0.3V以下、Highは2.4V以上(但し、電流を取らないこと)が一般的でした。 同等の出力ICを用いて、同じ論理で動いているのでしょう。

maruyama0422
質問者

お礼

んんん? よくわからないのですが・・・。 >マイコン基盤でしょうか。 >そのポート出力ICの型名(本体印刷)を見て、ネットでデータシートを検索してみてください。 PICマイコンそのものです。 ICはPICマイコンの18F4520しかないのですが、ポート出力ICとは・・・? 一応18F4520のデータシートには目を通してあります。 部品は PICマイコン18F4520 20MHzセラロック パスコン0.1μF 電源平滑(?)用電解1000μF の4つしかないです。

すると、全ての回答が全文表示されます。

関連するQ&A