SAS-1983 0 Posted May 17, 2008 · Report post Всем доброго времени суток. У меня проблема с определанием источника прерывания в AT91SAM7SE512. Дело в том, что яинициализирую АЦП и устанавливаю, что прерывание будет происходить только после окончания преобразования на одном из каналов. Но когда я смотрю регистр ADC_SR, то он мне все время показывает число 0x000E0000. В чем может быть проблема или я не туда смотрю? //------------------------------------------------------------------------------ /// Инициализация АЦП //------------------------------------------------------------------------------ void ADC0_Init(void) { // SHTIM = 3, STARTUP = 7, PRESCAL = 9, SLEEP = 0, LOWRES = 0, TRGSEL = 0, TRGEN = 0 AT91C_BASE_ADC->ADC_MR = ((SHTIM << 24) | (STARTUP << 16) | (PRESCAL << 8) | (SLEEP << 5) | (LOWRES <<4) | (TRGSEL << 1) | (TRGEN )); AT91C_BASE_PIOA->PIO_PER = (0x01 << 17) | (0x01 << 18) | (0x01 << 19); // Разрешает PIO управлять соответствующим выводом(отключает переферийное управление выводом) AT91C_BASE_PIOA->PIO_ODR = (0x01 << 17) | (0x01 << 18) | (0x01 << 19); // Отключаем выход на линии ввода/вывода AT91C_BASE_PIOA->PIO_IFER = (0x01 << 17) | (0x01 << 18) | (0x01 << 19); // Разрешаем входной фильтр помех на линии ввода/вывода AT91C_BASE_ADC->ADC_IER = (0x01 << 0) | (0x01 << 1) | (0x01 << 2); // Разрешить прерывание по окончании преобразования 0,1,2 || Разрешаем соответствующее прерывание AT91C_BASE_ADC->ADC_IDR = (0x01 << 19) | (0x01 << 18) | (0x01 << 17) | (0x01 << 16); AT91C_BASE_ADC->ADC_CHER = (0x01 << 0) | (0x01 << 1) | (0x01 << 2); // Разрешаем канал 0 и 1 и 2 AIC_ConfigureIT(AT91C_ID_ADC, 0, ISR_ADC0); // Конфигурирует прерывание, связанное с данным источником, используя указанный режим и обработчика прерываний. AIC_EnableIT(AT91C_ID_ADC); // Допускает прерываниям, исходящим из данного (уникального) источника. } //------------------------------------------------------------------------------ /// Обработчик прерывания ADC //------------------------------------------------------------------------------ static void ISR_ADC0(void) { unsigned short data_ADC0_0 = 0x00; unsigned short data_ADC0_1 = 0x00; unsigned short data_ADC0_2 = 0x00; if(AT91C_BASE_ADC->ADC_SR & 0x01) // окончание преобразования канала 0 { data_ADC0_0 = AT91C_BASE_ADC->ADC_CDR0; } if(AT91C_BASE_ADC->ADC_SR & 0x02) // окончание преобразования канала 1 { data_ADC0_1 = AT91C_BASE_ADC->ADC_CDR1; } if(AT91C_BASE_ADC->ADC_SR & 0x04) // окончание преобразования канала 2 { data_ADC0_2 = AT91C_BASE_ADC->ADC_CDR2; } } Разобрался с этой проблемой. Теперь возникла другая: у меня все время прерывание генерится по завершению преобразования нулевого канала. Это так и должно быть и как мне сделать, что бы срабатывало прерывание и по окончании преобразовании в других каналах? Quote Ответить с цитированием Share this post Link to post Share on other sites
DpInRock 0 Posted May 17, 2008 · Report post Вообще-то АЦП везде ОДИН. Входы - мультиплексируются. Номер входа никак не связан с завершением преобразования. АЦП глубоко наплевать по какому входу пришла аналоговая информация. Quote Ответить с цитированием Share this post Link to post Share on other sites
SAS-1983 0 Posted May 19, 2008 · Report post Вообще-то АЦП везде ОДИН. Входы - мультиплексируются. Номер входа никак не связан с завершением преобразования. АЦП глубоко наплевать по какому входу пришла аналоговая информация. Наплевать-то это понятно. Но у меня стоит задача в том, чтьо бы после того как обработчик прерывания зашел в функцию, мне нужно понять из какого канала считывать данные. Quote Ответить с цитированием Share this post Link to post Share on other sites
Сергей Борщ 0 Posted May 19, 2008 · Report post Наплевать-то это понятно. Но у меня стоит задача в том, чтьо бы после того как обработчик прерывания зашел в функцию, мне нужно понять из какого канала считывать данные.Там есть регистр, в котором хранится копия последнего результата. Т.е. считывать можно всегда из него. Quote Ответить с цитированием Share this post Link to post Share on other sites
SAS-1983 0 Posted May 19, 2008 · Report post Там есть регистр, в котором хранится копия последнего результата. Т.е. считывать можно всегда из него. Точно, забыл что есть такой регистр. Спасибо. Quote Ответить с цитированием Share this post Link to post Share on other sites