Atmega 328P-PU: перестает работать внутренний генератор при понижении напряжения питания

Cadil
Offline
Зарегистрирован: 27.06.2018

С помощью платы Arduino UNO загрузил в Atmega 328P-PU бутлоадер Arduino as ISP.                              Разные скетчи в схеме Atmega+кварц 16 МГц выполняются при напряжении питания МК 5В, а при переходе на питание от батареек (3В) перестают выполняться. Одна из возможных причин - понижение частоты генерации контроллера при  понижении напряжения питания.

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

Есть методы изменить фьюзы в моем случае без спецпрограмматора? Раньше фьюзами не занимался - не было необходимости.

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Cadil пишет:

Есть методы изменить фьюзы в моем случае без спецпрограмматора? 

Нужен обычный ISP программатор. Также можете воспользоваться другой ардуиной (Arduino ISP), как Вы уже делали ранее с бутлоадером. Более распространённые программы для прошивки МК и изменения фьюзов -  SinaProg, AVRDUDE_PROG.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Cadil, прежде чем менять нужно убедиться что проблема действительно из-за fuse.  По умолчанию на UNO bodlevel=2,7в  И учитывайте, что при частоте 16МГц мк не обязан работать при таких низких напряжениях.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

На всякий случай график из даташита:

enjoyneering
enjoyneering аватар
Offline
Зарегистрирован: 05.09.2016

как написал dimax, atmel не гарантирует нормальную работу чипа на таких скоростях и напряжениях. вам нужна плата на 8MHz, она нормально заводится от 3.3в. если хотите питать ATmega328 от 1.8в до 5.5в нужно менять кварц на 4MHz и перепрошивать bootloader на спецальный (тк arduino официально не работает на таких частотах)

еще вариант взять Blue Pill/STM32F103, она работат на частоте 72MHz при напряжении от 2в до 3.6в

 

кому лень читать ссылки вот линк на 4MHz загрузчик для ATmega328 (естетвенно с заменой кварца на 4MHz)

 

p.s. видел тут копипасту из моей статьи про Blue Pill - даже текст и тот сами написать не могут. куда мы кОтемся?

Cadil
Offline
Зарегистрирован: 27.06.2018

Jeka_M пишет:

Cadil пишет:

Есть методы изменить фьюзы в моем случае без спецпрограмматора? 

Нужен обычный ISP программатор. Также можете воспользоваться другой ардуиной (Arduino ISP), как Вы уже делали ранее с бутлоадером. Более распространённые программы для прошивки МК и изменения фьюзов -  SinaProg, AVRDUDE_PROG.

Спасибо, просветили! Буду знать на будущее.

 

Cadil
Offline
Зарегистрирован: 27.06.2018

dimax пишет:
Cadil, прежде чем менять нужно убедиться что проблема действительно из-за fuse.  По умолчанию на UNO bodlevel=2,7в  И учитывайте, что при частоте 16МГц мк не обязан работать при таких низких напряжениях.

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

Заменил в схеме кварц  16 МГц на 8 МГц, но, как и раньше, схема при уменьшении напряжения питания с 5В (преобразователь UART)  до 2,8В (батарейки АА) перестает работать. Хотя, судя по графику, должна (2,7В - 10 МГц). 

Cadil
Offline
Зарегистрирован: 27.06.2018

Jeka_M, Спасибо за полезный график.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Cadil пишет:

при уменьшении напряжения питания с 5В (преобразователь UART)  до 2,8В (батарейки АА) перестает работать. 

Это срабатывает система Brown-out Detection (BOD), которая настроена на 2,7В. Попробуйте поменять на 1,8В или вообще выключить. Настраивается фьюзами BODLEVEL.

b707
Offline
Зарегистрирован: 26.05.2017

Cadil - неплохо было бы схему Вашей платы с ардуино выложить. Плата самодельная или готовая?

enjoyneering
enjoyneering аватар
Offline
Зарегистрирован: 05.09.2016

да не понимает он. поменял кварц, а бутлодер нет. :) теперь там у него со скоростями шим, uart, i2c, isp зоопарк. 5 сообщений о Brown-out Detection, которые он игнорирует тк не знает что это и как его менять.

