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

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

Для простоты, я назвал этот проект Arduino16. Как я уже говорил, Arduino на ATmega16 не существует (во всяком случае мне это неизвестно).

В первой статье я раскрыл тему формирования bootloader для ATmega16.

Сегодня я хочу затронуть тему корректировки исходных текстов ядра - базовых библиотек ArduinoIDE 1.0.4, чтобы можно было писать и загружать скетчи в мою ATmega16 из среды ArduinoIDE 1.0.4.

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

Вцелом изменения коснулись в основном таймеров. Они в ATmega16 и ATmega8 похожи, однако есть некоторые отличия.

wiring.c. Изменения в инициализации timer/counter0. Здесь отличия в названиях регистров, поэтому фактически тоже самое, что и инициализация таймера0 для ATmega168 & ATmega8:

void init()
{
  ...
#if defined(__AVR_ATmega16__)
	sbi(TCCR0, WGM01);
	sbi(TCCR0, WGM00);
#endif
  ...

wiring_analog.c. Изменения в формировании PWM для таймера0

			#if  defined(__AVR_ATmega16__)
			case TIMER0A:
				// connect pwm to pin on timer 0
				sbi(TCCR0, COM01);
				OCR0 = val; // set pwm duty
				break;
			#else

wiring_digital.c. С этим пришлось немного повозиться, потому что здесь была "проблема" при выключении PWM для таймера0. Без этого изменения PWM работал, но таймер не выключался.

		#if defined(__AVR_ATmega16__)
		case  TIMER0A:  cbi(TCCR0,  COM01);     break;
		#endif

Tone.cpp. Здесь было достаточно просто, но потребовало некоторых разборок, а именно:
- некорректно устанавливалась частота предделителя таймера
Остальные изменения были сведены к приведению кода по аналогии с ATmega8, т.е. вставки, типа

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

И главное изменение - установка частоты предделителя для таймера 2:

	#ifdef __AVR_ATmega16__
        TCCR2B = ( TCCR2B & 0b11111000 ) | prescalarbits;
	#else
        TCCR2B = prescalarbits;
	#endif

На этом изменения кончились.

Не нужно думать, что теперь всё заработает как надо. Безусловно, основные библиотеки и примеры теперь работают нормально (буду благодарен багрепортам, возможно еще что то не нашел). Однако при использовании других библиотек, вполне возможны проблемы, в чкастности такие проблемы были обнаружены triada13 в библиотеке IRremote.

Фикс еще не доделан, но примеры компилируются, буду благодарен, если кто то протестирует и сообщит о проблемах. Итак, фикс выполняется в файле IRremoteInt.h, diff файл прилагается:

63a64,67
> // Atmega16
> #elif defined(__AVR_ATmega16__)
>   #define IR_USE_TIMER1   // tx = pin 9???
> 
267c271
< #if defined(__AVR_ATmega8P__) || defined(__AVR_ATmega8__)
---
> #if defined(__AVR_ATmega8P__) || defined(__AVR_ATmega8__) || defined(__AVR_ATmega16__)

Вся библиотека здесь

Моя благодарность triada13 за помощь в тестировании и конечно же форуму!

 

Rimidalw
Offline
Зарегистрирован: 04.04.2012

Привет! Помоги адаптировать библиотеку softPWM. Собственно нужно получить много PWM каналов. Проблемма как раз состоит в таймерах.

Оригинальный файл SoftPWM_timer.h

/* $Id: SoftPWM_timer.h 116 2010-06-28 23:31:02Z bhagman@roguerobotics.com $

  A Software PWM Library

  Simple timer abstractions by Paul Stoffregen (paul at pjrc dot com)

    This library is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

*************************************************/

#include <avr/io.h>
#include <avr/interrupt.h>

// allow certain chips to use different timers
#if defined(__AVR_ATmega32U4__)
#define USE_TIMER4_HS // Teensy 2.0 lacks timer2, but has high speed timer4 :-)
#else
#define USE_TIMER2
#endif

// for each timer, these macros define how to actually use it
#if defined(USE_TIMER2)
#define SOFTPWM_TIMER_INTERRUPT    TIMER2_COMPA_vect
#define SOFTPWM_TIMER_SET(val)     (TCNT2 = (val))
#define SOFTPWM_TIMER_INIT(ocr) ({\
  TIFR2 = (1 << TOV2);    /* clear interrupt flag */ \
  TCCR2B = (1 << CS21);   /* start timer (ck/8 prescalar) */ \
  TCCR2A = (1 << WGM21);  /* CTC mode */ \
  OCR2A = (ocr);          /* We want to have at least 30Hz or else it gets choppy */ \
  TIMSK2 = (1 << OCIE2A); /* enable timer2 output compare match interrupt */ \
})
#elif defined(USE_TIMER4_HS)
#define SOFTPWM_TIMER_INTERRUPT    TIMER4_COMPA_vect
#define SOFTPWM_TIMER_SET(val)     (TCNT4 = (val))
#define SOFTPWM_TIMER_INIT(ocr) ({\
  TCCR4A = 0; \
  TCCR4B = 0x04; /* CTC Mode */\
  TCCR4C = 0; \
  TCCR4D  = 0; \
  TCCR4E  = 0; \
  OCR4C  = 0; \
  OCR4C  = (ocr); \
  TIMSK4  = (1 << OCIE4A); \
})
#endif

