예제 #1
0
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);
}
예제 #2
0
파일: suli.c 프로젝트: Aunsiels/Mesh_Bee
/*
 * 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);
}
예제 #3
0
/****************************************************************************
 *
 * 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;

	}
예제 #4
0
/****************************************************************************
 *
 * 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;
}
예제 #5
0
static void
irq(irq_t s)
{
  _value = (u16AHI_AdcRead() * TEMP_FACTOR) + TEMP_MIN;
  sensors_changed(&inttemp_sensor);
}