ArduinoIDE и ATmega16, корректируем ядро

gudron
Offline
Зарегистрирован: 14.12.2014

При компилировании для м/к atmega16 скетча с библиотекой servo.h выходит ошибка:

C:\Program Files (x86)\Arduino\libraries\Servo\Servo.cpp: In function 'void initISR(timer16_Sequence_t)':

C:\Program Files (x86)\Arduino\libraries\Servo\Servo.cpp:159: error: 'TIFR1' was not declared in this scope
C:\Program Files (x86)\Arduino\libraries\Servo\Servo.cpp:160: error: 'TIMSK1' was not declared in this scope
 
подскажите что там нужно поменять?
hugoboss317
Offline
Зарегистрирован: 21.03.2013

Какие ещё библиотеки включены?

Видимо этот таймер уже "занят"

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Данную, конкретную "ошибку" можно исправить, дополнив строку 154 в файле Servo.cpp. Было:

#if defined(__AVR_ATmega8__)|| defined(__AVR_ATmega128__)

заменить на:

#if defined(__AVR_ATmega8__)|| defined(__AVR_ATmega128__) || defined(__AVR_ATmega16__)

у меня серв нет, потому проверить не смогу.

 

hugoboss317
Offline
Зарегистрирован: 21.03.2013

kisoft пишет:

у меня серв нет, потому проверить не смогу.

Так нужно то всего скомпелировать. Это и будет проверка.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

КЭП? СкомпИлировать - это во-первых, а во-вторых, чтобы скомпилировать, нужно иметь настроенную ардуиноиде с доработкой для атмега16, у меня этого нет. Потому вопрошающий это сделает быстрее, за одним проверит. Надеюсь отпишет результат.

gudron
Offline
Зарегистрирован: 14.12.2014

kisoft пишет:

Данную, конкретную "ошибку" можно исправить, дополнив строку 154 в файле Servo.cpp. Было:

#if defined(__AVR_ATmega8__)|| defined(__AVR_ATmega128__)

заменить на:

#if defined(__AVR_ATmega8__)|| defined(__AVR_ATmega128__) || defined(__AVR_ATmega16__)

у меня серв нет, потому проверить не смогу.

 

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

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

С любыми :) Проверялись, понятно не все, это нереально. Если что, пишите, только кроме ошибок ссылку на библиотеку, а то они разные бывают. А со ссылкой я смогу быстрее посмотреть.
А вообще как правило ошибки легко исправляются. Код для атмега8 и 16 почти совпадают, потому ищем условную компиляцию и добавляем кроме атмега8 ещё атмега16. В 90% должно прокатить.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

gudron пишет:

Интересно с какими еще библиотеками возможно подобное?

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

ColikZ
Offline
Зарегистрирован: 05.11.2015

А что будет с устройствами, работающими по I2с интерфейсу. В ряде готовых библиотек (LiquidCrystal_I2C2004V1 или DS1307) нельзя выбирать пины I2c.
Для Arduino Uno I2c находится на А4 и А5, а в случае с Atmega16, где будет находится, также на А4, А5 или на 16 и 17 ?

// D16      PC0           SCL
// D17      PC1           SDA

Atmega16 пока нет, чтобы проверить самому, но хочу использовать её в своих проектах и писать код из привычной Arduino IDE, вот готовлюсь заранее, спасибо за ответ :)
kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Помнится я дорабатывал библиотеку SdFat, добавляя в неё код для Atmega16. Да, там пины 16 и 17 (PC0, PC1). Но вряд ли я её проверял.

А вообще, лучше выбрать другой камень, поскольку доработка новой версии Arduino IDE, достаточно геморойна и я не буду это делать. Тем более придется её еще и тестировать, а я уменя не так много железа для этого. Слишком часто новые версии стали выходить. Даже если Вы будете использовать версию 1.0.5, всё равно многие библиотеки я не тестировал, по понятным причинам - я их не видел и не использовал.

