Форум РадиоКот • Просмотр темы - bin_to_dec
Сообщения без ответов | Активные темы
Страница 2 из 2
[ Сообщений: 31 ]
,
Автор
Сообщение
akl
Заголовок сообщения: Re: bin_to_dec
Добавлено: Пн янв 19, 2015 08:06:59
Карма: 64
Рейтинг сообщений: 1013
Зарегистрирован: Пт мар 07, 2008 06:54:43Сообщений: 4341Откуда: Ижевск
Рейтинг сообщения: 0
Посмотрел в студии этот код, кроме вывода на LCD. Кое-что исправил. Попробуйте.
Спойлер Код:
.include "m8def.inc" .list#define F_CPU (4000000) .DEF temp1= R16 ;ADCSRA 4 6 .def resL =R20 .def resH =R21 .cseg .org 0 ;Aa?an ia?acaionea ;**** **** **** **** **** **** oaaeeoa i?a?uaaiee**** **** **** **** **** **** **** **** ** rjmp Initial .org ADCCaddr ;Aa?an aaeoi?a i?a?uaaiey ADC Complete IN resL, ADCL ; Ecia?aiiia iai?y?aiea IN resH, ADCH reti ;** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** * Initial: ldi Temp1, LOW(RamEnd) out SPL, Temp1 ldi Temp1, HIGH(RamEnd) out SPH, Temp1 cli ldi temp1,0b11111111 out DDRB,temp1 ;Iai?aaeaiea aaiiuo ii?oa B ia auaia,(LCD-aenieae) ; out PORTB,temp1 ;Auaaou aaiiua ia ii?o A SBI PORTD,6 ; ldi temp2,0b01000000 ;Iiaoyaeaa?uaa nii?ioeaeaiea ; out PortD,temp2 ; aey ia?aiu?ee MW rcall lcd_ init;Eieoeaeecaoey aenieay. ;**** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** * Start: ldi R17,0b10010000 ;SE=1 (?ac?aoaai "niyuee" ?a?ei), SM[2..0]=001 out MCUCR,R17 ; ("niyuee" ?a?ei = ooiiiiaaaeaiey AOI) ldi R16, 0b10011011 ;сбросить флаг ADIF ; ldi Temp1, 0b10001011 out ADCSRA,R16 ldi Temp1, 0b01000000 ; подключить AVCC к AREF out ADMUX, Temp1 SBI ADCSRA, ADSC ; Caione AOI (;sbi ADCSR, 6) SEI sleep ;ia?aoiaei a ?a?ei ooiiiiaaaeaiey AOI CLI LSR resH ROR resL rcall bin_to_dec ;i?aia?aciaaiea a aanyoe?iia e a ASKII rcall LCD_Write ;Ia?aaa?a aaiiuo ia LCD rjmp Start ;**** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ;**** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** bin_to_dec: ser r18 bin_to_dec1: inc r18 subi resL, 100 sbci resH, 0 brcc bin_to_dec1; au?eoaai aua ?ac (iao caaia) subi resL,low(-100) sbci resH, high(-100) ser r17 bin_to_dec2: inc r17 subi resL, 10 brcc bin_to_dec2 subi resL, -10 MOV R22,resL ; ser r22 ;bin_to_dec3: ; inc r22 ; subi resL, 1 ; brcc bin_to_dec3 ; subi resL, -1 ret ;**** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** * LCD_Write: ;i?aia?aciaaou aanyoe?iue eia a ASCII SUBI R18,-$30 SUBI R17,-$30 SUBI R22,-$30 ;**** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** * ldi r16,0x45 ;;;;;;;;;; rcall LCD_ SetAddressDD ;eii?aeiaou a LCD ;;;;;;;;;;; mov temp1,r18 rcall LCD_WriteData LDI temp1,'.' ;Oi?ea ; mov temp1,point ;Oi?ea rcall LCD_ WriteData mov temp1,r17 rcall LCD_WriteData mov temp1,r22 rcall LCD_ WriteData reti ;---------- ; HD44780 LCD Assembly driver ; http://avr-mcu.dxp.pl ; (c) Radoslaw Kwiecien ;----------#define HD44780_CLEAR 0x01 #define HD44780_ HOME 0x02 #define HD44780_ENTRY_ MODE 0x04 #define HD44780_EM_ SHIFT_CURSOR 0 #define HD44780_ EM_SHIFT_ DISPLAY 1 #define HD44780_EM_ DECREMENT 0 #define HD44780_EM_ INCREMENT 2#define HD44780_DISPLAY_ ONOFF 0x08 #define HD44780_DISPLAY_ OFF 0 #define HD44780_DISPLAY_ ON 4 #define HD44780_CURSOR_ OFF 0 #define HD44780_CURSOR_ ON 2 #define HD44780_CURSOR_ NOBLINK 0 #define HD44780_CURSOR_ BLINK 1#define HD44780_DISPLAY_ CURSOR_SHIFT 0x10 #define HD44780_ SHIFT_CURSOR 0 #define HD44780_ SHIFT_DISPLAY 8 #define HD44780_ SHIFT_LEFT 0 #define HD44780_ SHIFT_RIGHT 4 #define HD44780_ FUNCTION_SET 0x20 #define HD44780_ FONT5x7 0 #define HD44780_FONT5x10 4 #define HD44780_ ONE_LINE 0 #define HD44780_ TWO_LINE 8 #define HD44780_ 4_BIT 0 #define HD44780_ 8_BIT 16 #define HD44780_ CGRAM_SET 0x40 #define HD44780_ DDRAM_SET 0x80 .equ LCD_ PORT = PORTB .equ LCD_DDR = DDRB .equ LCD_ PIN = PINB .equ LCD_D4 = 4 .equ LCD_ D5 = 5 .equ LCD_D6 = 6 .equ LCD_ D7 = 7 .equ LCD_RS = 3 .equ LCD_ EN = 2 ;---------- ; ;---------- LCD_WriteNibble: sbi LCD_ PORT, LCD_EN sbrs r16, 0 cbi LCD_ PORT, LCD_D4 sbrc r16, 0 sbi LCD_ PORT, LCD_D4 sbrs r16, 1 cbi LCD_ PORT, LCD_D5 sbrc r16, 1 sbi LCD_ PORT, LCD_D5 sbrs r16, 2 cbi LCD_ PORT, LCD_D6 sbrc r16, 2 sbi LCD_ PORT, LCD_D6 sbrs r16, 3 cbi LCD_ PORT, LCD_D7 sbrc r16, 3 sbi LCD_ PORT, LCD_D7 cbi LCD_ PORT, LCD_EN ret ;---------- ; ;---------- LCD_ WriteData: sbi LCD_PORT, LCD_ RS push r16 swap r16 rcall LCD_WriteNibble pop r16 rcall LCD_ WriteNibble clr XH ldi XL,250 rcall Wait4xCycles ret ;---------- ; ;---------- LCD_WriteCommand: cbi LCD_ PORT, LCD_RS push r16 swap r16 rcall LCD_ WriteNibble pop r16 rcall LCD_WriteNibble ldi r16,2 rcall WaitMiliseconds ret ;---------- ; ;---------- LCD_ WriteString: lpm r16, Z+ cpi r16, 0 breq exit rcall LCD_WriteData rjmp LCD_ WriteString exit: ret ;---------- ; ;---------- LCD_WriteHexDigit: cpi r16,10 brlo Num ldi r17,'7' add r16,r17 rcall LCD_ WriteData ret Num: ldi r17,'0' add r16,r17 rcall LCD_WriteData ret ;---------- ; ;---------- LCD_ WriteHex8: push r16 swap r16 andi r16,0x0F rcall LCD_WriteHexDigit pop r16 andi r16,0x0F rcall LCD_ WriteHexDigit ret ;---------- ; ;---------- LCD_WriteDecimal: clr r14 LCD_ WriteDecimalLoop: ldi r17,10 rcall div8u inc r14 push r15 cpi r16,0 brne LCD_WriteDecimalLoop LCD_ WriteDecimalLoop2: ldi r17,'0' pop r16 add r16,r17 rcall LCD_WriteData dec r14 brne LCD_ WriteDecimalLoop2 ret ;---------- ; ;---------- LCD_SetAddressDD: ori r16, HD44780_ DDRAM_SET rcall LCD_ WriteCommand ret ;---------- ; ;---------- LCD_SetAddressCG: ori r16, HD44780_ CGRAM_SET rcall LCD_ WriteCommand ret ;---------- LCD_Init: CLR R0 OUT LCD_ PORT,R0 ldi r16, 100 rcall WaitMiliseconds ldi r17, 3 InitLoop: ldi r16, 0x03 rcall LCD_WriteNibble ldi r16, 5 rcall WaitMiliseconds dec r17 brne InitLoop ldi r16, 0x02 rcall LCD_ WriteNibble ldi r16, 1 rcall WaitMiliseconds ldi r16, HD44780_FUNCTION_ SET | HD44780_FONT5x7 | HD44780_ TWO_LINE | HD44780_ 4_BIT rcall LCD_ WriteCommand ldi r16, HD44780_DISPLAY_ ONOFF | HD44780_DISPLAY_ OFF rcall LCD_WriteCommand ldi r16, HD44780_ CLEAR rcall LCD_WriteCommand ldi r16, HD44780_ ENTRY_MODE |HD44780_ EM_SHIFT_ CURSOR | HD44780_EM_ INCREMENT rcall LCD_WriteCommand ldi r16, HD44780_ DISPLAY_ONOFF | HD44780_ DISPLAY_ON | HD44780_ CURSOR_OFF | HD44780_ CURSOR_NOBLINK rcall LCD_ WriteCommand ret ;---------- ; ;---------- ;---------- ; Busy-wait loops utilities module ; For F_CPU >= 4MHz ; http://avr-mcu.dxp.pl ; (c) Radoslaw Kwiecien, 2008 ;---------- #ifndef F_ CPU #error "F_CPU must be defined!" #endif #if F_ CPU < 4000000 #warning "F_CPU too low, possible wrong delay" #endif #define CYCLES_ PER_US (F_ CPU/1000000) #define C4PUS (CYCLES_PER_ US/4) #define DVUS(x) (C4PUS*x) ;---------- ; Input : XH:XL - number of CPU cycles to wait (divided by four) ;---------- Wait4xCycles: sbiw XH:XL, 1 brne Wait4xCycles ret ;---------- ; Input : r16 - number of miliseconds to wait ;---------- WaitMiliseconds: LDI XH,HIGH(1000* F_CPU/4/1000000) LDI XL,LOW(1000*F_ CPU/4/1000000) WaitMsLoop: SBIW XH:XL,1 BRNE WaitMsLoop dec r16 brne WaitMiliseconds ret ;**** * Subroutine Register Variables .def drem8u =r15 ;remainder .def dres8u =r16 ;result .def dd8u =r16 ;dividend .def dv8u =r17 ;divisor .def dcnt8u =r18 ;loop counter ;**** * Code div8u: sub drem8u,drem8u ; clear remainder and carry ldi dcnt8u,9 ; init loop counter d8u_1: rol dd8u ; shift left dividend dec dcnt8u ; decrement counter brne d8u_ 2 ; if done ret ; return d8u_2: rol drem8u ; shift dividend into remainder sub drem8u,dv8u ; remainder = remainder - divisor brcc d8u_ 3 ; if result negative add drem8u,dv8u ; restore remainder clc ; clear carry to be shifted into result rjmp d8u_1 ; else d8u_ 3: sec ; set carry to be shifted into result rjmp d8u_1 .EXIT
Вернуться наверх
Реклама
arm-17
Заголовок сообщения: Re: bin_to_dec
Добавлено: Вт янв 20, 2015 10:48:08
Зарегистрирован: Пн янв 10, 2011 00:12:19Сообщений: 75
Рейтинг сообщения: 0
Спасибо большое akl за исправление некоторых моментов , но проблема осталась та же. На вольтметре 5.00,а на LCD 5.11
Вернуться наверх
Реклама
akl
Заголовок сообщения: Re: bin_to_dec
Добавлено: Вт янв 20, 2015 11:25:35
Карма: 64
Рейтинг сообщений: 1013
Зарегистрирован: Пт мар 07, 2008 06:54:43Сообщений: 4341Откуда: Ижевск
Рейтинг сообщения: 1
А какое напряжение питания? По программе идёт подключение Vref=Vcc, т.е. чтобы получить на выходе 5.00V нужно напряжение 5.12V
Вложение:
ADC_RESULT.GIF
Вернуться наверх
arm-17
Заголовок сообщения: Re: bin_to_dec
Добавлено: Вт янв 20, 2015 14:57:23
Зарегистрирован: Пн янв 10, 2011 00:12:19Сообщений: 75
Рейтинг сообщения: 0
Хорошо буду делать в железе. Если, что можно буду обращается? А так спасибо большое очень помогли разобраться в АЦП.
Вернуться наверх
zero648
Заголовок сообщения: Re: bin_to_dec
Добавлено: Вт янв 20, 2015 19:05:25
Вымогатель припоя
Карма: 5
Рейтинг сообщений: 74
Зарегистрирован: Пн июн 18, 2012 12:01:04Сообщений: 650Откуда: Челябинская область, Копейск
Рейтинг сообщения: 0
arm-17 писал(а):
..... но проблема осталась та же. На вольтметре 5.00,а на LCD 5.11
Это потому, что вы результат просто делите на 2
Код:
LSR resH ROR resL
а нужно делить на коэффициент, предлагаю включить бит ADLAR и делить результат на 131, это будет на данный момент самое простое.
Вернуться наверх
Реклама
arm-17
Заголовок сообщения: Re: bin_to_dec
Добавлено: Вт янв 20, 2015 21:32:21
Зарегистрирован: Пн янв 10, 2011 00:12:19Сообщений: 75
Рейтинг сообщения: 0
какой коэффициент? А как деление на 131 в ASM. выглядит?
Вернуться наверх
Реклама
zero648
Заголовок сообщения: Re: bin_to_dec
Добавлено: Вт янв 20, 2015 21:56:30
Вымогатель припоя
Карма: 5
Рейтинг сообщений: 74
Зарегистрирован: Пн июн 18, 2012 12:01:04Сообщений: 650Откуда: Челябинская область, Копейск
Рейтинг сообщения: 0
При включенном бите ADLAR и при максимуме (5 вольт) на входе значение ацп будет не 1023, а 65472, значит чтобы преобразовать значение ацп в вольты нужно 65472 поделить на 500 получим 130,9 =~131, точку просто потом выводим после старшего разряда на LCD. 131 это и будет наш коэффициент.
пример деления
Код:
; ---------- ; Деление слова на байт //// // // // // // // // // // // // // // // // // // // // // // // // // // // ; ---------- ; --> R_TmpA1, R_TmpA2 -- делимое мл. и ст. байты ; R_Dat -- делитель ; <-- R_TmpA1, R_TmpA2 -- частное мл. и ст. байты ; R_OprA -- остаток ; Меняет: R_TmpA1, R_TmpA2, R_OprA, XL S_Div_WordByte: ldi XL, 17 ; Количество разрядов + бит C clr R_OprA ; Остаток clc S_Div_WordByte_Loop: rol R_OprA sub R_OprA , R_Dat ; Остаток минус делитель brcc S_Div_WordByte_1 add R_OprA, R_Dat S_Div_WordByte_1: rol R_TmpA1 rol R_TmpA2 dec XL brne S_Div_WordByte_Loop com R_TmpA1 com R_TmpA2 ret
Вернуться наверх
arm-17
Заголовок сообщения: Re: bin_to_dec
Добавлено: Сб янв 24, 2015 23:00:35
Зарегистрирован: Пн янв 10, 2011 00:12:19Сообщений: 75
Рейтинг сообщения: 0
Спасибо. А с остатком что делать?
Вернуться наверх
zero648
Заголовок сообщения: Re: bin_to_dec
Добавлено: Вс янв 25, 2015 05:12:16
Вымогатель припоя
Карма: 5
Рейтинг сообщений: 74
Зарегистрирован: Пн июн 18, 2012 12:01:04Сообщений: 650Откуда: Челябинская область, Копейск
Рейтинг сообщения: 0
Можно ничего с ним не делать, а можно заморочится с округлением.
Берем половину коэффициента и отнимаем от остатка, если включился флаг переноса, значит округляем в меньшую сторону, т.е. ничего не делаем, а если перенос не включился, значит округляем в большую сторону - добавляем 1 к результату.
В подпрограмме деления перед RET вставьте этот кусок кода:
Код:
lsr R_Dat sub R_OprA , R_Dat ; Остаток минус делитель brcc align_up ret align_up: ldi r16,1 ldi r17,0 add R_TmpA1,r16 adc R_TmpA2,r17
Вернуться наверх
Реклама
akl
Заголовок сообщения: Re: bin_to_dec
Добавлено: Пн янв 26, 2015 08:23:03
Карма: 64
Рейтинг сообщений: 1013
Зарегистрирован: Пт мар 07, 2008 06:54:43Сообщений: 4341Откуда: Ижевск
Рейтинг сообщения: 0
Ваша программа плохо делит. Попробуйте разделить число 0x4490/0x83 0x4440/0x83.
Вернуться наверх
zero648
Заголовок сообщения: Re: bin_to_dec
Добавлено: Пн янв 26, 2015 23:54:55
Вымогатель припоя
Карма: 5
Рейтинг сообщений: 74
Зарегистрирован: Пн июн 18, 2012 12:01:04Сообщений: 650Откуда: Челябинская область, Копейск
Рейтинг сообщения: 0
Все может быть, только программа не моя, а из тырнета. Я пользовался похожим кодом, но только для чисел с большей разрядностью, и там было неправильное деление чисел со знаком, хотя деление безнаковое.
Вернуться наверх
Страница 2 из 2
[ Сообщений: 31 ]
,
Кто сейчас на форуме
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения