Страница 1 из 2
bin_to_dec
Добавлено: Сб янв 10, 2015 11:58:08
arm-17
Почему не отображается на LCD?
Вроде bin_to_dec рабочий.
Спойлер
;********************************************************************
;;===================
;; Преобразование 10-разрядного двоичного числа
;; в 3-разрядное двоично-десятичное неупакованное число
;; resH:resL - двоичное число
;; r18:r17:r16 - десятичное
bin_to_dec:
ser r18
bin_to_dec1: inc r18
subi resL, 100
sbci resH, 0
brcc bin_to_dec1; âû÷èòàåì åùå ðàç (íåò çàåìà)
subi resL, -100
sbci resH, 0
ser r17
bin_to_dec2: inc r17
subi resL, 10
brcc bin_to_dec2
subi resL, -10
ser r16
bin_to_dec3: inc r16
subi resL, 1
brcc bin_to_dec3
subi resL, -1
ret
;*************************************************************************
;*************************************************************************
;*************************************************************************
LCD_Write:
;преобразовать десятичный код в ASCII
ldi temp1,0x30 ;Смещение для ASCII кода
add r18,temp1 ;r2
add r17,temp1 ;r3
add r16,temp1 ;r4
;*************************************************************************
;запись в lcd
ldi r16,0x45 ;;;;;;;;;;
rcall LCD_SetAddressDD ;запись в LCD ;;;;;;;;;;;
mov temp1,r2 ;;;;;;;;;;;
rcall LCD_WriteData ;;;;;;;;;;;
mov temp1,r3 ;;;;;;;;;;;;
rcall LCD_WriteData ;;;;;;;;;;
mov temp1,r4 ;;;;;;;;;;;;;;
rcall LCD_WriteData ;;;;;;;;;;
mov temp1,r5 ;;;;;;;;;;;;
rcall LCD_WriteData ;;;;;;;;
mov temp1,r6 ;;;;;;;;;;
rcall LCD_WriteData ;;;;;;;;;;;;;
;************************************************************************
reti
Re: bin_to_dec
Добавлено: Сб янв 10, 2015 13:54:11
COKPOWEHEU
На каком этапе ошибка? Вывод символа на дисплей, преобразование число - строка, вывод строки, может выводите число вместо его кода?
Re: bin_to_dec
Добавлено: Сб янв 10, 2015 14:40:44
akl
arm-17 Ваше bin-bcd преобразование немного ущербно, т.к. не может преобразовать числа больше 999. Касательно вывода на LCD сказано в предыдущем сообщении.
Спойлер
Код: Выделить всё
;; Преобразование 10-разрядного двоичного числа
;; в 5-разрядное двоично-десятичное неупакованное число
;; resH:resL - двоичное число
;; R20:R19:r18:r17:r16 - десятичное
bin_to_dec:
;10000
ser R20
bin_to_dec10000:
inc r20
subi resL,LOW(10000)
sbci resH,HIGH(10000)
brcc bin_to_dec10000
subi resL,LOW(-10000)
sbci resH,HIGH(-10000)
;1000
ser R19
bin_to_dec1000:
inc r19
subi resL,LOW(1000)
sbci resH,HIGH(1000)
brcc bin_to_dec1000; a^u^?e`o`a`a*i` a*u`a* ?a`c, (i'a*o` c,a`a*i`a`)
subi resL,LOW(-1000)
sbci resH,HIGH(-1000)
;100
ser r18
bin_to_dec100:
inc r18
subi resL, 100
sbci resH, 0
brcc bin_to_dec100; a^u^?e`o`a`a*i` a*u`a* ?a`c, (i'a*o` c,a`a*i`a`)
subi resL,LOW(-100)
sbci resH,HIGH(-100)
;10
ser r17
bin_to_dec10:
inc r17
subi resL, 10
brcc bin_to_dec10
subi resL,LOW(-10)
sbci resH,HIGH(-10)
MOV R16,resL
;*************************************************************************
;*************************************************************************
;*************************************************************************
LCD_Write:
;преобразовать десятичный код в ASCII
SUBI R20,-0x30
SUBI R19,-0x30
SUBI R18,-0x30
SUBI R17,-0x30
SUBI R16,-0x30
;ldi temp1,0x30 ;Смещение для ASCII кода
;add r18,temp1 ;r2
;add r17,temp1 ;r3
;add r16,temp1 ;r4
RJMP BIN_TO_DEC
Re: bin_to_dec
Добавлено: Сб янв 10, 2015 15:05:08
arm-17
Для измерения 5-и вольт по АЦП пойдет 999.А вот почему не выводит на LCD? не пойму. У меня до этого был другой BIN_BSD он работал до 65535 и спокойно все это выводил на LCD.
Re: bin_to_dec
Добавлено: Сб янв 10, 2015 15:19:19
akl
Re: bin_to_dec
Добавлено: Сб янв 10, 2015 15:38:56
arm-17
akl подставил не получилось. Даже если BIN_BCD не правильный какие-то кракозябры все равно должны были выходить?
Подставил BIN_BCD который предложил akl, тоже не выводит на LCD(((
Re: bin_to_dec
Добавлено: Сб янв 10, 2015 15:54:00
arm-17
Может число должно быть упакованное?
Re: bin_to_dec
Добавлено: Сб янв 10, 2015 16:51:49
akl
Может так?
Спойлер
Код: Выделить всё
;; Преобразование 10-разрядного двоичного числа
;; в 5-разрядное двоично-десятичное неупакованное число
;; resH:resL - двоичное число
;; R20:R19:r18:r17:r16 - десятичное
LDI ZH,HIGH(RAMEND)
LDI ZL,LOW(RAMEND)
OUT SPH,ZH
OUT SPL,ZL
bin_to_dec:
;10000
ser R20
bin_to_dec10000:
inc r20
subi resL,LOW(10000)
sbci resH,HIGH(10000)
brcc bin_to_dec10000
subi resL,LOW(-10000)
sbci resH,HIGH(-10000)
;1000
ser R19
bin_to_dec1000:
inc r19
subi resL,LOW(1000)
sbci resH,HIGH(1000)
brcc bin_to_dec1000; a^u^?e`o`a`a*i` a*u`a* ?a`c, (i'a*o` c,a`a*i`a`)
subi resL,LOW(-1000)
sbci resH,HIGH(-1000)
;100
ser r18
bin_to_dec100:
inc r18
subi resL, 100
sbci resH, 0
brcc bin_to_dec100; a^u^?e`o`a`a*i` a*u`a* ?a`c, (i'a*o` c,a`a*i`a`)
subi resL,LOW(-100)
sbci resH,HIGH(-100)
;10
ser r17
bin_to_dec10:
inc r17
subi resL, 10
brcc bin_to_dec10
subi resL,LOW(-10)
sbci resH,HIGH(-10)
MOV R16,resL
;*************************************************************************
;*************************************************************************
;*************************************************************************
LCD_Write:
;преобразовать десятичный код в ASCII
SUBI R20,-0x30
SUBI R19,-0x30
SUBI R18,-0x30
SUBI R17,-0x30
SUBI R16,-0x30
MOV R2,R16
MOV R3,R17
MOV R4,R18
MOV R5,R19
MOV R6,R20
;ldi temp1,0x30 ;Смещение для ASCII кода
;add r18,temp1 ;r2
;add r17,temp1 ;r3
;add r16,temp1 ;r4
;*************************************************************************
;запись в lcd
ldi r16,0x45 ;;;;;;;;;;
rcall LCD_SetAddressDD ;запись в LCD ;;;;;;;;;;;
mov temp1,r2 ;;;;;;;;;;;
rcall LCD_WriteData ;;;;;;;;;;;
mov temp1,r3 ;;;;;;;;;;;;
rcall LCD_WriteData ;;;;;;;;;;
mov temp1,r4 ;;;;;;;;;;;;;;
rcall LCD_WriteData ;;;;;;;;;;
mov temp1,r5 ;;;;;;;;;;;;
rcall LCD_WriteData ;;;;;;;;
mov temp1,r6 ;;;;;;;;;;
rcall LCD_WriteData ;;;;;;;;;;;;;
RJMP BIN_TO_DEC
LCD_SetAddressDD:
RET
LCD_WriteData:
RET
Re: bin_to_dec
Добавлено: Сб янв 10, 2015 21:32:32
arm-17
Разобрался ошибка где "запись в LCD". Пора завязывать отмечать праздники.
Тема закрыта.
Re: bin_to_dec
Добавлено: Ср янв 14, 2015 16:37:52
arm-17
Подскажите уважаемые гуру форума, а как сделать чтоб в этом BIN_BCD появилась точка ну например (5.12V)
Спойлер
;; Преобразование 10-разрядного двоичного числа
;; в 3-разрядное двоично-десятичное неупакованное число
;; resH:resL - двоичное число
;; r18:r17:r16 - десятичное
bin_to_dec:
ser r18
bin_to_dec1: inc r18
subi resL, 100
sbci resH, 0
brcc bin_to_dec1; вычитаем еще раз (нет заема)
subi resL, -100
sbci resH, 0
ser r17
bin_to_dec2: inc r17
subi resL, 10
brcc bin_to_dec2
subi resL, -10
ser r16
bin_to_dec3: inc r16
subi resL, 1
brcc bin_to_dec3
subi resL, -1
ret
Re: bin_to_dec
Добавлено: Чт янв 15, 2015 04:13:23
akl
В этом преобразовании никак. После преобразования на индикатор выводите 0x35 0x2E 0x31 0x32.
Re: bin_to_dec
Добавлено: Чт янв 15, 2015 17:39:02
arm-17
Это преобразование правда какое-то ущербное.
У меня счет идет почему-то вот так: 4.00,4.11,4.22,4.33,4.44,4.55 и т.д.
Может есть у кого трехзначное преобразование?
Re: bin_to_dec
Добавлено: Пт янв 16, 2015 04:16:42
akl
Да нормальное преобразование. Разве что для правильности заменить на
Код: Выделить всё
brcc bin_to_dec1; вычитаем еще раз (нет заема)
subi resL, LOW(-100)
sbci resH, HIGH(-100)
.
.
.
MOV R16,resL
;ser r16
;bin_to_dec3: inc r16
;subi resL, 1
;brcc bin_to_dec3
;subi resL, -1
Думаю, что напутано при выводе на индикацию
Мне больше нравится
такое преобразование
Re: bin_to_dec
Добавлено: Пт янв 16, 2015 21:10:51
arm-17
Подставил все равно считает не правильно.
Re: bin_to_dec
Добавлено: Сб янв 17, 2015 04:52:48
akl
По мне, у Вас вывод на индикатор неправильный.
Re: bin_to_dec
Добавлено: Сб янв 17, 2015 09:00:24
arm-17
Нашёл.Регистр r16 заменил на другой и все заработало.
Теперь другая проблема: На вольтметре 5.00V а на LCD 5.11V
причем не сразу начинаетса с 0.35 на вольтметре а на LCD 0.36 и так все больше и больше
Вот мое деление
Код: Выделить всё
;***********************деление*********************************************** ;
;деление на 64
clr count_data
div64L:
lsr ADC_H;сдвинуть старший в право
ror ADC_L;сдвинуть младший с переносом
inc count_data
cpi count_data,1
brne div64L
;*****************************************************************************
Re: bin_to_dec
Добавлено: Сб янв 17, 2015 09:28:52
akl
Я бы сделал так
или так с заменой деления умножением (X/64=X*K/256->K=4) без потери значащих бит
Код: Выделить всё
LSL ADC_L ;сдвинуть младший с переносом
ROL ADC_H ;сдвинуть старший с переносом
LSL ADC_L
ROL ADC_H
Re: bin_to_dec
Добавлено: Вс янв 18, 2015 00:08:43
arm-17
Что-то не понял зачем сравнивать с 6( cpi count_data,6 )
Вы имеете в виду заменить
lsr ADC_H
ror ADC_L
на
LSL ADC_L ;сдвинуть младший с переносом
ROL ADC_H ;сдвинуть старший с переносом
Или я чего-то не понял?
Re: bin_to_dec
Добавлено: Вс янв 18, 2015 05:19:02
akl
arm-17 писал(а):Что-то не понял зачем сравнивать с 6( cpi count_data,6 )
Для того, чтобы разделить число на 64=2^6 можно сдвинуть вправо 6 раз.
arm-17 писал(а):Или я чего-то не понял?
Для того, чтобы разделить число на 64=2^6 можно сдвинуть влево 2 раза, заменив операцию деления умножением. Результатом будет содержимое старшего байта.
X/64=X*K/256->K=4
Re: bin_to_dec
Добавлено: Вс янв 18, 2015 19:57:21
arm-17
Не получилось. Может если будет время ,то посмотрите?
Посылаю исходник и рабочий пример в PROTEUS.
Всем кто только изучает АЦП и ПИШЕТ на ASSEMBLER, будет интересно.