Вообще этот проект я делал, когда приобрел PinBoardII, а там этот камень и мне совершенно не уперлось писать на ассемблере, потому проще было переделать исходники и юзать ArduinoIDE в чистом виде, за одним и попрактиковался.

Хотя есть и другой вариант. Дорабатываете самостоятельно ;) Дельты от версии 1.0.5 есть, разобраться и в путь. Если что то понадобится, я и подсказать могу. Но всё таки - это тупиковый путь.

 

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

ColikZ пишет:

Atmega16 пока нет, чтобы проверить самому

Для этого существуют даташиты, в которых всё написано. Смотрим распиновку на 2 стр.:

PC0  (SCL)
PC1  (SDA)

 

ColikZ
Offline
Зарегистрирован: 05.11.2015

Спасибо, то что и хотел узнать.  PC0, PC1 (16, 17).

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

kisoft, можно же и на С писать) Это ДиХальт из принципа не пишет на С под 8-битные МК...а нам-то кто запрещает?)

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Можно и на С, только тогда это было "начало" пути и была под рукой простая Arduino IDE, потому сразу бросаться на другие IDE как то не очень хотелось. Это сейчас мне, в общем-то пофиг, но тогда это был самый простой путь ;) Я это всё называю "философский вопрос", т.е. каждый мочит как он хочет.

 

ColikZ
Offline
Зарегистрирован: 05.11.2015

Я сейчас нахожусь как раз в "начале" пути, который вы описали, в точь точь :) И если честно пока вылезать из Arduino IDE не очень хочется, но пришло осознание, что для простеньких проектов нет смысла тратиться на ардуинки и можно смело использовать "голые" atmega, но встал вопрос в чем же тогда кодить :) Надеюсь на ближайший мини-проект хватит "костыля" Atmega16 -> Arduino IDE, а для будущего, конечно нужно будет углублятся в недры С языка, но тогда и IDE надо сменить, на какую посоветуете ? :)

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

По феншую, конечно, IAR... Но он платный, что-то около 4000$)
Поэтому можно ставить софт от производителя - Atmel Studio(я работал в 4 версии, 6я моему ноуту не по возможностям:)).
Или, как вариант, WinAVR - сейчас в нем работаю. Удобно, можно все-все настроить...
Если нужна будет помощь по указанным программам(ессно, кроме ИАР;)), напишите мне на yaryarikyar@ya.ru, подскажу) в начале было трудно)

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Обычно для проектов хватает ATTiny2313 или ATMega8, для большего лучше сразу ATMega128.
8я стоит в Китае 31руб/шт, 128я- около 60ти, не более(это в партиях 10шт в корпусе TQFP).
Удобненько, экономненько)

ColikZ
Offline
Зарегистрирован: 05.11.2015

Спасибо большое, чуть позжу попытаюсь разобраться, ещё слышал про CodeBlocks.

А сейчас, ну раз решил делать на Atmega16, то доделаю проект на ней. Спасибо всем.

ColikZ
Offline
Зарегистрирован: 05.11.2015

Спасибо большое, чуть позже попытаюсь разобраться, ещё слышал про CodeBlocks.

А сейчас, ну раз решил делать на Atmega16, то доделаю проект на ней. Спасибо всем.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

CodeBlocks тоже хорошая, лёгкая, быстрая...но не прижилась)

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Я все таки начал с Леонардо, а потом появилась PinBoardII, но если хочется порешать проблемы, то вперед, тоже вариант :)

 

ColikZ
Offline
Зарегистрирован: 05.11.2015

Дорогие форумачне, подскажите пожалуйста ещё по такому вопросу :)

