Fuse-биты

maksim
Offline
Зарегистрирован: 12.02.2012

Всем доброго времени суток.

Есть ли в Arduino какие-либо програмные средства для установки fuse-битов? Ну а если нет, то где можно вручную править фьюзы?

maksim
Offline
Зарегистрирован: 12.02.2012

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

И так, фьюз-биты (далее фьюзы) прошиваются и читаются только внешнем программатором (в моем случае ArduinoISP), для начала нужно познакомиться с калькулятором фьюзов. Сложного там ничего нет - выбрали тип МК, нужную частоту тактирования, нужен/не нужен бутлоудер и т.д. и т.п. Так же важно помнить что не имея параллельного/высоковольтного программатора нельзя трогать фьюзы: 

     Serial program downloading (SPI) enabled; [SPIEN] (галочка установлена)
     Reset Disabled (Enable PC6 as i/o pin); [RSTDISBL]  (галочка не установлена)

И быть аккуратным с выбором источника тактирования.

Средствами ArduinoIDE это делается следующим образом: открываем файл \arduino\hardware\arduino\boards.txt, в котором видим описание всех плат из списка ArduinoIDE, находим нужную нам, например:

atmega328.name=Arduino Duemilanove or Nano w/ ATmega328

atmega328.upload.protocol=stk500
atmega328.upload.maximum_size=30720
atmega328.upload.speed=57600

atmega328.bootloader.low_fuses=0xFF
atmega328.bootloader.high_fuses=0xDA
atmega328.bootloader.extended_fuses=0x05
atmega328.bootloader.path=atmega
atmega328.bootloader.file=ATmegaBOOT_168_atmega328.hex
atmega328.bootloader.unlock_bits=0x3F
atmega328.bootloader.lock_bits=0x0F

atmega328.build.mcu=atmega328p
atmega328.build.f_cpu=16000000L
atmega328.build.core=arduino 

Правим как надо, сохраняем файл, запускаем ArduinoIDE и нажимает Burn bootloader (Прошить загрузчик), вместе с загрузчиком прошьются и фьюзы. Так же можно избавиться от буилоудера убрав строку atmega328.bootloader.file=ATmegaBOOT_168_atmega328.hex и правильно выставив фьюзы.

maksim
Offline
Зарегистрирован: 12.02.2012

И как устанавливать фьюзы, если прошивать через ArduinoISP?

serenya
Offline
Зарегистрирован: 17.02.2012

Сам я не пробовал изменять фьюзы, но видел здесь делали бутлоадер для меги8 на внутреннем RC генераторе. А здесь для тини45/85. может там что накопаете.

Mogalkov
Offline
Зарегистрирован: 23.06.2011

 Я менял фьюзы, но правда прошивал не дуиной а аврдуде. Примерно тут описывал: arduino.ru/forum/apparatnye-voprosy/duino-na-vnutrennem-rezonatore-mozhet-komuto-budet-polezno Там же есть ссылка на калькулятор фьюзов.

maksim
Offline
Зарегистрирован: 12.02.2012

По какой-то причине если использовать arduino-0023, то бутлоудер не шьется и выдает ошибку:
avrdude: invalid byte value (null) specified for immediate mode
avrdude: write to file 'null' failed
А через arduino-1.0 все замечательно шьется.

osetroff
Offline
Зарегистрирован: 27.08.2014

Arduino pro mini 5V 16Mhz на atmega328.

Вопрос: можно ли так прошить фьюзы,

чтобы можно было заливать hex в него,

но нельзя было считать (чтобы нельзя было получить код злоумышленнику)?

Спасибо.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Можно.

maksim
Offline
Зарегистрирован: 12.02.2012

osetroff пишет:

Вопрос: можно ли так прошить фьюзы,

....

Чисто формально - нельзя, так как за это отвечают не фьюз-биты, а лок-биты.

http://arduino.ru/forum/obshchii/zapretit-skachivanie-programmy-iz-arduino

osetroff
Offline
Зарегистрирован: 27.08.2014

Благодарю, по вашей ссылке получил исчерпывающий ответ:

записав 0x3C в lock-биты запрещаем чтение и запись hex до полного стирания чипа (одно только чтение без записи запретить невозможно).

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Я вроде шил    0C.....  или C0..... не помню.....

Но с IDE программировалась, а читалась как надо: 0101020203030404050506060707

Maverik
Offline
Зарегистрирован: 12.09.2012

