unsigned char contword;
unsigned int i;
+ WDTCONbits.SWDTEN = 0; // Lame WDT OFF.
/* Enable IDLE */
osccon = OSCCON;
osccon = osccon | _IDLEN;
Sleep();
i = TMR0H << 8 + TMR0L; // Check if IDLE-Timer was elapsed.
} while(i < 3); // Dead area : 0-2.
+ WDTCONbits.SWDTEN = 1; // WDT ON.
}
idle_init();
keyin_init();
keyin_ioinit();
+ WDTCONbits.SWDTEN = 1; // WDT ON.
reset_status = chk_reset();
switch(reset_status){
case RESET_POR:
case RESET_SOFTWARE: //
do {
pbutton = chk_powerbutton();
+ ClrWdt();
if(pbutton == 0) power_off(0); // Button not pressed.
} while(pbutton == 0);
break;
{
IOCB = 0x00;
IOCB |= 0x10; // IOCB4 ONLY.
- INTCON2 &= ~_RBIP; // Priority = HIGH;
INTCON &= ~(_RBIF | _RBIE);
- INTCON |= _GIE;
+// INTCON |= _GIE;
+ INTCON |= (_GIE | _PEIE);
}
unsigned char chk_powerbutton(void)
{
unsigned char sts;
if(save != 0) save_eeprom();
-
+ WDTCONbits.SWDTEN = 0; // Lame WDT OFF.
+
do {
IOCB = 0x00;
IOCB |= 0x10; // IOCB4 ONLY.
OSCCONbits.IDLEN = 0; // Not Idle.
INTCON2 |= _RBIP; // Priority = HIGH;
- INTCON &= ~_RBIF;
- INTCON |= (_RBIE | _GIE);
+ INTCON &= ~(_RBIF | _GIE | _PEIE);
+ INTCON |= _RBIE;
Sleep();
// Wake up
- sts = chk_powerbutton();
+ if(INTCONbits.RBIF == 1) {
+ sts = chk_powerbutton();
+ } else {
+ sts = 0;
+ }
} while(sts == 0);
+ INTCONbits.RBIF = 0;
+ INTCONbits.RBIE = 0;
+
+ INTCON |= (_GIE | _PEIE);
+
// Button pressed, software reset.
Reset();
}
\ No newline at end of file