Jump to content

    
Sign in to follow this  
iiv

PIC16F170x перепрограммировать на лету

Recommended Posts

Добрый день,

 

пики до недавнего времени не пользовал, не пинайте, пожалуйста, сильно, если глупость спрошу.

 

У меня есть устройство, в котором примерно 25 пиков (pic16f1705) имеют по два входа (RA4, RA5) и эти входы запараллелены через digital isolator между всеми этими пиками.

 

На эти пики подается немудренная команда, по которой DAC пика выдает какую-то заданную мелодию, которая также зависит от порядкового номера этого пика, который сидит в прошивке.

 

Мне хочется иметь возможность хотя бы изредка перепрограммировать прошивку этих пиков, не имея доступа к каким-либо другим ногам этих пиков. То есть я могу послать по какому-то интерфейсу в плиску содержимое hex файла, и потом послать в пик какую-то команду, после которой я буду переписывать прошивку на основе следующих пришедших данных.

 

То есть я хочу интегрировать bootloader в свою прошивку, вроде в программный флеш писать во время работы программы можно.

 

Программной памяти мало, прошивка получается длинной, держать две прошивки одновременно места нет, взять дугой пик не хотелось бы из-за стоимости.

 

Не понимаю как в программе сделать так, чтобы одна функция (мой писатель во флеш) всегда лежала в одном каком-то блоке, чтобы я ее не мог переписать, а все остальное бы модифицировалось бы по необходимости, подскажите, пожалуйста, как это сделать?

 

Спасибо!

 

ИИВ

Share this post


Link to post
Share on other sites
1 час назад, iiv сказал:

Не понимаю как в программе сделать так, чтобы одна функция (мой писатель во флеш) всегда лежала в одном каком-то блоке, чтобы я ее не мог переписать, а все остальное бы модифицировалось бы по необходимости,

Да также, как и в любом другом контроллере.
Вам нужно вместить размер бутлодера в секцию флеши, которую можно защитить от программной записи: CONFIG2 / WRT<1:0>: Flash Memory Self-Write Protection bits
И при помощи линковщика разместить бутлодер и основную программу в нужные секции флеши.
А вот как это сделать, нужно читать описание на ваш компилятор...

Share this post


Link to post
Share on other sites
11 часов назад, iiv сказал:

глупость спрошу ... прошивка получается длинной

Вроде уже всё объяснил ранее:

 

1) 32 МГц / 8 MIPS;

2) ЦАП обновлять в прерываниях;

3) прерывания от компаратора таймера TMR1;

4) единый для всех плат синхросигнал/данные подавать на UART и на защёлку таймера TMR1 (вывод МК один, переназначить входы на него);

5) МК, по принятому защёлкой значению TMR1 на момент синхросигнала и порядковому номеру платы, вычисляет фазу (т.е. разную задержку, если ЦАП многофазный) и записывает результат в регистр компаратора таймера;

6) у платы сделать какой-нибудь изолированный сигнал ручного выбора — перемычка, фотодиод, ВЧ через ёмкость, нагрев МК воздухом, светом, паяльником, и т.п.;

7) для прошивки номера (в ячейку программной памяти), всем платам слать команду по UART и в ней же нужный номер, при этом подавая сигнал выбора на нужную.

 

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

Share this post


Link to post
Share on other sites

Спасибо большое, Baser и Plain!

2 hours ago, Plain said:

Вроде уже всё объяснил ранее:

не, не получается так все просто... Если резко менять значения на ЦАПе, все идет юзом и горит, а если менять плавно, то все работает... Я имею ввиду делаем ступеньку на 5КГц - все горит, делаем синус на те же 5КГц - все работает, я имею ввиду выходного +/-5КВольт ступеньку или синус на 22 секциях. Проверенно на обоих вариантах, с пиком, и с ЦАПом по i2c. Из-за этого цап надо менять на максимальной скорости (каждые 10us), хорошо аппроксимируя синус или другие гладкие функции, а значения по ком-порту можно послать разве что один раз за 500us. Из-за сложностей со сборкой решил переразвести и вывести пады для первоначальной прошивки, но, после сборки все это будет полностью недоступно - только два входа - уарт и его клок.

 

То есть только вариант - загрузчик в нулевом блоке, пока правда не до конца понял как именно на этом пике это реализуется, но похоже это все-таки проходимая задача.

 

Спасибо!!!

Share this post


Link to post
Share on other sites
4 часа назад, iiv сказал:

Если резко менять значения на ЦАП

Не понятно, из каких моих слов Вы сделали такой вывод. Естественно, я говорил о частоте прерываний 100 кГц и частоте выборок от 100 квыб/с до 2,2 Мвыб/с в случае объединения плат в многофазный ЦАП.

 

