Программный Reset

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

Возможен ли программный ресет. По задумки 2 мк общаются друг с другом. После всех манипуляций мк№1 записывает данные во внешнюю память и посылает сообщение мк№2 о том что связь прекращается и о том чтобы мк№2 сосчитал данные со внешней память. Всё общение проходит нормально. Но когда мк№2 начинает считывать данные с памяти то он зависает. Прочём при старте обоих мк они удачно считывают с памяти всё содержимое.  

chervyachok
chervyachok аватар
Offline
Зарегистрирован: 22.12.2011

 

void(* resetFunc) (void) = 0; // Reset MC function

resetFunc(); //вызов

 

LEVV2006
LEVV2006 аватар
Offline
Зарегистрирован: 15.04.2011

ООО спасибо!!!! Работает!!! Скажи пожалуйста откуда ты узнал про это? Я весь инет перерыл прежде чем написать суда! Может есть место где всё более детально описано про arduino? (кроме оф сайта) 

leshak
Offline
Зарегистрирован: 29.09.2011

 Кстати да, если не трудно - объясните эту магию :)

Для людей не испорченных глубоким знанием C, что  вообще происходит в этом коде?

chervyachok
chervyachok аватар
Offline
Зарегистрирован: 22.12.2011

На самом деле ето не настоящий резет а просто перевод стека в начало програмного кода (в нулевой адрес). Тоесть программа начинает исполнятся с самого начала, при етом не влияя на установки МК на момент исполнения. Например: Если у вас на момент исполнения был установлен какой то порт в "1" и в начале программы его значение не возвращается в "поумолчанию = 0" то после так званой "програмной перезагрузки" порт так и останеться с "1". 

Если попроще то вот для визуальной демонстрации:

void(* resetFunc) (void) = 0; 

void setup() {               
  pinMode(13, OUTPUT);  
  Serial.begin(9600);
}
void loop() {
  delay(5000);              
  digitalWrite(13, HIGH);   
  delay(100);              
  digitalWrite(13, LOW);   
  delay(100);              
  digitalWrite(13, HIGH);   
    delay(100);              
  if (Serial.available()>0){
	digitalWrite(13, LOW);   
	delay(500);             
	digitalWrite(13, HIGH);  
	resetFunc();
  }
  else
  {
	digitalWrite(13, LOW);    
	delay(1000);             
  }
}

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

если  же послать чтото, то перед перезагрузкой выход 13 установится в "1" и светодиод будет гореть даже после перезагрузки и до момента его го выключения (11й ряд).

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

Ну а если нужен самый настоящий резет то (наверно, в теории, хотя сам не пробовал) програмно прижымать пин Reset к земле другим пином.

chervyachok
chervyachok аватар
Offline
Зарегистрирован: 22.12.2011

LEVV2006 пишет:

 весь инет перерыл прежде чем написать суда! Может есть место где всё более детально описано про arduino? (кроме оф сайта) 

Кстати уже в сотый раз убедился что от правильно поставленого вопроса зависит возможность получения правильного ответа. Если погуглить "arduino reset function" то почти сразу наткнетесь на тоже и еще + несколько вариантов. 

А я вот досихпор не могу правильно сформулировать вопрос дядюшке гуглю насчет следующего arduino.ru/forum/programmirovanie/udalenie-proshyvki-programnym-putem

step962
Offline
Зарегистрирован: 23.05.2011

chervyachok пишет:

А я вот досихпор не могу правильно сформулировать вопрос дядюшке гуглю насчет следующего arduino.ru/forum/programmirovanie/udalenie-proshyvki-programnym-putem

avr write flash memory или

writing или

program memory

Наконец

"avr flash запись" в Яндексе - и DiHalt вам популярно объяснит, как записать что-нибудь поверх существующей программы.

step962
Offline
Зарегистрирован: 23.05.2011

chervyachok пишет:

Ну а если нужен самый настоящий резет то (наверно, в теории, хотя сам не пробовал) програмно прижымать пин Reset к земле другим пином.

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

подача сигнала на reset-ногу приводит к запуску цикла инициализации, НО - первым делом производится инициализация всех I/O-выводов в качестве входов. Низкий уровень на RESET при этом естественным образом пропадает - слишком рано для полноценной отработки процесса инициализации.

