2011-06-25 11 views
2

BoostCコンパイラでCを使用しています。私のコードがどれほど正確であるか心配です。以下の設定は、1Hzより多かれ少なかれ刻々と変化します(LEDで肉眼検査)。 (これは、16f74のTimer1のために外部時計の水晶を32kHzで使用します)。16FでのPIC割り込みによるリアルタイムクロックとしてのTimer1の精度*

は私が

は私のコードは、以下のいずれかの調整を必要としてい...誰かが私を伝えることができます願っていますか?最も近いCPUクロック周期の精度を測定する最も簡単な方法は何でしょうか? 1Hz信号の確度を確実に保証するためにアセンブリを汚してもいいですか?

私はです。タイマハンドラ(と他のもの)を実行するのにかかる時間は、タイマーが常にカウントしているので、ピクチャに入っていないこともあります。ハンドラが1/32kHz秒より長く実行することがない限り、1Hz信号は本質的に32kHzクリスタルの精度を持ちますか?

おかげ

#define T1H_DEFAULT 0x80 
#define T1L_DEFAULT 0 
volatile char T1H = T1H_DEFAULT; 
volatile char T1L = T1L_DEFAULT; 

void main(void){ 

    // setup 
    tmr1h = T1H; 
    tmr1l = T1L; 
    t1con = 0b00001111; // — — T1CKPS1 T1CKPS0 T1OSCEN NOT_T1SYNC TMR1CS TMR1ON 
    // ... 

    // do nothing repeatedly while no interrupt 
    while(1){} 
} 

interrupt(void) { 

    // Handle Timer1 
    if (test_bit(pir1, TMR1IF) & test_bit(pie1, TMR1IE)){ 

      // reset timer's 2x8 bit value 
      tmr1h = T1H; 
      tmr1l = T1L; 

      // do things triggered by this time tick 

      //reset T1 interrupt flag 
      clear_bit(pir1, TMR1IF); 

    } else 

    ... handle other interrupts 

} 
+0

私たちはhttp://electronics.stackexchange.com/ – DipSwitch

答えて

2

私はいくつかの改善を見ることができます...割り込み内部

あなたのタイマー開始は正確ではありません。 あなたは、あなたが正確さのために良くないものを現在の値を上書きします...割り込み...

tmr1h = T1H; 
    tmr1l = T1L; 

にタイマカウンタを設定します。 は...ちょうど使用:

tmr1h = T1H; //tmr1h must be still 0! 

あるいは、より良い、ちょうどTMR1Hレジスタの第7ビットをセットします。 コンパイラは、TMR1レジスタにデータを失わないように... ...のような単一のasm命令に

bsf tmr1h, 7 

をこの順番をコンパイルする必要があります。これが複数の命令で行われる場合、ハードウェアは、読み取り - 変更 - 書き込みの実行の間にカウンタ値をインクリメントすることができるからです。

+0

ありがとう、私はあなたが言っているのを見るが、タイマーは32kHzで増分されているので、4Mhzのクロックではそれは私を周りに与えないだろうタイマー値に書き込む前にISRの125サイクルが汚れていますか? – Jodes

+1

メインCPUの周波数を教えてくれませんでした。 CPUクロックが4MHzの場合、割り込みサイクルは1MHzなので、これは30クロックに過ぎず、割り込みのレイテンシは30クロックを超えることがあります。 –

+0

ありがとう、申し訳ありませんが、現在、これはエレクトロニクス分野に向っていますが、割り込みレイテンシをどのように拡張できるのでしょうか?それは単なるISRコードの実行ですか?または、何らかの追加のハードウェア遅延がありますか? – Jodes

関連する問題