Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как внутри функции считать значение из ОЗУ МК?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
MaksimYrievich
Здравствуйте! Подскажите в чём проблема? Есть функция внутри которой необходимо прочитать значение из глобальной переменной т.е. из ОЗУ МК. В частности строчка i = StatusPrer;, где StatusPrer объявлена как unsigned char StatusPrer; в начале файла после всех инклюд. В общем вот фрагмент кода. А в приложении целиком.
CODE


unsigned char StatusPrer;

//********************************************************************
//Функция по длительности нажатия кнопки выбирает регистр команды
//********************************************************************
static void PressKeyDlit(void)
{
unsigned char KeyCod;
unsigned char i;
_delay_ms(10);
if((PINB & 0xF0) == 0xF0)
{ return;}
else
{TCNT1 = 0x0000;
TCCR1B |= (1<<CS00);}
StatusPrer = 0x00; //Вот здесь без проблем. При компиляции команда остается.
metka1:
wdt_reset();
KeyCod = PINB;
i = StatusPrer; //А вот то место которое упорно удаляется компилятором!!! Соответственно
if(i == 0xFF) //ниже ничего не работает.
{goto metka2;}
else
{wdt_reset();}

if((PINB & 0xF0) != 0xF0)
{goto metka1;}
else
{}
metka2: TCCR1B &= ~(1<<CS00);

if(i == 0xFF)
{_delay_ms(10);
CommandKeyHigh(KeyCod);
return;}
else
{CommandKeyDown(KeyCod);}
}
sergeeff
Объявите:

Код
volatile unsigned char StatusPrer;
mempfis_
У Вас StatusPrer объявлен и в приведённом фрагменте меняется только в одном месте.
Объявите его для начала как volatile чтобы компилятор не оптимизировал доступ к нему.
Если по умолчанию значение StatusPrer = 0, и в Вашем фрагменте ему присваивается 0 то компилятор решил что его значение константное и всегда равно 0.
Поэтому и выкинул ненужный кусок кода. Ещё i=StatusPer может быть оптимизирована из-за того что прочитав его значение в i Вы пытаетесь исп. его для условия if. Компилятор волне мог считать значение в регистр и не использовать переменную i которая могла-бы быть расположенной в стеке. Объявите i volatile если хотите чтобы обмен шёл именно через i.

пока писал ответ sergeeff уже дал ответ sm.gif
Xenia
Вы приравниваете StatusPrer нулю:
StatusPrer = 0x00;
после чего компилятор видит, что i всегда тоже нуль:
i = StatusPrer;
А раз так и отказывется проверять фантастические условия:
if(i == 0xFF)
которые очевидно никогда не выполняются.

Предположу, что вы хотели, чтобы StatusPrer = 0x00 было внутри условия else{}, но закрыли блок слишком рано.
MaksimYrievich
Цитата(sergeeff @ Aug 10 2011, 21:33) *
Объявите:

Код
volatile unsigned char StatusPrer;

Да на самом деле сработало. А поясните пожалуйста сей прибамбас. То есть как я понял надо изначально объявлять такие переменные как "volatile". Так сказать сразу компилятору объяснить, что мол не смей даже прикасаться к модернизации кода, связанного с этой переменной. Правильно я Вас понял?

Цитата(Xenia @ Aug 10 2011, 21:41) *
Предположу, что вы хотели, чтобы StatusPrer = 0x00 было внутри условия else{}, но закрыли блок слишком рано.

На самом деле это не имеет значения. Дай БОГ ВАМ всем доброго здоровья! Тема закрыта.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.