Ассемблер (ASM) для AVR в вопросах и ответах
- Реклама
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
ILYAUL писал(а):...
Код: Выделить всё
//------------------------------------------------------------------------
#define tab_h(x) HIGH(x), LOW(x)
#define tab_l(x) LOW(x), HIGH(x)
//------------------------------------------------------------------------
/************************************************************************/
#if (BCD==YES)
.dseg
HEX_DEC_BUFFER:
.equ HEX_DEC_BUFFER_LENGHT = 5
.byte HEX_DEC_BUFFER_LENGHT
.cseg
Hex_Dec:
ldx HEX_DEC_BUFFER
ldz Tab_10_16*2
ldi r19, 4
Hex_Dec_Cycle:
lpm r17, Z+
lpm r16, Z+
rcall Hex_Dec_Digit
st X+, r18
dec r19
brne Hex_Dec_Cycle
mov r16, r14
// ori r16, 0x30
st X+, r16
Hex_Dec_End:
ret
Hex_Dec_Digit:
ldi r18,-1
Hex_Dec_Digit_Cycle:
inc r18
sub r14,r16
sbc r15,r17
brsh Hex_Dec_Digit_Cycle
add r14,r16
adc r15,r17
// ori r18,0x30
ret
Tab_10_16:
.db tab_h (10000)
.db tab_h (1000)
.db tab_h (100)
.db tab_h (10)
#endif
//==================
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Вообщем- то для него этого достаточно
Код: Выделить всё
;**************************************************
;* ;;+Подпрограмма преобразования в BCD;;* *
;**************************************************
CONVBCD:
clr temp ;+ Преобразуем в BCD
BCD1:
subi temp1,10
brcs EndBCD
inc temp
rjmp BCD1
EndBCD:
subi temp1,-10
ori temp1,'0' ; перевод в ASCII
cp temp,zero
breq XXXX
ori temp,'0' ;/ в temp1 младшее значение в temp - старшее
ret
XXXX:
ldi temp,0x20 ;| Убираем первый , незначащий ноль
ret- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Я тут подумал и упрощаю задачу:
надо получить 3 байта:
1ый — знак (скажем, $A = "+", $B = "-");
2ой — целая часть температуры в двоичном формате (процедура перевода в BCD в проге уже есть);
3ий — дробная часть (0 или 5).
надо получить 3 байта:
1ый — знак (скажем, $A = "+", $B = "-");
2ой — целая часть температуры в двоичном формате (процедура перевода в BCD в проге уже есть);
3ий — дробная часть (0 или 5).
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ну и чего, та же самая таблица , только с двумя значениями 0x30 и 0х35 т.к дробь будет только 1 или 0 -другого не дано
Знак проверяется по старшему биту - 1 - значит минус . для подготовки для BCD лучше инвертировать в + , там выше в коде это есть
Знак проверяется по старшему биту - 1 - значит минус . для подготовки для BCD лучше инвертировать в + , там выше в коде это есть
- Реклама
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Чего? Какая таблица? 
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Последний пост на предыдущей странице
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ммм... сложновато.
Я вижу примерно так:
Если > 0, загружаем в первый байт "+", сдвигаем целую часть во 2-й байт и смотрим дробную часть: 0 или 5;
Если < 0, загружаем в первый байт "-", сдвигаем целую часть во 2-й байт, берём дополнене и смотрим дробную часть: 0 или 5.
Я вижу примерно так:
Если > 0, загружаем в первый байт "+", сдвигаем целую часть во 2-й байт и смотрим дробную часть: 0 или 5;
Если < 0, загружаем в первый байт "-", сдвигаем целую часть во 2-й байт, берём дополнене и смотрим дробную часть: 0 или 5.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
У DS-ки одна замечательная вещь , она устанавливает старший бит в 1 , если температура отрицательная. Проверяем и выводим +/-
Если темпю. отрицательная , переводим в положит и
Так вот у Вас SHIFT_REG будет или = 1 или 0 Проверяете и выводите сразу после запятой 0 или 5
Если темпю. отрицательная , переводим в положит и
Код: Выделить всё
lsr SHIFT_REG // и значение текущей температуры т.е делим на 10
X1: ror TERMO_REG // В TERMO_REG собираются значения температуры, в SHIFT_REG - значения после запятой
ror SHIFT_REG
dec count
brne X1
swap SHIFT_REG
Re: Ассемблер (ASM) для AVR в вопросах и ответах
r17:r16 - вход
выход:
r20: '+'/'-'
r21: градусы
r22: 0/5
выход:
r20: '+'/'-'
r21: градусы
r22: 0/5
Код: Выделить всё
ldi r20,'+'
and r17,r17 ; проверка на отрицательность
brpl plus
com r17 ; отрицательное
neg r16
sbci r17,0xFF
ldi r20,'-'
plus: ; (уже) положительное
ldi r22,5
sbrs r16,3 ; проверка на 0.5
clr r22
lsr r17 ; сдвигаем вправо на 4 бита
ror r16
lsr r17
ror r16
lsr r17
ror r16
lsr r17
ror r16
mov r21,r16 ; и получаем целые градусы
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Почему неa_skr писал(а): and r17,r17 ; проверка на отрицательность
Код: Выделить всё
tst r17Спасибо за код, лови плюсы.
Кто-нибудь сможет компактней?
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Re: Ассемблер (ASM) для AVR в вопросах и ответах
да, нагляднее так. просто ассемблер лет 15 назад изучалПочему не tst r17
Спасибо!Спасибо за код, лови плюсы.
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Код: Выделить всё
ldi r20,'+'
and r17,r17 ; проверка на отрицательность
brpl plus
com r17 ; отрицательное
neg r16
sbci r17,0xFF
ldi r20,'-'
Код: Выделить всё
sbrs R17,MSB
ldi R20,'+'
Sbrc R17,MSB
ldi R20,'-'Код: Выделить всё
lsr r17 ; сдвигаем вправо на 4 бита
ror r16
ror r17
ror r16
ror17
ror r16
ror r17
ror r16
Код: Выделить всё
lsr SHIFT_REG // и значение текущей температуры т.е делим на 10
X1: ror TERMO_REG // В TERMO_REG собираются значения температуры, в SHIFT_REG - значения после запятой
ror SHIFT_REG
dec count
brne X1
swap SHIFT_REGКод: Выделить всё
Sbrs SHIFT_REG,LSB
ldi R20,'0'
sbrc SHIFT_REG,LSB
Ldi R20,'5'Re: Ассемблер (ASM) для AVR в вопросах и ответах
Немного, но всё же...Gudd-Head писал(а):Кто-нибудь сможет компактней?
Код: Выделить всё
LDI ZL,4
LDI R20,'+'
TST XH
BRPL PLUS
COM XH
NEG XL
SBCI XH,-1
LDI R20,'-'
PLUS:
LSR XH
ROR XL
DEC ZL
BRNE PLUS
LDI R21,5
BRCS PC+2
CLR R21
MOV R22,XL
-
Demiurg
- Это не хвост, это антенна
- Сообщения: 1480
- Зарегистрирован: Ср июн 25, 2008 15:19:44
- Контактная информация:
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Только ассемблерщики меряются, у кого короче....
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Нет, отвечаем на просьбу
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Составляю памятку с описанием и переводом команд ассемблера, кто-нибудь может перевести оные - научным языком. "Подпись"/ "не подпись"/ и "подпись" ли в русском варианте/ и что за подпись?
Команды аппаратному умножителю:
Multiply Unsigned
Multiply Signed
Multiply Signed with Unsigned
Fractional Multiply Unsigned
Fractional Multiply Signed
Fractional Multiply Signed with Unsigned
Multiply Unsigned
Multiply Signed
Multiply Signed with Unsigned
Fractional Multiply Unsigned
Fractional Multiply Signed
Fractional Multiply Signed with Unsigned
Re: Ассемблер (ASM) для AVR в вопросах и ответах
Ребят, как преобразовать двоичное в BCD? 11111111 >>> 255, осадив оное в трёх регистрах?
00000010 = 2
00000101 = 5
00000101 = 5
Предлагают 16-ти битные, но скостить их до 8-ми тоже надо уметь, чтоб "процедуру не повело".
Может у кого в наличии готовые примеры?
УГ-изм проблемы:
00000010 = 2
00000101 = 5
00000101 = 5
Предлагают 16-ти битные, но скостить их до 8-ми тоже надо уметь, чтоб "процедуру не повело".
УГ-изм проблемы:
Спойлер

Re: Ассемблер (ASM) для AVR в вопросах и ответах
Код: Выделить всё
;вход: R16 число от 0 ... 255
;выход: R18 число 2, R17 число 1, R16 число 0 = digits
;байтов: 20
;пример на вход ldi r16,255
;выход r18 = 00000010 это 2, r17 = 00000101 это 5, r16 = 00000101 это 5.
Hex2BCD: LDI r18,-1
bcd1: INC r18
SUBI r16,100
BRCC bcd1
LDI r17,10
bcd2: DEC r17
SUBI r16,-10
BRCS bcd2
ret Прибор, защищённый предохранителем, сгорает первым, защитив предохранитель. Закон Мерфи.



