3

HiTechANSICコンパイラとMPLABv8.43でPIC18F14K50を使用しています。遅延機能を除いて、私のPICコードはようやく稼働し、機能しています。これは私のアプリケーションにとって非常に重要です。特定のミリ秒、秒、または分数の間、特定の状態にある必要があります。

私はこれの解決策を約2週間探していましたが、これまでのところ成功していません。私はあきらめてasm("nop");、ループ内で独自の遅延関数を作成しましたが、これは非常に予測できない結果をもたらします。0.5秒または5秒待つように指示すると、十分に正確に機能します。しかし、10分間のように、もっと長く待つように指示するとすぐに、遅延は約10〜20秒しか続かず、2分以上は500ミリ秒の遅延よりも短い瞬きになります。

これが私の設定ヒューズとwait()機能です:

#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");
}

私が言ったように、私がそれwait(500)まで電話をかけるとwait(30000)、私が興味を持っている許容範囲内で0.5秒から30秒の遅延が発生します-しかし、私が電話をかけると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)ものとまだ試したことがないものがありますが、externをCコードに直接入れようとすると、リンク時に未定義のシンボルエラーが発生します。

短から中程度の遅延と長い遅延の間の不一致は意味がありません。私が持っている唯一の説明は、コンパイラがNOPか何かを最適化したということです。

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

ライブラリやマクロの外部関数、またはNOPを使用した手書き関数に満足しています。必要なのは、1分あたり数秒程度の精度であるということだけです。

4

3 に答える 3

3

int変数をに変更するとunsigned、最大 65535 ミリ秒に達する可能性があります。それ以上にするにはlong、パラメーターの型として を使用し、ループをさらに深くネストする必要があります。

于 2012-04-12T04:42:46.013 に答える
1

より良い長期的な解決策は、チップに組み込まれているハードウェア タイマーの 1 つを使用する遅延関数を作成することです。他の割り込みの発生や一部の CPU サイクルの使用などがある場合、NOP 遅延は長期間にわたって正確ではありません。

于 2012-04-12T21:26:14.593 に答える