Я все таки не отказался от идеи писать код в Arduino IDE для Atmega16, ну получилось так, что надо только её использовать.
Успехи есть - я пишу код в Arduino IDE 1.7.7 и шью Atmega16 :) Но что-то с таймерами, т.е. заливаю код мигания светодиода, чтобы раз в 1 секунды мигал, но он мигает раз в 3, или около того, секунды. Так же подключал I2c устройства, они работают, но инициализация проходит долго. 
Вот как я прошиваю: пишу скетч в Arduino IDE с выбранной платой Atmega16 (ещё раз спасибо), потом из папки Arduino/temp достаю скомпилированный HEX файл и шью его через AVRDude с помощью AVR910-USB программатора, фьюзы при этом стоят по умолчанию.


Сам программатор на 8 МГц, а к Atmega16 я поставил кварц на 16 МГц, но с конденсаторами 10 пФ, в даташите к атмега есть табличка, где указано емкость от 12 до 22 пФ.
/sites/default/files/u15419/bezymyannyy2.jpg
Я постаил на 10пФ, других пока нет, может ли это быть причиной? Или же все таки где-то допустил ошибку при прошивке, может атмега от внутреннего генератора работает, но я вроде менял фьюзы, полюзуясь онлайн калькулятором, но ничего не менялось :)
http://homes-smart.ru/fusecalc/?prog=avrstudio&part=ATmega16
Буду благодарен советам, спасибо.

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

ColikZ пишет:

Я все таки не отказался от идеи писать код в Arduino IDE для Atmega16

http://arduino.ru/forum/proekty/arduinoide-i-atmega16-formiruem-bootloader

http://arduino.ru/forum/proekty/arduinoide-i-atmega16-korrektiruem-yadro

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

фьюзы 

avrdude -p atmega16 -c USBasp -U hfuse:w:0xc0:m -U lfuse:w:0x9f:m

ColikZ
Offline
Зарегистрирован: 05.11.2015

А т.е. я забыл прошить бутлоадер? У меня в папке (путь):
C:\Program Files (x86)\Arduino\hardware\arduino\bootloaders\atmega16

уже есть "готовый" файл "ATmegaBOOT_16_atmega16_16MHz.hex", который мы получаем в этой статье:
http://arduino.ru/forum/proekty/arduinoide-i-atmega16-formiruem-bootloader
Т.е. теперь все что мне остается это его прошить, также с помощью программатора (AVR910), а уже после этого заливать любые скетчи написанные в Arduino IDE? :)
Я прав, ничего не упустил? 

"прописав, предварительно фьюзы, затем bootloader."
Простите, а как это сделать? Стоит AVRDude v3.3
Fuse выставить по умолчанию, а затем просто прошить "
ATmegaBOOT_16_atmega16_16MHz.hex". Больше ничего не нужно? :)

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

ColikZ пишет:

А т.е. я забыл

ты забыл пройти по указанным ссылкам и изучить интерфейс Дуино ИДЕ

твои действия:

1. вписать свою плату в файл boards.txt

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

3. подключить программатор.

4. в Дуино ИДЕ: выбрать свою плату, выбрать программатор, нажать "Записать загрузчик".

всё. больше ничего делать не нужно.

ColikZ
Offline
Зарегистрирован: 05.11.2015

Да вроде бы все сделал, в папки все распихал, плату Atmega16 добавил в boards.txt к остальным в самый конец.

А вот с программатором что-то не то. В Arduino IDE его нет (AVR910-USB). Записать загрузчик через Arduino IDE не получается, ошика:

"Ошибка при загрузке бутлоадера: пропущен 'bootloader.tool' параметр конфигурации"
Я так понимаю, что вот этот файл: ATmegaBOOT_16_atmega16_16MHz.hex
нужно зашить в Atmega16 ?

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

ColikZ пишет:

Да вроде бы все сделал, в папки все распихал, плату Atmega16 добавил в boards.txt к остальным в самый конец.

А вот с программатором что-то не то. В Arduino IDE его нет (AVR910-USB). Записать загрузчик через Arduino IDE не получается, ошика:

"Ошибка при загрузке бутлоадера: пропущен 'bootloader.tool' параметр конфигурации"
Я так понимаю, что вот этот файл: ATmegaBOOT_16_atmega16_16MHz.hex
нужно зашить в Atmega16 ?