Я изминил на:

/* $Id: SoftPWM_timer.h 116 2010-06-28 23:31:02Z bhagman@roguerobotics.com $

  A Software PWM Library

  Simple timer abstractions by Paul Stoffregen (paul at pjrc dot com)

    This library is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

*************************************************/

#include <avr/io.h>
#include <avr/interrupt.h>

// allow certain chips to use different timers
//#if defined(__AVR_ATmega32U4__)
#if defined(__AVR_ATmega16__)
#	define USE_TIMER2_16 // Teensy 2.0 lacks timer2, but has high speed timer4 :-)
#else
#	define USE_TIMER2
#endif

// for each timer, these macros define how to actually use it
#if defined(USE_TIMER2)
#define SOFTPWM_TIMER_INTERRUPT    TIMER2_COMPA_vect
#define SOFTPWM_TIMER_SET(val)     (TCNT2 = (val))
#define SOFTPWM_TIMER_INIT(ocr) ({\
  TIFR2 = (1 << TOV2);    /* clear interrupt flag */ \
  TCCR2B = (1 << CS21);   /* start timer (ck/8 prescalar) */ \
  TCCR2A = (1 << WGM21);  /* CTC mode */ \
  OCR2A = (ocr);          /* We want to have at least 30Hz or else it gets choppy */ \
  TIMSK2 = (1 << OCIE2A); /* enable timer2 output compare match interrupt */ \
})

#elif defined(USE_TIMER2_16)
#define SOFTPWM_TIMER_INTERRUPT    TIMER1_COMPA_vect
#define SOFTPWM_TIMER_SET(val)     (TCNT1 = (val))
#define SOFTPWM_TIMER_INIT(ocr) ({\
  TIFR = (1 << TOV0);    /* clear interrupt flag */ \
  TCCR1B = (1 << CS10);   /* start timer (ck/8 prescalar) */ \
  TCCR1A = (1 << WGM10);  /* CTC mode */ \
  OCR1A = (ocr);          /* We want to have at least 30Hz or else it gets choppy */ \
  TIMSK |= (1 << OCIE1A); /* enable timer2 output compare match interrupt */ \
})
#endif

 

Вроде бы работает, только как то косячно). Что я не так сделал?

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

Неплохо было понять, что именно "косячно". Я не вижу, что видят твои глаза ;)

Чтобы понять, что некорректно работает можно поступить следующим образом:

