Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2017-дек-11 10:24

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
СообщениеДобавлено: 2015-авг-18 15:04 
Не в сети

Зарегистрирован: 2015-апр-30 10:03
Сообщения: 6
Здравствуйте. У меня возникли проблемы при записи данных в память программ в микроконтроллере 1886ВЕ5БУ. При этом чтение выполняется ожидаемо - корректно читаются данные из памяти программ, записанные программатором. Запись данных я реализовал в соответствии с главой "Запись таблиц во внутреннюю память" в даташите на микроконтроллер. Далее приведён исходный код программы, показывающей используемый мной подход. Укажите, пожалуйста, на ошибки.
Код:
#include <1886VE5.h>
#include "int17xxx.h"
#pragma origin 0x8

interrupt iServer(void)
{
    multi_interrupt_entry_and_save

PERIPHERAL_service:
TMR0_service:
    // save on demand: PRODL,PRODH,TBLPTRH,TBLPTRL,FSR0,FSR1
    /* process Timer 0 interrupt */
    // T0IF is automatically cleared when the CPU vectors to 0x10
    // restore on demand: PRODL,PRODH,TBLPTRH,TBLPTRL,FSR0,FSR1
T0CKI_service:
INT_service:
    interrupt_exit_and_restore
}

//Функции вывода
...

void read_program_memory(uns16 address, uns8 *low, uns8 *high)
{
    TBLPTR = address;
    readLU();         //TABLRD 0,0,DUMMY
   
    *low = readL();   //TLRD 0,(*low)
    *high = readH();  //TLRD 1,(*high)
}

void write_program_memory(uns16 address, uns8 low, uns8 high)
{
    TBLPTR = address;
   
    writeL(low);      //TLWT 0,low
    writeHU(high);    //TABLWT 1,0,high
   
    T0IF = 0;
}

void main(void)
{   
    //Таймер 0
    T0CS = 1; //Внутрення тактовая частота
    T0PS0 = 0; T0PS1 = 1; T0PS2 = 1; T0PS3 = 0; //Делитель на 64
    //16e6 / 4 / 64 / 0xFFFF ~ 0.95 Гц, T ~ 1 секунда >> 5 миллисекунд
   
    //UART
    ...
   
    //EEPROM
    EE_DIV = 255; //выставлен максимум,
    //достаточно 5e-3 / 906 * 16e6 ~ 88.30 ~ 89
   
    //Прерывание от таймера 0 включено,
    //используется для прекращения процедуры "долгой записи"
    T0IE = 1;
   
    uns8 low = 0xFF;
    uns8 high = 0xFF;
    print_string("Write 0xFFFF\n");
    write_program_memory(0x100, low, high);
   
    print_string("Read  0x");
    read_program_memory(0x100, &low, &high);
    print_num_hex(high);
    print_num_hex(low);
    print_char('\n');

    while (1) {}
}

Результат работы программы:
Код:
Write 0xFFFF                                                                   
Read  0x0000


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-авг-31 12:41 
Не в сети

Зарегистрирован: 2009-май-25 16:41
Сообщения: 206
Откуда: АО "ПКК Миландр"
hostage222 писал(а):
Здравствуйте. У меня возникли проблемы при записи данных в память программ в микроконтроллере 1886ВЕ5БУ. При этом чтение выполняется ожидаемо - корректно читаются данные из памяти программ, записанные программатором. Запись данных я реализовал в соответствии с главой "Запись таблиц во внутреннюю память" в даташите на микроконтроллер. Далее приведён исходный код программы, показывающей используемый мной подход. Укажите, пожалуйста, на ошибки.

Микроконтроллер 1886ВЕ5 содержит аппаратную защиту от записи в память программ. К сожалению это выпало из спецификации. Для записи в память программ, непосредственно перед операцией записи, необходимо подать на вывод "TEST" логическую единицу, а после выполнения записи подать на этот вывод ноль. Это снимает блокировку записи. Необходимо учесть, что нельзя постоянно подавать на этот вывод единицу, т.к. в этом случае при старте микроконтроллер будет уходить в тестовый режим.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-сен-01 10:09 
Не в сети

Зарегистрирован: 2015-апр-30 10:03
Сообщения: 6
oleg писал(а):
Микроконтроллер 1886ВЕ5 содержит аппаратную защиту от записи в память программ. К сожалению это выпало из спецификации. Для записи в память программ, непосредственно перед операцией записи, необходимо подать на вывод "TEST" логическую единицу, а после выполнения записи подать на этот вывод ноль. Это снимает блокировку записи. Необходимо учесть, что нельзя постоянно подавать на этот вывод единицу, т.к. в этом случае при старте микроконтроллер будет уходить в тестовый режим.

Спасибо за ответ. Запись заработала. Также удалось реализовать стирание младшего и старшего секторов памяти. Но аналогичный код по стиранию строки из 16 слов не работает. Укажите, пожалуйста, на причину ошибки.
Рабочий код для стирания секторов:
Код:
void erase_sector(char high)
{   
    TBLPTR = 0;
    if (high)
    {
        EECONH = 0x08; //EEBL = 1
    }
    else
    {
        EECONL = 0x08; //EEBH = 1
    }
   
    start_timer();  //Timer0 16 ms
    writeL(0);      //TLWT 0,0
    writeHU(0);     //TABLWT 1,0,0
}