приобрети программатор, который поддерживает Дуино ИДЕ

используй версию arduino-1.0.6, если нет желания заморачиваться с новым форматом.

что куда зашить решит Дуино ИДЕ или ты самостоятельно разберёшься, если есть желание делать всё вручную.

ColikZ
Offline
Зарегистрирован: 05.11.2015

Все разобрался, фьюзы то надо в AVRDude отдельно шить оказывается, а не только сам HEX файл, я думал просто что они вместе и сразу шьются...
Ладно, извините за беспокойство, развел тут сырость :)
Фьюзы на 16 МГц выгледят теперь так, теперь таймеры работают на ура, если выставил 1 секунду, значит 1 секунда и будет :)

Шить напрямую из Arduino IDE не получилось, ну да ладно, зато я пишу там код, компилирую в HEX и его уже через AVRDude программирую, пока вроде все устраивает. Для простенького проекта сойдет :)

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

ColikZ пишет:

Все разобрался, фьюзы то надо в AVRDude отдельно шить оказывается, а не только сам HEX файл, я думал просто что они вместе и сразу шьются...

неверный вывод - фьюзы прописаны boards.txt и шьются при прошивке загрузчика.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Не путацйте avrdude и AVRDUDEPROG. А шить фьюзы, как по мне, через второе очень удобно, главное, как уже сказали, в board.txt продправить частоту. Ещё к AVRDUDEPROG в комплекте не помешает какой-ньть off-line калькулятор фьюзов вроде https://yadi.sk/d/Jo3-2zALkof9o

GEN
Offline
Зарегистрирован: 17.02.2017

Други, а кто нибудь реально в 16мегу нормальную прошивку заливал? у меня почемуто кнопки работают инверсивно и аналоговые входа все перепутаны (вместо А2, сразу А5 и А0) и на других примерно тоже. индикация и выхода все в порядке, грешил на "МИНИ ПРО" программатор, пробовал другими, без изменений, шью через НЕХ файл

прошивка делалась и заливалась в 328мегу все работает без проблем но там нехватает ног

hugoboss317
Offline
Зарегистрирован: 21.03.2013

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

GEN
Offline
Зарегистрирован: 17.02.2017

интересно??? а чего будет ясно??? если показания с одного пина плюсуются с показаниями двух других пинов, вообще белиберда какаято. мне нужно 6 аналоговых входа, (3 термопары и 3 переменных резюка) пробовал по разному и облом.  например вход А0 складывантся с показаниями входов А6 и А5, а вход А2 складывается с А5 и А0, итд.  крутишь резюк на одном входе а он изменяет еще на двух(((( пробовал и 105 и104 ИД компилировать, тоже самое , и на камень грешил, заливал другую прогу, притензий к камню нет

вообще ничего понять немогу

hugoboss317
Offline
Зарегистрирован: 21.03.2013

AREF запитан?

GEN
Offline
Зарегистрирован: 17.02.2017

Спасибо большое! на AREF стояла керамика 1Мк.  ставил ион стало еще хуже,  не думал что эта мега16 такая тупая, тем более в TQFP корпусе, пока жестоко не притянул через дроссель к +5 , ацп жил своей жизнью. щас вродь стало нормально. только пины перепутаны, причем при каждой компиляции встают по другому 

Штирлиц
Штирлиц аватар
Offline
Зарегистрирован: 13.06.2015

Все нормально работает на Atmega16. Использую MightyCore  по ссылке . Ниже есть распиновка всех Мк , поддерживаемых MightyCore. Там есть и стандартная , и Bobuino(Sanguino). Раньше были проблемы (до появления MightyCore) с нумерацией аналоговых - они были не по порядку . Но тоже все работало.

GEN
Offline
Зарегистрирован: 17.02.2017

Огромное спасибо за оригинал MightyCore. а Яну за перевод))) теперь все работает!!! а то действительно беда была с аналоговыми пинами.