Jump to content

Простой загрузчик (BootLoader)


Starichok
 Share

Recommended Posts

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

а у меня к тебе возник вопрос.

если ты сам писал загрузчик, то чем тебя заинтересовал мой загрузчик?

Мудрость приходит вместе с импотенцией...

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

Link to comment
Share on other sites

Важные нюансы подбора литиевых ХИТ для разработчиков

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

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

ну, я так понял, что он написал, и работало.

Мудрость приходит вместе с импотенцией...

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

Link to comment
Share on other sites

Литиевые батарейки и аккумуляторы от мирового лидера EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. EVE является поставщиком аккумуляторных элементов круглого формата для электрических моделей автомобилей.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Да, сначала был написан бутлодер для тини 24. Там нет выделенной памяти под бутлодер и заморочек с областями откуда можно записывать и перезаписывать флеш из программы, там все просто! Также там нет УАРТА, пришлось написать. Ну и самое главное: перезаписывай любые страницы флеш из любого места! В тини 24 под бутлодер ушло 48% памяти. В проекте технологи выделили слишком мало физического места под схему. Потом развел плату, оказалось, что места не так уж и мало.

Потом выяснилось, что пинов впритык, и если будет дальнейшее расширение, их может не хватить. И после долгих (ну очень долгих) изысканий (цена, доступность, размеры) остановился на 88 (очень низкая цена, корпус чуть больше чем у 24, датчик температуры, а это важно, но не критически). Да, и сейчас все программируют на С и др. языках высокого уровня, что занимает очень (ну очень) много места, и чипы с небольшой памятью остаются не востребованы, и как следствие низкий спрос, и низкая цена!!! И при тупом переносе программы перезаписи страниц флеш программа не заработала... Ну и пошли изыскания, и я набрел на ВАШ проект, самый полный и законченный на то время. Нужно было выяснить чип который был у меня битый или я что-то упустил при программировании? (в бутлодерах я новичек) Недостаток 88 на сегодня, то что из пользовательской памяти нельзя перепрограммировать флеш, хотя страница стирается.

 

По поводу ВАШЕЙ программы: выяснилось, что при включенном фьюзе WDT в конфигурации, соединение не устанавливается, а в хелпе это не отражено. В некоторых ситуациях соединение можно восстановить лишь отключив / включив питание, сброс через ножку ресет не помагает.

Будем копать дальше,... и глубже....!

 

Иногда при "установить соединение" выдается сообщение, "соединение не установлено", а на осциллографе виден ответ с чипа?

Link to comment
Share on other sites

Продукция Hongfa для различных применений в Компэл

Компания HONGFA - это не только крупнейший в мире производитель электромеханических реле, но также производитель конденсаторов, вакуумных прерывателей, трансформаторов и низковольтного коммутационного оборудования. На складе КОМПЭЛ регулярно поддерживаются около 100 самых популярных позиций электромеханических реле. Реле Hongfa могут заместить многие изделия производства недоступных брендов. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

К 15 версии замечаний нет.

К 20 версии претензий нет.

СПАСИБО ВАМ за гигантскую, проделанную Работу!!!

Link to comment
Share on other sites

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

Иногда при "установить соединение" выдается сообщение, "соединение не установлено", а на осциллографе виден ответ с чипа?

когда я тестировал последние изменения (проверку ответа от МК), я сам выдергивал конвертер из гнезда.

после этого при попытке заново установить соединение сначала мне показывало, что соединения нет, а со второй попытки показывало, что соединение установилось.

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

видимо, что-то подобное происходило и у тебя.

 

по WDT.

следует отключить его фьюз.

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

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

 

то есть ты сравнительно недавно занялся загрузчиком на АТмега 88?

я в начале темы рассказал о разнице в длине загрузчика на ассемблере и на Си. получилось более, чем в 3,5 раза.

разница между АТмега8 и АТмега88 - в доступе к некоторым регистрам.

мне пришлось немного помучиться при переделке своего последовательного программатора с АТмега8 на АТмега88.

Мудрость приходит вместе с импотенцией...

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

Link to comment
Share on other sites

