Кто поможет с столь непонятной для меня ситуацией? Не присваивается аргумент в прерывании. volatile unsigned int dimming = 150; ISR (TIMER2_COMP_vect) { TCCR2 &= ~0b00000110; OCR2 = dimming; // присваивает 150 сначала из тела MAIN не присваивается если не прописать OCR2 = dimming; } int main(void) { ............ dimming = 40; // так НЕ работает dimming = 40; // так работает OCR2 = dimming; for (;;) { ......... ......... } return 0; }

Комментарии: 12

  1. Artem

    Где код инициализации таймера?

  2. Nikolay

    Посмотри объявление OCR2 в заголовочном файле. Возможно этот регистр без volatile. Ну или вообще отключи оптимизацию для проверки.

    • Aleksey

      OCR2 не объявлена

      • Nikolay

        Всмысле не объявлена???

        • Aleksey

          её нельзя объявить, ругается. Она объявлена в библиотеке прерываний как ей надо

          • Nikolay

            Она объявлена в заголовочном файле. Где именно - смотри инклюды.

            • Aleksey

              там объявлен dimming OCR2 = dimming;

              • Nikolay

                ‍ отключи оптимизацию. Может поможет.

                • Aleksey

                  отключал, объём кода превышает объём памяти МК может кстати поэтому он его так оптимизирует

  3. Nikolay

    volatile unsigned int dimming = 150; volatile unsigned int *OCR22; OCR22 = &OCR2; Попробуй объявить и присвоить переменной указатель на OCR2. Переменная будет volatile но работать придется как с адресом т.е. через разыменование. Костыль но должно помочь.

    • Aleksey

      Сейчас попробую OCR22 = &OCR2; а это где писать? если в прерывании чёт я думаю ругаться будет

Не нашли ответ?

Вам также может быть интересно