Миландр
http://forum.milandr.ru/

Запись в память программ в 1886ВЕ5БУ
http://forum.milandr.ru/viewtopic.php?f=4&t=2680
Страница 1 из 1

Автор:  hostage222 [ 2015-авг-18 15:04 ]
Заголовок сообщения:  Запись в память программ в 1886ВЕ5БУ

Здравствуйте. У меня возникли проблемы при записи данных в память программ в микроконтроллере 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

Автор:  oleg [ 2015-авг-31 12:41 ]
Заголовок сообщения:  Re: Запись в память программ в 1886ВЕ5БУ

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

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

Автор:  hostage222 [ 2015-сен-01 10:09 ]
Заголовок сообщения:  Re: Запись в память программ в 1886ВЕ5БУ

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 устанавливается вне приведённых функций. В качестве адреса для стирания строки передавались различные значения, в том числе и ноль. Но никакого стирания не происходит.

Автор:  oleg [ 2015-сен-01 16:24 ]
Заголовок сообщения:  Re: Запись в память программ в 1886ВЕ5БУ

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

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

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

Автор:  hostage222 [ 2015-сен-02 12:05 ]
Заголовок сообщения:  Re: Запись в память программ в 1886ВЕ5БУ

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

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

Автор:  oleg [ 2015-сен-02 13:52 ]
Заголовок сообщения:  Re: Запись в память программ в 1886ВЕ5БУ

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


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

Автор:  hostage222 [ 2015-сен-02 14:11 ]
Заголовок сообщения:  Re: Запись в память программ в 1886ВЕ5БУ

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

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

Автор:  Щассливчик [ 2016-май-18 23:28 ]
Заголовок сообщения:  Re: Запись в память программ в 1886ВЕ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 сразу после записи порции в ПП

//...

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/