В тексте программы есть код для программирования таймера на другом камне ATmega32U4. Берешь на него даташит и смотришь, как программируется его таймер, потом по даташиту на атмега16 смотришь, как нужно его программировать. И всё. Я всегда так делаю.

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

UPD: Еще, кстати, мне очень не нравится, что, например, TCCR1A устанавливается бит WGM10, а остальные сбрасываются. Рекомендую посмотреть, как программируется по умолчанию таймер 1 в файле wiring.c, функция init(). Хотя, может это и пофигу в данном случае.

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

В общем всё получилось, только я опять вернулся к проблеме со "временем" как и на восьмой меге. Как тут сделать чтоб delay(1000) была равна 1 секунде, а не 16 как сейчас?

P.S. (Atmega16A)

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

hugoboss317 пишет:

В общем всё получилось, только я опять вернулся к проблеме со "временем" как и на восьмой меге. Как тут сделать чтоб delay(1000) была равна 1 секунде, а не 16 как сейчас?

P.S. (Atmega16A)

Прошить фьюзы для внешнего кварца или в boards.txt указать, что у вас частота 1 мегагерц, а не 16.

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

"Клапауций" пишет:
Прошить фьюзы для внешнего кварца

Не разу не делал. Подскажете как? Если можно поподробней т.к. нужно 16 мГц.

И ещё, я правельно понимаю, у Atmega8 только 3 ШИМ-а, (PB0 - PB2), а у Atmega16 всего 4 (PB3, PD4, PD5, PD7)?

Rimidalw
Offline
Зарегистрирован: 04.04.2012

hugoboss317 пишет:

"Клапауций" пишет:
Прошить фьюзы для внешнего кварца

Не разу не делал. Подскажете как? Если можно поподробней т.к. нужно 16 мГц.

И ещё, я правельно понимаю, у Atmega8 только 3 ШИМ-а, (PB0 - PB2), а у Atmega16 всего 4 (PB3, PD4, PD5, PD7)?

Я по этому мануалу научился. Изучайте.

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

Пока что указал 1 Мгц, Я не буду захламлять эту ветку флудом. Проблема с Atmega16. Нужна помощь, загляните если не трудно. http://arduino.ru/forum/programmirovanie/lcd-128x64-i-mega2560-zazhgem#c...

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

Всвязи с выходом 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.

Удачи!

 

anwi
Offline
Зарегистрирован: 01.09.2013

Добрый день.

Прошил 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 тоже шьются без проблем.

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

Перечитал всё, но не нашел, где это написал, оказывается только на easyelectronics было, цитирую:

"чтобы сброс шел автоматом при прошивке надо соединить BDBUS4 ftdi с ножкой reset атмеги, BDBUS4 это и есть DTR. Всё пашет, кнопку жать не нужно. PBII.2"

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

У меня Win7 x64, PB2 rev.2

А вообще и руками жать ресет можно, тоже должно работать, только приноровиться надо.

anwi
Offline
Зарегистрирован: 01.09.2013

Не получается к сожалению. Видно что BDBUS4 пытается сброс дернуть, но через несколько секунд выдается та же ошибка. Точнее даже сброс дергается, светодиод TX мигает, потом "тишина" и ошибка выдается.

WinXP x32, PB2 rev.1

Еще вопросик, бутлоадер компилировался под ATMega16 или ATMega16A? У меня ATMega16 из старых запасов.

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

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

У меня атмега от ДиХальта, по моему 16а.
Я еще раз попробую, но не быстро, времени почти нет, надо до отпуска на работе заявку доделать.
Просто 16 атмеги нет, потому проверить не смогу

anwi
Offline
Зарегистрирован: 01.09.2013

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

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

Makefile, у меня это строка 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)

 

anwi
Offline
Зарегистрирован: 01.09.2013

Спасибо, вечером попробую.

Фьюзы такие же установлены 0xDD, 0xFF. Делал все по Вашей предыдущей статье. Поначалу грешил на то что линии Tx, Rx неправильно соединил, но скетч первый раз заливается. Вобще странно, ведь для родных ардуиновских контроллеров стоит такая же задержка, а у некоторых даже меньше. Еще попробую выяснить, точно ли на моей ревизии PinBoard II сигнал DTR выведен.

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

