Команды avr: Таблицы команд ассемблера AVR — Микроконтроллеры для всех

Таблицы команд ассемблера AVR — Микроконтроллеры для всех

В этой статье я хочу представить еще один вариант таблиц команд ассемблера для микроконтроллеров AVR.

Из дополнительных материалов у приобретателей курса уже есть pdf документ с набором таблиц команд. Так в чем же основное отличие набора команд, который представлен ниже?

В первую очередь, тем что в колонке «Описание» дается описание команд на английском. И как не трудно заметить, многие мнемоники команд образованы как раз от этих сокращений. Поэтому, тем кто знает английский язык, тем будет проще запомнить написание команд. И так же присутствует колонка «Код операции», где можно посмотреть каким образом та или иная команда выглядит в двоичном виде. Это на тот случай, если вам вдруг захочется по-программировать в машинных кодах.

Сразу стоит отметить, что здесь представлены в основном только команды семейства tiny. Я намерено убрал команды семейства mega, что бы лишний раз не вносить путаницу.

Арифметические и логические команды
КомандаОписаниеДействиеЦиклыКод операцииФлаги
add Rd,RrAdd two RegistersRd←Rd+Rr10000 11rd dddd rrrrZ,C,S,N,V,H
adc Rd,RrAdd with Carry two RegistersRd←Rd+Rr+C10001 11rd dddd rrrrZ,C,S,N,V,H
adiw Rdl,KAdd Immediate to WordRdh:Rdl←Rdh:Rdl+K21001 0110 KKdd KKKKZ,C,S,N,V
sub Rd,RrSubtract two RegistersRd←Rd-Rr10001 10rd dddd rrrr
Z,C,S,N,V,H
sbc Rd,RrSubtract with Carry two RegistersRd←Rd-Rr-C10000 10rd dddd rrrrZ,C,S,N,V,H
subi Rd,KSubtract Constant from RegisterRd←Rd-K11010 KKKK dddd KKKKZ,C,S,N,V,H
sbci Rd,KSubtract with Carry Constant from RegisterRd←Rd-K-C10100 KKKK dddd KKKKZ,C,S,N,V,H
sbiw Rdl,KSubtract Immediate from WordRdh:Rdl←Rdh:Rdl-K21001 0111 KKdd KKKKZ,C,S,N,V
and Rd,RrLogical AND RegistersRd←Rd AND Rr10010 00rd dddd rrrrZ,S,N
andi Rd,KLogical AND Register and ConstantRd←Rd AND K 10111 KKKK dddd KKKKZ,S,N
or Rd,RrLogical OR RegistersRd←Rd OR Rr10010 10rd dddd rrrrZ,S,N
ori Rd,KLogical OR Register and ConstantRd←Rd OR K10110 KKKK dddd KKKKZ,S,N
eor Rd,RrExclusive OR RegistersRd←Rd EOR Rr10010 01rd dddd rrrrZ,S,N
com RdOne’s complementRd←0xFF-Rd11001 010d dddd 0000Z,S,N
neg RdTwo’s complementRd←0x00-Rd11001 010d dddd 0001Z,C,S,N,V,H
sbr Rd,KSet Bit (s) in RegisterRd←Rd OR K10110 KKKK dddd KKKKZ,S,N
cbr Rd,KClear Bit (s) in RegisterRd←Rd AND (0xFF- K)10111 KKKK dddd KKKKZ,S,N
inc RdIncrementRd←Rd+111001 010d dddd 0011Z,S,N,V
dec RdDecrementRd←Rd-111001 010d dddd 1010Z,S,N,V
tst RdTest for Zero or MinusRd←Rd AND Rd10010 00dd dddd ddddZ,S,N
clr RdClear RegisterRd←Rd EOR Rd10010 01dd dddd ddddZ,S,N
ser RdSet RegisterRd←0xFF11110 1111 dddd 1111
None

Команды пересылки данных

КомандаОписаниеДействиеЦиклыКод операцииФлаги
mov Rd,RrMove Between RegistersRd←Rr10010 11rd dddd rrrrNone
movw Rd,RrCopy Register WordRd+1:Rd←Rr+1:Rr10000 0001 dddd rrrrNone
ldi Rd,KLoad ImmediateRd←K11110 KKKK dddd KKKKNone
ld Rd,X
Load IndirectRd← (X)21001 000d dddd 1100None
ld Rd,X+Load Indirect and
Post-Inc.
Rd← (X), X←X+121001 000d dddd 1101None
ld Rd, -XLoad Indirect and
Pre-Dec.
X←X-1, Rd← (X)21001 000d dddd 1110None
ld Rd,YLoad IndirectRd← (Y)21000 000d dddd 1000None
ld Rd,Y+Load Indirect and
Post-Inc.
Rd← (Y), Y←Y+121001 000d dddd 1001None
ld Rd, -YLoad Indirect and
Pre-Dec.
Y←Y-1, Rd← (Y)
21001 000d dddd 1010None
ldd Rd,Y+qLoad Indirect with DisplacementRd← (Y+q)210q0 qq0d dddd 1qqqNone
ld Rd,ZLoad IndirectRd← (Z)21000 000d dddd 0000None
ld Rd,Z+Load Indirect and
Post-Inc.
Rd← (Z), Z←Z+121001 000d dddd 0001None
ld Rd, -ZLoad Indirect and
Pre-Dec.
Z←Z-1, Rd← (Z)21001 000d dddd 0010None
ldd Rd,Z+qLoad Indirect with DisplacementRd← (Z+q)210q0 qq0d dddd 0qqqNone
lds Rd,kLoad Direct from SRAMRd← (k)21001 000d dddd 0000kkkk kkkk kkkk kkkkNone
st X,RrStore Indirect(X) ←Rr21001 001r rrrr 1100None
st X+,RrStore Indirect and
Post-Inc.
(X) ←Rr, X←X+121001 001r rrrr 1101None
st -X,RrStore Indirect and
Pre-Dec.
X←X-1, (X) ←Rr21001 001r rrrr 1110None
st Y,RrStore Indirect(Y) ←Rr21000 001r rrrr 1000None
st Y+,RrStore Indirect and
Post-Inc.
(Y) ←Rr, Y←Y+121001 001r rrrr 1001None
st -Y,RrStore Indirect and
Pre-Dec.
Y←Y-1, (Y) ←Rr21001 001r rrrr 1010None
std Y+q,RrStore Indirect with Displacement(Y+q) ← Rr210q0 qq1r rrrr 1qqqNone
st Z,RrStore Indirect(Z) ←Rr21000 001r rrrr 0000None
st Z+,RrStore Indirect and
Post-Inc.
(Z) ←Rr, Z←Z+121001 001r rrrr 0001None
st -Z,RrStore Indirect and
Pre-Dec.
Z←Z-1, (Z) ←Rr21001 001r rrrr 0010None
std Z+q,RrStore Indirect with Displacement(Z+q) ← Rr210q0 qq1r rrrr 0qqqNone
sts k,RrStore Direct to SRAM(k) ←Rr21001 001r rrrr 0000kkkk kkkk kkkk kkkkNone
lpmLoad Program MemoryR0← (Z)31001 0101 1100 1000None
lpm Rd,Z
Load Program Memory
Rd← (Z)31001 000d dddd 0100None
lpm Rd,Z+Load Program Memory
and Post-Inc.
Rd← (Z), Z←Z+131001 000d dddd 0101None
spmStore Program Memory(Z) ←R1:R01001 0101 1110 1000None
in Rd,PIn PortRd←P11011 0PPd dddd PPPPNone
out P,RrOut PortP←Rr11011 1PPr rrrr PPPPNone
push RrPush Register in StackSTACK←Rr, SP←SP-1
2
1001 001r rrrr 1111None
pop RdPop Register from StackSP←SP+1, Rd←STACK21001 000d dddd 1111None

Команды передачи управления

