19 августа 2012 г.

Пишем на AVR ассемблере в Ubuntu: Geany + AVRA

AVRA - это ассемблер для микроконтроллеров AVR, который почти полностью совместим с Атмеловским ассемблером AVRASM32. AVRA есть для Windows, FreeBSD, macOS и Linux. Нас интересует, естественно, последнее. Мы прикрутим сборку программ к Geany - текстовому редактору с базовыми функциями интегрированной среды разработки и будем прогать на ассемблере. 


Установка AVRA

В репозитории Ubuntu есть пакет avra, но его версия - 1.2.3. Эта версия не даст нам собрать программу без работы напильником, поскольку там есть некие директивы pragma и кое-что другое, мешающее нам. Мы ищем легкие пути, поэтому скачаем с сорсфорджа пакет с подходящей версией - 1.3.0 и установим его.
Вот по этой ссылке хостится нужный нам пакет. Качаем оттуда avra-1.3.0.tar.bz2. далее я предположу, что он скачался в ~/Загрузки. Если это не так, измените в командах папку назначения.
Распаковываем:
tar -xf ~/Загрузки/avra-1.3.0.tar.bz2
Копируем папку с avra себе в хомяк:
cp -R ~/Загрузки/avra-1.3.0 ~
Заходим в нее:
cd ~/avra-1.3.0/src
Для сборки программе очень нужно, чтобы в папке src лежали файлы NEWS, README, AUTHORS и ChangeLog, которых там нет. Что ж, положим их туда. Два файла лежат в соседней папке, поэтому делаем так:
cp ../AUTHORS ../README ../src
Двух других файлов нигде нет, поэтому мы сделаем их сами:
gedit ChangeLog
Если хотите честности, можете скопировать текст с вот этой страницы. А можете оставить файл пустым [nobody cares]. Сохраним файл. 
Сделаем то же самое с новостями:
gedit NEWS
Оставим его пустым и сохраним. Теперь по порядочку выполняем команды:
aclocal 
autoconf 
automake -a 
./configure 
sudo make 
sudo make install
Все готово. Проверяем - пишем:
avra --version
Получаем:
AVRA: advanced AVR macro assembler Version 1.3.0 Build 1 (8 May 2010) Copyright (C) 1998-2010. Check out README file for more info
   AVRA is an open source assembler for Atmel AVR microcontroller family 
It can be used as a replacement of 'AVRASM32.EXE' the original assembler shipped with AVR Studio. We do not guarantee full compatibility for avra.
   AVRA comes with NO WARRANTY, to the extent permitted by law. You may redistribute copies of avra under the terms of the GNU General Public License. 
For more information about these matters, see the files named COPYING.
Теперь скопируем includes себе в корешок, чтобы не быть единалами:
sudo mv ~/avra-1.3.0/includes/ /usr/share/avra

Установка и настройка Geany

Geany можно смело установить из репозитория:
sudo apt-get install geany
После первого запуска в вашем хомяке появится папка .config/geany. В ней мы сейчас создадим файл со стилем подсветки синтаксиса для ассемблера. Для этого выполняем:
gedit ~/.config/geany/filedefs/filetypes.asm
и вставляем в редакторе текст вот с этой страницы.
Сохраняем файл.

Пишем простую прогу...

Возьмем проц ATtiny2313, подсоединим к ноге 12 (PB0) светодиодик и будем им мигать.
Запускаем Geany, делаем Файл -> Новый, Сохранить как... blink2313 в папке ~/AVRasm/blink2313.
Теперь пишем вот такой код, например:
.nolist ;исключаем из листинга следующие две строки
.includepath "/usr/share/avra/" ;указали папку с инклудами
.include "2313def.inc" ;присоединили описание проца
.list ;все остальное включаем в листинг

;начало таблицы векторов прерывания

RJMP main ; RESET
RETI ; INT0
RETI ; INT1
RETI ; TIMER1_CAPT
RETI ; TIMER1_COMPA
RETI ; TIMER1_OVF
RJMP tc0i ; TIMER0_OVF
RETI ; USART_RX
RETI ; USART_UDRE
RETI ; USART_TX
RETI ; ANA_COMP
RETI ; PCINT
RETI ; TIMER1_COMPB
RETI ; TIMER0_COMPA
RETI ; TIMER0_COMPB
RETI ; USI_START
RETI ; USI_OVF
RETI ; EE_RDY
RETI ; WDT

;конец таблицы векторов прерывания

tc0i: ;обработка прерывания по переполнению таймера 0

IN   r1,SREG ;сохраняем содержимое флагового регистра
SBI PINB,0
OUT   SREG,r1 ; возвращаем изначальное значение флагового регистра
RETI ; выходим из прерывания

main: ;всякая инициализация
LDI r16,LOW(RAMEND) 
OUT SPL,r16 ; Инициализировали указатель стека
LDI r16,(1<<TOIE0)
OUT TIMSK,r16 ; разрешили прерывание при переполнении таймера 0
LDI r16,(1<<CS02)
OUT TCCR0,r16 ; настроили делитель таймера 0 на 256
LDI r16,1
OUT DDRB,r16 ; настроили порт B
SEI ; разрешили глобальные прерывания

loop: ;начало основного цикла
NOP ;не делаем ничего
RJMP loop ; переходим на начало основного цикла

...и заливаем ее в МК

Компилируем все свои дела кнопочкой наверху:

Теперь внизу слева открываем терминал (очень удобно, кстати!):
Переходим в папку с проектом:
cd ~/AVRasm/blink2313
И, наконец, с помощью avrdude заливаем прогу в микроконтроллер. Для этого нужно выполнить команду в формате
avrdude -p[контроллер] -c[программатор] -Uflash:w:[название проекта].hex:a
В нашем случае:
avrdude -pt2313 -cusbasp -Uflash:w:blink2313.hex:a

Все, лампочка мигает, караван идет, собаки лают. Любые вопросы по теме задавайте в комментариях или по e-mail.