• 締切済み

PICについての質問です。使用PIC(PIC16F88)

PICについての質問です。使用PIC(PIC16F88) LEDを0.5秒点灯、0.5秒消灯させるプログラムを書いています。 追加でLEDを駆動するFETが故障してショートモードになったときを考えて、通電監視プログラムを 組み込みましたが、わからないところがあります。 タイマー1を使用して、0.1秒ごとに割り込み、通電検知させて、3秒連続して通電状態の場合はハード的にOFFにするという回路を組み込みました。 0.1秒ごとに割り込みさせて、通電と判断したらカウンターをカウントダウンさせて、0回になったらフラグをたてています。 メインルーチンで フラグチェック処理→0.5秒点灯、0.5秒消灯処理→(はじめに戻る)というフローにより、通電監視フラグを1秒ごとにチェックして、フラグが立ててあれば、強制的にOFFにします。 そのカウンターの設定値ですが、30回にすると3秒後の消灯になりません。いろいろ試した結果23回であれば、最短3秒後以降消灯できるようになりました。 自分で理解したいと思うのですが、なぜこれでうまくいくのかわかりません。 解説書、webも調べましたがわかりません。 どなたか推測でもいいので、教えていただけませんでしょうか?

みんなの回答

  • poyo3
  • ベストアンサー率30% (260/857)
回答No.2

やはりTIMER1の設定を確認でしょうか? プリスケーラーの設定、クロック周波数の確認、あとはTMR1のカウント数でしょうか? TMR1はアップカウントでオーバーフローすると割り込みがかかります。 設定が0Hであれば毎回問題はないですが他の値でカウントする場合は一度割り込みがかかった後に再セットする必要があったかと思いますのでその辺も確認してはどうでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • paspas
  • ベストアンサー率52% (47/90)
回答No.1

0.1秒周期の割り込みのつもりが、実はもう少し長い間隔なのではありませんか?

pats
質問者

お礼

