Я уже писал о том, как устанавливать различные отладочные платы и микроконтроллеры Atmel для того, чтобы их можно было программировать, используя среду разработки Arduino IDE в статье Установка дополнительных плат в Arduino IDE. Сегодня я рассмотрю еще один частный случай программирования микроконтроллера ATmega128A, используя программатор USBasp и ардуишную среду.
Загрузчик для ATmega128A
Для того, чтобы записать программу в память микроконтроллера непосредственно из Arduino IDE потребуется специальная программа-загрузчик (bootloader), размещенная в специальной области памяти микроконтроллера, которая постоянно опрашивает UART.
Это немного измененная версия загрузчика с сайта www.chip45.com.
Для компиляции я использовал AVR-GCC.
$ avr-gcc -mmcu=atmega128 -Wall -Os -o boot_mega128.o boot_mega128.c $ avr-objcopy -O ihex boot_mega128.o boot_mega128.hex
В архиве содержится исходный C-файл, объектый файл и готовый hex-файл. Для дальнейших действий понадобится только последний.
Устанавливаем фьюзы микроконтроллера и прошиваем загрузчик, используя программатор USBasp и AVRDUDE:
$ sudo avrdude -p m128 -c usbasp -P usbasp -Uefuse:w:0xff:m -Uhfuse:w:0xca:m -Ulfuse:w:0xff:m -Ulock:w:0x3F:m $ sudo avrdude -p m128 -c usbasp -e -U flash:w:boot_mega128.hex -Ulock:w:0x0F:m
В Windows sudo писать не нужно.
Создадим папку atmega128 и перепишем в нее файл boot_mega128.hex в папке с загрузчиками среды Arduino для того, чтобы можно было прошивать bootloader прямо из Arduino IDE.
В MacOS X путь к папке с загрузчиками выглядит следующим образом:
.../arduino/Contents/Java/hardware/arduino/avr/bootloaders
Файл boards.txt
В Windows этот файл расположен в папке с Arduino:
.../hardware/arduino/avr/boards.txt
В Mac OS X:
.../arduino/Contents/Java/hardware/arduino/avr/boards.txt
В конец файла boards.txt среды Arduino добавляем следующие строчки:
############################################################### atmega128A.name=Custom ATmega 128 Breakout Board using AVRISP atmega128A.upload.tool=usbasp atmega128A.upload.maximum_size=126976 atmega128A.bootloader.low_fuses=0xFF atmega128A.bootloader.high_fuses=0xCA atmega128A.bootloader.extended_fuses=0xFF atmega128A.bootloader.path=atmega atmega128A.bootloader.file=boot_mega128.hex atmega128A.bootloader.unlock_bits=0x3F atmega128A.bootloader.lock_bits=0x0F atmega128A.build.mcu=atmega128 atmega128A.build.f_cpu=8000000L atmega128A.build.core=arduino atmega128A.build.variant=mega128
Обратите внимание на фьюзы загрузчика. Они в точности должны совпадать с указанными при его прошивке!
Тактовая частота микроконтроллера у меня установлена равной 8 МГц.
Определяем пины
Для того, чтобы было удобно обращаться к тому или иному пину, необходимо указать их соответствие для нашего микроконтроллера. В папке variants создадим новую папку mega128
В папке mega128 необходимо создать файл pins_arduino.h с описанием пинов микроконтроллера ATmega128.
Hello, world!
Осталось проверить работоспособность. Подключаем к выводу PB4 светодиод (12 пин) и наслаждаемся его незамысловатым миганием, предварительно загрузив представленный ниже скетч в микроконтроллер, выбрав микроконтроллер Custom ATmega 128 Breakout Board using AVRISP и программатор USBasp из среды Arduino IDE.
int ledPin=12; void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); }
[add_ratings]
Андрей, можно ли этот бутлоадер пересобрать под atmega64?
Отличий между 64 и 128 минимум, но есть одно замечание касательно бутлоалдера
The Boot Loader area is also changed. The following must be considered:
• The No-Read-While-Write section starts at word address 0xF000 instead of
0×7000.
Есть еще такой генератор загрузчиков
homes-smart.ru/index.php/...o/avr-zagruzchik
сразу hex файл делает на любые рабочие частоты.
А ты уверен что у тебя это заработало?
даже вот это atmega128A.upload.tool=usbasp
в файле boards.txt
сбивает с толку
Даю рабочий кусок файла boards.txt, для BK-AVR128:
atmega128A.name=Custom ATmega 128 Breakout Board using AVRISP
atmega128A.upload.tool=usbasp
atmega128A.upload.maximum_size=126976
atmega128A.bootloader.low_fuses=0xFF
atmega128A.bootloader.high_fuses=0xCA
atmega128A.bootloader.extended_fuses=0xFF
atmega128A.bootloader.path=atmega
atmega128A.bootloader.file=boot_mega128.hex
atmega128A.bootloader.tool=avrdude
atmega128A.bootloader.unlock_bits=0x3F
atmega128A.bootloader.lock_bits=0x0F
atmega128A.build.mcu=atmega128
atmega128A.build.f_cpu=8000000L
atmega128A.build.core=arduino
atmega128A.build.variant=mega128
atmega128A.build.board=AVR_Atmega128
Всё проверил на себе, работает с версиями ArduinoIDE от 1.6 и выше.
Ошибок нет, если все скопировали правильно.
На старых IDE не проверял, может кому-то будет полезным.
Здравствуйте.
При компиляции последнего скетча возникает сообщение:
Warning: Board arduino:avr:atmega128A doesn't define a 'build.board' preference. Auto-set to: AVR_ATMEGA128A
Скетч использует 1060 байт (0%) памяти устройства. Всего доступно 126976 байт.
Глобальные переменные используют 9 байт динамической памяти.
Полученные файлы
mega128_LED_blink.ino.elf
или
mega128_LED_blink.ino.hex
будучи загруженными в Proteus8 c ATmega128 при симуляции выдают сообщения
PC=0×0230. [AVR MEMORY] External Memory Write while interface is not enabled (SRE=0): [0x21FF]=18. [U1]
PC=0×0230. [AVR MEMORY] External Memory Write while interface is not enabled (SRE=0): [0x21FE]=01. [U1]
PC=0x060E. [AVR MEMORY] External Memory Write while interface is not enabled (SRE=0): [0x21FD]=07. [U1]
PC=0x060E. [AVR MEMORY] External Memory Write while interface is not enabled (SRE=0): [0x21FC]=03. [U1]
PC=0×0686. [AVR MEMORY] External Memory Read while interface is not enabled (SRE=0): [0x21FC]. [U1]
PC=0x000E. [AVR MEMORY] External Memory Read while interface is not enabled (SRE=0): [0x21FD]. [U1]
и так далее, т.е. полученный hex (elf) оказались неработоспособными почему-то.
Добавил в boards.txt строку
atmega128A.build.board=ATmega128_Breakout_Board_using_AVRISP
(после строки
atmega128A.build.f_cpu=8000000L
)
Предупреждение исчезло.
Файлики *.elf и *.hex заработали.
Странно, конечно.
Быть может кому-то пригодится.
Да, еще вопрос:
можно ли (и как?) добиться генерации hex — файла для бутлоадера,
подобно прочим платформам Ардуино и загружать его через СОМ порт обычным для Arduino способом?
Т.е. БЕЗ использования USB — программатора?
И связанные вопросы: как соединить плату Arduino (UNO, например) с
платой
ATmega128 + Arduino IDE + USBasp для использования платы
Arduino в качестве программатора
для загрузки бутлоадера в ATmega128?
Где взять схему ATmega 128 Breakout Board ?
С уважением,
...