Кто поможет с столь непонятной для меня ситуацией? Не присваивается аргумент в прерывании. 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
Artem
Где код инициализации таймера?
Nikolay
Посмотри объявление OCR2 в заголовочном файле. Возможно этот регистр без volatile. Ну или вообще отключи оптимизацию для проверки.
Aleksey
OCR2 не объявлена
Nikolay
Всмысле не объявлена???
Aleksey
её нельзя объявить, ругается. Она объявлена в библиотеке прерываний как ей надо
Nikolay
Она объявлена в заголовочном файле. Где именно - смотри инклюды.
Aleksey
там объявлен dimming OCR2 = dimming;
Nikolay
отключи оптимизацию. Может поможет.
Aleksey
отключал, объём кода превышает объём памяти МК может кстати поэтому он его так оптимизирует
Nikolay
volatile unsigned int dimming = 150; volatile unsigned int *OCR22; OCR22 = &OCR2; Попробуй объявить и присвоить переменной указатель на OCR2. Переменная будет volatile но работать придется как с адресом т.е. через разыменование. Костыль но должно помочь.
Aleksey
Сейчас попробую OCR22 = &OCR2; а это где писать? если в прерывании чёт я думаю ругаться будет