вот автор Atmel AVR Fuse Calculator. после того как расставите галочки правильно, внизу будут 3 числа\фьюза: Low, High, Extended. берете bootloader для 8MHz кварца и прошиваете его с этими фьюзами.

 

вот для примера как прошить bootlader под названием optiboot (фьюзы пишутся в поля под цифрой 5). удачи

если нет програматора USBasp, берем uart-usb FTDI FT232R.

Cadil
Offline
Зарегистрирован: 27.06.2018

Jeka_M пишет:

Cadil пишет:
при уменьшении напряжения питания с 5В (преобразователь UART)  до 2,8В (батарейки АА) перестает работать.
Это срабатывает система Brown-out Detection (BOD), которая настроена на 2,7В. Попробуйте поменять на 1,8В или вообще выключить. Настраивается фьюзами BODLEVEL.

Установил программу SinaProg.

Не могу понять, как тут выйти на BODLEVEL и другие фьюзы?

b707
Offline
Зарегистрирован: 26.05.2017

так вот же они - на правой картинке в середине:  LowFuse HighFuse

А если вас интересует расчет нужного значения фьюзов по опциям - такой опции в Синапроге, по-моему, нет. Это делается вручную или в так называемом "калькуляторе фьюзов", а в Синапрог уже подставляются готовые значения

Cadil
Offline
Зарегистрирован: 27.06.2018

Понял. Спасибо!

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Вот калькулятор фьюзов. Выбираете там свой микроконтроллер. Там же внизу на странице вписываете вручную считанные значения Low, High, Extended (только не перепутайте). Потом жмете кнопку Apply values. Убеждаетесь, что выше появится Brown-out detection level at VCC=2.7V (так у вас сейчас фьюзы настроены). Вместо этого значения выбираете из списка Brown-out detection level at VCC=1.8V и смотрите внизу как изменились фьюз биты (в частности изменятся фьюзы Extended). Берёте это изменившееся значение и программируете в микроконтроллер.

Cadil
Offline
Зарегистрирован: 27.06.2018

Я нашел этот калькулятор. Изменить одну строчку и записать новые значения в контроллер - несложно.  Но сейчас  фьюзы в контроллере (DE FF 05) слишком сильно отличаются от значений по умолчанию в калькуляторе (62 D9 FF). 

Я не угроблю контроллер?

Cadil
Offline
Зарегистрирован: 27.06.2018

Там кроме Brown-out detection level at VCC=1.8V надо менять и другие фьюзы. Например, Watch-dog Timer always on. Сторожевой таймер используется у меня в скетче.

По-моему, надо пересматривать весь перечень  да и МК угробить не хочется ...

bwn
Offline
Зарегистрирован: 25.08.2014

Cadil пишет:

Я не угроблю контроллер?

К опциям: RESET!!!! и SPI не лезьте. Первая выключена, вторая включена. Хотя, второе вроде не страшно, злые языки утверждают, что через ISP  ее не изменить, не пробовал.

Cadil
Offline
Зарегистрирован: 27.06.2018

bwn пишет:
Cadil пишет:
Я не угроблю контроллер?
К опциям: RESET!!!! и SPI не лезьте. Первая выключена, вторая включена. Хотя, второе вроде не страшно, злые языки утверждают, что через ISP  ее не изменить, не пробовал.

Спасибо!

Тут автор пишет о важных фьюзах SPIEN или RSTDSBL, которые нельзя трогать. Короче - буду благодарен за линк с типовой установкой фьюзов для Atmega328P. Предполагаю, что такая гуляет на просторах Интернета, но мне не удается ее найти.

Cadil
Offline
Зарегистрирован: 27.06.2018

Набросал свой вариант опций (см. картинки). Изменения в калькуляторе подчеркнуты. В конфигурации бит ничего не трогал. 

Жду на критику и предложения.

 

bwn
Offline
Зарегистрирован: 25.08.2014

Делитель на 8, если из каких-то соображений, собак, вроде не требуется, начало бут, отожрет 4К флэша, у вас такой загрузчик? Может более продвинутые поправят.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

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

