- ベストアンサー
PICマイコンのSFRのタイマーカウンタの値は変数に代入可能?
現在、PICマイコンの12F683を使用してプログラミングしてます。 G2ピンにマンチェスターコードの信号を入力して、立ち上がり、立下りごとに割り込みをかけて、その間の時間をタイマカウンタの値で見るプログラムを組んでいるのですが、割り込みがかかった際に temp_tmr1 = TMR1; としてTMR1のカウンタの値を代入させることはできるのでしょうか? これをやるとTMR1は”Undefined identifier”だとコンパイラに言われてしまいます。コンパイラはCCSを使用しています。 ご存知の方いらっしゃいましたらご教授願います。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
PIC12F683では SFRのH'0EにTMR1Lが, H'0FにTMR1Hがアサインされています.共にリード可能ですので値の取得は可能です. undefined identifierについてはただの未定義エラーではありませんか?CCSで利用しているレジスタ定義ファイルを確認してください. おそらく16bitのカウンタを8bitのHigh/Lowに区別しているのでTMR1では一致するものが無いと思います. ただ両方の値を取得したい場合は2度のリードとなりますので, 割り込み発生後, 読み取る前にTMRの停止/読み取った後に再開を入れておかないと, カウンタがオーバーフローする際に再現性の低いバグを仕込む事になるでしょう. 希望される機能は, 一般的にはタイマからスクラッチで作らずに, Captureのモジュール機能を利用して実装する内容だと思います. この方法であれば値の取得中にタイマを止める必要がありません.
その他の回答 (1)
- yuki360679
- ベストアンサー率10% (152/1427)
もちろん逐次カウント値を読み出す事はできます。 ただTMR1は、TIMER1のカウントレジスタをさしていると思いますが、 CCSでは、アドレスを定義しないとレジスター名では参照できません。 ”Undefined identifier”なのは、そのためです。 #byte TMR1=0x00 [アドレスはCPUにより異なる] というように定義します。
お礼
回答いただきありがとうございました。 そうですね。プログラムの最初にSFRにアクセスするには #byte TMR1L=0x0E #byte TMR1H=0x0F としなければなりませんでしたね。 ピン変化割り込みが入ったら、割り込み関数に飛んだときに、 16バイトで宣言した。 long TIMRCNT1=0x0000; これを使い、 TIMRCNT1 = TMR1H; TIMRCNT1 = TIMRCNT1 << 8; TIMRCNT1 = (TIMRCNT1 + TMR1L); このような形でTMR1のカウンタ値を取ってこようと思っています。
お礼
回答いただきありがとうございました。 そうですね。プログラムの最初にSFRにアクセスするには #byte TMR1L=0x0E #byte TMR1H=0x0F としなければなりませんでしたね。 ピン変化割り込みが入ったら、割り込み関数に飛んだときに、 16バイトで宣言した。 long TIMRCNT1=0x0000; これを使い、 TIMRCNT1 = TMR1H; TIMRCNT1 = TIMRCNT1 << 8; TIMRCNT1 = (TIMRCNT1 + TMR1L); このような形でTMR1のカウンタ値を取ってこようと思っています。