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

このQ&Aのポイント
  • PIC 16F54でTMR0割り込みを使いたいが、どのように設定すれば良いかわからない。
  • 16F54にはINTCONレジスタやRETFIE命令が存在しないため、他のPICと異なる方法で割り込みを設定する必要がある。
  • 16F54は低コストであり、疑問を解決せずに他のPICを選ぶことに抵抗があるため、助けを求めている。
回答を見る
  • ベストアンサー

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に魅力を感じるし、何より疑問を解決しないまま、財力に任せて解決とすることに抵抗があります。 どなたかこんな私を助けてください。

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

  • ベストアンサー
  • pyonmae
  • ベストアンサー率64% (40/62)
回答No.2

こんにちは。 私は16F54を使った事はないのですが、もしかするとタイマ割り込みと言うか、割り込みそのものが実装されていない石なのではないでしょうか。 ・データシートをざざっと見てみると、まず「Interrupt」という言葉自体が一つもない。 ・メモリマップに、割り込みベクタが無い ・お気づきのように、RETFIE命令がない。 以上のことから、低コスト実現のために割り込みコントローラが削除されたのでは無いかと推察します。 マイクロコントローラに割り込みが付き物なのはまぁほぼ常識ですが、自分の常識を疑ってみるって事も、たまには必要みたいですね。

nari_assy
質問者

お礼

> 私は16F54を使った事はないのですが、もしかするとタイマ割り込みと言うか、割り込みそのものが実装されていない石なのではないでしょうか。 あっ!なるほど そう言うことですか? TMR0=割り込み と勘違いしていました。 となるとTMR0は単なるカウンターと言うことですね? ずいぶんと恥ずかしい質問をしていたようです。 でもこのまま引き下がるのは悔しいので、プログラムの途中でTMR0の値をチェックして設定値以上になったら割り込みさせたかった処理をさせるようなプログラムを組んでみようと思います。 ご指摘、ありがとうございました。

その他の回答 (1)

  • saru1234
  • ベストアンサー率37% (223/593)
回答No.1

> 何より疑問を解決しないまま、財力に任せて解決とすることに抵抗があります。 財力がありながらケチって他人からでも教えてもらおうという姿勢が 協力を仰ぐのにどうなのかなぁと思います。 金出せば済むことならそうすればいいだけのことです。 普通の人は100円を切るか切らないかの問題で財力が云々言いません。 時はカネなり。解決に時間を要すればそれはカネを使ってるのと同様です。 あなたは商用利用したいのではありませんか。 大量に使うならメーカーも放っておきませんから そっちにお尋ねになればよろしいです。

nari_assy
質問者

補足

> 財力がありながらケチって他人からでも教えてもらおうという姿勢が > 協力を仰ぐのにどうなのかなぁと思います。 ほんの冗談のつもりで書いた一言が、このように取られるとは、軽率でした。ジョークの勉強のほうが先でしたかね? いまさらどうでも良いかもしれませんが、数十円にこだわって、16F54 を何が何でも使いたいと言っているのではありません。 自分の調べた限りでは、全てのPICに INTCONレジスタと RETFIE命令があるのに、このPICだけ仕様が違うのに興味を引かれたことと、疑問を解決しないままにするのが気持ち悪いだけです。 それに、ワザワザ自分で一から勉強して工作をする以上、より安く作ったほうが達成感も得られると思うからです。金を出して解決するなら、はなから市販品を探せばすむことです。 > あなたは商用利用したいのではありませんか。 商用利用しようと思うレベルの人は、この程度の質問はしないのでは無いでしょうか? 自分程度の知識で作った製品を売ろうと思ったところで、ニーズがあるとも思えませんし。そもそも、1つ数十円の差額が生産コストに大きな影響を及ぼすには、それなりの数を捌かなくてはならないのでは無いでしょうか? それだけの数を生産するのはやはり個人のレベルでは無理でしょう。 > 大量に使うならメーカーも放っておきませんから > そっちにお尋ねになればよろしいです。 量の問題は別としてメーカーに聞けと言われてしまうのでは、そもそもこのサイトの存在そのものが不要なのでは? 確かにそちらの方が早いかも知れませんが、このようなサイトを使えば+αの知識・アイデアもいただけるかも知れませんし、他の人に何らかのヒントなどを与えることが出来るかも知れないじゃないですか。 そういうわけで、表題の件、宜しくお願いいたします。

