Миландр

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

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




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
СообщениеДобавлено: 2017-янв-05 19:56 
Не в сети

Зарегистрирован: 2016-мар-16 19:08
Сообщения: 5
//Накропал, работает, решил поделиться, а то каникулы - скучно, девочки.
//Описаны функции стирания младшей половины памяти программ (ПП),
//записи в ПП 8 байт и чтения из ПП тех же 8 байт для контроля записанного.
//Функции работают в микроконтроллере 1886ВЕ5
//и предназначены для работы в CAN-bootloader.
//Программа написана в среде IDE for 1886 MCU Series с компилятором сс7а
//Fосц = 16 МГц
//БЛ - бутлодер (бутлоадер, бутлоудер) от bootloader, а лучше всего
//произносится - бутлодырь.

//Для начала некоторые определения и объявления из main
//и вызовы показываемых функций. Это, может быть, покажется лишним.
#define ctmr0h 0xAC //Определение константы для настройки старшего байта
//таймера Т0 на переполнение через ~5,2 мс для выдержки
//"длинной записи". Для перестраховки настройка на 5%
//больше, чем надо. На младший байт Т0 плюём.

#define signal_Test PORTA.4 //сигнал разблокировки записи памяти программ (ПП):
//на плате соединены выход РORTА4 со входом Test - обращаю на это ваше внимание!
...
#pragma origin 0x800 //старшая половина ПП -
...
char mReadCAN[8]; //массив для приёма байтов из CAN
char mReadPM[8]; //массив байтов, прочитанных из ПП
...
void main() //- в которой расположена main
{
...
CleanPM(); //ф-я стирания младшей половины ПП.
read8byte(0); //начиная с 0 адреса чтение 8 байт из ПП для отправки
... //в ответном фрейме CAN
//При получении очередной порции (8 байт) данных из CAN запись этих данных в ПП:
adres = ...; //Начальный адрес для записи в ПП
while(...)
{Блок записи-чтения порции
...
write8byte(adres); //Прошиваются 8 байт в ПП, начиная с adres,
read8byte(adres); //читаются 8 байт из ПП, начиная с adres, для отправки.
adres += 4; //Для следующего захода в блок записи увеличивается адрес
...
}//конец блока записи-чтения порции
...
}//End void main()

//// Прерывания разрешаются после окончания работы бутлодыря,
//// когда вектора будут прошиты вместе с прикладной функцией
****************************************************************
//========================================
//Дальше - тексты функций, которые хочу показать.
//========================================
//Стирание только младшей половины ПП. В старшей находится бутлодырь.
void CleanPM(void)
{
EECONL = 0x08; //бит стирания младшей половины ПП
T0IF = 0;

signal_Test = 1; //разблокировка записи
writeL(0); //Встроенная функция в компиляторе сс7а [1, c34]
TMR0H = ctmr0h ; //Таймер Т0 отсчитает ~5 мс,
T0IE = 1; //однако, прерывания запрещены GLINTD = 1;
writeHU(0x00); //Встроенная функция в компиляторе сс7а [1, c34]
T0IF = 0; //при установке флага переполнения таймера флаг сбрасывается
signal_Test = 0; //блокировка по окончании стирания
}//void CleanPM(void)

/////////////////////
////Запись в ПП 8 байт из массива, полученного из буфера CAN, по текущему адресу
void write8byte(uns16 adr)
{
//Фиктивная запись - signal_Test для неё не нужен
TBLPTR = adr; //Указатель адреса ПП
writeL(mReadCAN[0]); //младший байт в защёлку. [1, c34]
TMR0H = 0xFE; //"укороченная длинная запись"
T0IE = 1; //Разрешение прерывания от Т0, но прерывания запрещены! GLINTD = 1
writeHU(mReadCAN[1]); //Старший байт. Во время "длинной записи" процессор стоит. [1, c34]
T0IF = 0; //сброс флага таймера Т0. Однако, прерывание было запрещено.
//После переполнения таймера процессор продолжит работу
// Запись 8 байт (действительная в отличие от фиктивной)
signal_Test = 1; //Та самая разблокировка
char ii = 0; // прошивка в цикле 8 байт//
while (ii < 8)
{
writeL(mReadCAN[ii]);//младший байт в защёлку из массива принятых из CAN 8 байтов. [1, c34]
ii += 1;
TMR0H = ctmr0h; // Ст байт Т0 на длинную запись 5 мс
T0IE = 1; //Разрешение прерывания от Т0
writeHUInc(mReadCAN[ii]); //Старший байт данных. Автоматический инкремент TBLPTR на слово
T0IF = 0; //Сброс флага переполнения Т0
ii +=1;
} //END while (ii < 8)
signal_Test = 0; //Блокировка по окончании записи.
}//end void write8byte

/////////////////////////
////// Чтение 8 байт из ПП по адресу для отправки с ответным CAN-фреймом
void read8byte(uns16 adr)
{
TBLPTR = adr;
readLUInc(); //фиктивное чтение с инкрементом адреса слова

mReadPM[0] = readL(); //действительное чтение мл байта в массив
mReadPM[1] = readHUInc(); //и чтение ст байта с инкрементом адреса
mReadPM[2] = readL();
mReadPM[3] = readHUInc();
mReadPM[4] = readL();
mReadPM[5] = readHUInc();
mReadPM[6] = readL();
mReadPM[7] = readHUInc();

} //end void read8byte(uns16 adres)

//Линейный код чтения побайтно четырёх слов памяти программ занимает
//меньше места и выполняется быстрее, чем в четырёхпроходном цикле,
//как это сделано выше в функции write8byte.
//Можно было бы и запись в ПП - void write8byte(uns16 adr) - организовать
//линейно, но скорость там определяется "длинной записью" - 5 мс на каждое из четырёх
//слов, так что на скорости не сэкономишь.
//А экономия 6 слов кода показалась неубедительной, поэтому для разнообразия - цикл.

//[1, c34] СС7А Си-компилятор для микроконтроллеров серии 1886. Руководство пользователя.

//Надеюсь, всем понятно то, чем я поделился на каникулах, пока не занят.
//Если кому-то покажется, что слишком много комментариев, можете их стереть.
//Но я старался разжевать всё.
//Надо сказать, что я новичок в микроконтроллерах. 1886ВЕ5 - первый и единственный,
//который я знаю. И первая программа, которую я написал для МК - бутлодырь.
//Начальник приказал сделать обмен через CAN в импортозамещении, что я и сделал.
//Впрочем, сначала побаловался с кнопками, светодиодами и АЦП,
//чтобы понять работу с портами и прерываниями.
//Так что можете покритиковать с целью улучшения и прочее.
//Но, чур, не пинать новичка.


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

Зарегистрирован: 2016-мар-16 19:08
Сообщения: 5
Вместо самовольно нарисовавшегося смайлика в тексте должно быть
сравнение с 8
while (ii < 8 )


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

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


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

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


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

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