watchdog - для AVR это магическое слово (а по совместительству еще и таймер), позволяющее автоматически перезапустить МК в случае зависания программы (ну или целенаправленно - если возникает такое желание).

void reboot() {
  wdt_disable();  
  wdt_enable(WDTO_15MS);
  while (1) {}
}

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

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

step962, у меня возникли некоторые вопросы, разЪясните, пожалуйста:

1. Для чего сначала отключаем затем включаем watchdog?

 wdt_disable();  
 wdt_enable(WDTO_15MS);

2. По-умолчанию данный таймер отключен?

3. Играет ли какую-нибудь роль, что происходит в теле цикла? наприер:

void reboot() {
  wdt_disable();  
  wdt_enable(WDTO_15MS);
  while (1) {
    if(digitalRead(pin)){....}else{....}
  }
}

pin в течении 15 мс меняется, произойдет сброс?

step962
Offline
Зарегистрирован: 23.05.2011

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

2. Соответствующие разделы в даташите (10.8-10.9 для ATmega328) не слишком большие. Недвусмысленного ответа на этот вопрос я там, однако, не нашел. Но в описании регистра WDTCSR сказано, что бит WDIE, ведающий разрешением прерывания от сторожевого таймера, по умолчанию сброшен. То есть, по крайней мере прерывание (а это два режима из трех возможных) замаскировано по умолчанию. Для бита WDE, который разрешает системный ресет, в качестве значения по умолчанию указан х. Видимо, тут требуется также и значения каких-то фьюзов учитывать. Но для программ, сгенерированных из-под Arduino IDE, можно сказать, что таймер по умолчанию отключен, т.к. не нужно его сбрасывать.

3. Роль играет только своевременное выполнение инструкции сброса сторожевого таймера (макрос "wdt_reset()"). Если таковая не вызывается в течение времени, на которое настроен сторожевой таймер (от 15 мс до 8 с), то происходит сброс системы или генерация прерывания или прерывание+сброс системы - в зависимости от режима, в котором работает таймер. Так что

Цитата:

pin в течении 15 мс меняется, произойдет сброс?

pin в течении 15 мс меняется, произойдет сброс.

ustas
Offline
Зарегистрирован: 12.03.2012

 Кто-нибудь разоборался со сторожевым таймером? Может, кто-нибудь поделится готовым скетчем?

У меня следующая проблема: есть ардуина с датчиком и беспроводным модулем (эдакий беспроводной датчик). Система работает некоторое время (случайная величина, обычно несколько часов работает нормально, но потом вешается). Нажатие на кнопку RESET - полностью нормализует работу до следующего "зависона".

Как понимаю, сторожевой таймер - это "то, что доктор прописал". Логику действий понимаю так:

1. Деактивируем сторожевой таймер (в функции setup)

2. задаем значение сторожевому таймеру (setup) - даем значение времени, несколько большее длительности основного цикла.

3. активируем сторожевой таймер (setup) 

4. сбрасываем сторожевой таймер (уже в функции loop) 

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

P.S. прошу поправить, если неправильно понял и помогите с кодом (наверняка уже кто-то писал подобное)... 

leshak
Offline
Зарегистрирован: 29.09.2011

Немного не так.

По умолчанию он выключен. Когда мы его "активируем" (в setup) он начинает тикать, и увеличивать свой внутрений регистр. Когда он "переполнится" - происходит ресет (или вызывается указанная вами функция, как сконфигурите). Поэтому нужно его регулярно "обнолять". Где-нибудь в loop(). Говорить ему "все хорошо, скетч работает". С какой скоростью он "тикает" - зависет от тактовой частоты и пред-делителей.

Вообщем сериал Lost смотрели? Помните там мужичек сидель годами в бункере и каждые несколько часов нажимал кнопку что-бы мир не возрвался? Сбрасывал таймер. Вот у нас тоже самое. "бомба" - это сторожевой таймер, мужичек - наш скетч. Разница только в том, что кнопку "начать отсчет заново" мы можем нажать когда хотим, а он мог только в последний момент :)

Конкретно как его конфигурировать (какие порты, какие биты за что отвечают) - читать даташит.

Ну или, как всегда, пытаться найти библиотеку где это уже сделали за нас.#include <avr/wdt.h> Читать можно тут http://tushev.org/articles/electronics/48-arduino-and-watchdog-timer

Вообщем скетч должен выглядеть примерно так:

