Сниппеты AVR. Настройка портов I/O для реакции на нажатие кнопки

👁 55 просмотров

Допустим, есть банальная задача написания кода для реагирования на нажатие кнопки, которая подключена к ножке микроконтроллера A. После нажатия на кнопку сигнал нажатой появится на ножке B и включится лампочка.

Схема подключения микроконтроллера

Код на ассемблере

; project.asm
;
; Created: 23.11.2017 16:49:01
; Author : WebSofter
;

.list
.def temp = R16			;Определяем переменный регистр
.cseg					;Устанавливаем текущую рабочую память

;Настриваем PORT A
ldi temp, 0x00			;Записываем константу для DDRA
out DDRA, temp			;В порт управления записываем 0. Будет работать на ввод
ldi temp, 0xff			;Записываем константу для PORTA
out PORTA, temp			;A порт вывода записываем 1. Будет полдключен внутренний резистор
;Настриваем PORT B
ldi temp, 0xFF			;Записываем константу для DDRB
out DDRB, temp			;В порт управления записываем 1. Будет работать на вывод

;Организуем бесконечный цикл чтения сигнала нажатия
main:					;Метка цикла
	in temp, PINA		;Читаем сигналы с PIN
	out PORTB, temp		;Записываем в порт на вывод
rjmp main				;Операция перехода к метке

 

Код на C/C++

/*
 * GccProject.c
 *
 * Created: 23.11.2017 21:39:37
 * Author : WebSofter
 */ 

#include <avr/io.h>


int main(void)
{
    //Настрояка порта A
	DDRA = 0x00;//Установка напрвления на ввод
	PORTA = 0xFF;//Подключение внутреннего резистора
	//Настрояка порта B
	DDRB = 0xFF;//Устновка направления на вывод
	PORTB = 0xFF;//Начальная установка
	
    while (1) //Бесконечный цикл
    {
		PORTB = PINA;//Записываем нажатый пин из A в B
    }
}

 

Система команд ассемблера для Atmel AVR

👁 144 просмотров

Предисловие

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

Регистр статуса (SREG)

SREG: Регистр статуса
C: Флаг переноса
Z: Флаг нулевого значения
N: Флаг отрицательного значения
V: Флаг-указатель переполнения дополнения до двух
S: NЕV, Для проверок со знаком
H: Флаг полупереноса
T: Флаг пересылки, используемый командами BLD и BST
I: Флаг разрешения/запрещения глобального прерывания
Регистры и операнды
Rd: Регистр назначения (и источник) в регистровом файле
Rr: Регистр источник в регистровом файле
R: Результат выполнения команды
K: Литерал или байт данных (8 бит)
k: Данные адреса константы для счетчика программ
b: Бит в регистровом файле или I/O регистр (3 бита)
s: Бит в регистре статуса (3 бита)
X, Y, Z: Регистр косвенной адресации (X=R27:R26, Y=R29:R28, Z=R31:R30)
P: Адрес I/O порта
q: Смещение при прямой адресации (6 бит)

I/O регистры

RAMPX, RAMPY, RAMPZ: Регистры связанные с X, Y и Z регистрами, обеспечивающие косвенную адресацию всей области СОЗУ микроконтроллера с объемом СОЗУ более 64 Кбайт

Стек

STACK: Стек для адреса возврата и опущенных в стек регистров
SP: Указатель стека

Флаги

Флаг, на который воздействует команда
0 Очищенный командой Флаг
1 Установленный командой флаг
Флаг, на который не воздействует команда

Описание команд

ADC - Add with Carry, Сложить с переносом

Описание:
Сложение двух регистров и содержимого флага переноса (С), размещение результата в регистре назначения Rd.

Операнды:

Rd, Rr
Операция:

(i) Rd ← Rd + Rr + C
Синтаксис Операнды Счетчик программы
(i) ADC Rd, Rr 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 PC ← PC + 1

16-разрядный код операции:

0001 11rd dddd rrrr