4 часа назад, iiv сказал:

значения по ком-порту можно послать разве что один раз за 500us

Не понятно, каким образом у Вас всё так сильно ухудшилось, потому что у данного МК скорость UART 2 Мбод, т.е. честные 16 бит 100 квыб/с.

 

4 часа назад, iiv сказал:

только два входа - уарт и его клок

Не понятно, что ещё за тактовый сигнал — UART он не требуется, а для общей синхронизации, как показано выше, тоже достаточно единственного сигнала.

 

4 часа назад, iiv сказал:

загрузчик в нулевом блоке, пока правда не до конца понял как именно на этом пике это реализуется

После сброса ожидаете команду либо перепрошивки, либо начала работы, либо ещё чего. Если перепрошивка, то принимаете строку, стираете старую и записываете новую.

Share this post


Link to post
Share on other sites

Спасибо большое, Plain, что помогаете!

2 hours ago, Plain said:

Не понятно, из каких моих слов Вы сделали такой вывод. Естественно, я говорил о частоте прерываний 100 кГц и частоте выборок от 100 квыб/с до 2,2 Мвыб/с в случае объединения плат в многофазный ЦАП.

Не, это были мои эмоции после сгоревшей стойки, когда я ей решил управлять на меньшей скорости, и ведь полностью по своей глупости произошло, можно было самому догадаться, что так делать нельзя!

2 hours ago, Plain said:

Не понятно, каким образом у Вас всё так сильно ухудшилось, потому что у данного МК скорость UART 2 Мбод, т.е. честные 16 бит 100 квыб/с.

Я честно говоря, очень боюсь на такой скорости компорты гонять, особенно когда 150 пиков в параллель, поэтому пользовал 56Кбит и команда на три байта (16 бит значение в даке, и слово для контрольной суммы). Скажите, пожалуйста, а правда будет на 2МБита стабильно работать?

2 hours ago, Plain said:

После сброса ожидаете команду либо перепрошивки, либо начала работы, либо ещё чего. Если перепрошивка, то принимаете строку, стираете старую и записываете новую.

Спасибо большое!!! Это да, вроде так, стирать по 16 байт, писать по 8 два раза. У меня пока главное непонимание - как объяснить MPLAB, что я компилю бутлоадер или саму прошивку (сдвинутую от бутлоадера), и какая команда позволяет передать управление из бутлоадера в прошивку. Наверное пока еще не дочитал то, что есть в сети об этом.

Share this post


Link to post
Share on other sites
4 часа назад, iiv сказал:

после сгоревшей стойки, когда я ей решил управлять на меньшей скорости

Ничего не должно было гореть, поэтому может ошибка в схеме.

 

4 часа назад, iiv сказал:

будет на 2МБита стабильно работать?

Если изоляторы 150 МГц, должно работать — по логике, после 9,5 бит приём закончен и автомат в следующем такте уже должен ловить старт-бит, что при стробировании 4-мя выборками даёт запас на уход частоты 2,5%, а у внутреннего генератора 2%.

 

4 часа назад, iiv сказал:

стирать по 16 байт, писать по 8 два раза

Как у любой такой памяти, стирать можно только целыми строками, здесь они по 32 слова (64 байта) — сперва их закидывают в её буфер, затем за раз пишут, Рис.10-5 и Рис.10-6. Питание у схем бесперебойное, поэтому можно даже не блокировать память и при желании переписывать в т.ч. загрузчик, только сперва прошивая его в тестовую плату.

 

5 часов назад, iiv сказал:

что есть в сети об этом

Вроде немало.

Share this post


Link to post
Share on other sites
04.08.2020 в 00:30, iiv сказал:

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

Насчет бутлодера и перепрошивки, тут вам нужно определиться с концепцией и вообще, с целесообразностью.
Если вам нужно менять прошивку раз в год, я бы не заморачивался с бутлодером, и шил все ПИКи как первый раз, через ICSP.
Если нужно это делать часто, тогда встает вопрос надежности бутлодера. Надежный бутлодер позволяет запустить (прошить) систему даже при отсутствии основной программы. А это его несколько усложняет и он растет в размерах.
Так что, если вам не критичен сбой при обновлении (достаточно маловероятный, но возможный), при котором конкретный ПИК "крашиться" и нужно лезть на плату и прошивать его через ICSP, то можно сделать все очень примитивно. Если такой вариант нужно исключить, придется читать и разбираться...

Я, когда еще работал с небольшими ПИКами, так и не добрался до бутлодера. Не видел смысла, не хватало ресурсов или надежности.
На MSP430 делал, но там тоже не все было хорошо с надежностью, аппаратная поддержка бутлодера у них была не очень.
Вот только на STM32, наконец-то я всем стал доволен :smile:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this