bin_to_dec

Обсуждаем контроллеры компании Atmel.
arm-17
Открыл глаза
Сообщения: 75
Зарегистрирован: Пн янв 10, 2011 00:12:19

bin_to_dec

Сообщение 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
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: bin_to_dec

Сообщение COKPOWEHEU »

На каком этапе ошибка? Вывод символа на дисплей, преобразование число - строка, вывод строки, может выводите число вместо его кода?
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: bin_to_dec

Сообщение 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
Последний раз редактировалось akl Сб янв 10, 2015 15:10:51, всего редактировалось 1 раз.
arm-17
Открыл глаза
Сообщения: 75
Зарегистрирован: Пн янв 10, 2011 00:12:19

Re: bin_to_dec

Сообщение arm-17 »

Для измерения 5-и вольт по АЦП пойдет 999.А вот почему не выводит на LCD? не пойму. У меня до этого был другой BIN_BSD он работал до 65535 и спокойно все это выводил на LCD.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: bin_to_dec

Сообщение akl »

Может из-за этого

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

subi resL, -100
sbci resH, 0

вместо

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

subi resL,low(-100)
sbci resH, high(-100)
arm-17
Открыл глаза
Сообщения: 75
Зарегистрирован: Пн янв 10, 2011 00:12:19

Re: bin_to_dec

Сообщение arm-17 »

akl подставил не получилось. Даже если BIN_BCD не правильный какие-то кракозябры все равно должны были выходить?

Подставил BIN_BCD который предложил akl, тоже не выводит на LCD(((
Последний раз редактировалось arm-17 Сб янв 10, 2015 16:00:42, всего редактировалось 1 раз.
arm-17
Открыл глаза
Сообщения: 75
Зарегистрирован: Пн янв 10, 2011 00:12:19

Re: bin_to_dec

Сообщение arm-17 »

Может число должно быть упакованное?
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: bin_to_dec

Сообщение 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
arm-17
Открыл глаза
Сообщения: 75
Зарегистрирован: Пн янв 10, 2011 00:12:19

Re: bin_to_dec

Сообщение arm-17 »

Разобрался ошибка где "запись в LCD". Пора завязывать отмечать праздники. :))

Тема закрыта.
arm-17
Открыл глаза
Сообщения: 75
Зарегистрирован: Пн янв 10, 2011 00:12:19

Re: bin_to_dec

Сообщение 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
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: bin_to_dec

Сообщение akl »

В этом преобразовании никак. После преобразования на индикатор выводите 0x35 0x2E 0x31 0x32.
arm-17
Открыл глаза
Сообщения: 75
Зарегистрирован: Пн янв 10, 2011 00:12:19

Re: bin_to_dec

Сообщение arm-17 »

Это преобразование правда какое-то ущербное.
У меня счет идет почему-то вот так: 4.00,4.11,4.22,4.33,4.44,4.55 и т.д.
Может есть у кого трехзначное преобразование?
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: bin_to_dec

Сообщение 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
Думаю, что напутано при выводе на индикацию
Мне больше нравится такое преобразование
arm-17
Открыл глаза
Сообщения: 75
Зарегистрирован: Пн янв 10, 2011 00:12:19

Re: bin_to_dec

Сообщение arm-17 »

Подставил все равно считает не правильно.
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: bin_to_dec

Сообщение akl »

По мне, у Вас вывод на индикатор неправильный.
arm-17
Открыл глаза
Сообщения: 75
Зарегистрирован: Пн янв 10, 2011 00:12:19

Re: bin_to_dec

Сообщение 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
;*****************************************************************************
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: bin_to_dec

Сообщение akl »

Я бы сделал так

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

  cpi count_data,6
;  cpi count_data,1

или так с заменой деления умножением (X/64=X*K/256->K=4) без потери значащих бит

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

   LSL   ADC_L   ;сдвинуть младший с переносом
   ROL   ADC_H   ;сдвинуть старший с переносом

   LSL   ADC_L
   ROL   ADC_H
arm-17
Открыл глаза
Сообщения: 75
Зарегистрирован: Пн янв 10, 2011 00:12:19

Re: bin_to_dec

Сообщение arm-17 »

Что-то не понял зачем сравнивать с 6( cpi count_data,6 )


Вы имеете в виду заменить
lsr ADC_H
ror ADC_L

на

LSL ADC_L ;сдвинуть младший с переносом
ROL ADC_H ;сдвинуть старший с переносом

Или я чего-то не понял?
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: bin_to_dec

Сообщение 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
arm-17
Открыл глаза
Сообщения: 75
Зарегистрирован: Пн янв 10, 2011 00:12:19

Re: bin_to_dec

Сообщение arm-17 »

Не получилось. Может если будет время ,то посмотрите?
Посылаю исходник и рабочий пример в PROTEUS.


Всем кто только изучает АЦП и ПИШЕТ на ASSEMBLER, будет интересно.
Вложения
КОД и схема в протеусе.zip
(44.83 КБ) 150 скачиваний
Ответить

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