У меня глупый вопрос про ХС8 ))
Берет ли компилятор на себя все связанное с банками, правильным размещением переменных в памяти и прочим?
Дело в том, что у меня в программе происходят странности с кодом, переполнение стека при определенных обстоятельствах и ветвление кода в непредсказуемые места. PIC16F876A.
Итак, имеются 2 массива. Первый из них - одномерный const unsigned char SYM[16] содержит символы 7-сегментника. Второй - двухмерный signed char [11][2]. Нулевой столбец последнего содержит цифры (0...9), а в первом располагаются соответствующие им символы для выдачи на индикатор. В процессе работы программы цифры могут меняться пользователем, каждое изменение цифры в нулевом столбце тут же сопровождается подбором его символа в первом столбце командой
dsp[dig][1] = SYM[dsp[dig][0]];
С этим проблем нет.
При старте программы последние введенные цифры загружаются из ЕЕПРОМ (num_load), преобразовываются в символы (dig2sym) и выводятся на дисплей.
Код: Выделить всё
void num_load (void)
{
static unsigned char a = 0;
EEPGD = 0; // Выбор ЕЕПРОМ области
while (a < 11)
{
EEADR = a;
RD = 1; // Запуск чтения
dsp[a][0] = EEDATA; // Сохранение
a++;
}
}
Код: Выделить всё
void dig2sym (void)
{
static unsigned char a = 0;
while (a < 11)
{
dsp[a][1] = SYM[dsp[a][0]];
a++;
}
}
Так вот совместно они не работают. Чтение из ЕЕПРОМ происходит, а когда дело доходит до преобразования, программа начинает уходить в такие дебри, где ее никто не ждал. Шагал по ассемблерному коду в Протеусе, но он скорее всего не виноват, ибо код такой получается.
Если же я обхожу чтение из ЕЕПРОМ (// num_load), и назначаю цифры вручную, то преобразование (dig2sym) работает нормально. Оно также работает нормально, если комментирую только одну строку:
dsp[a][0] = EEDATA.
Пробовал делать и через указатели с тем же успехом, но эта тема для меня пока малопонятная, так что пока решил в лес не углубляться. Оптимизацию отключал. Не вариант.
Сижу со вчерашнего вечера в ступоре и пытаюсь поумнеть. Поможете?

Каждый имеет право на свое личное ошибочное мнение.
У меня было тяжелое детство - я до 14 лет смотрел черно-белый телевизор.