- •Магомедов и. А. Микропроцессорные системы. Теория и практика применения микроконтроллеров
- •Глава I. Микроконтроллеры
- •Глава III. Лабораторный практикум по микроконтроллерам семейства avr фирмы atmel
- •Предисловие
- •Введение
- •Глава I. Микроконтроллеры
- •1.1. Классификация микроконтроллеров
- •Области применения:
- •1.2. Направление развития элементной базы 8-разрядных микроконтроллеров
- •Контрольные вопросы
- •Глава II. Высокопроизводительные risc микроконтроллеры семейства avr
- •2.1. Микроконтроллер фирмы Atmel aTmega1281
- •2.2. Системное управление и сброс микроконтроллера
- •Контрольные вопросы
- •2.3. Программная модель микроконтроллера2
- •Регистр управления коэффициентом деления частоты кварцевого генератора - xtal Divide Control Register – xdiv.
- •Контрольные вопросы
- •Регистр управления коэффициентом деления частоты кварцевого генератора xdiv и его назначение. Пример использования регистра.
- •2.4 Подсистема памяти микроконтроллера
- •2.4.1 Статическое озу памяти данных
- •2.4.2 Система команд процессоров avr в семействе avr система команд у микроконтроллеров разных типов содержат от 89 до 130 команд.
- •2.4.3 Режимы адресации памяти программ и данных
- •2.4.5 Память данных на eeprom
- •2.4.6 Конфигурационные биты
- •2.4.7 Системная синхронизация и тактовые источники
- •Контрольные вопросы
- •2.5. Периферийные модули микроконтроллера aTmega128
- •2.5.1. Параллельные порты ввода-вывода
- •Порты в качестве универсального цифрового ввода-вывода. Все порты являются двунаправленными портами ввода-вывода с опциональными подтягивающими резисторами.
- •Описание регистров портов ввода-вывода.
- •Использование параллельных портов для управления жидкокристаллическим индикатором и
- •Контрольные вопросы
- •2.6. Подсистема таймера/счетчика микроконтроллера aTmega128
- •Описание регистров 8-разрядного таймера-счетчика 0.
- •Описание регистров 16-разрядных таймеров-счетчиков.
- •Контрольные вопросы
- •2.7. Подсистема ввода аналоговых сигналов мк
- •Контрольные вопросы
- •2.8. Аналоговый компаратор
- •Контрольные вопросы
- •2.9. Последовательный периферийный интерфейс – spi
- •Функционирование вывода ss.
- •2.9.1. Пример использования интерфейса spi микроконтроллера aTmega128
- •Контрольные вопросы
- •2.10. Универсальный синхронно - асинхронный последовательный приемопередатчик
- •Описание регистров усапп
- •2.10.1. Пример использования порта uart
- •Контрольные вопросы
- •2.11. Последовательный двухпроводной интерфейс twi
- •2.11.1. Формат посылки и передаваемых данных
- •2.11.2. Модуль twi микроконтроллера avr
- •Описание регистров twi.
- •2.11,3. Подключение схемы ds1307 к микроконтроллеру по интерфейсу twi
- •Глава III. Лабораторный практикум по микроконтроллерам семейства avr фирмы atmel6
- •Оформление отчета
- •Правила выполнение работы в лаборатории
- •Подготовки стенда к выполнению лабораторной работы
- •Лабораторная работа № 1. Разработка и отладка программ в среде avr Studio 4. Изучение системы команд микроконтроллеров семейства avr
- •Режимы работы отладчика
- •Индивидуальные задания к выполнению лабораторной работы №1
- •Контрольные вопросы к лабораторной работе №1
- •Лабораторная работа №2. Параллельные порты ввода/вывода микроконтроллера
- •Индивидуальные задания к выполнению лабораторной работы №2
- •Контрольные вопросы к лабораторной работе №2
- •Лабораторная работа №3 Подсистема ввода аналоговых сигналов микроконтроллера
- •Краткие теоретические сведения
- •Индивидуальные задания к выполнению лабораторной работы №3
- •Контрольные вопросы к лабораторной работе №3
- •Лабораторная работа №4.
- •Краткие теоретические сведения
- •Индивидуальные задания к выполнению лабораторной работы №4
- •Контрольные вопросы к лабораторной работе №4
- •Лабораторная работа №5 Изучение режимов работы Таймера/Счетчика
- •Краткие теоретические сведения
- •Индивидуальные задания к выполнению лабораторной работы №5
- •Контрольные вопросы к лабораторной работе № 5
- •Лабораторная работа №6 Последовательный периферийный интерфейс – spi
- •Краткие теоретические сведения
- •Индивидуальные задания к выполнению лабораторной работы №6
- •Контрольные вопросы к лабораторной работе № 6
- •Лабораторная работа №7 Подсистема памяти микроконтроллера.
- •Краткие теоретические сведения
- •Индивидуальные задания к выполнению лабораторной работе №7
- •Контрольные вопросы к лабораторной работе №7
- •Лабораторная работа №8 Последовательный двухпроводной интерфейс i2c (twi)
- •Краткие теоретические сведения
- •Индивидуальные задания к выполнению лабораторной работы №8
- •Контрольные вопросы к лабораторной работе №8
- •Список использованной литературы
- •Костин г.Ю. Микроконтроллеры фирмы Motorola. М.: ктц-мк, 1998.
- •Микроконтроллеры семейства avr
- •Приложение 2
- •Include - Вложить другой файл
- •Выражения
- •Набор инструкций
- •Приложение 3
- •Семейства avr
- •Приложение 4
2.4.2 Система команд процессоров avr в семействе avr система команд у микроконтроллеров разных типов содержат от 89 до 130 команд.
Базовая система команд содержит: 33 команды регистровых операций, при выполнении которых используются только регистры общего назначения; 26 команд с обращением по адресу в адресном пространстве SRAM; 2 команды с обращением к регистрам ввода-вывода; 1 команда с обращением к Flash; 22 команды операций с битами в разрядах регистров общего назначения и регистров ввода-вывода; 34 команды управления ходом программы.
В систему команд поздних версий микроконтроллеров входят дополнительные команды. Появление некоторых из них связано с увеличенным объемом Flash и/или наличием дополнительных модулей, например, наличием аппаратного умножителя.
Ниже приведены примеры использования команд, а в приложении 2 - полный перечень команд для микроконтроллера Atmega 128 (мнемокоды команд, описание, операции, флаги и количество машинных циклов на выполнение команды).
Примеры использования арифметических и логических команд
|
;сложить r1: r0 c r3:r2 |
Add r2,r0 |
;сложить младший байт |
Adc r3,r1 |
;сложить старший байт с переносом |
Add r1,r2 |
;сложить r2 с r1 (r1=r1+r2) |
Adc r28,r28 |
;сложить r28 с самими собой (r28=r28+r28) |
Adiw r24,1 |
;сложить 1 c r25:r24 |
Adiw r30,63 |
;сложить 63 c Z указателем (r31:r30) |
And r2,r3 |
;поразрядная логическая операция И над содержимым ;регистров r2 и r3, результат поместить в r2 |
Ldi r16,1 |
;установить маску 0000 0001 в r16 |
And r2,r16 |
;выделить бит 0 в r2 |
Andi r17 $0F |
;очистить 4-7 разряды регистра r17 |
Andi r18 $10 |
;выделить бит 4 в r18 |
Andi r19 $AA |
;очистить нечетные биты r19 |
Примеры использования команд ветвления
|
Cpi r20,5 |
;сравнить r20 со значением 5 |
|
Brbc 1,noteq |
;перейти, если флаг нуля очищен |
|
……… |
|
Noteq: |
Nop |
;Перейти, по значению (пустая операция) |
|
Bst r0,3 |
;загрузить Т битом 3 регистра r0 |
|
Brbs 6,Битыet |
; перейти, если бит T установлен |
|
…… |
|
Битыet: |
Nop |
;перейти по назначению (пустая операция) |
|
Add r22,r23 |
;сложить r23 c r22 |
|
Brcc nocarry |
;перейти, если перенос очищен |
|
……… |
|
Nocarry: |
Nop |
;перейти по назначению (пустая операция) |
|
Cpi r26,$56 |
;сравнить r26 c $56 |
|
Brcs carry |
;перейти, если перенос установлен |
|
…… |
; |
Carry: |
nop |
;перейти по назначению (пустая операция) |
|
Сp r1,r0 |
;сравнить регистры r1 и r0 |
|
Breq equal |
;перейти, если содержимое регистров совпадает |
|
……. |
; |
Equal: |
Nop |
;перейти по назначению (пустая операция) |
|
Cp r11, r12 |
;сравнить регистры r11и r12 |
|
Brge greateq |
;перейти, если r11>=r12 (со знаком ) |
|
….. |
; |
Greateq: |
Nop |
;перейти по назначению (пустая операция) |
|
Brhc hclear |
;перейти, если флаг переноса очищен |
|
…… |
; |
Hclear: |
Nop |
;перейти по назначению (пустая операция) |
|
Mov r16,r0 |
;Копировать r0 в r16 |
|
Call check |
;Вызвать подпрограмму |
|
…… |
; |
|
Nop |
;Пустая операция |
Check: |
Cpi r16,$42 |
;Проверить, содержит ли r16 заданное значение |
|
Breq error |
;Перейти, если содержит |
|
Ret |
;Возврат из подпрограммы |
|
|
|
Error: |
Rjmp error |
;Бесконечный цикл |
|
Mov r16,r0 |
;Копировать r0 в r16 |
|
Call check |
;Вызвать подпрограмму check |
|
…… |
; |
|
Nop |
;Пустая операция |
Check: |
Cpi r16,$42 |
;Проверить, содержит ли r16 заданное значение |
|
Breq error |
;Перейти по метке error, если содержит |
|
Ret |
;Возврат из подпрограммы |
Примеры использования команд передачи данных
Clr r27 |
;очистить старший байт X |
Ldi r26,$20 |
;установить $20 в младший байт X |
Ld r0,X+ |
;загрузить в r0 содержимое SRAM по адресу $20 (X постинкрементируется) |
Ld r1,X |
;загрузить r1содержимое SRAM по адресу $21 |
Ldi r26,$23 |
;установить $23 в младший байт X |
Ld r2,X |
;загрузить в r2 содержимое SRAM по адресу $23 |
Ld r3,-X |
;загрузить в r3 содержимое SRAM по адресу $22 (X преддекрементируется) |
Clr r31 |
;очистить старший байт Z |
Ldi r30, $f0 |
;установить $F0 в младший байт Z |
Lpm |
;загрузить константу из памяти программ в регистр r0 . Память отмечена в Z |
Lds r2,$ff00 |
;загрузить r2 содержимым SRAM по адресу $ff00 |
Add r2, r1 |
;сложить r1 с r2 |
Sts $ff00,r2 |
;записать обратно |
Clr r31 |
;очистить старший байт Z |
Ldi r30,$ff |
;установить младший байт Z |
lpm |
;загрузить константу в регистр r0 из памяти программ отмеченную Z (r31:r30) |
Mul r6,r5 |
;перемножить r6 и r5 |
Mov r6,r1 |
;вернуть результат обратно в r6:r5
|
Mov r5,r0 |
Clr r16 |
;очистить r16 |
Out $18, r16 или Out portb, r16 |
;записать нули в Порт В (где $18 адрес порта В)
|
Nop |
;ожидать (пустая операция) |
Ser r17 |
;установить r17 |
Out portb,r17 |
;записать единицы в Порт В |
|
Call routine |
;вызвать программу routine |
|
…… |
; |
Routine: |
Push r14 |
;сохранить r14 в стеке |
|
Push r13 |
;сохранить r13 в стеке |
|
…… |
; |
|
Pop r13 |
;восстановить r13 |
|
Pop r14 |
;восстановить r14 |
|
Ret |
;вернуться из подпрограммы |
e2wait: |
Sbic $1c,1 |
;пропустить следующую команду, если EEWE очищен (где $1c –адрес регистра управления EEPROM – EECR) |
|
Rjmp e2wait |
;запись EEPROM не завершена |
|
nop |
;продолжать (пустая операция) |
|
;вычесть r1:r0 из r3:r2 |
Sub r2,r0 |
;вычесть младший байт |
Sbc r3,r1 |
;вычесть старший байт с переносом |
Out $1E,r0 |
;записать адрес EEPROM |
Sbi $1c,0 |
;установить бит чтения в EECR |
In r1,$1d |
;считать данные EEPROM |
Cli |
;запретить прерывания |
In r13, $16 |
;считать Порт В |
sei |
;разрешить прерывания |
Clr r27 |
;очистить старший байт X |
Ldi r26,$20 |
;установить $20 в младший байт X |
St X+,r0 |
;сохранить в r0 содержимое SRAM по адресу $20 (X посткрементируется) |
St X, r1 |
;сохранить в r1 содержимое SRAM по адресу $21 |
Ldi r26,$23 |
;установить $23 в младший байт X |
St r2, X |
;сохранить в r2 содержимое SRAM по адресу $23 |
St r3, -X |
;сохранить в r3 cодержимое SRAM по адресу $22 (X преддекрементируется) |
Lds r2, $ff00 |
;загрузить в r2 содержимое SRAM по адресу $ff00 |
Add r2,r1 |
;сложить r1 c r2 |
Sts $ff00,r2 |
;записать обратно |
Ldi r16, $10 |
;загрузить десятичное значение 16 в r16 |
Asr r16 |
;содержимое регистра R16 разделить на 2, т.е. r16=r16/2 |
Ldi r17, $fc |
;загрузить –4 в r17 |
Asr r17 |
;r17=r17/2 |
