Програмуємо Arduino на чистому Сі

В житті ардуинщика рано чи пізно настає момент, коли у штатній середовищі розробки стає тісно. Якщо скетчам перестає вистачати пам'яті, потрібно жорсткий реалтайм і робота з перериваннями або просто хочеться бути ближче до заліза — значить настав час переходити на C. Бувалі електронники при згадці Arduino презирливо поморщатся і відправлять новачка в радиомагазин за паяльником. Можливо, це не найгірший рада, але ми поки не будемо йому слідувати. Якщо відкинути Arduino IDE і мова wiring/processing, у нас в руках залишиться прекрасна налагоджувальна плата, вже оснащена всім необхідним для роботи мікроконтролера. І, що важливо, в пам'ять контролера вже зашитий бутлоадер, що дозволяє завантажувати прошивку без використання програматора.

Для програмування на мові C нам знадобиться AVR GCC Toolchain.

Windows:
Встановлюємо WinAVR, який містить все необхідне.

Debian і Ubuntu:

sudo apt-get install gcc-avr binutils-avr avr-libc 


MacOs X:
Встановлюємо CrossPack for AVR Development

Також нам потрібно буде встановлена Arduino IDE, оскільки вона містить утиліту avrdude, яка потрібна для завантаження прошивки в контролер. CrossPack теж містить avrdude, але версія, що йде з ним, не вміє працювати з Arduino.

Після того, як всі встановлено, створимо наш перший проект. Для початку напишемо Makefile. Він дозволить нам уникнути введення довгих команд вручну при кожній компіляції і завантаження прошивки.

#Контролер, встановлений на платі. Може бути іншим, наприклад atmega328 
DEVICE = atmega168

#Тактова частота 16 МГц 
CLOCK = 16000000

#Команда запуску avrdude. Її потрібно скопіювати з Arduino IDE.
AVRDUDE = /Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/bin/avrdude-C/Applications/Arduino.app/Contents/Resources/Java/hardware/tools/avr/etc/avrdude.conf-carduino-P/dev/tty.usbserial-A600dAAQ-b19200-D-p atmega168

OBJECTS = main.o

COMPILE = avr-gcc-Wall-Os-DF_CPU=$(CLOCK) -mmcu=$(DEVICE)

all: main.hex

.c.o:
$(COMPILE) -c $< o $@

.S.o:
$(COMPILE) -x assembler-with-cpp-c $< o $@

.c.s:
$(COMPILE) -S $< o $@

flash: all
$(AVRDUDE) -U flash:w:main.hex:i

clean:
rm-f main.hex main.elf $(OBJECTS)

main.elf: $(OBJECTS)
$(COMPILE) -o main.elf $(OBJECTS)

main.hex: main.elf
rm-f main.hex
avr-objcopy-j .text-j .data-O ihex main.elf main.hex
avr-size --format=avr --mcu=$(DEVICE) main.elf




У цьому файлі нам потрібно вписати свою команду для запуску avrdude. На різних системах вона буде виглядати по різному. Щоб дізнатися свій варіант, запускаємо Arduino IDE і в налаштуваннях ставимо галочку «Show verbose output during upload».


Тепер завантажуємо Arduino будь скетч і дивимося повідомлення, що виводяться в нижній частині вікна. Знаходимо там виклик avrdude, копіюємо всі, крім параметра-Uflash і вставляємо в Makefile після «AVRDUDE = ».


Невелике зауваження: всі відступи в Makefile робляться символами табуляції (клавішею Tab). Якщо ваш текстовий редактор замінює ці символи пробілами, команда make відмовиться збирати проект.

Тепер створимо файл main.c — власне текст нашої програми, в якій традиційно помигаем світлодіодом.

#include <avr/io.h>
#include <util/delay.h>

#define LED_PIN 5

int main() {
DDRB |= 1 << LED_PIN; 
while(1) {
PORTB |= 1 << LED_PIN;
_delay_ms(1000);
PORTB &= ~(1 << LED_PIN);
_delay_ms(1000);
}
return 0;
}



Наш проект готовий. Відкриємо консоль в директорії нашого проекту і введемо команду «make»:


Як бачимо, розмір отриманої прошивки становить усього 180 байт. Аналогічний ардуиновский скетч займає 1116 байт в пам'яті контролера.

Тепер повернемося до консолі і введемо «make flash» щоб завантажити скомпільований файл в контролер:


Якщо завантаження пройшла без помилок, то світлодіод, підключений до 13 контакту плати, радісно заблимає. Іноді avrdude не може знайти плату або відвалюється по таймауту — у цьому випадку може допомогти передегивание USB кабелю. Також, щоб уникнути конфліктів доступу до плати, не забудьте закрити Arduino IDE перед командою make flash».

Можливо багато речей, описані в цій статті, здадуться очевидними досвідченим розробникам. Я постарався описати процес максимально зрозумілим для початківця ардуинщика мовою і зібрати в одному місці інформацію, яку мені вдалося добути в різних джерелах, і перевірену досвідченим шляхом. Може бути кому-то ця стаття заощадить пару годин часу.

Удачі в освоєнні мікроконтролерів і з Новим Роком!

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.