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

Обсуждаем контроллеры компании Atmel.
kaknaxtak
Встал на лапы
Сообщения: 87
Зарегистрирован: Пн июл 21, 2008 12:34:48

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

Сообщение kaknaxtak »

Всем привет!
Товарищи, нужна помощь!

В контроллер (ATmega16) поступает 16 разрядное число в коде Грея, надо перевести в бинарный код. Как перевести 8 разрядное (1 байт) я знаю.

Как-то так:
ldi temp, 0b00000000
ldi temp1,0b00011111 ;grey

qw:
eor temp, temp1
lsr temp1
cpi temp1, 0
brne qw

А как перевести 16 разрядное?

Данные принимаются в 2 байта. Если переводить каждый байт отдельно, то ничего не получается.
Реклама
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

Чем дальше, тем больше становлюсь занудой...
Изображение
Реклама
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

А по поводу реализации - двигать с переносом два байта:

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

lsr temp1
rol temp2
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

ploop, дружище, что ж ты человеку подумать не даешь?
Чем дальше, тем больше становлюсь занудой...
Изображение
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Вот такой я нехороший человек...
Хорошо удержался - не стал полный код цикла писать :)

И кстати, у меня там ошибка - пусть автор подумает как раз :)
Реклама
kaknaxtak
Встал на лапы
Сообщения: 87
Зарегистрирован: Пн июл 21, 2008 12:34:48

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

Сообщение kaknaxtak »

ploop, GP1, проверьте, правильно?


ldi temp, 0b00000000
ldi temp1, 0b00000000
ldi temp2,0b00011010 ;grey старший
ldi temp3,0b11001001 ; младший

qw:
eor temp, temp2
eor temp1, temp3

lsr temp2
ror temp3

cpi temp3, 0

brne qw
Реклама
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

надо проверять оба байта, иначе при temp3=0 и не нулевом temp2 получишь неправильный код на выходе

да и еще:
ну давайте переменным осмысленные имена, ну сколько об этом писать можно

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

.def GreyWordh=r16
.def GreyWordl=r17
по-моему выглядит лучше чем просто "temp", не ленитесь писать по-человечески.
Чем дальше, тем больше становлюсь занудой...
Изображение
kaknaxtak
Встал на лапы
Сообщения: 87
Зарегистрирован: Пн июл 21, 2008 12:34:48

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

Сообщение kaknaxtak »

Спасибо, задача решена!
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Кстати, почему всем так нравится этот temp? Гораздо проще использовать настоящие имена - R16, R17 ... и т.д.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

загляни в обучалку :wink:
Чем дальше, тем больше становлюсь занудой...
Изображение
kreygen
Родился
Сообщения: 18
Зарегистрирован: Ср сен 07, 2011 20:21:10

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

Сообщение kreygen »

Здравствуйте!
Нужно приравнять выставить один бит порта на 1, если число N больше 1 или на 0 если число N = 1. Это можно сделать быстрее, чем на сравнениях с нулём? Может битовой логикой?
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

kreygen писал(а):Здравствуйте!
Нужно приравнять выставить один бит порта на 1, если число N больше 1 или на 0 если число N = 1. Это можно сделать быстрее, чем на сравнениях с нулём? Может битовой логикой?
а число со знаком или без?]
Чем дальше, тем больше становлюсь занудой...
Изображение
kreygen
Родился
Сообщения: 18
Зарегистрирован: Ср сен 07, 2011 20:21:10

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

Сообщение kreygen »

а число со знаком или без?
Без.
Вот так реализовано сейчас:
//#define SDA0 cbi(SPIPORT,SDA);
//#define SDA1 sbi(SPIPORT,SDA);
//#define cbi(reg, bit) (reg&=~(1<<bit))
//#define sbi(reg, bit) (reg|= (1<<bit))

if ((b&128)==0) SDA0 else SDA1
Хотелось бы быстрее, я пытался так:
//SPIPORT &= ~(1 << 2);
//SPIPORT += (1 << 2)*((b>>7));
Но работает медленнее. Думал, на чистом асме можно как-то быстрее... это код на С.

Я ошибся в предыдущем посте, выставить бит впорте на ноль, если в числе все нули.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Если нужна скорость - говори номер бита порта. Подумаем.
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

