Страница 209 из 400

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вс окт 13, 2013 02:55:48
vek
Чего-то непойму как без директив обойтись,так сказать,саму подноготную арифметики непонимаю.
как к 2-х байтовой переменной прибавляется 1-байтовая константа,
Почему-то не канает если так хочу прибавить 6:
subi REG_L, -6
sbci REG_H, 0
Это мягко говоря не совсем очевидено

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вс окт 13, 2013 04:39:36
akl
Э нее! Попробуйте всё таки с директивами и увидите, что число -6 выглядит иначе.
Изображение

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вс окт 13, 2013 04:51:47
vek
У меня крокодил не ловиться,не растет кокос. Почему так?

P.S. А вроде понимать начал,это походу из-за того что я себе представляю число "-6" как однобайтное,
При этом пытаюсь его вычесть из двух байт. А надо приводить константу тоже в 2-х байтное значение.Это совсем не похоже на вычитание положительного значения. Нужно из старшей части не 0 вычитать,а -1.
Как-бы действительно не вполне очевидная вещь(и то до конца не понял :) ).

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вс окт 27, 2013 08:59:27
BOB51
Для двухбайтовых констант в пределах 0-63 лучше подходят команды
ADIW Rd+1:Rd,k (adiw rd,k) / SBIW Rd+1:Rd,k (sbiw rd,k) с регистровыми парами 25:24, 27:26, 29:28, 31:30
8)

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Пн окт 28, 2013 17:00:27
vek
Ну это понятно,про такие команды мы знаем :) ,я немного про другое спрашивал:)) Разобрался вроде
Но все равно спасибо

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Ср окт 30, 2013 01:14:49
MINSK42
Здравствуйте, у меня есть некоторая проблема с переносом ассемблерной вставки bp CCG в AVR. Код взят по этой ссылке http://www.mikrocontroller.net/topic/292775, к слову этот код управляет диодами ws2812.

asm volatile(
" ldi %0,8 \n\t"
"loop%=:lsl %1 \n\t"
" dec %0 \n\t"
" sbi %2, %3 \n\t"

" brcs .+2 \n\t"
" cbi %2, %3 \n\t"

" brcc .+2 \n\t"
" cbi %2, %3 \n\t"
" brne loop%= \n\t"
: "=&d" (ctr)
: "r" (curbyte), "I" (ws2812_port), "I" (ws2812_pin)
);

До этого момента с ассемблером не сталкивался, по CCG мануалов достаточно, так что я разобрался, что происходит в коде, а по CVAVR куций хэлп и больше не нашел.
Вот что получилось у меня.

#asm
ldi r1,curbyte
ldi r2,ws2812_port
ldi r3,ws2812_pin
ldi r0,8
loop :
lsl r1
dec r0
sbi r2, r3

brcs PC+2
cbi r2, r3

brcc PC+2
cbi r2, r3
brne loop
// : "=&d" (ctr)
// : "r" (curbyte), "I" (ws2812_port), "I" (ws2812_pin)
#endasm
И если честно, даже прочитав Allocation of Variables to Registers в хэлпе я не понял, как правильно осуществляется доступ к глобальным переменным или в какой регистр и как их помещать, компилятор ругается. Где мне найти информацию и как правильно транслировать код в Code Vision?
И еще, тут: http://rurandom.org/justintime/index.ph ... _explained рассматривается какая-то более заковыристая реализация этой задачи, код координально рознится, какому стоит доверять?

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Ср окт 30, 2013 04:23:40
zero648
Регистры r0-r15 c константами не работают, наверно по-этому компилятор ругается, с константами работают r16-r31, нужно заменить r0,r1,r2,r3 на какие нибудь из r16-r31, но какие из них использует компилятор в своих целях хз, так что с прогой в целом может произойти чтото непонятное, конфликт используемых регистров. Лучше все используемые регистры сохранить в стеке в начале вставки, а по завершении восстановить.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Ср окт 30, 2013 14:53:22
MINSK42
Я пытался засунуть их во все возможные регистры, все равно компилятор ругается, можно привести пример кода или рассказать, где можно посмотреть разбор похожего кода.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Ср окт 30, 2013 15:51:27
MINSK42
Вроде успешно раскидал по регистрам, но выдает ошибку в sbi r22,r23, в r22 записан 0х15, адрес порта С для атмега8, в r23 0x04- 4й порт. Вот еще такой вопрос, если я закрою инлайновую вставку, напишу то же по функционалу выражение, скажем PORTC.4=1, потеряю ли я такты на его исполнение?

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Ср окт 30, 2013 15:57:51
Engineer_Keen
MINSK42 писал(а):Вроде успешно раскидал по регистрам, но выдает ошибку в sbi r22,r23
Вы командой установки бита (от 0 до 7) пытаетесь установить бит с номером 23 (адрес регистра r23). SBI не предусматривает переменную в качестве второго аргумента, только константу. Да и первом аргументе должен быть прямой адрес, а не регистр. Так и пишите SBI PORTC,PC3

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Ср окт 30, 2013 16:10:50
MINSK42
Получается, мне в сишной части нужно задать эти значения как константы и поместить их в соответствующие регистры r16-r31? что-то в стиле
register const char ws2812_pin=0x15 @16;
или же
const char ws2812_pin;
а потом в инлайновой вставке:
ldi r24,ws2812_pin
чтобы потом использовать sbi ?

