Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не изменяется значение переменной
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
OlegALL
Добрый день
Проблема: после изменения переменной в обработчике прерывания по приёму в UART в другой функции она не изменяется. Поставил volatile, как надо, отключал оптимизацию - не помогает.
Компилятор: AVR Studio 4.18, процессор ATMega 168 Код:
CODE
#include "main.h"

volatile unsigned int send_flag = 0;

int main (void){

init();

while (1){

//if (flags.send_answer == 1){
//send_flag = 1;
if (send_flag == 1){
// КОД НИЖЕ НЕ ИСПОЛНЯЕТСЯ
PORTC |= 1<<PC4;
}

}
}





ISR(USART_RX_vect){
send_flag = 1;
switch (rx_stage){
case WAITING_START:
if (UDR0 == REQUEST_START){
request[rx_stage] = UDR0;
rx_stage++;
}
break;

case WAITING_COMMAND:
request[rx_stage] = UDR0;
rx_stage++;
break;

case WAITING_LRC_HIGH:
request_lrc.byte.high = UDR0;
rx_stage++;
break;

case WAITING_LRC_LOW:
request_lrc.byte.low = UDR0;
rx_stage = 0;
debug();
//get_lrc();
if (request_lrc.two_bytes == 0x3b){
// приём завершён

}

//flags.send_answer = 1;


break;

default:
rx_stage = 0;
break;
}

}
Сергей Борщ
Зажгите светодиод в прерывании после send_flag = 1. Может в это место программа не попадает...
OlegALL
Сейчас в симуляторе работает, а в железе - нет
RabidRabbit
Я бы на месте контроллера не вылезал из прерывания, если пришедший байт приводит в ветку default: sm.gif Ну или там rx_stage изначально равен 0, в switch() не попали sm.gif Короче говоря, читайте в обработчике UDR обязательно, не то из прерывания не вылезете sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.