Использовать ATTiny в качестве оперативной памяти с батарейным питанием?

Итак, на днях я нашел интересную статью и пытаюсь создать проект, который мог бы извлечь выгоду из памяти с батарейным питанием (без ограничений по износу, но сохраняет данные при включении питания). В статье описывается, как очень малый ток от светодиода (действующего как фотоэлемент в освещенной комнате) случайно запитал AVR во время теста на выносливость RAM.

Но что, если это сделано специально с аккумулятором?

(Статья здесь: https://wp.josh. com/2014/03/03/the-mystery-of-the-zombie-ram/)

Проблема с этой идеей (поскольку ОЗУ уже можно бэкапить, как показано в статье, хотя автор, похоже, не учел этого) заключается в том, что мне нужен способ сохранить массив памяти игнорируется инициализатором C. Было бы забавно, если бы память пережила событие отключения питания только для того, чтобы быть уничтоженным кодом сброса питания чипа. Перечисленный пример в этой статье будет работать для первого требования, но нарушит почти все остальное, что я могу попытаться сделать (поскольку он переопределяет весь инициализатор). (Прокомментируйте проблему сброса: https:// wp.josh.com/2014/03/03/the-mystery-of-the-zombie-ram/#comment-598)

Кроме того, если бы я попытался это сделать, не повредил бы я штифт вместо подачи питания? Я планирую использовать контакт, постоянно настроенный на input, подключенный к положительной стороне литиевой батарейки типа «таблетка» с общим заземлением. Теоретически, питание AVR (и, я думаю, при любом напряжении) через контакт VCC приведет к тому, что диоды чипа отключат аккумулятор, но если он отключен, ядро получит достаточно энергии, чтобы поддерживать работу ОЗУ.

Конечно, мой вопрос заключается в том, будет ли он вместо этого тупо пытаться поддерживать работу ядра при отключении питания (в исходной статье нановатты светодиода не могли этого сделать, так что это принудительно выключается, но я не знаю, связано ли это исключительно с ограничениями мощности или это приведет к отключению основных систем, если нет соединения через VCC). В этом случае он может попытаться потреблять более 1 мА от этого паразитного источника питания и попытаться запитать весь чип, когда я этого не хочу (таким образом поджаривая фиксирующий диод или что-то не менее плохое).

Интересно, можно ли в этом случае просто поставить большой резистор (10K? 1M?) последовательно с батареей? Это автоматически ограничит подачу менее 1 мА.

, 👍1

Обсуждение

Вы безумец. Просто используйте чип NVSRAM. https://www.microchip.com/wwwproducts/en/23LCV512, @Majenko

Re «сохранять массив памяти, игнорируемый инициализатором C»: просто добавьте [__attribute__((section (".noinit")))](https://www.nongnu.org/avr-libc/user-manual /mem_sections.html#sec_dot_noinit)., @Edgar Bonet

Я, наверное. Но я пока стараюсь избегать покупки вещей (и времени их доставки). **Однако похоже, что это работает, так что спасибо, Эдгар.** Это на самом деле довольно круто, потому что это можно сделать, в "О, как это вообще такое?!" мода..., @RDragonrydr

@EdgarBonet - используйте поле для ответа, чтобы ответить, пожалуйста. Люди не должны искать ответ в комментариях под вопросом. Тогда это может быть принято, и вы можете получить репутацию. :), @Nick Gammon

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

это не вопрос ардуино, @Juraj

Зачем вам зависеть от зомби-барана, если вы можете просто перевести ATTiny в режим глубокого сна? ATTiny может годами спать на одной ячейке-монетке. Используйте диод для подключения VCC к выводу Vcc ATTiny. Используйте другой диод для подключения батареи к тому же контакту Vcc. Подключите VCC (через резистор) к выводу прерывания ATTiny, чтобы увидеть, работает ли он от батареи или нет., @Gerben

К двум приведенным выше комментариям я пытаюсь использовать ATtiny, который уже есть в моем проекте, в качестве периферийного устройства (подчиненное устройство I2C и быстрый выборщик данных) для _store_ данных. Я не могу просто перевести его в спящий режим, потому что ему нужно взаимодействовать с другими компонентами, что либо быстрее разрядит резервную батарею, либо потребует отключения его резервного источника питания от основной шины. Мой вопрос также был в основном о программной части конструкции (и, в меньшей степени, о поведении чипа), которая, вероятно, должна считаться скорее Arduino, чем электроникой., @RDragonrydr


2 ответа


Лучший ответ:

2

Расширение моего предыдущего комментария...

Мне нужен способ сохранить массив памяти, игнорируемый инициализатором C

Этого можно добиться, указав компилятору сохранять массив в раздел памяти «.noinit»:

int my_array[ARRAY_LENGTH] __attribute__((section(".noinit")));

Ваш массив окажется где-то между .bss и кучей (если есть) и не будет затронут подпрограммой __do_clear_bss из код запуска C.

< цитата>

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

Скорее всего. Чтобы избежать этого, я предлагаю вам включить затемнение обнаружение путем установки фьюзов BODLEVEL. Эта особенность ATtiny специально предназначен для предотвращения запуска ядра ЦП, если напряжение питания ниже некоторого настраиваемого порога.

,

0

Для тех, кто хочет узнать, как я это реализовал, я установил предохранитель BOD на своем устройстве. Тем не менее, не желая такого рода забавы (имея в виду, что чип пытается фактически запустить от обратного питания) вообще произойти, я подключил последовательно резистор 1 МОм с питанием, подаваемым через контакт ( который был установлен на INPUT во всех случаях.HIGH приведет к попытке зарядить резервную батарею, а LOW может снизить входной ток и свести на нет преимущества) в попытке заставить ток быть достаточно высоким для питания ОЗУ, но слишком низко для его запуска. Это также гарантирует, что через штырь не будет протекать слишком большой ток.

Мои результаты были несколько противоречивыми, и не помогает то, что устройство может фактически получать питание от любого светодиодного индикатора, добавленного, чтобы показать, что оно работает!

Тем не менее, есть хороший шанс, что его можно использовать как NVRAM, если для него написан код. Что касается этого, просто сохраните массив со значениями и напишите код onReceive и onRequest, чтобы проиндексировать его и отправить обратно!

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

,