Arduino программатор PIC-ов.

Eig

✩✩✩✩✩✩✩
3 Май 2021
31
2
@Lazy-R, в моем форке это строчка 410 в функции EraseButton_Click. Там высылается запрос (strProgramMemory, OK), который стирает записанное в этот буфер в RetrieveDeviceParameters при подключении микроконтроллера. Само собой, пропадает и значение регистра калибровки генератора тактовой частоты OSCCAL.
Всё это очень легко исправляется, но у меня нет вашего микроконтроллера, а он стоит стольник.
 

Lazy-R

✩✩✩✩✩✩✩
27 Май 2021
2
0
Это как говорится -"очень интересно, но ничего не понятно".
Меня в принципе и так радует эта программа , я просто предупредил последоаателей чтоб были осторожней с этими константами , ну и как вариант решения этого вопроса.
 

Eig

✩✩✩✩✩✩✩
3 Май 2021
31
2
@Lazy-R, а вот меня эта программа не радует. Консольная гораздо лучше, и надо было просто сделать для нее графический интерфейс. Спасибо за ваше сообщение, я внесу изменения, когда обзаведусь этим микроконтроллером.

upd1: вызов, который затирает всю флэш-память в функции EraseButton_Click вместе с ячейкой памяти 03FF, в которой содержится OSCCAL в виде инструкция + константа (например, 34 5C):
C-like:
Call mySerialLink.SendDataToSerial("ERASE" & vbCrLf)
upd2: всё очень плохо. Функция стирания чипа находится не в клиенте ArdPicProgHost.vb, а на сервере ProgramPIC.ino, который грузится в Arduino. Место, в котором происходит крамола, обнаружено, но как его исправить я пока не знаю.
 
Изменено:

Palomo

✩✩✩✩✩✩✩
17 Июл 2021
1
0
Ребята, так когда же будет полноценная версия програматора, и соф и хард?
 

Eig

✩✩✩✩✩✩✩
3 Май 2021
31
2
@Palomo, когда сами сделаете. Курите серверную часть - у меня не получается починить стирание таким образом, чтобы оно не трогало калибровочную константу.
 

Аллайя

✩✩✩✩✩✩✩
20 Июл 2021
1
0
А с чего решили, что там 13 вольт должно быть? Моя схемка повеселей будет:
Схема.pngПлата 1.pngПлата 2.png

P.S. на схеме R3 и R4 подключены без учета наличия светодиода. Если хотите включить в схему светодиод, удалите эти резисторы из схемы, а у R2 измените номинал до 1 кОм...
 

Вложения

Изменено:

Nnm

✩✩✩✩✩✩✩
24 Сен 2021
6
1
У меня заработало после исправления ошибки в схеме (в оригинальной схеме этого топика). Почему именно ошибка в схеме? - читайте код, он же прилагается, ну блин. В начале спаял на плате все как в оригинальном посте - не заработало, прочитал тут 5 страниц теорий заговора без решения, затем полазил в коде и нашел проблему. Не знаю об особенностях всех пиков, но я проверил на pic12f629 и все работает прекрасно.

Если открыть код (ProgramPIC.ino) то можно обнаружить набор пинов, среди которых есть PIN_VDD подключенный к ардуине на D2, который внезапно в схеме отсутствует. Так же в коде есть намеренный порядок подключения питания. итого вход PIC:VCC нужно подавать не с голого +5 вольт а с этого пина (если вспомнить об ограничении 40ма на аутпут пин то желательно подключать через резистор 200ом (есть мнение, что при таком сопротивлении просядет напряжение и работать так не будет - нужен. доп транзистор для управлениея питанием)), я лично подключил через 47ом (какой был), больше для галочки. Склоняюсь к тому, что схема без исправления иногда работала у некоторых формучан по случайному стечению обстоятельств.
Транзистор использовал 2n2222 (такой был под рукой, собственно все собирал из подручных материалов включая огрызок макетки). Резисторы вместо 1.2к поставил 1к (какие были).
20210925_132133.jpg20210925_132141.jpg20210925_132201.jpg20210925_132214.jpg20210925_132242.jpg

