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

Обсуждаем контроллеры компании Atmel.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Прежде чем задавать "странные", мягко говоря, вопросы, изучите архитектуру МК. Книга Вольфганг Трамперт AVR-RISC микроконтроллеры фирмы ATMEL. Во-первых сами разберетесь, и не будете доставать на форумах людей своими глупыми вопросами. Повторяю еще раз. Флаги SREG выставляются после каждой команды-операции над регистрами.

subi r16, 15 // В SREG будет результат операции над регистром r16. Что здесь непонятного?!

А как эти флаги выставляются аппаратно, нужно изучать схемотехнику цифровых устройств. Гуглите АЛУ. Там будут схемы и вы примерно будете представлять, как выставляются флаги SREG.

Все, отстаньте с глупыми вопросами, пока не прочитаете книгу, которую я вам назвал.
SatinS
Открыл глаза
Сообщения: 53
Зарегистрирован: Пн ноя 09, 2009 20:14:52

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

Сообщение SatinS »

Хорошо, спасибо) я немного запутался в своём вопросе)
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

SatinS писал(а):как происходит механизм запоминания, к какому именно регистру относится флаг, и сколько регистров с флагами можно обрабатывать
Статусный регистр один. Механизма "привязки" в АЛУ никакого нет .

Флаги в статусном регистре относятся к последней выполненной команде, которая их (флаги) меняла. Всё.

Дальше можно логически получать разные следствия из предыдущего утверждения. Например, что флаги относятся к тем регистрам общего назначения, над которыми выполнялась та последняя команда, которая меняла соответствующие флаги.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

Есть вот команды sbrc и cbrc которые проверяют n бит байта, sbrc r16, n. То есть работают с константой, а как мне сделать чтобы n задавать в программе, допустим инкрементировать ее ? Например я хочу проверить каждый бит байта.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

alex38779 писал(а):Есть вот команды sbrc и cbrc

1 - sbrc sbrs.
2 - Варианты.

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

//==================
.nolist
.include   "m8535def.inc"
.list
//==================

rjmp Reset

Reset:
ldi r16, HIGH (RAMEND)
out SPH, r16
ldi r16, LOW (RAMEND)
out SPL, r16

Main:
wdr

//----------
Method_1:
ldi r16, 5 // Нужно проверить 5 бит.
ldi r17, 1<<5 // Устанавливаем 5 бит.

Method_1_Cycle:
tst r16
breq Method_1_Equal
lsr r17
dec r16
rjmp Method_1_Cycle

Method_1_Equal:
sbrs r17, 0
rjmp Method_1_Zero
rjmp Method_1_One

Method_1_Zero:
rjmp PC+1

Method_1_One:
rjmp PC+1
//----------
Method_2:
ldi r16, 5 // Нужно проверить 5 бит.
ldi r17, 1<<5 // Устанавливаем 5 бит.
ldi r18, 1

Method_2_Cycle:
tst r16
breq Method_2_Equal
lsl r18
dec r16
rjmp Method_2_Cycle

Method_2_Equal:
and r17, r18
breq Method_2_Zero
brne Method_2_One

Method_2_Zero:
rjmp PC+1

Method_2_One:
rjmp PC+1
//----------
Method_3:
ldi r16, 5 // Нужно проверить 5 бит.
ldi r17, 1<<5 // Устанавливаем 5 бит.

clr ZH
mov ZL, r16
subi ZL, LOW (-(Table_Bits*2))
sbci ZH, HIGH (-(Table_Bits*2))
lpm

and r17, r0

breq Zero
brne One

Zero:
rjmp PC+1

One:
rjmp PC+1

rjmp  Main

;----------
Table_Bits:
.db      0b00000001, 0b00000010
.db      0b00000100, 0b00001000
.db      0b00010000, 0b00100000
.db      0b01000000, 0b10000000
;----------


