PIC16F18857 Timer0割り込みが働かない

このQ&Aのポイント
  • PIC16FXXXXXシリーズでXが5桁のPIC16Fはオプションレジスタがなくなりました。Timer0の割り込み設定を他のレジスタで行うが、働かない問題が発生しています。
  • マニュアルを参照しても割り込みが働かない原因がわかりません。何か見落としている点があるのかもしれません。
  • PIC16F18857のTimer0の割り込みが働かない場合、経験豊富な方からのアドバイスをお願いします。
回答を見る
  • 締切済み

PIC16F18857 Timer0割り込みせず

前回の質問、抽象過ぎ、また要点を得ていませんでした。 PIC16FXXXXXのシリーズでXが5桁のPIC16Fは、オプションレジスタが無くなっています。その設定すべき内容が他のレジスタに移ったようですが、マニュアル見てTimer0の割り込みを設定しているのですが、割り込みが働きません。 何処か大事な点を見落としているように思います。 経験された方からのアドバイスをお願い致します。

みんなの回答

  • kuro804
  • ベストアンサー率29% (523/1762)
回答No.1

こんにちは タイマー割込処理内でタイマーフラグをクリアしてますか? この場合、最初の一回のみ割込処理に跳びます。 デバッガーなどを使って、割込処理の最後で一時停止させれば フラグがクリアされているか分かります。 デバッガーでなくても割込処理で実験的にランプでも点灯させれば実験は可能です。色々と工夫すればテクニックが増えて楽しいですよ。 最悪、処理のプログラムそのまま記載すれば、結構回答が付きますよ。

tomcat1032
質問者

補足

回答ありがとうございます。 フラッグのクリアは行っています。 今はTimer0を諦めてTimer4で処理を行っています。 0と4でのレジスタ設定で何か抜けているんでしょうね。