Нерабочий код для стирания строки из 16 слов:
Код:
void erase_string(uns16 address)
{
    TBLPTR = address;
    if (address >= 2048)
    {
        EECONH = 0x04; //EERL = 1
    }
    else
    {
        EECONL = 0x04; //EERH = 1
    }
   
    start_timer();  //Timer0 16 ms
    writeL(0);      //TLWT 0,0
    writeHU(0);     //TABLWT 1,0,0
}

Логическая единица на входе TEST устанавливается вне приведённых функций. В качестве адреса для стирания строки передавались различные значения, в том числе и ноль. Но никакого стирания не происходит.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-сен-01 16:24 
Не в сети

Зарегистрирован: 2009-май-25 16:41
Сообщения: 206
Откуда: АО "ПКК Миландр"
hostage222 писал(а):
oleg писал(а):
Микроконтроллер 1886ВЕ5 содержит аппаратную защиту от записи в память программ. К сожалению это выпало из спецификации. Для записи в память программ, непосредственно перед операцией записи, необходимо подать на вывод "TEST" логическую единицу, а после выполнения записи подать на этот вывод ноль. Это снимает блокировку записи. Необходимо учесть, что нельзя постоянно подавать на этот вывод единицу, т.к. в этом случае при старте микроконтроллер будет уходить в тестовый режим.

Спасибо за ответ. Запись заработала. Также удалось реализовать стирание младшего и старшего секторов памяти. Но аналогичный код по стиранию строки из 16 слов не работает. Укажите, пожалуйста, на причину ошибки.

У меня эта функция тоже нормально не работает. При переборе различных вариантов управления автоматом стирания, максимум что я получил - это стирание строки с зависанием процессора. Но такой вариант не следует применять в изделиях. Думаю, что эта функция просто не предназначена для применения в пользовательских программах.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-сен-02 12:05 
Не в сети

Зарегистрирован: 2015-апр-30 10:03
Сообщения: 6
oleg писал(а):
У меня эта функция тоже нормально не работает. При переборе различных вариантов управления автоматом стирания, максимум что я получил - это стирание строки с зависанием процессора. Но такой вариант не следует применять в изделиях. Думаю, что эта функция просто не предназначена для применения в пользовательских программах.

К сожалению, без этой функции применение самостоятельной модификации кода программы будет сильно ограничивать доступную для использования память программ. Придётся хранить постоянную часть прошивки (загрузчик) и изменяемую часть прошивки (рабочая программа) в разных секторах. Таким образом, доступная память для рабочей программы будет равна (без учёта бит конфигурации) не 4096 слов минус размер загрузчика, а 2048 слов. Но в любом случае спасибо за полный и своевременный ответ.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-сен-02 13:52 
Не в сети

Зарегистрирован: 2009-май-25 16:41
Сообщения: 206
Откуда: АО "ПКК Миландр"
hostage222 писал(а):
К сожалению, без этой функции применение самостоятельной модификации кода программы будет сильно ограничивать доступную для использования память программ. Придётся хранить постоянную часть прошивки (загрузчик) и изменяемую часть прошивки (рабочая программа) в разных секторах. Таким образом, доступная память для рабочей программы будет равна (без учёта бит конфигурации) не 4096 слов минус размер загрузчика, а 2048 слов. Но в любом случае спасибо за полный и своевременный ответ.


Если не хватает памяти, то можно сделать два загрузчика, в каждой странице и передавать управление. Если в старшей странице загрузчик (или GOTO на него) разместить в самом начале, то он будет стартовать при стертой младшей странице (т.к. код 0000h это NOP).


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2015-сен-02 14:11 
Не в сети

Зарегистрирован: 2015-апр-30 10:03
Сообщения: 6
oleg писал(а):
Если не хватает памяти, то можно сделать два загрузчика, в каждой странице и передавать управление. Если в старшей странице загрузчик (или GOTO на него) разместить в самом начале, то он будет стартовать при стертой младшей странице (т.к. код 0000h это NOP).

Интересный совет. При нехватке памяти обязательно воспользуемся.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2016-май-18 23:28 
Не в сети

Зарегистрирован: 2016-мар-16 19:08
Сообщения: 5
Здравствуйте!
Возникли вопросы при записи данных в память программ микроконтроллера 1886ВЕ5БУ.
В очищенную младшую половину памяти программ микроконтроллера на плате EVAL12A
записываются данные, поступающие из компьютера по 8 байт.
Выход PORTC.5 соединён в схеме со входом TEST для снятия блокировки записи ПП
логической единицей.
Небольшой массив данных записывается без проблем.
Но массив из нескольких сотен байт (точнее 3840 байт) обычно записать не удаётся,
т.к. микроконтроллер виснет.
Зависание всегда происходит на встроенной функции
writeHUInc(mReadCAN[ii]); ,
что видно по линейке светодиодов: всегда срабатывает Leds(2).

Укажите, пожалуйста, что ещё здесь не учтено.
Заранее благодарю.

uns8 quant_byte = 8;
int8 ii;
//...
//Запись
PORTC.5 = 1; //TEST = 1 для снятия блокировки записи ПП
ii = 0;
while (ii < quant_byte)
{
T0IE = 1; //Запуск Т0 для "длинной записи", EE_DIV = 90 (достаточно 89)
Leds(1); //отладочный вывод на линейку светодиодов платы
writeL(mReadCAN[ii]);
ii += 1;
Leds(2);
writeHUInc(mReadCAN[ii]); // собственно запись слова в ПП
Leds(3);
T0IF = 0; //конец "длинной записи" - сброс флага таймера
}
PORTC.5 = 0; //TEST = 0 сразу после записи порции в ПП

//...


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB