MyTetra Share
Делитесь знаниями!
My Notes
Время создания: 11.11.2017 20:44
Раздел: Electronics - Microcontrollers - AVR8 - AVR ASM

Вычитание слов - сначала младший байт, затем старший:

sub r20,r24

sbc r21,r25


Сдвиг слов вправо:

lsr r16

ror r17


lsr в старший разряд запишет 0, младший запишет в С регистра SREG.

ror содержимое С записывает на место старшего бита, затем младший заносит в С.


Находим модуль:

clr r17

clr r16

sub r16,r20

sbc r17,r21

movw r21:r20,r17:r16


Результат в R21:R20.


Принимаем побитово, начиная с младшего (для I2C):

Допустим, что у нас полученный бит записан в SRAM. Функция, принимающая и записывающая бит в память - sensor_read_bit

Результат записывается в ту же ячейку памяти.


CLR R16 ; cycle counter (bit number)

CLR R17 ; result


loop:

CPI R16,8 ;

BREQ loop_end ; leave loop if r16 == 8

CALL sensor_read_bit ; I2C - receive bit

LDS R18,var_TEMPb ; load bit from SRAM

//--------------------- atomic operation

CLI

ROR R18 ; move (right shift) received bit to C in SREG

/* LSR R18 ; можно вместо первого ROR */

ROR R17 ; take bit from C (right shift) and push it in R17

SEI

//--------------------- END of atomic operation

INC R16 ; inc counter

RJMP loop


loop_end:

STS var_TEMPb,R17 ; save result


Сдвиги через ROR обязательно выполняем с отключенными прерываниями, чтобы флаг C не сбился во время операции.

































Так же в этом разделе:
 
MyTetra Share v.0.53
Яндекс индекс цитирования