Учтите, вы должны проверять значение номера бита на выход за предел 7 (0-7 биты). И учитывайте, что машинный счет начинается с нуля. То есть, декрементируйте номер бита. То есть, если нам нужно проверить 1 бит, то индекс должен быть 0.
Последний раз редактировалось Demiurg Вс апр 24, 2016 10:07:02, всего редактировалось 2 раза.
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

:shock: :shock: :shock:
у меня 126 байт заняла эта операция, ну я сам написал.
Аватара пользователя
Kavka
Мудрый кот
Сообщения: 1810
Зарегистрирован: Чт июн 10, 2010 08:55:35
Откуда: Сибирские Афины

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

Сообщение Kavka »

alex38779 писал(а):Например я хочу проверить каждый бит байта.
Какой контроллер? Не важно.
Табличный метод хорош. Стабилен по времени выполнения и компактен.
Можно маску получать с помощью цикла со сдвигом. Может быть будет чуть меньше занимать в памяти, но время выполнения будет разное для разных битов.
Последний раз редактировалось Kavka Вс апр 24, 2016 06:20:28, всего редактировалось 1 раз.
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15549
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

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

Сообщение BOB51 »

alex38779 писал(а):... а как мне сделать чтобы n задавать в программе...

Иногда в подобных случаях помогает вспомогательная маска "бегущий нуль(единица)", смещаемая при каждом контрольном цикле программы.
8)
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

alex38779 писал(а):Например я хочу проверить каждый бит байта

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

   ldi R16,0x55 //тестируемый регистр
   ldi R17,8 //количество циклов

   push r16 //сохранить значение регистра (если надо)

povtor:
   lsl R16 //сдвиг влево регистра, старший бит во флаг С
   brcs Propusk //пропустить сколкьо надо команд если установлен флаг С

   nop    //что то когда флаг С сброшен
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop

Propusk:
dec R17         //уменьшаем счечтик циклов и если не ноль то повторяем
brne  povtor

  pop r16      //восстановить R16
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

Z_h_e писал(а):...

Ну тады как-то так: тут.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

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

Сообщение akl »

alex38779 писал(а):Есть вот команды sbrc и cbrc которые проверяют n бит байта, sbrc r16, n. То есть работают с константой...
Замечу. Команды SBRS и SBRC работают с 1 битом!
SBRC This instruction tests a single bit in a register and skips the next instruction if the bit is cleared.
SBRS This instruction tests a single bit in a register and skips the next instruction if the bit is set.
Для проверки n-бит есть прекрасная команда
CPSE This instruction performs a compare between two registers Rd and Rr, and skips the next instruction if Rd = Rr.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

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

Сообщение Demiurg »

akl писал(а):
alex38779 писал(а):Есть вот команды sbrc и cbrc которые проверяют n бит байта, sbrc r16, n. То есть работают с константой...
SBRS и SBRC работают с 1 битом!

Об этом все знают. Перечитайте еще раз цитату, которую сами привели: ТС сетует, что эти команды работают с константой, и ему хочется проверять произвольный бит, который задан в переменной.
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