ОСТОРОЖНО! ОН МОЖЕТ ПОЛОМАТЬ ЗАЛИВКУ НОВЫХ СКЕТЧЕЙ. Заблокировать вашу дуину. Дочитайте до конца.

#include <avr/wdt.h>

int counter=0;
void setup(){
   wdt_disable(); // запретили как можно скорее собаку, что-бы не уйти в бесконечный ребут
   
    Serial.begin(9600);
  Serial.println("Starting...");
  delay(1000); // что-бы четче видеть рестар скетча
  
 
  wdt_enable(WDTO_4S); // активировали таймер, каждые 4-ре секунды его нужно сбрасывать

  
}



void loop(){
  wdt_reset(); // говорим собаке что "В Багдаде все спокойно", начинается очередной отсчет 4-х секунд.
  
   Serial.println(counter);
   counter++;
   
   if(counter==5){
      while(true){} // создаем зависание, через 4 секунды должен произойти ресет, так как не вызывается wdt_reset();
   }
   delay(500);
  
}

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

С этим имели проблему старые бутлоадеры, потом это "починили", а в свежих версиях arduino mega, как говорят в комментах (и мой опыт) - опять "поломали".  Он начинает тикать "очень быстро" и даже не успевает дойти до setup() 

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

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

Так что "используйте преведенный скетч" на свой страх и риск. Лично у меня получается выводить плату из бесконечного ребута "легко", но гарантировать что так будет и на вашей плате - я не могу. Впрочем может у вас вообще не будет этого лока.

 

ustas
Offline
Зарегистрирован: 12.03.2012

 Спасибо за подробное описание (сам думал о том же, но половину "оставил за скобками"). Пример заработал, НО.

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

Беглое гугление дало вот такую ссылочку: http://forum.amperka.ru/threads/%D0%A1%D1%82%D0%BE%D1%80%D0%BE%D0%B6%D0%B5%D0%B2%D0%BE%D0%B9-%D1%82%D0%B0%D0%B9%D0%BC%D0%B5%D1%80-watchdog-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82-%D0%B2-%D0%90%D1%80%D0%B4%D1%83%D0%B8%D0%BD%D0%BE.64/

Похоже, придется-таки обновить бутлоадер.. видимо, так: http://freeduino.ru/arduino/isp.html (и использовать именно ISP, так как ни на одной моей плате нет контактов, выведенных с FD232RL в виде разъема, а подпаяться к корпусу - на такую тонкую работу я еще не готов;))

 

P.S. попробовал пример на плате NANO - и заработало.. жаль, что сторожок нужен на "большой" плате... 

leshak
Offline
Зарегистрирован: 29.09.2011

ustas пишет:

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

Такэто же  не "с другой стороны", а именно с той про которую я говорил. Быстрое мигание светика - это внешнее проявление постоянного ресета. Сама собака срабатывает как надо (так как она в железе, от софта не зависит), только вот "заткнуть ее" бутлоадер не умеет и она гавкает без остановки.

Лечить либо уфиксаным бутлоадером, либо альтернативным от энтузиастов (optiboot и т.п.). Из описания "как заливать", я где-то видел типа закинули в папку, выбрали плату, нажали burn bootloader. Без упоминания про необходимость ISP (сам удивился). Хотя может и проглядел.

Но даже если ISP внешний обязателен. Вас-то это не должно остановить. Раз у вас есть Nano.  Льете в нее скетч ArduinoISP - и имеете программатор. Соеденяете ее 5-тью поровдками с мегой и шеьете ее как хотите. Вначале можете попробовать залить в мегу, с помощью наны обычный скетч.  Если получится - дальше можно как угодно без страха с бутлоадерами игратся - под рукой есть программатор, которым можено все "перешить назад" :)

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

ustas
Offline
Зарегистрирован: 12.03.2012

 да платок уже большой набор (сидуины, фридуины и т.п.), но вот у всех "полноформатных" - бутлоадер везде убогий.

а вот две NANO (одна ардуина, вторая кардуино) - обе со сторожем работают нормально.

Как организовать из одной платы ISCP - понятно (6 проводков и один разъемчик - все есть и сделать можно за 2 минуты). Вот дальше пока затыки:

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