КомандаОписаниеДействиеЦиклыКод операцииФлаги
rjmp kRelative JumpPC←PC+k+121100 kkkk kkkk kkkkNone
ijmpIndirect Jump to (Z)PC← (Z)21001 0100 0000 1001None
*jmp kDirect JumpPC←k31001 010k kkkk 110kkkkk kkkk kkkk kkkkNone
rcall kRelative Subroutine CallSTACK←PC+1,PC←PC+k+1,SP←SP-2 or 3¾1101 kkkk kkkk kkkkNone
icallIndirect Call to (Z)STACK←PC+1, PC← (Z),SP←SP-2 or 3¾1001 0101 0000 1001None
*call kDirect Subroutine CallSTACK←PC+1, PC←k,SP←SP-2 or 34/51001 010k kkkk 111kkkkk kkkk kkkk kkkkNone
retSubroutine ReturnPC←STACK,
SP←SP+2 or 3
4/51001 0101 0000 1000None
retiInterrupt ReturnPC←STACK,
SP←SP+2 or 3
4/51001 0101 0001 1000I
cpse Rd,RrCompare, Skip if Equalif (Rd=Rr)
PC←PC+2 or 3
½/30001 00rd dddd rrrrNone
cp Rd,RrCompareRd-Rr10001 01rd dddd rrrrZ,C,S,
N,V,H
cpc Rd,RrCompare with CarryRd-Rr-C10000 01rd dddd rrrrZ,C,S,
N,V,H
cpi Rd,KCompare Register with ImmediateRd-Rr-K10011 KKKK dddd KKKKZ,C,S,
N,V,H
sbrc Rr,bSkip if Bit in
Register is Cleared
if (Rr (b)=0)
PC←PC+2 or 3
½/31111 110r rrrr obbbNone
sbrs Rr,bSkip if Bit in
Register is Set
if (Rr (b)=1)
PC←PC+2 or 3
½/31111 111r rrrr obbbNone
sbic P,bSkip if Bit in IO
Register is Cleared
if (P (b)=0)
PC←PC+2 or 3
½/31001 1001 PPPP PbbbNone
sbis P,bSkip if Bit in IO
Register is Set
if (P (b)=1)
PC←PC+2 or 3
½/31001 1011 PPPP PbbbNone
brbc s,kBranch if Status
Flag is Cleared
if (SREG (s)=0)
PC←PC+k+1
½1111 01kk kkkk ksssNone
brbs s,kBranch if Status
Flag is Set
if (SREG (s)=1)
PC←PC+k+1
½1111 00kk kkkk ksssNone
brcc kBranch if Carry
Flag is Clearsd
if (C=0) PC←PC+k+1½1111 01kk kkkk k000None
brcs kBranch if Carry
Flag is Set
if (C=1) PC←PC+k+1½1111 00kk kkkk k000None
brsh kBranch if Same
or Higher
if (C=0) PC←PC+k+1½1111 01kk kkkk k000None
brlo kBranch if Lowerif (C=1) PC←PC+k+1½1111 00kk kkkk k000None
brne kBranch if Not Equalif (Z=0) PC←PC+k+1½1111 01kk kkkk k001None
breq kBranch if Equalif (Z=1) PC←PC+k+1½1111 00kk kkkk k001None
brpl kBranch if Plusif (N=0) PC←PC+k+1½1111 01kk kkkk k010None
brmi kBranch if Minusif (N=1) PC←PC+k+1½1111 00kk kkkk k010None
brvc kBruach if Overflow
Flag is Cleared
if (V=0) PC←PC+k+1½1111 01kk kkkk k011None
brvs kBranch if Overflow
Flag is Set
if (V=1) PC←PC+k+1½1111 00kk kkkk k011None
brge kBranch if Greate or
Equal, Signed
if (S=0) PC←PC+k+1½1111 01kk kkkk k100None
brlt kBranch if Less than
Zero, Signed
if (S=1) PC←PC+k+1½1111 00kk kkkk k100None
brhc kBranch if Half Carry
Flag is Cleared
if (H=0) PC←PC+k+1½1111 01kk kkkk k101None
brhs kBranch if Half Carry
Flag is Set
if (H=1) PC←PC+k+1½1111 00kk kkkk k101None
brtc kBranch if Transfer
Flag is Cleared
if (T=0) PC←PC+k+1½1111 01kk kkkk k110None
brts kBranch if Transfer
Flag is Set
if (T=1) PC←PC+k+1½1111 00kk kkkk k110None
brid kBranch if Interrupt
Disable
if (T=0) PC←PC+k+1½1111 01kk kkkk k111None
brie kBranch if Interrupt
Enable
if (T=1) PC←PC+k+1½1111 00kk kkkk k111None

*Обратите внимание! Команды jmp и call не поддерживаются микроконтроллерами семейства tiny, но так как они часто используются при программировании семейства mega, то я решил их так же внести в таблицу, что бы вы не забывали о их существовании.

 

Команды условных переходов по состоянию флагов SREG
ПроверкафлагаКоманда условногопереходаАльтернативнаяФорма написанияУсловие перехода
Cbrbc 0,kbrcc kПереход если флаг переноса установлен
brsh kПереход если больше или равно
brbs 0,kbrcs kПереход если флаг переноса сброшен
brlo kПереход если меньше
Zbrbc 1,kbreq kПереход если равно
brbs 1,kbrne kПереход если не равно
Nbrbc 2,kbrpl kПереход если плюс
brbs 2,kbrmi kПереход если минус
Vbrbc 3,kbrvc kПереход если флаг дополнительного кода сброшен
brbs 3,kbrvs kПереход если флаг дополнительного кода установлен
Sbrbc 4,kbrge kПереход если больше или равно нулю (знаковое)
brbs 4,kbrlt kПереход если меньше нуля (знаковое)
Hbrbc 5,kbrhc kПереход если флаг половинного переноса сброшен
brbs 5,kbrhs kПереход если флаг половинного переноса установлен
Tbrbc 6,kbrtc kПереход если флаг хранения бита сброшен
brbs 6,kbrts kПереход если флаг хранения бита установлен
Ibrbc 7,kbrid kПереход если прерывания запрещены
brbs 7,kbrie kПереход если прерывания разрешены

Команд битовых операций

КомандаОписаниеДействиеЦиклыКод операцииФлаги
sbi P,bSet Bit in I/O ReristerI/O (P,b) ←121001 1010 PPPP PbbbNone
cbi P,bClear Bit in I/OReristerI/O (P,b) ←021001 1000 PPPP PbbbNone
lsl RdLogical Shift LeftRd (n+1) ←Rd (n), Rd (0) ←010000 11dd dddd ddddZ,C,N,V
lsr RdLogical Shift RightRd (n) ←Rd (n+1), Rd (7) ←011001 010d dddd 0110Z,C,N,V
rol RdRotate Left through CarryRd (0) ←C, Rd (n+1) ←Rd (n), C←Rd (7)10001 11dd dddd ddddZ,C,N,V
ror RdRotate Right through CarryRd (7) ←C, Rd (n) ←Rd (n+1), C←Rd (0)11001 010d dddd 0111Z,C,N,V
asr RdArithmetic Shift RightRd (n) ←Rd (n+1),
n=0…6
11001 010d dddd 0101Z,C,N,V
swap RdSwap NibblesRd (3…0) ←Rd (7…4),Rd (7…4) ←Rd (3…0)11001 010d dddd 0010None
bst Rr,bBit Store from
Rerister to T
T←Rr (b)11111 101b bbbb 0bbbT
bld Rd,bBit Load from T
to Rerister
Rd (b) ←T11111 100b bbbb 0bbbNone
bset sFlag SetSREG (s) ←111001 0100 0sss 1000SREG (s)
bclr sFlag ClearSREG (s) ←011001 0100 1sss 1000SREG (s)
secSet CarryC←111001 0100 0000 1000C
clcClear CarryC←011001 0100 1000 1000C
sezSet Zero FlagZ←111001 0100 0001 1000Z
clzClear Zero FlagZ←011001 0100 1001 1000Z
senSet Negative FlagN←111001 0100 0010 1000N
clnClear Negative FlagN←011001 0100 1010 1000N
sevSet Twos Complement OverflowV←111001 0100 0011 1000V
clvClear Twos Complement OverflowV←011001 0100 1011 1000V
sesSet Signed Test FlagS←111001 0100 0100 1000S
clsClear Signed Test FlagS←011001 0100 1100 1000S
sehSet Half Carry FlagH←111001 0100 0101 1000H
clhClear Half Carry FlagH←011001 0100 1101 1000H
setSet Transfer bitT←111001 0100 0110 1000T
cltClear Transfer bitT←011001 0100 1110 1000T
seiGlobal Interrupt EnableI←111001 0100 0111 1000I
cliGlobal Interrupt DisableI←011001 0100 1111 1000I

Команды управления процессором

КомандаОписаниеДействиеЦиклыКод операцииФлаги
nopNo operation10000 0000 0000 0000None
sleepSleep11001 0101 1000 1000None
wdrWatchdog Reset11001 0101 1010 1000None

 

 

Сделаем простой AVR микроконтроллер

Меня часто спрашивают: «Чем отличается микроконтроллер от ПЛИС?» Ну что тут можно ответить? Это как бы разные вещи. .. Микропроцессор последовательно выполняет команды, описанные в его программе. Работа ПЛИС в конечном счете определяется принципиальной электрической схемой, реализованной внутри чипа. Архитектура микроконтроллера, то есть тип процессора, количество портов ввода вывода, интерфейсы, определяется производителем. Микросхема микроконтроллера изготовлена на заводе и изменить ее нельзя. Можно только написать программу, которую он будет исполнять. ПЛИС — это свобода для творчества. Архитектура реализуемого устройства может быть почти любая, лишь бы поместилась вся логика в чип. В ПЛИС можно, например, попробовать реализовать даже и микроконтроллер! Попробуем?