Булевые выражения регистра статуса (SREG):

I T H S V N Z C
H Rd3•Rr3 + Rr3 + R3 + R3•Rd3
Устанавливается если есть перенос из бита 3, в ином случае очищается
S N⊕V, Для проверок со знаком
V Rd7•Rr7•R7 + Rd7•Rr7•R7
N R7
Устанавливается если в результате установлен MSB, в ином случае очищается
Z Rd7•Rr7•R7•R7•R7•Rd7
Устанавливается если результат $00, в ином случае очищается
C Rd7•Rr7 + Rr7 + R7 + R7•Rd7
Устанавливается если есть перенос из MSB результата, в ином случае очищается
R (Результат) соответствует Rd после выполнения команды

Пример:

           ;СложитьR1 : R0 с R3 : R2
add r2, r0 ;Сложить младший байт
adc r3, r1 ;Сложить старший байт с переносом

w Слов:
1 (2 байта)
Циклов:
1

ADD - Add without Carry, Сложить без переноса

Описание:
Сложение двух регистров без добавления содержимого флага переноса (С), размещение результата в регистре назначения Rd.

Операнды:

Rd, Rr
Операция:

(i) Rd ← Rd + Rr + C
Синтаксис Операнды Счетчик программы
(i) ADC Rd, Rr 0 ≤ d ≤ 31, 0 ≤ r ≤ 31 PC ← PC + 1

16-разрядный код операции:

0001 11rd dddd rrrr

Булевые выражения регистра статуса (SREG):

I T H S V N Z C
H Rd7•Rr7•R7 + Rd7•Rr7•R7
Устанавливается если в результате операции образуется переполнение дополнения до двух, в ином случае очищается
S N⊕V, Для проверок со знаком
V Rd7•Rr7•R7 + Rd7•Rr7•R7
N R7
Устанавливается если в результате установлен MSB, в ином случае очищается
Z R7•R6•R5•R4•R3•R2•R1•R0
Устанавливается если результат $00, в ином случае очищается
C Rd7•Rr7+Rr7•R7+R7•Rd7
Устанавливается если есть перенос из MSB результата, в ином случае очищается
R (Результат) соответствует Rd после выполнения команды

Пример:

add r1,r2   ; Сложить r2 с r1 (r1=r1+r2)
adc r28,r28 ; Сложить r28 с самим собой
              (r28=r28+r28)

w Слов:
1 (2 байта)
Циклов:
1

ADIW - Add Immediate to Word, Сложить непосредственное значение со словом

Описание:
Сложение непосредственного значения (0-63) с парой регистров и размещение результата в паре регистров. Команда работает с четырьмя верхними парами регистров, удобна для работы с регистрами указателями.

Операнды:

Rd, K
Операция:

(i) Rdh:Rdl ← Rdh:Rdl + K
Синтаксис Операнды Счетчик программы
(i) ADIW Rdl, K dl ∈ {24,26,28,30}, 0 ≤ K ≤ 63 PC ← PC + 1

16-разрядный код операции:

1001 0110 KKdd KKKK

Булевые выражения регистра статуса (SREG):

I T H S V N Z C
S N⊕V, Для проверок со знаком
V Rdh7 R15
N R15
Устанавливается если в результате установлен MSB, в ином случае очищается
Z R15•R14•R13•R12•R11•R10•R9•R8•R7•R6•R5•R4•R3•R2
Устанавливается если результат $0000, в ином случае очищается
C R15•Rdh7
Устанавливается если есть перенос из MSB результата, в ином случае очищается
R (Результат) соответствует Rdh:Rdl после выполнения команды (Rdh7 — Rdh0 = R15 — R8, Rdl7 — Rdl0 = R7 — R0)

Пример:

adiw r24, 1  ; Сложить 1 с r25:r24
adiw r30, 63 ; Сложить 63 с Z указателем (r31 : r30)

w Слов:
1 (2 байта)
Циклов:
2

 

Продолжение следует…