Для простоты, я назвал этот проект Arduino16. Как я уже говорил, Arduino на ATmega16 не существует (во всяком случае мне это неизвестно).
В первой статье я раскрыл тему формирования bootloader для ATmega16.
Сегодня я хочу затронуть тему корректировки исходных текстов ядра - базовых библиотек ArduinoIDE 1.0.4, чтобы можно было писать и загружать скетчи в мою ATmega16 из среды ArduinoIDE 1.0.4.
Для нетерплеивых, измененные исходники лежат в этом архиве. Там вы найдете те файлы, что подверглись изменениям, остальные файлы менять не нужно.
Вцелом изменения коснулись в основном таймеров. Они в ATmega16 и ATmega8 похожи, однако есть некоторые отличия.
wiring.c. Изменения в инициализации timer/counter0. Здесь отличия в названиях регистров, поэтому фактически тоже самое, что и инициализация таймера0 для ATmega168 & ATmega8:
203 | #if defined(__AVR_ATmega16__) |
wiring_analog.c. Изменения в формировании PWM для таймера0
122 | #if defined(__AVR_ATmega16__) |
wiring_digital.c. С этим пришлось немного повозиться, потому что здесь была "проблема" при выключении PWM для таймера0. Без этого изменения PWM работал, но таймер не выключался.
96 | #if defined(__AVR_ATmega16__) |
97 | case TIMER0A: cbi(TCCR0, COM01); break ; |
Tone.cpp. Здесь было достаточно просто, но потребовало некоторых разборок, а именно:
- некорректно устанавливалась частота предделителя таймера
Остальные изменения были сведены к приведению кода по аналогии с ATmega8, т.е. вставки, типа
1 | #if defined(__AVR_ATmega8__) || defined(__AVR_ATmega128__) || defined(__AVR_ATmega16__) |
И главное изменение - установка частоты предделителя для таймера 2:
305 | #ifdef __AVR_ATmega16__ |
306 | TCCR2B = ( TCCR2B & 0b11111000 ) | prescalarbits; |
308 | TCCR2B = prescalarbits; |
На этом изменения кончились.
Не нужно думать, что теперь всё заработает как надо. Безусловно, основные библиотеки и примеры теперь работают нормально (буду благодарен багрепортам, возможно еще что то не нашел). Однако при использовании других библиотек, вполне возможны проблемы, в чкастности такие проблемы были обнаружены triada13 в библиотеке IRremote.
Фикс еще не доделан, но примеры компилируются, буду благодарен, если кто то протестирует и сообщит о проблемах. Итак, фикс выполняется в файле IRremoteInt.h, diff файл прилагается:
3 | > #elif defined(__AVR_ATmega16__) |
7 | < # if defined(__AVR_ATmega8P__) || defined(__AVR_ATmega8__) |
9 | > # if defined(__AVR_ATmega8P__) || defined(__AVR_ATmega8__) || defined(__AVR_ATmega16__) |
Вся библиотека здесь
Моя благодарность triada13 за помощь в тестировании и конечно же форуму!
Привет! Помоги адаптировать библиотеку softPWM. Собственно нужно получить много PWM каналов. Проблемма как раз состоит в таймерах.
Оригинальный файл SoftPWM_timer.h
01
/* $Id: SoftPWM_timer.h 116 2010-06-28 23:31:02Z <a href="mailto:bhagman@roguerobotics.com">bhagman@roguerobotics.com</a> $
02
03
A Software PWM Library
04
05
Simple timer abstractions by Paul Stoffregen (paul at pjrc dot com)
06
07
This library is free software: you can redistribute it and/or modify
08
it under the terms of the GNU General Public License as published by
09
the Free Software Foundation, either version 3 of the License, or
10
(at your option) any later version.
11
12
This library is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
GNU General Public License for more details.
16
17
You should have received a copy of the GNU General Public License
18
along with this program. If not, see <<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>>.
19
20
*************************************************/
21
22
#include <avr/io.h>
23
#include <avr/interrupt.h>
24
25
// allow certain chips to use different timers
26
#if defined(__AVR_ATmega32U4__)
27
#define USE_TIMER4_HS // Teensy 2.0 lacks timer2, but has high speed timer4 :-)
28
#else
29
#define USE_TIMER2
30
#endif
31
32
// for each timer, these macros define how to actually use it
33
#if defined(USE_TIMER2)
34
#define SOFTPWM_TIMER_INTERRUPT TIMER2_COMPA_vect
35
#define SOFTPWM_TIMER_SET(val) (TCNT2 = (val))
36
#define SOFTPWM_TIMER_INIT(ocr) ({\
37
TIFR2 = (1 << TOV2);
/* clear interrupt flag */
\
38
TCCR2B = (1 << CS21);
/* start timer (ck/8 prescalar) */
\
39
TCCR2A = (1 << WGM21);
/* CTC mode */
\
40
OCR2A = (ocr);
/* We want to have at least 30Hz or else it gets choppy */
\
41
TIMSK2 = (1 << OCIE2A);
/* enable timer2 output compare match interrupt */
\
42
})
43
#elif defined(USE_TIMER4_HS)
44
#define SOFTPWM_TIMER_INTERRUPT TIMER4_COMPA_vect
45
#define SOFTPWM_TIMER_SET(val) (TCNT4 = (val))
46
#define SOFTPWM_TIMER_INIT(ocr) ({\
47
TCCR4A = 0; \
48
TCCR4B = 0x04;
/* CTC Mode */
\
49
TCCR4C = 0; \
50
TCCR4D = 0; \
51
TCCR4E = 0; \
52
OCR4C = 0; \
53
OCR4C = (ocr); \
54
TIMSK4 = (1 << OCIE4A); \
55
})
56
#endif
Я изминил на:
01
/* $Id: SoftPWM_timer.h 116 2010-06-28 23:31:02Z <a href="mailto:bhagman@roguerobotics.com">bhagman@roguerobotics.com</a> $
02
03
A Software PWM Library
04
05
Simple timer abstractions by Paul Stoffregen (paul at pjrc dot com)
06
07
This library is free software: you can redistribute it and/or modify
08
it under the terms of the GNU General Public License as published by
09
the Free Software Foundation, either version 3 of the License, or
10
(at your option) any later version.
11
12
This library is distributed in the hope that it will be useful,
13
but WITHOUT ANY WARRANTY; without even the implied warranty of
14
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
GNU General Public License for more details.
16
17
You should have received a copy of the GNU General Public License
18
along with this program. If not, see <<a href="http://www.gnu.org/licenses/" rel="nofollow">http://www.gnu.org/licenses/</a>>.
19
20
*************************************************/
21
22
#include <avr/io.h>
23
#include <avr/interrupt.h>
24
25
// allow certain chips to use different timers
26
//#if defined(__AVR_ATmega32U4__)
27
#if defined(__AVR_ATmega16__)
28
# define USE_TIMER2_16 // Teensy 2.0 lacks timer2, but has high speed timer4 :-)
29
#else
30
# define USE_TIMER2
31
#endif
32
33
// for each timer, these macros define how to actually use it
34
#if defined(USE_TIMER2)
35
#define SOFTPWM_TIMER_INTERRUPT TIMER2_COMPA_vect
36
#define SOFTPWM_TIMER_SET(val) (TCNT2 = (val))
37
#define SOFTPWM_TIMER_INIT(ocr) ({\
38
TIFR2 = (1 << TOV2);
/* clear interrupt flag */
\
39
TCCR2B = (1 << CS21);
/* start timer (ck/8 prescalar) */
\
40
TCCR2A = (1 << WGM21);
/* CTC mode */
\
41
OCR2A = (ocr);
/* We want to have at least 30Hz or else it gets choppy */
\
42
TIMSK2 = (1 << OCIE2A);
/* enable timer2 output compare match interrupt */
\
43
})
44
45
#elif defined(USE_TIMER2_16)
46
#define SOFTPWM_TIMER_INTERRUPT TIMER1_COMPA_vect
47
#define SOFTPWM_TIMER_SET(val) (TCNT1 = (val))
48
#define SOFTPWM_TIMER_INIT(ocr) ({\
49
TIFR = (1 << TOV0);
/* clear interrupt flag */
\
50
TCCR1B = (1 << CS10);
/* start timer (ck/8 prescalar) */
\
51
TCCR1A = (1 << WGM10);
/* CTC mode */
\
52
OCR1A = (ocr);
/* We want to have at least 30Hz or else it gets choppy */
\
53
TIMSK |= (1 << OCIE1A);
/* enable timer2 output compare match interrupt */
\
54
})
55
#endif
Вроде бы работает, только как то косячно). Что я не так сделал?
Неплохо было понять, что именно "косячно". Я не вижу, что видят твои глаза ;)
Чтобы понять, что некорректно работает можно поступить следующим образом:
В тексте программы есть код для программирования таймера на другом камне ATmega32U4. Берешь на него даташит и смотришь, как программируется его таймер, потом по даташиту на атмега16 смотришь, как нужно его программировать. И всё. Я всегда так делаю.
Потому что пока я разберусь, что не так, может пройти немало времени.
UPD: Еще, кстати, мне очень не нравится, что, например, TCCR1A устанавливается бит WGM10, а остальные сбрасываются. Рекомендую посмотреть, как программируется по умолчанию таймер 1 в файле wiring.c, функция init(). Хотя, может это и пофигу в данном случае.
В общем всё получилось, только я опять вернулся к проблеме со "временем" как и на восьмой меге. Как тут сделать чтоб delay(1000) была равна 1 секунде, а не 16 как сейчас?
P.S. (Atmega16A)
В общем всё получилось, только я опять вернулся к проблеме со "временем" как и на восьмой меге. Как тут сделать чтоб delay(1000) была равна 1 секунде, а не 16 как сейчас?
P.S. (Atmega16A)
Прошить фьюзы для внешнего кварца или в boards.txt указать, что у вас частота 1 мегагерц, а не 16.
Не разу не делал. Подскажете как? Если можно поподробней т.к. нужно 16 мГц.
И ещё, я правельно понимаю, у Atmega8 только 3 ШИМ-а, (PB0 - PB2), а у Atmega16 всего 4 (PB3, PD4, PD5, PD7)?
Не разу не делал. Подскажете как? Если можно поподробней т.к. нужно 16 мГц.
И ещё, я правельно понимаю, у Atmega8 только 3 ШИМ-а, (PB0 - PB2), а у Atmega16 всего 4 (PB3, PD4, PD5, PD7)?
Я по этому мануалу научился. Изучайте.
Пока что указал 1 Мгц, Я не буду захламлять эту ветку флудом. Проблема с Atmega16. Нужна помощь, загляните если не трудно. http://arduino.ru/forum/programmirovanie/lcd-128x64-i-mega2560-zazhgem#c...
Всвязи с выходом ArduinoIDE v1.0.5 http://arduino.cc/en/Main/Software выполнена доработка Arduino16.
Для простоты выложен архив с измененными файлам. Некоторые остались из версии 1.0.4, пару файлов пришлось слить.
Архив выложен здесь https://sites.google.com/site/kisoft63/pinboardii/pinboardii
Сильно не тестировал, но при компиляции ошибок не наблюдается. Пишите, если что то не так.
PS1. Дополнительно доработан файл из SD библиотеки, но это почти НЕ проверялось, потому, если будуте добавлять, то на свой страх и риск, я это проверю еще не скоро. Файл libraries/SD/utility/Sd2PinMap.h
PS2. Файл boards.txt взят из ArduinoIDE 1.0.5 и в него добавлено описание board ATmega16.
Удачи!
Добрый день.
Прошил ATMega16 булоадером, в Arduino IDE 1.0.5 файлы заменил. При попытке заливки скетча пишет ошибку: avrdude: stk500_getsync(): not in sync: resp=0x00. Один раз из нескольких попыток скетч мигания светодиодом на 13 порту (PB5) залился. Сейчас контроллер мигает светодиодом, но залить другие скетчи не получается. Пробовал в PinBoard II и в PinBoard I. Подозреваю что дело в сигнале Reset. Подскажите, как добиться стабильной работы в PinBoard II.
P.S. Перед заливкой скетча Reset нажимал. Платы Arduino прошиваются без проблем. PinBoard I и PinBoard II тоже шьются без проблем.
Перечитал всё, но не нашел, где это написал, оказывается только на easyelectronics было, цитирую:
"чтобы сброс шел автоматом при прошивке надо соединить BDBUS4 ftdi с ножкой reset атмеги, BDBUS4 это и есть DTR. Всё пашет, кнопку жать не нужно. PBII.2"
Я это нашел "методом тыка", всё работало нормально, во всяком случае не помню, чтобы с этим были проблемы. Если не получится, я, конечно смогу проверить, но не очень скоро, поскольку переустановил винду и теперь надо доустанавливать драйверы и т.п.
У меня Win7 x64, PB2 rev.2
А вообще и руками жать ресет можно, тоже должно работать, только приноровиться надо.
Не получается к сожалению. Видно что BDBUS4 пытается сброс дернуть, но через несколько секунд выдается та же ошибка. Точнее даже сброс дергается, светодиод TX мигает, потом "тишина" и ошибка выдается.
WinXP x32, PB2 rev.1
Еще вопросик, бутлоадер компилировался под ATMega16 или ATMega16A? У меня ATMega16 из старых запасов.
На ручное нажатие сброса та же ошибка выдается. Из обычных ардуинок у меня есть и с ручным сбросом. С ними все нормально получается.
У меня атмега от ДиХальта, по моему 16а.
Я еще раз попробую, но не быстро, времени почти нет, надо до отпуска на работе заявку доделать.
Просто 16 атмеги нет, потому проверить не смогу
Перекомпилил бут, залил по-новой. Опять один раз скетч залился и все. И то не по сигналу DTR, а после подачи питания на контроллер. Создается впечатление что загрузчик не дожидается пока данные прошивки пойдут. Не помните навскидку, есть в исходниках загрузчика настройка времени ожидания данных?
Makefile, у меня это строка 200:
200
atmega16: CFLAGS +=
'-DMAX_TIME_COUNT=F_CPU>>4'
'-DNUM_LED_FLASHES=1'
'-DWATCHDOG_MODS'
Здесь MAX_TIME_COUNT - задает время ожидания. Поменять и перекомпилировать, залить загрузчик.
Время ожидания - "в попугаях", фактически это счетчик, включенный в цикл ожидания, поэтому - это всё примерно.
Для 16 МГц получается 1000000 циклов ожидания.
Кстати, фьюзы у Вас какие? У меня для внешнего кварца 16МГц, 0xDD (HFUSE) & 0xFF (LFUSE)
Спасибо, вечером попробую.
Фьюзы такие же установлены 0xDD, 0xFF. Делал все по Вашей предыдущей статье. Поначалу грешил на то что линии Tx, Rx неправильно соединил, но скетч первый раз заливается. Вобще странно, ведь для родных ардуиновских контроллеров стоит такая же задержка, а у некоторых даже меньше. Еще попробую выяснить, точно ли на моей ревизии PinBoard II сигнал DTR выведен.
Я dtr искал методом тыка, хотя можно по схеме попробовать посмотреть, посмотрите схему PB своей ревизии. Странно, вроде 16 и 16а мало чем отличаются
Схему смотрел. Все порты FT2232 выведены на колодки. Подписаны Rx, Tx обоих каналов и светодиоды для них.
Я заметил такую особенность, моя мега16 при нажатии кнопки сброса сразу начинает выполнять загруженный скетч. А вот при включении питания моргает светодиодом на 13 порту (PB5) сигнализируя, как я понимаю, о работе загрузчика.
Мегу16А мне найти не удалось пока.
В Makefile, сделайте NUM_LED_FLASHES=5 или больше, а то он один раз моргает. Хотя это так, чтобы был более заметен загрузчик.
Ок. Начнем с начала ;)
Вы вставили в плату расширения от PB2.1 свой камень atmega16. Вставили кварц на 16МГц. Подключили 4 или 5 проводов от атмеги до ft2232.
Фьюзы я прошивал SinaProg, а загрузчик avrdude. Потом из ArduinoIDE шьём Blink.
Посмотрим загрузчик, до того места, где он начинает моргать светиком:
1. Если у Вас в Makefile есть -DWATCHDOG_MODS, тогда, если сброс происходит по Watchdog, загрузчик не работает, а сразу выходит на загруженную во flash программу.
2. Настройка USART, pin13 на вывод
3. Моргаем светодиодом с задержкой между каждым переключением 100 мс
А дальше уже цикл для загрузчика.
Т.е. в куске п.п.1-3 может сработать только п.1, но при нажатии на Reset это мало подходит.
Что еще..
Скорость обмена, по умолчанию (если не установить -DBAUD_RATE=... в Makefile) равна 19200.
Если при загрузке ему передать "1 " (символ '1' и пробел) он вернет "\x14AVR ISP\x10".
Если происходит 5 ошибок, запускается программа из flash. Ошибки - это ошибки протокола, т.е. на вход попадает "мусор" или не то, что ждет загрузчик.
Можно взять мой HEX файл и прошить, возможно проблемы с компиляцией или не все исходники исправлены.
И еще, пришлите мне (на ЕЕ в личку) свой HEX, я его себе прошью, сегодня или завтра вечерком.
Уфф, пойду бетон потаскаю, всё полегче, чем тут :)
Посмотрел повнимательнее на фьюзы, при значении старшего байта 0xDD бит BOOTRST отключен, т.е. после сброса контроллер начинает выполнять загруженную программу. После работы попробую 0xDC прошить, т.е. включить BOOTRST.
Рассказываю с начала.
Вставил чистую мегу16 в плату расширения, подключил свой годами проверенный USBAsp, прошил Ваш готовый .hex из архива под IDE 1.0.5, прошил фьюзы, проверил что без кварца мега перестала видеться (ожидаемо), поставил кварц 16 МГц, проверил что мега снова стала видеться. Дальше поставил модуль на PBII, накинул джампера на линии Rx, Tx и стал пытаться прошивать нажимая кнопку сброса на модуле. Один раз прошить получилось.
После многократных неудачных попыток прошить новый скетч перекомпилил загрузчик из исходников в Вашем архиве. В исходниках ничего не менял. Просто запускал .cmd. Кстати размер получившегося .hex-а немного отличался от Вашего.
Далее прошил свою мегу16 скомпиленным загрузчиком. Скетч прошить удалось опять только один раз. После этого полез смотреть исходники. Вечером буду пробовать вносить в них изменения. Но прежде попробую фьюз перешить, о чем в предыдущем сообщении написал.
Очень похоже на правду, видимо придется включить и проверить какие у меня фьюзы установлены. Тогда есть смысл и другие проверить. Однако если у меня фьюзы DDFF, тогда я совсем ничего не понимаю. Впрочем, надо признаться, во фьюзах я действительно мог накосячить. :)
Это какие-то неправильные фьюзы - загрузочная секция выключена.
Вот я и думаю, как это всё у меня работало. Вечером гляну.
Перешил фьюз BOOTRST. Теперь при нажатии сброса и при попытке загрузить скетч светодиод на 13 (PB5) порту мигает, помимо светодиода Tx мигает еще и Rx. Arduino IDE говорит:
avrdude: stk500_paged_write(): (a) protocol error, expect=0x14, resp=0x64
avrdude: stk500_cmd(): programmer is out of sync
Буду копать дальше
Ура! Я победил свою мегу!
Выставил фьюзы 0xFF (LOW), 0xC8 (HIGH), прошил Ваш бутлоадер и все заработало.
Дело было в том что размер бута стоял 256 слов, а надо 1024 и BOOTRST надо установить. Еще по аналогии с ардуиновскими контроллерами выставил CKOPT. Вероятно что и без него будет работать, я не пробовал.
kisoft-у огромное спасибо за проделанную работу и за оперативную помощь!
Ура! Я победил свою мегу!
Выставил фьюзы 0xFF (LOW), 0xC8 (HIGH), прошил Ваш бутлоадер и все заработало.
Дело было в том что размер бута стоял 256 слов, а надо 1024 и BOOTRST надо установить. Еще по аналогии с ардуиновскими контроллерами выставил CKOPT. Вероятно что и без него будет работать, я не пробовал.
kisoft-у огромное спасибо за проделанную работу и за оперативную помощь!
оно то, конечно, здорово, но ведь у kisoft так и прописано, правда без скопт.
При D0 получается EESAVE установлен, ну и CKOPT выключен. Хотя работать по идее должно. В boards.txt а не обратил внимание на фьюзы, каюсь. А вот в makefile тоже DDFF прописаны.
Главное что теперь разобрались.
При D0 получается EESAVE установлен,
EESAVE бывает полезно ставить - если в еепром чего полезного и разного пишешь, а скетч нужно просто отлаживать, то неудобно еепром заново записывать.
на скорость работы не влияет(с).
Прошу извинить, не получилось сразу, только сегодня запустил.
Фьюзы у меня уже давно были другие, но я прошил 0xD0 & 0xFF, прошил загрузчик, подключил 5 проводов на PB2.2, прошил фьюзы и загрузчик через avrdude, а именно:
1
avrdude.exe -p m16 -c pinb22 -P ft0 -B 19200 -U hfuse:w:208:m -U lfuse:w:255:m -U
lock
:w:63:m
2
avrdude.exe -p m16 -c pinb22 -P ft0 -U flash:w:ATmegaBOOT_16_atmega16_16MHz.hex:a
Где pinb22 у меня в avrdude.conf прописан как:
1
programmer
2
id =
"pinb22"
;
3
desc =
"FT232R Synchronous BitBang"
;
4
type = ft245r;
5
miso = 5; # DCD
6
sck = 6; # DSR
7
mosi = 4; # CTS
8
reset = 7; # RI
Фьюзы 208 = 0xD0, 255 = 0xFF.
Всё пашет. При загрузке DTR дергается и всё прошивается без нажатий на reset.
PS До кучи, сегодня руки дошли, прикрутил к Atmel Studio wiring, теперь, компилирую wiring в Atmel Studio и прошиваю, запуская External tool (не имея пока что программатора), который через дудку и загрузчик пишет в Arduino16. Щас в частности тестовый Fade ненавязчиво переливается светиками на Pinboard2.2. Будет программатор, совсем всё будет как надо, не поднадобится жать кнопки. Так что спасибо, что подняли тему, руки дошли до нормальной среды, а то ArduinoIDE уже достал своей простотой :)
Фьюзы 208 = 0xD0, 255 = 0xFF.
Всё пашет. При загрузке DTR дергается и всё прошивается без нажатий на reset.
Странно это. Бут получается отключен. Второй раз пробовали прошивать скетч?
PS До кучи, сегодня руки дошли, прикрутил к Atmel Studio wiring, теперь, компилирую wiring в Atmel Studio и прошиваю, запуская External tool (не имея пока что программатора), который через дудку и загрузчик пишет в Arduino16. Щас в частности тестовый Fade ненавязчиво переливается светиками на Pinboard2.2. Будет программатор, совсем всё будет как надо, не поднадобится жать кнопки. Так что спасибо, что подняли тему, руки дошли до нормальной среды, а то ArduinoIDE уже достал своей простотой :)
Можно поподробнее про прикручивание к Atmel Studio? В итоге получается что можно писать на обычном С и прошивать через Ардуиновский загрузчик?
Скетч прошивал неоднократно, правда всё это делал avrdude из Atmel Studio, но всё работает нормально. ATmega16A с переделанным загрузчиком, ок, сейчас пробую из ArduinoIDE зашить скетч... Только что прошил Blink на пин8 моргает нормально. Теперь прошил Fade3, работает нормально.
Фьюзы смотрел здесь (http://fusecalc.mirmk.net/), расшифровка следующая:
HFUSE = 0xD0, LFUSE = 0xFF
1
Внешний кристалл высокой частоты, задержка 16 тактов + 64 мс
2
BODEN отключен
3
После сброса начинать работу с сектора загрузки (BOOTRST)
4
Не стирать EEPROM при выполнении команды
"Стереть Кристалл"
(EESAVE)
5
Разрешить последовательное программирование (SPIEN)
6
7
Или по другому:
8
SPIEN, EESAVE,
9
BOOTSZ1, BOOTSZ0, BOOTRST
Что тут не так?
На мой взгляд, главное - размер загрузчика (максимальный, 1024 байта, иначе не влезет) и запуск начинать с загрузчика, остальное - можно установить по другому, в частности кварц может быть другим.
На счет Atmel Studio, кажется на форуме уже была информация, плюс не хотелось бы здесь об этом писать. Попробую найти.
UPD: нашел про Atmel Studio и написал там:
http://arduino.ru/forum/programmirovanie/nastraival-li-kto-nibud-atmel-studio-dlya-raboty-so-sketchami-arduino?page=1#comment-40052
HFUSE = 0xD0, LFUSE = 0xFF правильно. Это я уже торможу. Изначально то речь шла о HFUSE = 0xDD, LFUSE = 0xFF, в этом случае неправильно.
За ссылочку спасибо! Пошел читать...
kisoft, есть такая штука - V-USB.
USBaspLoader на ATmega16 давно уже прикрутил, а вот пользовать библиотеку при написании скетчей не получается по причине аппаратных отличий М16 от... (чего? видимо, более современных МК)
Не суть важно.
В общем - в скетчах примеров используется TIMSK0, подозреваю, что и в исходниках аналогично.
Глянь, пожалуйста, на досуге на https://vusb-for-arduino.googlecode.com/files/vusb-for-arduino-005.zip - возможно ли адаптировать это для ATmega16?
Vusb, наверное неплохо, но хочется именно USB, хотя к этой теме не имеет отношение. Есть мысль прикрутить lufa к Леонардо, правда сходу не получилось.
За ссылку спасибо, посмотрю, кто знает..
anwi, к сожалению первый пост я исправить уже не могу, может админа попрошу, что бы вопросов больше не возникало.
Клапауций, TIMSK0 в m16 нет, но есть TIMSK, это Вы и без меня знаете, я бы просто посмотрел, какие биты используются в примерах и наличие их в TIMSK в ДШ на m16. Или там что то более сложное? Если всё нормально, то тупо заменить TIMSK0 на TIMSK. В m16 есть тонкости, но их можно посмотреть в моих исходниках загрузчика, кое что пришлось подстраивать.
Я правильно понял, что если прошить USBaspLoader в качестве загрузчика, m16 можно будет шить через дудку с -c usbasp?
Сам USBaspLoader слил с git, компилируется нормально, для m16 только фьюзы бы надо проверить и адрес, а то как то стремно камень "посадить". Размер загрузчика, правда, там "странный", впрочем я еще только мельком посмотрел.
Щас фьюзы проверю и адрес, да залью в m16 этот загрузчик, хотя не знаю, будет ли быстрее использовать его, нежели обычный загрузчик от ардуино.
UPD: Ну как всегда, всё упирается в установку libusb драйвера на Windows7 x64, кто уже поставил libusb драйвер, поделитесь секретом, уже забодало. Видимо не судьба, одно решение видел, когда винда грузится в режиме с отключенной подписью драйверов, это тоскливо и не хочу такой вариант, уже видел и пробовал.
Клапауций, TIMSK0 в m16 нет, но есть TIMSK, это Вы и без меня знаете, я бы просто посмотрел, какие биты используются в примерах и наличие их в TIMSK в ДШ на m16. Или там что то более сложное? Если всё нормально, то тупо заменить TIMSK0 на TIMSK. В m16 есть тонкости, но их можно посмотреть в моих исходниках загрузчика, кое что пришлось подстраивать.
потому и спросил, что не уверен, что самостоятельно сделаю всё правильно... ну, ладно.
да, или через ArduinoIDE -> дудку:
#################################################
atmega16.name=USBaspLoader - arduino-1.0.5 - atmega16 - 12MHz
atmega16.upload.protocol=usbasp
atmega16.upload.maximum_size=14336
atmega16.upload.speed=128000
atmega16.upload.disable_flushing=
true
atmega16.build.mcu=atmega16
atmega16.build.f_cpu=12000000L
atmega16.build.core=core_105_atmega16
atmega16.build.variant=pins_atmega16
Брал отсюда http://www.obdev.at/downloads/vusb/USBaspLoader.2012-12-08.zip
как-то так - не знаю, быстро это или нет.
Uploading ./build/ENCODER_MENU.hex...
"avrdude"
"-CD:/Program Files mini/arduino-1.0.5/hardware/tools/avr/etc/avrdude.conf"
-v -v -v -v -patmega16 -cusbasp -Pserial_port -b128000 -D
"-Uflash:w:./build/ENCODER_MENU.hex:i"
avrdude.exe: Version 5.11, compiled on Sep 2 2011 at 19:38:36
Copyright (c) 2000-2005 Brian Dean, <a href=
"http://www.bdmicro.com/"
title=
"http://www.bdmicro.com/"
rel=
"nofollow"
>http://www.bdmicro.com/</a>
Copyright (c) 2007-2009 Joerg Wunsch
System wide configuration file
is
"D:/Program Files mini/arduino-1.0.5/hardware/tools/avr/etc/avrdude.conf"
Using Port : serial_port
Using Programmer : usbasp
Overriding Baud Rate : 128000
avrdude.exe: seen device from vendor ->www.fischl.de<-
avrdude.exe: seen product ->USBasp<-
AVR Part : ATMEGA16
Chip Erase delay : 9000 us
PAGEL : PD7
BS2 : PA0
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 200
StabDelay : 100
CmdexeDelay : 25
SyncLoops : 32
ByteDelay : 0
PollIndex : 3
PollValue : 0x53
Memory Detail :
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
eeprom 4 10 128 0 no 512 4 0 9000 9000 0xff 0xff
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
flash 33 6 128 0 yes 16384 128 128 4500 4500 0xff 0xff
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
lock
0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
lfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
hfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
calibration 0 0 0 0 no 4 0 0 0 0 0x00 0x00
Programmer Type : usbasp
Description : USBasp, <a href=
"http://www.fischl.de/usbasp/"
title=
"http://www.fischl.de/usbasp/"
rel=
"nofollow"
>http://www.fischl.de/usbasp/</a>
avrdude.exe: auto
set
sck period (because given equals
null
)
avrdude.exe: warning: cannot
set
sck period. please check
for
usbasp firmware update.
avrdude.exe: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.01s
avrdude.exe: Device signature = 0x1e9403
avrdude.exe: reading input file
"./build/ENCODER_MENU.hex"
avrdude.exe: writing flash (7308 bytes):
Writing | ################################################## | 100% 1.67s
avrdude.exe: 7308 bytes of flash written
avrdude.exe: verifying flash memory against ./build/ENCODER_MENU.hex:
avrdude.exe: load data flash data from input file ./build/ENCODER_MENU.hex:
avrdude.exe: input file ./build/ENCODER_MENU.hex contains 7308 bytes
avrdude.exe: reading on-chip flash data:
Reading | ################################################## | 100% 1.21s
avrdude.exe: verifying ...
avrdude.exe: 7308 bytes of flash verified
avrdude.exe done. Thank you.
[Arduino - Make process has finished
in
5 s.]
если что не срастётся - могу свой загрузчик дать. свисни сюда.
Загрузчик я скомпилял (заменил в Makefile.inc atmega8 на atmega16) тулчейном от ардуино иде 1.0.5, залил с фьюзами в свою атмега16а, но потом выяснилось, что нужен еще драйвер (libusb), а его поставить не получается, не выходит каменный цветок.
01
avrdude.exe -v -v -v -v -v -p m16 -c usbasp -P serail_port -b 115200 -D
02
03
avrdude.exe: Version 5.11, compiled on Sep 2 2011 at 19:38:36
04
Copyright (c) 2000-2005 Brian Dean, <a href=
"http://www.bdmicro.com/"
rel=
"nofollow"
>http://www.bdmicro.com/</a>
05
Copyright (c) 2007-2009 Joerg Wunsch
06
07
System wide configuration file
is
"D:\Devel\Leonardo\╧Ёю°штър чруЁєчўшър\avrdude\avrdude.conf"
08
09
Using Port : serail_port
10
Using Programmer : usbasp
11
Overriding Baud Rate : 115200
12
avrdude.exe: error: could not find USB device
"USBasp"
with vid=0x16c0 pid=0x5dc
13
14
avrdude.exe done. Thank you.
Короче я в ж..е опять :)
Среди устройств нет с такими vid/pid, оно и понятно, драйвер нужен.
UPD: по поводу TIMSK0 можно тупо попробовать заменить его на TIMSK в примере и попробовать, хуже не будет.
вот здесь http://dereenigne.org/arduino/usbasp-windows-7-x64 говорит, что
Вещи с тех пор изменилось, и последнюю сборку LibUSB-win32 работает безупречно на Windows 7 x64
*там два варианта инициализации устройства - установка дров или инсталляция LibUSB в систему, второй я не пробовал.
Сделал ёжика на пинборде, зашил USBaspLoader и фьюзы в ATmega16A, подключил к компу, но увы, неопознанное USB устройство.
PD7 = D- и подтяжку 1К на +5В
PD5 = PD2 = D+
PD6 = подтяжку на +5 и возможность замкнуть на землю. Если без подтяжки, то плохо, странно в проге там подтяжка внутренняя включается.
Ладно, пока не катит, надо тестером помаять схему, может где не так что то.
При сбросе замыкаю на землю PD6, пофигу.
atmega16
avrdude -p atmega16 -c USBasp -e
avrdude -p atmega16 -c USBasp -U hfuse:w:0xc0:m -U lfuse:w:0x9f:m
avrdude -p atmega16 -c USBasp -U flash:w:main.hex
avrdude -p atmega16 -c USBasp -U
lock
:w:0x0F:m
На PB USB такая обвязка уже есть, кроме 2,2 к на D-, я только не стирал камень -e, а также lock не делал. Странно, что нет перемычки, потому что в исходниках явно написано, что д+ нужно соединить с int0. Попробую. Спасибо за инструкцию, значит я всё правильно понял.
Ну и шью я пинбоардой через ftdi, но это не важно.
типо аппаратная подтяжка что бы USB-хост сообразил, что к нему нечто подключено.
на всякий случай
ты видишь суслика?(с) :D
USB D+ на PD2, где PD2 и есть INT0... просто для экономии ног.
Всё это, конечно, хорошо, только два пина не просто так делали, потому - "для экономии ног" - для меня не довод. "Так работает" - но у меня нет, всё равно неопознанное устройство. Выкачал прошивку, скоммутировал по приложенной схеме, результат тот же, Unknown device.
Кстати, у тебя кварц на 16МГц?
ПС Я понимаю для чего делают подтяжку на D- и D+ и в данной схеме всё прозрачно и понятно, более того, понятно с софтом, там тоже всё прозрачно. Придется брать тестер и проверять цепи.
Еще. Драйвер я вчера поставил, но дело не в нем, до него дело еще не дошло.
BUTTON я зажал на землю, там и оставляю, при включении должно на USBaspLoader выходить, но, видимо не выходит, потому что после размыкания BUTTON, на PD3 единицой и не пахнет. И это жжжж не с проста! :)
Хотя при нажатии на сброс устройство пропадает, потом появляется снова, значит что то живет и шевелится, в смысле от камня зависит. Хотя создается впечатление, что софт в камне не прижился.
UPD: кабель менял, не помогает.
Всё это, конечно, хорошо, только два пина не просто так делали, потому - "для экономии ног" - для меня не довод. "Так работает" - но у меня нет, всё равно неопознанное устройство. Выкачал прошивку, скоммутировал по приложенной схеме, результат тот же, Unknown device.
Это не я так придумал - до меня это повторено, я просто выбрал такой вариант и он меня устроил.
https://metalab.at/wiki/Metaboard
Кстати, у тебя кварц на 16МГц?
Нет - кварц у меня на 12МГц, но загрузчик я тебе скомпилил аналогично своему(на 12) только изменив требуемую легальную частоту кварца в файлах конфигурации.
F_CPU = 16000000
BUTTON я зажал на землю, там и оставляю, при включении должно на USBaspLoader выходить, но, видимо не выходит, потому что после размыкания BUTTON, на PD3 единицой и не пахнет. И это жжжж не с проста! :)
Хотя при нажатии на сброс устройство пропадает, потом появляется снова, значит что то живет и шевелится, в смысле от камня зависит. Хотя создается впечатление, что софт в камне не прижился.
Вроде понял в чём суть проблемы:
при включении загрузчик не активируется - будет неопознанное.
включаем - неопознанное
держим BUTTON и жмём и отпускаем RESET - появляется USBasp и просит дрова, ставим дрова.
не отпустил BUTTON - можно шить скетч
прошил скетч - не зависимо, держишь BUTTON или нет, начинает работать скетч
при включении - неопознанное и работающий скетч
всё вроде.
*что бы явно видеть, что происходит на USB-порту - в диспетчере устройств смотришь, что там появляется, потому как виндовс любит помечать устройство как неопознанное и больше не просить на него драйвера, нужно удалить и переткнуть кабель.
На загрузчик выходит, вставил отладку, светик горит, если вышло из загрузчика. Соответственно, если при сбросе не нажимать BUTTON, то сразу зажигается, а если оставить на земле, то не зажигается, отпускаешь BUTTON - сразу зажигается, значит проблема не задесь.
Жаль с отладкой (DEBUG_LEVEL=1 или 2) не влазит в загрузчик :( Не вопрос, щас отладкой определю, где не так)
Я постепенно начинаю понимать, что у тебя произошло - железно всё работает, но
в системе должно быть два неопознанных устройства - если драйвера не установлены
эти устройства отличаются малым - запущенным и незапущенным загрузчиком
проблема их отличить - просто удали устройство из диспетчера устройств после запуска загрузчика кнопкой, нажми кнопу "обновить конфигурацию оборудования" и установи драйвера для USBasp
потому как железно оно работает, если на кнопки реакция диспетчера устройств наличествует
Вчера урезав функционал, включил отладку и увидел, что на запрос GET_DESCRIPTION, возвращается короткая строка, т.е. обрезанный дескриптор. Вот такая петрушка. Ну что ж, посмотрим кто кого :)
Может, попробуй Windows XP Mode в этой дурной x64-й?
Я всего-то взял USBaspLoader.2012-12-08 :
сделал:
==================================
файл bootloaderconfig.h
изменил:
#define USB_CFG_DMINUS_BIT 6
#define JUMPER_BIT 3
==================================
файл main.c
добавил:
#elif defined (__AVR_ATmega16__)
0x1e, 0x94, 0x03, 0
==================================
файл Makefile
изменил:
F_CPU = 12000000
DEVICE = atmega16
FUSEOPT = $(FUSEOPT_16)
LOCKOPT = -U
lock
:w:0x0F:m
PROGRAMMER = -c usbasp
добавил:
FUSEOPT_16 = -U hfuse:w:0xc0:m -U lfuse:w:0x9f:m
==================================
Инсталлировал в систему WinAVR-20100110 и сделал CMD -> make
получил файлег main.hex для 12 мегагерцового кварца
тебе сделал аналогично, но F_CPU = 16000000
Почему оно у тебя не работает - не понятно, нужно тупо шить программатором фьюзы, затем загрузчик.
Может быть легко из-за частоты кварца, потому что разный ассемблерный код.
Ничего, мне интересно покопаться в USB.