• ベストアンサー
※ 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% (1886/9016)
回答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% (1886/9016)
回答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

  • PICのプログラムカウンタについて

    プログラムカウンタでポートAに4bitの2進数を入力して、変換された2進数のデータをポートBに出力させることはできたのですが、 ポートCにも違うデータを同時に出力させたいのですが、どういった命令文を作ったらいいでしょうか? 例えば、ポートAが「HLHL」の入力の時にポートBでは「HLLH」、ポートCでは「LLHL」を出力させる方法です。 言語はアセンブラ、マイコンはPIC16F886です。 よろしくお願いします。

  • マイコンの汎用ポートで-5Vを出力する方法

    5Vで動作中のマイコン(H8orPIC)のポート出力(とGND)をケーブルで接続された外部に出力する際0Vまたは5Vが出力されると思います。これを0Vまたは-5Vで外部に出力するには、ポート出力の後どの様な回路が必要なのでしょうか?

  • 電子工作 PIC PIC16F84A アセンブラ

    PIC16F84Aを使用して1番ピン及び2番ピン及び3番ピンが一瞬でも0Vになり、 5秒経過、6番ピンから3秒間出力、始めに戻る。 こんなようなプログラムを作りたいと思っていますが、 なにぶんPIC初心者なものでどうプログラムしたらよいか全くわかりません。 ピン入力に順序は関係なく全て0Vならカウント開始です。 5秒のカウント精度は低くても問題ありません。 5秒カウント中に1、2、3番ピンのいずれかが一瞬でも5Vになったらカウントを中止し、 始めに戻ります。 5秒カウントの6番ピンのステータスは0Vです。 6番ピン出力中は、1~3番ピンの監視は不要です。 6番ピンからの3秒出力の後は出力をやめ始めに戻ります。 開発言語はアセンブラです。

  • PIC16f88でLEDの点灯をしたいのですが、

    PIC16f88でLEDの点灯をしたいのですが、 9番ピン(RB3)だけLEDが点灯しません。 #include<htc.h> __CONFIG(UNPROTECT & DEBUGEN & MCLRDIS & PWRTEN & WDTDIS & HS); void main() { PORTB = 0xff; TRISB = 0x00; } 上記のプログラムでBポートをすべて出力にしてLEDを光らせているつもりです。 書き込みを行い試してみたところ、6,7,8番は点灯してくれました。 いろいろと調べてみたのですが、PWM設定(CCP1)と関係があるのでしょうか? また何かしらの設定が必要でしたら、教えていただけると助かります。

  • PICマイコン、水晶発振子の異常

    カテ違いかも知れませんがマイコンおよび電子回路についての質問です。 水晶発振子が異常発信しMCLRによるリセット後、正常に発振します。 マイコン:PIC16F887 水晶発振子:VT-200-F コンフィグは以下のように設定 __CONFIG _CONFIG1, _LVP_OFF & _FCMEN_ON & _IESO_OFF & _BOR_OFF & _CPD_OFF & _CP_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _LP_OSC __CONFIG _CONFIG2, _WRT_OFF & _BOR21V OPTION_REGは以下のように設定 movlw B'01011000' ; 7.ポートBのプルアップ:無効 ; 6.ポートBの割り込みエッジ ; 5.TMR0のクロック源:内部命令サイクル ; 4.TMR0のカウントするクロックエッジ ; 3.プリスケーラ:WDTに割り当て ; 2.1.0.プリスケーラ初期値(未使用) movwf OPTION_REG 13ピン(CLKIN)と14ピン(CLKOUT)に水晶発振子を接続。 それぞれに15pFのコンデンサを接続。 40ピン(RB7)にLEDを接続(TMR0で割込みが発生したタイミングで点灯消灯を繰り返します。) 1ピンはMCLRとして利用 で、計算上の割込みタイミング(プリスケーラなし) (1/(32.768/4))*256=31.25ms なのですが40ピンのHI、LOWタイミングをオシロで観測したところ 実測値は以下のとおりでした。 電源接続直後:256.7us 1ピンでのリセット後:31.37ms(ほぼ計算通り) 電源接続直後は必ず上記のようになり1ピンでリセットすると正常に発振し始めます。 コンデンサの容量が合っていないのかと思いいくつか試してみました結果は同じでした。 水晶発振子も変えてみましたがやはり結果は同じでした。 コンデンサの足も切って短くしてみましたがこれも結果は変わりませんでした。(この程度の距離は関係ない?) 回路はブレットボード上です。 マイコンが壊れているのでしょうか? 今までもっぱらセラロックや水晶発振器を使っていて今回初めて水晶発振子を使ってみてこのような事象に遭遇しました。 どのようにしたら正常発振するか詳しい方、ご教示いただけたら幸いです。

  • PIC12F629の発振

    PIC12F629を外部に某社のセラロックを使って XTモードで4MHzで発振しています。 (今回は内部発振は精度上使えません。) しかしCLKOUTの出力スィングは01.7V しかありません。 ただしプログラムは正常に動作しています。 同様のことをPIC16F84Aでやると CLKOUTの出力スィングは04Vあります。 CLKOUTの出力スィングが小さいことは 問題ないのでしょうか。 ただPIC12F629をHSモードにするとスィングは 05VありますがCLKOUTの波形の 歪は大きくなります。 プログラムは正常に動作しているといっても試作の 3セットだけなので量産したときのことを かんがえるとやや不安です。 どう考えたらよいかアドバイスください。

  • PICで入力ポートの内容を出力ポートにコピーしたい

    PICのプログラムをアセンブラで組んでいるのですが、 どうにもシンプルな書き方ができなそうなのでお知恵をお貸しください。 例えば、 ポートAが入力、それ以外のポートは出力になっているとします。 ・ポートAの0番のオンオフを、ポートBの2番へコピー出力。 ・ポートAの1-3番のオンオフを、ポートCの4-6番へコピー出力。 という感じで、Aのオンオフ状況を、各出力ポートにコピーするということをしたいです。 どのようにしたらスマートに書けるでしょうか? ちなみに各出力ポートに関して、コピーする前に一旦全てオフにする、 というようなことはできません。

  • 【pic】ビットを取り出して、足し算、出力

    問 PORTB に信号を入力する。この信号のうち、上位4ビットと下位4ビットを取り出し、それぞれを足し算して、PORTAに出力するプログラムを作成せよ。以下を参考にせよ。 参考 #include <pic.h> void main(void) { int x, y, z; TRISA = 0x00; TRISB = 0xFF; for(;;) { x = (0b11000000 & PORTB) >> 6; y = (0b00111000 & PORTB) >> 3; PORTA = x; } } ということで、実際に作っては見たのですが、あっているかどうかも不明です。特に苦手な分野ですので詳しい解説の方よろしくお願い致します。 自身で書いてみたプログラム↓ #include <pic.h> void main(void) { int x, y, z; TRISA = 0x00; TRISB = 0xFF; for(;;) { x = (0b11000000 & PORTB) >> 4; y = (0b00111000 & PORTB) << 0; z = x + y; PORTA = z; } }

  • PIC12F629のMCLRピンが出力に?

    PIC12F629でリレーをON/OFFしています。 使用ピンはGP1とMCLRのみです。 動作中にCPUに約0.8Aぐらい流れCPUが発熱(手で触れないほど)するトラブルが発生しました。 このときはMCLRピンは電源(+5V)に直結してあります。 対策としてMCLRピンから抵抗1KΩを経て+5Vへ接続することにより解決しました。 理由としての予想ですが リレーのノイズにより入力専用のMCLRピンが出力になり0出力され +5Vから(抵抗がないので)大電流が流れこんだ・・・ と思うのですが。 入力専用のMCLRピンが出力になるという仮定がへんですが 私には、そうしないと説明がつかないような気がします。 「正しい解釈(?)」を教えてください。

  • PIC 16F887 を使い7SEG を動作させたいのですが上手く行き

    PIC 16F887 を使い7SEG を動作させたいのですが上手く行きません。 不具合の可能性が、回路が悪いのか、プログラムなのか、わかりません。 添付の画像は不鮮明だと思いますがご了承ください。 動作は、入力によって7SEGの表示をかえます。 マイコンは、PIC16F887(40ピン)で外部オシレータ、リセット等は付けてません。 11ピン 32ピンを5V 12ピン、31ピンをGNDに接続しました。 入力は1ピン~6ピンを10Kプルアップで使用し、6ピン(RA4)は使いませんが、10Kでプルアップしました。 1ピンはフォトカプラ入力ですが、2ピン~5ピンは直接駆動です。 出力は、7SEG(アノードコモン)を4つを動作させるため、40ピン、39ピン、30ピン、29ピンをトランジスタ2SA1015(PNP型)でスイッチングします。 7SEGの表示はPICダイレクトとしました。 マイコンを付けずにジャンパワイヤーで7SEGの動作確認をしまし点灯を確認しました。 以上をでプログラムを書き、電源を入れましたが全く動きませんでした。 マイコンピン配線のマズさなのか、プログラムの可能性なのかご教授、アドバイス宜しくお願い致します。

【MFC-9340CDW】スキャンの方法
このQ&Aのポイント
  • パソコンからスキャンする方法がわからない
  • MFC-9340CDWを使ってスキャンするための手順が知りたい
  • 無線LANで接続しているMFC-9340CDWのスキャン設定について教えてください
回答を見る

専門家に質問してみよう