HI-TECH CでPIC12 MCU用のマルチスレッドプログラムを作成することは可能ですか?

私の友人はPIC12 MCUのための小さなプログラムを書くのを助けるように私に頼んでいます。私たちは欲しい

  1. 入力電圧が2秒間で1.9V未満になると、プログラムは停止します。
  2. 入力電圧が2.5Vを超えるとすぐに反応します。

私はシステムのタイムスタンプを読んで比較することで第1の問題を解決しようとします:

#include 
... ...
time_t beg, end;
beg = 0;
end = 0;
while(1){
    if(INP_VOL < 1.9){
        if(beg == 0){
            /* Read timestamp when voltage < 1.9 */
            gmtime(&beg);
        }
        /* Campare timestamp */
        gmtime(&end);
        if(end - beg > 2){
            break; /* !!stop running!! */
        }
    }
    else{
        /* if voltage back to normal, reset beg timestamp. */
        beg = 0;
    }
}

私はPIC12ユーザーマニュアルで関数 gmtime(time_t *)を見つけましたが、それが良い解決策かどうかはわかりません。

しかし、私は第2の問題を解決する方法を理解することはできません。これは、プログラムの実行中に入力電圧をモニタする独立したスレッドのようなものでなければなりません。そして、プログラムは、回路が破損する前にすぐに(他の関数を呼び出すことによって)反応する必要があります。

私はコンピュータプログラマーですが、私はMCUのためにコーディングしたことはありません。 HI-TECH Cでこのようなことが可能かどうか知りたいですか?

2
私が見つけた時間は、タイマ割り込みのカウンタで最もよく測定されます。しきい値に達すると、メインループで処理できるフラグを設定します。
追加された 著者 kenny,

3 答え

典型的なことは、 割り込み 、特にタイマー割り込みを使用することです。

たとえば、実行するために割り込みを設定します。その割り込みコードでは、プログラムがすばやく反応する必要があるものを何でも実行します。これにより、通常の実行フローだけが残され、2つのタスクが並行して実行されることがエミュレートされます。

3
追加された
私はこれが私が試すことができる唯一の解決策だと思います。心配してくれてありがとう、私はCで割り込みHanldingの章を読むでしょう。
追加された 著者 Allopopo,

外部割り込みピンに回路を接続すると、電圧が2.5を超えると1になります。外部割り込みは、入力が0から1になるたびにキックするようにプログラムすることができます。

1
追加された
ほとんどのPICには、ある電圧スレッショルドで割り込みを提供できるコンパレータ入力があります。
追加された 著者 kenny,
私は彼が自分のサーキットをどのように設計しているのか分かりません。とにかくありがとうございました ;)
追加された 著者 Allopopo,

私はC言語がPIC12ファミリのための最良のソリューションだとは思わない。

私の提案はASMを使うことです。いくつかの指示で非常に簡単です。

After set the ADC you can use substraction instruction and check the C (carry) In this manner you can verify IF > or IF < Test C and skip if zero. Skip the next instruction, the one with the call.

マイクロコードを変更してPIC18を使用して、Cコードのパフォーマンスを向上させることもできます。

0
追加された
それが適合すれば、Cは上手くIMOです。必要な場合にのみ、サイズ/速度を最適化します。
追加された 著者 kenny,
Cは常に優れたソリューションです。移植が容易で、読みやすく、プラットフォーム間で理解でき、現代のコンパイラはほぼ同じ効率を発揮します。
追加された 著者 Adam Casey,
あなたの答えはエマヌエーレありがとう、本当にそれを感謝します。しかし残念ながら私はアセンブリ言語を知らない;)
追加された 著者 Allopopo,