最近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.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つしかないです。
No.2
- 回答日時:
すいません、私、そういったマイコンを使えません。
ですが、知っている事をお知らせしますので、ご確認ください。
>・出力に設定しているピンは全て開放している。
原因は、ここにあるかと思います。
通常、使わないピンであっても「プルアップ抵抗」が必要です。
論理的には、問題ないと思われますが、確か「オープンコレクタ」という回路になっていたかと思うので、「安定化」目的で、プルアップが必要になります。
解放時に特に「プルダウン」指定が無い場合、基本的にプルアップしないといけません。
電源から、10KΩくらいの抵抗を各端子(端子数分ね。)に付けて、同じ命令を出してみてください。
回答ありがとうございます。
うーん、かなり悩みましたが、PICマイコンのピンはI/Oポートで、出力時は0Vと5Vの選択ができます。
5Vの出力ができるということは、おそらくオープンコレクタではない・・・?という考えにたどり着きました。
オープンコレクタの場合、5Vの出力は出来ないからです。
もしオープンコレクタだったとしても、5Vの出力ができるということは、内部で既にプルアップされているのではないでしょうか。
なぜ単純に試してみないのかというと、この18F4520と同じシリーズである18F2420では、プルアップ抵抗は一切つけていないのにも関わらずキチンと動作しているからなんです。
(18F4520と18F2420はなんとデータシートが兼用になっている)
調べてみても、PICマイコンの出力ポートはプルアップしなければいけない、という記事を見ませんし・・・。
なんとも言えません。
抵抗も端子の数ないので、どうしても解決しなかったら、抵抗を買ってきて試そうと思います。
No.3
- 回答日時:
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が機械語として解釈した結果の動作でしょうね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 物理学 写真図3の回路の入力電圧CH1と出力電圧CH2の波形をオシロスコープで測定しました。発振器を使って矩 3 2022/09/25 14:44
- その他(趣味・アウトドア・車) Arudino nanoが正常に動作しない原因 1 2022/10/30 18:29
- スピーカー・コンポ・ステレオ 電源トランス交換について(真空管アンプ) 3 2023/01/29 22:47
- その他(コンピューター・テクノロジー) 量子コンピュータの動作原理がわかりません。同じビットが、1でも0でも有って良いだろうか? 3 2023/02/04 03:20
- その他(趣味・アウトドア・車) 12V/5V DCDCコンバーターについて 4 2023/06/20 07:08
- ブルーレイ・プレーヤー・レコーダー DENONのレコードプレーヤーDP67Lでストップを押すと高速回転します。正常停止する時もあります。 1 2022/11/04 12:57
- 車検・修理・メンテナンス シガーソケットが通電しなくなりヒューズを替えても直りません。原因は何ですか? 10 2022/09/22 11:03
- バッテリー・充電器・電池 ACアダプタについて教えてください 出力5V/1Aを使ってくださいと書いてあるのですが、手元に5V/ 7 2023/08/23 15:11
- その他(データベース) 4進数風なバーコードは何ですか? 2 2022/11/28 23:33
- 電気工事士 【電柱トランス】の一次側が6600Vで2次側が動力トランスで100Vと200Vを作り出 3 2023/06/22 11:05
このQ&Aを見た人はこんなQ&Aも見ています
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッファ・ドライバ・トランシ...
-
スーパーラジオのIFT調整について
-
(*`・ω・)ゞの意味教えてください
-
オペアンプの位相差についてで...
-
これさえあれば、キャバクラと...
-
RL回路における位相差の理論値...
-
音声ラインの600Ωは何故60...
-
なぜ20log10(1020)が60になるの...
-
オシロスコープでみる交流電圧...
-
単相交流を3相交流に変換する方...
-
コンデンサー、コイルの損失抵...
-
10×log(10)400の計算がわかる方...
-
複数のコンデンサを並列に接続...
-
オペアンプのばらつきでおきる...
-
大丈夫?って聞かれて大丈夫じ...
-
位相定数について
-
コンデンサに抵抗を並列接続す...
-
位相
-
速そうな顔文字ください
-
電気回路、交流回路の計算。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
300Wインバーターについて
-
バッファ・ドライバ・トランシ...
-
スーパーラジオのIFT調整について
-
周波数433MHzについて
-
PIC出力Hi←→Low時、5V←→0Vにな...
-
74HC00について
-
PICマイコン、PWMが100%になり...
-
Xbox360のキャプチャでTV経由す...
-
量子コンピュータの動作原理が...
-
各種フリップフロップ 機能変...
-
接点出力と無接点出力
-
遅延によるグリッチのずれにつ...
-
タイミングチャートについてま...
-
ハイエースディーゼルは出荷停...
-
7セグメントのディスプレイの...
-
カウンタに正弦波をクロックと...
-
モーターの定格出力と最大出力...
-
CD-ROMナビに、リアモニタを増...
-
タイマーIC555を使ってパルス信...
-
マキ電機のUTV2400Bの使用方法...
おすすめ情報