2017-04-21 193 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) 
    { 

    } 
} 

第二個問題:什麼是我可以用適當的延遲功能?以及如何測量延遲時間?

+0

您的代碼將只有一次閃光,以修復移動'PORTC'和延遲線進入循環 –

回答

1

您只有代碼才能生成一個閃存。將閃光燈和延遲移動到迴路中:

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

通過計時大致可以通過計時手動進行測量N使用秒錶閃爍。如果有的話,使用測量儀器(示波器對此很好)當然更容易。

此外,由於你的佔空比爲50%,則可以簡化代碼:

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

這使用按位取反(〜)反轉的PORTC位,這將使他們切換從一到零反之亦然。在循環之前將整個端口設置爲0,確保所有引腳處於已知狀態。

+0

的身體我知道這個代碼生成一個閃光燈,但在模擬的代碼生成Flash –

+0

無限次@GehadMohamed好的,這聽起來很奇怪。當模擬器檢測到無限循環時,可能會重置模擬機器,導致程序重新啓動並生成另一個閃存,等等。當然,我現在只是在猜測。 – unwind

+0

任何使用'PORTC^= 0xFF'的原因,而不是'PORTC =〜PORTC',它對我來說似乎不那麼直觀。寫入'LATx'寄存器而不是'PORTx'寄存器是個好主意。 –

2

是在模擬禁用看門狗?如果啓用它會導致程序的重複。

嘗試加入這一行包括之後。

#pragma config WDT = OFF 
+0

我做到了,但問題仍然存在 –