関連するQ&A

  • PIC16F18857 Timero割り込み

    PIC16F18857 Timer0の割り込みが掛からず困っています。 マニュアルに書かれている項目の設定はしているつもりですが 何かが抜けているように思います。 ご教授下さい。

  • PIC 16F54 でTMR0割り込みを使いたい。

    最近PICによる電子工作を学び始めた初心者です。 値段が安いことにひかれて 16F54 を使っていろいろ学んでいこうと思ったのですが、TMR0割り込みを使ったプログラムを組もうとしたところ、行き詰まってしまいました。 他の 16F84A やその他のネットで紹介されている PIC の場合、INTCONレジスタのT0IEをセットしたり、T0IFをクリアにしたり、RETFIEで元の位置に戻ったりすると思うのですが、16F54にはINTCONレジスタも RETFIE命令もありません。 試しに、MPLABでINTCONレジスタの設定は無しにして、RETFIE命令は書き込んでアッセンブルしてみたらRETFIE命令に警告が出たものの、どうにか成功しました。 そこで試しにデバックしてみると、T0IEをセットしていないので当然なのですが、TMR0はカウントされるものの、割り込みは発生しませんでした。16F84Aや16F88等のPICも数百円で買えるので素直にこれらをチョイスすれば良いのでしょうが、百円を切る低コストの16F54に魅力を感じるし、何より疑問を解決しないまま、財力に任せて解決とすることに抵抗があります。 どなたかこんな私を助けてください。

  • PIC16F88 内部オシレータ使用による割り込み

    PIC16F88を内部オシレータで発振させて使用しています。 問題は、TIMER0割り込みが計算通りに動かないことです。 外部にオシレータを付けると計算通りのタイミングで割り込みが発生するのですが、内部オシレータ使用の場合は、その間隔よりもかなり長くなってしまいます。(0.01秒間隔で割り込みをかけるつもりが、3秒間隔ぐらいになってしまいます。) 何が原因なのでしょうか? 完全な答えでなくても色々試してみますので、何か気になる部分が御座いましたら、教えて下さい。

  • PIC16F1827の外部割込み

    PIC16F1827のRB0を 外部割込みとして入力の立上りで割込みを発生するように 設定します。 1.割込み禁止 2.プログラムAスタート 3.RB0に立上り入力あり 4.プログラムA終了 5.割込み許可 ・・・のような場合 5.以降に割込みが発生するでしょうか? ご教授お願いします。

  • PIC16F88で500という数字を8ビット+2ビットのレジスタに設定

    PIC16F88で500という数字を8ビット+2ビットのレジスタに設定する方法を教えていただきたいです。 変数D1,D2,D3にそれぞれ、0,0,5 という500を意味する各桁の数字が入っているのですが、 これをPWMのDutyのレジスタに8ビット+2ビットで設定したいのですが、 どんな手順をとったら10ビットの2進数に変換できるでしょうか?

  • PIC Timer0割り込み されない

    12F609でTimer0割り込みが実行されません。 実行されないというか、動作的に割り込みハンドラが呼ばれていない感じです。 以下がプログラムです。 void main(void) //メインプログラム { T0IE = 0; GPIO = 0; T0CS = 0; PSA = 0; PS0 = 1; PS1 = 1; PS2 = 1; TMR0 = 0; TRISIO = 0x00; a = 0; GP4 = 1; T0IE = 1; GIE = 1; while(1) } void interrupt blink(void) //---割り込みハンドラ--- { if(T0IF==1) { T0IF = 0; if(a%15==0) { GP4 ^= 1; a=0; } a++; } } 以上です。 割り込み15回ごとにGP4の出力を反転させるプログラムです。 が、反転されずGP4は1のままになってしまいます。 (初期時にGP4=1としているので) 二週間粘りましたが、まったく解決できず困っています。 何がいけないのでしょうか。 ご教授お願いします。

  • PIC24FのPortBレジスタが書き込めません↓

    おはようございます。 PIC24FJ254GB106のTRISBを出力設定の0x0000に設定しPortBをたたくとLATBのレジスタ値は変化するのですがPortBのレジスタ値変化しません。↓ 何か単純な理由で上記の症状がおきるのでしょうか? 知ってる方いましたらヨロシクお願いします。

  • PIC16F84 10進-->2進変換プログラム

    いつもお世話になっております。 google等で検索して居りますが行き詰まってこちらに投稿させて 頂きました、何卒宜しくお願いいたします。 PICマイコン 16F84などを使った制御を行っていますが下記の アセンブラプログラムが書けなくて苦慮して居ります。 10進-->2進変換 具体的には・・・・ 10進(0~9)二桁のデジスイッチをRB0,1,2,3のポートにダイオードOR にて接続して設定値00~99までのどれか一つの数字をレジスタに読み 込ませます、一度設定したら少なくとも数日はそのままです。 例えばデジスイッチを63に設定すればレジスタにも63と読み込まれ ますがPICマイコン側から見れば10進の63では無くてそれは16進の63H だと当然判断されます、これを2進変換して3FHに書き替えたいのです。 デジスイッチ設定値63 0110 0011 ↓↓↓↓ 3FH 0011 1111 デジスイッチ設定値50ならば 0101 0000 ↓↓↓↓ 32H 0011 0010 デジスイッチ設定値99ならば 1001 1001 ↓↓↓↓ 63H 0110 0011 原始的に引き算を繰り返す事で00から99までのプログラムを書きましたが 大変冗長的で他に既知のプログラムが有るのではないか、例えばBit反転 して幾つを足すとか引くとかそのような簡単なプログラムが有れば是非 ご教示頂きたいと存じます。 16進(0~F)のデジスイッチならこの様な変換は無用なのですが人間 が相手なのでどうしても10進デジスイッチを使うことを要求されます。 初歩的な質問ですがどうか宜しくお願いいたします。

  • PIC16F193X割り込み時の退避・復帰処理方法

    ICマイコンでの割り込み処理について、16F193Xの型番では割り込み発生時における退避・復帰が自動的に行われると認識しているのですが、下記型番では以前の様に wレジスタ、status,PCLATh等のレジスタを退避・復帰をプログラムで保存しておく必要がなくなったということでしょうか? 使う割り込みはタイマー割り込み(timer0)とし、割り込処理中の割り込みは禁止とした場合 因みに割り込みは以下の様に発生させ ////////////////////////// org   0 goto start org 4 goto INTLAP ////////////////////////// INTLAP BCF INTCON,2 INCF TES_CNT,1 RETFIE 割り込み処理中にTES_CONのレジスタ内容をPORTAの出力pinをオシロスコープで観察できる簡単なプログラムで走らせると動作していることが確認できましたが、退避・復帰が行われているかは不明です。 他に自動退避・復帰を確実に実行するためのプログラム等の操作を怠っていないでしょうか? 初心者で認識が誤っていないのか判断が出来ません。 対象型番 PIC16F1933 ? PIC16F1934? PIC16F1936 ? PIC16F1937? PIC16F1938 ? IC16F1939 PIC16F193X/LF193Xデータシート記述より(P71,72) 〇「このデータシートに記載されているデバイスRETFIE 命令では、割り込み前に実行していたアドレスをスタックから取得し、シャドウ レジスタから保存した内容を回復し、GIE ビットをセットすることによって、ISR から通常動作に復帰します。」 内容保存機能 〇「割り込み動作に遷移する際、復帰時の PC アドレス値がスタックに保存されます。また、次に示すレジスタ値も自動的にシャドウ レジスタに保存されます。 ・W レジスタ ・ ステータス レジスタ (TO および PD を除く) ・BSR レジスタ ・FSR レジスタ ・ PCLATH レジスタ 割り込みサービス ルーチンから通常動作に戻るとき、自動的にこれらのレジスタ値が回復されます。 とあります。

  • PICによる7セグLED3桁制御

    PICによる7セグLED3桁制御 度々こちらに、お世話になっております。 今回は、3桁のLEDを1から999までカウント表示する プログラムに取組んでいるところ希望通りに、動いてはくれません。 このソースのベースは2桁(1から99までカウントUP)の ソースコードを変更して、3桁表示させる様にしてみました。 コード概要はtimer0割込みで3.2msのインターバルタイムの間、 LEDをダイナミック点灯させ、timer1では、100msのインターバルタイムを 10回繰り返し(1秒毎に)counterを1プラスしてLEDの表示を1ずつ 増して999まで表示後、また000から繰返すと言う単純な動作のものです。 main()関数内はtimer0とtimer1の割込み設定及び 割込み開始、許可を繰返すだけです。 問題の#timer0,#timer1割込み関数処理部分における実行結果は、 000から111と言う具合に3桁が同時にカウント表示されてしまい、 しかも繰り上がる時間は1秒毎の筈が、100秒毎になります。 このコードはCCS-Cコンパイラに準拠していて、 標準Cとは多少異なる部分があり解りにくいと思いますが どうかどなた様からも検証より不具合コード部分のご指摘と修正を 頂くことが出来るなら、大変光栄に思います。 そこで、PICにおけるconfigu部分は省き、概ねのコードを記します。 //// 1:static long int number; 2:static int counter; 3:int const LED_SEG[11]= {0x7E,0xCC,...略} 4:#int_timer0 5:void isr() { 6:static int a,b,c = 0; 7:int x; 8:out_low(PIN_C0); // LED 1桁目off 9:out_low(PIN_C1); // LED 2桁目0ff 10:out_low(PIN_C2);// LED 3桁目0ff 11:a = number % 10; 12:x = number/10; 13:b = x % 10; 14:c = x / 10; 15:output_b(LED_SEG[a]); 16:output_high(PIN_C0);//1桁目ON 17:output_b(LED_SEG[b]); 18:output_high(PIN_C1);//2桁目ON 19:output_b(LED_SEG[c]); 20:output_high(PIN_C2);//3桁目ON } 21:#int_timer1 22:void isr() { 23:set_timer1(0x0BDC);//100ms再設定 24:counter++; 25:if(counter>9)//10回か { 26:counter = 0; 27:number++; } 28:if(number>1000) { 29:number = 0; } } 30:void main() { 略 31:setup_timer0(3.2msセット) 32:setup_timer1(100msセット) 33:timer0割り込み許可 34:timer1割り込み許可 35:GLOBAL全体割り込み許可 36:while(1){} } //// 以上宜しくお願いいたします。