アプリ版:「スタンプのみでお礼する」機能のリリースについて

最近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)


こんな感じです。。。

長文大変失礼しました。
原因がわかる方いらっしゃいましたら、ご教授願います。

A 回答 (5件)

>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の条件を満たさなくなるのでスルーされます。

その結果、発振せず無事に出力が変わるようになりました!
素晴らしい!



それにしてもなぜループされるんでしょうかねぇ・・・

プログラムが終わると自動的にリセットでもかかるんでしょうか?

補足日時:2013/09/20 01:44
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

確かにすごく頷けるのですが、ループにはしていません。
まったくその通り、ループしてしまっているかのような挙動なんですけどね・・・。


そういえば、以前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のままになります。


ただこの場合、出力が発振するような挙動は見せなくなりましたが。



まったく理解ができません。。。
おそらくプログラム的に何かがおかしいのだと思うのですが。。。


また何かわかったことがありましたらご教授お願いします。

お礼日時:2013/09/20 00:51

PICのプログラムは、どのOSから呼び出されたわけでもないので、プログラムの終了はユーザーが指定する必要があります。


通常は無限ループにするか、HALT命令でスリープモードへ移行させるなど、何らかの指示が必要です。

手動でリセットするまで、本当に何もさせなくていい場合は、プログラムの最後にwhile(1)を入れてもいいです。でも、これだと電池を食いますのスリープにしたほうがいいでしょう。

今回の質問の例で無限ループになっているのは、コンパイルされたmain関数の機械語プログラムが配置されているメモリ位置よりも後ろの部分にもともと存在している意味のない数値列をCPUが機械語として解釈した結果の動作でしょうね。
    • good
    • 0
この回答へのお礼

なるほど・・・

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

お礼日時:2013/09/20 10:39

これが、参考になるかも知れません。



オープンコレクタ
http://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%BC% …
    • good
    • 0
この回答へのお礼

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

お礼日時:2013/09/20 10:33

すいません、私、そういったマイコンを使えません。


ですが、知っている事をお知らせしますので、ご確認ください。

>・出力に設定しているピンは全て開放している。

原因は、ここにあるかと思います。
通常、使わないピンであっても「プルアップ抵抗」が必要です。
論理的には、問題ないと思われますが、確か「オープンコレクタ」という回路になっていたかと思うので、「安定化」目的で、プルアップが必要になります。

解放時に特に「プルダウン」指定が無い場合、基本的にプルアップしないといけません。

電源から、10KΩくらいの抵抗を各端子(端子数分ね。)に付けて、同じ命令を出してみてください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。


うーん、かなり悩みましたが、PICマイコンのピンはI/Oポートで、出力時は0Vと5Vの選択ができます。
5Vの出力ができるということは、おそらくオープンコレクタではない・・・?という考えにたどり着きました。
オープンコレクタの場合、5Vの出力は出来ないからです。
もしオープンコレクタだったとしても、5Vの出力ができるということは、内部で既にプルアップされているのではないでしょうか。


なぜ単純に試してみないのかというと、この18F4520と同じシリーズである18F2420では、プルアップ抵抗は一切つけていないのにも関わらずキチンと動作しているからなんです。
(18F4520と18F2420はなんとデータシートが兼用になっている)


調べてみても、PICマイコンの出力ポートはプルアップしなければいけない、という記事を見ませんし・・・。

なんとも言えません。
抵抗も端子の数ないので、どうしても解決しなかったら、抵抗を買ってきて試そうと思います。

お礼日時:2013/09/20 00:35

マイコン基盤でしょうか。


そのポート出力ICの型名(本体印刷)を見て、ネットでデータシートを検索してみてください。

ロジック1とはアクティブを意味します。
過去のTTLでは、その動作はLowアクティブでした。
Lowアクティブ出力とは0Vを意味し、電流吸い込みです。
また、Lowは0.3V以下、Highは2.4V以上(但し、電流を取らないこと)が一般的でした。
同等の出力ICを用いて、同じ論理で動いているのでしょう。
    • good
    • 0
この回答へのお礼

んんん?
よくわからないのですが・・・。

>マイコン基盤でしょうか。
>そのポート出力ICの型名(本体印刷)を見て、ネットでデータシートを検索してみてください。

PICマイコンそのものです。
ICはPICマイコンの18F4520しかないのですが、ポート出力ICとは・・・?
一応18F4520のデータシートには目を通してあります。

部品は

PICマイコン18F4520
20MHzセラロック
パスコン0.1μF
電源平滑(?)用電解1000μF

の4つしかないです。

お礼日時:2013/09/19 20:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!