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分あたり数秒程度の精度であるということだけです。