1. Какое питание у твоего устройства?

2. Какая частота работы?

3. Есть ли и нужен ли внешний кварц?

4. Что ты хочешь от вочдога?

5. Нахера тебе вообще загрузчик в изделии? То есть, ты не можешь "прошивать" по SPI, потому что уже так спроектировал прибор? Если еще не поздно, то лучше переделать. Загрузчик вредная вещь для изделия, он для отладки. Объясню почему: при ресете или просто включении, МК начинает работать с загрузчика, ждет примерно секунду и потом переходит к коду. В изделии это неудобно, а удобства програмирования добавляет ТОЛЬКО для плат с USB. Во всех остальных случаях тебе все равно подключать доп. устройство. Так какая разница - USD-UART или USB-ASP?

=====================

Короче - ответь и я тебе понятно объясню: какие и где тебе фьюзы поставть.

enjoyneering
enjoyneering аватар
Offline
Зарегистрирован: 05.09.2016

ну вот до автора начало доходить немного. зачем вы используете SinaProg? он престал обновляться в 2000-х годах и не поддерживает новые камни.

я же вам давал ссылки, вы их читали? там есть информация о AVRDudess. он намного свежее SinaProg.

там же ссылка с объяснениями о всех fuse. еслиб вы прочитали, то поняли, CKDIV8 уменьшит частоту процессора в 8 раз!!! если у вас кварц на 8MHz, то тактовая частота камня будет 1MHz.

вы хотите разобраться в вопросе или вам надо тяп-ляп и в продакшн?

Cadil
Offline
Зарегистрирован: 27.06.2018

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

1. Какое питание у твоего устройства?

2. Какая частота работы?

3. Есть ли и нужен ли внешний кварц?

4. Что ты хочешь от вочдога? ...

=====================

Короче - ответь и я тебе понятно объясню: какие и где тебе фьюзы поставть.

1. 1,8В-3,2В.

2. Частота генератора - 8МГЦ или 16МГц.

3. Внешний кварц есть и нужен.

4. Не хочу, а сделал. Ватчдог отправляет в сон МК и периферию после ими выполнения своих функций.

 

 

Cadil
Offline
Зарегистрирован: 27.06.2018

Разобрался.
Для тех, кто столкнется с подобной проблемой - LOW: 0xFF, HIGH: 0xDE, EXT: 0x07

Благодарю всех, кто откликнулся.

bwn
Offline
Зарегистрирован: 25.08.2014

BODLEVEL отключили полностью, здря. ИМХО.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Cadil пишет:

Разобрался.
Для тех, кто столкнется с подобной проблемой - LOW: 0xFF, HIGH: 0xDE, EXT: 0x07

Благодарю всех, кто откликнулся.

молодец, что сам! Я только проснулся... шабат и все эти вещи! ;)))

1. low=FF нормально, лишние такты на запуск нужны при медленном старте генератора. И/или неустойчивом питании на старте. FF  это по умолчанию и это нормально.\

2. hi=DE. D - понятно, а минимальный бутсайз - по моему совету - вообще не использовать бутлоадер? разумно, больше места для кода.

3. бодлевел отключить - не знаю... при быстром старте - вполне нормально. Старт с бод - быстрее обычного и для этого он и нужен - быстрее встать в работу, после возвращения питания. При быстром старте в low фьюзе - можно и без него.

===============

Еще раз: молодец, что сам разобрался.

Cadil
Offline
Зарегистрирован: 27.06.2018

wdrakula пишет:
....

2. hi=DE. D - понятно, а минимальный бутсайз - по моему совету - вообще не использовать бутлоадер? разумно, больше места для кода.

3. бодлевел отключить - не знаю... при быстром старте - вполне нормально. Старт с бод - быстрее обычного и для этого он и нужен - быстрее встать в работу, после возвращения питания. При быстром старте в low фьюзе - можно и без него.

Спасибо! Учту!

Cadil
Offline
Зарегистрирован: 27.06.2018

wdrakula пишет:

Cadil пишет:

