Имеется F042k6u6
К нему подключеан аналоговый мультиплексор HEF4051B. Он мультиплексирует аналоговые сигналы с 6 (на схеме есть 7 - не юзаю) ножек на 1 в ADC контроллера. (Схема старая, поэтому грязь и ужас, не обращайте внимания)

Частота смены 333Hz, что более чем норм.
Код следующий:
Опрос ADC 333Hz просто в таймере:
Код
if(ADC1->ISR&ADC_ISR_ADRDY)ADC_start;
Вот обработчик прерывания:
Код
void ADC1_IRQHandler(void)
{
static byte ADCChan=0;
//static byte last;
if(ADC1->ISR&ADC_ISR_EOC)
{
ADCVal[ADCChan++]=ADC1->DR;
if(ADCChan>5)
{
ADCChan=0;
ADC_ready=true;
}
GPIOB->BRR=7;
GPIOB->BSRR=ADCChan;
}
}
Вот осциллограмма:

Зеленый - аналоговый сигнал
Желтый - бит 1
Голубой - бит 2
Фиолетовый - бит 3
Смотрите - я при каждом прерырвании инкрементирую канал и выставляю его, но у меня выставляются следующие значения канала:
0
1
0
1
2
3
4
5
Почему я так и не смог понять. Проблема решилась очень странно - я добавил в функцию переменную last (я хотел через нее было тестить, но обнаружил что с ней работает норм). В итоге если она закомменчена -
не работает, а если присутствует, то
работает. Хотя сам компилятор ее оптимизирует и хекс остается
одинаковым - проверен побайтно через STlink utility.
Как это понимать? Первоапрельский розыгрыш?
ps. причем last должен обязательно быть static, иначе не работает
Сообщение отредактировал ЯadiatoR - Apr 1 2016, 08:33