Не вижу как прикрепить файл, в исходнике (ProgramPIC.ino) я делал следующие правки:
1. поменял пины для удобства (соответствуют схеме выше)
C++:
// Pin mappings for the PIC programming shield.
#define PIN_MCLR        A7      // 0: MCLR is VPP voltage, 1: Reset PIC
#define PIN_ACTIVITY    A5      // LED that indicates read/write activity
#define PIN_VDD         6       // Controls the power to the PIC
#define PIN_CLOCK       4       // Clock pin
#define PIN_DATA        7       // Data pin
2. добавил объявление типов
C++:
using prog_char = char;
using prog_uint8_t = uint8_t;
using prog_int16_t = int16_t;
using prog_uint16_t = uint16_t;
using prog_uint32_t = uint32_t;
Надеюсь, всем поможет. Проверял только на PIC12F629 (read + erase + write), после подключения ардуины к компу желательно клацать на ней reset.
Конденсаторы я добавлял чисто для организации монтажа (на выходе DC-DC желательно небольшой керамический добавлять, на входе - без разницы). DC-DC vin- и vout- соединены внутри, на что я полагался конкретно в этом монтаже (так должно быть в любом повышающем DC-DC).
 
Изменено:

Eig

✩✩✩✩✩✩✩
3 Май 2021
31
2
@Nnm, всё наоборот. В оригинальной схеме топика ошибок нет. Там очень широкий простор для модификаций, который практически не способен убить функциональность. Схема просто рассчитана на практически идеальное питание. Поэтому на вход нужно ставить большой и толстый конденсатор как в моей реализации или вообще выпрямитель.
Задам риторический вопрос: у вас сие устройство не стирает калибровочную константу pic12f629? Потому что у меня при отладке серверного кода (на ардуине) оно не желает даже переходить на ветку, ответственную за обработку именно pic12f629/675, в которой КК снова должна записываться.

Вот тут я собрал весь клиентский и серверный код, и последнюю версию платы в kicad. Исправлена куча ошибок оригинальных авторов. Всё работает, кроме pic12f629/675. Может всё-таки здесь найдется гений работы с чужим кодом?
 

Nnm

✩✩✩✩✩✩✩
24 Сен 2021
6
1
Избыточное цитирование
Задам риторический вопрос: у вас сие устройство не стирает калибровочную константу pic12f629? Потому что у меня при отладке серверного кода (на ардуине) оно не желает даже переходить на ветку, ответственную за обработку именно pic12f629/675, в которой КК снова должна записываться.

Вот тут я собрал весь клиентский и серверный код, и последнюю версию платы в kicad. Исправлена куча ошибок оригинальных авторов. Всё работает, кроме pic12f629/675. Может всё-таки здесь найдется гений работы с чужим кодом?
Не стирает. Подключился, прогнал erase, ребутнул ардуино, запустил ArdPicProgHost.exe заново, выполнил read - константа на месте (такая-же как и была - 342C, остальное 3FFF).

Я уверенно говорю "ошибка в схеме" т.к. в оригинале прилагается прошивка ардуины + схема, и они друг другу не соотвутствуют. Качество кода причем очень хорошее (лучше 99% кода, который можно найти в интернете) и я склонен доверять коду.

Конденсатор на 1000мкф в цепи с нагрузкой через 10ком - как по мне перебор.
 

Eig

✩✩✩✩✩✩✩
3 Май 2021
31
2
@Nnm, хорошо. Тогда, пожалуйста, прикрепите сюда клиент и сервер. Именно те версии, которые вы использовали, потому что на данный момент их уже люди наплодили невероятное количество. Возможно напряжение на PIN_VDD как-то влияет на решение в какую ветку прыгать.
 

Nnm

✩✩✩✩✩✩✩
24 Сен 2021
6
1
Избыточное цитирование
только что специально проверил еще с кастомной прошивкой (прошивок пока нет, я даже не ставил MPLAB, так что я наколхозил модификацию хекс файла в блокноте) - прошилось правильно, затем erase затер все остальное кроме калибровочной константы (я переподключал ардуину и перезапускал софт после каждого действия).

@Nnm, хорошо. Тогда, пожалуйста, прикрепите сюда клиент и сервер. Именно те версии, которые вы использовали, потому что на данный момент их уже люди наплодили невероятное количество. Возможно напряжение на PIN_VDD как-то влияет на решение в какую ветку прыгать.
использовал host.rar из оригинального поста в этой теме, скачивал его вчера.

Мой тестер показывал на 5в линии (и на HIGH выходах ардуины) 4.6 вольта, если что. Тестеру я склолнен верить (более менее), ориентируясь на напряжение на голом юсб - 4.99в.
 