kreygen писал(а):
Я ошибся в предыдущем посте, выставить бит впорте на ноль, если в числе все нули.
это вообще как два пальца... ну сам знаешь

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

tst    n
brne m1      ;если не 0, обходим установку в 0
cbi   port,bit

m1:
..
..
..

Чем дальше, тем больше становлюсь занудой...
Изображение
Xerion
Встал на лапы
Сообщения: 138
Зарегистрирован: Пн дек 06, 2010 11:11:36

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

Сообщение Xerion »

Ребят, а есть ли у кого-нибудь табличка с командами, с которыми не работают регистры R0-R15? В даташите как то очень расплывчато, у Ревича тоже нету :(
Аватара пользователя
GP1
Поставщик валерьянки для Кота
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград
Контактная информация:

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

Сообщение GP1 »

скачай Евстифеева у него команды отдельной главой описаны, там все просто.
Чем дальше, тем больше становлюсь занудой...
Изображение
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

Xerion писал(а):Ребят, а есть ли у кого-нибудь табличка с командами, с которыми не работают регистры R0-R15? В даташите как то очень расплывчато, у Ревича тоже нету :(
Совсем не расплывчато : только с R16...R31 работают команды с непосредственным опреандом : ORI,ANDI,SUBI, в котором операнд находится уже в самом коде команды.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

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

Сообщение ploop »

Да любые с константами: SBR, CBR например...
Valek87
Встал на лапы
Сообщения: 136
Зарегистрирован: Пн июл 12, 2010 16:03:11

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

Сообщение Valek87 »

Вектора прерываний так сделать?

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

; Define here Reset and interrupt vectors
rjmp RESET ; Reset
rjmp INT0 ; INT0
rjmp INT1 ; INT1
rjmp INT2 ; INT2
rjmp PCINT0 ; PCINT0
rjmp PCINT1 ; PCINT1
rjmp PCINT2 ; PCINT2
rjmp PCINT3 ; PCINT3
rjmp WDT ; Watchdog Timeout
rjmp TIMER2_COMPA ; Timer2 CompareA
rjmp TIMER2_COMPB ; Timer2 CompareB
rjmp TIMER2_OVF ; Timer2 Overflow
rjmp TIMER1_CAPT ; Timer1 Capture
rjmp TIMER1_COMPA ; Timer1 CompareA
rjmp TIMER1_COMPB ; Timer1 CompareB
rjmp TIMER1_OVF ; Timer1 Overflow
rjmp TIMER0_COMPA ; Timer0 CompareA
rjmp TIMER0_COMPB ; Timer0 CompareB
rjmp TIMER0_OVF ; Timer0 Overflow
rjmp SPI_STC ; SPI Transfer Complete
rjmp USART0_RX ; USART0 RX Complete
rjmp USART0_UDRE ; USART0,UDR Empty
rjmp USART0_TX ; USART0 TX Complete
rjmp ANALOG_COMP ; Analog Comparator
rjmp ADC ; ADC Conversion Complete
rjmp EE_READY ; EEPROM Ready
rjmp TWI ; 2-wire Serial
rjmp SPM_READY ; SPM Ready
rjmp USART1_RX ; USART1 RX Complete
rjmp USART1_UDRE ; USART1,UDR Empty
rjmp USART1_TX ; USART1 TX Complete
;******************************

;******************************
;RESET:
INT0:
INT1:
INT2:
PCINT0:
PCINT1:
PCINT2:
PCINT3:
WDT:
TIM2_COMPA:
TIM2_COMPB:
TIM2_OVF:
TIM1_COMPA:
TIM1_COMPB:
TIM1_OVF:
;TIM0_COMPA:
;TIM0_COMPB:
TIM0_OVF:
SPI_STC:
USART0_RXC:
USART0_UDRE:
USART0_TXC:
ANA_COMP:
;ADC:
EE_RDY:
TWI:
SPM_RDY:
USART1_RXC:
USART1_UDRE:
USART1_TXC:
reti

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

          ldi r18,0b00100111   ;разрешить прерывание компаратора (TIMSK1)
          sts 0x6F,r18
А здесь что не так?
Ответить

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