OSDN Git Service

[IO] Fix unstable of power button.
authorK.Ohta <whatisthis.sowhat@gmail.com>
Fri, 26 Jul 2013 04:56:13 +0000 (13:56 +0900)
committerK.Ohta <whatisthis.sowhat@gmail.com>
Fri, 26 Jul 2013 04:56:13 +0000 (13:56 +0900)
[Build] Enable to boot , compiled with XC8. Some functions wtill work wrong.

adc_int.c
adc_int.h
akc6955.c
akc6955.h
i2c_io.c
i2c_io.h
idle.c
main.c
power.c
power.h
radio_getstat.c

index 8bdc38a..787bc19 100644 (file)
--- a/adc_int.c
+++ b/adc_int.c
@@ -54,71 +54,6 @@ void intadc_init(void)
 }
 
 
-#if 0
-void startadc(unsigned char ch)
-{
-    unsigned char a;
-    ADCON1bits.VCFG1 = 0;
-    ADCON1bits.VCFG0 = 0;
-    ADCON2 = 0b10110110;
-    a = 0b00000001; // Select AN7, Start.
-    switch(ch){
-        case 0:
-            a |= 0b00011100; // AN7
-            break;
-        default:
-            a |= 0b00011100; // AN7
-            break;
-    }
-    ADCON0 = a;
-    // Delay = 5uS + Tc + (tempalature - 25) * 0.05uS
-//    delay10tcy(8); // Tc = -13.5pF*(1K + 700 + (13K//39K)) = 1.52uS
-    // Wait < 1.52 + 5 + 1.25 = 7.77uS-> 8uS
-    PIR1bits.ADIF = 0;
-    PIE1bits.ADIE = 0;
-    IPR1bits.ADIP = 1; // High
-    ADCON0bits.GO_NOT_DONE = 1;
-}
-
-unsigned int polladc(void)
-{
-    unsigned int a;
-    if(ADCON0bits.DONE == 1){ // converting or not enable.
-        PIE1bits.ADIE = 1;
-        PIR1bits.ADIF = 0;
-        return 0xffff;
-    } else { // Done, Clear interrupt
-//     if(ADCON0bits.ADON == 0){
-//         a = 0xffff;
-//     } else {
-        a = ((ADRESH << 8)  + ADRESL) & 0x03ff;
-//     }
-     PIE1bits.ADIE = 0;
-     PIR1bits.ADIF = 0;
-//     ADCON0bits.GO_NOT_DONE = 0;
-//        ADCON0bits.ADON = 0;
-        return a;
-    }
-}
-
-unsigned int polladc2(void)
-{
-    unsigned int a = 0;
-    do {
-        delay10tcy(8); // 10uS
-        a = ((ADRESH << 8)  + ADRESL) & 0x03ff;
-    } while(ADCON0bits.DONE);
-    return a;
-}
-
-void stopadc(void)
-{
-    ADCON0bits.GO_NOT_DONE = 0;
-//    ADCON0bits.ADON = 0;
-    PIR1bits.ADIF = 0;
-    PIE1bits.ADIE = 0;
-}
-#else // Using sdcc's library.
 
 unsigned int polladc(void)
 {
@@ -136,7 +71,6 @@ unsigned int polladc(void)
     }
 }
 
-#endif
 
 unsigned int adc_rawtobatt(unsigned int b, unsigned int reflevel)
 {
index fe808fa..7f7c782 100644 (file)
--- a/adc_int.h
+++ b/adc_int.h
@@ -83,10 +83,9 @@ extern unsigned int polladc2(void);
  *    ADCON1bits.VCFG0 = 0;
  *    ADCON2 = 0b10110110;
  */
-#define startadc(c, p) { \
-    OpenADC(ADC_FOSC_64 | ADC_RIGHT_JUST | ADC_20_TAD, c, p); \
-    SetChanADC(c); \
-    ConvertADC(); \
+#define startadc(c) { \
+    OpenADC(ADC_FOSC_64 & ADC_RIGHT_JUST & ADC_20_TAD,  (ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_VSS & (0x0f << 2)) | (c << 2) , 0x0001 << c); \
+    ADCON0bits.GO = 1; \
     }
 
 #endif
