Jump to content

Может ли кто посмотреть все ли в порядке с прошивкой Atmega48v-10au?


Armenn
 Share

Recommended Posts

Прошивка снята с увлажнителя. (Ионизатором были убиты порты в действующем контроллере) Есть две кнопки, реле, датчик влажности и цифровой индикатор.

Индикатор не светится, ну и функционал не работает.

Может кто посмотреть прошивку и сказать что в ней все плохо или должна работать? 

ATMEGA48V@TQFP32.BIN

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

Link to comment
Share on other sites

Это бинарный файл. Его можно посмотреть только дизассемблером, который выдаст на гора листинг в виде голых инструкций процессора. Если кто-то и возьмётся его анализировать, то это будете Вы. :-)

Link to comment
Share on other sites

А хотя бы понять можно, это мусор или есть логика в файле?

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

Link to comment
Share on other sites

LIR-20 – модуль резервирования питания от MORNSUN
Компания MORNSUN расширила линейку продукции, монтируемой на DIN-рейку, выпустив модуль резервирования питания LIR-20 с максимальным током до 20 А на канал. Модуль можно использовать на шинах с напряжением 24 или 48 В (полный диапазон напряжения 22…60 В). Данный модуль применяется в системах, где даже выход из строя источника питания (ИП) не должен привести к потере напряжения. К модулю резервирования подключаются два источника питания, причем один из них может быть бесперебойным (ИБП; UPS), и нагрузка.

Читать подробнее >>

18 минут назад, Armenn сказал:

это мусор или есть логика в файле?

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

Link to comment
Share on other sites

LED-драйверы MEAN WELL – выбор больше, стоимость ниже

Компэл расширил и существенно пополнил склад LED-драйверами компании MEAN WELL, одновременно снизив цену на них. В настоящий момент на складе представлена широкая линейка продукции для наружного (семейства HLG, ELG, XLG, LPC, LPV), и для внутреннего (APC, LCM, SLD, APV) освещения.

Имеется большой выбор моделей с различными режимами стабилизации выходных параметров. Кроме того, есть в наличии и линейка DC/DC-драйверов, как понижающих (семейство LDD), так и повышающих (семейство LDH).

Подробнее>>

Популярные модели литиевых батареек FANSO EVE Energy готовы к отправке
На складе КОМПЭЛ уже готовы к поставке одни из самых востребованных литиевых батареек типов ER и CR производства FANSO EVE Energy – одного из мировых лидеров на рынке первичных литиевых элементов питания.
Данные источники тока получили широкое применение в различных областях, будь то системы безопасности, приборы учета или мелкая бытовая техника. 

Подробнее о применениях>>
 

Просто в программаторе сохранил .hex

ATMEGA48V@TQFP32.HEX

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

Link to comment
Share on other sites

Источники питания MEAN WELL для медицинских устройств на складе Компэл

Компэл расширяет складскую программу по специальным ИП для применения в медицинских приборах и устройствах. Представлены ИП в диапазоне мощности от 5 до 500 Вт, по медицинскому стандарту EN60601-1 с двумя мерами защиты пациента (2хMOPP; тип BF) для устройств, контактирующих с пациентом.  Все эти надежные источники питания могут применяться не только в медицинских устройствах.

Подробнее>>

Протеус пишет - Большой объем файла. В Мегу 48 не влазит.
Program file is too big for the microcontroller: flash size = 4096, load address = 4096, number of bytes = 16.
 

Link to comment
Share on other sites

@andrusha152

Сохранил только флэш.

ATMEGA48V@TQFP32_flash.HEX

16 минут назад, Electric_84 сказал:

а схему устройства где взять?

Нужно только две ноги. На одну поступает 1 когда вода есть. Со второй включается реле. Протеус демо качаю.

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

Link to comment
Share on other sites

Динамическая индикация работает, вроде. Но подключал на глаз, как попало. Мало информации. Протеус пишет, что нет опорного напряжения для АЦП.

Безымянный.jpg

Link to comment
Share on other sites

On 7/20/2022 at 7:25 PM, Armenn said:

А хотя бы понять можно, это мусор или есть логика в файле?

Я уже очень давно не работаю с AVR, но если мне не изменяет память, то в самом начале прошивки обычно идёт таблица прерываний. Первая запись — вектор сброса и она всегда валидна. Остальные должны содержать или переходы к ISR или содержать инструкцию типа RETI (возврат из прерывания).

