2017-04-23 6 views
0

私はブレッドボードに簡単なPIC16F18877回路をセットアップしており、無限のwhileループ内でLEDを点滅させることに成功しました。私は同じコードをforのループ内に入れようとしましたが、ループは5回だけ実行する必要がありますが、LEDは点滅し続けます。マイクロコントローラプログラミング - ループのために終了しないプログラム

マイコード(XC8コンパイラとMPLAB):あなたはCPUがmainからの復帰にジャンプすることを期待します

#include <xc.h> 

#define _XTAL_FREQ 8000000 

int main() 
{ 
    TRISD1 = 0; 

    for (int i = 0; i < 5; i++) 
    { 
     RD1 = 1; 
     __delay_ms(500); 
     RD1 = 0; 
     __delay_ms(500); 
    } 

    return 0; 
} 

答えて

5

?それとも、何をすべきかを教えていないときに何をすると思いますか?デスクトップコンピュータでは、プログラムは通常OSに戻ります。組み込みシステムでは、プログラムはありません。

おそらくmainからの戻り値は、スタートアップコードに戻り、最終的にはプログラムを最初から起動してリセットベクタに戻ります(意図的にまたは意図的に)。

MCUを実際に「停止」させたい場合は、何もしないでください。returnではなく無限ループに強制する必要があります。しかし、これはMCUの一般的なアプローチではありません。

+1

ないだろう、確かに:「実行(メインの最後に到達した後)、コンパイラによって追加されたコードは、バックへジャンプリセットベクトル。デバイスは、ランタイムスタートアップコードとmain()関数を再度実行します。 " - 出典:http://ww1.microchip.com/downloads/en/DeviceDoc/50002173A.pdf。 – Unimportant

+0

@最近では本当に何が本当に確実なのですか? – tofro

+0

彼らはいつものように死と税金を持っています。 – Unimportant

0

あなたはここにオペレーティングシステムを使用していませんが、mainへの呼び出しとその戻り値を表示するために逆アセンブリを表示できますか?または、メインエンドの前に無限ループを置くと((1)continueの間に)5回点滅しますか?

1

forループの後にwhileループを追加しようとしましたが、何か異常が発生しました。 forループとwhileループを同時に実行しているようです。光は通常のリンクを点滅して、本当に速い点滅、ほとんどスタッターなどの、その後正常に点滅し、など。それは、ウォッチドッグタイマをチェック

を点滅を停止することはありません。設定されている場合、mcuは設定された量のクロックサイクル後にリセットされ、コードを何度も実行します。 CLRWDT()を使用してウォッチドッグ・タイマをリセットするか、WDTをオフにするだけです。 私は非常に予想通りMCUがないことを確認するためにこれらのステップを経ることをお勧め:

  1. は、PICの構成ビットをチェックし、彼らが適切に設定されていますか?マイクロチップのプログラムフォルダ/ docs/chipsにあるドキュメントを参照してください。
  2. オシレータが正しく設定されていることを確認してください。
  3. データシートを読み、ポートが正しく設定されていること、特にアナログ選択レジスタを使用しているアナログポートが正しく設定されていることを確認してください。

(私の評判はそのことについて申し訳ありませんが、コメントすることは十分に高くない。)

関連する問題