関連するQ&A

  • PIC12F683 TMR2の割込がうまくいきませ

    タイトルのPICを使ってTMR2の割込動作を確認しているのですが、割込が全く掛かりません。 TMR2は単独で割込を掛けないで動作することは確認できましたがエラーもあるわけでもなく あれこれやっても解決せず迷走中です。また、割込ルーチンはこれまで動作が確認できたプログラムを埋め込んで使っているので問題はないと思っています。 何方かお助け頂けませんでしょうか。宜しくお願い致します。 ;******************************************* ; PIC初期設定 ;******************************************* START_INI BCF STATUS,RP0    ;BANK【0】 MOVLW 07h MOVWF CMCON0 ;GP0-2はデジタルIO BSF STATUS,RP0    ;BANK【1】 MOVLW B'0000000' MOVWF ANSEL ;A/D変換クロックF/2 デジタルI/O BCF OPTION_REG,7 ;GPIO端子をプルアップ MOVLW B'001000' ;RESET端子有効 MOVWF TRISIO ;GP0,1,2,4,5:OUT GPO3:IN MOVLW B'1000000' ;40h MOVWF OSCCON ;クロック=1MHz ;******************************************* ; TMR2の設定 ;******************************************* BCF STATUS,RP0    ;BANK【0】 MOVLW B'000101' ;ポス=1:1 TMR2=ON プリ=1:4 MOVWF T2CON ; BCF PIR1,TMR2IF    ;Timer2 割込み検出フラグをクリア BSF STATUS,RP0    ;BANK【1】 BSF PIE1,TMR2IE    ;Timer2 有効 MOVLW H'FA' ;250 MOVWF PR2    ;TRM2カウントSET ;******************************************* BCF STATUS,RP0     ;BANK【0】 CLRF TMR2 BSF INTCON,GIE     ;割り込み全体を有効

  • PIC16F84AのRBポート変化割り込みの使い方

    PIC16F84AのRBポート変化割り込みを使いたいのですが、三つ質問があります。 1.割り込み処理に入ったときに、「BCF INTCON,RBIF」としてもRBIFフラグが立ったままで、「RETFIE」で割り込みから戻った直後にすぐにまた割り込み処理に入ってしまいます。(MPLABのシミュレーション上でStimulusControlerでPINを変化させて実験)これの原因は何なのでしょうか?RBIFフラグはどのようにして解除したらよいのでしょうか? 2.RBポートは内部でプルアップせずに、外に抵抗をつけてプルアップしようと考えているのですが、その場合でも正しくシミュレーションできるのでしょうか? 3.RBポート変化割り込みは、LからHになった場合と、HからLになった場合の両方に反応するのでしょうか? 以上三つの質問に回答お願いします。

  • PICでタイマー割込み(mikroC Vr8.2)

    再三お世話になります。大概の問題もこちらで、 解決できて来ましたが、流石に今回はそうも行かないのではと 覚悟しております。 タイトルにありますPICと言えば、CCS社のコンパイラーが 王道と聞いておりますが、素人の浅はかで、 マイナーな方を選択した為、 お手上げ状態に陥っています。 質問の概要はサーボモータの制御信号生成が最終目的です。 まずその基本となる、前段部分として、一定巾周期のパルス毎に、 制御パルスを送り、希望通りの信号をLEDの点滅で確認出来るかと したものです。内容は(PIC16F887,8MHZ内部クロック使用、 1:8プリスケール、TIMER1とのコンペアマッチ割込みと、 TIMER0の割込みの2つのタイマー使用)TIMER1からは、 割り込み発生後、1秒毎にPORTB-1を点灯する信号を出し、 もう一方TIMER0から、0.5秒ごとにPORTB-1を消灯させる。 と言うものです。 後で気づきましたが、この時間設定では正確なものなら、 まず1秒後に点灯、次の1秒までの間に、もう一方で 0.5秒毎に消灯信号が出ているため、1秒後には お互い打ち消し合って本来ずっと消灯する 結果になるはずですが、実験では、0.1sec~0.5sec間隔の 点滅が、ある周期ごとに繰り返されます。 両方同時に割り込み処理が働き、命令サイクルのずれから、 点滅現象になるのではと推測します。 希望として、1秒の割込みの後に、 0.5秒の割込みが来るようにしたいのですが、 思うようになりません。 そこで、そのソースコードを記述しましたので 稀少mikroCをご使用の方に 検証とご教示が叶えられれば、最高に幸せです。 何卒宜しくお願いいたします。             記 unsigned count,count1 = 0; void interrupt() { //timer1 interrupt if(PIR1.CCP1IF == F) { PIR1.CCP1IF = 0; count++; if(count == 5) { PORTB.F1 = 1; count = 0; } } //timer0 interrupt if(INTCON.TMR0IF == 1) { INTCON.TMR0IF = 0; TMR0 = 216; count1++; if(count1 == 100) { PORTB.F1 = 0; count1 = 0; } } } void main() { ANSEL = 0; ANSELH = 0; TRISB = 0; PORTB = 0; PIE1.CCP1IE = 1; PIR1.CCP1IF = 0; CCP1CON = 0x0B; CCPR1L = 0x50; CCPR1H = 0xC3; T1CON = 0x31; OPTION_REG = 0x87; TMR0 = 216; INTCON = 0xA0; INTCON.PEIE = 1; INTCON.GIE = 1; while(1){} } 以上です。

  • PIC アセンブラ TMR0の使い方がいまいちわかりません。

    *文字数制限の為コメントや繰り返し処理プログラムの一部を省きました。解りにくくてすみません。ココに載せてくれとかあったらそっちに全部載せます。 目標としてはPICでデジタル時計を作りたいのですが、手始めに正確な1秒を作って7セグを0から9まで表示しそれを繰り返す。と言うものをやってみようと思いプログラムしましたがウンともスンとも言いません。 流れとしては 初期処理 ↓ TMR0割り込みが発生するまで無限ループ ↓ 割り込みが発生したら割り込み回数をカウントし(12,8MHzクロック、プリスケーラを256設定で1250回フラグをカウントすると1秒)1秒間分カウントが終わったら7セグの表示を切り替え無限ループに戻る どの数字まで表示したかは任意のレジスタに1を立てて判断する。PICはPIC16F628AなのでTMR1とかもあるんですが気分的にTMR0だけで時間を作ってみたかったのでTMR1とかは使ってません。で、3回くらいやり直してプログラムを作ったんですが全然動きません。 1、何処が悪いんでしょうか? 2、また、PIC16F628Aでは16番ピンがクロックの入力として使えますが その設定方法があってるかわかりません。 コンフィグ設定で OSCをHSにしてポートの設定でRA7を入力にしておけば良いんでしょうか?プログラム中の記述で合ってますでしょうか? 3,7セグをカウントアップするだけのプログラムなのに こんなに長くなる物なんですか? (プログラムが下手だから?アセンブラだから?) 4、1秒のカウント方法ですがプログラム中の記述で正確に1秒をカウントしてますか?(計算間違ってますでしょうか?) 以下、プログラムになります。 list p=pic16f628a include "p16f628a.inc" __CONFIG _LVP_OFF &_MCLRE_ON &_BODEN_OFF &_PWRTE_ON &_WDT_OFF &_HS_OSC time0 equ d'30' ;time4まで作る tcount equ d'43' count0 equ d'35' ;count7まで作る koko0 equ d'43' koko1 equ d'44' org 0 goto start org 4 goto wari start bcf intcon,gie movlw b'00000111' movwf cmcon bsf status,rp0 movlw b'00000111' movwf option_reg movlw b'10100000' movwf trisa clrf trisb bcf status,rp0 bcf status,z bcf intcon,t0if movlw b'00001000' movwf count0 ;この間に1から6の同じ処理が入ります。 movlw b'00000000' movwf count7 time movlw .30 movwf time0 bsf intcon,gie bsf intcon,t0ie clrf tmr0 roop btfsc tcount,0 call segout swapf count0,0 movwf portb swapf portb,0 movwf count0 ;この間に1から5が入ります swapf count6,0 movwf portb swapf portb,0 movwf count6 goto roop wari bcf intcon,t0ie bcf intcon,t0if incf time0,1 btfss status,z goto modori bcf status,z movlw .255 movwf time0 incf time1,1 bcf status,z goto modori bcf status,z movlw .255 movwf time0 movlw .255 movwf time1 incf time2,1 bcf status,z goto modori bcf status,z movlw .255 movwf time0 movlw .255 movwf time1 movlw .255 movwf time2 incf time3,1 bcf status,z goto modori bcf status,z movlw .255 movwf time0 movlw .255 movwf time1 movlw .255 movwf time2 movlw .255 movwf time3 incf time4,1 bcf status,z goto modori bcf status,z movlw .30 movwf time0 movlw b'00000001' movwf tcount modori bsf intcon,t0ie retfie segout clrf tcount btfss koko0,0 goto seg1 ;この中間にseg2からseg6が入ります。 btfss koko0,7 goto seg8 btfss koko1,0 goto seg9 nop goto seg0 seg1 bsfkoko0,0 movlw b'00000010' movwf count0 movlw b'00000100' movwf count1 movlw b'00000000' movwf count2 movlw b'00000000' movwf count3 movlw b'00000000' movwf count4 movlw b'00000000' movwf count5 movlw b'00000000' movwf count6 movlw b'00000000' movwf count7 nop return ;この中間にseg2からseg9が入ります seg0 clrf koko1 clf koko0 movlw b'00001000' movwf count0 movlw b'00000100' movwf count1 movlw b'00000010' movwf count2 movlw b'00000001' movwf count3 movlw b'10000000' movwf count4 movlw b'01000000' movwf count5 movlw b'00000000' movwf count6 movlw b'00000000' movwf count7 return end

  • PIC16F84と16F84Aの違い

    PICプログラムを勉強中の初歩者です。 ちょっと古い参考プログラムなどはPIC16F84を使ったものがあります、 所が現在市販のPICは16F84Aとなりますが完全な互換性があるのでしょうか。PIC16F873なども"A"が付いてます。プログラムを変更せずにそのままアッセンブルして書き込んで問題が起きないのでしょうか。 アッセンブルはMicrocip社のMPLAB IDE を使いAKIプログラムライターVer 4を使用してます。ご指導よろしくお願いします。

  • PIC16F18857 Timer0割り込みせず

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

  • MPLABでPIC16F887のCONFIGについて

    助けてください!! MPLAB IDE V8.00でデバイスをPIC16F887に設定し、アセンブルすると 毎回「CONFIG」でエラーが出て先に進みません。 メッセージは⇒Error[126] E:\PIC\PROGRAME\***********\***********.ASM 3 : Argument out of range (not a valid config register address) っと出ます。 実際の「CONFIG」の設定は⇒__CONFIG _HS_OSC & _PWRTE_OFF & _MCLRE_OFF っとしております。 CONFIGを外すと問題なく成功します。 何故なのか教えて下さい。 ちなみに、MPLABの設定等は特にいじっておりません。 宜しくお願い致します。

  • 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 16F883について

    PIC16F883のコンパレータを不使用にしたいのですが下記のようなプログラムでビルド時に CMCONの行でエラーが出ます エディタはMIKROBASICです 対処方法をよろしくお願いします エラー内容 227 303 Identifier "CMCON" was not declared Datawave_16F883.mbas プログラム Main: 'メインプログラム ************************************** TRISA=%00000011 TRISC=0 CMCON=%00000111 'コンパレータ不使用 OPTION_REG=%00000111 'PS0,1,2,の設定(256分周) INTCON=%10100000 'TMR0の割り込みを使用 UART1_Init(9600) 'UARTイニシャル9600/8/N/1 I2C1_Init(100000) 'I2Cイニシャル MS=0 End.

  • PIC12F675 GPIO入出力について

     現在、PIC12F675にてA/D変換、EEP- W/R,TMR0を使ったプログラムを作成しているのですが、GPIOの入出力がおかしくTMR0、GP0~2が正常に動作しません。   ●各PINの使用状況・・・ ・GP0/出力(H/L) ・GP1/出力(H/L) ・GP2/TMR0 ・GP3/入力(S/W) ・GP4/入力(A/D変換) ・GP5/出力(H/L) ●開発環境   ・MPLAB IDE V8.40   ・デイバイス PIC KIT1 MPLAB IDEのファイルレジスタとウォッチのウインドウでデバッグしていて気づいたのですが、SFRアドレス00H~05Hまでの変化がそのままGPポートの変化へとつながっており、GP0がRestricted Memoryicted Memoryが表示され、SIMでRUNさせてみるとプログラムでは「BSF」でGP0を出力してもGPIOの0ビット目は変化しません。 GP2も変化がなくTMR0も動作していない様です。  もちろんBANK1でTRISIOの設定(B'00011000')は行っています。 自己解決を試みましたが万策尽きて投稿させていただきました。 恐れ入りますが何方かご教授いただけましですでしょうか。