2012-04-12 11 views
2

私はHiTech ANSI CコンパイラとMPLAB v8.43でPIC18F14K50を使用しています。遅延機能を除いて、私のPICコードが最終的に稼働して動作しています。これはアプリケーションにとって非常に重要です。ミリ秒、秒、または分単位で特定の状態にする必要があります。遅延PIC18F

私はこの解決策を約2週間見つけようとしてきましたが、これまでのところ成功していません。私はあきらめてループ内にasm("nop");という独自の遅延関数を書きましたが、これは予測できない結果をもたらします。私が半分または5秒待つように言うならば、それは十分に正確に動作します。しかし、私がそれをもっと長く待つように言うとすぐに、10分のように、遅延は約10〜20秒だけ持続し、2分後は500msの遅延よりも短い点滅になります。私が言ったように私はwait(30000)までwait(500)を呼び出す場合、私は、私が興味tolerence内に30秒の遅延に半秒でしょう、

#include <htc.h> 

__CONFIG(1, FOSC_IRC & FCMEN_OFF & IESO_OFF & XINST_OFF); 
__CONFIG(2, PWRTEN_OFF & BOREN_OFF & WDTEN_OFF); 
__CONFIG(3, MCLRE_OFF); 
__CONFIG(4, STVREN_ON & LVP_OFF & DEBUG_OFF); 
__CONFIG(5, 0xFFFF); 
__CONFIG(6, 0xFFFF); 
__CONFIG(7, 0xFFFF); 

void wait(int ms) 
{ 
    for (int i = 0; i < ms; i++) 
    for (int j = 0; j < 12; j++) 
     asm("nop"); 
} 

:ここ

は私のconfigヒューズとwait()関数でありますしかし、私がwait(600000)に電話すると、予想通り10分遅れることはありませんが、約10-15秒です。wait(120000)は2分遅れではなく、すばやく点滅します。

理想的には、内蔵の__delay_ms()機能を動作させ、私のwait()の中から呼び出すことができますが、これで何の成功もしていません。もし私が#include <delay.h>にしようとすると、私のMPLABはそのようなファイルやディレクトリがないと言う。 HiTechサンプルのdelay.hを見ると、DelayUs(unsigned char)が定義されていて、試したことがないextern void DelayMs(unsigned char)がありますが、Cコードにexternを直接挿入しようとすると、リンク時に定義されていないシンボルエラーが発生します。

短い遅延から長い遅延の間の不一致は意味をなさない。私が持っている唯一の説明は、コンパイラがNOPなどを最適化していることです。

私が言ったように、それは上記構成のヒューズを備えたPIC18F14K50です。私はPICの経験が豊富ですが、この設定では4MHzで動作していると仮定しています。

ライブラリやマクロの外部関数、またはNOPの手書き関数があればうれしいです。私が必要とするのは、分単位で2〜3秒以内に正確であることだけです。

答えて

4

PICは16ビットマイクロコントローラですか?私の推測では、2^15(32,767は符号付き16ビットintの最大値)の後にオーバーフローするwaitの値がオーバーフローしているということです。

+0

非常にそうですね!私はコードを更新し、何が起こるか見る。 – Ozzah

+0

ありがとうございます。ループしてwait(1000)を実行する 'wait_sec(int sec)'を書きました。何度も:) – Ozzah

3

int変数をunsignedに変更すると、最大65535msになる可能性があります。それより高い値にするには、パラメータタイプとしてlongを使用し、ループをさらに深く入れ子にする必要があります。

1

チップに内蔵されているハードウェアタイマーのうちの1つを使用する遅延機能を作成する方が、より長期的な解決策が得られるはずです。あなたのNOP遅延は、他の割り込みが発射されたり、いくつかのCPUサイクルを使用しているようなものがあれば、長期間にわたって正確ではありません。