Goedemiddag,
code geschreven: Amel studio 7
Development board: XMEGA A1U Xplained board Pro
Atmel device: ATxMega128A1U
Ik kan de functie read_ADC precies 252 keer aanroepen, daarna hangt de uC. Ik zo mij vermoedens dat het iets is met de interrupts, zou dat kunnen? Heeft iemand enig idee?
Grz.
code:
#include <asf.h>
#define MY_ADC ADCA
#define MY_ADC_CH ADC_CH0
#define MY_ADC_CH1 ADC_CH1
#define MY_ADC_CH2 ADC_CH2
#define MY_ADC_CH3 ADC_CH3
#include "SRAM_functions.h"
void adc_init(void)
{
//Init ADC
struct adc_config adc_conf;
struct adc_channel_config adcch_conf;
adc_read_configuration(&MY_ADC, &adc_conf);
adc_set_conversion_parameters(&adc_conf, ADC_SIGN_OFF, ADC_RES_12, ADC_REF_BANDGAP);
//ADC_SIGN_OFF ==> /** Unsigned conversions. */
//ADC_RES_12 ==> /** 12-bit resolution, right-adjusted. */
//ADC_REF_BANDGAP ==> /** Internal 1 V from bandgap reference. */
adc_set_conversion_trigger(&adc_conf, ADC_TRIG_MANUAL, 1, 0);
//ADC_TRIG_MANUAL ==> /** Manually triggered conversions */
adc_set_clock_rate(&adc_conf, 100000UL); //veranderd!!
// adc_set_clock_rate(&adc_conf, 100000UL);//veranderd!!
adc_write_configuration(&MY_ADC, &adc_conf);
//Init ADC channel 0 ==> ADCCH_POS_PIN0 = PA0_ADC0
adcch_read_configuration(&MY_ADC, MY_ADC_CH, &adcch_conf);
adcch_set_input(&adcch_conf, ADCCH_POS_PIN0, ADCCH_NEG_NONE, 1);
adcch_write_configuration(&MY_ADC, MY_ADC_CH, &adcch_conf);
//Init ADC channel 1 ==> ADCCH_POS_PIN0 = PA0_ADC0
adcch_read_configuration(&MY_ADC, MY_ADC_CH1, &adcch_conf);
adcch_set_input(&adcch_conf, ADCCH_POS_PIN0, ADCCH_NEG_NONE, 1);
adcch_write_configuration(&MY_ADC, MY_ADC_CH1, &adcch_conf);
//Init ADC channel 2 ==> ADCCH_POS_PIN0 = PA0_ADC0
adcch_read_configuration(&MY_ADC, MY_ADC_CH2, &adcch_conf);
adcch_set_input(&adcch_conf, ADCCH_POS_PIN0, ADCCH_NEG_NONE, 1);
adcch_write_configuration(&MY_ADC, MY_ADC_CH2, &adcch_conf);
//Init ADC channel 3 ==> ADCCH_POS_PIN0 = PA0_ADC0
adcch_read_configuration(&MY_ADC, MY_ADC_CH3, &adcch_conf);
adcch_set_input(&adcch_conf, ADCCH_POS_PIN0, ADCCH_NEG_NONE, 1);
adcch_write_configuration(&MY_ADC, MY_ADC_CH3, &adcch_conf);
}
uint16_t ui16_Counter;
void read_ADC (void)
{
ui16_Counter = 0;
adc_enable(&MY_ADC);
adc_start_conversion(&MY_ADC, MY_ADC_CH);
//adc_wait_for_interrupt_flag(&MY_ADC, MY_ADC_CH);
//result = adc_get_result(&MY_ADC, MY_ADC_CH);
}
ISR(ADCA_CH0_vect) //Interrupt: ADCA_CH0_vect
{
uint16_t result;
uint8_t result_low;
uint8_t result_high;
//udi_cdc_putc(ui8_Counter);
//udi_cdc_putc(result_high);
//udi_cdc_putc(result);
result = adc_get_result(&MY_ADC, ADC_CH0);
result_high = result >> 8;
SRAM_WriteData(ui16_Counter, result);
}
ISR(ADCA_CH1_vect) //Interrupt: ADCA_CH1_vect
{
uint16_t result;
uint8_t result_low;
uint8_t result_high;
result = adc_get_result(&MY_ADC, ADC_CH1);
result_high = result >> 8;
SRAM_WriteData(ui16_Counter, result);
ui16_Counter = ui16_Counter + 1;
}
ISR(ADCA_CH2_vect) //Interrupt: ADCA_CH2_vect
{
uint16_t result;
uint8_t result_low;
uint8_t result_high;
result = adc_get_result(&MY_ADC, ADC_CH2);
result_high = result >> 8;
SRAM_WriteData(ui16_Counter, result);
ui16_Counter = ui16_Counter + 1;
}
ISR(ADCA_CH3_vect) //Interrupt: ADCA_CH3_vect
{
uint16_t result;
uint8_t result_low;
uint8_t result_high;
result = adc_get_result(&MY_ADC, ADC_CH3);
result_high = result >> 8;
SRAM_WriteData(ui16_Counter, result);
ui16_Counter = ui16_Counter + 1;
if (ui16_Counter < 8000 )
{
adc_start_conversion(&MY_ADC, MY_ADC_CH);
}
else
{
ui16_Counter = 8001;
}
}