index 15eba7b..85fcb42 100644 (file)
--- a/akc6955.c
+++ b/akc6955.c
 
 void akc6955_writecmd(unsigned char reg, unsigned char data)
 {
-#ifdef __SDCC
-    i2c_open(I2C_MASTER, I2C_SLEW_ON, 5);
-    I2C_START();
-    i2c_writechar(0x20);
-    i2c_writechar(reg);
-    i2c_writechar(data);
-    I2C_STOP();
-    i2c_close();
-    delay100tcy(2);
-#else
-    OpenI2C(MASTER, SLEW_ON);
-    SSPADD = 0x5;
-//    IdleI2C();
-    StartI2C();
-    WriteI2C(0x20);
-    //delay1ktcy(8);
-    WriteI2C(reg);
-    //delay1ktcy(8);
-    WriteI2C(data);
-    //delay1ktcy(8);
-    StopI2C();
- //   delay1ktcy(8);
-    CloseI2C();
-#endif  //    i2c_idle();
+    i2c_send_byte(AKC6955_ADDRESS, reg, data);
 }
 
 unsigned char akc6955_readcmd(unsigned char reg)
 {
-    unsigned char c;
-    //    OPENASMASTER();
-#ifdef __SDCC
-    i2c_open(I2C_MASTER, I2C_SLEW_ON, 5);
-    I2C_START();
-    i2c_writechar(0x20);
-    i2c_writechar(reg);
-    I2C_STOP();
-    delay100tcy(2);
-    I2C_START();
-    i2c_writechar(0x21);
-    c = i2c_readchar();
-    I2C_ACK();
-    I2C_STOP();
-    i2c_close();
-#else
-    OpenI2C(MASTER, SLEW_ON);
-    SSPADD = 0x5;
-//    IdleI2C();
-    StartI2C();
-    WriteI2C(0x20);
-  //  delay1ktcy(8);
-    WriteI2C(reg);
-  //  delay1ktcy(8);
-    StopI2C();
-    __delay_us(13);
-    StartI2C();
-    WriteI2C(0x21);
-  //  delay1ktcy(8);
-    c = ReadI2C();
-    AckI2C();
-    StopI2C();
- //   delay1ktcy(8);
-    CloseI2C();
-#endif
-    //    CLOSEASMASTER();
-
-    return c;
+    return i2c_read_byte(AKC6955_ADDRESS, reg);
 }
 
 void akc6955_chg_fm(unsigned char f, unsigned int freq)
index 16403c3..d54758c 100644 (file)
--- a/akc6955.h
+++ b/akc6955.h
@@ -29,6 +29,8 @@
 #ifndef AKC6955_H
 #define        AKC6955_H
 
+#include "i2c_io.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -211,6 +213,9 @@ extern void akc6955_set_thresh_fmcnr(unsigned char a);
 extern void akc6955_set_thresh_amcnr(unsigned char a);
 extern void akc6955_set_thresh_width(unsigned char a);
 
+
+
+
 #define akc6955_set_fmbandwidth(bw) { \
     unsigned char c = akc6955_readcmd(AKC6955_STEREO); \
     c = (c & 0xfc) | (bw & 0x03); \
index 253c400..1a6a905 100644 (file)
--- a/i2c_io.c
+++ b/i2c_io.c
@@ -29,6 +29,7 @@
 #include <stdarg.h>
 #include <stdio.h>
 #ifdef __SDCC
+#include <delay.h>
 #include <pic18fregs.h>
 #endif
 