вроде на хабре пробегала статья на эту тему-  обходится на AVR-ках эта защита лок-битами как два пальца.

snickser
Offline
Зарегистрирован: 02.07.2016

А теперь вопрос, как вернуть к жизни ардуину?

Поменял параметры и больше она не алё. Прошивка не вливается, bootloader не прошивается...

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

snickser пишет:

Поменял параметры и больше она не алё.

Какие параметры?

snickser пишет:

Прошивка не вливается, bootloader не прошивается...

Чем прошиваешь bootloader? Что пишет?

noisefault
Offline
Зарегистрирован: 24.09.2018

Народ, помогите разобраться с Fusa-ми.

С дуру записал дефолтные фьюз биты из программы ProgISP программатором USBasp

в Arduino Leonardo с чипом Atmega32U4.

я так понял что поделил частоту кварца на 8, но вот что ещё не так,

почему не получается USBasp-ом всё исправить? Перестал он видеть плату,

Erase Chip не срабатывает, что можно предпринять?

.

 

b707
Онлайн
Зарегистрирован: 26.05.2017

Я не знаю, с чего вы взяли. что это "дефолтные" - например, согласно АВР-калькулятору, значение LowFuses = 0x41 для Атмеги32U4 вообще не определено, нет такого варианта.

Теперь, скорее всего, только высоковольтным программатором.

noisefault
Offline
Зарегистрирован: 24.09.2018

b707 пишет:

Я не знаю, с чего вы взяли. что это "дефолтные" - например, согласно АВР-калькулятору, значение LowFuses = 0x41 для Атмеги32U4 вообще не определено, нет такого варианта.

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

какие правильные нужны для Arduino Leonardo я уже посмотрел в boards.txt

 

b707 пишет:

Теперь, скорее всего, только высоковольтным программатором.

через LPT порт есть смысл пробовать или с USBasp разницы не будет?

хотелось бы понять что именно произошло, почему USBasp не шьётся больше, вроде фьюзы которые 

отключают ISP программирование остались нетронутыми

 

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

noisefault, дефолтные фузы B01011110 , у вас же зашита недопустимая комбинация выбора источникак тактирования (CKSEL)  , в даташите на этот вариант написано Reserved. Короче без высоковольтного программатора можно дальше  не рыпаться.

noisefault
Offline
Зарегистрирован: 24.09.2018

dimax пишет:

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

понял, спасибо!

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

Прошу помощи.....

Итак Atmega328p, новая из китая, все хорошо, работает, посмотрел фьюзы - все по умолчанию 0x62 0xD9  - внутренний генератор 8МГц.

Вытаскиваю МК и вставляю в полу готовое устройство без кварца - не работает :(

Подумал дай попробую на внутренний 128КГц генератор 0x43 0xD9 - скетч заработал (тестовые светодиодики загорелись) без кварца, но очень естественно медленно....и пришла беда - не могу теперь прошить через USB ASP.

Ошибка:

avrdude.exe -p m328p -c usbasp -P usb -U calibration:r:calibration.hex:r
avrdude.exe: warning: cannot set sck period. please check for usbasp firmware update.
avrdude.exe: error: programm enable: target doesn't answer. 1 
avrdude.exe: initialization failed, rc=-1
             Double check connections and try again, or use -F to override
             this check.
 
Замыкание перемычки JP3 на USB ASP не помогает.
 
Вопросы:
1. Для работы с внутренним генератором на 8 МГц нужна какая то обвязка чипа ? у меня сейчас на нем вообще ничего нет - даже резистора на Rst...
2. Возможно ли вернуть МК к жизни? и как?
 
dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

andycat, замыкание перемычки не помогает, потому, что частота SCK всё равно высокая относительно тактовой 128кГц.

В скетче Arduino as ISP можно задать нужную частоту SCK :-)

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

dimax пишет:

andycat, замыкание перемычки не помогает, потому, что частота SCK всё равно высокая относительно тактовой 128кГц.

В скетче Arduino as ISP можно задать нужную частоту SCK :-)

спасибо, пойду искать в закромах Arduino UNO чтоб запустить как  Arduino as ISP

 

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

что то я наверное делаю не так

раскоментировал строку Arduino as ISP

// Configure SPI clock (in Hz).
// E.g. for an ATtiny @ 128 kHz: the datasheet states that both the high and low
// SPI clock pulse must be > 2 CPU cycles, so take 3 cycles i.e. divide target
// f_cpu by 6:
#define SPI_CLOCK            (128000 / 6)
//
// A clock slow enough for an ATtiny85 @ 1 MHz, is a reasonable default:

