Поскольку опыт программирования МК-ров у меня на данный момент очень мал, и никакой сверхзадачи данная проблема не представляет - почти уверен, что я не учел какую-то банальную вещь.
Итак, не удается запустить на плате с at91sam7s256 прерывание по окончанию преобразования ADC.
Везде в сети встречаю примеры наподобие такой работы с АЦП:
Код
AT91F_ADC_StartConversion (AT91C_BASE_ADC); //старт преобразования
while (!((AT91F_ADC_GetStatus (AT91C_BASE_ADC)) & (1<<AT91C_ADC_CH0))); //подождать, пока преобразуется
AT91F_ADC_GetConvertedDataCH0; //закончилось преобразование - получить данные
в таком варианте работает - стартует, преобразует, получает данные.
Но, надо по нормальному сделать так:
Код
....
AT91F_ADC_StartConversion (AT91C_BASE_ADC); // вызов преобразования откуда-то из глубин кода
....
void ADC_interrupt_handler(void){ //прерывание, вызываемое по окончанию преобразования АЦП
var = AT91F_ADC_GetConvertedDataCH4 (pADC);
}
мой код:
Код
void Init_ADC(){ //Инициализация Ацп
pADC= AT91C_BASE_ADC;
AT91F_ADC_SoftReset(pADC);
//AT91F_ADC_CfgPIO(); //может это и не надо? - с ним, без него пробовал
AT91F_ADC_CfgPMC();// это то же, что и AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_ADC ); //заводим АЦП
AT91F_ADC_CfgModeReg(AT91C_BASE_ADC,ADC_Mode); //с этими установками
AT91F_ADC_DisableChannel(pADC, 255); //деактивация всех каналов ADC
AT91F_ADC_EnableChannel(pADC, ADCCH_Use); //активация нужных нам каналов ADC
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_ADC, ADC_INTERRUPT_LEVEL, AT91C_AIC_SRCTYPE_POSITIVE_EDGE, ADC_interrupt_handler);
AT91F_ADC_EnableIt(pADC,ADCCH_Use); //активизируем прерывание по окончании преобразования нужных каналов каналов
AT91F_ADC_StartConversion(pADC);
}
/*
примечание - ADC_Mode определяется так:
TRGEN (0x0) // Software triggering
TRGSEL (0x0) // Without effect
LOWRES (0x0) // 10-bit result output
SLEEP (0x0) // Normal Mode
mck_clock 48 // in MHz
adc_clock 5 // in MHz
startup_time 21 // in us
sample_and_hold_time 800 //700 in ns
PRESCAL ((unsigned int) mck_clock/(2*adc_clock) - 1)
STARTUP ((unsigned int) adc_clock*startup_time/8 - 1)
SHTIM ((unsigned int) adc_clock*sample_and_hold_time/1000 - 1) //(0x3)
ADC_Mode ((SHTIM << 24) | (STARTUP << 16) | (PRESCAL << 8) | (SLEEP << 5) | (LOWRES <<4) | (TRGSEL << 1) | (TRGEN ))
*/
void ADC_interrupt_handler(void){ //не вызывается!!!
//здесь некоторые действия, кои должен совершить, и я сразу увидеть, что попалъ сюда
}
пробую пока только на одном ADC (4)