Согласно этому документу (страница 140) код операции инструкции RETI — 0x9518. Такой комбинации в области, выделенной под таблицу прерываний нет. Можем также предположить, что по адресу вектора сброса находится инструкция JMP, посредством которой осуществляется переход в тело программы. Код этой операции также можно посмотреть в упомянутом документе, но уже на странице 103. В отличие от RETI его размер составляет 4 байта и точное значение зависит от адреса перехода, но первые 4 бита постоянны и равны 0x9. Таковых в первом байте не наблюдается.

Из сказанного выше можно сделать два предположения:

  1. автор прошивки не использовал прерывания и его программа начинается непосредственно с нулевого адреса;
  2. считанная прошивки "бита";

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

Edited by El-Shang
Link to comment
Share on other sites

Что, до сих пор никто не дизассемблировал?

avr-objdump -D ATMEGA48V\@TQFP32_flash.HEX -m avr > res.lss

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

res.lss

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Link to comment
Share on other sites

@COKPOWEHEU, спасибо за намётку! Не знал, что objdump умеет в дизассемблер.

Если судить по результатам его исполнения всё выглядит действительно удобоваримо. Хотя переход по адресу вектора сброса в каждом неиспользованном прерывании выглядит немного странно. Но это вкусовщина, однако. :-)

Link to comment
Share on other sites

Не обязательно автоматическая. Такая рекомендация, например, есть в статье на этом сайте:

 

Цитата

На месте каждого неиспользуемого в программе прерывания желательно поставить “заглушки” в виде команды возврата rjmp 0 или reti, как это сделано в строках 14…31.

 

Link to comment
Share on other sites

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

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

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

Link to comment
Share on other sites

Отчасти имеет. Если используется только прерывание из середины таблицы векторов, что писать между вектором перезагрузки и вектором используемого прерывания? Для примера та же тринадцатая тинька. Первым номером у неё идёт ресет, дальше внешнее прерывание, прерывание по смене состояния пина, и только четвёртым идёт прерывание по переполнению таймера. Что писать во второй и третьей строке, если используется только четвёртая? Или есть способ "ужать" таблицу, дав понять контроллеру, где теперь искать вектор для переполнения таймера?

Link to comment
Share on other sites

Программисты знатные параноики, однако. :-)

Чисто теоретически неучтённая аномалия может привести к тому, что разрешится некоторое прерывание, для которого не предусмотрен вектор обработки. Если не прописать в соответствующую "строку" таблицы что-то вменяемое, как тот же RETI или, RJMP последствия могут быть довольно непредсказуемые: от спонтанного сброса до прыжка в случайную область памяти и попыткой исполнения там каких-то инструкций.

Такие ошибки встречаются крайне редко, но полностью исключать их нельзя. И даже в абсолютно правильно работающей программе тоже. Интересующеся могут загуглить SUT или Single Upset Event к примеру.

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

Edited by El-Shang
Link to comment
Share on other sites

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

НО, правильно написанный код исключает такие проблемы.

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

НО, правильно написанный код исключает такие проблемы.

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

Link to comment
Share on other sites

52 минуты назад, Гость_Григорий_Т. сказал:

у каждого прерывания есть адрес

Верно.

1457141391_.png.2c30981afff3fa4cd78cfff90d05468a.png

И если мне нужен только вектор переполнения таймера, у меня есть два варианта. Первый - явно указать компилятору писать команду rjmp TMR по адресу 0х0003. При этом адреса 0х0002 и 0х0001 скорее всего останутся незадействованными - едва ли компилятор туда что-нибудь запихнёт. Второй вариант - адреса 0х0002 и 0х0001 забить заглушками. Оно понятно, что это ловля байтов, но ведь интересно, это во-первых, а во-вторых, в программировании микроконтроллеров каждый байт может стать на вес золота - ну иногда :-)

Link to comment
Share on other sites

1 hour ago, Гость_Григорий_Т. said:

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

Почему? Вот использую я для включения прерывания некую переменную, в которую записал бит логическим ИЛИ. А остальные оставил без изменений. А переменная стековая и рядом с нужным битом затесался ещё и ошибочный. И включилось прерывание не только, скажем, по переполнению таймера, но ещё и по совпадению.

В дальнейшем во время исполнения программы это условное "переполнение" сработает, но если в таблице прерывания на этом векторе установлен RETI, то исполнение благополучно вернётся обратно.

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

Edited by El-Shang
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.
×
×
  • Create New...