//#define SPI_CLOCK 		(1000000/6)

прошил Aduino UNO

открыл новый пустой скетч, выбрал программатор, жму "Записать загрзчик" чтоб фьюзы установились - ошибка

avrdude: Yikes!  Invalid device signature.
         Double check connections and try again, or use -F to override
         this check.
 
Ошибка при записи загрузчика.
 
dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

andycat, лучше попробовать ещё меньше, 1000 например. Потому, что если 128кГц ещё и на 8 поделились.. то тактовая частота будет 16 кГц :) (правда я не знаю, возможно ли такая комбинация в принципе, но лучше этот вариант учесть)

inspiritus
Offline
Зарегистрирован: 17.12.2012

Ухты вот те раз! Увидел в начале темы пухлявого и ах настольгийа пробрала :)

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

Хм...в понедельник попробую, в инете видел совет запускать с ключом -b 1000 - не помогло.
Думал может совсем МК помер, но нет, светодиоды включает исправно.
Спасибо, о результатах отпишусь.

Cadil
Offline
Зарегистрирован: 27.06.2018
Планирую использовать МК Atmega328P c  питанием от батареек (около 3В) и кварцем 8МГц.
Для проверки нового МК перезаписал заводские фьюзы на L:FF, H:D9, E:06 (8 MHz, Bodlevel - 1.8V) и записал загрузчик ArduinoISP, используя как программатор плату Arduino UNO. Контроллер работает (16 МГц, 5В).
А как записать загрузчик Arduino Pro Mini (3.3V, 8MHz),  используя программатором эту же плату Arduino UNO?
dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Cadil, нафига, какая цель?

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

dimax пишет:
Cadil, нафига, какая цель?

Энергосбережение и корректная работа операторов. Чтобы, допустим, delay(2000); возвращал 2 сек, а не 1 сек при тактовой частоте 8 МГц и загрузчике ArduinoISP

 

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

Cadil пишет:

Чтобы, допустим, delay(2000); возвращал 2 сек, а не 1 сек при тактовой частоте 8 МГц и загрузчике ArduinoISP

Бутлоадер не имеет никакого отношения к этому. Вам надо задать корректную константу F_CPU в описании платы boards.txt

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

dimax пишет:
Бутлоадер не имеет никакого отношения к этому. Вам надо задать корректную константу F_CPU в описании платы boards.txt

Нашел в boards.txt: unowifi.name=Arduino Uno WiFi. Тут в строке unowifi.build.f_cpu=16000000L поставил ..cpu=8000000L, сохранить изменение и попытался записать скетч с новым МК вместо штатного на плате Arduino Uno. Читаю ответ в компиляторе:

avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0xe0
.....

 

 

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

Cadil пишет:

dimax пишет:
Cadil, нафига, какая цель?

Энергосбережение и корректная работа операторов. Чтобы, допустим, delay(2000); возвращал 2 сек, а не 1 сек при тактовой частоте 8 МГц и загрузчике ArduinoISP

 

В списке плат arduino ide уже есть 8 мГц плата, и все delay корректно считает - сегодня пробовал.
И да - загрузчик нафиг не нужен.

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

