В некоторых своих статьях я привожу код на Си и ассемблере. Зачем это в статьях про ардуино? Какая практическая ценность этой информации? Конечно приятно наблюдать работу программы в симуляторе, но намного приятнее видеть работу этой программы в реальном устройстве. И в этой статье я расскажу как программу написанную и скомпилированную в любой среде разработки поддерживающей микроконтроллеры AVR загрузить в ардуино. Эта статья не о программировании микроконтроллеров AVR. В данной статье описано как загрузить прошивку используя исключительно возможности самой ардуино. Никакого дополнительного оборудования и специального программного обеспечения не потребуется.
На данный момент существует немало различных платок ардуино. В них используются разные микроконтроллеры. Но во все микроконтроллеры ардуино уже записан загрузчик (Boot Loader). Стандартный загрузчик ардуино вполне можно использовать для установки любой прошивки в микроконтроллер.
Сразу скажу, в разных платках ардуино установлены разные загрузчики. Однако для работы с ними всеми в Arduino IDE используется всего одна программа. Называется она AVRDUDE. Это очень хорошая программа, поэтому установка какого либо дополнительного программного обеспечения и не требуется.
При таком подходе сохраняется возможность программирования платок ардуино обычным образом. В любой момент можно вернутся к скетчам и родной Arduino IDE.
Информацию об AVRDUDE можно найти на http://www.nongnu.org/avrdude/ Это консольная программа. Но ничего страшного в этом нет. Работать с этой программой не сложно.
В качестве подопытного будет Arduino Nano с микроконтроллером ATmega168
Для этой статьи мной была написана небольшая программка на ассемблере
Эта программа мигает светодиодом на восьмом цифровом выводе ардуино (PB0).
Скомпилированную в AVR Studio прошивку можно скачать с https://yadi.sk/d/0yTeoaGCbtewK Прошивочка в zip архиве. Прежде чем загружать прошивку в микроконтроллер её нужно извлечь из архива :)
Для удобства я создал папку avr на диске C и туда поместил прошивку.
Стандартное ПО ардуино у меня также установлено на диске C.
Далее нужно подключить Arduino Nano к ПК. Узнать какой номер COM порта Windows присвоила ардуино можно через Arduino IDE.
Теперь необходимо запустить программу для работы с avrdude. В Windows 7 это можно сделать как то так
Пуск - Все программы - Стандартные - Командная строка
В тестовых целях рекомендуется посмотреть краткую справочку по avrdude. Для этого в командной строке необходимо вызвать avrdude без каких либо параметров. В моем случае в командной строке нужно написать
C:\arduino-1.0.6\hardware\tools\avr\bin\avrdude.exe
Нажимаете Enter и просвещаетесь. Впрочем, тот кто ранее просмотрел документацию к avrdude ничего нового в этой справке не найдет.
Если все получилось, тогда можно пробовать загружать прошивку в ардуино. Для этого в командной строке пишется нечто похожее на
C:\arduino-1.0.6\hardware\tools\avr\bin\avrdude.exe -C C:\arduino-1.0.6\hardware\tools\avr\etc\avrdude.conf -p m168 -c arduino -P com19 -b 19200 -D -U flash:w:"C:\avr\nano168.hex":i
В итоге должно получится так
И светодиод на цифровой ножке 8 замигает. Программа написанная на ассемблере и скомпилированная в AVR Studio загружена в Arduino Nano (ATmega168).
Теперь немного пояснений.
C:\arduino-1.0.6\hardware\tools\avr\bin\avrdude.exe
Это путь к исполняемому файлу программы avrdude.
-C
Эта опция предписывает avrdude использовать конфигурационный файл находящийся по указанному далее адресу.
C:\arduino-1.0.6\hardware\tools\avr\etc\avrdude.conf
Здесь в моей Arduino IDE размещен конфигурационный файл avrdude.
-p
Эта опция сообщает avrdude, что программе предстоит работать с указанным далее микроконтроллером
m168
Это обозначение микроконтроллера ATmega168 в конфигурационном файле avrdude Arduino IDE. При наличии желания можно посмотреть список всех микроконтроллеров с которыми работает конкретная версия avrdude. Для этого в командной строке нужно ввести
C:\arduino-1.0.6\hardware\tools\avr\bin\avrdude.exe -C C:\arduino-1.0.6\hardware\tools\avr\etc\avrdude.conf -p ?
Вообще то avrdude может работать с любым микроконтроллером AVR. Если контроллера нет в списке, то это можно исправить. Нужно лишь отредактировать конфигурационный файл avrdude сообщив программе параметры этого микроконтроллера.
-c
Эта опция сообщает avrdude о том, какой используется инструмент для программирования микроконтроллера.
arduino
Именно так обозначается загрузчик Arduino Nano в конфигурационном файле avrdude. Посмотреть список всех поддерживаемых avrdude инструментов программирования микроконтроллеров можно введя в командной строке
C:\arduino-1.0.6\hardware\tools\avr\bin\avrdude.exe -C C:\arduino-1.0.6\hardware\tools\avr\etc\avrdude.conf -c ?
Список весьма впечатляющий.
-P
Эта опция указывает avrdude на порт который Windows присвоила ардуино.
com19
У меня это COM19.
-b
Через эту опцию определяется скорость обмена данными между ардуино и avrdude.
19200
Именно на 19200 bps работает загрузчик Arduino Nano с микроконтроллером ATmega168.
-D
Эта опция предписывает avrdude не выполнять автоматическую очистку flash памяти микроконтроллера.
-U
Эта опция определяет, что avrdude будет делать с микроконтроллером. Мне нужно записать прошивку в flash память микроконтроллера. Поэтому далее я указываю
flash:w:"C:\avr\nano168.hex":i
Эта строка также состоит из отдельных частей разделенных двоеточием.
flash
Эта часть указывает, что какие то манипуляции должны быть выполнены с памятью программ микроконтроллера.
w
Эта часть говорит avrdude, что необходимо выполнить запись данных.
"C:\avr\nano168.hex"
Здесь указывается полный путь к файлу содержащему прошивку которая должна быть записана в память программ микроконтроллера. Обратите внимание на кавычки. Они обязательны.
i
Эта часть сообщает avrdude, что данные в файле записаны в формате Intel Hex. Если формат не известен, можно вместо i ввести a. Тогда avrdude попытается самостоятельно определить формат.
В заключении я приведу таблицу, которая поможет аналогичным способом загружать прошивки в различные ардуинки.
Немного поясню. В столбике Board перечислены платки ардуино. В столбике Microcontroller указан микроконтроллер используемый на этой платке. На платках с одинаковым названием могут использоваться разные микроконтроллеры. В столбике Flash Memory указан объем доступной программисту памяти программ. Часть памяти уже занята загрузчиком ардуино. Это нужно учитывать при написании программ для ардуино. Столбики -p, -c и -b содержат значения одноименных опций avrdude для каждой ардуино платки.
На данный момент существует немало различных платок ардуино. В них используются разные микроконтроллеры. Но во все микроконтроллеры ардуино уже записан загрузчик (Boot Loader). Стандартный загрузчик ардуино вполне можно использовать для установки любой прошивки в микроконтроллер.
Сразу скажу, в разных платках ардуино установлены разные загрузчики. Однако для работы с ними всеми в Arduino IDE используется всего одна программа. Называется она AVRDUDE. Это очень хорошая программа, поэтому установка какого либо дополнительного программного обеспечения и не требуется.
При таком подходе сохраняется возможность программирования платок ардуино обычным образом. В любой момент можно вернутся к скетчам и родной Arduino IDE.
Информацию об AVRDUDE можно найти на http://www.nongnu.org/avrdude/ Это консольная программа. Но ничего страшного в этом нет. Работать с этой программой не сложно.
В качестве подопытного будет Arduino Nano с микроконтроллером ATmega168
Для этой статьи мной была написана небольшая программка на ассемблере
;--------------------------------------------- ; Program : ; Compiler : AVR Studio ; Chip type : ATmega168 ; System Clock : 16 MHz ; Date : ;--------------------------------------------- .include "m168def.inc" ;--------------------------------------------- ; Interrupt vectors .cseg .org 0x0000 ; Reset jmp RESET .org 0x0002 ; External Interrupt Request 0 reti .org 0x0004 ; External Interrupt Request 1 reti .org 0x0006 ; Pin Change Interrupt Request 0 reti .org 0x0008 ; Pin Change Interrupt Request 1 reti .org 0x000A ; Pin Change Interrupt Request 2 reti .org 0x000C ; Watchdog Time-out Interrupt reti .org 0x000E ; Timer/Counter 2 Compare Match A reti .org 0x0010 ; Timer/Counter 2 Compare Match B reti .org 0x0012 ; Timer/Counter 2 Overflow reti .org 0x0014 ; Timer/Counter 1 Capture Event reti .org 0x0016 ; Timer/Counter 1 Compare Match A reti .org 0x0018 ; Timer/Counter 1 Compare Match B reti .org 0x001A ; Timer/Counter 1 Overflow reti .org 0x001C ; Timer/Counter 0 Compare Match A reti .org 0x001E ; Timer/Counter 0 Compare Match B reti .org 0x0020 ; Timer/Counter 0 Overflow reti .org 0x0022 ; SPI Serial Transfer Complete reti .org 0x0024 ; USART, Rx Complete reti .org 0x0026 ; USART, UDR Empty reti .org 0x0028 ; USART, Tx Complete reti .org 0x002A ; ADC Conversion Complete reti .org 0x002C ; EEPROM Ready reti .org 0x002E ; Analog Comparator reti .org 0x0030 ; Two-wire Serial Interface reti .org 0x0032 ; Store Program Memory Read reti .org INT_VECTORS_SIZE ;--------------------------------------------- RESET: ;--------------------------------------------- ; Steck initialization ldi R16, Low(RAMEND) out SPL, R16 ldi R16, High(RAMEND) out SPH, R16 ;--------------------------------------------- ; Input/Output Ports ldi R16, 0b00000000 out PORTB, R16 ldi R16, 0b00000001 out DDRB, R16 ldi R16, 0b00000000 out PORTC, R16 ldi R16, 0b00000000 out DDRC, R16 ldi R16, 0b00000000 out PORTD, R16 ldi R16, 0b00000000 out DDRD, R16 ;--------------------------------------------- ; main main: ldi R16, 0x00 ; low byte ldi R17, 0xD4 ; middle byte ldi R18, 0x30 ; high byte loop: subi R16, 1 sbci R17, 0 sbci R18, 0 brcc loop ldi R16, 0b00000001 in R17, PORTB eor R17, R16 out PORTB, R17 rjmp main ;---------------------------------------------
Эта программа мигает светодиодом на восьмом цифровом выводе ардуино (PB0).
Скомпилированную в AVR Studio прошивку можно скачать с https://yadi.sk/d/0yTeoaGCbtewK Прошивочка в zip архиве. Прежде чем загружать прошивку в микроконтроллер её нужно извлечь из архива :)
Для удобства я создал папку avr на диске C и туда поместил прошивку.
Стандартное ПО ардуино у меня также установлено на диске C.
Далее нужно подключить Arduino Nano к ПК. Узнать какой номер COM порта Windows присвоила ардуино можно через Arduino IDE.
Теперь необходимо запустить программу для работы с avrdude. В Windows 7 это можно сделать как то так
Пуск - Все программы - Стандартные - Командная строка
В тестовых целях рекомендуется посмотреть краткую справочку по avrdude. Для этого в командной строке необходимо вызвать avrdude без каких либо параметров. В моем случае в командной строке нужно написать
C:\arduino-1.0.6\hardware\tools\avr\bin\avrdude.exe
Нажимаете Enter и просвещаетесь. Впрочем, тот кто ранее просмотрел документацию к avrdude ничего нового в этой справке не найдет.
Если все получилось, тогда можно пробовать загружать прошивку в ардуино. Для этого в командной строке пишется нечто похожее на
C:\arduino-1.0.6\hardware\tools\avr\bin\avrdude.exe -C C:\arduino-1.0.6\hardware\tools\avr\etc\avrdude.conf -p m168 -c arduino -P com19 -b 19200 -D -U flash:w:"C:\avr\nano168.hex":i
В итоге должно получится так
И светодиод на цифровой ножке 8 замигает. Программа написанная на ассемблере и скомпилированная в AVR Studio загружена в Arduino Nano (ATmega168).
Теперь немного пояснений.
C:\arduino-1.0.6\hardware\tools\avr\bin\avrdude.exe
Это путь к исполняемому файлу программы avrdude.
-C
Эта опция предписывает avrdude использовать конфигурационный файл находящийся по указанному далее адресу.
C:\arduino-1.0.6\hardware\tools\avr\etc\avrdude.conf
Здесь в моей Arduino IDE размещен конфигурационный файл avrdude.
-p
Эта опция сообщает avrdude, что программе предстоит работать с указанным далее микроконтроллером
m168
Это обозначение микроконтроллера ATmega168 в конфигурационном файле avrdude Arduino IDE. При наличии желания можно посмотреть список всех микроконтроллеров с которыми работает конкретная версия avrdude. Для этого в командной строке нужно ввести
C:\arduino-1.0.6\hardware\tools\avr\bin\avrdude.exe -C C:\arduino-1.0.6\hardware\tools\avr\etc\avrdude.conf -p ?
Вообще то avrdude может работать с любым микроконтроллером AVR. Если контроллера нет в списке, то это можно исправить. Нужно лишь отредактировать конфигурационный файл avrdude сообщив программе параметры этого микроконтроллера.
-c
Эта опция сообщает avrdude о том, какой используется инструмент для программирования микроконтроллера.
arduino
Именно так обозначается загрузчик Arduino Nano в конфигурационном файле avrdude. Посмотреть список всех поддерживаемых avrdude инструментов программирования микроконтроллеров можно введя в командной строке
C:\arduino-1.0.6\hardware\tools\avr\bin\avrdude.exe -C C:\arduino-1.0.6\hardware\tools\avr\etc\avrdude.conf -c ?
Список весьма впечатляющий.
-P
Эта опция указывает avrdude на порт который Windows присвоила ардуино.
com19
У меня это COM19.
-b
Через эту опцию определяется скорость обмена данными между ардуино и avrdude.
19200
Именно на 19200 bps работает загрузчик Arduino Nano с микроконтроллером ATmega168.
-D
Эта опция предписывает avrdude не выполнять автоматическую очистку flash памяти микроконтроллера.
-U
Эта опция определяет, что avrdude будет делать с микроконтроллером. Мне нужно записать прошивку в flash память микроконтроллера. Поэтому далее я указываю
flash:w:"C:\avr\nano168.hex":i
Эта строка также состоит из отдельных частей разделенных двоеточием.
flash
Эта часть указывает, что какие то манипуляции должны быть выполнены с памятью программ микроконтроллера.
w
Эта часть говорит avrdude, что необходимо выполнить запись данных.
"C:\avr\nano168.hex"
Здесь указывается полный путь к файлу содержащему прошивку которая должна быть записана в память программ микроконтроллера. Обратите внимание на кавычки. Они обязательны.
i
Эта часть сообщает avrdude, что данные в файле записаны в формате Intel Hex. Если формат не известен, можно вместо i ввести a. Тогда avrdude попытается самостоятельно определить формат.
В заключении я приведу таблицу, которая поможет аналогичным способом загружать прошивки в различные ардуинки.
Board | Microcontroller | Flash Memory | -p | -c | -b |
Arduino Uno | ATmega328 | 32256 B | m328p | arduino | 115200 |
Arduino Duemilanove | ATmega328 | 30720 B | m328p | arduino | 57600 |
Arduino Duemilanove | ATmega168 | 14336 B | m168 | arduino | 19200 |
Arduino Dicimila | ATmega168 | 14336 B | m168 | arduino | 19200 |
Arduino Nano | ATmega328 | 30720 B | m328p | arduino | 57600 |
Arduino Nano | ATmega168 | 14336 B | m168 | arduino | 19200 |
Arduino Mega 2560 | ATmega2560 | 258048 B | m2560 | wiring | 115200 |
Arduino Mega | ATmega1280 | 126976 B | m1280 | arduino | 57600 |
Arduino Leonardo | ATmega32U4 | 28672 B | m32u4 | avr109 | 57600 |
Arduino Micro | ATmega32U4 | 28672 B | m32u4 | avr109 | 57600 |
Arduino Mini | ATmega328 | 28672 B | m328p | arduino | 115200 |
Arduino Mini | ATmega168 | 14336 B | m168 | arduino | 19200 |
Arduino Pro Mini (5V, 16MHz) | ATmega328 | 30720 B | m328p | arduino | 57600 |
Arduino Pro Mini (5V, 16MHz) | ATmega168 | 14336 B | m168 | arduino | 19200 |
Arduino Pro Mini (3.3V, 8MHz) | ATmega328 | 30720 B | m328p | arduino | 57600 |
Arduino Pro Mini (3.3V, 8MHz) | ATmega168 | 14336 B | m168 | arduino | 19200 |
Arduino NG | ATmega168 | 14336 B | m168 | arduino | 19200 |
Arduino NG | ATmega8 | 7168 B | m8 | arduino | 19200 |
Немного поясню. В столбике Board перечислены платки ардуино. В столбике Microcontroller указан микроконтроллер используемый на этой платке. На платках с одинаковым названием могут использоваться разные микроконтроллеры. В столбике Flash Memory указан объем доступной программисту памяти программ. Часть памяти уже занята загрузчиком ардуино. Это нужно учитывать при написании программ для ардуино. Столбики -p, -c и -b содержат значения одноименных опций avrdude для каждой ардуино платки.
Комментариев нет:
Отправить комментарий