2. вроде как есть возможность шить прямо из среды ардуино (что нужно? залить скетч ArduinoISP в "программатор"? а дальше? как проверить, что работает? подключить "прошиваемую плату" и попробовать в нее блинк залить? нажимаем обычные кнопки в среде ардуино или какие-то более сложные манипуляции?

3. пока было не надо - попадались упоминания fuse-битов.. что-то в среде ардуино я их вообще нигде не вижу...

4. еще есть упоминание программирования из консоли (или с помощью дополнительного GUI к консольному прошивальщику)...

в общем, вопросов пока сильно больше, чем понимания...

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

leshak
Offline
Зарегистрирован: 29.09.2011

ustas пишет:

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

Нет. Не нужно.

ustas пишет:

2. вроде как есть возможность шить прямо из среды ардуино (что нужно? залить скетч ArduinoISP в "программатор"? а дальше? как проверить, что работает? подключить "прошиваемую плату" и попробовать в нее блинк залить? нажимаем обычные кнопки в среде ардуино или какие-то более сложные манипуляции?

Да я уже несколько раз описывал это тут. Например вот: http://arduino.ru/forum/obshchii/programmirovanie-atmega8-s-pomoshchyu-arduino-nano

Сообщения #18, #20

ustas пишет:

как проверить, что работает? подключить "прошиваемую плату" и попробовать в нее блинк залить?

Да. Я именно так и делал.

ustas пишет:

3. пока было не надо - попадались упоминания fuse-битов.. что-то в среде ардуино я их вообще нигде не вижу...

По ссылки выше их увидите... но я не морочился. Скопировал их с существующего описания платы.

ustas пишет:

4. еще есть упоминание программирования из консоли (или с помощью дополнительного GUI к консольному прошивальщику)...

Ну да.. вообщем-то вся ардуиноIDE - обертка над консолями. Над компилятором и avrdude (для заливки). Если включить расширенный режим лога, то внизу можно даже будет увидеть, как и с какими параметрами IDE вызывает все эти консоли. Но мне оно "не нуно было". Работал прямо из IDE.

ustas пишет:

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

Да. Уже несколько месяцев собираюсь выписать это в свой бложик (надоело все время отвечать на 10 ток вопросов с вариациями). Да все руки не доходят.

nestandart
nestandart аватар
Offline
Зарегистрирован: 15.06.2011

 

>>     void(* resetFunc) (void) = 0; // Reset MC function

resetFunc(); //вызов      <<

 

Интересно.  

Я как то тоже интернеты копал по програмному ресету , но так ничего и не нашел.

Пришлось делеть железнай сброс , релюшка , транзюк и кондер на базе транзюка.

Casper
Offline
Зарегистрирован: 02.10.2012

Для статистики.

Ардуино нано v3. Куплена в китае.

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

Пришлось исправить boards.txt

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

nano328o.name=Arduino Nano w/ ATmega328 OPTIBOOT

nano328o.upload.protocol=arduino
nano328o.upload.maximum_size=30720
nano328o.upload.speed=115200

nano328o.bootloader.low_fuses=0xFF
nano328o.bootloader.high_fuses=0xDA
nano328o.bootloader.extended_fuses=0x05
nano328o.bootloader.path=optiboot
nano328o.bootloader.file=optiboot_atmega328-Mini.hex
nano328o.bootloader.unlock_bits=0x3F
nano328o.bootloader.lock_bits=0x0F

nano328o.build.mcu=atmega328p
nano328o.build.f_cpu=16000000L
nano328o.build.core=arduino
nano328o.build.variant=eightanaloginputs

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

После прошилось и заработала заливка скетчей и самое главное - заработала и собака.

Peter
Peter аватар
Offline
Зарегистрирован: 25.02.2012

Кому еще актуален вопрос на mega 2560 пофиксенный бутлоадер есть в дистрибутивах (не знаю начиная с какого, но в arduino-1.0 точно есть) по адресу \arduino~\hardware\arduino\bootloaders\stk500boot_v2_mega2560.hex

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

Еще раз для фиксации сабжа

... насколько я понимаю, проблема watchDog  существует из-за неоднозначностей в некоторых бутлоадерах х-дуин. Исправляется заливкой альтернативных бутлоадеров.

Если для прошивки атмеги на дуиновской, макетной, или иной плате применяется ПРОГРАММАТОР , в бутлоадере нет необходимости, он работает ТОЛЬКО с размещенными на дуиновских платах программаторами от USB, построенными на атмегах типа 8U что то, или 16 U что то. Таким образом при заливке по ISP с программатором watchDog работает без заморочек.

ТАК ЛИ ЭТО ?

Клапауций
Offline
Зарегистрирован: 10.02.2013

inspiritus пишет:

Еще раз для фиксации сабжа

... насколько я понимаю, проблема watchDog  существует из-за неоднозначностей в некоторых бутлоадерах х-дуин. Исправляется заливкой альтернативных бутлоадеров.

Если для прошивки атмеги на дуиновской, макетной, или иной плате применяется ПРОГРАММАТОР , в бутлоадере нет необходимости, он работает ТОЛЬКО с размещенными на дуиновских платах программаторами от USB, построенными на атмегах типа 8U что то, или 16 U что то. Таким образом при заливке по ISP с программатором watchDog работает без заморочек.

ТАК ЛИ ЭТО ?

если проблемы в лоадере, то "да" - энто так: нет лоадера - нет проблем.(Всегда ваш,КО)

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

Вот еще в копилку программный сброс:

asm volatile ("jmp 0x0000");

 

kholonkin
Offline
Зарегистрирован: 14.10.2013

Доброго времени суток!

Мучал Про Мини... что то не получилось заставить работать адекватно собаку......

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

Скетчи писать через программатор по SPI......

Casper
Offline
Зарегистрирован: 02.10.2012

Подключи по SPI и прошей скетч. Лодер сам улетучится.

kholonkin
Offline
Зарегистрирован: 14.10.2013

Однако.......

И так шью через SPI, значит и лоудера там не долждно быть.... тады почему собака не робит.... странно.....

Casper
Offline
Зарегистрирован: 02.10.2012

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

Качни себе Khazama AVR Programmer

Он работает с UsbASP. С мопощью него можно стереть чип и выставить фьюзы.

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

На худой конец avrdude. -E стирает чип, одновременно снимает лок биты.

kholonkin
Offline
Зарегистрирован: 14.10.2013

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

У меня задержка 8 сек стоит.... но проц встает колом... ресетом не перезагружается, только снятием питания.

программатор у меня из ардуины сделан, с залитым примером SPI.

Casper
Offline
Зарегистрирован: 02.10.2012

Ардуиновый не пойдет для казамы.

Собака включается только если бит собакин стоит. В конфигураторе плат ардуино этот бит снят (не задан).

Я понял что это лодер ставит слишком короткий сброс.

Тоже маялся с ардуино ПРО, потом залил в него optiboot и стало офигенно

kholonkin
Offline
Зарегистрирован: 14.10.2013

В оптибут вроде нет под ПРО 5в 16МГц прошивки.........

МОжет я чего криво делаю.......

А оптибуб, какой именно хекс заливался? КОторый заработал

Casper
Offline
Зарегистрирован: 02.10.2012

Как так?

atmega328_pro16: TARGET = atmega328_pro_16MHz
atmega328_pro16: MCU_TARGET = atmega328p
atmega328_pro16: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=115200'
atmega328_pro16: AVR_FREQ = 16000000L
atmega328_pro16: LDSECTIONS = -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe
atmega328_pro16: $(PROGRAM)_atmega328_pro_16MHz.hex
atmega328_pro16: $(PROGRAM)_atmega328_pro_16MHz.lst

atmega328_pro16_isp: atmega328_pro16
atmega328_pro16_isp: TARGET = atmega328_pro_16MHz
atmega328_pro16_isp: MCU_TARGET = atmega328p
# 512 byte boot, SPIEN
atmega328_pro16_isp: HFUSE = DE
# Low power xtal (16MHz) 16KCK/14CK+65ms
atmega328_pro16_isp: LFUSE = FF
# 2.7V brownout
atmega328_pro16_isp: EFUSE = 05
atmega328_pro16_isp: isp
 

Добавь это в makefile и перекопмилируй.

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

Casper пишет:

Подключи по SPI и прошей скетч. Лодер сам улетучится.

Не улетучится. Ардуино IDE не даст создать файл который не влезет во флеш минус размер загпузчика.

И всё равно, согласно фьюзам, будет стартовать именно с загрузчика.

Выход - отключить этот старт прошив программатором BOOTRST в "1"

Кстати сам загрузчик (если не затереть его большим кодом или не сделать ChipErase) прекрасно сохранится) и может быть снова включен через BOOTRST в "0"

kholonkin
Offline
Зарегистрирован: 14.10.2013

Casper.... %)