Разобрался.
Для тех, кто столкнется с подобной проблемой - LOW: 0xFF, HIGH: 0xDE, EXT: 0x07

Благодарю всех, кто откликнулся.

1. low=FF нормально, лишние такты на запуск нужны при медленном старте генератора. И/или неустойчивом питании на старте. FF  это по умолчанию и это нормально.\

2. hi=DE. D - понятно, а минимальный бутсайз - по моему совету - вообще не использовать бутлоадер? разумно, больше места для кода.

3. бодлевел отключить - не знаю... при быстром старте - вполне нормально. Старт с бод - быстрее обычного и для этого он и нужен - быстрее встать в работу, после возвращения питания. При быстром старте в low фьюзе - можно и без него.

Вкратце напомню историю вопроса. У меня не работал контроллер Atmega328P, 16 MHz при понижении напряжения питания с 5В до 2,7...2,8В (старые батарейки).
С учетом Ваших предложений переустановил заводские фьюзы на следующие - L: FF, H: DE, E: 06 (бодлевел для мониторинга 1,8В). Контроллер заработал.

Сейчас хочу перейти на кварц 8 МГц. Предполагаю, что новые фьюзы будут - L: FF, H: D9, E: 06. 
Я не ошибаюсь? Проверьте, пожалуйста. 
Заранее благодарю за помощь.

vlad072
Offline
Зарегистрирован: 01.08.2017

Что хочу от устройства:

- Atmega328p  ̶н̶а̶ ̶в̶н̶у̶т̶р̶е̶н̶н̶е̶м̶ ̶г̶е̶н̶е̶р̶а̶т̶о̶р̶е̶ ̶(̶б̶е̶з̶ ̶к̶в̶а̶р̶ц̶е̶в̶ ̶и̶ ̶R̶C̶)̶ ̶п̶р̶и̶ ̶1̶M̶H̶z̶  внешний кварц. резонатор 8MHz, тактовая частота Атмеги 1MHz

- питание 2.3V

- WDT с таймаутом 8 сек

- наличие загрузчика 

Вопросы:

- какой bootloader лучше выбрать, optiboot или uno?

- какие правильные фьюзы под такой вариант?

- какие нужны правки чтоб скетчи правильно "чувствовали" время при такой тактовой частоте?

- будет ли работать Serial на скорости до 57600 включительно?

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

vlad072  

зачем  bootloader?

зачем serial?

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

vlad072, внутренний генератор и бутлоадер вещи не совместимые.

vlad072
Offline
Зарегистрирован: 01.08.2017

dimax, понял. Ок, задача та же, но пусть будет внешний кварц 8MHz. Подскажите по остальным вопросам?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

vlad072 пишет:

- какой bootloader лучше выбрать, optiboot или uno?

- какие правильные фьюзы под такой вариант?

- какие нужны правки чтоб скетчи правильно "чувствовали" время при такой тактовой частоте?

- будет ли работать Serial на скорости до 57600 включительно?

(1) Uno==оптибут.
(2) Low: FF,  High: DE, Ext: FE
(3) создать свой блок в boards.txt , тут намедни о этом же речь шла.
(4) при 8МГц тактовой будет
 

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

Загрузчик любой - они оба с wdt работают, uart работать на такой скорости будет, вопрос для чего он? Обмен с внешним устройством? Если просто для загрузки скетче то нафиг не надо

vlad072
Offline
Зарегистрирован: 01.08.2017

dimax пишет:

(4) при 8МГц тактовой будет

Т.е. на 8 делить частоту не нужно? Вернее если её поделить то Serial работать не будет?

andycat пишет:
Обмен с внешним устройством? ...для загрузки скетче ..

и то и другое

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

vlad072 пишет:

и то и другое

если я правильно понял задачу это будет переносное устройство для работы с каким либо прибором, в этом случае вы же не на постоянке с ним будете работать а какое то время минуты часы.....тогда и разницы между 8 и 16 МГЦ в энерго потреблении не сильно заметите

с другой стороны если постоянно быть подключенным некоему прибору - почему бы питание от прибора не получить

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

