Закрыть
ATmega128 + Arduino IDE + USBasp

ATmega128 + Arduino IDE + USBasp

Я уже писал о том, как устанавливать различные отладочные платы и микроконтроллеры Atmel для того, чтобы их можно было программировать, используя среду разработки Arduino IDE в статье Установка дополнительных плат в Arduino IDE. Сегодня я рассмотрю еще один частный случай программирования микроконтроллера ATmega128A, используя программатор USBasp и ардуишную среду.

 

Загрузчик для ATmega128A

Для того, чтобы записать программу в память микроконтроллера непосредственно из Arduino IDE потребуется специальная программа-загрузчик (bootloader), размещенная в специальной области памяти микроконтроллера, которая постоянно опрашивает UART.

Это немного измененная версия загрузчика с сайта www.chip45.com.

Bootloader Mega128
Bootloader Mega128
bootloader_mega128.zip
10.0 KiB
2064 Downloads
Детали

Для компиляции я использовал 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.

Создание папки внутри bootloaders в 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

Создание папки внутри variants в arduino ide

В папке mega128 необходимо создать файл pins_arduino.h с описанием пинов микроконтроллера ATmega128.

pins_arduino.h для ATmega128
2.5 KiB
1683 Downloads
Детали

 

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]

6 thoughts on “ATmega128 + Arduino IDE + USBasp

  1. Андрей, можно ли этот бутлоадер пересобрать под 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.

  2. А ты уверен что у тебя это заработало?

    даже вот это atmega128A.upload.tool=usbasp

    в файле boards.txt

    сбивает с толку

  3. Даю рабочий кусок файла 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 не проверял, может кому-то будет полезным.

  4. Здравствуйте.

    При компиляции последнего скетча возникает сообщение:

    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 заработали.

    Странно, конечно.

    Быть может кому-то пригодится.

  5. Да, еще вопрос:

    можно ли (и как?) добиться генерации hex — файла для бутлоадера,

    подобно прочим платформам Ардуино и загружать его через СОМ порт обычным для Arduino способом?

    Т.е. БЕЗ использования USB — программатора?

    И связанные вопросы: как соединить плату Arduino (UNO, например) с

    платой

    ATmega128 + Arduino IDE + USBasp для использования платы

    Arduino в качестве программатора

    для загрузки бутлоадера в ATmega128?

    Где взять схему ATmega 128 Breakout Board ?

    С уважением,

    ...

Оставить ответ

Ваш email не будет опубликован.Обязательны поля помечены *