最近PICマイコンが扱えるようになった初心者です。
調子に乗って18F4520を使おうとしたら、わけのわからない症状が出てしまい、困り果ててる次第です。
ちなみにC言語での開発です。
題名の通りですが、プログラム上でマイコンの出力を1から0にした時、5Vから0Vにならず、5Vから0.6V~2.1V程度になります。
プログラム上でマイコンの出力を0から1にした時も、0Vから5Vにならず、0Vから1V~2.3V程度になります。
マイコンの出力が5Vと0V以外になるなんて動揺が隠せません。。。
なお、以下のことは確認、検証してみました。
・入力に設定しているピンは全てGNDに落としている。
・出力に設定しているピンは全て開放している。
・単純にプログラムで出力を1にすると5V、0にすると0Vにそれぞれなる。(つまり1→0、0→1の切り替え時に何か不具合が起きている)
・全ての端子において切り替え時にそのような症状が出る。
・あと、私はオシロスコープを持っていないのでデジタルテスターでしか測定が行えないのですが、デジタルテスターの周波数測定モードで、症状が出ている状態のピンを測ってみると86.3kHzになりました。
もしかして発振している?!という初心者なりの考えを持っているのですが、もしそうだとしても、なぜ発振しているのかわかりません。。。
ちなみにプログラムは単純なものしか組んでいませんが
LATAbits.LATA = 0x00; ←これなら大丈夫(ポートAは0V)
LATAbits.LATA = 0xff; ←これも大丈夫(ポートAは5V)
LATAbits.LATA = 0x00;
LATAbits.LATA = 0xff; ←ダメ(ポートAは1V~2.3V)
LATAbits.LATA = 0xff;
LATAbits.LATA = 0x00; ←ダメ(ポートAは0.6V~2.1V)
こんな感じです。。。
長文大変失礼しました。
原因がわかる方いらっしゃいましたら、ご教授願います。
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)
の場合はやや低くなるのは頷けます。
この回答への補足
回答と補足が逆になってしまってすみません!
原因が分かりました!
なんと!
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の条件を満たさなくなるのでスルーされます。
その結果、発振せず無事に出力が変わるようになりました!
素晴らしい!
それにしてもなぜループされるんでしょうかねぇ・・・
プログラムが終わると自動的にリセットでもかかるんでしょうか?
回答ありがとうございます。
確かにすごく頷けるのですが、ループにはしていません。
まったくその通り、ループしてしまっているかのような挙動なんですけどね・・・。
そういえば、以前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のままになります。
ただこの場合、出力が発振するような挙動は見せなくなりましたが。
まったく理解ができません。。。
おそらくプログラム的に何かがおかしいのだと思うのですが。。。
また何かわかったことがありましたらご教授お願いします。
No.5
- 回答日時:
PICのプログラムは、どのOSから呼び出されたわけでもないので、プログラムの終了はユーザーが指定する必要があります。
通常は無限ループにするか、HALT命令でスリープモードへ移行させるなど、何らかの指示が必要です。
手動でリセットするまで、本当に何もさせなくていい場合は、プログラムの最後にwhile(1)を入れてもいいです。でも、これだと電池を食いますのスリープにしたほうがいいでしょう。
今回の質問の例で無限ループになっているのは、コンパイルされたmain関数の機械語プログラムが配置されているメモリ位置よりも後ろの部分にもともと存在している意味のない数値列をCPUが機械語として解釈した結果の動作でしょうね。
No.3
- 回答日時:
No.2
- 回答日時:
すいません、私、そういったマイコンを使えません。
ですが、知っている事をお知らせしますので、ご確認ください。
>・出力に設定しているピンは全て開放している。
原因は、ここにあるかと思います。
通常、使わないピンであっても「プルアップ抵抗」が必要です。
論理的には、問題ないと思われますが、確か「オープンコレクタ」という回路になっていたかと思うので、「安定化」目的で、プルアップが必要になります。
解放時に特に「プルダウン」指定が無い場合、基本的にプルアップしないといけません。
電源から、10KΩくらいの抵抗を各端子(端子数分ね。)に付けて、同じ命令を出してみてください。
回答ありがとうございます。
うーん、かなり悩みましたが、PICマイコンのピンはI/Oポートで、出力時は0Vと5Vの選択ができます。
5Vの出力ができるということは、おそらくオープンコレクタではない・・・?という考えにたどり着きました。
オープンコレクタの場合、5Vの出力は出来ないからです。
もしオープンコレクタだったとしても、5Vの出力ができるということは、内部で既にプルアップされているのではないでしょうか。
なぜ単純に試してみないのかというと、この18F4520と同じシリーズである18F2420では、プルアップ抵抗は一切つけていないのにも関わらずキチンと動作しているからなんです。
(18F4520と18F2420はなんとデータシートが兼用になっている)
調べてみても、PICマイコンの出力ポートはプルアップしなければいけない、という記事を見ませんし・・・。
なんとも言えません。
抵抗も端子の数ないので、どうしても解決しなかったら、抵抗を買ってきて試そうと思います。
No.1
- 回答日時:
マイコン基盤でしょうか。
そのポート出力ICの型名(本体印刷)を見て、ネットでデータシートを検索してみてください。
ロジック1とはアクティブを意味します。
過去のTTLでは、その動作はLowアクティブでした。
Lowアクティブ出力とは0Vを意味し、電流吸い込みです。
また、Lowは0.3V以下、Highは2.4V以上(但し、電流を取らないこと)が一般的でした。
同等の出力ICを用いて、同じ論理で動いているのでしょう。
んんん?
よくわからないのですが・・・。
>マイコン基盤でしょうか。
>そのポート出力ICの型名(本体印刷)を見て、ネットでデータシートを検索してみてください。
PICマイコンそのものです。
ICはPICマイコンの18F4520しかないのですが、ポート出力ICとは・・・?
一応18F4520のデータシートには目を通してあります。
部品は
PICマイコン18F4520
20MHzセラロック
パスコン0.1μF
電源平滑(?)用電解1000μF
の4つしかないです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
これ何て呼びますか Part2
あなたのお住いの地域で、これ、何て呼びますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
IOポート制御で電圧が落ち切らない
ネットワーク
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
カロッツェリア DEH-P700について
-
周波数433MHzについて
-
PIC出力Hi←→Low時、5V←→0Vにな...
-
ラジオドラマ、朗読の番組を教...
-
フィーリングカップルの装置を...
-
発電機
-
バッファ・ドライバ・トランシ...
-
遅延によるグリッチのずれにつ...
-
安い外国製トランシーバー
-
NV-471 カーナビ ゴリラの音...
-
74HC00について
-
カウンタに正弦波をクロックと...
-
(*`・ω・)ゞの意味教えてください
-
オペアンプのボルテージフォロ...
-
音声ラインの600Ωは何故60...
-
速そうな顔文字ください
-
なぜ20log10(1020)が60になるの...
-
単相交流を3相交流に変換する方...
-
オムツ履きながら酒でも飲むか...
-
位相定数について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
安い外国製トランシーバー
-
周波数433MHzについて
-
バッファ・ドライバ・トランシ...
-
スーパーラジオのIFT調整について
-
PIC出力Hi←→Low時、5V←→0Vにな...
-
フィーリングカップルの装置を...
-
タイミングチャートについてま...
-
量子コンピュータの動作原理が...
-
74HC00について
-
セットもリセットもトグルで動...
-
モーターの定格出力と最大出力...
-
パソコンへの取り込みの仕方
-
30年ぶりにアマチュア無線を...
-
魚探と振動子のメーカーが違うと
-
ホンダCBR250RRの生産終了年
-
PICのPWMの使い方を教えてください
-
CD-ROMナビに、リアモニタを増...
-
発電機
-
7セグメントのディスプレイの...
-
ADコンバータの使い方について
おすすめ情報