Я dtr искал методом тыка, хотя можно по схеме попробовать посмотреть, посмотрите схему PB своей ревизии. Странно, вроде 16 и 16а мало чем отличаются

anwi
Offline
Зарегистрирован: 01.09.2013

Схему смотрел. Все порты FT2232 выведены на колодки. Подписаны Rx, Tx обоих каналов и светодиоды для них.

Я заметил такую особенность, моя мега16 при нажатии кнопки сброса сразу начинает выполнять загруженный скетч. А вот при включении питания моргает светодиодом на 13 порту (PB5) сигнализируя, как я понимаю, о работе загрузчика.

Мегу16А мне найти не удалось пока.

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

В 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, я его себе прошью, сегодня или завтра вечерком.

Уфф, пойду бетон потаскаю, всё полегче, чем тут :)

 

anwi
Offline
Зарегистрирован: 01.09.2013

Посмотрел повнимательнее на фьюзы, при значении старшего байта 0xDD бит BOOTRST отключен, т.е. после сброса контроллер начинает выполнять загруженную программу. После работы попробую 0xDC прошить, т.е. включить BOOTRST.

anwi
Offline
Зарегистрирован: 01.09.2013

Рассказываю с начала.

Вставил чистую мегу16 в плату расширения, подключил свой годами проверенный USBAsp, прошил Ваш готовый .hex из архива под IDE 1.0.5, прошил фьюзы, проверил что без кварца мега перестала видеться (ожидаемо), поставил кварц 16 МГц, проверил что мега снова стала видеться. Дальше поставил модуль на PBII, накинул джампера на линии Rx, Tx и стал пытаться прошивать нажимая кнопку сброса на модуле. Один раз прошить получилось.

После многократных неудачных попыток прошить новый скетч перекомпилил загрузчик из исходников в Вашем архиве. В исходниках ничего не менял. Просто запускал .cmd. Кстати размер получившегося .hex-а немного отличался от Вашего.

Далее прошил свою мегу16 скомпиленным загрузчиком. Скетч прошить удалось опять только один раз. После этого полез смотреть исходники. Вечером буду пробовать вносить в них изменения. Но прежде попробую фьюз перешить, о чем в предыдущем сообщении написал.

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

Очень похоже на правду, видимо придется включить и проверить какие у меня фьюзы установлены. Тогда есть смысл и другие проверить. Однако если у меня фьюзы DDFF, тогда я совсем ничего не понимаю. Впрочем, надо признаться, во фьюзах я действительно мог накосячить. :)

 

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

kisoft пишет:
Однако если у меня фьюзы DDFF, тогда я совсем ничего не понимаю.

Это какие-то неправильные фьюзы - загрузочная секция выключена.

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

Вот я и думаю, как это всё у меня работало. Вечером гляну.

anwi
Offline
Зарегистрирован: 01.09.2013

Перешил фьюз 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

Буду копать дальше

anwi
Offline
Зарегистрирован: 01.09.2013

Ура! Я победил свою мегу!

Выставил фьюзы 0xFF (LOW), 0xC8 (HIGH), прошил Ваш бутлоадер и все заработало.

Дело было в том что размер бута стоял 256 слов, а надо 1024 и BOOTRST надо установить. Еще по аналогии с ардуиновскими контроллерами выставил CKOPT. Вероятно что и без него будет работать, я не пробовал.

kisoft-у огромное спасибо за проделанную работу и за оперативную помощь!

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

anwi пишет:

Ура! Я победил свою мегу!

Выставил фьюзы 0xFF (LOW), 0xC8 (HIGH), прошил Ваш бутлоадер и все заработало.

Дело было в том что размер бута стоял 256 слов, а надо 1024 и BOOTRST надо установить. Еще по аналогии с ардуиновскими контроллерами выставил CKOPT. Вероятно что и без него будет работать, я не пробовал.

