私は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秒以内に正確であることだけです。
非常にそうですね!私はコードを更新し、何が起こるか見る。 – Ozzah
ありがとうございます。ループしてwait(1000)を実行する 'wait_sec(int sec)'を書きました。何度も:) – Ozzah