реклама на сайте
подробности

 
 
> Не изменяется значение переменной
OlegALL
сообщение Jan 23 2014, 04:21
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 70
Регистрация: 30-11-10
Пользователь №: 61 275



Добрый день
Проблема: после изменения переменной в обработчике прерывания по приёму в 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;
}

}


Сообщение отредактировал IgorKossak - Jan 23 2014, 10:22
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
Сергей Борщ
сообщение Jan 23 2014, 05:03
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Зажгите светодиод в прерывании после send_flag = 1. Может в это место программа не попадает...


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
OlegALL
сообщение Jan 23 2014, 05:16
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 70
Регистрация: 30-11-10
Пользователь №: 61 275



Сейчас в симуляторе работает, а в железе - нет
Go to the top of the page
 
+Quote Post
RabidRabbit
сообщение Jan 23 2014, 07:13
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 397
Регистрация: 3-12-09
Из: Россия, Москва
Пользователь №: 54 040



Я бы на месте контроллера не вылезал из прерывания, если пришедший байт приводит в ветку default: sm.gif Ну или там rx_stage изначально равен 0, в switch() не попали sm.gif Короче говоря, читайте в обработчике UDR обязательно, не то из прерывания не вылезете sm.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 16:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01372 секунд с 7
ELECTRONIX ©2004-2016