OSDN Git Service

[PM] Improve power-switch feature's stablity.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Sun, 23 Jun 2013 07:53:22 +0000 (16:53 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Sun, 23 Jun 2013 07:53:22 +0000 (16:53 +0900)
idle.c
main.c
power.c

diff --git a/idle.c b/idle.c
index a42f5b9..ebe37de 100644 (file)
--- a/idle.c
+++ b/idle.c
@@ -53,6 +53,7 @@ void idle(unsigned int initial)
    unsigned char  contword;
    unsigned int i;
 
+   WDTCONbits.SWDTEN = 0; // Lame WDT OFF.
    /* Enable IDLE */
    osccon = OSCCON;
    osccon = osccon | _IDLEN;
@@ -73,4 +74,5 @@ void idle(unsigned int initial)
        Sleep();
        i = TMR0H << 8 + TMR0L; // Check if IDLE-Timer was elapsed.
    } while(i < 3); // Dead area : 0-2.
+   WDTCONbits.SWDTEN = 1; // WDT ON.
 }
diff --git a/main.c b/main.c
index 42b3a9a..3ee7f0e 100644 (file)
--- a/main.c
+++ b/main.c
@@ -531,6 +531,7 @@ int main(void)
     idle_init();
     keyin_init();
     keyin_ioinit();
+    WDTCONbits.SWDTEN = 1; // WDT ON.
     reset_status = chk_reset();
     switch(reset_status){
         case RESET_POR:
@@ -543,6 +544,7 @@ int main(void)
         case RESET_SOFTWARE: //
             do {
                 pbutton = chk_powerbutton();
+                ClrWdt();
                 if(pbutton == 0) power_off(0); // Button not pressed.
             } while(pbutton == 0);
             break;
diff --git a/power.c b/power.c
index 08099f5..ee6d1ba 100644 (file)
--- a/power.c
+++ b/power.c
@@ -63,9 +63,9 @@ void power_on(void)
 {
     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)
@@ -99,18 +99,28 @@ void power_off(unsigned char save)
 {
     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