Я не настолько крут в закулисьях.....

У меня такое ощущение что мы не много на разных языках говорим.

Приведенное табой вставить в файл по адресу? 

C:\Program Files (x86)\Arduino\hardware\arduino\avr\bootloaders\atmega\Makefile

???

Не могу врубиться где тут ссылка на оптибут..... и что перекомпилировать? Скетч?....  %)

 

kholonkin
Offline
Зарегистрирован: 14.10.2013

Я себя почему то ощущаю одной из героинь Крыловской басни....

kholonkin
Offline
Зарегистрирован: 14.10.2013

КОгда загрузчик прописываешь, Ардуина смотрит тип платы, который в инструментах/плата выбран?

Или она его опросом камня определяет?

Casper
Offline
Зарегистрирован: 02.10.2012

Да. это makefile

Данный файл описывает как компилировать загрузчик.

Перекомпилировать загрузчики. Omake.bat

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

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

Casper
Offline
Зарегистрирован: 02.10.2012

Загрузчик прописан в boards.txt

вот пример

atmega328.bootloader.file=ATmegaBOOT_168_atmega328.hex

То есть может быть понадобится сделать еще и блок для платы.

Во, нашел в архивах.

https://dl.dropboxusercontent.com/u/91780549/3/bootloader.hex

Не PRO конечно, но под 328 камень TQFP на 16 мгц.