@@ -61,10 +62,10 @@ void i2c1_init(void)
 {
  //   unsigned char b;
 //    b = _SSPEN | _SSPM3;
-    SSPCON1bits.SSPEN = 1;
-    SSPCON1bits.SSPM3 = 1;
-    SSPADD = 4; // Fosc:8000[KHz] / (4 * I2C:Clock:400[KHz]) - 1
-    SSPSTAT = 0x80;
//   SSPCON1bits.SSPEN = 1;
+//    SSPCON1bits.SSPM3 = 1;
+//    SSPADD = 4; // Fosc:8000[KHz] / (4 * I2C:Clock:400[KHz]) - 1
+//    SSPSTAT = 0x80;
     PIR1bits.SSPIF = 0;
     PIE1bits.SSPIE = 0;
     IPR1bits.SSPIP = 1;
@@ -82,4 +83,79 @@ void i2c2_init(void)
 {
 }
  #endif
+// I2C_IO
+void i2c_send_byte(unsigned char addr, unsigned char reg, unsigned char data)
+{
+#ifdef __SDCC
+    i2c_open(I2C_MASTER, I2C_SLEW_ON, 5);
+    I2C_START();
+    i2c_writechar(addr);
+    i2c_writechar(reg);
+    i2c_writechar(data);
+    I2C_STOP();
+    i2c_close();
+//    delay100tcy(2);
+#else
+    OpenI2C(MASTER, SLEW_ON);
+    SSPADD = 0x5;
+//    IdleI2C();
+    StartI2C();
+    while (SSPCON2bits.SEN);
+    WriteI2C(addr);
+    WriteI2C(reg);
+    WriteI2C(data);
+    StopI2C();
+    while (SSPCON2bits.PEN);
+    CloseI2C();
+#endif  //    i2c_idle();
+}
+
+unsigned char i2c_read_byte(unsigned char addr, unsigned char reg)
+{
+    unsigned char c;
+  #ifdef __SDCC
+    i2c_open(I2C_MASTER, I2C_SLEW_ON, 5);
+    I2C_START();
+    i2c_writechar(addr);
+    i2c_writechar(reg);
+    I2C_STOP();
+    i2c_idle();
+//   delay100tcy(2);
+    I2C_START();
+    i2c_writechar(addr | 1);
+    c = i2c_readchar();
+    I2C_ACK();
+    I2C_STOP();
+    i2c_close();
+#else
+    OpenI2C(MASTER, SLEW_ON);
+    SSPADD = 0x5;
+    StartI2C();
+    while(SSPCON2bits.SEN);
+    WriteI2C(addr);
+  //  delay1ktcy(8);
+    WriteI2C(reg);
+  //  delay1ktcy(8);
+    StopI2C();
+    IdleI2C();
+    StartI2C();
+    WriteI2C(addr | 1);
+    if (!SSPCON2bits.ACKSTAT){
+      SSPCON2bits.RCEN = 1;
+      while(SSPCON2bits.RCEN);
+      NotAckI2C();
+      while (SSPCON2bits.ACKEN);
+      StopI2C();
+      while (SSPCON2bits.PEN);
+    }
+    c = SSPBUF;
+  //  delay1ktcy(8);
+ //   delay1ktcy(8);
+    CloseI2C();
+#endif
+    //    CLOSEASMASTER();
+    return c;
+
+}
+
 #endif
\ No newline at end of file
index 75047a0..d0c1d9e 100644 (file)
--- a/i2c_io.h
+++ b/i2c_io.h
@@ -52,6 +52,8 @@ extern "C" {
 #define CLOSEASMASTER() i2c_close()
 extern void i2c1_init(void);
 extern void i2c2_init(void);
+extern void i2c_send_byte(unsigned char addr, unsigned char reg, unsigned char data);
+extern unsigned char i2c_read_byte(unsigned char addr, unsigned char reg);
 
 
 #ifdef __cplusplus
diff --git a/idle.c b/idle.c
index ba69a49..77eb264 100644 (file)
--- a/idle.c
+++ b/idle.c
 
 void idle_init(void)
 {
-#if defined(__SDCC)
+    RCONbits.IPEN = 1;
+//    INTCONbits.GIE = 1;
+
     INTCONbits.TMR0IF = 0;
+    INTCONbits.TMR0IE =  1;
     INTCONbits.RBIF = 0;
     INTCON2bits.TMR0IP = 0;
 //   INTCON = INTCON & ~(_TMR0IF |  _RBIF); // Enable tmr0 as interrupt and clear interrupt flags.
 //   INTCON2 = ~_TMR0IP & _TMR0IP; // Interrupt is lower.
-#else
-   INTCON = INTCON & ~(_INTCON_TMR0IF_MASK |  _INTCON_RBIF_MASK); // Enable tmr0 as interrupt and clear interrupt flags.
-   INTCON2bits.TMR0IP = 0; // Interrupt is lower.
-#endif
    WDTCON = 1; // OK? WDT=Disabled.
 }
 
@@ -69,9 +68,7 @@ void idle(unsigned int initial)
    /* 1Tick = 1/1000 ms*/
    T0CON = 0b00001000; // 1/2
    OSCCONbits.IDLEN = 1;
-   INTCON2bits.TMR0IP = 0;
    INTCONbits.TMR0IF = 0;
-   INTCONbits.TMR0IE = 1; // Enable tmr0 as interrupt and clear interrupt flags.
 //   TMR0H = initial >> 8; // Write order : L->H
    TMR0H = initial >> 8; // Write order : H->L
    TMR0L = initial & 0xff;
diff --git a/main.c b/main.c
index d6cd9dd..ccc1697 100644 (file)
--- a/main.c
+++ b/main.c
@@ -108,7 +108,7 @@ SIGHANDLER(TMR0_handler)
    T0CONbits.TMR0ON = 0;
 
    // Clear interrupt flag
-//   INTCONbits.TMR0IF = 0;
+   INTCONbits.TMR0IF = 0;
    INTCONbits.TMR0IE = 0;;
 
    return;
@@ -215,7 +215,7 @@ DEF_INTHIGH(inthigh_handler)
   //DEF_HANDLER(SIG_BCOL, I2CBus_handler)
 END_DEF
 #else
-void interrupt high_priority intlow_handler(void)
+void interrupt low_priority intlow_handler(void)
 {
     if(INTCONbits.TMR0IF) TMR0_handler();
     if(INTCONbits.INT0IF) EXINT_Handler();
@@ -267,20 +267,12 @@ int main(void)
     idle_time_ms(300); // Wait for setup.
     switch(reset_status){
         case RESET_MCLR:
-            shutdown(0); // When press reset, state to power_off.
-            break;
         case RESET_WDT:  // Workaround random reset.
-            shutdown(0);
-            break;
         case RESET_BOR:
             shutdown(0); // Save and halt on BOR.
             break;
         case RESET_SOFTWARE: //
-//            do {
-//                pbutton = chk_powerbutton();
-//                ClrWdt();
- //               if(pbutton == 0) power_off(0); // Button not pressed.
-//            } while(pbutton == 0);
+            RCONbits.RI = 0;
             break;
         default:
             break;
@@ -290,11 +282,11 @@ int main(void)
     power_on(1);
     intadc_init();
     set_powerlamp(1);
-    idle_time_ms(125);
+//    idle_time_ms(125);
     valinit();
 
     acm1602_init(0xa0, 1); //Init LCD
-    idle_time_ms(125);
+//    idle_time_ms(125);
     _LOCATE(0,0);  // It's BAD-KNOWHOW, but needs AKIZUKI'S LCD :(
     _PUTCHAR(' '); //
     _LOCATE(0,1);
@@ -308,7 +300,7 @@ int main(void)
     _CLS();
     _LOCATE(0,0);
     _PUTCHAR(' ');
-//   battlevel = 350;
+    battlevel = 350;
     update_status();
     update_display();
     ClrWdt();
@@ -337,8 +329,7 @@ int main(void)
             } else {
                 lcd_setbacklight(0x00, 0); // Turn OFF
         }
-//        ClrWdt();
-        // Debug routines
+        ClrWdt();
         update_status();
         update_display();
         ClrWdt();
diff --git a/power.c b/power.c
index 7294d69..fe3cad6 100644 (file)
--- a/power.c
+++ b/power.c
@@ -78,7 +78,6 @@ void power_on_inthook(void)
     IOCB = 0x00;
 //    IOCBbits.IOCB4 = 1;
     INTCONbits.RBIE = 0;
-    INTCONbits.RBIF = 0;
     INTCONbits.GIE = 1;
     INTCONbits.PEIE = 1;
 }
@@ -114,7 +113,7 @@ void rfamp_power(unsigned char b)
 
 }
 
-unsigned char chk_powerbutton(void)
+volatile unsigned char chk_powerbutton(void)
 {
     unsigned char count = 0;
     char i;
@@ -156,28 +155,34 @@ void power_off(unsigned char save)
     WDTCONbits.SWDTEN = 0; // Lame WDT OFF.
     sts = 0;
     do {
-        IOCB = 0x00;
-        IOCBbits.IOCB4 = 1; // IOCB4 ONLY.
+        RCONbits.IPEN = 1;
+        IOCB = 0x10; // IOCB4 ONLY.
         OSCCONbits.IDLEN = 0; // Not Idle.
         INTCON2bits.RBIP = 1; // Priority = HIGH;
-        INTCONbits.RBIF = 0;
-        INTCONbits.GIE = 0;
-        INTCONbits.PEIE = 0;
-        INTCONbits.RBIE = 1;
+        //INTCONbits.GIE = 0;
+        //INTCONbits.RBIF = 0;
+        //INTCONbits.PEIE = 0;
+
+        //INTCONbits.TMR0IF = 0;
+        //INTCONbits.TMR0IE = 0;
+        //INTCONbits.RBIE = 1;
+        INTCON = 0b0000100;
+        T0CONbits.TMR0ON = 0;
         Sleep();
         // Wake up
         if(INTCONbits.RBIF) {
+                INTCONbits.RBIF = 0;
                 sts = chk_powerbutton();
         }
     } while(sts == 0);
     
-    INTCONbits.RBIF = 0;
     INTCONbits.RBIE = 0;
-    OSCCONbits.IDLEN = 1; // Not Idle.
+    INTCONbits.RBIF = 0;
+//    OSCCONbits.IDLEN = 1; // Not Idle.
 
-    INTCONbits.GIE = 1;
-    INTCONbits.PEIE = 1;
-    WDTCONbits.SWDTEN = 1; //WDT ON.
+//    INTCONbits.GIE = 1;
+//    INTCONbits.PEIE = 1;
+//    WDTCONbits.SWDTEN = 1; //WDT ON.
 
     // Button pressed, software reset.
     Reset();
diff --git a/power.h b/power.h
index 3859e3e..12dc8bc 100644 (file)
--- a/power.h
+++ b/power.h
@@ -57,7 +57,7 @@ extern "C" {
 #endif
 
 #ifdef __SDCC
-#define _POWER_DELAY() delay1ktcy(10*8) // 10ms
+#define _POWER_DELAY() delay1ktcy(2*8) // 2ms
 #else
 #define _POWER_DELAY() __delay_ms(2)
 #endif
@@ -78,7 +78,7 @@ extern "C" {
     extern void rfamp_power(unsigned char b);
     extern void power_on_inthook(void);
     extern void power_on(unsigned char f);
-    extern unsigned char chk_powerbutton(void);
+    extern volatile unsigned char chk_powerbutton(void);
     extern void power_off(unsigned char save);
     extern void shutdown(unsigned char save);
 
index 045e304..27f1552 100644 (file)
@@ -83,12 +83,8 @@ void update_status(void)
         tuneflag = akc6955_tune();
         cnrlevel = akc6955_get_cnr();
         batlevel_6955 = akc6955_get_battery();
-#ifdef __SDCC
-    startadc(7);
-#else
-    startadc(ADC_CH7 | ADC_INT_OFF ,ADC_7ANA);
-#endif
-    idle_time_ms(1);
+   startadc(7);
+   idle_time_ms(1);
    polladc2(adc);
     battlevel = adc_rawtobatt(adc, batlevel_6955);
 }