А да, точно GPIOR 1 и 2 вообще выпадают из концепции побитового доступа! 88 это уже микрочиповское изделие.

А WDT нужно  в хелпе просто указать, что нельзя программировать и не париться с перепрограммированием.

Я вообще никогда не занимался загрузчиками, не было задач, а тут вдруг "повезло"!

На этих чипах, с маленькой памятью  и низкой частотой работы только мелкие задачи решать. И на ассемблере программа получается более "гибкая" чем на С.

Link to comment
Share on other sites

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

ну, теперь ты знаешь про "собаку", и хелп можно не переписывать.

а если тебе это хочется видеть в хелпе, то сам можешь дописать в файл помощи.

а программа открывает этот файл и показывает его.

и там разница не только в доступе к GPIOR, а еще ко всем регистрам USART, и вроде, еще к каким-то, которые используются в программе.

если в АТмега8 все регистры доступны по in и out, то в АТмега88 некоторым регистрам следует применять lds и sts.

Мудрость приходит вместе с импотенцией...

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

Link to comment
Share on other sites

Да, совершенно верно, но за GPIOR обиднее всего, я применяю их в области векторов прерываний, не надо SREG сохранять и восстанавливать, выставил бит, а как правило следующая ячейка не используется и ставишь команду возврат из прерывания, коротко и быстро. А затем, если это не критичное прерывание, обрабатываешь его в основной программе.

Link to comment
Share on other sites

я не знаю, как пользоваться GPIOR.

в АТмега8 такого регистра нет.

я посмотрел даташит на АТмега88, там их 3 штуки - GPIOR0, GPIOR1, GPIOR2. а как ими пользоваться там не написано.

Мудрость приходит вместе с импотенцией...

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

Link to comment
Share on other sites

О, это очень полезные регистры! в 88 только GPIOR0 сохранил свои полезные свойства. использую их как флаги событий прерываний. для GPIOR0 адрес порта ввода-вывода 0х1Е, а значит к нему применяются команды cbi, sbi, sbic, sbis   ну и   in, out. Когда происходит прерывание, процессор переходит на адрес обработки прерывания, вот там-то мы и располагаем код:

sbi   GPIOR0, 0     ;установить в 1 бит 0 в регистре GPIOR0

reti                        ;вернуться из прерывания

 

Без использования регистра GPIOR0, а с использованием обычного регистра код выглядел бы иначе:

push   R0                          ;освобождаем регистр R0 для SREG и сохраняем его

in        R0, SREG               ;сохраняем SREG в R0, все флаги операций текущей программы

sbr     R23, 1<<0             ;выставляем флаг признака прерывания, например бит 0 в регистре R23

out    SREG, R0               ;восстанавливаем SREG, все флаги операций текущей программы

pop   R0                          ;восстанавливаем значение R0

reti                                  ;вернуться из прерывания

 

Нетрудно заметить......!

 

А, да команда:

sbr     R23, 1<<0

в идеале изменяет флаги в SREG, потому и такая длинная цепочка команд.

10 часов назад, Starichok сказал:

я не знаю, как пользоваться GPIOR.

в АТмега8 такого регистра нет.

Далее, из всего сказанного выше...

в АТмега8 до адреса ввода / вывода 0x1F, находятся некоторое количество регистров, которые крайне редко (...никогда...) используются, например: TWBR, TWSR, TWAR, SPCR, .......

их можно (... нужно...) использовать как GPIOR регистр.

До связи.

Link to comment
Share on other sites

идея использования, как регистры флагов, понятна.

6 часов назад, nik1234 сказал:

в 88 только GPIOR0 сохранил свои полезные свойства.

а GPIOR1 и GPIOR2 разве нельзя использовать, как регистры флагов?

6 часов назад, nik1234 сказал:

например: TWBR, TWSR, TWAR, SPCR, .......

у меня, как раз, используется TWI для вывода на экран 1602 через модуль I2C. но идея понятна.

а в АТмега8 можно использовать флаг Т в регистре SREG. но устанавливать его после восстановления SREG перед выходом из прерывания.

или коротко, как у тебя:

set

reti

