Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » BootLoader без передёргивания Reset


BootLoader без передёргивания Reset

Сообщений 1 страница 30 из 32

1

Привет всем. Подскажите пожалуйста можно ли использовать баскомовский бутлодер без сброса ножки Reset? В конце программы нашёл вот такой код:

Код:
 'How to call the bootloader from your program without a reset ???
Do
   Print "test"
   Waitms 1000
   If Inkey() = 27 Then
      Print "boot"
      Goto &H3C00
   End If
Loop

'The GOTO will do the work, you need to specify the correct bootloader address
'this is the same as the $LOADER statement.
 


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

0

2

Ну так логично же - это механика МК, какой бут без аппаратного сброса? Или вы умеете программно делать хардварный сброс?
Только ХМега умеет такое делать, все обычные (атмеги) - нет, причем после отработки бутлоадера можно подпортить регистры/память, следовательно это надо учитывать для дальнейшей работы программы (обязательно должна быть инициализация всех переменных и не основываться на старте голово МК). Кстати говоря, режим бутлоадера - это не просто старт на определенном адресе, это область из которой МК имеет право перезаписывать память программ (флеш).
В общем не так всё просто.

0

3

emal-05 написал(а):

Перепробовал всякие комбинации, не хочет работать без сброса и всё.

:rofl:
Странно, и это похоже на холивар с LCD 4*20, тема большая а толку мало, даже либу выложил - обвинили в некомпетентности.

По поводу бутлоадера - есть в нете версия на ассемблере, которую нужно "немного" допилить и она ПРЕКРАСНО работает с баскомом БЕЗ сигнала Reset!  Более того, его можно в 512 байт поместить, что является самым малам для камня 328Р!

Могу "запилить" видео работы и бутлоадера и LCD4*20 , чтобы не обвинили в голословности.

PS: дурдуина же работает без Reset???

0

4

RDW написал(а):

Или вы умеете программно делать хардварный сброс?

Дышим ровно, баском "умеет"
КартинкО:
http://s8.uploads.ru/t/p7Ndv.jpg

0

5

RDW написал(а):

Только ХМега умеет такое делать, все обычные (атмеги) - нет, причем после отработки бутлоадера можно подпортить регистры/память, следовательно это надо учитывать для дальнейшей работы программы (обязательно должна быть инициализация всех переменных и не основываться на старте голово МК)

Да ладно  :D
Вздуваем вачдог и в "пустом" цикле и получим "железный" Reset с "пометкой" в MCUSCR о том, откуда прилетел Reset. Тут же, без инициализации стэка сохраняем все 32+статусный+маску прерываний+RampZ+ещё что "жизненно" важное в зависимости от проча и ничего никогда не потеряется  :rofl:
ЕслиЧо RTOs работает ИМЕННО так, все ШЕСТЬ таймеров доступны на 328Р      :cool:

-1

6

-NMi- написал(а):

PS: дурдуина же работает без Reset???

Внимательно посмотрите схему и заметите что вывод сброса используется.

-NMi- написал(а):

баском "умеет"

Через программатор если он это поддерживает.

0

7

У меня ПОЧЕМУ умеет???  :music:
И 328Р и 1280 и 2560 у меня УМЕЕТ сбрасывать баском и уже года эдак ДВА я не нажимаю кнопку Reset для перезаписи скетча на баскоме!
Это как в анекдоте: - доктор, я уникален? - нет, вы звездабол  :rofl:

Кому нужно видео "запилить", а? Кидайте контакты в личку, скину специально в приват, паблика не будет, т.к. проект коммерческий.

0

8

-NMi- написал(а):

Вздуваем вачдог и в "пустом" цикле и получим "железный" Reset с "пометкой" в MCUSCR о том, откуда прилетел Reset.

Тогда не получится использовать собаку по прямому назначению.

-NMi- написал(а):

ЕслиЧо RTOs работает ИМЕННО так, все ШЕСТЬ таймеров доступны на 328Р

В 328 только 3 таймера.

Не по теме

Не знаю как в AVR, но в ARM, ОС использует системный таймер (24-ех битный), который видимо для этого (для ОС) и предназначен. Кроме того есть прерывания SVC (Supervisor Calls) и PendSV

-NMi- написал(а):

И 328Р и 1280 и 2560 у меня УМЕЕТ сбрасывать баском

Я не просто так написал что нужно посмотреть схему ардуины.

Схема

https://arduinoplus.ru/wp-content/uploads/2017/09/nano-principialnaya-shema.jpg

Посмотрите с чем связан вывод сброса МК. Если все равно не поняли, обратите внимание на конденсатор C4.

