OSDN Git Service

[POWER][v2.0] Fix right shutdown sequence.
[openi2cradio/OpenI2CRadio.git] / adc_int.c
index 326a0a1..b51bf1b 100644 (file)
--- a/adc_int.c
+++ b/adc_int.c
  *  This exception does not however invalidate any other reasons why
  *  the executable file might be covered by the GNU General Public License.
  */
-#include "adc.h"
+
+//#include "adc.h"
 #include "adc_int.h"
 void intadc_init(void)
 {
-#if defined(pic18f23k22) || defined(pic18f24k22) || defined(pic18f25k22) || defined(pic18f26k22)
+#if defined(pic18f23k22) || defined(pic18f24k22) || defined(pic18f25k22) || defined(pic18f26k22) || \
+     defined(_18F23K22)  || defined(_18F24K22)  || defined(_18F25K22)  || defined(_18F26K22)
+
     ANSELA = AN_A_VAL;
     ANSELB = AN_B_VAL;
     ANSELC = AN_C_VAL;
 #endif
-#if defined(pic18f23k20) || defined(pic18f24k20) || defined(pic18f25k20) || defined(pic18f26k20)
+#if defined(pic18f23k20) || defined(pic18f24k20) || defined(pic18f25k20) || defined(pic18f26k20) || \
+      defined(_18F23K20)  || defined(_18F24K20)  || defined(_18F25K20)  || defined(_18F26K20)
+
     ANSEL=  _ADC_INITF;
     ANSELH = _ADCH_INITF;
 #endif
-#if defined(pic18f43k20) || defined(pic18f44k20) || defined(pic18f45k20) || defined(pic18f46k20)
-    ANSEL=  _ADC_INITF;
-    ANSELH = _ADCH_INITF;
+#if defined(pic18f43k20) || defined(pic18f44k20) || defined(pic18f45k20) || defined(pic18f46k20) || \
+    defined(_18F43K20)  || defined(_18F44K20)  || defined(_18F45K20)  || defined(_18F46K20)
+    ANSEL = 0x00;
+    ANSELH = 0x00;
+    ANSELbits._ADC_INITF = 1;
+//    ANSELH = 0x00;;
 #endif
     PIR1bits.ADIF = 0;
     PIE1bits.ADIE = 0;
@@ -47,92 +55,84 @@ 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;
+    PIE1bits.ADIE = 0;
+    PIR1bits.ADIF = 0;
+    if(ADCON0bits.DONE){ // converting or not enable.
         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;
+     ADCON0bits.GO_DONE = 0;
+     ADCON0bits.ADON = 0;
+     return a;
     }
 }
 
-unsigned int polladc2(void)
+/*
+ *    ADCON1bits.VCFG1 = 0;
+ *    ADCON1bits.VCFG0 = 0;
+ *    ADCON2 = 0b10110110;
+ */
+void startadc(unsigned char ch)
 {
-    unsigned int a = 0;
-    do {
-        delay10tcy(8); // 10uS
-        a = ((ADRESH << 8)  + ADRESL) & 0x03ff;
-    } while(ADCON0bits.DONE == 1);
-    return a;
+    unsigned int ansel_val;
+    unsigned char config1, config2;
+#ifdef __SDCC
+    adc_open(ch, ADC_FOSC_64, 0, ADC_FRM_RJUST | ADC_INT_OFF | ADC_VCFG_VDD_VSS | ADC_NVCFG_VSS | ADC_PVCFG_VDD);
+    adc_setchannel(ch);
+    adc_conv();
+#else
+    PIE1bits.ADIE = 0;
+    PIR1bits.ADIF = 0;
+    ADCON0 = 0;
+    ADCON2 = 0b00000110; // 64OSC, Right
+    ADCON1 = 0b00000000; // VREF+=VDD,VREF-=VSS
+    ADCON2 |= 0b10111000; // TAQ=20TAD, Right
+    if(ch < _REF_ADC) {
+        ADCON0 = ch << 2;
+        ansel_val = 0x0001 << ch;
+//        ansel_val = 0x0080;
+    } else {
+        ADCON0 = 0x0f << 2;
+       ansel_val = 0x0000;
+    }
+    ANSELH = ansel_val >> 8;
+    ANSEL = ansel_val & 0xff;
+    ADCON0bits.ADON = 1;
+    idle(160); // 64*20 = 1280clock = 160us
+    ADCON0bits.GO_DONE = 1;
+#endif
 }
 
+#ifdef __SDCC
 void stopadc(void)
 {
-    ADCON0bits.GO_NOT_DONE = 0;
-//    ADCON0bits.ADON = 0;
+    ADCON0bits.GO_DONE = 0;
     PIR1bits.ADIF = 0;
     PIE1bits.ADIE = 0;
 }
-#else // Using sdcc's library.
+#endif
 
-unsigned int polladc(void)
+unsigned int polladc2(void)
 {
     unsigned int a;
-    if(ADCON0bits.DONE == 1){ // converting or not enable.
-        PIE1bits.ADIE = 1;
-        PIR1bits.ADIF = 0;
-        return 0xffff;
-    } else { // Done, Clear interrupt
-        a = ((ADRESH << 8)  + ADRESL) & 0x03ff;
-     PIE1bits.ADIE = 0;
-     PIR1bits.ADIF = 0;
-     ADCON0bits.GO_NOT_DONE = 0;
-     return a;
-    }
+//    PIE1bits.ADIE = 0;
+//    PIR1bits.ADIF = 0;
+    do {
+        idle(50); // wait about 50us
+        a = polladc();
+    } while(a  == 0xffff);
+   return a;
 }
 
-#endif
-
+// Masure raw battery voltage, Reference = 1.20V±4%
+// Multiply = 39:13 = 4:1.
 unsigned int adc_rawtobatt(unsigned int b, unsigned int reflevel)
 {
+
     // raw = (reflevel[0.01V] * b) / 1024 * divide :divide = 4
-    return ((b >>2) * reflevel) >> 6;
+    return ((b * 120) / reflevel) * 4;
 }
\ No newline at end of file