но такое можно делать, если обработка события (прерывания) может подождать.

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

Мудрость приходит вместе с импотенцией...

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

Link to comment
Share on other sites

Про флаг Т: если он не используется в основной программе, а у меня он постоянно в деле.

для меня меня отложенная обработка прерывания обычное дело, нужно лишь правильно расставить приоритеты частей программы. И обычное дело: выставляешь частоту задающего генератора побольше, делишь его до получения частоты 1000 Гц каким либо таймером, загоняешь в прерывание с флагом. затем закольцовываешь основную программу с проверкой флага прерывания от таймера 1000Гц. загоняешь программу в Sleep. Получаешь кольцо обработки с образцовым интервалом в 1 мс. После любого прерывания проверяешь флаг от таймера, если он, то сбрасываешь флаг и начинаешь перебирать подпрограммы обработки индикаторов, клавиатуры, и тд. и тп, подпрограммы обработки флагов и др. После окончания обработки всех подпрограмм возвращаешься к Sleep. И так по кольцу. Если происходит прерывание не от таймера, программа выходит из Sleep, проверяется флаг от таймера, если не он (а это не он) обратно к Sleep. В большенстве программ использую этот алгоритм.

 

GPIOR1 и GPIOR2 в 88 условно можно использовать как флаги, но их адреса больше 0х1Е, на них не распространяются команды cbi, sbi, sbic, sbis, и их сначала нужно загрузить в общий регистр, промодифицировать, и заново сохранить. Эта последовательность длинная, и модифицирует SREG, что сводит на нет работу по сравнению с  классическим GPIOR.

Link to comment
Share on other sites

понятно.

но у каждого свои приемы и привычки программирования.

у меня в разных проектах "разметка" времени сделана по разному, но везде привязка к реальному времени по таймеру.

например, с динамической индикацией таймер работает по 2 мс, и в прерывании выводится очередной разряд индикации.

потом счетчик-таймер по 10 мс (5 х 2 мс) - для тех дел, которые нужно делать почаще, интерфейс с компом, обработка кнопок и что-нибудь другое.

потом счетчик-таймер по 1 секунде (100 х 10 мс) - именно для работы в реальном времени. тут может быть секундомер, если он нужен, и остальная ежесекундная работа.

а есть регулируемый БП (есть моя тема на этом форуме), где таймер тикает по 1/512 секунды. и по таймеру делается 256 измерений напряжения и 256 измерений тока. то есть, 512 измерений за 1 секунду. но и там есть счетчик для "короткого" цикла для "частых" дел (по 1/64 секунды == 15,625 мс).

Мудрость приходит вместе с импотенцией...

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

Link to comment
Share on other sites

Зачем выводить очередной разряд индикации в прерывании? Процессы вывода на индикацию и считывания клавиатуры - медленные процессы. В моей концепции: войдите в подпрограмму обслуживания индикатора, сделайте делитель на 2 и получите 2 мс на разряд, в этой же подпрограмме выведете очередной разряд на индикатор, и не надо отрывать время процессора на обработку прерывания. Для вывода на индикацию тогда вообще не нужно прерывания. Аналогично для кнопок. В моей концепции нужно лишь одно прерывание для таймера. Прерывания с обработкой в прерывании нужны в основном для УАРТА, для безпаузной передачи / приема на высоких скоростях. Ну может быть и2с или спиай, там тоже нужна высокая скорость обработки. вторичные таймеры / счетчики также прекрасно вписываются в предложенную концепцию. Самый большой ее плюс, то что время на прерывание минимально для медленных задач, и отсутствуют конфликты прерываний. А впрочем... у каждого свой путь...

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

 

 

Link to comment
Share on other sites

13 часов назад, nik1234 сказал:

Зачем выводить очередной разряд индикации в прерывании? Процессы вывода на индикацию и считывания клавиатуры - медленные процессы.

повторю:

у каждого свои приемы и привычки программирования.

а зачем - за тем, что вывод идет СТРОГО с равными промежутками времени.

и динамическая индикация - это не медленный процесс.

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

и клавиатура у меня "медленная", но обработка 3 или 4 раза в секунду и СТРОГО через равные промежутки времени по программному таймеру.