Eig

✩✩✩✩✩✩✩
3 Май 2021
31
2
@Nnm, Хорошо, спасибо. Я в начале-середине октября проверю вашу реализацию. Возможно ваша внимательность позволит наконец-то создать рабочую версию хотя бы для наиболее популярных микроконтроллеров.
 

Nnm

✩✩✩✩✩✩✩
24 Сен 2021
6
1
Вот тут я собрал весь клиентский и серверный код, и последнюю версию платы в kicad. Исправлена куча ошибок оригинальных авторов. Всё работает, кроме pic12f629/675. Может всё-таки здесь найдется гений работы с чужим кодом?
подифал я ваш код с master ветки гитхаба - дифф очень маленький но включает
C++:
+    } else if (!configSave || addr != (configStart + DEV_CONFIG_WORD)) { // The branch that pic12f629 goes to
         word &= 0x3FFF;
         sendWriteCommand(CMD_LOAD_PROGRAM_MEMORY, word << 1);
         beginProgramCycle(addr, false);
@@ -1339,7 +1359,6 @@ bool writeWord(unsigned long addr, unsigned int word)
         // must be preserved when we write to it.  Read the current value
         // and preserve the necessary bits.
         readBack = (sendReadCommand(CMD_READ_PROGRAM_MEMORY) >> 1) & 0x3FFF;
-        word = (readBack & configSave) | (word & 0x3FFF & ~configSave);
         sendWriteCommand(CMD_LOAD_PROGRAM_MEMORY, word << 1);
         beginProgramCycle(addr, false);
         readBack = sendReadCommand(CMD_READ_PROGRAM_MEMORY);
@@ -1359,7 +1378,7 @@ bool writeWordForced(unsigned long addr, unsigned int word)
         beginProgramCycle(addr, true);
         readBack = sendReadCommand(CMD_READ_DATA_MEMORY);
         readBack = (readBack >> 1) & 0x00FF;
-    } else {
+    } else { // The branch that pic12f629 goes to
может "- word = (readBack & configSave) | (word & 0x3FFF & ~configSave);" - случайно удалена или вы забыли об этом? я не говорю что она там должна быть, я не вникал, но все таки.
 

Eig

✩✩✩✩✩✩✩
3 Май 2021
31
2
@Nnm, да, это может влиять. Это я мог удалить только случайно, спасибо за помощь.

upd: удаленная строчка не влияет – константа все равно затирается. Буду анализировать отличия вашей реализации.
 
Изменено:

Nnm

✩✩✩✩✩✩✩
24 Сен 2021
6
1
@Eig, я запустил вашу версию .ino на своем хосте и она тоже не затирает константу, пару нюансов:
1. я вернул пропавшую строчку упомянутую выше
2. код не собирался пока я не переместил matchString повыше (в моей версии таких проблем небыло, но там вместо typedef у меня using и нету пометки PROGMEM, которая по идее не нужна для не-указателей) судя по всему у вас как минимум другая версия Arduino IDE (у меня 1.8.15) и возможно это влияет.
Пробовал собрать ваш хост (нужно возиться с VBA - не хочу), запускал дебажный exe-шник из репы - он не отображает содержание FLASH, забил.

А вот вам пруф на ошибку в схеме:
prog-enter-diagram.png
источник: http://ww1.microchip.com/downloads/en/DeviceDoc/41191D.pdf
ссылка на источник взята из комментариев в коде.

Пробуйте мою схему. Кстати я для полноты померял ток на всякий случай - PIC629 накидывает максимум 5ма (при erase и write) - за резистор я бы не переживал (для dip8 и dip14 во всяком случае).

Моя гипотеза такова: вы попадаете в режим программирования незадокументированным способом по какому-то стечению обстоятельств и PIC не полностью сбрасывается/инициализируется, это потенциально может зависеть и от ревизии/партии самих чипов. Насколько я понимаю +5в у вас в процессе работы с PIC-а никогда не пропадает.
 
Изменено:
  • Лойс +1
Реакции: ТехнарьКто

Eig

✩✩✩✩✩✩✩
3 Май 2021
31
2
@Nnm, Моя версия Arduino 1.9.0-beta. У меня все собирается.
Проверил ваш вариант схемы, добавив резистор 47 Ом между PIN_VDD и PIC_VDD. И разорвав питание PIC_VDD от 5 Вольт. При таком питании не происходит инициализации PIC. Вернее, на четверть секунды что-то появляется в интерфейсе, и затем все поля становятся пустыми. Похоже, не хватает питания. Возможно это связано с наличием дополнительных элементов в цепи и суммарной длиной дорожек цепи, так как у меня там два слота для разных типов PIC. Попробую кинуть проводок напрямую и еще сильнее порезать схему.

Насколько я понимаю +5в у вас в процессе работы с PIC-а никогда не пропадает.
Так и есть. И, как выясняется, это не мешает программировать, например, pic16f628a. А вот PIC12F629/675 требуют перезаписи калибровочной константы, что требует программного управления питанием (5V). И именно поэтому в оригинале питание организовано через пин D2.

UPD: Получилось при прямом подключении D2 и PIC_VDD через резистор 47 Ом – константа перезаписывается. Похоже, мешал электролитический конденсатор.

@ТехнарьКто, В начале темы приведен ПРОВЕРЕННО НЕРАБОТАЮЩИЙ на недокументированных возможностях программатор из Ардуины. По факту пришлось капитально править код для PIC16F, чтобы оно стало юзерфрендли, а PIC12F работает в таком режиме, но затирает калибровочную константу, ЧТО ПРИМЕНЕНИЕ ТАКОЙ СХЕМЫ СВОДИТ НА НЕТ. По сути вы устроили флейм на 5 страниц. Никакой фичи в этом нет, если она практически не применима.

UPD2: Внес изменения в репу. Добавил скомпилированный hex ProgramPIC. Теперь все питается через D2. Тумблером выбирается PIC16F или PIC12F, иначе нет никакой гарантии, что это будет работать. Электролит убрал, потому что питание теперь через Arduino.
 
Изменено:

Nnm

✩✩✩✩✩✩✩
24 Сен 2021
6
1
@Eig как это у вас так стоял конденсатор? он нивелировал управление пином VDD? если так, то понятно.
Я уже собрался писать разные предположения но раз у вас все заработало то хорошо, поздравляю :) и все же я оставлю некоторые комментарии - вдруг они окажутся полезными.

