Страница 1 из 1
Прошивка МК с МК
Добавлено: Сб дек 17, 2016 21:13:57
ReZeC
Доброго времени вам Коты мудрые и ученые.
Вопрос (честно сказать тем не курил), но не бейте..
Есть ряд устройств, раскиданных по территории, на Атмега 32.
Иногда возникает необходимость переписать код (прогресс не стоит и надо).
Таскать устройства к компу - становится все ленивей и ленивей, да и вытаскивать устройства весьма нелегко.
Ноут - не вариант.
И придумалась мне такая штука:
Я делаю еще одно устройство, назовем его ПРОШИВАТЕЛЬ, наверное с картой памяти, т.к. код на устройствах занимает 98 % памяти атмеги, и, когда приходит время беру свой
Прошиватель, радостно несусь к устройству, подключаю к ISP, жму кнопку и обновляю код.
Мож это уже давно все придумано ?
Что скажете ?
Re: Прошивка МК с МК
Добавлено: Сб дек 17, 2016 21:19:59
dr.doc
Для PIC контроллеров это PICKit2...
Re: Прошивка МК с МК
Добавлено: Сб дек 17, 2016 21:52:18
uk8amk
http://mdiy.pl/uprog-maly-szybki-przeno ... -avr-z-sd/
Только если всё равно идти за устройствами, то почему не ноут или дешевый нетбук?
Re: Прошивка МК с МК
Добавлено: Сб дек 17, 2016 22:56:25
ARV
ReZeC писал(а):Что скажете ?
ну делал я такой "прошиватель"... только без карты - просто брал atmega2560 и туда прошивки для attiny2313 помещал. правда, управлялось это все с компа, но никаких проблем нет обойтись и без него...
и чо?
Re: Прошивка МК с МК
Добавлено: Вс дек 18, 2016 06:34:22
ReZeC
К дешевому ноуту, надо дешевый программатор и т.д. Ну и чел, который будет перепрошивать - далек от цивилизации..
В общем Ноут не вариант.
Добавлено after 22 minutes 7 seconds:
ниже в комментах нашел нашего человека:
http://best-chart.ru/programmatory-sdel ... uprog.html
Вопрос ! У меня 16 мегагерц рабочая частота устройств.... Смогу ли я этим устройством прошить ?
Re: Прошивка МК с МК
Добавлено: Вс дек 18, 2016 07:19:14
AlanDrakes
Вообще-то, протокол ISP - не слишком сложный. Фактически, это чистый SPI. И даже пин /CS подменяется на /RESET. Вообще ничего сложного - главное не сбиться.
Где-то в своём проекте написал подобный прошиватель, разве что работал он с одним конкретным ведомым кристаллом, читал прошивку (.HEX) с карты памяти (uSD) и писал в него.
Просто полистал референс на программирование по ISP. Основные моменты:
1. Частота на SCK пине должна быть ниже частоты ведомого ЦП минимум в 4 раза. Для 16МГц целевого, нельзя использовать клок выше 4МГц. Скорее всего - уложитесь.
2. Сброс - это /CS, но во время загрузки данных его нельзя отпускать.
3. Запись постраничная - читаете данные, записываете в буфер страницы (зависит от размера страницы), даёте запись с указанием НОМЕРА страницы.
4. Ждёте (n) милимсекунд, эпизодически считывая состояние бита BUSY ведомого контроллера.
5. Можно обойтись без кнопки.
Вот пример кода:
Спойлер
Код: Выделить всё
uint8_t SlaveProgMode(void) {
uint8_t t, i;
SPI_Deselect_ALL(); // На всякий случай.
SPI_Init(); // Настраиваем SPI на минимальную скорость и снимаем выбор с шины.
for (i=0; i<10; i++); // Рекомендуемая пауза - не менее 2 тактов процессора. Ждём порядка 20.
SPI_SLAVE_RESET_OFF(); // Поднимаем nReset.
for (i=0; i<10; i++); // Рекомендуемая пауза - не менее 2 тактов процессора. Ждём порядка 20.
SPI_SLAVE_RESET_ON(); // Опускаем nReset
_delay_ms(50); // Пауза (не менее 10мс) в 50 мс.
for (t=0; t<10; t++)
{
SPI_Ex_Byte(0xAC); // Стартовый байт (синхронизация)
SPI_Ex_Byte(0x53); // Режим программирования
i = SPI_Ex_Byte(0xFF); // Dummy
SPI_Ex_Byte(0xFF); // Dummy
if (i == 0x53) // Если чип ответил 2-м байтом при передаче 3-го - порядок.
{
return 0; // Выходим с успехом.
}; // Если синхронизация не установилась - повторяем вплоть до 10 раз.
SPI_SLAVE_RESET_OFF(); // Поднимаем nReset.
for (i=0; i<10; i++); // Рекомендуемая пауза - не менее 2 тактов процессора. Ждём порядка 20.
SPI_SLAVE_RESET_ON(); // Опускаем nReset
};
return 1; // Иначе - возвращаем 1.
};
uint8_t IsBusy(void) {
uint8_t i;
SPI_Ex_Byte(0xF0); // Poll Rdy/~Busy
SPI_Ex_Byte(0x00); // Need 0x00
SPI_Ex_Byte(0x00); // Dummy - Ignored.
i = SPI_Ex_Byte(0xFF); // Read last bit.
i = i & 0x01;
return i;
};
void ChipErase(void) { // Chip Erase sub. Well... poll nRDY?
while (IsBusy()); // Delay to chip ready.
SPI_Ex_Byte(0xAC);
SPI_Ex_Byte(0x80); // ChipErase
SPI_Ex_Byte(0x00); // dummy
SPI_Ex_Byte(0x00); // dummy
while (IsBusy()); // Wait till Erase() done.
};
uint8_t FuseRead(uint8_t FuseByte) {
while (IsBusy()); // Delay to chip ready.
switch (FuseByte) // Fuse_Low 0x50, 0x00, 0x00, Answer
// Fuse_High 0x58, 0x08, 0x00, Answer
// Fuse_Ext 0x50, 0x08, 0x00, Answer
{
case FUSE_LOW:
case FUSE_EXT:
SPI_Ex_Byte(0x50);
break;
case FUSE_HIGH:
SPI_Ex_Byte(0x58);
break;
};
switch (FuseByte)
{
case FUSE_LOW:
SPI_Ex_Byte(0x00);
break;
case FUSE_EXT:
case FUSE_HIGH:
SPI_Ex_Byte(0x08);
break;
};
SPI_Ex_Byte(0x00);
return SPI_Ex_Byte(0xFF);
};
void FuseWrite(uint8_t FuseByte, uint8_t Value) {
while (IsBusy()); // Delay to chip ready.
SPI_Ex_Byte(0xAC); // Write Fuse command
// Low, Ext, High: 0xAC, (0xA0|0xA4|0xA8), 0x00. Fuse
SPI_Ex_Byte(0xA0 + 4*FuseByte); // A0/A4/A8/(AC(!) if FuseByte == 3)
SPI_Ex_Byte(0x00); // 3-rd byte of CMD
SPI_Ex_Byte(Value); // Fuse value to write
};
// Номер страницы по 64 байта (в моём случае).
// То есть, реальный адрес байта 0x123456 получим:
// 0b 0001 0010 0011 0100 0101 0110
// |-Номер стр.----| |-- Данные-|
// В буфере страницы должны быть 64 байта, которые нужно записать в страницу. Передать адрес страницы так же необходимо!
void WriteSlaveFlashPage(uint16_t PageNumber, uint8_t PageBuffer[64]) {
uint8_t i, b;
SlaveProgMode(); // Переводим чип в режим программирования. Мало ли...
for (i=0;i<64;i++) {
b = PageBuffer[i];
SPI_Ex_Byte(0x40 + (i & 0x01)*8); // Выбираем старший, или младший байт.
SPI_Ex_Byte(0x00); // Команда... нужно 000xxxxx
SPI_Ex_Byte(i>>1); // Дать номер слова, куда грузить.
SPI_Ex_Byte(b); // Загрузить верхний байт.
};
// write page.
SPI_Ex_Byte(0x4C); // Команды записи страницы
SPI_Ex_Byte((PageNumber >> 4) & 0x1F); // Верхний байт (MSB)
SPI_Ex_Byte((PageNumber << 4) & 0xF0); // Нижний байт (LSB)
// 0b 0000 0000 0000 0000
// UPPER LOWER
// mask 0000 0111 1110 0000
// -- MSB -- -- LSB --
// MSB first
SPI_Ex_Byte(0x00); // Dummy
// wait till ~busy
while (IsBusy()); // Ждём, пока занято.
SPI_SLAVE_RESET_OFF(); // Отпускаем nRST, чтобы чип не висел на шине.
};
Re: Прошивка МК с МК
Добавлено: Вс дек 18, 2016 08:18:53
ReZeC
AlanDrakes писал(а):Вообще-то, протокол ISP - не слишком сложный. Фактически, это чистый SPI. И даже пин /CS подменяется на /RESET. Вообще ничего сложного - главное не сбиться.
Спасибо что откликнулись. Но как разработчик - я слабоват. Повторять схемы получается.. Немного код править умею... а дальше уже сложно.
Re: Прошивка МК с МК
Добавлено: Вс дек 18, 2016 11:33:23
Vov123
Смотри, если не "брезгуешь" ардуинами, то процесс намного упрощается, всё оказывается придумали давно и без нас.
К, примеру, написал ты апгрейд, отправляешь его по WhatsApp своему не очень сведущему товарищу на телефон.
Он подключает смартфон через OTG-кабель к ардуинке и с помощью программки "ардуино дроид" загружает твой апгрейд.
Я сейчас попробовал простецкую (блинк) программу, всё работает, кабель использовал тот, что идёт в комплекте с ардуинкой,
только почему-то иногда с первого раза скетч не заливается и необходимо повторять попытку ещё раз.
Подробности здесь:
https://www.youtube.com/watch?v=0e7nWWu7kDc 
Re: Прошивка МК с МК
Добавлено: Пн дек 19, 2016 09:19:40
BOB51
Запихнуть в те меги самодельный начальный загрузчик(бутлоадер) по любому понравившемуся протоколу и соорудить носимый накопитель...

