STM8, ADC, прерывания - подземные стуки

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Аватара пользователя
NiTr0
Друг Кота
Сообщения: 3051
Зарегистрирован: Пт авг 10, 2007 12:49:55
Откуда: kr.ua
Контактная информация:

STM8, ADC, прерывания - подземные стуки

Сообщение NiTr0 »

внезапно обнаружил, что у меня на STM8S003 отказывается работать прерывание АЦП в SCAN режиме. в более другом проекте, откуда дергал код (в т.ч. работы с АЦП), все гладко и шелковисто, но компилировалось более старой версией sdcc несколько лет назад.

после долгих часов безуспешного дебага имеем следующее:
CSR = 0x24 при инициализации, потом становится 0x20; CR1 = 0x1; CR2 = 0x0A; CR3 = 0.

код инициализации:

Код: Выделить всё

    GPIOD->DDR &= ~(1<<2 | 1<<3);
    GPIOD->CR1 &= ~(1<<2 | 1<<3);
    GPIOD->CR2 &= ~(1<<2 | 1<<3);

    ADC1->CR1 = 0;
    ADC1->CR2 = ADC1_CR2_ALIGN | ADC1_CR2_SCAN;

    ADC1->TDRH = 0;
    ADC1->TDRL = (1<<3) | (1<<4);
    ADC1->CSR = ADC1_CSR_EOCIE | 4;
запуск по таймеру:

Код: Выделить всё

    if (!calculate_started) {
        ADC1->CSR = ADC1_CSR_EOCIE | 4;
        ADC1->CR1 |= ADC1_CR1_ADON;
    }
    calculate_started = 1;
прерывание:

Код: Выделить всё

 INTERRUPT_HANDLER(ADC1_IRQHandler, 22)
 {
    calculate_started = 0;
    //ADC1->CSR = ~(ADC1_CSR_EOC | ADC1_CSR_AWD);
    ADC1->CSR = 0;
    LED_PORT->ODR ^= LED_PIN;
 }
запуск цикла преобразования отрабатывает, calculate_started - висит единица. прерывания - нет...

Добавлено after 1 hour 31 minute 3 seconds:
таки да, протупил и невнимательно прочитал мануал, надо дважды в CR0 записать единичку...
Реклама
Ответить

Вернуться в «Разные вопросы по МК»