會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





#include <18F45k22.h>一直會自動重開
新會員
註冊日期:
2012/07/19 02:31
所屬群組:
註冊會員
文章: 18
等級: 2; EXP: 97
HP : 0 / 49
MP : 6 / 904
離線
為甚麼程式自己跑一段時間 就會跳到main 顯示"Start trying. Ha ! ha ! " 不知道是哪裡錯了,會是wdt的問題嗎? ,因為把wdt關掉好像就不會跳, 因為要用wdt防止當機不知道要如何解決,之前在其他程式也有用wdt,這樣的擺法/用法就沒有遇到為自動跳到main從新開機的情況 ?

#include <18F45k22.h>
#fuses HSH WDT MCLR NOLVP NOBROWNOUT //NOMCLR INTRC_IO
#use delay(clock=20MHz,crystal=20MHz)

//#use rs232(baud=9600, parity=N,stop=1,xmit=PIN_C6,rcv=PIN_C7,bits=8,errors,STREAM=STREAM_UART)
#use rs232(baud=9600, parity=N,stop=1,xmit=PIN_D6,rcv=PIN_D7,bits=8, errors,STREAM=STREAM_UART)
#include <string.h>


int8 serial_in[32];
int8 serial_len = 0;
int8 serial_ending = 0;
int16 wait_ending = 0;


#int_rda2
void rda_isr(void) {
char c;
c = fgetc(STREAM_UART); /* 取得一個輸入的字元 */
if(serial_len < 30 && c >= ' '&& serial_ending == 0)
{
serial_in[serial_len++] = c;
}
if(c < ' ' || c == '$')
{
serial_in[serial_len++] = 0;
serial_ending = 1;

}
}

void main(void)
{
char c;
int i,n;

enable_interrupts(INT_RDA2);
enable_interrupts(GLOBAL);
serial_ending = 0;
fprintf(STREAM_UART, "Start trying. Ha ! ha ! ");
delay_ms(3);
setup_wdt(WDT_ON|WDT_8S);
while(TRUE)
{
restart_wdt();
fprintf(STREAM_UART, "I\n");
delay_ms(3000);
// c = fgetc(STREAM_UART);
if( serial_ending == 1) /* 出現結束字元時, 等待傳送完全停止 */
{

fprintf(STREAM_UART, "I see => %s \n", serial_in);
delay_ms(3);
serial_in[serial_len] = 0; /* 把接收字串補上字串結尾 NULL */
serial_len = 0; /* 讓下次接收再重頭開始 */
serial_ending = 0; /* 清除掉字串結束的旗號, 好能重新開始 */

}
}
}

9月22日 18:24:12
轉換PDF檔 列印


Re: #include <18F45k22.h>一直會自動重開
資深會員
註冊日期:
2010/06/30 16:18
來自 CAE, Microchip Technology Inc.
所屬群組:
站務管理者
註冊會員
文章: 1596
等級: 33; EXP: 86
HP : 164 / 821
MP : 532 / 19946
離線
WDT如果開啟, 程式中就必須在適當的位置, 清除WDT的計數值, 不清除時間到了自然會Reset MCU.

9月25日 09:47:31
轉換PDF檔 列印


Re: #include <18F45k22.h>一直會自動重開
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14501
等級: 73; EXP: 6
HP : 1080 / 1801
MP : 4833 / 76200
離線
1. 我不知道你在 main( )迴圈所用的 restart_wdt(); 的敘述是何種功能? 查一下 XC8 的使用手冊是用 CLRWDT( ); 的巨集去清除 WDT 的逾時計數器的。如底下範例所示:


#include <xc.h>
void
main
(void)
{
WDTCON=1;
/* enable the WDT */
CLRWDT();
}


2. WDT 所設定的逾時時間是多久? 而你的程式裡又多久清除這 WDT 呢? 建議在程式裡的 CLRWDT( ) 後面加上一個 Toggle I/O 的輸出,用示波器測量一下 I/O 腳轉態的時間是否是 WDT 時間的一半。

9月25日 10:09:56

Ryang 於 2018年09月25日 10:27:56
轉換PDF檔 列印


Re: #include <18F45k22.h>一直會自動重開
新會員
註冊日期:
2012/07/19 02:31
所屬群組:
註冊會員
文章: 18
等級: 2; EXP: 97
HP : 0 / 49
MP : 6 / 904
離線
我所使用的除厝軟體是CCS
那語法也是一樣嗎?

9月27日 00:44:47
轉換PDF檔 列印


Re: #include <18F45k22.h>一直會自動重開
初級會員
註冊日期:
2008/03/17 16:27
所屬群組:
註冊會員
文章: 24
等級: 3; EXP: 62
HP : 0 / 65
MP : 8 / 2035
離線
"setup_wdt(WDT_ON|WDT_8S);"
這個語法怪怪的,建議你先設時間再設定開啟,另外,WDT_8S參數我在其內部資料沒有看到這個參數,請使用CSS提供列舉的正確參數值WDT_TIMES_8192或是其他,不然可能根本是沒有設定成8秒

9月27日 08:19:34
轉換PDF檔 列印


Re: #include <18F45k22.h>一直會自動重開
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14501
等級: 73; EXP: 6
HP : 1080 / 1801
MP : 4833 / 76200
離線
CCS 我沒用過。總之,在做 Clear WDT 動作之前先用 Toggle I/O 輸出的方式,用示波器量一下WDT 清除的間隔間。

9月28日 10:49:02
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結

網頁捷徑
2018 Winter Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project