Ассемблер (ASM) для AVR в вопросах и ответах
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Всем привет!
Товарищи, нужна помощь!
В контроллер (ATmega16) поступает 16 разрядное число в коде Грея, надо перевести в бинарный код. Как перевести 8 разрядное (1 байт) я знаю.
Как-то так:
ldi temp, 0b00000000
ldi temp1,0b00011111 ;grey
qw:
eor temp, temp1
lsr temp1
cpi temp1, 0
brne qw
А как перевести 16 разрядное?
Данные принимаются в 2 байта. Если переводить каждый байт отдельно, то ничего не получается.
Товарищи, нужна помощь!
В контроллер (ATmega16) поступает 16 разрядное число в коде Грея, надо перевести в бинарный код. Как перевести 8 разрядное (1 байт) я знаю.
Как-то так:
ldi temp, 0b00000000
ldi temp1,0b00011111 ;grey
qw:
eor temp, temp1
lsr temp1
cpi temp1, 0
brne qw
А как перевести 16 разрядное?
Данные принимаются в 2 байта. Если переводить каждый байт отдельно, то ничего не получается.
- Реклама
Re: Ассемблер (ASM) для AVR в вопросах и ответах
А по поводу реализации - двигать с переносом два байта:
Код: Выделить всё
lsr temp1
rol temp2- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ploop, дружище, что ж ты человеку подумать не даешь?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вот такой я нехороший человек...
Хорошо удержался - не стал полный код цикла писать
И кстати, у меня там ошибка - пусть автор подумает как раз
Хорошо удержался - не стал полный код цикла писать
И кстати, у меня там ошибка - пусть автор подумает как раз
- Реклама
Re: Ассемблер (ASM) для AVR в вопросах и ответах
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
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 в вопросах и ответах
надо проверять оба байта, иначе при temp3=0 и не нулевом temp2 получишь неправильный код на выходе
да и еще:
ну давайте переменным осмысленные имена, ну сколько об этом писать можно
по-моему выглядит лучше чем просто "temp", не ленитесь писать по-человечески.
да и еще:
ну давайте переменным осмысленные имена, ну сколько об этом писать можно
Код: Выделить всё
.def GreyWordh=r16
.def GreyWordl=r17Re: Ассемблер (ASM) для AVR в вопросах и ответах
Спасибо, задача решена!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Кстати, почему всем так нравится этот temp? Гораздо проще использовать настоящие имена - R16, R17 ... и т.д.
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
загляни в обучалку 
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Здравствуйте!
Нужно приравнять выставить один бит порта на 1, если число N больше 1 или на 0 если число N = 1. Это можно сделать быстрее, чем на сравнениях с нулём? Может битовой логикой?
Нужно приравнять выставить один бит порта на 1, если число N больше 1 или на 0 если число N = 1. Это можно сделать быстрее, чем на сравнениях с нулём? Может битовой логикой?
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
а число со знаком или без?]kreygen писал(а):Здравствуйте!
Нужно приравнять выставить один бит порта на 1, если число N больше 1 или на 0 если число N = 1. Это можно сделать быстрее, чем на сравнениях с нулём? Может битовой логикой?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Без.а число со знаком или без?
Вот так реализовано сейчас:
//#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));
Но работает медленнее. Думал, на чистом асме можно как-то быстрее... это код на С.
Я ошибся в предыдущем посте, выставить бит впорте на ноль, если в числе все нули.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Если нужна скорость - говори номер бита порта. Подумаем.
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
это вообще как два пальца... ну сам знаешьkreygen писал(а):
Я ошибся в предыдущем посте, выставить бит впорте на ноль, если в числе все нули.
Код: Выделить всё
tst n
brne m1 ;если не 0, обходим установку в 0
cbi port,bit
m1:
..
..
..
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ребят, а есть ли у кого-нибудь табличка с командами, с которыми не работают регистры R0-R15? В даташите как то очень расплывчато, у Ревича тоже нету 
- GP1
- Поставщик валерьянки для Кота
- Сообщения: 2401
- Зарегистрирован: Пт май 23, 2008 19:32:22
- Откуда: Россия, Волгоград
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
скачай Евстифеева у него команды отдельной главой описаны, там все просто.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Совсем не расплывчато : только с R16...R31 работают команды с непосредственным опреандом : ORI,ANDI,SUBI, в котором операнд находится уже в самом коде команды.Xerion писал(а):Ребят, а есть ли у кого-нибудь табличка с командами, с которыми не работают регистры R0-R15? В даташите как то очень расплывчато, у Ревича тоже нету
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Да любые с константами: SBR, CBR например...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вектора прерываний так сделать?
А здесь что не так?
Код: Выделить всё
; 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



