2017-04-21 28 views
0

私には2つの質問があります。MPLAB無限ループ

最初の:私はこのコードの動作に問題があります。私がProteusで実行すると、プログラムはフラッシャーを「メイン関数のコードを繰り返す」 何をすればよいですか?

これはコードです:

#include <p18f452.h> 
#include <delays.h> 
#include <io.h> 

void main() 
{ 
    TRISC=0x00; 
    PORTC=0xff; 
    Delay1KTCYx(900); 
    PORTC=0x00; 
    Delay1KTCYx(900); 
    while(1) 
    { 

    } 
} 

2番目の質問:私は使用することができ、適切な遅延機能は何ですか?どのように遅延時間を測定できますか?

+0

あなたのコードは一度だけ点滅し、それを修正するためにループ –

答えて

1

フラッシュを生成するコードは1つのみです。フラッシュとディレイをループ内に移動します。

for(;;) 
{ 
    PORTC = 0xff; 
    Delay1KTCYx(900); 
    PORTC = 0x00; 
    Delay1KTCYx(900); 
} 

ストップウォッチでN回点滅させることで手動で測定することができます。もちろん、計測器(オシロスコープはこれには最適です)を使用する方が簡単です。お使いのデューティサイクルが50%であることから、あなたはコードを単純化することができます。また

、:

PORTC = 0; 
for (;;) 
{ 
    PORTC = ~PORTC; 
    Delay1KTCYx(900); 
} 

これは彼らが1から0に切り替えるようになりますこれは、PORTCのビットを反転させるビット単位のない(〜)を使用していますおよびその逆。ループの前にポート全体を0に設定すると、すべてのピンが既知の状態になっていることが確認されます。

+0

の体内に 'PORTC'と遅延ラインを移動し、私はこのコードを知っている一つのフラッシュを生成するが、シミュレーションでコードがフラッシュの無限の時間を生成 –

+0

@GehadMohamedさて、それは奇妙に聞こえる。おそらく、シミュレータは無限ループを検出したときにシミュレートされたマシンをリセットし、プログラムを再起動して別のフラッシュを生成させるなどです。私は今、ただ推測しているだけです。 – unwind

+0

'PORTC =〜PORTC'ではなく、' PORTC^= 0xFF'を使う理由は、私にとっては直感的ではないようです。 'PORTx'レジスタではなく' LATx'レジスタに書き込むことをお勧めします。 –

2

シミュレーションでウォッチドッグを無効にしていますか?有効になっている場合は、プログラムの繰り返しが発生します。

この行をインクルードの後に​​追加してください。

#pragma config WDT = OFF 
+0

私はそれをしましたが、問題はまだ存在します –