ご指摘ありがとうございます。 割り込みタイミングチェックしてみます。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PICについて

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

  • PICマイコンのLED制御

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

  • PIC LED点灯消灯

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

  • 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文を各点滅間に入れてみましたが改善されませんでした。 点滅が絡まないところに持って行くと正常に動作しました。 プログラムを添付致します。 お手数ですがご教示の程、よろしくお願いいたします。 また、こうした方が全体的によくなる等ございましたらよろしくお願いいたします。 以上、よろしくお願いいたします。

  • PIC16F84Aのプログラムについて(初歩的な質問)

    PICのプログラムを勉強しています。簡単なプログラムとして電源を入れるとPORTBにつないだLEDを3回点滅させて、最後は点灯しっぱなし(電源きるまで)にしようとしていますが、点灯しっぱなしにならずにずっと点滅してしまいます。(プログラムの最初に戻ってるらしい)昔のBASICなどですと「100 GOTO 100」とかすると変数の値はそのままで無限ループするので、PICでもSTATUSレジスタのPORTBを1にする命令を何回もGOTOによって繰り返させてますが出来ません。何故でしょうか?PORTBを電源切るまで1にしたままにするにはどうすればいいのでしょうか?勉強不足で私自身何もわかってませんがよろしくお願いいたします。

  • PICが壊れる条件

    12V 300mA 程度のLED をN-ch MOS-FET (2SK2232) にてオンオフしています。 PIC16F88 を使っています。PIC への給電5V は、LED に回している12V から三端子レギュレータを經由して取っています。 これで半年ほど、ほぼ安定して昼夜を問わず運転できました。 しかし最近不可解な点滅が生じて、PIC がダメになりました。別のPIC に戻したら安定しました。しかし昨日も同様の症状があり、今朝方はやはりPIC がダメになったようです。 1. MOS-FET は問題なさそう(PIC を使わず5V を直接ゲートに入れるとちゃんと動く)。ライトもちゃんと点灯する。ただしPIC では調光の為、高速にオンオフを行う。 2.昨日は雨だった。ライトは軒先(屋根の下の天井板)についている。漏電の確認はできていないが、テスターではLEDと抵抗を経由する全抵抗値は安定して25MΩ程度ある(テスターの通電電圧では直列に3つ繋いだLED を通れないと思われる)。 3.電源はACアダプタだが、最大電流の8割以下に収まっている(計算上)。三端子レギュレータからの5V も問題なさそう。 4.基板を臭うと若干変なニオイがする。ただ接点回復剤をスプレーしたので、その揮発成分かなとも思う・・・。絶縁にはSU ボンドを使っている。 PICを2つ、続けてダメにしたので原因を究明できないと安心して常時点灯できません。どんな理由が考えられるでしょうか?

  • 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

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

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

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

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

  • PICの割り込み機能

    現在電子工作をしており、それにPIC16F84Aを使っています。 正直アセンブリはよくわからないので、C言語でプログラムを作っています。 コンパイラはPICCLITEで、LEDの点灯・消灯に関するプログラムです。 機能としては ・RA0に入力があったときRB0につないであるLEDが消灯しているならLEDを点灯。 ・RA0に入力があったときRB0につないであるLEDが点灯しているならLEDを消灯。 ・RA1に入力があったときLEDが点灯しているなら5秒後にLEDを消灯。 というものを目指しています。 1つ目、2つ目の項目はif文で簡単に実現できましたが、割り込みがうまくいかず、 消えている状態でRA1に入力を入れたときなぜか5秒後に点灯してしまいます。 だからRB0の出力を逆にしてみたんですがうまくいかず・・・。 ハード的には、RB0には反対側から5Vをかけ、 RB0=0の時は点灯 RB0=1の時は消灯 としています。 またセラロックは10MHzのものを使用しています。 現在のプログラムとしては #include "pic.h" #define XTAL_FREQ 10MHZ #define MHZ*1000 void DelayUs(unsigned char cnt){ //時間待ち関数  unsigned char i;  i=(cnt)/(12MHZ/(XTAL_FREQ))|1;  while(--i!=0) continue; } void DelayMs(unsigned int cnt){ //時間待ち関数  unsigned char i;  do{   i=4;   do{    DelayUs(250);   }while(--i);  }while(--cnt); } int cnt,SW; //SWが0なら消灯 //SWが1なら点灯 void interrupt isr(void){ //割り込み関数  if(T0IF==1){   T0IF=0;   cnt--;  }  if(cnt==0){   RB0=1; //消灯   SW=0;   cnt=190;   T0IE=0;   GIE=0;  } } main() {  TRISA=0xFF; //入出力設定  TRISB=0x00;  PORTA=0x00;  PORTB=0x00;  SW=0;  OPTION=0x87; //プリスケーラの設定  TMR0=0x00;  T0IF=0;  T0IE=1;  cnt=190;  while(1){   if(RA0==1){    DelayMs(60); //チャタリング防止    if(RA0==1){     if(SW==0){      RB0=0;      SW=1;     }    else{     RB0=1;     SW=0;    }   }  }  if(RA1==1){   DelayMs(60); //チャタリング防止    if(RA1==1 && SW==1){     TMR0=0;     T0IF=0;     T0IE=1; //割り込み許可     GIE=1; //全体割り込み許可    }   }  } } インターネット上での割り込みのプログラムをいくつか見てみたのですが、 どれもすべて動作を終えて、あとはwhile(1)で割り込みを待つだけ というプログラムばかりでした。 僕のは基本的にRA0の入力によってLEDを点灯・消灯させつつ RA1の入力で割り込みを開始。 5秒後に消えたら割り込みを禁止する。 という仕様にしたいのですが・・・・・・。 1ヶ月ぐらいやってますがうまくいきません。 良ければご回答をお願いします。

専門家に質問してみよう