Представлен набор типовых примеров с наиболее распространенными задачами программирования МК. Предложены классификация и принципы выполнения заданий. Дано описание универсального макета программатора.
Изготовлен универсальный макет программатора, позволяющий проводить не только прошивку МК AVR четырех типов (AT90S1200, AT90S2313, AT90S4414, AT90S8515), но и управление проектируемыми внешними устройствами.
Реализован ряд задач по работе с памятью, по перекодировке, сложению и делению чисел, по работе с динамической индикацией и матричной клавиатурой. На основе этого смакетированы реальные устройства кодового замка на основе AT90S1200 и измерителя частоты в звуковом диапазоне на основе AT90S8515.
Предлагаемая на этой основе методика обучения программирования и применения МК позволяет ввести интересующихся в эту перспективную область.
1. Предко М. Руководство по микроконтроллерам. Том 1. / Пер. с англ. под ред. И. И. Шагурина и С. Б. Лужанского – М.: Постмаркет, 2001. – 416 с.
2. Предко М. Руководство по микроконтроллерам. Том 2. / Пер. с англ. под ред. И. И. Шагурина и С. Б. Лужанского – М.: Постмаркет, 2001. – 488 с.
3. Cady, Fredrick M. Microcontrollers and microcomputers: principles of software
and hardware engineering. – New York – Oxford, Oxford University Press,
1997. – 252 p.
4. Вуд А. Микропроцессоры в вопросах и ответах. / Пер. с англ. под ред. Д. А. Поспелова. – М.: Энергоатомиздат. 1985. – 184 с.
5. Уильямс Г.Б. Отладка микропроцессорных систем: / Пер. с. англ. – М.: Энергоатомиздат, 1988. – 253с.
6. Угрюмов Е.П. Цифровая схемотехника. – Спб.: БВХ – Санкт-Петербург,
2000. – 528 с.
7. Алексенко А.Г., Шагурин И.И. Микросхемотехника. – М.: Радио и связь,
1990. – 496 с.
8. Бродин Б.В., Шагурин И.И. Микроконтроллеры: Справочник. – М.: ЭКОМ, 1999. – 395 с.
9. Программируемые логические ИМС на КМОП-структурах и их применение. / П.П. Мальцев, Н.И. Гарбузов, А.П. Шарапов, А.А. Кнышев. – М.: Энергоатомиздат, 1998. – 158 с.
10. Соловьев В.В., Васильев А.Г. Программируемые логические интегральные схемы и их применение. – Мн.: Беларуская наука, 1998. – 270 с.
11. Bursky D. Embedded Logic and Memory Find a Home in FPGA. – Electronic Design, 1999, №14, pp. 43-56.
12. Chang D., Mazek-Sadowska M. Dynamically Reconfigable FPGA. – JEEE Transition on Computers, 1999, №6, pp. 565 – 578.
13. Bursky D. Advanced CPLD Architectures Challenge FPGA, Gas. – Electronic Design, 1998, №22, pp. 78 – 86.
14. Takai Y. a.o. 250 Mbytes Synchronous DRAM Using a 3-Stage-Pipeline Architecture. – JEEE. Journal of Solid-Stage Circuits. – 1994, v.29, №4,
pp. 426 – 429.
15. Лаптев В. Цифровой измеритель температуры на базе AVR микроконтроллера и RC-цепочки. – Электронные компоненты, 2001. №2, с. 46 – 49.
16. http://www.atmel.ru/ - описание AVR микроконтроллеров, русскоязычный сайт.
17. http://www.dontronics.com/atmel.html - программные проекты по AVR.
18. http://www.gaw.ru/, http://www.cec-mc.ru - информация о МК фирмы ATMEL
19. http://trush.da.ru/, http://avr.da.ru/ - описание МК AT90S1200 фирмы Atmel
20. http://www.ln.com.ua/~real/avreal, http://www.chat.ru/~avreal: - AVReAl: программа прошивки At90sXXXX через LPT порт
21. http://trush.pp.ru/avr/ - полезные ссылки по AVR.
Ниже приведен набор команд процессоров AVR, более детальное описание их можно найти в AVR Data Book [16,19].
Таблица А.1. Арифметические и логические инструкции.
Мнемоника | Операнды | Описание | Операция | Флаги | Циклы |
ADD | Rd,Rr | Суммирование без переноса | Rd = Rd + Rr | Z,C,N,V,H,S | 1 |
ADC | Rd,Rr | Суммирование с переносом | Rd = Rd + Rr + C | Z,C,N,V,H,S | 1 |
SUB | Rd,Rr | Вычитание без переноса | Rd = Rd - Rr | Z,C,N,V,H,S | 1 |
SUBI | Rd,K8 | Вычитание константы | Rd = Rd - K8 | Z,C,N,V,H,S | 1 |
SBC | Rd,Rr | Вычитание с переносом | Rd = Rd - Rr - C | Z,C,N,V,H,S | 1 |
SBCI | Rd,K8 | Вычитание константы с переносом | Rd = Rd - K8 - C | Z,C,N,V,H,S | 1 |
AND | Rd,Rr | Логическое И | Rd = Rd · Rr | Z,N,V,S | 1 |
ANDI | Rd,K8 | Логическое И с константой | Rd = Rd · K8 | Z,N,V,S | 1 |
OR | Rd,Rr | Логическое ИЛИ | Rd = Rd V Rr | Z,N,V,S | 1 |
ORI | Rd,K8 | Логическое ИЛИ с константой | Rd = Rd V K8 | Z,N,V,S | 1 |
EOR | Rd,Rr | Логическое исключающее ИЛИ | Rd = Rd EOR Rr | Z,N,V,S | 1 |
COM | Rd | Побитная Инверсия | Rd = $FF - Rd | Z,C,N,V,S | 1 |
NEG | Rd | Изменение знака (Доп. код) | Rd = $00 - Rd | Z,C,N,V,H,S | 1 |
SBR | Rd,K8 | Установить бит (биты) в регистре | Rd = Rd V K8 | Z,C,N,V,S | 1 |
CBR | Rd,K8 | Сбросить бит (биты) в регистре | Rd = Rd · ($FF - K8) | Z,C,N,V,S | 1 |
INC | Rd | Инкрементировать значение регистра | Rd = Rd + 1 | Z,N,V,S | 1 |
DEC | Rd | Декрементировать значение регистра | Rd = Rd -1 | Z,N,V,S | 1 |
TST | Rd | Проверка на ноль либо отрицательность | Rd = Rd · Rd | Z,C,N,V,S | 1 |
CLR | Rd | Очистить регистр | Rd = 0 | Z,C,N,V,S | 1 |
SER | Rd | Установить регистр | Rd = $FF | None | 1 |
ADIW | Rdl,K6 | Сложить константу и слово | Rdh:Rdl = Rdh:Rdl + K6 | Z,C,N,V,S | 2 |
SBIW | Rdl,K6 | Вычесть константу из слова | Rdh:Rdl = Rdh:Rdl - K6 | Z,C,N,V,S | 2 |
MUL | Rd,Rr | Умножение чисел без знака | R1:R0 = Rd * Rr | Z,C | 2 |
MULS | Rd,Rr | Умножение чисел со знаком | R1:R0 = Rd * Rr | Z,C | 2 |
MULSU | Rd,Rr | Умножение числа со знаком с числом без знака | R1:R0 = Rd * Rr | Z,C | 2 |
FMUL | Rd,Rr | Умножение дробных чисел без знака | R1:R0 = (Rd * Rr) << 1 | Z,C | 2 |
FMULS | Rd,Rr | Умножение дробных чисел со знаком | R1:R0 = (Rd *Rr) << 1 | Z,C | 2 |
FMULSU | Rd,Rr | Умножение дробного числа со знаком с числом без знака | R1:R0 = (Rd * Rr) << 1 | Z,C | 2 |
Таблица А.2. Инструкции ветвления.
Мнемоника | Операнды | Описание | Операция | Флаги | Циклы |
RJMP | k | Относительный переход | PC = PC + k +1 | None | 2 |
IJMP | Нет | Косвенный переход на (Z) | PC = Z | None | 2 |
EIJMP | Нет | Расширенный косвенный переход на (Z) | STACK = PC+1, PC(15:0) = Z, PC(21:16) = EIND | None | 2 |
JMP | k | Переход | PC = k | None | 3 |
RCALL | k | Относительный вызов подпрограммы | STACK = PC+1, PC = PC+k+1 | None | 3/4* |
ICALL | Нет | Косвенный вызов (Z) | STACK = PC+1, PC = Z | None | 3/4* |
EICALL | Нет | Расширенный косвенный вызов (Z) | STACK = PC+1, PC(15:0) = Z, PC(21:16) =EIND | None | 4* |
CALL | k | Вызов подпрограммы | STACK = PC+2, PC = k | None | 4/5* |
RET | Нет | Возврат из подпрограммы | PC = STACK | None | 4/5* |
RETI | Нет | Возврат из прерывания | PC = STACK | I | 4/5* |
CPSE | Rd,Rr | Сравнить, пропустить если равны | if (Rd ==Rr) PC = PC 2 or 3 | None | 1/2/3 |
CP | Rd,Rr | Сравнить | Rd -Rr | Z,C,N,V,H,S | 1 |
CPC | Rd,Rr | Сравнить с переносом | Rd - Rr - C | Z,C,N,V,H,S | 1 |
CPI | Rd,K8 | Сравнить с константой | Rd - K | Z,C,N,V,H,S | 1 |
SBRC | Rr,b | Пропустить если бит в регистре очищен | if(Rr(b)==0) PC = PC+2 or 3 | None | 1/2/3 |
SBRS | Rr,b | Пропустить если бит в регистре установлен | if(Rr(b)==1) PC = PC+2 or 3 | None | 1/2/3 |
SBIC | P,b | Пропустить если бит в порту очищен | if(I/O(P,b)==0) PC = PC+ or 3 | None | 1/2/3 |
SBIS | P,b | Пропустить если бит в порту установлен | if(I/O(P,b)==1) PC = PC+2 or 3 | None | 1/2/3 |
BRBC | s,k | Перейти если флаг в SREG очищен | if(SREG(s)==0) PC = PC+k+1 | None | 1/2 |
BRBS | s,k | Перейти если флаг в SREG установлен | if(SREG(s)==1) PC = PC+k+1 | None | 1/2 |
BREQ | k | Перейти если равно | if(Z==1) PC = PC + k + 1 | None | 1/2 |
BRNE | k | Перейти если не равно | if(Z==0) PC = PC + k + 1 | None | 1/2 |
BRCS | k | Перейти если перенос установлен | if(C==1) PC = PC + k + 1 | None | 1/2 |
BRCC | k | Перейти если перенос очищен | if(C==0) PC = PC + k + 1 | None | 1/2 |
BRSH | k | Перейти если равно или больше | if(C==0) PC = PC + k + 1 | None | 1/2 |
BRLO | k | Перейти если меньше | if(C==1) PC = PC + k + 1 | None | 1/2 |
BRMI | k | Перейти если минус | if(N==1) PC = PC + k + 1 | None | 1/2 |
BRPL | k | Перейти если плюс | if(N==0) PC = PC + k + 1 | None | 1/2 |
BRGE | k | Перейти если больше или равно (со знаком) | if(S==0) PC = PC + k + 1 | None | 1/2 |
BRLT | k | Перейти если меньше (со знаком) | if(S==1) PC = PC + k + 1 | None | 1/2 |
BRHS | k | Перейти если флаг внутреннего переноса установлен | if(H==1) PC = PC + k + 1 | None | 1/2 |
BRHC | k | Перейти если флаг внутреннего переноса очищен | if(H==0) PC = PC + k + 1 | None | 1/2 |
BRTS | k | Перейти если флаг T установлен | if(T==1) PC = PC + k + 1 | None | 1/2 |
BRTC | k | Перейти если флаг T очищен | if(T==0) PC = PC + k + 1 | None | 1/2 |
BRVS | k | Перейти если флаг переполнения установлен | if(V==1) PC = PC + k + 1 | None | 1/2 |
BRVC | k | Перейти если флаг переполнения очищен | if(V==0) PC = PC + k + 1 | None | 1/2 |
BRIE | k | Перейти если прерывания разрешены | if(I==1) PC = PC + k + 1 | None | 1/2 |
BRID | k | Перейти если прерывания запрещены | if(I==0) PC = PC + k + 1 | None | 1/2 |
* Для операций доступа к данным количество циклов указано при условии доступа к внутренней памяти данных, и не корректно при работе с внешним ОЗУ. Для инструкций CALL, ICALL, EICALL, RCALL, RET и RETI, необходимо добавить три цикла плюс по два цикла для каждого ожидания в контроллерах с PC меньшим 16 бит (128KB памяти программ). Для устройств с памятью программ свыше 128KB , добавьте пять циклов плюс по три цикла на каждое ожидание.