Один из самых распространенных микроконтроллеров — это 8-ми разрядные RISС процессоры семейства AVR компании Atmel. В этой статье я расскажу как реализовать «почти» совместимый с AVR микроконтроллер внутри нашей ПЛИС на плате Марсоход.

Прежде, чем начинать делать свою реализацию микроконтроллера, конечно, следует изучить внутренности контроллера AVR. Нужно как минимум знать систему команд микропроцессора AVR. На нашем сайте можно скачать его описание:

Система команд микроконтроллера AVR ( 703303 bytes )

Мы не будем ставить себе целью полностью повторить поведение чипа Atmel, мы хотим сделать наш микропроцессор лишь частично совместимым. Полностью повторить можно, но нужна ПЛИС гораздо большего объема. У нас на плате Марсоход стоит CPLD EPM240T100C5, значит у нас есть всего-навсего 240 триггеров и логических элементов.

Кроме триггеров и логики в нашей ПЛИС имеется последовательная флеш память UFM объемом 512 слов по 16 бит. В этой флеш памяти мы будем хранить программу микроконтроллера.  Удобно, что слова, хранимые во флеш, имеют разрядность 16. Все команды процессора AVR также шестнадцатиразрядные. Кое-что про UFM мы уже писали на нашем сайте. У нас был проект для ПЛИС платы Марсоход, который выполнял чтение из UFM памяти.

«Оперативной памяти» в нашей ПЛИС нет. Ну значит не будет памяти у нашего микроконтроллера, жаль но это нас не остановит.

У микроконтроллера AVR имеется 32 восьмиразрядных регистра общего назначения. Нижняя группа регистров r0-r15 может быть использована только в командах с операндами-регистрами. Верхняя группа регистров r16-r31 может использоваться в командах и с непосредственными операндами. Поскольку места внутри нашего чипа на плате Марсоход действительно не много, нам придется реализовать только некоторые регистры. Это довольно существенное ограничение, и его нужно будет учитывать при написании программ для нашего микроконтроллера.

Мы реализуем только 7 регистров: r16-r22:

  • Первые 4 регистра r16…r19 — это просто регистры.
  • Регистр r20 — это тоже обычный регистр, только его биты мы подключим к 8-ми светодиодам платы Марсоход.
  • Регистр r21 — это тоже обычный регистр, но его биты мы подключим к выводам управления шаговых двигателей на плате Марсоход.
  • Регистр r22 — только для чтения. К нему подключены входы от 4-х кнопочек платы Марсоход.

Схема нашего микроконтроллера создана в среде Altera QuartusII и выглядит вот так (нажмите на картинку, чтобы увеличить):


Наш микроконтроллер работает по простому алгоритму:

  1. Считывает из флеш памяти UFM очередную команду.
  2. Декодирует команду и выбирает для нее нужные операнды из регистров или непосредственно из кода команды.
  3. Выполняет команду в арифметико-логическом устройстве.
  4. Запоминает результат исполнения команды в регистре приемнике, определяемом командой.
  5. Переходит к исполнению следующей команды.

У нас сейчас нет цели сделать высокопроизводительный микроконтроллер, мы не будем делать конвейерную обработку данных. Это объясняется тем, что команды из флеш памяти чипа мы можем считывать только в последовательном формате, то есть на чтение одной команды нужно как минимум 16 тактов. Быстрее здесь сделать нельзя (да нам и не нужно сейчас).

Ход выполнения программы может изменяться в зависимости от результата исполнения команд. Специальные команды переходов позволяют переходить к нужной операции в нужных условиях.

Перечислим команды микроконтроллера AVR, которые мы собираемся реализовать:


ADD  0000 11rd dddd rrrr
SUB  0001 10rd dddd rrrr

AND  0010 00rd dddd rrrr
EOR  0010 01rd dddd rrrr
OR   0010 10rd dddd rrrr
MOV  0010 11rd dddd rrrr

CP   0001 01rd dddd rrrr
LSR  1001 010d dddd 0110

SUBI 0101 KKKK dddd KKKK
ANDI 0111 KKKK dddd KKKK
ORI  0110 KKKK dddd KKKK
CPI  0011 KKKK dddd KKKK
LDI  1110 KKKK dddd KKKK

BREQ 1111 00kk kkkk k001
BRNE 1111 01kk kkkk k001
BRCS 1111 00kk kkkk k000
BRCC 1111 01kk kkkk k000


Слева написаны названия команд, а справа — их бинарное представление (кодирование). Так буква «r» обозначает регистр источник, буква «d» — регистр приемник, «K» — это непосредственно операнд.

Конечно — это только малая часть от «настоящей системы команд», но уже и эти команды позволять писать вполне работающие программы.
У нас будет упрощенное АЛУ (Арифметико-Логическое Устройство). Оно реализует только некоторые, наиболее употребительные команды, а так же всего 2 флага для условных переходов: «Z» и «C».

Флаг «Z» устанавливается, если результат АЛУ это ноль. Если результат из АЛУ не нулевой, то флаг «Z» сбрасывается. Флаг «C» устанавливается при возникновении переноса в арифметических операциях ADD и SUB/SUBI или сравнения CP/CPI. Флаги влияют на исполнение команд условных переходов: флаг «Z» влияет на BREQ, BRNE, а флаг «C» влияет на BRCS, BRCC.

Вообще всеь проект мы уже реализовали и его можно взять здесь:

Ядро микропроцессора Atmel AVR ( 109584 bytes )

.
Исходный текст нашего ядра AVR написан на языке Verilog и его можно посмотреть здесь.

Теперь посмотрим, как мы сможем написать программу для нашего микроконтроллера? Для написания программы на языке ассемблер воспользуемся средой разработки компании Atmel AVRStudio4. Эту среду разработки можно скачать прямо с сайта компании Атмел (после регистрации), вот здесь. Или поищите в яндексе — наверняка найдете в свободном доступе.


Создаем проект в AVRStudio4 и пишем простую программу. Программа будет моргать светодиодом на плате Марсоход и опрашивать состояние нажатых кнопочек. Если нажать одну кнопочку, то моргающий светодиод «побежит» в одну сторону, а если нажать другую кнопочку, то светодиод «побежит» в другую сторону. Вот исходный текст на ассемблере для нашего примера:


.include «1200def.inc»
.device AT90S1200

.cseg
.org 0

start:

;initial one bit in register
ldi    r16,$80

rd_port:

;read port (key status)
mov    r17,r22
cpi r17,$0f
;go and blink one LED if no key pressed
breq do_xor

cpi r17,$0e
;go and right shift LEDs if key[0] pressed
breq do_rshift

cpi r17,$0d
;go and left shift LEDs if key[1] pressed
breq do_lshift

;jump to read keys
or    r16,r16
brne rd_port

do_rshift:
cpi r16,1
breq set80
lsr    r16
mov    r20,r16
brne pause
set80:    
ldi    r16,$80
mov    r20,r16
or    r16,r16
brne pause

do_lshift:
cpi r16,$80
breq set1
lsl    r16
mov    r20,r16
brne pause
set1:    
ldi    r16,$01
mov    r20,r16
or    r16,r16
brne pause

do_xor:
eor    r20,r16

pause:
ldi    r18,$10
cycle2:
ldi r19,$FF
cycle1:
or    r19,r19
or    r19,r19
subi r19,1
brne cycle1
subi r18,1
brne cycle2

or    r16,r16    
brne rd_port


Видите? Чтение состояния кнопочек — это чтение из регистра r22. Изменение состояния светодиодов — это запись в регистр r20.
Настройте AVRStudio так, что бы выходной формат был «Generic». Это в свойствах проекта, «Assembler Options», настройка «Hex Output Format».
После компиляции программы получается вот такой текстовый файл с кодами программы:


000000:e800
000001:2f16
000002:301f
000003:f0c1
000004:301e
000005:f021
000006:301d
000007:f059
000008:2b00
000009:f7b9
00000a:3001
00000b:f019
00000c:9506
00000d:2f40
00000e:f471
00000f:e800
000010:2f40
000011:2b00
000012:f451
000013:3800
000014:f019
000015:0f00
000016:2f40
000017:f429
000018:e001
000019:2f40
00001a:2b00
00001b:f409
00001c:2740
00001d:e120
00001e:ef3f
00001f:2b33
000020:2b33
000021:5031
000022:f7e1
000023:5021
000024:f7c9
000025:2b00
000026:f6d1