kisoft-у огромное спасибо за проделанную работу и за оперативную помощь!

оно то, конечно, здорово, но ведь у kisoft так и прописано, правда без скопт.

atmega16.bootloader.low_fuses=0xff
atmega16.bootloader.high_fuses=0xd0
 
в файлеге boards.txt
 
То, что он советовал dd, то наверное или забыл, или невнимательно на монитор глянул.

 

anwi
Offline
Зарегистрирован: 01.09.2013

При D0 получается EESAVE установлен, ну и CKOPT выключен. Хотя работать по идее должно. В boards.txt а не обратил внимание на фьюзы, каюсь. А вот в makefile тоже DDFF прописаны.

Главное что теперь разобрались.

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

anwi пишет:

При D0 получается EESAVE установлен,

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

anwi пишет:
 ну и CKOPT выключен.

на скорость работы не влияет(с).

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

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

Фьюзы у меня уже давно были другие, но я прошил 0xD0 & 0xFF, прошил загрузчик, подключил 5 проводов на PB2.2, прошил фьюзы и загрузчик через avrdude, а именно:

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
avrdude.exe -p m16 -c pinb22 -P ft0 -U flash:w:ATmegaBOOT_16_atmega16_16MHz.hex:a

Где pinb22 у меня в avrdude.conf прописан как:

programmer
  id    = "pinb22";
  desc  = "FT232R Synchronous BitBang";
  type  = ft245r;
  miso  = 5;  # DCD
  sck   = 6;  # DSR
  mosi  = 4;  # CTS
  reset = 7;  # RI 

Фьюзы 208 = 0xD0, 255 = 0xFF.

Всё пашет. При загрузке DTR дергается и всё прошивается без нажатий на reset.

PS До кучи, сегодня руки дошли, прикрутил к Atmel Studio wiring, теперь, компилирую wiring в Atmel Studio и прошиваю, запуская External tool (не имея пока что программатора), который через дудку и загрузчик пишет в Arduino16. Щас в частности тестовый Fade ненавязчиво переливается светиками на Pinboard2.2. Будет программатор, совсем всё будет как надо, не поднадобится жать кнопки. Так что спасибо, что подняли тему, руки дошли до нормальной среды, а то ArduinoIDE уже достал своей простотой :)

 

anwi
Offline
Зарегистрирован: 01.09.2013

kisoft пишет:

Фьюзы 208 = 0xD0, 255 = 0xFF.

Всё пашет. При загрузке DTR дергается и всё прошивается без нажатий на reset.

Странно это. Бут получается отключен. Второй раз пробовали прошивать скетч?

kisoft пишет:

PS До кучи, сегодня руки дошли, прикрутил к Atmel Studio wiring, теперь, компилирую wiring в Atmel Studio и прошиваю, запуская External tool (не имея пока что программатора), который через дудку и загрузчик пишет в Arduino16. Щас в частности тестовый Fade ненавязчиво переливается светиками на Pinboard2.2. Будет программатор, совсем всё будет как надо, не поднадобится жать кнопки. Так что спасибо, что подняли тему, руки дошли до нормальной среды, а то ArduinoIDE уже достал своей простотой :)

Можно поподробнее про прикручивание к Atmel Studio? В итоге получается что можно писать на обычном С и прошивать через Ардуиновский загрузчик?

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

Скетч прошивал неоднократно, правда всё это делал avrdude из Atmel Studio, но всё работает нормально. ATmega16A с переделанным загрузчиком, ок, сейчас пробую из ArduinoIDE зашить скетч... Только что прошил Blink на пин8 моргает нормально. Теперь прошил Fade3, работает нормально.