0

9

Пётр написал(а):

Тогда не получится использовать собаку по прямому назначению.

Ну так почему-же у меня всё работает, втч. и вачдог и ресет через него ???  :D   И не только у меня, кстати  :D

Пётр написал(а):

В 328 только 3 таймера.

Серьёзно? А счётных регистров на одном таймере сколько? А "волшебных" выводов OCRxA(B) в 328Р сколько? Дурдуинщики вон до сих пор только двумя светодиодами диммировать научились  :rofl:  Могу показать проект диммирования 12-ю светодиодами с градацией от 0 до 255 на "половинке" от Timer0 + I2C LCD + джойстик +6 PWM, точнее 4 свободны а с таймера 0 они тоже не задействованы.

Пётр написал(а):

Я не просто так написал что нужно посмотреть схему ардуины.

Это типа я её впервые вижу, схему эту?
Да, я знаю для чего там "перемычка" - но у меня в 328Р (во всех её реализациях) это почему-то работает везде... Перемычек нет от слова СОВСЕМ! Странно, да?  В 1280 и 2560 там вААще стоит восьмая мега - но тем не менее и это прекрасно работает... Почему... ???  В версиях БЕЗ программатора, конечно, такой фокус не пройдёт, зато есть фича с вачдогом и она работает. Вообще есть много фич заставить процессор "ресетнуться" тогда, когда именно я захочу и сделать это хоть программно, хоть аппаратно. Открыть тайну?  :D
Хочу я софт обновить а программатора то и нету... но ничо, и так сойдёт... Втыкаем в I2C шинку 24Схххх микросхемку с уникальным заголовком в первых 256 байтах, фокус с вачдогом и бесконечным циклом и вуаля - девайс обновлён... Гениально? - нет, это старо как мир  :D   Жаль вот только идея с радиомодулями у меня "остыла" - а так-то можно было и через 433 мГц обновиться.

0

10

Пётр написал(а):

Если все равно не поняли, обратите внимание на конденсатор C4.

У меня тогда совсем-совсем глупый вопрос - почему на ардуине и У МЕНЯ ВСЁ ЭТО работает а у вас:

emal-05 написал(а):

первый раз моя прога заливается без сброса Reset, все последующие записи происходят только после сброса Reset.

0

11

-NMi- написал(а):

А счётных регистров на одном таймере сколько?

В таймере один счетчик. Регистры сравнения это не счетчики.

0

12

Вачдог - да, ресетит, но тогда мы получаем другую проблему, поддержку работы вачдога - профит.  :D

0

13

С точки зрения таймеров и иже с ними счётчиков, от таймера нам нужно событие а от счётчика, собственно, счёт. Так вот, самый простой Timer0 может нам "выдать" по крайней мере аж целых ТРИ события, которые нам так нужны: - собственно факт переполнения таймера и, собственно, аж целых ДВА факта совпадения. Иными словами мы имеем спринтера (ОДНОГО, я подчёркиваю, спринтера) который стартовал с некой стартовой позиции и мы так-же имеем возможность "взять" с него некие обязанности, пока он добежит до конца своей дорожки или пробежит 100 метров и поднимет флаг 100-а метров и так далее. Итого, один спринтер а событий более одного, перебор? Нет, это нормально. Это про таймера и их использование.

Про бутлоадеры, вачдоги и прочее...  Все знают про ардуину и вачдог в некой библиотеке, после которого ардуина "умирала" по причине "невлезания" во временные рамки при очередной записи скетча со вздутым вачдогом. Напомню, в 328Р максимальный вачдог = 8 секундам.  Поэтому экзерсисы с вачдогами и бутлоадерами имеют место быть при определённом "скилле", чтобы небыло потом таких тем и среди ардуинщиков и среди баскомовцев.

Напомню, что это всё в СТАНДАРТНОМ исполнении работает у меня прямо из СТАНДАРТНОГО баскомовского загрузчика, нужно только в одном месте добавить одну команду и всё буитвелл  :rofl:
Это всё уже написано мной ЗДЕСЬ, на этом форуме, где, куда и что добавить шоб робило!  :flag:

Так шо как грицца: - у меня всё работает, а вам не знаю что ещё посоветовать...

0

14

RDW написал(а):

Вачдог - да, ресетит, но тогда мы получаем другую проблему, поддержку работы вачдога

МЫ это кто? Я стесняюсь, но спрошу.
Поддержку вачдога? Зачем он нужен, мне вот интересно, можете мне объяснить? Если объяснение будет основано на парадигме, мол вот зависло, несдюжило и тд. и проц ресетнулся сам по себе  --- это не вачдог, это догшит.

