PIC(12F1822)のプログラミングについて

このQ&Aのポイント
  • PIC(12F1822)のプログラミングについて
  • PICプログラミング初心者が作成したプログラムの問題点は、ボタンBで最初に戻る動作がうまく動かないことです
  • 問題の原因を特定するために、配線やボタンを交換してみましたが改善されず、if文の位置を変えたところ正常に動作しました
回答を見る
  • ベストアンサー

PIC(12F1822)のプログラミングについて

お世話になっております。 表記の件です。 PICプログラミング初心者で現在勉強中です。 自分で作成したプログラミングが正常に動作せず、わかる範囲でいろいろ試しましたが解決できなかったので投稿させて頂きます。 【IO】 入力:黄LED、赤LED 出力:ボタン2個 【基本動作】 電源ON→黄LED点灯、赤LED消灯→ボタンA ON→10秒カウント、黄LED点滅、赤LED点灯。 ・カウント中にボタンB ON→最初に戻る ・カウント完了→黄LED消灯、赤LED点滅→ボタンB ON→最初に戻る 以上のプログラムを作成しました。 【問題点】 ボタンA、各LED、10秒カウントは正常に動作しています。しかし、ボタンBで最初に戻る動作がうまく動きません。ボタンBを押しても反応しない時が有ります。ボタンBを普通に押して反応する時もあれば、長めに押さないと反応しない時があります。 配線やボタンを交換しても改善されませんでした。 if文を各点滅間に入れてみましたが改善されませんでした。 点滅が絡まないところに持って行くと正常に動作しました。 プログラムを添付致します。 お手数ですがご教示の程、よろしくお願いいたします。 また、こうした方が全体的によくなる等ございましたらよろしくお願いいたします。 以上、よろしくお願いいたします。

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

  • ベストアンサー
  • TIGANS
  • ベストアンサー率35% (244/680)
回答No.1

RA2やRA3がボタン入力に対応していると思いますが チャタリング対策やノイズ対策は行っていますか? https://www.marutsu.co.jp/pc/static/large_order/1405_311_ph https://tool-lab.com/make/macpic-startup-27/ 動作不具合がある場合、MPLABシミュレータなどでシミュレートしてみて プログラム自体には問題がないかを確認するのが第一歩かと思います 原因がハードウェアに限定できれば、対策も容易になりますよ。 [技術者向]のカテですから標準的手順のデバッグを行った後で質問しましょう。

GMNORI
質問者

お礼

TIGANS様 お世話になっております。 毎回ご回答いただきましてありがとうございます。 シュミレーターを一応やってみましたが、理解できず挫折をし質問してしまいました。 もう一度、トライしてから再度質問をさせて頂きます。 以上、ありがとうございました。

その他の回答 (1)

  • lumiheart
  • ベストアンサー率48% (1103/2297)
回答No.2