Re: Прошивка МК с МК
Добавлено: Вт дек 20, 2016 05:16:14
ReZeC
BOB51 писал(а):Запихнуть в те меги самодельный начальный загрузчик(бутлоадер) по любому понравившемуся протоколу и соорудить носимый накопитель...

Софтинка, которая крутится на устройстве, занимает 98 % памяти Атмеги 32.
Re: Прошивка МК с МК
Добавлено: Вт дек 20, 2016 05:28:30
BOB51
А как насчет заменить на другой кристалл, "побольше"?

Re: Прошивка МК с МК
Добавлено: Вт дек 20, 2016 05:43:46
ReZeC
BOB51 писал(а):А как насчет заменить на другой кристалл, "побольше"?

Все под Мегу 32... схема и т.д... в общем не реально....
Ну и все это, можно сказать, в общественно-патриотической детской организации (настоящей) где денег практически нет. Так, помогаю как могу.
Re: Прошивка МК с МК
Добавлено: Вт дек 20, 2016 06:27:17
abc
Вроде ж, есть проекты ...
Кодовые слова для гугла - avr stand alone programmer
Re: Прошивка МК с МК
Добавлено: Вт дек 20, 2016 06:52:20
ReZeC
abc писал(а):Вроде ж, есть проекты ...
Кодовые слова для гугла - avr stand alone programmer
Вот ! Спасибо вам ! у самого ума не хватило как правильно строку для поиска задать.
На "автономный программатор avr" - много решений выпало. с описанием.
Малоль, мож кому понадобится:
http://bigbenmobileblog.blogspot.ru/201 ... -sd-1.html
http://www.tehnari.ru/f115/t104559/
http://www.rlocman.ru/shem/schematics.html?id=107043
p.s.

почему значЁк с распивающими валерьянку котами называется BEER ?
Re: Прошивка МК с МК
Добавлено: Вт дек 20, 2016 06:57:00
abc
Потому что он переделан со смайликов, распивающих пиво.
Впрочем, неважно, главное, что им хорошо :)
Re: Прошивка МК с МК
Добавлено: Вт дек 20, 2016 07:01:59
ReZeC
abc писал(а): им хорошо

ФАКТ !
Re: Прошивка МК с МК
Добавлено: Сб дек 24, 2016 15:26:20
74LS00
У меня устройство метрах в 5. Собрал платки на gd75232 и парой ms34063 чтоб прямо isp в витую пару и обратно.
Шина однонаправленная так что проблем не должно быть. Пока валяются. Надо ещё разъёмы подпаивать, кабель покупать да и самой платы контролера нет даже в теории, но платки с uart пашут.
Но это хорошо когда устройство, вариант шить в програматор, а потом им уж слишком долгий.
Автономного я так и не нашел, да он и не пригодился. У этих контролеров есть подлянка, они не поддерживаются, очень много новых версий которые не шьёт старый софт, хотя отличие только в сигнатуре. Переписывать код не вариант, да и исходников чаще всего нет