я учился, как делать прибор РЕАЛЬНОГО ВРЕМЕНИ на ассемблере, на текстах профессиональных программистов.

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

13 часов назад, nik1234 сказал:

В моей концепции нужно лишь одно прерывание для таймера.

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

остальное делаю по программным таймерам в основном цикле.

предлагаю обсуждение своих предпочтений на этом закончить.

Мудрость приходит вместе с импотенцией...

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

Link to comment
Share on other sites

  • 1 month later...

Загрузчик работает , подтверждаю .

На данный момент самый простой и удобный в освоении для юзера , типа меня . 

Link to comment
Share on other sites

спасибо за твою оценку моего труда.

Мудрость приходит вместе с импотенцией...

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

Link to comment
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.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  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.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.

  • Сообщения

    • Я попытался настроить частоту, но при отладке на первом же цикле while дебагер зависает. Подскажите в чем ошибка, код прикрепил.   void SClock_Conf(void) { RCC->CR &= ~0x00000001; // подготовка бита HSION RCC->CR |= 0x00000001; while (!(RCC->CR & RCC_CR_HSIRDY)) __NOP(); // ожидание готовности HSI RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLSRC_HSI; // подготовка бита PLLSRC RCC->PLLCFGR = RCC_PLLCFGR_PLLSRC_HSI; RCC->CR &= ~0x01000000; // отключение PLL // Настройка коэффициентов M, N и P RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLM_2; RCC->PLLCFGR = RCC_PLLCFGR_PLLM_2; RCC->PLLCFGR &= ~RCC_PLLCFGR_PLLN_2; RCC->PLLCFGR = RCC_PLLCFGR_PLLM_2; RCC->PLLCFGR &= ~0x00030000; // коэффициент P RCC->CR |= 0x01000000; while (!(RCC->CR & RCC_CR_PLLRDY)) __NOP(); RCC->CFGR &= ~0x00000003; // подготовка битов SW RCC->CFGR |= 0x00000002; // выбор PLL в качестве ист-ка тактирования while (!(RCC->CFGR & RCC_CFGR_SWS_PLL)) __NOP(); // Обновление SystemCoreClock SystemCoreClockUpdate(); }  
    • Попробую объяснить попроще: напряжение в 3-фазной сети могут быть разной величины, 3х36в, 3х127, 3х220, 3х380, и так до 750 кВ.   Однофазный частотник на 220 в выдаёт 3х220в, и ему без разницы включён двигатель звездой или треугольником. Но если двигатель 220/380 включить звездой в трёхфазную сеть 220, то мощность двигателя упадёт в 3 раза, и соответственно ваши 0,75 кВт превратятся в 0,25 кВт. Потому и  
    • А что там обслуживать ? Если не окончательно аккум накрылся женским органом, то выйдет от него светодиодную ленту/лампочки кормить если электричество отрубилось или на природе в палатке. Разрядный ток упса уже не потянет.  Но чаще всего бюджетные аккумы дохнут окончательно и бесповоротно и ничего с этим не сделать, вредительство и максимальная экономия на начинке.    
    • @irfps спасибо за пояснение Пока проверить работу бусин в стоке ключей в макете полумоста не могу, далеко от макета, возможно эта идея поможет снизить помехи переключения. Успехов и хорошего лета
    • Понимаю, я смотрел по аналогии, на другой плате, в общей сложности ещё на 4х кварцах, и везде там 0.7v. На выходе кварца понятно, что мультик бред покажет
    • Звук портят осциллографы, для любителей тлз и гираристов, трансформатор будет наоборот цимесом. И автоусилителях. Наверно и в бытовухе хватает, не интересовался. В звуковых картах тоже мьтирующие ключи на входе очень частое явление. Только этих ключей хватит ещё на один усилитель. Хотя наверно самое время забывать про МК и возвращаться к брутальной логике.
    • Сейчас не знаю а раньше достаточно было верхнюю пластиковую крышку снять и там пробки как в обычном акб. Для тех кто крышку снять не удосуживался - все не обслуживаемые конечно 
×
×
  • Create New...