Beispiel #1
0
void low_power(void)
{
	/* Use as little power as possible */
	random_walk_disable();

	motor_off();
	fled_off();
			
	/* IR Led off */
	P4OUT &= ~1;
	P4DIR |= 1;
	P4SEL &= ~1;
	
	dint();

	_BIS_SR(LPM3_bits);
	while(1);
}
Beispiel #2
0
interrupt (ADC10_VECTOR) adc10_isr( void )
{
	static uint16_t food0; /*output from food with LED off*/
	static uint16_t food1; /*output from food with LED on*/
	static uint32_t batt_time = 0;

	adc10_dis();

	switch(curreading){
	case PD1:
		pd_value[0] = ADC10MEM;

		adc10_set_channel(PD2_CHANNEL);
		curreading = PD2;
		break;
	case PD2:
		pd_value[1] = ADC10MEM;

		adc10_set_channel(PD3_CHANNEL);
		curreading = PD3;
		break;
	case PD3:
		pd_value[2] = ADC10MEM;

		/* sample the battery voltage once in a while */
		if (the_time > batt_time)
		{
			batt_time = the_time + BATT_INTERVAL;

			adc10_set_channel(BATT_CHANNEL);
			curreading = BATT;

			/* disable other channels to prevent coupling of photocurrents */
			ADC10AE0 = 0;

			/* Use ACLK */
			ADC10CTL1 = (ADC10CTL1 & (~ADC10SSEL_SMCLK)) | ADC10SSEL_ACLK;
			/* Remove clock divide */
			ADC10CTL1 &= ~ADC10DIV_7;
			ADC10CTL0 |= SREF_1; /* Use 2.5V Reference */
			/* Divide by 4 */
			ADC10CTL0 = (ADC10CTL0 & (~ADC10SHT_DIV64)) | ADC10SHT_DIV4;
		}
		else
		{
			adc10_set_channel(FOOD_CHANNEL);
			curreading = FOOD0;
		}

		bearing_set( pd_value );

		break;
	case BATT:
		battval = ADC10MEM;

		adc10_set_channel(FOOD_CHANNEL);
		ADC10AE0 = CHANNEL_CONFIG;
		ADC10CTL1 &= ~ADC10SSEL_SMCLK;
		ADC10CTL1 |= ADC10SSEL_MCLK; /* Bacl to master clock*/
		ADC10CTL1 |= ADC10DIV_7; /* Divide by 7 */
		ADC10CTL0 &= ~SREF_7; /* Vcc - Vss rails */
		ADC10CTL0 |= ADC10SHT_DIV4; /* Divide clock by 64 */
			
		curreading = FOOD0;
		break;
	case FOOD0:
		/* FLED Off */
		food0 = ADC10MEM;

		adc10_set_channel(FOOD_CHANNEL);

		curreading = FOOD1;
		break;
	case FOOD1:
		/* Fled ON */
		food1 = ADC10MEM;

		adc10_set_channel(PD1_CHANNEL);

		foodcallback(food0, food1);
			
		curreading = PD1;
		break;
	}
	fled_off();
}