Прямой адрес а не регистр? В примере " sbi %2, %3 \n\t", насколько я понимаю используется регистр.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Ср окт 30, 2013 16:19:32
Engineer_Keen
Если у вас конкретный пин конкретного порта, не надо ничего определять, все уже должно быть определено просто пишите как есть SBI PORTC,PC3, если конечно адрес регистра попадает в дозволенный диапазон (иначе компилятор ругнется).
Если в диапазон не попадает, или нужно устанавливать произвольные биты произвольных портов, тогда придется использовать регистровые пары X,Y,Z и команды LD(S), ST(S).

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Ср окт 30, 2013 16:34:18
MINSK42
получается в CCG для использования значений из основного кода и вывода из инлайновой вставки используется
: "=&d" (ctr)
: "r" (curbyte), "I" (ws2812_port), "I" (ws2812_pin)
а в CVAVR можно напрямую обращаться к переменным?
Мне бы хотелось разобраться, чтобы в будущем подобные вопросы не возникали.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вс ноя 03, 2013 08:01:45
vek
SBI - дословно - "Set Bit I/O",это ИЛИ между значением в адресе и константой
SBI PORTC, 3 - означает Установить 3-й Бит РВВ портС, где вместо "PORTC",на самом деле компилятор подставит константу-адрес порта и вместо 3 на самом деле подставит (1<<3)

В случае если вы хотите переменную загонять в порт,то есть такие команды IN/OUT.
Допустим в R16 храним переменную - желаемое значение,которое должно попасть на ноги контроллера,
Делаем так:
OUT PORTC, R16 ;дословно: скопировать нафиг наружу из РОН r16 в РВВ портС
Если нужно с ножек что-то прочесть в РОН16,то делаем наоборот:
IN R16,PORTC

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вс ноя 03, 2013 11:18:25
BOB51
vek писал(а): OUT PORTC, R16 ;дословно: скопировать нафиг наружу из РОН r16 в РВВ портС
Если нужно с ножек что-то прочесть в РОН16,то делаем наоборот:
IN R16,PORTC
Насколько склероз не изменяет "с ножек что-то прочесть" в данном случае будет in r16,PINC
8)

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вс ноя 03, 2013 13:09:10
vek
Ой :oops: Ну,да :oops:

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вс ноя 03, 2013 18:45:47
ANALOG
vek писал(а):SBI PORTC, 3 - означает Установить 3-й Бит РВВ портС, где вместо "PORTC",на самом деле компилятор подставит константу-адрес порта и вместо 3 на самом деле подставит (1<<3)
Ну вообще-то не совсем так, вместо PORTC компилятор на самом деле подставит адрес, а вот 3 так и запишет, ничего вместо нее не подставляя, вот кусок из assembler help'а: :write:

16-bit Opcode:
1001 1010 AAAA Abbb

где
10011010 - уникальный ID команды
ААААА - та самая константа-адрес порта
bbb - номер бита

видим, что под номер бита выделено всего три бита в коде команды (что логично, т.к. 8 было бы избыточно), поэтому туда запишется именно номер бита, а не результат сдвига (1 << 3), который занял бы 8 бит в коде.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вт ноя 19, 2013 17:35:33
Ванюшка
Добрый вечер.
Не могли бы Вы мне подсказать, где я ошибся.
Необходимо реализовать
Изображение

Код: Выделить всё

;Мой код

.include "m8535def.inc" ;Подключение библиотеки контроллера AVR ATMega8535
.cseg                   ;Начало сегмента кода
.org 0                  ;Начальный адрес программы

;Инициализация портов
ldi r16,$00
ldi r17,$FF
out DDRA,r16            ;Порт A на ввод
out DDRC,r17            ;Порт C на вывод
out PORTA,r17           ;Устанавливаем подтягивающий резистор на порт А

;Основная программа
main:
 in r16,PINA
 mov r17,r16
 mov r18,r16
 andi r16,$08             ;Выделение РА3 в r16
 andi r17,$10             ;Выделение РА4 в r17
 andi r18,$20             ;Выделение РА5 в r18
 ;Сдвигаем все переменные на 3-ий бит
 lsr r18
 lsr r18
 lsr r17
 mov r19,r16              ;Копирование значения из регистра r16, в регистр r19
 and r19,r17              ;Выполняется логическое умножение (and - и) r19=r19*r17
 andi r19,$08               
 com r19                ;Выполняется инверсия значения записанного в регистре r19
 andi r19,$08
 or r19,r18             ;Выполняется логическое сложение r19=r19+r18
 andi r19,$08
 ;Сдвигаем значение регистра r19 на 3 бита вправо
 lsr r19                ;
 lsr r19                ;
 lsr r19                ;
 out PORTC,r19          ;Вывод результата из регистра r19 на порт C
 rjmp main              ;Возвращение на метку main
У меня почему-то "0" на выходе только в одном случае: PA3 - "1", PA4 - "1", PA5 - "0". Во всех остальных случаях PC0 - "1"
Если в коде есть "тупейшие" ошибки, не судите меня строго, это моя первая программа.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вт ноя 19, 2013 18:51:29
zero648
У меня почему-то "0" на выходе только в одном случае: PA3 - "1", PA4 - "1", PA5 - "0". Во всех остальных случаях PC0 - "1"
Все правильно, так и должно быть.

Re: Ассемблер (ASM) для AVR в вопросах и ответах

Добавлено: Вт ноя 19, 2013 18:51:55
pyzhman
Не "почему-то", а так и должно быть. Вы таблицу истинности-то составьте. :))