Фьюзы смотрел здесь (http://fusecalc.mirmk.net/), расшифровка следующая:

HFUSE = 0xD0, LFUSE = 0xFF

Внешний кристалл высокой частоты, задержка 16 тактов + 64 мс
BODEN отключен
После сброса начинать работу с сектора загрузки (BOOTRST)
Не стирать EEPROM при выполнении команды "Стереть Кристалл" (EESAVE)
Разрешить последовательное программирование  (SPIEN)

Или по другому:
SPIEN, EESAVE,
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

anwi
Offline
Зарегистрирован: 01.09.2013

HFUSE = 0xD0, LFUSE = 0xFF правильно. Это я уже торможу. Изначально то речь шла о HFUSE = 0xDD, LFUSE = 0xFF, в этом случае неправильно.

За ссылочку спасибо! Пошел читать...

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

kisoft, есть такая штука - V-USB.

USBaspLoader на ATmega16 давно уже прикрутил, а вот пользовать библиотеку при написании скетчей не получается по причине аппаратных отличий М16 от... (чего? видимо, более современных МК)

Не суть важно.

В общем - в скетчах примеров используется TIMSK0, подозреваю, что и в исходниках аналогично.

Глянь, пожалуйста, на досуге на https://vusb-for-arduino.googlecode.com/files/vusb-for-arduino-005.zip - возможно ли адаптировать это для ATmega16?

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

Vusb, наверное неплохо, но хочется именно USB, хотя к этой теме не имеет отношение. Есть мысль прикрутить lufa к Леонардо, правда сходу не получилось.
За ссылку спасибо, посмотрю, кто знает..
anwi, к сожалению первый пост я исправить уже не могу, может админа попрошу, что бы вопросов больше не возникало.

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

Клапауций, TIMSK0 в m16 нет, но есть TIMSK, это Вы и без меня знаете, я бы просто посмотрел, какие биты используются в примерах и наличие их в TIMSK в ДШ на m16. Или там что то более сложное? Если всё нормально, то тупо заменить TIMSK0 на TIMSK. В m16 есть тонкости, но их можно посмотреть в моих исходниках загрузчика, кое что пришлось подстраивать.

Я правильно понял, что если прошить USBaspLoader в качестве загрузчика, m16 можно будет шить через дудку с -c usbasp?

Сам USBaspLoader слил с git, компилируется нормально, для m16 только фьюзы бы надо проверить и адрес, а то как то стремно камень "посадить". Размер загрузчика, правда, там "странный", впрочем я еще только мельком посмотрел.

Щас фьюзы проверю и адрес, да залью в m16 этот загрузчик, хотя не знаю, будет ли быстрее использовать его, нежели обычный загрузчик от ардуино.

UPD: Ну как всегда, всё упирается в установку libusb драйвера на Windows7 x64, кто уже поставил libusb драйвер, поделитесь секретом, уже забодало. Видимо не судьба, одно решение видел, когда винда грузится в режиме с отключенной подписью драйверов, это тоскливо и не хочу такой вариант, уже видел и пробовал.

 

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

kisoft пишет:

Клапауций, TIMSK0 в m16 нет, но есть TIMSK, это Вы и без меня знаете, я бы просто посмотрел, какие биты используются в примерах и наличие их в TIMSK в ДШ на m16. Или там что то более сложное? Если всё нормально, то тупо заменить TIMSK0 на TIMSK. В m16 есть тонкости, но их можно посмотреть в моих исходниках загрузчика, кое что пришлось подстраивать.

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

kisoft пишет:
Я правильно понял, что если прошить USBaspLoader в качестве загрузчика, m16 можно будет шить через дудку с -c usbasp?

да, или через 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

kisoft пишет:
Сам USBaspLoader слил с git, компилируется нормально, для m16 только фьюзы бы надо проверить и адрес, а то как то стремно камень "посадить". Размер загрузчика, правда, там "странный", впрочем я еще только мельком посмотрел.

Брал отсюда http://www.obdev.at/downloads/vusb/USBaspLoader.2012-12-08.zip

kisoft пишет:
Щас фьюзы проверю и адрес, да залью в m16 этот загрузчик, хотя не знаю, будет ли быстрее использовать его, нежели обычный загрузчик от ардуино.

как-то так - не знаю, быстро это или нет.

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, http://www.bdmicro.com/
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, http://www.fischl.de/usbasp/
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.]

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

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