Этот файл нам почти подходит для QuartusII. В нашем проекте для ПЛИС есть файл avr_prog. mif (Memory Initialization File), куда мы и вставляем полученный из AVRStudio код (только нужно добавить точку с запятой в конце каждой строки). Таким образом, после компиляции QuartusII эти коды попадут во флеш  UFM нашей ПЛИС.

Теперь можно компилировать и пробовать наш проект в плате Марсоход. Вот видеоролик, демонстрирующий работоспособность нашего процессора:

Все работает так как и задумывалось!
Обратите внимание, что после компиляции, весь проект занимает только 205 логических элемента из 240 имеющихся в нашей ПЛИС. Это значит, что наш микроконтроллер можно и дальше усложнять или добавить какую-то новую логику. Так что проект может быть полезен для создания Ваших устройств.

 

Список инструкций на ассемблере AVR

9000 6 0032 ЛдЛ=24/26 /28/30, K: от 0 до 63 9003 2 SUBI Z0 -239 R0 9 0003 900 32 SBIW 33 K Двоичная константа 9 ANDI EOR 0033 бит s в константе K Rx Увеличить на единицу
Список инструкций
Мнем. P1 P2 Описание Действие Задействованные флаги Clk Ограничения Слова
Арифметические и логические операции
ADD Rx Ry Добавить регистр Rx ← Rx + Ry Z,C,N,V,S,H 1 1
АЦП Rx Ry Добавить регистр и перенос Rx ← Rx + Ry + C,0,0,C,C 32 1 1
ADIW RdL K Добавить константу в пару регистров RdH:RdL ← RdH:RdL + K Z,C,N,V,S 1
SUB Rx Ry Регистр вычитания Rx ← Rx — Ry Z,C,N,V,S,H 1 1
Rh K Вычесть постоянную Rh ← Rh — K Z,C,N,V,S,H 1 R: от 16 до 31 1
SBC Rx 90 033 Ry Вычитание и перенос Rx ← Rx — Ry — C Z 1 ,C,N,V,S,H 1 1
SBCI Rh K Вычесть константу и перенести 1 ,С,Н,В,С,Ч 1 R: с 16 по 31 1
CP Ry1 Ry2 Регистр сравнения 3
С, Н, В, С, Н 1 1
КТК Рай1 Рай2 Сравнение регистрации и переноса Ry1 — Ry2 — C Z 1 ,C,N,V,S,H 1 1
CPI Rh K Сравнить с константой Rx — K Z,C,N,V,S,H 1 R: от 16 до 31, K: от 0 до 255 1
RdL К Вычесть константу из пары регистров RdH:RdL ← RdH:RdL — K Z,C,N,V,S 2 RdL=24/26/28/30, K: от 0 до 63 1
И И3 Rx
Двоичный регистр И Rx ← Rx AND Ry Z,N,V,S 1 1
ANDI Rh Правая ← Правая UND K Z ,N,V,S 1 R: от 16 до 31, K: от 0 до 255 1
ИЛИ Rx Ry Двоичный ИЛИ Rx ← Rx ИЛИ Ry Z,N,V,S 13 13 100046
ORI Rh K Бинарный OR с константой Rh ← Rh OR K Z,N,V,S 1 R: от 16 до 31, K: от 0 до 255 1
Рай Исключающее ИЛИ Rx ← Rx XOR Ry Z,N,V,S 1 1
COM Rx Дополнение до единицы Rx ← 255 — Rx Z,C,N,V,S 1 1
НЕТ Rx Дополнение до двух Rx ← 256 — Rx Z,C,N,V,S,H 1 1
SBR Rh K Набор бит в константе K Rh ← Rh OR K Z,N,V,S 1 R: от 16 до 31, K: от 0 до 255 1
CBR Rh Rh ← Rh AND (NEG K) Z,N,V,S 1 R: от 16 до 31, K: от 0 до 255 1
INC Rx ← Rx + 1 Z,N,V,S 1 1
ДЕК Rx Уменьшение на единицу Rx ← Rx — 1 Z,N,V,S 1ST 1
3 T 032 Ry 900 32 З,Н,В,С 1 MUL Ry1 * Ry2 9 0032 2 90SU2 033 DES 033 9003 2 —3 K3 3 K: -20042 K: -20048 3/4/5 32 RETI 9 — 3 BRHS3 9003EG — 90:Rx Rxy+1 R3 1 6 31, К: от 0 до 255 3x2 байт адрес 90RAM X+ X и инкрементный адрес 3 0 3 0 4 9 0 0/2 0032 1 900 32 -Y 033 R9 0 LD 3 3h A 91 900 32 — Адрес SRAM (Y+K ) 3x3 Z2
Сравнить с нулем Rx ИЛИ Rx Z,N,V,S 1 1
CLR Rx Очистить все биты 9033 3 Rx 1 1
СЕР Правая Установить все биты Rh ← 255 1 R: с 16 по 31 1
Ry2 Умножить 8 бит R1:R0 ← Ry1 * Ry2 Z,C 2 1
MULS Ry1 Ry2 Z,C 2 Ry1, Ry2: с 16 по 31 1
MULSU Rx Ry Умножение без знака и со знаком R1:R0 ← Ry1 * Ry2 Z,C Ry1, Ry2: от 16 до 31 1
FMUL Ry1 Ry2 Умножение с плавающей запятой R1:R0 ← Ry1 * Ry2 Z,C 2 Ry1,R y2: с 16 по 23 1
FMULS Ry1 Рай2 Умножение с плавающей запятой со знаком R1:R0 ← Ry1 * Ry2 Z,C 2 Ry1,Ry2: от 16 до 23 1
Ry1 Ry2 С плавающей запятой умножение со знаком и без знака R1:R0 ← Ry1 * Ry2 Z,C 2 Ry1,Ry2: от 16 до 23 1
Кодирование и декодирование данных (R7:R0, R15:R8) 1/2 (только MEGA/XMEGA), K<16 1
Флаг Z устанавливается в единицу, если эта инструкция дала ноль И если он был установлен предыдущей инструкцией. Это позволяет проводить 16-битные сравнения.
Инструкции перехода
RJMP K Относительный переход (ПК) ← (ПК) +/- K 2 К: от -2048 до 2047 1
IJMP Косвенный переход (ПК) ← Z 2 1
4JMP 6 Расширенный непрямой прыжок (ПК) ← EIND + Z 2 (только XMEGA) 1
JMP K Прямой (широкий) прыжок (PC) ← 9 К: от 0 до 65535 2
RCALL K Относительный вызов (стек) ← (ПК), (ПК) ← (ПК) +/- K 2/3/4 1
ICALL Косвенный вызов (стек) ← (ПК), (ПК) ← Z 6 2 3 9 0
ЭЙКЛ Расширенный непрямой вызов (стек) ← (ПК), (ПК) ← EIND+Z 3/4 1
ВЫЗОВ K Общий вызов (стек) ← (ПК), 903 — 9 K 2
RET Возврат после звонка (ПК) ← (Стопка) 4 3
Возврат из процедуры обработки прерывания (ПК ) ← (стек), I ← 1 4 1
CPSE Ry1 Ry2 Перейти на следующую инструкцию, если равно Ry1=Ry2: (ПК) ← (ПК + 2) 2/ 3 1
SBRC Ry B Переход к следующей инструкции, если бит очищен (Бит)=0: (ПК) ← (ПК+2) ) 2/3 1
СБРС Рай B Переход к следующей инструкции, если бит установлен 032 ПЛ B Переход через следующую инструкцию, если бит порта очищен номер B Переход к следующей инструкции, если бит порта установлен (Бит)=1: (ПК) ← (ПК+1) 2/3 1
BRBS K B Относительный переход, если бит в SREG установлен 9003it3): ПК) ← (ПК) + /- K 1/2 K: от -63 до + 64 1
BRBC K B 9003 Бит, если очистить EG относительный переход 3 0033 (SREG-бит= 0): (ПК) ← (ПК) +/- K 1/2 K: от -63 до + 64 (SREG-Z=1): (PC) ← (PC) +/- K — 900 33 1/2 K: от -63 до + 64 1
BRNE K Относительный скачок, если Z в SREG очистить (SREG-Z=0): (PC) (PC) ( ПК) +/- К 1/2 K: от -63 до + 64 1
BRCS K Относительный переход, если C в наборе SREG.
BRCC K Относительный переход, если C в SREG очистить (SREG-C=0): (PC) ← (PC) +/- K K 1/23 : От -63 до + 64 1
БРШ K Относительный скачок, если C в SREG очистить (SREG-C=0): (PC) ← (PC) +/- K 1/2 K: от -63 до + 64 1
BRLO K Относительный переход, если C в SREG установлен (SREG-C=1): (PC ) ← (ПК) +/- K 1/2 K: от -63 до + 64 1
BRMI K Относительный переход, если в SREG установлено N ( SREG-N=1): (PC) ← (PC) +/- K 1/2 K: от -63 до + 64 1
BRPL K Относительный переход при сбросе Z в SREG (SREG-N=1): (PC) ← (PC) +/- K 3 K 9 9 032 1/2 : от -63 до + 64 1
BRGE K Относительный переход, если S в SREG очистить (SREG-S=0): (PC) ← (PC) +/- K 1/2 K: от -63 до + 64 1
BRLT K Относительный переход, если S в наборе SREG (SREG-S=1): (PC) ← (PC) +/- K 1/2 K: от -63 до + 64 1
Относительный скачок, если H в SREG установлен
BRHC K Относительный переход при сбросе H в SREG (SREG-H=0): (PC) ← (PC) +/- K 1/2 1/2(PC) K 1/2 K: от -63 до + 64 1
BRTC K Относительный переход, если T 2 (СРЭГ-Т=0): ( ПК) ← (ПК) +/- К 1/2 К: от -63 до + 64 1
БРВС K Относительный скачок, если V в SREG установлен (SREG-V=0): (PC) ← (PC) +/- K 2 K: от -63 до + 64 1
BRIE K Относительный переход, если I в наборе SREG (SREG-I=1): (PC) ← (PC) +/- K 1/2 K: от -63 до + 64 1
BRID 3 K 3 Относительный переход, если I в сбросе SREG (SREG-I=0): (PC) ← (PC) +/- K 1/2 K: от -63 до + 64 1
Инструкции по копированию и загрузке данных
MOV Rx Ry Регистр копирования Rx ← Ry 1 1
MOVW Rx Ry Пара регистров копирования 1 Rx, Ry: Четный 1
LDI Правая K Постоянная нагрузки Правая ← K
1
LDS Rh A Копировать байт SRAM Rx ← (SRAM-A) 2/3/4 R: с 16 по 31 2
LD
X Копировать байт SRAM вкл. адрес X Rx ← (X) 2/3/4 1
LD Rx
Rx ← ( Х), Х = Х + 1 2/3 1
LD Rx -X Уменьшить X и скопировать байт SRAM с адреса X 033 1
LD Rx Y Копировать байт SRAM по адресу Y Rx ← (Y)
LD Rx Y+ Скопировать байт SRAM по адресу Y и увеличить адрес Rx ← (Y), Y = Y + 1 2/3 1
LD Rx Уменьшить Y и скопировать байт SRAM по адресу Y Y = Y — 1, Rx ← (Y) 2/3/4 1
LDD Rx Y+K 90 033 Копировать байт SRAM из адреса (Y+K) Rx ← (Y+K) 2/3 K: от 0 до 63 1
LD Rx Z Копировать байт SRAM с адреса Z Rx ← (Z) 1 9036 2/3/4
LD Rx Z+ Скопировать байт SRAM с адреса Z и увеличить адрес Rx ← (Z), Z = Z + 1 2/3 1
Уменьшить Z и скопировать байт SRAM с адреса Z Z = Z — 1, Rx ← (Z) 2/3/4 1
LDD Rx 3 Копия 20 Байт ОЗУ по адресу (Z+ K) Rx ← (Z+K) 2/3 K: от 0 до 63 1
STS Копировать в SRAM (SRAM- A) ← Rx 2/3/4 R: от 16 до 31 2
ST X+ Rx Копировать в адрес SRAM в X и увеличить адрес (X) ← Rx, X = X + 1 2/3 1
ST -X Rx Уменьшение X и скопировать на адрес SRAM X X = X — 1, (X) ← Rx 2/3/4 1
ST Y Rx Копировать в адрес SRAM Y 9 0033 (Y) ← Rx 2/3/4 1
ST Rx Y+ Копировать по адресу Y и увеличить Y (Y) ← Rx, Y = Y + 1 2/3 1
ST Rx -Y Уменьшить Y и скопировать на адрес SRAM Y Y = Y — 1, (Y) ← Rx 2/3/4 1
STD Y+K 3 Копировать 3 (Y+K) ← Rx 2/3 K: от 0 до 63 1
ST
Скопировать в SRAM адрес Z (Z ) ← Rx 2/3/4 1
ST Z+ Rx Копировать в SRAM адрес Z и увеличить Z (Z) ← Rx, Z = Z + 1 2/3 1
3 ST 32 -Z 3K 903 ZSTD 90+ 3 3 0032 1 3 032 Копировать из адреса расширенной памяти программ ( EIND+Z) для регистрации Копировать адрес программы Z+ ) для регистрации и увеличения Z33 900 ) R 90 LAS 033 3 Rx3 Z2 регистр ИЛИ и SRAM (Z) и обмен SLx32 00332 Rx 3) (7:4) 0032 — B Очистить бит в SREG B 90 33 — 90 — 3 1 1 33
Ркс Уменьшить Z и скопировать в адрес SRAM Z Z = Z — 1, (Z) ← Rx 2/3/4 1
Rx Копировать в адрес SRAM (Z+K) (Z+K) ← Rx 2/3 K: от 0 до 63 1
LPM Копировать из памяти программ по адресу (Z) в R0 Z09 ← 0032 R09 3 1
LPM Rx Z Копировать из памяти программ адрес (Z) в регистр Rx ← (Flash Z)
л/мин Rx Z+ Копировать адрес памяти программы (Z) в регистр и увеличить Z Rx ← (Flash Z), Z = Z + 1 3 1
3 ELPM Копировать из адрес расширенной памяти программ (EIND+Z) для регистра R0 R0 ← (Flash Z) 3 1
ELPM Rx Rx ← (Flash Z) 3 1
ELPM Rx Z+ Rx ← (Flash Z), Z = Z + 1 3 1
SPM Копировать слово R1:R0 в адрес программной памяти (Z) 9003 9003 :R0 N 1
SPM Z+ Скопировать слово R1:R0 в адрес памяти программ (Z) и увеличить Z 3 1
IN Rx P Копировать байт порта Rx ← P 3 9: 0 9 0032 3 9 3 1
ВЫХОД П Rx Скопировать байт в порт P ← Rx 1 P: от 0 до 63 1
PUSH Rx PUSH Rx (стек) ← Rx, SP = SP — 1 2 1
POP Rx Копировать из стека и инкрементировать (SP)
2 1
ХСН Z Rx Регистр обмена с адресом SRAM (Z) Rx ↔ (Z) 1 1
Z Rx ИЛИ регистр и SRAM (Z) и замена Rx ← Rx ODER (Z), (Z) ↔ Rx 1 1
LAC
И дополнительный регистр с SRAM (Z ) и скопировать в SRAM (Z) Rx ← (255-Rx) UND (Z), (Z) ↔ Rx 1 1
LAT Z, Rx EXOR (Z), Rx ↔ (Z) 1 1
Битовые операции
Логический сдвиг влево Rx ← Rx * 2 Z,C,N,V,H 1 1
LSR Rx Логический сдвиг вправо Rx ← Rx / 2 Z,C,N,V 16 06
ROL Rx Бинарный поворот слева с C Rx ← Rx * 2 с битом 0 = C/C = бит 7 Z,C,N,V,H 1 1
ROR 3 3 0032 Двоичный повернуть вправо с C Rx ← Rx / 2 с битом 7 = C/C = бит 0 Z,C,N,V 1 1
ASR Rx Арифметический сдвиг вправо 6 = 0 Z ,C,N,V 1 1
SWAP Rx Обмен старшим и нижним полубайтами 1 1
BSET B Установить бит в SREG SREG ← SREG OR (1< 1 B: от 0 до 7 1
BCLR SREG ← SREG И ( 255-(1< 1 B: от 0 до 7 1
SBI PL PL ← PL ИЛИ (1 < 2 PL: от 0 до 31, B: от 0 до 7 1
CBI PL B Чистая насадка в порту PL ← PL AND (255-(1< 3 3 PL: от 0 до 31, B: от 0 до 7 1
BST Rx B Копировать бит регистра в T SREG-T ← Rx-Bit B 0033 Б: от 0 до 7 1
BLD Rx B Копировать T в регистр, бит Rx-Bit B ← T 1 B: от 0 до 7 1
SEC C SREG 303 900 Набор 32 SREG-бит C ← 1 1 1
CLC Прозрачный SREG C SREG-Bit C ← 0
SEN Комплект SREG N SREG- Бит N ← 1 1 1
CLN Прозрачный SREG N SREG-Bit N ← 0 9003 3 1 10033 — 1
СЭЗ Комплект СРЭГ Z SREG-Bit Z ← 1 1 1
CLZ Прозрачный SREG 90 Z33 033 1 1
SEI Набор SREG I SREG-Bit I ← 1 1 1
6
6 — 9 3 900 06 3 — SREG0-Bit 0046
Очистить SREG I SREG-Bit I ← 0 1 1
SES Набор SREG S SREG-Bit S ← 1 1
CLS Прозрачный SREG S SREG-Bit S ← 0 1 1
SEV Набор SREG V SREG-Bit V ← 1 1 1
CLV Clear SREG V SREG-Bit V ← 0 1 1
НАБОР Набор SREG T SREG-Bit T ← 1 1 1
CLT Прозрачный SREG T SREG-Bit T ← 0 1 1
SEH Комплект SREG H SREG- Бит H ← 1 1 1
CLH Очистить SREG H 1 1
Инструкции по контроллеру
BREAK Останов выполнения, управление отладчику 1 1
Ничего не делать 1 1
СОН Сон 1 1
WDR9 0 сторожевой таймер Счетчик WDR ← 0 1 1

AVR Tutorial — AVRDUDE

Хорошо, теперь у вас есть целевая плата и программатор, затем вы будете использовать программное обеспечение, которое вы установили на шаге 2, чтобы поговорить с чипом. Это программное обеспечение очень мощное, но его сложно использовать в первый раз. Тем не менее, вы должны проявить настойчивость, и через несколько раз им станет (легче) пользоваться.

Комментарии? Предложения? Пишите на форум!

Avrdude — это программа командной строки, поэтому вам придется вводить все команды (позже вы узнаете, как это сделать с помощью Makefile)

Под Windows, вам нужно открыть командное окно, выбрать Run… в меню «Пуск», ввести cmd и нажать OK .

В MacOS X вы можете использовать программу Terminal для вызова интерфейса командной строки, она находится в папке Utilities

Теперь в новом окне терминала введите avrdude, вы должны получить этот ответ что в основном представляет собой простой список того, что может сделать avrdude…

Есть много вариантов, давайте быстро их рассмотрим. Не пытайтесь запомнить их, просто поймите, что некоторые из них могут делать.

  • -p : Это просто для того, чтобы указать, какой микроконтроллер запрограммирован. Например, если вы программируете ATtiny2313, используйте attiny2313 как номер детали
  • .
  • -b : это для переопределения скорости последовательной передачи для программистов, таких как STK500. Не используйте этот переключатель, значение по умолчанию правильное.
  • -B <битрейт>: это для изменения битрейта, то есть скорости, с которой программатор общается с чипом. Если ваш чип работает очень медленно, вам нужно говорить с ним медленно, чтобы он не отставал. Об этом позже, а пока не пользуйтесь.
  • -C <файл-конфигурации>: Файл конфигурации сообщает avrdude обо всех различных способах общения с программистом. Существует файл конфигурации по умолчанию, так что давайте просто использовать его: не используйте этот командный переключатель
  • -c : здесь мы указываем тип программатора, если вы используете STK500, используйте stk500, если вы используете программатор DT006, используйте dt006 и т. д.
  • -D: отключает стирание чипа перед программированием. Нам это не нужно, поэтому не используйте этот командный переключатель.
  • -P <порт>: это коммуникационный порт, используемый для связи с программатором. Это может быть COM1 для последовательного или LPT1 для параллельного или USB для USB.
  • -F: Это отменяет проверку подписи, чтобы убедиться, что чип, который, как вы думаете, вы программируете. Настоятельно рекомендуется выполнить тест, так как он проверяет соединение, поэтому не используйте этот переключатель.
  • -e: это стирает чип, обычно мы не используем это, потому что мы автоматически стираем флэш-память перед программированием.
  • -U :r|w|v:[:format]: ОК, это важная команда. Это тот, который на самом деле занимается программированием. — это либо flash, либо eeprom (или hfuse, lfuse или efuse для предохранителей конфигурации чипа, но мы не будем с ними связываться). r|w|v означает, что вы можете использовать r (чтение), w (запись) или v (проверка) в качестве команды. — это файл, в который вы хотите записать или прочитать. и [:format] означает, что есть необязательный флаг формата. Мы всегда будем использовать формат «Intel Hex», поэтому используйте i
    Так, например. Если вы хотите записать файл test.hex во флэш-память, вы должны использовать -U flash:w:test.hex:i. Если вы хотите прочитать память eeprom в файл «eedump.hex», вы должны использовать -U eeprom:r:eedump.hex:i
  • -n: Это означает, что вы на самом деле ничего не пишете, это хорошо, если вы хотите убедиться, что вы не отправляете никаких других команд, которые могут повредить чип, своего рода «предохранитель».
  • -V: отключает автоматическую проверку при записи. Мы хотим проверять, когда мы записываем во флэш-память, поэтому не используйте это.
  • -u: Если вы хотите изменить фьюз-биты, используйте этот переключатель, чтобы сказать, что вы действительно это имеете в виду.
  • -t: это «терминальный» режим, в котором вы можете вводить команды подряд. Не используйте это, это сбивает с толку новичков.
  • -E: Здесь перечислены некоторые спецификации программатора, не используйте его.
  • -v: Это дает вам «подробный» вывод… на случай, если вы хотите что-то отладить. Если хотите, можете использовать его, но в целом мы не будем.
  • -q: Противоположно предыдущему, меньше выходных данных. В общем, мы не будем его использовать, но, возможно, через некоторое время вы захотите.

Те, которые вы будете использовать в 99% случаев, выделены красным. Давайте рассмотрим их более подробно

Чтобы получить список поддерживаемых программистов, введите avrdude -c asdf ( asdf — это просто какая-то ерунда, чтобы заставить его выдать список программистов) Вот мой вывод, ваш может немного различаться. Не утруждайте себя запоминанием, просто пролистайте список.

C:\>avrdude -c asdf

avrdude: не удается найти идентификатор программиста «asdf»

Допустимые программисты:
dasa3 = сбой последовательного порта, reset=!dtr sck=rts mosi=txd miso=cts [C:\WinAVR\bin\avrdude.conf:763]
dasa = стук последовательного порта, reset=rts sck=dtr mosi=txd miso=cts [C:\WinAVR\bin\avrdude.conf:750]
siprog = Lancos SI-Prog [C:\WinAVR\bin\avrdude.conf:737]
ponyser = дизайн серийного номера ponyprog, reset=!txd sck=rts mosi=dtr miso=cts [C:\WinAVR\bin\avrdude.conf:724]
frank-stk200 = Фрэнк STK200 [C:\WinAVR\bin\avrdude.conf:689]
blaster = Altera ByteBlaster [C:\WinAVR\bin\avrdude.conf:676]
ere-isp-avr = ERE ISP-AVR [C:\WinAVR\bin\avrdude.conf:666]
atisp = кабель для программирования AT-ISP V1. 1 для AVR-SDK1 с [C:\WinAVR\bin\avrdude.conf:656]
dapa = Кабель прямого параллельного доступа AVR [C:\WinAVR\bin\avrdude.conf:645]
xil = JTAG-кабель Xilinx [C:\WinAVR\bin\avrdude.conf:632]
futurlec = кабель для программирования Futurlec.com. [C:\WinAVR\bin\avrdude.conf:615]
abcmini = Плата ABCmini, также известная как Dick Smith HOTCHIP [C:\WinAVR\bin\avrdude.conf:605]
picoweb = Кабель для программирования Picoweb, http://www.picoweb.net/ [C:\WinAVR\bin\avrdude.conf:595]
sp12 = программист Стива Болта [C:\WinAVR\bin\avrdude.conf:584]
alf = Nightshade ALF-PgmAVR, http://nightshade.homeip.net/ [C:\WinAVR\bin\avrdude.conf:568]
bascom = кабель для программирования Bascom SAMPLE [C:\WinAVR\bin\avrdude.conf:558]
dt006 = Dontronics DT006 [C:\WinAVR\bin\avrdude.conf:548]
pony-stk200 = Pony Prog STK200 [C:\WinAVR\bin\avrdude. conf:536]
stk200 = STK200 [C:\WinAVR\bin\avrdude.conf:520]
bsd = программист Брайана Дина, http://www.bsdhome.com/avrdude/ [C:\WinAVR\bin\avrdude.conf:509]
pavr = программатор серийного номера pAVR Джейсона Кайла [C:\WinAVR\bin\avrdude.conf:501]
dragon_dw = Atmel AVR Dragon в режиме debugWire [C:\WinAVR\bin\avrdude.conf:494]
dragon_hvsp = Atmel AVR Dragon в режиме HVSP [C:\WinAVR\bin\avrdude.conf:486]
dragon_pp = Atmel AVR Dragon в режиме PP [C:\WinAVR\bin\avrdude.conf:478]
dragon_isp = Atmel AVR Dragon в режиме ISP [C:\WinAVR\bin\avrdude.conf:470]
dragon_jtag = Atmel AVR Dragon в режиме JTAG [C:\WinAVR\bin\avrdude.conf:462]
jtag2dw = Atmel JTAG ICE mkII в режиме debugWire [C:\WinAVR\bin\avrdude.conf:454]
jtag2isp = Atmel JTAG ICE mkII в режиме ISP [C:\WinAVR\bin\avrdude.conf:446]
jtag2 = Atmel JTAG ICE mkII [C:\WinAVR\bin\avrdude. conf:438]
jtag2fast = Atmel JTAG ICE mkII [C:\WinAVR\bin\avrdude.conf:430]
jtag2slow = Atmel JTAG ICE mkII [C:\WinAVR\bin\avrdude.conf:422]
jtagmkII = Atmel JTAG ICE mkII [C:\WinAVR\bin\avrdude.conf:414]
jtag1slow = Atmel JTAG ICE (mkI) [C:\WinAVR\bin\avrdude.conf:407]
jtag1 = Atmel JTAG ICE (mkI) [C:\WinAVR\bin\avrdude.conf:399]
jtagmkI = Atmel JTAG ICE (mkI) [C:\WinAVR\bin\avrdude.conf:391]
avr911 = Atmel AppNote AVR911 AVROSP [C:\WinAVR\bin\avrdude.conf:385]
avr109 = загрузчик Atmel AppNote AVR109 [C:\WinAVR\bin\avrdude.conf:379]
бабочка = Atmel Butterfly Development Board [C:\WinAVR\bin\avrdude.conf:373]
usbtiny = USBtiny простой программатор USB [C:\WinAVR\bin\avrdude.conf:367]
usbasp = USBasp, http://www.fischl.de/usbasp/ [C:\WinAVR\bin\avrdude.conf:361]
avr910 = недорогой серийный программатор Atmel [C:\WinAVR\bin\avrdude. conf:355]
stk500hvsp = Atmel STK500 V2 в режиме высоковольтного последовательного программирования [C:\WinAVR\bin\avrdude.conf:349]
stk500pp = Atmel STK500 V2 в режиме параллельного программирования [C:\WinAVR\bin\avrdude.conf:343]
stk500v2 = прошивка Atmel STK500 версии 2.x [C:\WinAVR\bin\avrdude.conf:337]
stk500v1 = прошивка Atmel STK500 версии 1.x [C:\WinAVR\bin\avrdude.conf:331]
stk500 = Atmel STK500 [C:\WinAVR\bin\avrdude.conf:325]
avrisp2 = Atmel AVR ISP mkII [C:\WinAVR\bin\avrdude.conf:315]
avrispmkII = Atmel AVR ISP mkII [C:\WinAVR\bin\avrdude.conf:309]
avrispv2 = Atmel AVR ISP V2 [C:\WinAVR\bin\avrdude.conf:303]
avrisp = Atmel AVR ISP [C:\WinAVR\bin\avrdude.conf:297]

Вы заметите, что упомянутые ранее программисты перечислены здесь, в том числе AVRISP , AVRISPV2 , STK500 , Dragon , DASA/DASA3/PONYSER , DASA/DASA3/PONYSER ( DASA/DASA3/PONYSER ( DASA/DASA3/PONYSER , DASA3/PONYSER , DASA3/PONYSER (SERAMIN dt006/stk200 (программисты для параллельного порта)

Найдите имя используемого вами программатора и примите его к сведению!

Чтобы получить список частей, поддерживаемых avrdude, введите avrdude -c avrisp (это не имеет значения, если вы не используете программатор avrisp) без номера детали в командной строке. Не запоминайте этот список, просто просмотрите его, чтобы получить представление о поддерживаемых микросхемах.

C:\>avrdude -c avrisp
avrdude: Часть AVR не указана, используйте «-p Part»

Допустимые детали:
m6450 = ATMEGA6450 [C:\WinAVR\bin\avrdude.conf:10974]
m3250 = ATMEGA3250 [C:\WinAVR\bin\avrdude.conf:10785]
m645 = ATMEGA645 [C:\WinAVR\bin\avrdude.conf:10596]
m325 = ATMEGA325 [C:\WinAVR\bin\avrdude.conf:10407]
usb1287 = AT90USB1287 [C:\WinAVR\bin\avrdude.conf:10219]
usb1286 = AT90USB1286 [C:\WinAVR\bin\avrdude.conf:10030]
usb647 = AT90USB647 [C:\WinAVR\bin\avrdude.conf:9841]
usb646 = AT90USB646 [C:\WinAVR\bin\avrdude.conf:9651]
t84 = ATtiny84 [C:\WinAVR\bin\avrdude.conf:9468]
t44 = ATtiny44 [C:\WinAVR\bin\avrdude.conf:9286]
t24 = ATtiny24 [C:\WinAVR\bin\avrdude.conf:9104]
m2561 = ATMEGA2561 [C:\WinAVR\bin\avrdude. conf:8911]
m2560 = ATMEGA2560 [C:\WinAVR\bin\avrdude.conf:8718]
m1281 = ATMEGA1281 [C:\WinAVR\bin\avrdude.conf:8530]
m1280 = ATMEGA1280 [C:\WinAVR\bin\avrdude.conf:8341]
m640 = ATMEGA640 [C:\WinAVR\bin\avrdude.conf:8153]
t85 = ATtiny85 [C:\WinAVR\bin\avrdude.conf:7972]
t45 = ATtiny45 [C:\WinAVR\bin\avrdude.conf:7793]
t25 = ATtiny25 [C:\WinAVR\bin\avrdude.conf:7613]
pwm3 = AT90PWM3 [C:\WinAVR\bin\avrdude.conf:7431]
pwm2 = AT90PWM2 [C:\WinAVR\bin\avrdude.conf:7247]
t2313 = ATtiny2313 [C:\WinAVR\bin\avrdude.conf:7060]
m168 = ATMEGA168 [C:\WinAVR\bin\avrdude.conf:6872]
m88 = ATMEGA88 [C:\WinAVR\bin\avrdude.conf:6686]
m48 = ATMEGA48 [C:\WinAVR\bin\avrdude.conf:6499]
t861 = ATTINY861 [C:\WinAVR\bin\avrdude.conf:6311]
t461 = ATTINY461 [C:\WinAVR\bin\avrdude.conf:6122]
t261 = ATTINY261 [C:\WinAVR\bin\avrdude. conf:5933]
t26 = ATTINY26 [C:\WinAVR\bin\avrdude.conf:5776]
m8535 = ATMEGA8535 [C:\WinAVR\bin\avrdude.conf:5618]
m8515 = ATMEGA8515 [C:\WinAVR\bin\avrdude.conf:5460]
m8 = ATMEGA8 [C:\WinAVR\bin\avrdude.conf:5300]
m161 = ATMEGA161 [C:\WinAVR\bin\avrdude.conf:5160]
m32 = ATMEGA32 [C:\WinAVR\bin\avrdude.conf:4985]
m6490 = ATMEGA6490 [C:\WinAVR\bin\avrdude.conf:4792]
m649 = ATMEGA649 [C:\WinAVR\bin\avrdude.conf:4607]
m3290 = ATMEGA3290 [C:\WinAVR\bin\avrdude.conf:4424]
m329 = ATMEGA329 [C:\WinAVR\bin\avrdude.conf:4239]
m169 = ATMEGA169 [C:\WinAVR\bin\avrdude.conf:4059]
m163 = ATMEGA163 [C:\WinAVR\bin\avrdude.conf:3916]
m162 = ATMEGA162 [C:\WinAVR\bin\avrdude.conf:3720]
m644 = ATMEGA644 [C:\WinAVR\bin\avrdude.conf:3530]
m324 = ATMEGA324 [C:\WinAVR\bin\avrdude.conf:3338]
m164 = ATMEGA164 [C:\WinAVR\bin\avrdude. conf:3146]
m16 = ATMEGA16 [C:\WinAVR\bin\avrdude.conf:2968]
c128 = AT90CAN128 [C:\WinAVR\bin\avrdude.conf:2777]
m128 = ATMEGA128 [C:\WinAVR\bin\avrdude.conf:2599]
m64 = ​​ATMEGA64 [C:\WinAVR\bin\avrdude.conf:2418]
m103 = ATMEGA103 [C:\WinAVR\bin\avrdude.conf:2278]
8535 = AT90S8535 [C:\WinAVR\bin\avrdude.conf:2157]
8515 = AT90S8515 [C:\WinAVR\bin\avrdude.conf:2043]
4434 = AT90S4434 [C:\WinAVR\bin\avrdude.conf:1960]
4433 = AT90S4433 [C:\WinAVR\bin\avrdude.conf:1836]
2343 = AT90S2343 [C:\WinAVR\bin\avrdude.conf:1712]
2333 = AT90S2333 [C:\WinAVR\bin\avrdude.conf:1627]
2313 = АТ90S2313 [C:\WinAVR\bin\avrdude.conf:1514]
4414 = AT90S4414 [C:\WinAVR\bin\avrdude.conf:1401]
1200 = AT90S1200 [C:\WinAVR\bin\avrdude.conf:1286]
t15 = ATtiny15 [C:\WinAVR\bin\avrdude.conf:1153]
t13 = ATtiny13 [C:\WinAVR\bin\avrdude. conf:980]
t12 = ATtiny12 [C:\WinAVR\bin\avrdude.conf:847]
t11 = ATtiny11 [C:\WinAVR\bin\avrdude.conf:783]

Это все фишки, что avrdude знает об этом. Почти все они программируются провайдером.

Осторожно : t2313 и 2313 , m8 и m88 , c128 и m 128 и т. д. внешне очень похожи, но на самом деле это совершенно разные чипы! По этой причине я предлагаю вам ввести название чипа, то есть вместо t2313 использовать attiny2313 или m8 использовать atmega8 . Avrdude достаточно умен, чтобы понять, что вы имеете в виду, если наберете полное имя.

Мы собираемся использовать ATtiny2313 , поэтому используйте номер детали attiny2313 или ( t2313 )

Дважды проверьте, какой чип вы используете, посмотрев на верхнюю часть чипа, там написано ATTINY2313 и ATMEGA соответственно) -20PI и -16PC — это просто рейтинги скорости и описания пакетов, поэтому пока игнорируйте их.

 

Этот переключатель сообщает avrdude, где искать ваш программатор. Если вы используете устройство, подключенное через USB, вы можете просто использовать -P usb или не указывать. Программатор автоматически определяет, когда программатор является USB-устройством.

Если вы используете программатор с параллельным или последовательным портом, вы должны использовать эту опцию, чтобы указать, к какому порту подключен программатор. В 99% случаев это lpt1 (параллельный) или com1 (последовательный), но вы всегда можете проверить это, заглянув в диспетчер устройств . Откройте панель управления Свойства системы

Нажмите Диспетчер устройств и откройте подменю Порты .

Перечислены все последовательные и параллельные порты. Может быть несколько COM-портов, но обычно есть только один параллельный (принтерный) порт.

Для компьютеров Mac параллельные порты отсутствуют. Однако, если вы используете последовательный USB-адаптер (который позволяет использовать STK500 или AVRISP v1 с Mac), вам необходимо указать последовательный порт. Я еще не знаю надежного способа, но я делаю это в Терминал Я набираю ls -l /dev/cu.* и он выдает кучу всего (я испортил снимок экрана, перед этим изображением есть еще одно окно, но просто игнорируйте его)

/dev/cu.Bluetooth — это встроенный модуль Bluetooth, не используйте его. /dev/cu.modem — это модем (если он есть), его тоже не используйте. То, что вы ищете, это что-то вроде /dev/cu.usbserial или /dev/cu.KeySerial1 или что-то подобное. В данном случае это /dev/cu.usbserial-FTCTYG5U

Хорошо, мы подошли к важной части. Вот тут-то мы и начинаем рассказывать avrdude , как поместить данные в чип. Эта команда довольно сложная, но мы разберем ее.

— может быть flash , eeprom, hfuse (высокий предохранитель), lfuse (низкий предохранитель) или efuse 2|9v2 (удлиненный предохранитель)

20 — можно р (читать), w (запись), v (проверка)
— входной (запись или проверка) или выходной файл (чтение)
[:format] — необязательный, формат файла. Вы можете оставить это значение отключенным для записи, но для чтения используйте i для Intel Hex (преобладающий стандарт)

Например:

  • Чтобы записать файл с именем firmware.hex во флэш-память, используйте команду: U flash:w:firmware.hex
  • : Чтобы проверить файл с именем mydata. eep из eeprom, используйте команду -U eeprom:v:mydata.eep
  • Чтобы прочитать низкий предохранитель в файл, используйте команду -U lfuse:r:lfusefile.hex:i

Хватит болтать. Пришло время запрограммировать прошивку в чип!

Подготовьте целевую плату AVR к работе, в этом примере мы будем использовать attiny2313 , но, конечно, вы должны заменить чип, который используете (в этом случае код, вероятно, ничего не сделает). Убедитесь, что устройство питается либо от батареек, либо от сетевой розетки, либо от программатора, если программатор может это сделать.

Загрузите файл test_leds.hex и поместите его в C:\ (Windows) или ваш домашний каталог (Mac)

Выясните, какой программатор вы используете и к какому порту он подключен (в этом примере я буду с помощью usbtinyisp, но все в порядке.) Поскольку usbtinyisp — это программатор USB, я могу не использовать переключатель -P .

введите avrdude -c usbtiny -p attiny2313 -U flash:w:test_leds.hex

  • Если вы используете параллельный программатор DT006 (например, MiniPOV2), вы, вероятно, захотите использовать команду вида avrdude -c dt006 -P lpt1 -p attiny2313 -U flash:w:test_leds.hex
  • Если вы используете последовательный программатор Bitbang DASA (например, MiniPOV3), вы, вероятно, захотите использовать команду вроде avrdude -c dasa -P com1 -p attiny2313 -U flash:w:test_leds.hex
  • Если вы используете программатор STK500 devboard, вы, вероятно, захотите использовать такую ​​команду, как avrdude -c stk500 -P com1 -p attiny2313 -U flash:w:test_leds.hex
  • Если вы используете USB-программатор AVRISP v2, вы, вероятно, захотите использовать такую ​​команду, как avrdude -c avrispv2 -p attiny2313 -U flash:w:test_leds.hex
  • и т.д…

Avrdude должен пройти следующие шаги:

  1. Инициализация программатора (вы не увидите этого, если он работает)
  2. Инициализация устройства AVR и проверка его готовности к инструкциям
  3. Чтение подписи устройства ( 0x1e910a ), которая подтверждает, что указанный вами в командной строке чип ( attiny2313 ) на самом деле чип к которому подключен программатор
  4. Стирание чипа
  5. Чтение файла и проверка правильности файла
  6. Запись flash
  7. Проверка флэш-памяти

Fuse memory — это отдельный блок флэш-памяти, в который не записывается запись при обновлении микропрограммы. Вместо этого 3 предохранителя, как правило, устанавливаются один раз (хотя их можно устанавливать столько раз, сколько вы хотите). Фьюзы определяют такие параметры, как тактовая частота, тип кристалла, включен ли JTAG, уровень снижения напряжения (минимальное напряжение) и т. д. Для получения дополнительной информации о фьюзах вы можете прочитать о них здесь.

Сначала вам нужно рассчитать предохранители с помощью очень удобного калькулятора предохранителей AVR

Для программирования предохранителей используйте:

avrdude -c usbtiny -p attiny2313 -U lfuse:w::m
avrdude -c usbtiny -p attiny2313 -U hfuse:w::m
avrdude -c usbtiny -p attiny2313 -U efuse:w::m

Где <0xHH> — желаемое значение предохранителя в шестнадцатеричном формате. Например, чтобы установить высокий предохранитель на 0xDA:

avrdude -c usbtiny -p attiny2313 -U hfuse:w:0xDA:m

Неправильная установка фьюзов может «заблокировать» чип — например, вы можете отключить будущее программирование или сделать так, чтобы чип ожидал внешнего кристалла, когда его нет. По этой причине я предлагаю трижды проверить значения предохранителей. Затем проверьте еще раз, убедитесь, что вы не отключили программирование интернет-провайдера или контакт сброса или не установили тактовую частоту на 32 кГц. Затем снова убедитесь, что у вас есть правильный чип для расчета. Тогда, наконец, вы можете попробовать записать их на чип!

Помните: после того, как вы установили фьюзы, вам не нужно устанавливать их снова

Если программатор неправильно подключен к чипу, вы получите следующее сообщение: попробуйте еще раз или используйте -F, чтобы переопределить эту проверку

Это означает, что программатор не смог поговорить с чипом. Если вы используете «простой» программатор, такой как программатор последовательного или параллельного порта, это может означать, что виноват программатор. В противном случае это обычно означает, что программатор в порядке, но не может найти чип.

Убедитесь, что микросхема запитана, правильно подключена к розетке или программатору, правильно ли подключены кабели программирования, правильно ли подключен разъем и т.

Добавить комментарий

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