Ejemplo n.º 1
0
void event(int16_t result)
{
	static int i = 0;

	sei();
  
	/* The printf in an interrupt is not a good idea, but ok for
	 * the test program */
	printf_P(PSTR("from interrupt : ADC%i = %i\n"),i,result); 
  
	if(++i != 8)
		adc_launch( ADC_REF_AVCC | ( MUX_ADC0 + i ) | ADC_MODE_INT );
	else
		i = 0; /* end, reinitialisation for the next time */
}
Ejemplo n.º 2
0
static void adc_event(int16_t result)
{
	static uint8_t i = 0;

	/* filter value if needed */
	if (adc_infos[i].filter)
		adc_infos[i].value = adc_infos[i].filter(&adc_infos[i],
							 result);
	else
		adc_infos[i].value = result;

	i ++;
	if (i >= ADC_MAX)
		i = 0;
	else
		adc_launch(adc_infos[i].config);
}
Ejemplo n.º 3
0
/* called every 10 ms, see init below */
static void do_adc(void *dummy)
{
	/* launch first conversion */
	adc_launch(adc_infos[0].config);
}
Ejemplo n.º 4
0
int main(void)
{
	int16_t a; int32_t b;

	uart_init();
	fdevopen(uart0_dev_send,NULL);

	sei();

	adc_init();
  
  	while(1) {
    
		printf_P(PSTR("\n\nHello everybody\n This is the ADC test\n"));
    
		wait_ms(20);
        
		/* simple polling */
		a = adc_get_value( ADC_REF_AVCC | MUX_ADC0 );
    
		printf_P(PSTR("polling : ADC0 = %i\n"),a);
		wait_ms(20);
    
    		/* pre-launch */
    
		adc_launch( ADC_REF_AVCC | MUX_ADC1 );
		wait_ms(1);
		/* this function should take less time */
		a = adc_get_value( ADC_NO_CONFIG );
    
		printf_P(PSTR("pre-launch : ADC1 = %i\n"),a);
		wait_ms(20);
    
    		/* test of free running mode */
    
		a = adc_get_value( ADC_REF_AVCC | MUX_ADC2 | ADC_MODE_TRIGGERED );
		printf_P(PSTR("free run mode : ADC2 = %i\n"),a);
		wait_ms(1);
		/* this function should take less time */
		a = adc_get_value( ADC_REF_AVCC | MUX_ADC3 | ADC_MODE_TRIGGERED ); 
		printf_P(PSTR("free run mode : ADC3 = %i\n\n"),a);
		wait_ms(1);
    
    
		/* test of different outputs formats */
    
		a = adc_get_value( ADC_REF_AVCC | MUX_ADC0  | ADC_MODE_16_BITS );
		printf_P(PSTR("normal output 16: ADC0 = %u ( div = %u)\n"),
			 a, ((uint16_t)a)/(1<<6));
    
		b = adc_get_value32( (void*)(ADC_REF_AVCC | MUX_ADC0  | 
					     ADC_MODE_16_BITS) );
		printf_P(PSTR("normal output 16(32): ADC0 = %ld ( div = %lu)\n"),
			 b, b/(1l<<6));
    
		/* ADC_MODE_10_BITS default */
		a = adc_get_value( ADC_REF_AVCC | MUX_ADC0  );
		printf_P(PSTR("normal output 10: ADC0 = %u\n"),a); 
    
		/* ADC_MODE_10_BITS default */
		b = adc_get_value32( (void*)(ADC_REF_AVCC | MUX_ADC0 ) );
		printf_P(PSTR("normal output 10(32): ADC0 = %lu\n"),b);
    
		printf_P(PSTR("now try a signed differential conversion\n"));
    
		a = adc_get_value( ADC_REF_AVCC | MUX_ADC0  | ADC_MODE_10_BITS );
		b = adc_get_value( ADC_REF_AVCC | MUX_ADC1  | ADC_MODE_10_BITS );
		printf_P(PSTR("computed : ADC0-ADC1 = %i\n"), 
			 ((int16_t)a - (int16_t)b) /2);
    
		a = adc_get_value( ADC_REF_AVCC | MUX_ADC0_ADC1);
    
		printf_P(PSTR("signed output 10: ADC0-ADC1 = %i\n"),a);
    
		b = adc_get_value32( (void*)(ADC_REF_AVCC | MUX_ADC0_ADC1 ) );
		printf_P(PSTR("signed output 10(32): ADC0-ADC1 = %li\n"),b);
    
		a = adc_get_value( ADC_REF_AVCC | MUX_ADC0_ADC1 | 
				   ADC_MODE_16_BITS );
		printf_P(PSTR("signed output 16: ADC0-ADC1 = %i ( div = %i)\n"),
			 a, a/(1<<6)); 
    
		b = adc_get_value32( (void*)(ADC_REF_AVCC | MUX_ADC0_ADC1  | 
					     ADC_MODE_16_BITS ) );
		printf_P(PSTR("signed output 16(32): ADC0-ADC1 = %li ( div = %li)\n\n"),
			 b, b/(1<<6));
    
		/* test of interrupt mode : we scan once the 8
		   inputs */
    
		adc_register_event(event);
		adc_launch( ADC_REF_AVCC | MUX_ADC0 | ADC_MODE_INT );
		wait_ms(20);
    
		wait_ms(2000);
	}

	return 0;
}