[Homepage][BBS][Blog][YouTube][asablo]

エアーバリアブルBBS
新エアーバリアブルBBS
初めにお読み下さい Please read first ホームページ ブログ YouTube 過去ログ倉庫
16F877A timer1による10ms @12.8MHzのサンプル
タイマー1を使用した10msを正確にカウントするタイマーです。
※2011/11/15 カウンター値を修正しました。目的のカウント値はマイナス1したカウンター値を使用します。MPSIMで計測すると、マイナス1しないカウンター値で合っている様に見えますが、それはバグですので注意します。


#define KHz 000
#define _XTAL_FREQ 12800KHz
unsigned int True_Timer_10ms =0 ; //10millisecond counter ***1.40



void interrupt handler( void ){
if (CCP1IF == 1){
++ True_Timer_10ms;
CCP1IF =0;
}

return;
}




void main(void){

//Timer1 settings
TMR1CS = 0; //Use internal 1/4 clock (3.2MHz 312.5ns)
T1CKPS0 = 1;
T1CKPS1 = 1; //Divide per 8 (400KHz 2.5us)
T1SYNC = 0; //Synchronize
TMR1ON = 1; //Start TIMER1
TMR1L = 0; //TIMRT1 clear
TMR1H = 0; //TIMRT1 clear


//1ms 400counts(0x018f) 2011/11/15修正
//10ms 4000 counts (0x0f9f) 2011/11/15修正
CCP1CON = 0B00001011; //Compare clear if equal
CCPR1L = 0x9f; // マイナス1したカウンター値を使用する。MPSIMでの計測にバグがあるので注意。
CCPR1H = 0x0F; // 10ms setting
CCPR2L = 0xff; // not used
CCPR2H = 0xff; // not used

CCP1IF = 0;
CCP1IE = 1;

PEIE = 1; //Use Peripheral interrupt
GIE = 1; //Use General interrupt

while(1){
True_Timer_10ms;//これをカウントして利用できます。グローバル変数

}
}
  • air_variable
  • URL
  • 2011/09/28 (Wed) 11:36:13
Re: 16F877A timer1による10ms @12.8MHzのサンプル
ご無沙汰してます。何とか元気でやっています。
CCPR1に設定する値は4000-1では無かったでしょうか
  • natu
  • 2011/10/01 (Sat) 18:19:10
Re: 16F877A timer1による10ms @12.8MHzのサンプル
natuさん、ご無沙汰しております。お元気で何よりです。

所でCCPR1の所のデータ設定について、
コンペア割り込みはキャリーオーバーするものでないので、そのまま使って良いと思っていました。
MPSIMでもこの結果です。MPSIMのバグでないことを祈ります・・・

現物が手元に無いので、今は机上での確認ですが、時間が取れたら調べてみます。

PIC16F877
http://ww1.microchip.com/downloads/jp/DeviceDoc/30292A_JP.pdf
Mid-Range MCU Family Reference Manual
http://ww1.microchip.com/downloads/en/DeviceDoc/33023a.pdf
  • air_variable
  • URL
  • MAIL
  • 2011/10/02 (Sun) 01:34:33
Re: 16F877A timer1による10ms @12.8MHzのサンプル
お世話になっております。CCPR1の設定値はそのままのカウンタ値で構わないと思います。少なくともPIC16F648Aでは-1する必要はないと思います。周波数カウンタでの実測、実験済みです。
本件、ブログでまとめ中です。
  • embeddedark
  • URL
  • MAIL
  • 2011/10/03 (Mon) 20:02:44
Re: 16F877A timer1による10ms @12.8MHzのサンプル
embeddedarkさん、こちらでは初めまして。
設定が正常だったことで安心しました。

タイマー関係で分かり易いサイトも発見したのでご紹介しておきます。
http://www.piclist.com/images/www/hobby_elec/pic7_4.htm
  • air_variable
  • URL
  • 2011/10/04 (Tue) 14:44:21
Re: 16F877A timer1による10ms @12.8MHzのサンプル
こんにちは、

