Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » От WinAVR текут мозги!

Страниц (1): [1]
 

1. redcat - 27 Января, 2009 - 20:53:26 - перейти к сообщению
Не изменяется ГЛОБАЛЬНАЯ ПЕРЕМЕННАЯ в обработчике прерывания!!!!!!



int a=0;
DDRD = 0b00010000; // PD4 - выход (на этом порту светодиод)
PORTD = 0b00000000;// на всякий случай гасим свет


SIGNAL(USART0_RXC){ // прерывание по приёму символа
// ПРЕРЫВАНИЕ СРАБАТЫВАЕТ !!!

PORTD = 0b00010000;// светодиод зажигается и остаётся гореть
a++; // a=a+1 - увеличивает "а" на один

}


int main(void){

while(1){
; //По идее каждый раз при прерывании USART0_RXC "а" должно увеличиваться!?
; // но "а" остаётся = 0
; //цикл продолжается!

}

}
2. бот_м_16 - 27 Января, 2009 - 21:27:03 - перейти к сообщению
Замешательство
пользуйся CVAVR
3. Белый Волк - 27 Января, 2009 - 22:15:02 - перейти к сообщению
redcat
Используется ли переменная a где-либо ещё в программе? Если нет, проверьте степень оптимизации в настройках компилятора - возможно при компиляции обработка неиспользуемой далее переменной опускается.
4. redcat - 27 Января, 2009 - 22:27:19 - перейти к сообщению
Я присваивал переменной разные значения при инициализации. Сейчас попробую в main задать параметр.
5. Белый Волк - 28 Января, 2009 - 08:07:34 - перейти к сообщению
При прерывании флаг I в регистре SREG очищается. Попробуйте в теле прерывания после всех действий поставить глобальное разрешение прерываний при помощи sei()
6. redcat - 28 Января, 2009 - 09:27:44 - перейти к сообщению
Глобальное разрешение устанавливал, в общем проблема решена. Мотайте все на УС -
перед обьявлением переменной, которая будет менаться в прерывании используйте функцию VOLATILE.
Напр. volatile int peremennaja