static void irq(irq_t s) { switch(s) { case IRQ_ADC1: x = u16AHI_AdcRead(); break; case IRQ_ADC2: y = u16AHI_AdcRead(); break; case IRQ_ADC3: z = u16AHI_AdcRead(); break; default: break; } sensors_changed(&acc_sensor); }
/* * Analog Read * As usually, 10bit ADC is enough, to increase the compatibility, will use only 10bit. * if if your ADC is 12bit, you need to >>2, or your ADC is 8Bit, you need to <<2 */ int16 suli_analog_read(ANALOG_T *aio) { vAHI_AdcEnable(E_AHI_ADC_SINGLE_SHOT, E_AHI_AP_INPUT_RANGE_2, *aio); //2*vref = 1.2*2 = 2.4V vAHI_AdcStartSample(); // Wait until ADC data is available while(bAHI_AdcPoll()); uint16 val = u16AHI_AdcRead(); return val; //convert the output to 5V - 1024 //return (int16)(val * 6.6f / 5.0f); }
/**************************************************************************** * * NAME: LAMP_vInit * * DESCRIPTION: Initialises the lamp drive system * * PARAMETERS: Name RW Usage * * * RETURNS: * void * ****************************************************************************/ PUBLIC void DriverBulb_vInit(void) { bool_t bLampTimerInt = FALSE; static bool_t bInit = FALSE; if (bInit == FALSE) { /* Configure DIO pins */ vAHI_DioSetDirection(0, (LAMP_ON_OFF_MASK | (1 <<LAMP_BLEEDER_PIN))); /* Turn CFL lamp off */ vAHI_DioSetOutput(0, LAMP_ON_OFF_MASK); /* Mimic PWM to led ? */ #if (LAMP_LED_PIN < 21) { /* Configure as output */ vAHI_DioSetDirection(0, (1 << LAMP_LED_PIN)); /* Turn CFL lamp off */ vAHI_DioSetOutput(0, (1 << LAMP_LED_PIN)/*, 0*/); /* Register interrupt callback */ vAHI_Timer0RegisterCallback(vCbTimer0); /* Note we want to generate interrupts */ bLampTimerInt = TRUE; } #endif /* Configure timer 0 to generate a PWM output on its output pin */ vAHI_TimerEnable(LAMP_TIMER, LAMP_TIMER_PRESCALE, bLampTimerInt, bLampTimerInt, TRUE); vAHI_TimerConfigureOutputs(LAMP_TIMER, FALSE, TRUE); vAHI_TimerClockSelect(LAMP_TIMER, FALSE, TRUE); /* turn on lamp - this is the default state */ vAHI_DioSetOutput((1 << LAMP_BLEEDER_PIN),0); vAHI_DioSetOutput(LAMP_ON_OFF_MASK,0); vAHI_ApConfigure(E_AHI_AP_REGULATOR_ENABLE, E_AHI_AP_INT_DISABLE, E_AHI_AP_SAMPLE_8, E_AHI_AP_CLOCKDIV_500KHZ, E_AHI_AP_INTREF); while (!bAHI_APRegulatorEnabled()); /* spin on reg not enabled */ vAHI_AdcEnable(E_AHI_ADC_SINGLE_SHOT, E_AHI_AP_INPUT_RANGE_2, ADC_USED); do { vAHI_AdcStartSample(); while(bAHI_AdcPoll()); gu32BusVoltage = ((uint32)u16AHI_AdcRead()*VBUS_MAXIMUM) >> ADC_BITS; } while (gu32BusVoltage< VBUS_TRIP_LO); vAHI_AdcDisable(); vAHI_ApConfigure(E_AHI_AP_REGULATOR_DISABLE, E_AHI_AP_INT_DISABLE, E_AHI_AP_SAMPLE_8, E_AHI_AP_CLOCKDIV_500KHZ, E_AHI_AP_INTREF); vAHI_TimerStartRepeat(LAMP_TIMER, PWM_COUNT, PWM_COUNT ); bInit = TRUE; bIsOn = TRUE; }
/**************************************************************************** * * NAME: MibAdcStatusPatch_u8Analogue * * DESCRIPTION: * Called when analogue reading is complete * ****************************************************************************/ PUBLIC uint8 MibAdcStatusPatch_u8Analogue(void) { /* Note the reading */ psMibAdcStatus->sTemp.au16Read[psMibAdcStatus->u8Adc] = u16AHI_AdcRead(); /* JN5148 or JN5148J01 ? */ #if (defined(JENNIC_CHIP_JN5148) || defined(JENNIC_CHIP_JN5148J01)) { /* Do nothing */ } /* JN5142J01 */ #elif defined(JENNIC_CHIP_JN5142J01) { /* Left shift the conversion to scale from 8 to 12 bits */ psMibAdcStatus->sTemp.au16Read[psMibAdcStatus->u8Adc] <<= 4; } #else { /* Left shift the conversion to scale from 10 to 12 bits */ psMibAdcStatus->sTemp.au16Read[psMibAdcStatus->u8Adc] <<= 2; } #endif /* Update the table hash value */ psMibAdcStatus->sRead.u16Hash++; /* Debug */ //DBG_vPrintf(CONFIG_DBG_MIB_ADC_STATUS, "\nMibAdcStatusPatch_u8Analogue()", psMibAdcStatus->u8Adc); //DBG_vPrintf(CONFIG_DBG_MIB_ADC_STATUS, "\n\tu16AHI_AdcRead(%d)=%d", psMibAdcStatus->u8Adc, psMibAdcStatus->sTemp.au16Read[psMibAdcStatus->u8Adc]); /* Temperature reading ? */ if (psMibAdcStatus->u8Adc == E_AHI_ADC_SRC_TEMP) { int16 i16Temp; /* Convert reading to temperature */ i16Temp = MibAdcStatusPatch_i16DeciCentigrade(psMibAdcStatus->u8Adc); if (i16DebugTemp - i16Temp >= 50 || i16DebugTemp - i16Temp <= -50) { /* Debug */ DBG_vPrintf(CONFIG_DBG_MIB_ADC_STATUS, "\n\tMibAdcStatusPatch_i16DeciCentigrade(%d)=%d", psMibAdcStatus->u8Adc, i16Temp); /* UART ? */ #ifdef UART_H_INCLUDED { /* Debug */ UART_vNumber(u32Second, 10); UART_vString(" TEMP @ "); UART_vNumber(i16Temp, 10); UART_vString("C\r\n"); } #endif /* Note last debugged value */ i16DebugTemp = i16Temp; } /* Don't yet have a radio calibration temperature */ if (psMibAdcStatus->i16CalTemp == CONFIG_INT16_MIN) { /* Note current value (radio will have calibrated upon booting) */ psMibAdcStatus->i16CalTemp = i16Temp; } /* Have a calibration value ? */ else { int16 i16Diff; /* Calculate difference from last calibration value */ if (i16Temp > psMibAdcStatus->i16CalTemp) i16Diff = i16Temp - psMibAdcStatus->i16CalTemp; else i16Diff = psMibAdcStatus->i16CalTemp - i16Temp; /* Need to recalibrate the radio ? */ if (i16Diff >= MIB_ADC_TEMP_CALIBRATE) { teCalStatus eCalStatus; /* Attempt calibration */ eCalStatus = eAHI_AttemptCalibration(); /* Success ? */ if (eCalStatus == E_CAL_SUCCESS) { /* Note new calibration temperature */ psMibAdcStatus->i16CalTemp = i16Temp; } /* Debug */ DBG_vPrintf(CONFIG_DBG_MIB_ADC_STATUS, "\n\t%dC eAHI_AttemptCalibration()=%d", i16Temp, eCalStatus); /* UART ? */ #ifdef UART_H_INCLUDED { /* Debug */ UART_vNumber(u32Second, 10); UART_vString(" CALI @ "); UART_vNumber(i16Temp, 10); UART_vString("C\r\n"); } #endif } } /* JN5148 or JN5148J01 ? */ #if (defined(JENNIC_CHIP_JN5148) || defined(JENNIC_CHIP_JN5148J01)) { /* Valid oscillator pin ? */ if (psMibAdcStatus->u8OscPin < 21) { /* Do we need to pull the oscillator ? */ if (i16Temp >= MIB_ADC_TEMP_OSC_PULL_48 && u8MibAdcStatusPatchOscillator != 0x1) { /* Note state */ u8MibAdcStatusPatchOscillator = 0x1; /* Pull oscillator */ MibAdcStatus_vOscillatorPull(TRUE); /* Debug */ DBG_vPrintf(CONFIG_DBG_MIB_ADC_STATUS, "\n\t48 %dC to %dC PULL(%x)", psMibAdcStatus->i16ChipTemp, i16Temp, u8MibAdcStatusPatchOscillator); /* UART ? */ #ifdef UART_H_INCLUDED { /* Debug */ UART_vNumber(u32Second, 10); UART_vString(" OSCI @ "); UART_vNumber(i16Temp, 10); UART_vString("C = "); UART_vNumber(u8MibAdcStatusPatchOscillator, 2); UART_vString("\r\n"); } #endif } /* Do we need to push the oscillator ? */ else if (i16Temp <= MIB_ADC_TEMP_OSC_PUSH_48 && u8MibAdcStatusPatchOscillator != 0x0) { /* Note state */ u8MibAdcStatusPatchOscillator = 0x0; /* Push oscillator */ MibAdcStatus_vOscillatorPull(FALSE); /* Debug */ DBG_vPrintf(CONFIG_DBG_MIB_ADC_STATUS, "\n\t48 %dC to %dC PUSH(%x)", psMibAdcStatus->i16ChipTemp, i16Temp, u8MibAdcStatusPatchOscillator); /* UART ? */ #ifdef UART_H_INCLUDED { /* Debug */ UART_vNumber(u32Second, 10); UART_vString(" OSCI @ "); UART_vNumber(i16Temp, 10); UART_vString("C = "); UART_vNumber(u8MibAdcStatusPatchOscillator, 2); UART_vString("\r\n"); } #endif } } } /* Others ? */ #else { /* Below low push point ? */ if (i16Temp <= MIB_ADC_TEMP_OSC_PUSH_LO && u8MibAdcStatusPatchOscillator != 0x0) { /* Note state */ u8MibAdcStatusPatchOscillator = 0x0; /* Fully push oscillator - clear bits 20 and 21 of TEST3V register */ U32_CLR_BITS(pu32Test3V, (3<<20)); /* Debug */ DBG_vPrintf(CONFIG_DBG_MIB_ADC_STATUS, "\n\t42 %dC to %dC Pull(%x)", psMibAdcStatus->i16ChipTemp, i16Temp, u8MibAdcStatusPatchOscillator); /* UART ? */ #ifdef UART_H_INCLUDED { /* Debug */ UART_vNumber(u32Second, 10); UART_vString(" OSCI @ "); UART_vNumber(i16Temp, 10); UART_vString("C = "); UART_vNumber(u8MibAdcStatusPatchOscillator, 2); UART_vString("\r\n"); } #endif } /* Above high pull point ? */ else if (i16Temp >= MIB_ADC_TEMP_OSC_PULL_HI && u8MibAdcStatusPatchOscillator != 0x3) { /* Note state */ u8MibAdcStatusPatchOscillator = 0x3; /* Fully pull oscillator - set bits 20 and 21 of TEST3V register */ U32_SET_BITS(pu32Test3V, (3<<20)); /* Debug */ DBG_vPrintf(CONFIG_DBG_MIB_ADC_STATUS, "\n\t42 %dC to %dC Pull(%x)", psMibAdcStatus->i16ChipTemp, i16Temp, u8MibAdcStatusPatchOscillator); /* UART ? */ #ifdef UART_H_INCLUDED { /* Debug */ UART_vNumber(u32Second, 10); UART_vString(" OSCI @ "); UART_vNumber(i16Temp, 10); UART_vString("C = "); UART_vNumber(u8MibAdcStatusPatchOscillator, 2); UART_vString("\r\n"); } #endif } /* Below high push point or above low pull point ? */ else if (i16Temp <= MIB_ADC_TEMP_OSC_PUSH_HI && i16Temp >= MIB_ADC_TEMP_OSC_PULL_LO && u8MibAdcStatusPatchOscillator != 0x1) { /* Note state */ u8MibAdcStatusPatchOscillator = 0x1; /* Half pull oscillator - clear bit 20 and set bit 21 of TEST3V register */ U32_CLR_BITS(pu32Test3V, (1<<20)); U32_SET_BITS(pu32Test3V, (1<<21)); /* Debug */ DBG_vPrintf(CONFIG_DBG_MIB_ADC_STATUS, "\n\t42 %dC to %dC Pull(%x)", psMibAdcStatus->i16ChipTemp, i16Temp, u8MibAdcStatusPatchOscillator); /* UART ? */ #ifdef UART_H_INCLUDED { /* Debug */ UART_vNumber(u32Second, 10); UART_vString(" OSCI @ "); UART_vNumber(i16Temp, 10); UART_vString("C = "); UART_vNumber(u8MibAdcStatusPatchOscillator, 2); UART_vString("\r\n"); } #endif } } #endif /* Note current value */ psMibAdcStatus->i16ChipTemp = i16Temp; } /* Return the source we just read */ return psMibAdcStatus->u8Adc; }
static void irq(irq_t s) { _value = (u16AHI_AdcRead() * TEMP_FACTOR) + TEMP_MIN; sensors_changed(&inttemp_sensor); }