デバッグする機会が有ったのでPICKIT3で実機デバッグしてみました。PIC16F886です。
CCPR1に4をセットした時、RUN-BREAKを繰り返しているとTMR1の値が4の場合がありました。
これは、0~4をカウントしている事にならないでしょうか?
同期カウンタを同期リセットするには、やはり-1が必要だと思いますが如何でしょう?
  • natu
  • 2011/10/04 (Tue) 16:50:38
Re: 16F877A timer1による10ms @12.8MHzのサンプル
natuさん、

CCPフラグが立った時点で内部のTMR1が次のステートでクリアされるので、
周波数的には計算どおりの数字でOKでした

実際のPICで計測しましたが、誤差は確認できず、マイナス1でセットした場合は
期待したタイマー動作になりませんでした。
TMR1の値を利用しているわけではありませんので、
マイナス1をしなくとも良いと思います。
また何か分かりましたら追記したいと思います。
  • air_variable
  • URL
  • 2011/10/04 (Tue) 19:27:10
Re: 16F877A timer1による10ms @12.8MHzのサンプル
エアバリさん

実際のPICがそうだとすれば、私の記憶違いが濃厚かな?
老いには勝てないですね。
それでも、なぜそうなるのか自分では理解できないでいます。
時間が出来たら、ちょこっとハード作って確かめてみます。
お付き合いいただき、ありがとうございます。>embeddedarkさん、air_variableさん
  • natu
  • 2011/10/04 (Tue) 21:33:44
Re: 16F877A timer1による10ms @12.8MHzのサンプル
natuさん、

私も、よくnatuさんのホームページを拝見して参考にさせて頂いております。

色々調べるきっかけは大変有意義に発展しますので、
これからも宜しくお願いします。
  • air_variable
  • URL
  • 2011/10/05 (Wed) 09:37:49
Re: 16F877A timer1による10ms @12.8MHzのサンプル
こんにちは、
ハード作って試してみました。16F886です。
内蔵8MHz、タイマー1 1/8(250KHzカウント)、CCP1CON=0x0b、CCP1割込み内でポートを反転させてオシロで周波数表示させました。
割込みごとにH,L反転なのでコンペア周波数の1/2が出力されます。
CCPR1=5:20.89KHz
CCPR1=4:25.06KHz
他の品種では試していませんがCCPR1の設定値は、-1で良いと思います。
  • natu
  • 2011/10/08 (Sat) 10:50:30
Re: 16F877A timer1による10ms @12.8MHzのサンプル
natuさん、いつもどうもです。

色々調べて頂いていて、こちらも真相を知るべく、今日は時間が出来たので完全に検証してみました。

結論から申し上げますと、natuさんが最初から言われている事が正しいです。

実機で確認したと前発言で書きましたが、16F627があったので内蔵クロックで動作させ、大体の検証で済ませてしまい、更にMPSIMを過信し過ぎた所での思い込みも手伝って、真実を知るのに時間がかかりました。

検証方法は、高精度の12.8MHZを使い、RC0出力を100msと10msで動作させて検証しました。
結果は
1ms 400counts(0x0190)→ 0x018f
10ms 4000 counts (0x0fa0)→ 0x0f9f
で目的の周波数を出力する事を確認しました。もし、これをマイナス1しなければ遅くなります。
更に、手持ちのデバイスで16F877、16F877A(Rev0x8)の2つも動作確認して、
デバイスによる変化が無い事も確認できました。

0をカウントするということで、マイナス1という事で考えれば良いわけですね。
但し、MPSIMは間違えた情報を出すのでMPSIMだけでデバッグするには注意が必要と思います。


natuさんには、何日も不安にさせるような事になってしまい、大変失礼しました。
今回は色々勉強になりました。これからも宜しくお願いいたします。

この件はブログでも近日紹介させて頂きます。

追記:ブログ上でも記事を書きました。
http://airvariable.asablo.jp/blog/2011/10/08/6141422

  • air_variable
  • URL
  • 2011/10/08 (Sat) 13:32:26

返信フォーム






プレビュー (投稿前に内容を確認)