В нете есть чото мААненькое типа RTOs колибри или чото наподобие, там диспетчер написан как раз на вачдоге и прикольно так, яб сам долго догадывался, как так можно заставить вачдог работать... но с этим лично я сталкивался, когда дэзил буржуйский проц. Тема есть здесь, на этом форуме. Мне в ответ написали - это ошибка компиляции компилятора. Возможно, что это и так, но это не так, как раз таки это и есть RTOs. Там как раз хитрые вариации со стэком, вроде как ни к чему и не приводящих, но это только так кажется.  Поэтому при таком подходе вачдог как таковой и не нужен будет! Даже если вы напишите "глухой" пиреход тиа:
_000:
goto _000
то ничего не произойдёт, программа никогда не повиснет! Не буду говорить про !CLI команду, идея с таймерами тогда накроется медным тазом  :rofl:

0

15

Повторюсь, регистр сравнения <> счетчик. Если не согласны, покажите код, использующий один таймер, скажем Timer1, генерирующий прерывания каждые 1 мс, 40 мс и 128 мс.

0

16

Пётр написал(а):

генерирующий прерывания каждые 1 мс, 40 мс и 128 мс.

:rofl:
АДЫН - Генерируем 1 мс
ДВА    - Считаем СОРОК раз
ТРЫ    - Считаем СТО ДВАДЦАТЬ раз
И так далее, можно генерить сколько угодно событий кратных первоначальному кванту времени.

0

17

Вариант ДВА, более извращённый, но должен работать.
Ставим АППАРАТНО 128 мс.
Первый счётный на 1 + прерывание в вектор.
Второй счётный на 40 + прерывание в вектор
128 будет по переполнению.

Всё будет аппаратно, заметьте  :flag:

0

18

У меня тогда ответочка будет: 328Р имеет 32кб. Поделим "условно" память на 8 частей по 4 кб. Верхушка вектора, дно - бутлоадер. Их использовать не будем. Вопрос:  Каким образом узнать с точностью до 1 мкс какая часть из 6-ти выполняется в единицу времени?

0

19

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

Изначально идея была такая, использовать блютуз модуль HC-04 (который вылялся без дела), у него есть вывод RTS, его и хотел повесить на Reset и вроде бы все счастливы. Но выяснилось что RTS на модуле по умолчанию отключен. Заморочился с блютуз модулем, установил BlueLab, собрал програматор LPT-ISP (из резисторов) и вроде всё зашибись, прога PSTool законектила мой модуль, но первый блин вышел комом. Вроде бы правильно поправил ключи, но вывод RTS так и не заработал. Решил пока отложить танцы с бубном вокруг модуля, использую у него RX и TX, а на Reset пока повесил кнопку.  Взял ноут настроил в нём блютуз, нажал баскоме F4, потом нажал кнопку на плате и прога пошла заливаться и никаких проводов. Это гораздо удобнее чем снимать кучу разъёмов.

0

20

Не знаю, возможно начнёте меня пинать, но так как не силён в бутлодерах, единственная идея для автоматизации сброса, которая возникла:
Сначала посмотрел что "говорит " баском в ком порт при нажатии F4. Если в настройках бута, там где сброс, поставить НЕТ, то он шлёт постоянно 7B, а если поставить ПРОГРАММА и в поле вписать какой то символ (букву или цифру), то он сначала посылает код этого символа, а после уже начинает слать 7В. Так вот идея такая, вписываю в поле несколько символов, на плату ставлю ещё один простенький камень с UART. Как только он примет необходимую последовательность символов, которую я задал в баскоме, пусть дёрнет ножкой порта на 1-10 мс, а эту ножку кину на Reset программируемого контроллера.  В теории вроде всё просто получается, как будет работать в реале пока не знаю.

0

21

-NMi- написал(а):

АДЫН - Генерируем 1 мс
ДВА    - Считаем СОРОК раз
ТРЫ    - Считаем СТО ДВАДЦАТЬ раз

Аппаратно, а не программно.

-NMi- написал(а):

Вариант ДВА, более извращённый, но должен работать.
Ставим АППАРАТНО 128 мс.
Первый счётный на 1 + прерывание в вектор.
Второй счётный на 40 + прерывание в вектор
128 будет по переполнению.

Условие.

Пётр написал(а):

генерирующий прерывания каждые 1 мс, 40 мс и 128 мс.

Как таймер настроенный на переполнение каждые 128 мс, сможет аппаратно генерировать прерывания каждые 1 мс? Ну я думаю понятно что у таймера один счетчик и регистры сравнения выполняют немного другую функцию.