Загрузчик я скомпилял (заменил в Makefile.inc atmega8 на atmega16) тулчейном от ардуино иде 1.0.5, залил с фьюзами в свою атмега16а, но потом выяснилось, что нужен еще драйвер (libusb), а его поставить не получается, не выходит каменный цветок.

avrdude.exe -v -v -v -v -v -p m16 -c usbasp -P serail_port -b 115200 -D

avrdude.exe: Version 5.11, compiled on Sep  2 2011 at 19:38:36
             Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
             Copyright (c) 2007-2009 Joerg Wunsch

             System wide configuration file is "D:\Devel\Leonardo\╧Ёю°штър чруЁєчўшър\avrdude\avrdude.conf"

             Using Port                    : serail_port
             Using Programmer              : usbasp
             Overriding Baud Rate          : 115200
avrdude.exe: error: could not find USB device "USBasp" with vid=0x16c0 pid=0x5dc

avrdude.exe done.  Thank you.

Короче я в ж..е опять :)

Среди устройств нет с такими vid/pid, оно и понятно, драйвер нужен.

UPD: по поводу TIMSK0 можно тупо попробовать заменить его на TIMSK в примере и попробовать, хуже не будет.

 

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

вот здесь http://dereenigne.org/arduino/usbasp-windows-7-x64 говорит, что

Вещи с тех пор изменилось, и последнюю сборку LibUSB-win32 работает безупречно на Windows 7 x64

*там два варианта инициализации устройства - установка дров или инсталляция LibUSB в систему, второй я не пробовал.

 

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

Сделал ёжика на пинборде, зашил USBaspLoader и фьюзы в ATmega16A, подключил к компу, но увы, неопознанное USB устройство.

PD7 = D- и подтяжку 1К на +5В

PD5 = PD2 = D+

PD6 = подтяжку на +5 и возможность замкнуть на землю. Если без подтяжки, то плохо, странно в проге там подтяжка внутренняя включается.

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

При сбросе замыкаю на землю PD6, пофигу.

 

 

Клапауций
Offline
Зарегистрирован: 10.02.2013
попробуй этот загрузчик https://www.dropbox.com/s/cx9gi9bd5f9glhr/main.hex
USB D+ = PD2
BUTTON = PD3
USB D- = 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
правильная обвязка USB
 
 
 
работает следующим образом - жмёшь кнопу RESET, удерживая BUTTON, отпускаешь RESET, BUTTON держишь - в системе раздупляется USBasp, после заливки скетча/прошивки автоматом выходит из загрузчика, начинается работа прошитого... нужно переделать, что бы BUTTON защёлкивалась - пока руки не доходят.
 
*ни о каких подтяжках не думаешь.
kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

На PB USB такая обвязка уже есть, кроме 2,2 к на D-, я только не стирал камень -e, а также lock не делал. Странно, что нет перемычки, потому что в исходниках явно написано, что д+ нужно соединить с int0. Попробую. Спасибо за инструкцию, значит я всё правильно понял.
Ну и шью я пинбоардой через ftdi, но это не важно.

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

kisoft пишет:
На PB USB такая обвязка уже есть, кроме 2,2 к на D-

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

kisoft пишет:
я только не стирал камень -e, а также lock не делал.

на всякий случай

kisoft пишет:
Странно, что нет перемычки, потому что в исходниках явно написано, что д+ нужно соединить с int0.

ты видишь суслика?(с) :D

USB D+ на PD2, где PD2 и есть INT0... просто для экономии ног.

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

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

Кстати, у тебя кварц на 16МГц?

ПС Я понимаю для чего делают подтяжку на D- и D+ и в данной схеме всё прозрачно и понятно, более того, понятно с софтом, там тоже всё прозрачно. Придется брать тестер и проверять цепи.