kholonkin
Offline
Зарегистрирован: 14.10.2013

Casper пишет:

...........

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

Буду премного благодарен..

так то вроде как вдуплился, че к чему, но почему то бат файл не запускается......

там вот эта хрень - ..\..\..\tools\avr\utils\bin\make OS=windows ENV=arduino %*

 
Casper
Offline
Зарегистрирован: 02.10.2012

Честно - не помню как сам запускал. Тоже тыкался тыкался. НО в конце концов получилось.

Но можешь использовать выложенный файл. На 16 мгц работает без проблем. 115200 загрузка. По большому счету ему пофигу камень. Что ДИП, что TQFP. Его задача принять байт и адрес его во флешке и туда засунуть. Только и всего. Ах да, EEPROM не программирует :(

 

kholonkin
Offline
Зарегистрирован: 14.10.2013

Вгрузил... чуда не произошло....

Либо сделал что не так, либо дело не в этом...

Casper
Offline
Зарегистрирован: 02.10.2012

в BOARDS.txt

myduino.name=Moja plata na atmega328
myduino.upload.protocol=arduino
myduino.upload.maximum_size=32256
myduino.upload.speed=115200
myduino.bootloader.low_fuses=0xff
myduino.bootloader.high_fuses=0xde
myduino.bootloader.extended_fuses=0x05
myduino.bootloader.path=atmega
myduino.bootloader.file=bootloader.hex
myduino.bootloader.unlock_bits=0x3F
myduino.bootloader.lock_bits=0x0F
myduino.build.mcu=atmega328p
myduino.build.f_cpu=16000000L
myduino.build.core=arduino
myduino.build.variant=standard

 

файл bootloader.hex  положи в ARDUINO\hardware\arduino\bootloaders\atmega\

Перезапусти среду ардуино и выбери новую плату.

Сервис / записать загрузчик.

ВСЕ.

kholonkin
Offline
Зарегистрирован: 14.10.2013

как то бы вообще бы снести этот загрузчик.......... 

kholonkin
Offline
Зарегистрирован: 14.10.2013

ооо чета выдавать начал...

missing "bootloader.tool" configuration parameter
kholonkin
Offline
Зарегистрирован: 14.10.2013

в boards.txt

pro.name=Arduino Pro or Pro Mini
 
pro.upload.tool=avrdude
pro.upload.protocol=arduino
 
pro.bootloader.tool=avrdude
pro.bootloader.unlock_bits=0x3F
pro.bootloader.lock_bits=0x0F
 
pro.build.board=AVR_PRO
pro.build.core=arduino
pro.build.variant=standard
 
## Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328
## -------------------------------------------------
pro.menu.cpu.16MHzatmega328=ATmega328 (5V, 16 MHz)
 
pro.menu.cpu.16MHzatmega328.upload.maximum_size=30720
pro.menu.cpu.16MHzatmega328.upload.maximum_data_size=2048
pro.menu.cpu.16MHzatmega328.upload.speed=115200
 
pro.menu.cpu.16MHzatmega328.bootloader.low_fuses=0xFF
pro.menu.cpu.16MHzatmega328.bootloader.high_fuses=0xDA
pro.menu.cpu.16MHzatmega328.bootloader.extended_fuses=0x05
pro.menu.cpu.16MHzatmega328.bootloader.file=bootloader.hex
 
pro.menu.cpu.16MHzatmega328.build.mcu=atmega328p
pro.menu.cpu.16MHzatmega328.build.f_cpu=16000000L
 
 
ВОт так вот шьеи лоудер... но собака не робит
Casper
Offline
Зарегистрирован: 02.10.2012

Сопоставь размеры области загрузчика и фьюзы.

myduino.upload.maximum_size=32256
myduino.bootloader.low_fuses=0xff
myduino.bootloader.high_fuses=0xde
myduino.bootloader.extended_fuses=0x05

 

pro.menu.cpu.16MHzatmega328.upload.maximum_size=30720
pro.menu.cpu.16MHzatmega328.upload.maximum_data_size=2048
pro.menu.cpu.16MHzatmega328.bootloader.low_fuses=0xFF
pro.menu.cpu.16MHzatmega328.bootloader.high_fuses=0xDA
pro.menu.cpu.16MHzatmega328.bootloader.extended_fuses=0x05
 
 
вот это вот за что отвечает?
pro.menu.cpu.16MHzatmega328.upload.maximum_data_size=2048
 
 
kholonkin
Offline
Зарегистрирован: 14.10.2013

За объем памяти отведенной под переменные, я так понимаю.

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

kholonkin
Offline
Зарегистрирован: 14.10.2013

В общем покурил я на выходных про фьюзы......

выставил фьюзы как у тебя, с твоим хексом......... не фига......

вот так вот.... 

pro.menu.cpu.16MHzatmega328=ATmega328 (5V, 16 MHz)
 
pro.menu.cpu.16MHzatmega328.upload.maximum_size=32256
######pro.menu.cpu.16MHzatmega328.upload.maximum_data_size=2048
pro.menu.cpu.16MHzatmega328.upload.speed=115200
 
pro.menu.cpu.16MHzatmega328.bootloader.low_fuses=0xFF
pro.menu.cpu.16MHzatmega328.bootloader.high_fuses=0xDE
pro.menu.cpu.16MHzatmega328.bootloader.extended_fuses=0x05
pro.menu.cpu.16MHzatmega328.bootloader.file=bootloader.hex
pro.menu.cpu.16MHzatmega328.bootloader.unlock_bits=0x3F
pro.menu.cpu.16MHzatmega328.bootloader.lock_bits=0x0F
 
pro.menu.cpu.16MHzatmega328.build.mcu=atmega328p
pro.menu.cpu.16MHzatmega328.build.f_cpu=16000000L

 

Casper
Offline
Зарегистрирован: 02.10.2012

Странно. По сути то же, что и у меня, а у меня работает.

ustas
Offline
Зарегистрирован: 12.03.2012

ммм.. а загрузчик с такими параметрами зашивали? 

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

Кстати, фьюзы можно поправить через "дудку" или ее графическую оболочку (например avrdude-GUI).

Casper
Offline
Зарегистрирован: 02.10.2012

avrdude -pm328p -cusbasp -Pusb -Ulock:w:0x3F:m -Uefuse:w:0x05:m -Uhfuse:w:0xde:m -Ulfuse:w:0xff:m

avrdude -pm328p -cusbasp -Pusb -Uflash:w:bootloader.hex:i

avrdude -pm328p -cusbasp -Pusb -Ulock:w:0x0C:m

Вот так у меня моя программа подготавливает плату.

То есть все фьюзы также. Файл тот же. Проблем нет.

Попробуйте дудкой зашить. только вместо -cusbasp пишите -carduinoisp

 

kholonkin
Offline
Зарегистрирован: 14.10.2013

ustas пишет:

ммм.. а загрузчик с такими параметрами зашивали? 

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

Кстати, фьюзы можно поправить через "дудку" или ее графическую оболочку (например avrdude-GUI).

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

kholonkin
Offline
Зарегистрирован: 14.10.2013

ЧТо то он нецензурна выражается на ардуино ай си пи, говорит нет такого программатора...... куда чего дописать?