emal-05 написал(а):

каждый раз откручивать плату, снимать с неё кучу разъёмов и тащить до компа.

USB удлинитель и внутрисхемная прошивка не решают проблему?

emal-05 написал(а):

Взял ноут

Если есть ноут, тогда зачем тащить плату до компа? Не проще притащить ноут до платы?

0

22

Пётр написал(а):

генерирующий прерывания каждые

Первый вариант может генерить хоть 1мс, 15, 26, 45 и так далее с точностью до минимального кванта, т.е. 1 мс.  - это программно.

Аппаратно один таймер "сдюжит" только два прерывания в диапазоне от 1 до 255 квантов + 256 квант прерывания по переполнению. По-моему это очевидно.

0

23

Есть некоторая проблемка в проводах, даже при наличии ноута. А так то да, взял бы USB-UART с выводом DTR, который с этой работой справляется на ура и так же валяется пока без дела.

0

24

emal-05 написал(а):

возможно начнёте меня пинать

Не начнём а пнём таки уже в нужном направлении.
Идея очень проста - создать некую систему команд, подать эту команду через UART или ещё как-нибудь (I2C, SPI) и выполнить прямой переход в область загрузчика без всякого Reset-а, ибо команда SPM будет работать только в "том" адресном пространстве и никак не по другому. Далее собирать пакеты в странички и писать из бута во флешь.

emal-05 написал(а):

В теории вроде всё просто получается, как будет работать в реале пока не знаю

А что будет, если пакет пропадёт через блютус?
Контролька? Придётся сегментами считывать в память RAM а потом страницами грузить в Flash и на каком-то этапе переписывать таблицу векторов... глючновато может выйти.
У меня была такая идея, но я хотел поступить по другому: "накопить" все пакеты во внешней памяти 24Схх и по команде уйти в бут, аппаратно запретив абсолютно все фичи, втч и вачдог. Потом через отдельный флаг программно перезапустить проц, ибо в случае с вачдогом как такового перезапуска со стиранием и инициализацией не будет.
Советую у кого-нить "подсмотреть" :flag:

0

25

-NMi- написал(а):

Аппаратно один таймер "сдюжит" только два прерывания в диапазоне от 1 до 255 квантов + 256 квант прерывания по переполнению. По-моему это очевидно.

Но частота этих прерываний не может отличаться от частоты переполнения (т. е. не может быть скажем 10 прерываний от CompareA при одном от переполнения), верно? Тогда о каких 6 таймерах идет речь?

-NMi- написал(а):

все ШЕСТЬ таймеров доступны на 328Р

+1

26

Просто в данный момент нужно срочно прогу отлаживать и нет особо времени переключаться на изучение работы бутлодера. Раз так всё заморочено, может пока и кнопкой обойдусь. Надо подумать.

0

27

Пётр написал(а):

Тогда о каких 6 таймерах идет речь?

В 328Р есть ШЕСТЬ аппаратных пинов от ТРЁХ таймеров и именно на ЭТИХ ШЕСТИ пинах можно генерить аппаратно практически всё что угодно. Если поработать в этих прерываниях ещё и программно, то можно существенно увеличить функционал, естественно в рамках, которые я описАл выше.

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

0

28

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

+1

29

Короче, пока пошёл по самому простому пути. В своей проге, которую нужно заливать по бутлодеру, включил прерывания по UART. В подпр. обработчике этого прерывания считываю байт (код ASCII символа). Если этот код равен тому который я указал в настройках бута в баскоме, то вывести на свободный вывод порта 1. Этот вывод инвертирую через транзюк и завожу на Reset. На Reset соответственно подтяжку к Vcc через резюк 10к и кондёр на GND (100nF-1uF), всё. Теперь когда нажимаю F4 (заливка в контр.) в баскоме, прога принимает нужный символ и сама дёргает Reset, прога заливается. Пробовал на скорости 115200 всё отлично летает и самое главное, прога при этом нормально работает.

0

30

emal-05 написал(а):

В подпр. обработчике этого прерывания считываю байт (код ASCII символа). Если этот код равен тому который я указал в настройках бута в баскоме, то вывести на свободный вывод порта 1

Зачем так витиевато то?  Измени условие, типа если этот равен тому -->> то GoTo на адрес бутлоадера, вроде, &h3c80 и не нужно будет ни транзистор ни ногу Reset "дёргать"  :D

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

emal-05 написал(а):

и самое главное, прога при этом нормально работает.

Дык с чего она не правильно работать-то будет? Ты абсолютно ничего не поменял в ней  :flag:

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » BootLoader без передёргивания Reset