vlad072, если кварц на 8 то не надо делить. Если на 16 то надо. Сериал с кварцем всегда работает (при разумных тактовых), ограничение  будет в  макс. скорости.

vlad072
Offline
Зарегистрирован: 01.08.2017

dimax, короче задача максимально снизить частоту для получения максимальной экономичности. НО! требуется Serial порт со скоростью 57600. Точность временнЫх интервалов и быстродействие контроллера в целом не критичны, поэтому и хотел упразднить внешнюю обвязку. Что посоветуете?

andycat, устройство - автосигнализация. Питание - ионистор с "подзараядкой" от step-down'a. Свзяь с модемом по Serial через ждамперы, сняв которые и накинув колодку можно было бы закидывать и скетч в Атмегу и прошивку/аудиофайлы в модем.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

мне понравился загрузчик из пакета miniCore (все клоны 328 камня), ватчдог работает, проверял этой прогой, ну и естественно широкие возможности тактирования и напряжений питания

// modify Victor UA6EM 09.12.2018
// To activity WDT Timer Pse connect Pin8 to GND

#include <avr/wdt.h>
unsigned int timer = 0;

  void setup() {
  wdt_disable(); 
  pinMode(8,INPUT_PULLUP);
 
  Serial.begin(9600);
  Serial.println("Setup..");
  
  Serial.println("Wait  sec..");
  delay(1000); 
  if(digitalRead(8) == LOW){
  wdt_enable (WDTO_8S); // Для тестов не рекомендуется устанавливать значение менее 8 сек.
  Serial.println("Watchdog enabled.");
      }else{
            Serial.println("Watchdog DISABLE.");
           }
       }

void loop(){
  // Каждую секунду мигаем светодиодом и значение счетчика пишем в Serial
  if(!(millis()%1000)){ // каждый 1000 будет давать 0 (FALSE) а (!FALSE) есть TRUE )))
    timer++;
    Serial.println(timer);
    digitalWrite(13, digitalRead(13)==1?0:1); delay(1); //
  }
}

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

vlad072, Управляйте тактовой частотой программно ( Clock Prescale Register).   Нужно что-то передать в сериал -тактовую в максимум и передаёте. Передали -тактовую поделить /256, и не спеша делаете что ему нужно делать при простое, либо вообще вздремнуть, если есть возможность. Это будет экономия. А просто снизить до 8Мгц - ни о чём.

Komandir
Offline
Зарегистрирован: 18.08.2018

при 1МГц тактовой (исходя из даташита) можно и 115200

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

dimax пишет:

vlad072, Управляйте тактовой частотой программно ( Clock Prescale Register).   Нужно что-то передать в сериал -тактовую в максимум и передаёте. Передали -тактовую поделить /256, и не спеша делаете что ему нужно делать при простое, либо вообще вздремнуть, если есть возможность. Это будет экономия. А просто снизить до 8Мгц - ни о чём.

Дмитрий, может примерчик какой скинешь?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

А у меня самодельная ардуина при 3.3в и на 24мгц работала с кварцем. Не по даташиту конечно, но там не ответственное применение, даже если зависнет не страшно, хотя не замечал такого насколько помню.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013
andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

vlad072 пишет:

Не вариант. Дело в том что сериал постоянно нужно "слушать". Или даже при таких частотах в буфер будут попадать данные из RX?

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

с возвратом назад что-то не задалось )))

Кто что подскажет?

vlad072
Offline
Зарегистрирован: 01.08.2017

andycat пишет:

 даже в полуспящем режиме кушает сильно больше МК на максимальной частоте

Да, я в курсе, просто хотелось бы выжать по максимуму. На данный момент прототип на основе Nano-5V-16MHz показывает следующие результаты:

- модем SIM800C всегда активен и в "спокойном состоянии" и выключенном трансивере bluetooth ~25-30mA

- ардуина ~7-8mA

Токи потребления с учётом понижающих стабилизаторов, т.е. по 12 вольтам.

Так что в принципе смысл скроить на потреблении атмеги есть. С учётом что "вся остальная машина" после 20 мин. простоя потребляет ~50mA, для сигналки почти столько же - бесстыдно много.