Так уж сложилось, что к большинству статей я прикладываю исходники в виде проекта, или схему или ещё чего… Долго думал, что же «приложить» к этой статье.. Ох уж этот асм..
Проект на языке ассемблера для AVR контроллеров создать не особо сложно (утверждение касается только этого — «пилотного» проекта). Буду предполагать, что читатель знаком с основами языка ассемблера, и различает команды от директив.
Идём в AVR Studio кликаем New — Project — ASM Project после чего выбираем контроллер и получаем пустой текстовый файл. Неподготовленный человек слегка «обалдевает» от отсутствия даже инклуда с настройками для данного контроллера.. Но не беда.
Инклудим его сами, ну и описываем сразуже 2 метки:
.include "128def.inc" ; инклудим файл с настройками .def temp = r16 ; назначаем регистр для временных данных RESET: ldi temp, 0b11111111 ; 0xFF out DDRB, temp ; вводим значение в DDRB ldi temp, 0x01 ; загружаем 1 в temp LOOP: out PORTB, temp ; выводим значение в порт B - PORTB rol temp ; сдвигаем влево значение в r16 rjmp LOOP ; продолжаем цикл
Cделав это мы просто включаем по очереди все пины порта B нашей mega128.
Как вы наверное знаете выполнения начинается с начала файла, так что при включении контроллера первым делом будут выполнены действия по метке RESET ибо она в самом верху нашей программы. В программе после этой метки мы просто указываем, что все выводы порта B — это выход, а не вход.
После чего начинается выполнение программы под меткой LOOP (что в переводе «цикл»). Внутри этого цикла мы просто выводим в порт B данные из 16 регистра (который мы обозвали temp) и сдвигаем значение в регистре, после чего происходит безусловный переход по метке LOOP т.е. в начало цикла.