Еще. Драйвер я вчера поставил, но дело не в нем, до него дело еще не дошло.
BUTTON я зажал на землю, там и оставляю, при включении должно на USBaspLoader выходить, но, видимо не выходит, потому что после размыкания BUTTON, на PD3 единицой и не пахнет. И это жжжж не с проста! :)
Хотя при нажатии на сброс устройство пропадает, потом появляется снова, значит что то живет и шевелится, в смысле от камня зависит. Хотя создается впечатление, что софт в камне не прижился.

UPD: кабель менял, не помогает.

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

kisoft пишет:

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

Это не я так придумал - до меня это повторено, я просто выбрал такой вариант и он меня устроил.

https://metalab.at/wiki/Metaboard

kisoft пишет:

Кстати, у тебя кварц на 16МГц?

Нет - кварц у меня на 12МГц, но загрузчик я тебе скомпилил аналогично своему(на 12) только изменив требуемую легальную частоту кварца в файлах конфигурации.

F_CPU = 16000000

затем это значение передаётся в 
 
#define USB_CFG_CLOCK_KHZ       (F_CPU/1000)
 
и затем в
 
#else   /* USB_CFG_CHECK_CRC */
#   if USB_CFG_CLOCK_KHZ == 12000
#       include "usbdrvasm12.inc"
#   elif USB_CFG_CLOCK_KHZ == 12800
#       include "usbdrvasm128.inc"
#   elif USB_CFG_CLOCK_KHZ == 15000
#       include "usbdrvasm15.inc"
#   elif USB_CFG_CLOCK_KHZ == 16000
#       include "usbdrvasm16.inc"
#   elif USB_CFG_CLOCK_KHZ == 16500
#       include "usbdrvasm165.inc"
#   elif USB_CFG_CLOCK_KHZ == 20000
#       include "usbdrvasm20.inc"
#   else
 
но, не проверял в работе - но, должно работать, иначе почему?
 
могу бросить уже проверенный лоадер на 12мегагерц - чисто для железной уверенности.

 

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

kisoft пишет:

BUTTON я зажал на землю, там и оставляю, при включении должно на USBaspLoader выходить, но, видимо не выходит, потому что после размыкания BUTTON, на PD3 единицой и не пахнет. И это жжжж не с проста! :)
Хотя при нажатии на сброс устройство пропадает, потом появляется снова, значит что то живет и шевелится, в смысле от камня зависит. Хотя создается впечатление, что софт в камне не прижился.

Вроде понял в чём суть проблемы:

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

включаем - неопознанное

держим BUTTON и жмём и отпускаем RESET - появляется USBasp и просит дрова, ставим дрова.

не отпустил BUTTON - можно шить скетч

прошил скетч - не зависимо, держишь BUTTON или нет, начинает работать скетч

при включении - неопознанное и работающий скетч

всё вроде.

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

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

На загрузчик выходит, вставил отладку, светик горит, если вышло из загрузчика. Соответственно, если при сбросе не нажимать BUTTON, то сразу зажигается, а если оставить на земле, то не зажигается, отпускаешь BUTTON - сразу зажигается, значит проблема не задесь.
Жаль с отладкой (DEBUG_LEVEL=1 или 2) не влазит в загрузчик :( Не вопрос, щас отладкой определю, где не так)

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

Я постепенно начинаю понимать, что у тебя произошло - железно всё работает, но

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

эти устройства отличаются малым - запущенным и незапущенным загрузчиком

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

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

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

Вчера урезав функционал, включил отладку и увидел, что на запрос GET_DESCRIPTION, возвращается короткая строка, т.е. обрезанный дескриптор. Вот такая петрушка. Ну что ж, посмотрим кто кого :)

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

Может, попробуй 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

 

Почему оно у тебя не работает - не понятно, нужно тупо шить программатором фьюзы, затем загрузчик.

 

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

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