Re: Reset 幾次後程式會被改掉
|
||||
---|---|---|---|---|
高級會員
![]() ![]() ![]() |
非常感謝Eigen的指點,我在ResetLCD()前加一行看LED狀態的程式,沒想到問題消失了,應該是如Eigen所言,LCD尚未Ready,加一行程式剛好等候LCD完成Reset,感謝各位先進提供的意見,真的學到不少知識。
TRISB=0xff; TRISD=0; TRISB=0; PORTB=0; PORTD=0x01; <--增加此行 ResetLCD(); OpenXLCD(FOUR_BIT & LINES_5X7);
發表於: 2009/10/7 12:01
|
|||
|
Re: Reset 幾次後程式會被改掉
|
||||
---|---|---|---|---|
資深會員
![]() ![]() ![]() |
EESequentialRead 讀不到資料會怎樣?
while(BusyXLCD()); lcd 一直 busy 會怎樣? 這些都會造成 無窮迴圈,造成看似當掉的情況 在這兩個 程序前加個led 就知道當在那了
發表於: 2009/10/6 22:29
|
|||
|
Re: Reset 幾次後程式會被改掉
|
||||
---|---|---|---|---|
資深會員
![]() ![]() ![]() |
我懷疑是硬體鎖死了!因為,如果是硬體鎖死了,除非移除電源,否則無法排除故障的狀態。
造成鎖死的原因,可能是MCLR腳瞬間接底、釋放、彈跳,造成感應大電流打進PIC,造成鎖死。 解決的方法為:在MCLR腳串接一電阻,限流即可。
發表於: 2009/10/6 18:48
|
|||
|
Re: Reset 幾次後程式會被改掉
|
||||
---|---|---|---|---|
高級會員
![]() ![]() ![]() |
補充一下:
1. 當機時,RESET 按久一點沒有效。 2. RESET 電路是由Vdd接1K電阻串聯0.47uf電容接地,按鍵開關與電容並聯,電阻與電容連接處接至MCLR。
發表於: 2009/10/6 18:18
|
|||
|
Re: Reset 幾次後程式會被改掉
|
||||
---|---|---|---|---|
高級會員
![]() ![]() ![]() |
1. 我將LCD接至PORTD,PORTD的每一個BIT都有接電阻加LED,所以可看到訊號傳遞的狀態,將LCD拔掉,LED的變化仍舊正常,但是RESET幾次仍會出問題,似乎與LCM無關。
2. 底下是我的主程式部份,主要是利用I2C介面從MCP9800取得溫度然後顯示在20*4 LCD上,不知道有沒有可改善之處。 #include <p18cxxx.h> #include <delays.h> #include "xlcd.h" #include "i2c.h" #pragma udata char Line1[18]="Temperature:"; char Line2[18]="----------------"; void locate(char RowNo, char ColNo); //Locate LCD cursor void cls(void); //Clear LCD screen void ResetLCD(void); //LCD software reset int ftoa (float x, char *str, char prec, char format); //Transfer float to string for LCD int abs(int data1, int data2); //Get positive data #pragma code void main(void) { int i,j; unsigned char temp[2]; int Temperature, TempCal1, TempCal2; float RealTemp; char resultString[20]; int StrLength; TRISB=0xff; TRISD=0; TRISB=0; PORTB=0; ResetLCD(); OpenXLCD(FOUR_BIT & LINES_5X7); cls(); locate(1,1); putsXLCD(Line1); WriteCmdXLCD(CURSOR_OFF&BLINK_OFF); // Display OFF/Blink OFF //*** Initialize I2C port SSPADD=0x19; OpenI2C(MASTER, SLEW_ON); EEByteWrite(0x90,0x01,0x60); //Write configuration register to set resolution at 12 bits while(1) { EESequentialRead( 0x90, 0, temp, 2 ); TempCal1=temp[0]; TempCal2=temp[1]; TempCal1=TempCal1<<4; Temperature=(TempCal2>>4)+TempCal1; RealTemp=(float)Temperature*0.0625; StrLength= ftoa(RealTemp, resultString, 2, 'f'); locate(2,1); while(BusyXLCD()); DelayPORXLCD(); putsXLCD(resultString); for(i=0;i<50;i++) DelayPORXLCD(); } }
發表於: 2009/10/6 18:08
|
|||
|
Re: Reset 幾次後程式會被改掉
|
||||
---|---|---|---|---|
資深會員
![]() ![]() ![]() |
我剛剛才注意到
你有寫到 I2C ,I2C 沒有 RESET ,卡死了 回去重寫
發表於: 2009/10/6 16:29
|
|||
|
Re: Reset 幾次後程式會被改掉
|
||||
---|---|---|---|---|
資深會員
![]() ![]() ![]() |
一、RESET 按久一點,看會不會正常
二、不要趨動 LCM ,直接用一個 LED 周期性 HIGH LOW HIGH LOW 檢查看看少了 LCM 之後會不會正常 一般 RESET 不良當機,透過 BORWN OUT 就能克服(平常開,因為會耗電) 我猜你的 RESET 上有 大電容 或 LCM 的程序有無窮迴圈的 BUG(我寫過,所以我知道) 另一種方式就是依序點亮 LED ,POWER ON 點亮A 滅 B 初始化完成後 滅 A亮 B ,然後讓 C閃爍,用類似這樣的手法, 看 LED 可以知道程式是否有 RESET ,是否有進入MAIN LOOP ,是否卡死在 其它LOOP 之中
發表於: 2009/10/6 16:28
|
|||
|
Re: Reset 幾次後程式會被改掉
|
||||
---|---|---|---|---|
高級會員
![]() ![]() ![]() |
1. 我的電源供應器的5V可以調到4.5V,當BOR設為4.5V時,在電壓降至4.5V時,CPU HALT,往上調到4.5XV時就RESET,看來動作相當正常。
2. 我在MCLR 原本就有加按鍵做 Reset ,一開始發現問題也是因為按了幾次RESET後就會當掉。 3. 所以整個狀況描述如下: <1>. MCU正常運轉-->按RESET鍵幾下-->MCU HALT-->按RESET鍵也無效-->拔掉5V接頭 (似乎不需要將Vdd與Vss短路)-->接回5V接頭 --> 正常 <2>. MCU正常運轉-->拔掉110V插頭-->經過幾秒插回110V插頭-->MCU HALT-->按RESET鍵也無效-->拔掉5V接頭 -->接回5V接頭 --> 正常 <3>. MCU正常運轉-->拔掉5V接頭 -->接回5V接頭-->MCU正常運轉
發表於: 2009/10/6 14:04
|
|||
|
Re: Reset 幾次後程式會被改掉
|
||||
---|---|---|---|---|
版主
![]() ![]() ![]() |
照這樣看起來我還是認為是BOR的問題,確定有設成 4.1V 嗎? 是否可用可調式電源供應器來測試一下。
此外 AC Power Supply 的供電斜率也慢了一點,要不要再MCLR 加個按鍵做 Reset 的測試,確定其問題所在。 如果每次 MCLR 按鍵都可以Reset PIC 的話那真的就是 BOR & POR 的問題。
發表於: 2009/10/6 13:18
|
|||
|