Почему команда ret кидает в самое начало программы -
.ORG $00? Ни как не могу понять..
Спойлер

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

 .def temp2    = r18 
 .def numDigit = r19
 .def temp     = r20
 .def temp1    = r21
 .def tempL    = r23
 .def tempH    = r24
 .def tempX    = r25

 .equ DS = PB3
 .equ ST_CP = PB4
 .equ SH_CP = PB2

 ;================
 .DSEG
   number: .byte 1
   digit:  .byte 1
   n1:      .byte 1 ;1000
   n2:      .byte 1 ;100
   n3:      .byte 1 ;10
   n4:      .byte 1 ;1
 ;================
 .CSEG

 .ORG $00
   rjmp reset    ; Reset
 .ORG $03
   rjmp OVF0 ; Timer/Counter0 Overflow
 
 OVF0:    
   ;rjmp send595         
   reti

 reset:    
   ;stek
   ldi r16, RAMEND
   out SPL, r16
   cli
   ;595
   in temp, DDRB
   ori temp, 1<<DS | 1<<ST_CP | 1<<SH_CP
   out DDRB, temp
   in temp, PORTB
   andi temp, ~(1<<DS | 1<<ST_CP | 1<<SH_CP)
   out PORTB, temp
   ;timer
   in r16, TCCR0B
   ori r16, 1<<CS01
   out TCCR0B, r16
   ldi r16, $00
   out TCNT0, r16
   ;прерывания
   in r16, TIMSK0
   ori r16, 1<<TOIE0
   out TIMSK0, r16
   sei
   ldi numDigit, 0b11110000;0b76543210   
 main:
   rjmp staskSave
   ;число в оперативку
   ldi YL, low(1234)
   ldi YH, high(1234)   
   ld r16, Y+
   ld r17, Y+
   ldi XL, byte1(596)
   ldi XH, byte2(596)
   st Y+, XH
   st Y+, XL
   ;разложение на разряды
   ;rjmp todigit   
   rjmp staskLoad
   rjmp main
 
 staskSave:
   push r16
   push r17
   push r18
   push r19
   push r20
   push r21
   push r22
   push r23
   push r24
   push r25
   push r26
   push r27
   push r28
   push r29
   push r30
   push r31
   ret

 staskLoad:
   pop r31
   pop r30
   pop r29
   pop r28
   pop r27
   pop r26
   pop r25
   pop r24
   pop r23
   pop r22
   pop r21
   pop r20
   pop r19
   pop r18
   pop r17
   pop r17


   ret



даже когда вызываю через rcall, все ровно кидает в начало.
Последний раз редактировалось alex38779 Вс апр 24, 2016 21:25:08, всего редактировалось 1 раз.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Почитайте про стек и его указатель. Значение указателя стека перед выходом из подпрограммы должно быть тем же что на входе в подпрограмму, только тогда указатель стека будет указывать на память в которой хранится адрес возврата. Если Вы что-то скинули на стек в подпрограмме, то перед выходом из нее должны столько же раз считать.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

Все ровно не понял проблемы...
Именно при вызове этой подпрограммы - staskSave: происходит эта ошибка. Или я слишком много значений пишу в стек?
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Z_h_e писал(а):Почитайте про стек и его указатель.
Из следующей подпрограммы Вы корректно выйдете, и не важно что в конце ее два раза подряд R17
Спойлер

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

 NekayaPodprogramma:
   push r16
   push r17
   push r18
   push r19
   push r20
   push r21
   push r22
   push r23
   push r24
   push r25
   push r26
   push r27
   push r28
   push r29
   push r30
   push r31
 

   pop r31
   pop r30
   pop r29
   pop r28
   pop r27
   pop r26
   pop r25
   pop r24
   pop r23
   pop r22
   pop r21
   pop r20
   pop r19
   pop r18
   pop r17
   pop r17


   ret
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

Это я уже исправил, про два раза r17.
А как быть с первой? Это срыв стека тот самый выходит?

Мне нужно сохранить данные, выполнить действия, и снова восстановить данные.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Z_h_e писал(а):Z_h_e писал(а):
Почитайте про стек и его указатель.
Не хотите читать, выполняйте программу по шагам в симуляторе и поглядите как изменяется указатель стека при входе в подпрограмму, при выходе из нее и при выполнение команд PUSH и POP.
Мне нужно сохранить данные, выполнить действия, и снова восстановить данные.
Используйте команды ST и LD. Только помните что регистры X, Y, Z - это R26-R31. Что у Вас за задача такая, что надо сохранять почти все регистры? Ну или выполните действия в той подпрограмме что я Вам показал между блоков PUSH и POP команд.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
alex38779
Потрогал лапой паяльник
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32
Контактная информация:

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

Сообщение alex38779 »

Z_h_e писал(а):Что у Вас за задача такая, что надо сохранять

Я изучаю все это дело.. :( эксперементирую

Хорошо попробую! Прочитал раз 5 все ровно туго доходит...
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Чем туже зайдет - тем крепче сидеть будет ;).
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Ответить

Вернуться в «AVR»