諸悪の根源は if(RA2==0){ でしょうかねぇ これでRA2がOFF条件で無限ループ if文でなくcase文 http://www9.plala.or.jp/sgwr-t/c/sec06-5.html 無限ループを抜けるにはbrake http://www9.plala.or.jp/sgwr-t/c/sec06-8.html gotoは言語道断 https://marycore.jp/coding/why-goto-statement-is-bad/ 初心者は使ってはイケナイ

GMNORI
質問者

お礼

lumiheart様 お世話になっております。 返信ありがとうございます。 各URL拝見させていただきました。 もう一度見直してみます。 またご質問させて頂きます。 ありがとうございました。

関連するQ&A

  • PIC12F629デジタル入力について

    PIC12F629をC言語でプログラミングしています。 GP2ピンをデジタル入力としてスイッチを接続しGP4をデジタル出力 としてLEDを接続し、スイッチを押すたびにLEDが点灯、消灯を繰り返す ようにプログラミングしてみました。 ところがデジタル入力のピンをGP0,GP1に変更しピンにスイッチを 接続し入力しても同じように動作しません。回路に電源をいれた瞬間 LEDが点灯しスイッチを入力しても点灯したままです。 GP0,1をGP2と同様にデジタル入力として使いたいのですが、単にピンの 番号をプログラム中で変更するだけではダメなのでしょうか? ご教授おねがいします。

  • PIC初心者ですが、16F88のLED点滅制御です。 

    PIC初心者ですが、16F88のLED点滅制御です。  マイナスコントロールの回路ですが車のウインカーでスモール点灯時は今まではウインカー消灯。ウインカーを出した時に点滅でした。これをスモール点灯時にウインカーが点滅ではなく常時点灯に。ウインカーを出した時に点滅に変わるようにしたいんですが、どんなプログラムにすればいいんでしょうか?

  • PICについて

    PICについて勉強していこうと思っている者です。 3つPICについてお聞きしたいことがあります。 1・PICでLEDを調光することは可能なのでしょうか? 2・PICでLEDの点灯をプリセットできるのでしょうか? 点滅→3秒点灯→消灯→5秒点灯  上のような感じのことはできますでしょうか? 3・3000円前後または以下のPICライターございますでしょうか? 今まで、電子工作はやってきたものPICには今まで全然ふれてなく 興味がでてきて勉強したいと思います。 教えていただければ、幸いです。よろしくお願いします。

  • PICマイコン 4つのLEDを点滅させたいのですが

    マイコンのプログラミングはこれから勉強 という所ですが、PICKit3は持っていて、過去に プログラムを作ってもらい、PICに書き込み、 基盤を組んで動作させた事はあります。 本題です。4つのLEDを点滅させたいのですが、 マイコンはPIC10F200で可能だと思います。 ですが、当方やってみたいのが同時点滅でも 順次点灯でもなく、1個1個のLEDの点灯時間を ずらしたいんです。イメージは昔ながらの クリスマスツリーで、バイメタル球の点灯時間が 個体によりばらつきがある、というのをLEDで 再現したいと思ったのですが、PIC10F200で可能 でしょうか? 宜しくお願いします。

  • ELECOM マウス M-BY11BR について

    ELECOM Bluetoothマウスの M-BY11BR を本日購入しました。 電池を入れて電源ボタンをONにしてペアリングボタンを押しましたが、 PCの「Bluetoothデバイスの検出」に何も表示されません。 質問ですが、ダウンロードしたマニュアルには 「ペアリングボタンを押すと 赤色LEDが点滅する」とありますが、購入した物は電源ボタンをONにするとすぐに 1秒間隔くらいで点滅し、ペアリングボタンのON/OFFには関係なく電源ボタンON中 赤色LEDがずっと点滅をしています。 (赤色LEDは左右ボタンの間の細い隙間からやっと見える程度の光り方です。) これは正常なのでしょうか? (この点滅が正常なら、もう少し PCの設定を確認しますが  少し前までこのPCで 別のBluetoothマウスは動作していました。  正常でないなら販売店に初期不良対応をお願いします。) ※OKWAVEより補足:「エレコム株式会社の製品」についての質問です。

  • PIC LED点灯消灯

    わからないので教えて頂きたいのですが、PICでスイッチ1ONで点灯-OFFになったら30秒後消灯、その30秒カウントしている間にスイッチ2が一瞬ONになったら即消灯するようなプログラムをC言語で作りたいのですが考えてもわかりませんでした。わかる方教えて下さい。お願いします。

  • マイコンPIC16F84Aについて質問です

    MPLAB(秋月)のライターを使用して PIC16F84Aにプログラムを製作したいのですがプログラムの組み方がわかりません 内容は、センサー5v~24vがオンしたらLEDが点灯する回路です。 動作確認をしたところ、センサーはオンオフしているのですが、LEDが点灯しません。 プログラムを組む時に、RB0がオンしたらRA0がオンする為の繋がりがイマイチわかりません。 c言語はわからないので、アセンブル命令で教えていただけないでしょうか? 初心者なので全くわかりませんがお願いします。

  • PICマイコンのLED制御

    PICマイコンのLED制御 pic12Fを使って、LEDのPWM制御を行おうと考えていますが、うまくいかないので知恵をおかしください。 それぞれの出力端子に3色のLEDをつけて、順にだんだん明るくなってから、だんだん消灯してゆくプログラムを考えましたが、 最初のLEDが消える前に、2番目のLEDをゆっくり点灯させたいと思っていますが、うまくいきません 少しだけ同時点灯するには、どのような考えをすればいいのでしょうか。だんだん消えていく中で、点灯を始める処理がわかりません。よろしくお願いします。

  • PIC12F675 ウォッチドッグタイマーの使い方

    最近趣味でPICアセンブラを初めた者です。 WDTの実験をするため以下のプログラムでリセットのかかるまでの時間を比べてみました。 私の考え違いかもしれませんが、WDTポストスケーラの値によってリセットするまでの時間は違うと思ったからです。 675のGP0~GP3の入力をOPTION_REG のbit0~bit3に割り当てました。 GP3はHに固定してあるのでOPTION_REG bit3(PSA)は常にHです。 プログラムは一秒間のLED点灯後消灯し、WDTリセットのかかるまでループします。 WDTリセットからのリスタートはLEDを点滅後、同じことを繰り返します。 このときGP0~GP2の端子を切り替えることにより、OPTION_REGのWDT分周比を変え、 LED消灯後、リスタートし、点滅するまでの時間が変わると思ったのですが、変化しません。 正確な時間はわかりませんが、GP0~GP2を変えても、リスタートまでの時間は三秒程度一定です。 OPTION_REGのbit0~bit2がすべて立ってるのではと思われるのですが、 私のWDTの設定に対する考え方が間違ってるのか、テスト用のプログラムにミスがあるのかわかりません。 お暇な時で結構ですので、お教えくださるよう、どうぞよろしくお願いいたします。 title WDT list p=12f675 #include <p12f675.inc> errorlevel -302 __CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_OFF & _WDT_ON & _PWRTE_ON & _INTRC_OSC_NOCLKOUT org 20h work RES 1 ; ワーク counter RES 1 ; 回数カウンター cnt10m RES 1 ; 10ms時間稼ぎ用ワーク cnt500u RES 1 org 0 goto start start bsf STATUS, RP0 ; レジスタバンク1を選択 call h'3ff' movwf OSCCAL ; 書き込む movlw b'00001111' ; GP0~GP3を入力設定 movwf TRISIO clrf ANSEL ; すべてデジタルI/O bcf OPTION_REG, NOT_GPPU ; プルアップ使用する bcf STATUS,RP0 ; バンクゼロ btfsc STATUS,NOT_TO goto start2 movlw d'5' ; LED 点滅回数を5回にして call led_on_off start2 bsf GPIO,GP5 ; 一秒間LEDを点灯し call tm1000 movf GPIO,w ; 入出力ピンを読んで b3は一番ピンに直結し常時 H andlw b'00001111' ; 下位4ビットだけ選び bsf STATUS,RP0 ; バンク 1 選択 iorwf OPTION_REG,f ; ウォッチドッグの分周比とする bcf STATUS,RP0 ; バンク 0 loop bcf GPIO,GP5 ; LED消灯し goto loop ; リセットがかかるまでループ ; LED を0.1秒ごとにWレジスタの回数点滅 led_on_off movwf work led_loop decfsz work goto led_loop2 return led_loop2 bsf GPIO,GP5 call tm100 bcf GPIO,GP5 call tm100 goto led_loop ;-------------- 1000ms,100ms 遅延ルーチン tm1000 movlw D'100' goto lp200 tm500 movlw D'50' goto lp200 tm100 movlw D'10' ;10ms遅延を10回で100ms lp200 movwf counter ;カウンターをセットし lp201 decfsz counter,f ;カウンターはゼロ ? goto lp202 ;いいや return lp202 call t10m goto lp201 ; 10msec 遅延ルーチン for 4Mz t10m movlw d'8' movwf cnt10m tm10lp1 movlw d'249' movwf cnt500u tm10lp2 clrwdt ; ウォッチドッグタイマーをクリア nop decfsz cnt500u,f goto tm10lp2 decfsz cnt10m,f goto tm10lp1 return END

  • PICを使ったLED回路について教えて頂きたいです。 電源12から5V

    PICを使ったLED回路について教えて頂きたいです。 電源12から5Vに変換し遅延回路を通してPICへ入力。ポートBを出力にしポートBの各ピンからトランジスタTD6083?へ接続。トランジスタアレイからLEDマイナスへ接続してます。  これだと、電源オンにしリレーに電流を流すとLEDが点滅致します。(点滅プログラム書き込み済み) 電源を入れてLEDが常時点灯。リレーに電流を流すとLEDが点滅という感じにしたいんですがアドレスお願いします。