PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Help! WatchDog Không hoạt động (http://www.picvietnam.com/forum/showthread.php?t=32739)

huyle_khongminh 29-08-2013 05:08 PM

Help! WatchDog Không hoạt động
 
1 Attachment(s)
Em đang làm BTL về điều khiển độ ẩm nhưng chương trình của em hay bị treo và e có sử dụng watchdog để tự khởi động lại nhưng không hiểu sao chương trình của em vẫn bị treo. Mong các bác chỉ giáo
PIC: 16F873
chương trình chạy theo chu trình 1s đọc kết quả nhiệt độ rồi hiển thị LCD, và so sánh nếu nhiệt độ trong dải cho phép rồi thì tắt quạt ngược lại thì bật quạt

Code:
#include "main.h"
#include "LCD.C"
#include "sht75.c"

#define Led1 PIN_B7
#define Rst PIN_B6

#define Role1 PIN_B1
#define Role2 PIN_C6

#define RoleOn 0
#define RoleOff 1
#define constTNghi 1200
#define constTOn 11000
#define constTOff 1800

//#define constTNghi 400
//#define constTOn 600
//#define constTOff 600

#rom 0x2100={0x00}

char Mode=0;
int16 Time=0;
char iEr = 0, iOff = 0, iReset = 0;
float restemp=0,truehumid=0;
//Mode = 0: LOC OFF
//Mode = 1: HUT AM
//Mode = 2: Nghi

void StatusRole(char status){
output_bit(Role1, status);
output_bit(Role2, status);
output_bit(Led1, status);
}

void main()
{
//Init System
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_CLOCK_DIV_2);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);setup_wdt( WDT_2304MS);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);

//Init Pro
StatusRole(RoleOff);
output_bit(Led1, 0);
sht_init();
lcd_init();

Mode=2;
Time= constTNghi + read_EEPROM(0x00)*2; //1200

//Mode Test
if(!input(Rst)){
delay_ms(100);
if(!input(Rst)){
Mode=1;
Time=0;
printf(lcd_putc, "\fChe do Kiem Tra");
while(!input(Rst));
}
}

sht_rd (restemp, truehumid);
delay_ms(1000);
output_bit(Led1, 1);

//restart_cause
if(restart_cause() != NORMAL_POWER_UP){
printf(lcd_putc,"\f%i",restart_cause());
while(true) restart_wdt();
}


//MAIN
while(true){
//Mode = 0: LOC OFF
//Mode = 1: HUT AM
//Mode = 2: Nghi

//output_bit(PIN_B5, 1);
//delay_ms(2);
//output_bit(PIN_B5, 0);

restart_wdt();
sht_rd(restemp, truehumid);
delay_ms(100);

Time++;
if((Time % 30)==2) lcd_init();
//restemp = restemp - read_EEPROM(0x2100);
//truehumid = truehumid - read_EEPROM(0x2101);
lcd_gotoxy(1,1); printf(lcd_putc, "t:%0.0f%cC ", restemp, 223);
lcd_gotoxy(9,1); printf(lcd_putc, "RH:%0.1f%% \n",truehumid);

//Reset
if(!input(Rst)){
delay_ms(100);
if(!input(Rst)) iReset++;
if(iReset>=2) reset_cpu();
}else iReset = 0;

//Check Loi CB
if(restemp<-20){
if(iEr>3){
lcd_gotoxy(1,2);
printf(lcd_putc, "LOI CAM BIEN ");
StatusRole(RoleOff);
}else{
iEr++;
}
Time--;
delay_ms(1000);
continue;
}else iEr=0;


//Chuyen Mode
if(truehumid>=55 && Mode==0) {
Mode = 1; //RH>55 dua ve Loc On o all cac Mode
Time = 0;
write_eeprom(0x01,Mode);

}else if(truehumid<=40 && Mode==1 && Time>99){ //Loc Off khi dang LOC on & RH<40
Mode=0;
Time=0;
write_eeprom(0x01,Mode);
}

if((Time>constTOn) && (Mode == 1)){
Mode=2;
Time=0;
write_eeprom(0x01,Mode);

}else if((Time>constTOff) && (Mode == 2)){
Mode=1; //Ve Mode 1 chay them 100s
Time=0;
write_eeprom(0x01,Mode);
}

//Thuc hien Mode
if(Mode==0){
if(Time>300) Time=0;
printf(lcd_putc, "OFF ");
for(iOff=0; iOff<=Time%5; iOff++) printf(lcd_putc, ".");
StatusRole(RoleOff);

}else if(Mode==1){
printf(lcd_putc, "HUT AM: %Lu",Time);
if(Time<100 ) printf(lcd_putc, "/100");
StatusRole(RoleOn);

}else if(Mode==2){
printf(lcd_putc, "NGHI: %Lu",Time);
StatusRole(RoleOff);
}

printf(lcd_putc, " ");

delay_ms(570);
}
}

Mong các bác chỉ giáo


Múi giờ GMT. Hiện tại là 08:14 AM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam