Почему ардуино уно зависает

Arduino.ru

Arduino UNO Atmega 328P зависает

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

Моя ардуинка получает данные с пк, парсит массив и выводит на экран 128×64 px. Она может работать около часа без нареканий, но потом значения повисают. У ардуинки может что то копиться в кеше или по каким причинам она может повисать? После ребута продолжает работать штатно.

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

щас все достанут хрустальные шары и будут изучать ваш код.

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

Я думал может есть какая то общая проблема(

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

Я думал может есть какая то общая проблема(

Есть такая — выход за границы массива.

У вас, например, в функции parsing() — переменная index инкрементируется без всякой проверки того, что index не вышел за границу массива inData[] . Я не говорю, что дело именно в этом — но вероятность есть. Проверку выхода индекса за пределы нужно предусматривать всегда, такой «беззаботный» код не допустим.

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

Строго говоря, в документации к U8Glib недвусмысленно сказано — НИКАКИХ долгих действий внутри цикла отрисовки. А у вас там вызывается parsing() зачем-то.

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

Источник

Arduino watchdog или автоматический RESET в случае зависания


Речь пойдет о том, как держать Arduino всегда в работоспособном состоянии. Механизм watchdog встроен в контроллеры Atmega, но, к сожалению, не всякий загрузчик (bootloader) Arduino правильно обрабатывает эту функцию. Попробуем разобраться с этой проблемой.

Итак, что такое watchdog? Простыми словами — это встроенный таймер на определенное время (до 8 сек в зависимости от чипа), который можно запустить программно. Как только таймер «дотикает» до нуля, контроллер подает правильный сигнал сброса (RESET) и всё устройство уходит в hard перезагрузку. Самое главное, что этот таймер можно сбрасывать в начальное состояние также программным способом.

  • Правильный сигнал сброса — достаточный по длительности для того, чтобы контроллер начал перегружаться. Иногда есть соблазн подключить к RST входу какой-либо цифровой выход Arduino и устанавливать его в 0 когда надо перегрузиться. Это плохой подход к решению проблемы, т.к. такого сигнала может быть недостаточно по времени, хотя и не исключено, что в некоторых случаях это тоже будет работать..
  • hard перезагрузка это самая настоящая перезагрузка, которая происходит при нажатии на кнопку RESET. Дело в том, что есть еще понятие soft перезагрузки — это программный переход на 0-вой адрес. В принципе, это тоже полезная вещь, но с помощью нее невозможно перегрузить зависший контроллер Ethernet или взглюкнувший LCD.

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

Функции Watchdog

Чтобы использовать функции Watchdog нужно подключить к проекту стандартную библиотеку:

Теперь нам доступны следующие три функции:

1. Запуск таймера watchdog:

Таймер будет считать ровно столько, сколько указано в константе. По истечении этого времени произойдет перезагрузка.

2. Сброс таймера watchdog:

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

3. Отключение watchdog:

Отключение таймера watchdog.

Собственно, на этом можно было бы и закончить наше повествование о watchdog… но дело в том, что все это работает только в Arduino Uno, а на Arduino Mega, Mini и Nano все это работает ровно наоборот, т.е. не работает совсем :)

Почему watchdog не работает на большинстве современных плат Arduino

Дело в том, что после перезагрузки, которая была вызвана watchdog, контроллеры последних выпусков оставляют включенным watchdog на минимальный период, т.е. 15ms. Это нужно для того, чтобы программа как-то узнавала, что предыдущая перезагрузка была по watchdog. Поэтому первоочередная задача загрузчика (или вашей программы, если она запускается первой) — сохранить информацию о том, что перезагрузка была «неожиданной» и сразу же выключить watchdog. Если этого не сделать, то система уйдет в bootloop, т.е. будет вечно перегружаться.

Как известно, в Arduino есть специальный загрузчик, который выполняется в первую очередь после перезагрузки системы. И, к огромному сожалению, стандартный загрузчик не сбрасывает watchdog! Таким образом, система заходит в жестокий bootloop (состояние «crazy led», при котором светодиод на 13-м пине мигает как сумасшедший).

Пути решения проблемы

Если посмотреть на исходники стандартного загрузчика (они есть в поставке платформы), то код отключения watchdog есть (!), но этот код вынесен под условную компиляцию и, по всей видимости, стандартный загрузчик скомпилирован без поддержки watchdog. По крайней мере в пакете платформы версии 1.5.2 (последней на момент написание статьи) дело обстоит именно так.

Для решения проблемы я даже прочитал man-ы самой платформы (:) и вроде бы там описана эта проблема и даже приведен код, который должен сделать всех счастливыми:

Здесь описывается функция get_mcusr(), которая должна вызываться сразу после сброса. Это достигается макросом «__attribute__((section(«.init3″)))». Я пробовал прописывать эту функцию во все секции, которые только возможно — да, она действительно запускается до функции setup() из скетча, но, к сожалению, гораздо позже 15ms (минимальная константа watchdog) после сброса…

Короче говоря, как я ни рыл интернет в поисках легкого решения проблемы, так ничего найдено не было. Я нашел только один способ заставить watchdog работать — перепрошить загрузчик… чем мы сейчас и займемся.

Проверка работоспособности watchdog

Прежде чем что-то прошивать, нужно проверить — вдруг ваша Arduino поддерживает watchdog. Для этого я написал небольшой скетч для теста. Просто залейте его, откройте монитор порта и смотрите, что будет происходить.

После перезагрузки (или подключения монитора к порту) встроенный светодиод мигнет, сигнализируя о том, что запустился загрузчик. Далее в секции setup происходит включение watchdog с таймером на 8 сек. После этого светодиод отсчитает нам это время и должна произойти перезагрузка.

Далее начинается самое интересное — если перезагрузка произошла и все повторяется в такой же последовательности, то вы имеете на руках Arduino, в которой загрузчик правильно обрабатывает watchdog. Если же после перезагрузки светодиод на 13-м пине начинает бесконечно мигать, то значит загрузчик не поддерживает watchdog. Здесь даже кнопка сброса не поможет. Для последующей прошивки нужно плату отключать от питания и после включения успеть прошить до первой перезагрузки.

Я протестировал 4 вида плат и только загрузчик в Arduino Uno сработал так как надо:

Watchdog не поддерживается загрузчиком:
Watchdog поддерживается загрузчиком:

Как легче всего прошить новый загрузчик?

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

Я не буду в этой статье описывать все премудрости создания программатора на основе Arduino, т.к. эта тема довольно подробно описана в интернете. В качестве программатора я использовал Arduino Uno. Как известно, прошивка производится через отдельный разъем ICSP, который есть почти на всех платах. В случае прошивки Arduino Pro Mini, у которого нет IСSP, подключение производится непосредственно к выводам.


Где взять загрузчик, который поддерживает watchdog?

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

Рекомендуется использовать загрузчики из пакета optiboot. В принципе, эти загрузчики идут в инсталляции самой платформы Arduino, но лучше скачать и установить последнюю версию optiboot отсюда. Установка заключается в двух шагах (возможно, это можно сделать как-то по-другому):

  1. Папка bootloaders\optiboot перезаписывается в C:\Program Files (x86)\Arduino\hardware\arduino\avr\bootloaders\optiboot
  2. Файл boards.txt дописывается к файлу C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt

Естественно, папка установки платформы Arduino у вас может быть другой.

Далее перегружается среда разработки и в меню Сервис/Плата можно наблюдать новые платы с пометкой [optiboot]. К сожалению, при выборе этих плат происходят какие-то непонятные ошибки компиляции и появляются всякие другие странности… поэтому делаем еще проще. Открываем в любом текстовом редакторе файл C:\Program Files (x86)\Arduino\hardware\arduino\avr\boards.txt и меняем следующие строчки:

Для Arduino Nano:
menu.cpu.nano.atmega328.bootloader.file=optiboot/optiboot_atmega328.hex

Для Arduino Mini:
menu.cpu.mini.atmega328.bootloader.file=optiboot/optiboot_atmega328.hex

Следующая проблема в том, что загрузчика optiboot для платы Arduino Mega не существует в природе, т.к. в Mega больше памяти и используется другой протокол. Поэтому мы используем стандартный, но модифицированный загрузчик, который качаем отсюда. Файл переименовываем в stk500boot_v2_mega2560_2.hex и записываем в папку C:\Program Files (x86)\Arduino\hardware\arduino\avr\bootloaders\stk500v2.

Далее меняем в уже знакомом файле boards.txt следующую строчку:
mega2560.bootloader.file=stk500v2/stk500boot_v2_mega2560_2.hex

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

Процесс прошивки

После всех изменений можно прошивать загрузчики, выбирая в меню плат обычные платы (не [optiboot]!). В этом случае прошиваться будут именно те файлы hex, которые мы указали в файле board.txt.
Процесс прошивки может не стартовать и выдаваться ошибка:

Для решения этой проблемы откройте скетч программатора и в секции setup выберите другую скорость последовательного порта.
Во время заливки в Arduino Mega может появляться ошибка, которую следует игнорировать:

Заключительные манипуляции

Загрузчики optiboot имеют еще одну особенность — они увеличивают скорость загрузки скетчей, поэтому при использовании плат с optiboot нужно внести соответствующие изменения в boards.txt:

Для Arduino Nano:
menu.cpu.nano.atmega328.upload.speed=115200
Для Arduino Mini:
menu.cpu.mini.atmega328.upload.speed=115200

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

Источник

Arduino.ru

Ардуино уно работает несколько секунд и зависает

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

почти доделал свой проект,код скомпилировал и когда стал подключать уже в отдельном месте внешнее питание моё устройство просто никак не реагирует. подключил жк,4 датчика,реле всё это на I/O Expansion Shield V5 Xbee с компа всё прекрасно выводило на жк и как только решил попробовать всё вне пк всё перестало работать. и когда уже снова подключил к компу проблема не устранилась. иногда только несколько секунд поработает и всё опять зависнет

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

Этож надо так, суметь создать СВОЙ проект и не смочь разобратьсяя с неполадкой уно. А проблемма то в чем, на микроконтроллер питаниее поступает? Код где?

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

а как понять поступает ли? на самой плате дефектов нету,запахов нету. я могу сфотографировать.

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

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

я решил отсоединить шилд и попробовать один датчик тупо на ардуино подключить и он работал

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

Этож надо так, суметь создать СВОЙ проект и не смочь разобратьсяя с неполадкой уно. А проблемма то в чем, на микроконтроллер питаниее поступает? Код где?

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

Ну питание от пк черезз USB 5v постоянки, чем запитывали вы, вне пк и к какому пину подключали питание?

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

Ну питание от пк черезз USB 5v постоянки, чем запитывали вы, вне пк и к какому пину подключали питание?

бп от ноута кажется hipro 12v 3.33a

и ещё бп от зарядки 5v 1a

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

Ну питание от пк черезз USB 5v постоянки, чем запитывали вы, вне пк и к какому пину подключали питание?

когда от ноута включал там около входа грелось немного и когда было средне я выключил.

подключал по 3.5 вроде,ну второй вход от ардуино не юсб

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

на средней ноге стабилизатора MS1117 относительно минуса сколько вольт, ппри подключеении блока питания?

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

на средней ноге стабилизатора MS1117 относительно минуса сколько вольт, ппри подключеении блока питания?

это который у питания ардуино?

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

на средней ноге стабилизатора MS1117 относительно минуса сколько вольт, ппри подключеении блока питания?

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

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

А 5в от зарядки куда подключали, к какому пину?

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

А 5в от зарядки куда подключали, к какому пину?

к ардуино. я просто через юсб подключил зарядку (как обычно телефоны заряжаются) и питание было через юсб

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

Корочеее, наа миикроконтроллер атмега 328 не должно поступать более 5,5в, если чуть более, то ему может быть кирдык.

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

Корочеее, наа миикроконтроллер атмега 328 не должно поступать более 5,5в, если чуть более, то ему может быть кирдык.

ну хорошо, а он же у меня работатет. я отсоединил шилд и подключил один датчик и он работал

потом подключил шилд и он какое-то время от пк поработал и просто встал т.е реле не реагируют и жк не обновляет ничего

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

На ноутах обычно блоки питания 19,5 в , возможно стабилизаатор 1117 не выдержал

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

На ноутах обычно блоки питания 19,5 в , возможно стабилизаатор 1117 не выдержал

а как тогда получается что по одному датчику работает? и я так понял у него грелось у меня но я долго не держал

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

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

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

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

как так? если же на блоке написано что 12

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

И чем при этом запитываете? и куда?

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

В общем, откройте даташит на атмегу 328 и замерьте напряжение на питающих пинах Vcc, aVcc

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

И чем при этом запитываете? и куда?

от юсб пк к юсб ардуино

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

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

В общем, откройте даташит на атмегу 328 и замерьте напряжение на питающих пинах Vcc, aVcc

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

при питании от ноутбучного блока на средней ноге MS1117 должнно быть 5 в

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

при питании от ноутбучного блока на средней ноге MS1117 должнно быть 5 в

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

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

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

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

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

ну к сожалению у меня нет под рукой сейчас мультиметра

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

skotmak , может, у Вас и осциллографа нет?

Как Вы вообще собираетесь отлаживать саой проект без приборов?

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

skotmak , может, у Вас и осциллографа нет?

Как Вы вообще собираетесь отлаживать саой проект без приборов?

нет у меня осциллографа

дело в том что я не профессионал, я только начинающий. я такую вещь делал на олимпиаде,но проблема в том что там уже было оборудование и просто нужно собрать и настроить,а у меня вообще всё с нуля делаю

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

В общем, откройте даташит на атмегу 328 и замерьте напряжение на питающих пинах Vcc, aVcc

измерил. показывает на двух пинах 4,67

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

на средней ноге стабилизатора MS1117 относительно минуса сколько вольт, ппри подключеении блока питания?

на средней ноге как мерить?

я плюс подключал на одну большую ногу а минус на против большой слева 6,посередине 0,справа -5

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

В общем, откройте даташит на атмегу 328 и замерьте напряжение на питающих пинах Vcc, aVcc

измерил. показывает на двух пинах 4,67

я так же померил напряжение на аналоговых и цифровых выходах и там было 4,5 (а написано 5)

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

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

когда устройство работает норм(т.е. все датчики работают норм,жк показывает данные,реле включено,а датчик освещённости не показывает что свет есть) на мк vcc 4,17 avcc 4,20

когда я датчик света подношу к свету,он срабатывает и всё останавливается(т.е. реле не реагирует,жк замерло,но все огоньки везде горят) напряжение везде такое же 4,17 и 4,20

Источник

Adblock
detector