1. по питанию для pic16 - не могу ничего утверждать, я изучал конкретно pic12f629/675 и сосредоточился на нем (у меня другого и нету), если это при высоковольтном программировании - это ок. Я в первую очередь при поиске ошибки исходил из того, что в режим программирования должно быть невозможно попасть случайно (случайной комбинацией на пинах в процессе работы готового устройства), высоковольтный детектор на MCLR является разумной защитой, порядок включения питания - дополнением, но насчет попадания туда при включенном 5в питании - зависит от деталей реализации микросхемы и потенциально от ее конфига.

2. "не хватает питания" - насколько я понял, питания "хватало" для более крупной микросхемы - pic16, но нехватало для pic12 - это очень странно. Но когда есть сомнения по питанию - лучше конкретно проверить, у меня на ардуино нано по usb входу стоит диод шоттки который кушает около 0.25 вольта, недавно я столкнулся с ситуацией когда USB устройство стало работать "частично" при недостаточном питании от usb (именно стало и именно частично - я думал все сдохло, но внезапно стало работать нормально при подключении без usb хаба который тоже кушал около 0.25 вольта, при чем ранее при абсолютно тех же условиях устройство работало полноценно, видимо что-то деградировало, но затрудняюсь определить что).

3. длина дорожек - при замере мой pic 629 кушал до 5ма, что эквивалентно 1ком на 5 вольтах, очень сомневаюсь что реалистично развести такие длинные дорожки, чтобы они имели весомое сопротивление и поделили напряжение до "недостаточного". Касательно паразитных емкостей - тоже не верю в такие предположения, там частоты до 1мгц, что весьма не много (представьте себе, что происходит в материнских платах современных компьютеров на их частотах). Еще по длине - посмотрите снова на лапшу из проводов в первом посте - и все вроде как работает.

Я не эксперт в вопросах электроники и могу в чем-то ошибаться, но считаю, что стоит обратить внимание на предположения / потенциальные заблуждения, которые ни к чему не привели.
 
Изменено:

Eig

✩✩✩✩✩✩✩
3 Май 2021
31
2
@Nnm, спасибо за информацию о неотображающейся FLASH-памяти. Она сейчас отображается для PIC16, но не отображается для PIC12. Сделаю правки.

UPD: Все, теперь отображается.
 
Изменено: