Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: как загрузить данные в xram МК C8051F320
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > MCS51
NikP
Столкнулся с непонятным для меня явлением при работе с памятью c8051f320.
Полазил в разных форумах наткнулся на примерно похожие заморочки у других и проблему обошел.
Но метод мне не понравился, так что если кто сможет разъяснить что может происходить внутри контроллера, чтоб было понятно для середнячка в программировании и знании МК фирмы Силаб, а так же подсказать ,как выйти из данной ситуации, буду очень благодарен.
Задача практическая- надо выводить символы в графический ЖКИ.Решил поступить просто-
сформировать массивы [2]*[10] байт в памяти и выводить по мере необходимости в нужную область ЖКИ.
В даташите указано, что имеется 1024 байта XRAM, мне вполне хватает и половины.
Работаю с Cygnal IDE v 1_85.Когда скомпилировал,собрал(build) и запустил программу - все зависло. Выяснилось,что при формировании двух массивов программа работает как задумано(IDE показывает, что у меня xdata=144), а при добавлении еще одного массива (xdata=164)происходит зависание.
Чтоб не загромождать привожу основные моменты программы
//---------------------
// Global CONSTANTS
//----------------------

xdata unsigned char D0[2][10]={ {0xFC,..,0xFC},{0x3F,..,0x3F} };
xdata unsigned char D1[2][10]={ {..},{..} };
.
.
xdata unsigned char D20[2][10]={ {..},{..} };

//----------------------
// Main Routine
//-----------------------
void main(void)
{
PCA0MD &= ~0x40; // Disable Watchdog timer
Sysclk_Init();
Port_Init();
LCD_Init();

while (1)
{

WriteD(D0, 0);
WriteD(D1, 15);
WriteD(D2, 30);

.
.
}
}

Внес инициализацию D0[2][10]..D20[2][10] в модуль while (1){...} все заработало. Однако получается, что при этом программа выполняет заполнение массивов в каждом цикле, т.е. тратит уйму времени. Для моей задачи конечно пойдет, но как-то некрасиво.

Вопросы:
1.По какой причине может виснуть программа?
Зависание посмотрел в отладчике- размещал точки останова в разных местах программы. Однако в окошке, где программа расписана на си останов не происходит даже у строки PCA0MD &= ~0x40; В окошке дизассемблера видно, что маркер бегает по какому-то циклу, но в какой ветке я разобрать не смог.
2.Можно ли обойти грабли покрасивее?
barabek
Очень часто бывает, что срабатывает watchdog. Посмотрите при отладке регистр сброса (кажется C51 reg или что-то в этом роде во вкладке view) и сможете определить причину последнего сброса. Дело в том, что перед выполнением, грубо говоря, стороки main(void) еще подстегивается стандартный файл startup.a51. Он отвечает за инициализацию переменных. Соответственно чем их больше, тем больше вероятность не успеть отключить watchdog. Действия. Копируйте в папку с проектом указанный файл, добавляете его в проект с обязательной компиляцией. Далее добавляете строки :
Код
?C_STARTUP:    LJMP    STARTUP1

        RSEG    ?C_C51STARTUP

STARTUP1:    
;Начало добавочных строк
    ANL 0D9H, #0BFH ;сбрасываем вотчдог
;    mov 0b2h, #087h    ;запускаем ген на высокую скорость
;конец добавочных строк

IF IDATALEN <> 0

Только проверьте, потому что в моем примере строки для F410, у Вас могут быть другие адреса и нужные значения.
NikP
Большое спасибо barabek за дельный совет. Сделал вставку по Вашему совету, даже менять ничего не пришлось , и все заработало. Кроме прочего, порадовался , что живу в нашей стране: в Питере получить дельный совет из Владика - это круто !!
В порядке дополнения. В Cygnal IDE причину последнего сброса показывает регистр RSTSRC , что под кнопочкой - "8051"
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.