andycat][quote=Cadil пишет:
В списке плат arduino ide уже есть 8 мГц плата, и все delay корректно считает - сегодня пробовал. И да - загрузчик нафиг не нужен.

Плата-то есть, я об этом знаю. Я тоже не помню проблем при работе с Arduino Pro Mini и USB-преобразователем. Не получается с контроллером.

Выставляю ИНСТРУМЕНТЫ ->Arduino Pro Mini, Atmega328P(3.3V, 8MHz), но при записи скетча  в МК через Arduino UNO:

avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x00
Произошла ошибка при загрузке скетча
 

 

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

dimax пишет:
Бутлоадер не имеет никакого отношения к этому. Вам надо задать корректную константу F_CPU в описании платы boards.txt

Константу поменял. Не в том месте? Возможно еще какие-то параметры в boards.txt надо поменять?

 

b707
Онлайн
Зарегистрирован: 26.05.2017

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

И бутлоадер вовсе не заливайте - при низких частотах заливка через USB все равно работать не будет

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

b707 пишет:
Cadil - для энергосбережения выбирайте частоту 1 Мгц и без кварца, 8МГц не дает никакой экономии по сравнению с 16

Мне для начала надо разобраться с  частотой 8 Мгц. И почему не дает экономии? Посмотрите график.

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

Cadil пишет:

Константу поменял. Не в том месте? Возможно еще какие-то параметры в boards.txt надо поменять?

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

##############################################################

cadil.name=Cadil Uno 8MHz

cadil.vid.0=0x2341
cadil.pid.0=0x0043
cadil.vid.1=0x2341
cadil.pid.1=0x0001
cadil.vid.2=0x2A03
cadil.pid.2=0x0043
cadil.vid.3=0x2341
cadil.pid.3=0x0243

cadil.upload.tool=avrdude
cadil.upload.protocol=arduino
cadil.upload.maximum_size=32256
cadil.upload.maximum_data_size=2048
cadil.upload.speed=57600

cadil.bootloader.tool=avrdude
cadil.bootloader.low_fuses=0xFF
cadil.bootloader.high_fuses=0xDE
cadil.bootloader.extended_fuses=0xFE
cadil.bootloader.unlock_bits=0x3F
cadil.bootloader.lock_bits=0x0F
cadil.bootloader.file=optiboot/optiboot_atmega328.hex

cadil.build.mcu=atmega328p
cadil.build.f_cpu=8000000L
cadil.build.board=AVR_UNO
cadil.build.core=arduino
cadil.build.variant=standard

 

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

dimax пишет:
Лучше создать свой блок, дабы точно понимать что компилятор подхватывает именно то, что надо.

Добавил блок. В меню появилась новая опция Cadil UNO 8MHz. Выбираю ее, но при попытке записи в МК - ошибка:

avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0x00
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x00
Произошла ошибка при загрузке скетча
dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Cadil, ищите свою ошибку ещё в чём-то.  С этим блоком и родным бутлоадером от UNO   мк  с кварцем  8МГц  будет без проблем заливаться через бутлоадер.

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

dimax пишет:

Cadil, ищите свою ошибку ещё в чём-то.  С этим блоком и родным бутлоадером от UNO   мк  с кварцем  8МГц  будет без проблем заливаться через бутлоадер.

Хорошо, буду искать.

b707
Онлайн
Зарегистрирован: 26.05.2017

Cadil пишет:

 Посмотрите график.

Ага, теперь вы ссылаетесь на этот график? посмотрите график сами и убедитесь, что вы наврали в статье на Хабре

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

dimax пишет:

andycat, лучше попробовать ещё меньше, 1000 например. Потому, что если 128кГц ещё и на 8 поделились.. то тактовая частота будет 16 кГц :) (правда я не знаю, возможно ли такая комбинация в принципе, но лучше этот вариант учесть)

Спасибо огромное, заработало.

// f_cpu by 6:
#define SPI_CLOCK            (128000/32)
//

 

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

и все таки погубил я чип :(

работало все ок....простенький delay светодиод скетч работал, но период был в 8 раз медленнее,

снял бит CKDIV8 - с кварцем работал, без кварца нет.

сдуру решил нажать загрузку загрузчика ArduinoProMini 8МГц и все.....МК перестал а все реагировать и определяться.

Update: ожил :)

Но со скоростью чо то не то.....щас буду править boards

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

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

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

dimax пишет:

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

Спасибо :)

 

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

dimax  , сдаюсь :( ничего не понимаю, добавил блок на 8МГц, фьюзы все по умолчанию,

а скорость все равно кривая, вот этот скетч моргает светодиоом почти с периодом в 1 секунду, но это же не правильно

void setup() {
  // put your setup code here, to run once:
  pinMode(4,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(8,OUTPUT);
  digitalWrite(8,HIGH);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(4,LOW);
  digitalWrite(3,LOW);
  delay(100);
  digitalWrite(4,HIGH);
  digitalWrite(3,HIGH);
  delay(100);
}

 

 

 

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

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

andycat,  в смысле не правильно?  Если вы говорите компилятору, что тактовая 8МГц, а реальная тактовая у вас 1 МГц, то что неправильно? Паузы будет по 800мС, всё правильно.

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

dimax пишет:

 а реальная тактовая у вас 1 МГц

хм....что то я значит недопонял, фьюзы по умолчанию на 8 же МГц.....

пошел читать литературу

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Купи себе TL866, икспериментатар.

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

andycat, причём тут фьюзы. Компилятору нужно сказать фактическую  тактовую частоту МК.