Страница 102 из 400
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт сен 08, 2011 12:42:22
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 байта. Если переводить каждый байт отдельно, то ничего не получается.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт сен 08, 2011 13:04:40
GP1
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт сен 08, 2011 13:08:30
ploop
А по поводу реализации - двигать с переносом два байта:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт сен 08, 2011 14:55:11
GP1
ploop, дружище, что ж ты человеку подумать не даешь?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт сен 08, 2011 15:29:25
ploop
Вот такой я нехороший человек...
Хорошо удержался - не стал полный код цикла писать
И кстати, у меня там ошибка - пусть автор подумает как раз

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт сен 08, 2011 15:51:11
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
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт сен 08, 2011 15:55:53
GP1
надо проверять оба байта, иначе при temp3=0 и не нулевом temp2 получишь неправильный код на выходе
да и еще:
ну давайте переменным осмысленные имена, ну сколько об этом писать можно
по-моему выглядит лучше чем просто "temp", не ленитесь писать по-человечески.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт сен 08, 2011 16:16:53
kaknaxtak
Спасибо, задача решена!
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт сен 08, 2011 17:44:05
ploop
Кстати, почему всем так нравится этот temp? Гораздо проще использовать настоящие имена - R16, R17 ... и т.д.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт сен 08, 2011 18:11:26
GP1
загляни в обучалку

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт сен 08, 2011 19:55:31
kreygen
Здравствуйте!
Нужно приравнять выставить один бит порта на 1, если число N больше 1 или на 0 если число N = 1. Это можно сделать быстрее, чем на сравнениях с нулём? Может битовой логикой?
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт сен 08, 2011 20:15:26
GP1
kreygen писал(а):Здравствуйте!
Нужно приравнять выставить один бит порта на 1, если число N больше 1 или на 0 если число N = 1. Это можно сделать быстрее, чем на сравнениях с нулём? Может битовой логикой?
а число со знаком или без?]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт сен 08, 2011 21:30:47
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));
Но работает медленнее. Думал, на чистом асме можно как-то быстрее... это код на С.
Я ошибся в предыдущем посте, выставить бит впорте на ноль, если в числе все нули.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт сен 08, 2011 21:35:29
ploop
Если нужна скорость - говори номер бита порта. Подумаем.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт сен 08, 2011 21:39:20
GP1
kreygen писал(а):
Я ошибся в предыдущем посте, выставить бит впорте на ноль, если в числе все нули.
это вообще как два пальца... ну сам знаешь
Код: Выделить всё
tst n
brne m1 ;если не 0, обходим установку в 0
cbi port,bit
m1:
..
..
..
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Чт сен 08, 2011 23:15:53
Xerion
Ребят, а есть ли у кого-нибудь табличка с командами, с которыми не работают регистры R0-R15? В даташите как то очень расплывчато, у Ревича тоже нету

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт сен 09, 2011 07:24:55
GP1
скачай Евстифеева у него команды отдельной главой описаны, там все просто.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт сен 09, 2011 11:18:49
Jack_A
Xerion писал(а):Ребят, а есть ли у кого-нибудь табличка с командами, с которыми не работают регистры R0-R15? В даташите как то очень расплывчато, у Ревича тоже нету

Совсем не расплывчато : только с R16...R31 работают команды с непосредственным опреандом : ORI,ANDI,SUBI, в котором операнд находится уже в самом коде команды.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт сен 09, 2011 11:37:49
ploop
Да любые с константами: SBR, CBR например...
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Добавлено: Пт сен 09, 2011 12:31:22
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
А здесь что не так?