RabidRabbit, а не всё ли равно, с какой частотой следуют прерывания. Логика кода такая: сначала запускается ЦАП (как только выбран и включён канал, цап начинает работать автоматом, выдавая раз в 25 циклов прерывание о завершении преобразования). Затем запускается автокалибровка АЦП. Когда она завершится процессор уйдёт в прерывание и далее я считав регистр строчками
Код
volatile int IRQ_sense = 0;
IRQ_sense = ADC -> ADC_ISR & (ADC_IER_EOCAL | ADC_IER_EOC5);
сбрасываю флаги прерывания (сбрасываются при чтении) и определяю от чего прерывание - конец калибровки или конец преобразования. Затем строчкой
Код
ADC -> ADC_CR = ADC_CR_START;
запускаю АЦП на преобразование. Даже если где то прерывания и пересекутся, то у ЦАП приоритет ниже чем у АЦП и он подождёт, пока тот отработает.
Цитата
возникло прерывание, а дальше? флаг наличия прерывания надо снять или он снимается чтением регистра?
Да, строчками
Код
IRQ_sense = ADC -> ADC_ISR & (ADC_IER_EOCAL | ADC_IER_EOC5);
IRQ_sense = DACC -> DACC_ISR;
Флаг сбрасывается при чтении регистров.
Цитата
Я не понял, что это за фильтр и как он работает или не работает, так что о причинах сбоев гадать не берусь.
Лампочки сдесь не причём. С сужу по наличию/отсутствию сигнала, который наблюдаю осциллографом. При правильной работе и лампочки должны мигать и сигнал быть... А там что то одно
Цитата
А где NVIC_SetPriority (ADC_IRQn, ?);
Да, я не повышаю приоритет АЦП, я понижаю приоритет ЦАП.
Цитата
Где проверка на готовность DACC к преобразованию?
Когда выдаётся прерывание о завершении преобразования ЦАП готов. Если бы он не был готов, то строчки кода фильтра помещённые в подпрограмму обработки прерывания с АЦП так же не отрабатывались бы.
Сообщение отредактировал Грендайзер - Aug 5 2015, 14:53