|
Виж темите без отговор | Виж активните теми
Дата и час: Вто Юли 28, 2026 1:08 am
| Автор |
Съобщение |
|
MegatroniC
Ранг: Минаващ
Регистриран на: Сря Яну 04, 2006 6:23 pm Мнения: 43 Местоположение: Earth
|
 Помощ за АЦП
Здравейте, от известно време съм се захванал да уча асемблер за PIC микроконтролерите и за тая цел взех двете книжки на "Млад конструктор"
Горе долу усвойх материала в първата част, след което реших все още да не минавам на втората част защото е за пик18 а да затвърдя наученото.
Взех за известно време от един познат една ICD2-ка и една демо платка PICDEM 2 PLUS на който да пробвам някой програмки, също и с помоща на Proteus вече може да се каже че умея да управлявам бутони, релета, седем сегментни индикации и т.н., от нещата описани в " PIC микроконтролери" 1 част. (е поне начално ниво
Сега обаче много ме мъчи АЦП модула (в книгата няма описано за него тъй като pic16F84 не притежава такъв).
На разположение имам един 28 пинов PIC16F913, изчетох пдф-а за него и наблегнах най-вече на ADC-то, но нещо все ми е мътно и реших да поискам помощ от вас
Може ли някой да ми даде примерна програмка (не искам да занимавам някой да пише заради мен, само ако му се намира под ръка нещо), като за начинаещи която използва АЦП-то и извежда резултат от преобразуването на ЛСД дисплей. На демо платката има 2х16 дисплей (мисля че е с драйвер аналог на HD44780) та въз основа на примерната програмка да си разясня по обстойно начина на работа с този модул и да си направя собствена такава
Edit: Бях пропуснал да погледна темата за записа в ЕЕПРОМ-а, та прочетох как някой хора нападнаха автора  . Ако смятате че и аз съм поредния "мързелив новобранец" моля модераторите да затрият темата, а аз ще се справям сам както до сега
Пояснявам защо искам примерна програмка а не задавам конкретни въпроси - разбрах до някъде принципа на управление на АЦП модула, но има някой неща който ми се неясни, и понеже незнам как точно да формулирам въпрос за тях, сметхан че ще е по добре да анализирам първо готова програмка и да си запълня дупките в знанията. Пак се извинявам ако темата е с неподходящо съдържание 
|
| Сря Яну 17, 2007 3:26 pm |
|
 |
|
didofen
Ранг: Популярен
Регистриран на: Вто Юни 27, 2006 11:13 am Мнения: 381 Местоположение: Варна
|
ами то ацп-то се управлява много лесно. имаш два контролни регистъра адсон1 и адсон2, с които се задават номера на аналоговия вход, опорно напрежение, време на конвертиране и т.н. резултата се получава в два регистъра (при повече от 8 битово ацп, иначе е само един) адресх и адресл. особеностите са следните. да се осигури време от вкючването на ацпто, през избор на вход до задаване на преобразуването. другото е да се зададе кои входове (обикновено на порта) ще са аналогови и да се зададат като входове. мисля че няма нищо по особено тук. трябва да научиш всеки бит от контролните регистри за какво служи и ще успееш да го подкараш. запиши си първо резултата в еепрома и после с програматора го прочети. чак след това дбави и лсд-то. успех !!!
|
| Сря Яну 17, 2007 4:50 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Скоро подобна тема бе дискутирана ! Даже има и пуснати сорсове на асемблери и С тука-просто се разрови.Първо сърч в архивите,после питане!
Та даже се дискутираше и 4/8 битов режим на работа на ЛСД-то.Е ако не можеш да се справиш-кажи да помагаме.Поздрави
|
| Сря Яну 17, 2007 5:04 pm |
|
 |
|
MegatroniC
Ранг: Минаващ
Регистриран на: Сря Яну 04, 2006 6:23 pm Мнения: 43 Местоположение: Earth
|
@didofen тези работи са ми ясни вече. Бобре ще се опитам да задам въпроси за неясните неща
За опорно напрежение може да се избере захранващото напрежение на контролера както и външно, за външното има ограничение Vref+<(Vdd+0,3V)
i Vref->(Vss-0,3V) като разликата със захранващото на мк-то е много малка. Каква е разлиата при изпозване на външно опорно или това на контролера, нещо в точноста на преобразуването ли се отразява ?
Да кажем изчислил съм делта V като искам 8 битов резултат, който се записва в ADRESH като искам да я изведа на ЛЦД-то, първо трябва да умножа резултата с делта V и да запиша получилото се в някой предварително дефиниран темп регистър и от там да "заминава" за визуализиране, точно тоя момент малко ми е неясен ?
didofen защо да записвам резултата в паметта преди да го изпратя към лцд-то ?
@Ки4о
Търсих доста с ключова дума АЦП или ADC но не открих нещо което би ми помогнало или съм го пропуснал. Пак ще потърся
Благодаря
|
| Сря Яну 17, 2007 5:18 pm |
|
 |
|
VSU
Ранг: Напреднал
Регистриран на: Нед Авг 14, 2005 1:08 pm Мнения: 433 Местоположение: Казанлък
|
Когато ползваш външен Ref ( + ref не може да е по-голямо от Vdd+0.3V но може да е по малко  например 2.5V ) (-Ref не може да е по малко от GND но може да е по голямо но не по голямо от +Ref  ) това се ползва когато мерения ти сигнал е в граници различни от GND i VDD например (+1V +3V) тогава подаваш на Vref- +1V a na Vref+ +3V и ползваш целия диапазон на ADC то останалото гледам ти е ясно
|
| Сря Яну 17, 2007 6:27 pm |
|
 |
|
Syrius-B
Ранг: Форумен бог
Регистриран на: Пон Яну 30, 2006 2:48 am Мнения: 1248 Местоположение: София
|
Главното съображение да се избира външен V-Ref, е по-голямата точност.
Vсс не е достатъчно стабилно, при нужда от максимална точност на меренето
|
| Чет Яну 18, 2007 1:36 am |
|
 |
|
didofen
Ранг: Популярен
Регистриран на: Вто Юни 27, 2006 11:13 am Мнения: 381 Местоположение: Варна
|
ясно, ти си оправил ацпто. казах ти да го записваш преди визуализация, за да си сигурен, че ацпто ти работи правилно и че грешка в програмата не е в лсдто. и последно се разбира, че проблема ти е в начина на контрол на лсдто. ако е така, питай и за него. а ако все пак нещо по ацпто не ти е ясно, пак питай.
|
| Чет Яну 18, 2007 8:49 am |
|
 |
|
MegatroniC
Ранг: Минаващ
Регистриран на: Сря Яну 04, 2006 6:23 pm Мнения: 43 Местоположение: Earth
|
Здравейте момчета, значи снощи направих следното:
зададох за опорно напрежение захранващото на пик-а, и на единия аналогов вход RA0 подадох напрежение което променях с тример. Резултатите записах в ЕЕПРОМ паметта и после чрез натискане на бутон  извеждам на RB0-RB7, към тях сързани светодиоди. Според мен умножавайки резултата с делта V се получи горе долу същата стойност каквато има след тримера. Но мен ме гложди мисълта на дисплея да се изобразява някаква стойност. Но не ми е ясно как двойчното число да се изобрази като десетично на дисплея
И още нещо се чудя, ако използвам повече от един аналогови входа, а канала е един  Мъча се да измисля някакъв цикъл но не ми идва идея 
|
| Чет Яну 18, 2007 12:53 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
И това го има във форума...
|
| Чет Яну 18, 2007 1:11 pm |
|
 |
|
didofen
Ранг: Популярен
Регистриран на: Вто Юни 27, 2006 11:13 am Мнения: 381 Местоположение: Варна
|
резултата, които се получава от ацпто, е шеснайстичен. превръщаш го в десетичен с вадене на 100, 10 и едно, след това се добавя 30х за аскии код и се праща на лсдто.
а по отношение на входа, нищо интересно. просто сменяш номера и мериш другия вход (изчаква се малко време).
|
| Чет Яну 18, 2007 1:22 pm |
|
 |
|
MegatroniC
Ранг: Минаващ
Регистриран на: Сря Яну 04, 2006 6:23 pm Мнения: 43 Местоположение: Earth
|
Здравейте отново, след като свърших някои други задължения с които загубих една седмица, ето че пак съм на тема PIC микроконтролери.
След известно умуване ето какво скалъпих за преобразуването:
 |  |  |  | Код: Подпрограма за преобразуване в двойчно-десетичен и АSCII формат
************************************************************ CBLOCK H'20' Dig_1 Dig_10 Dig_100 Temp ;регистър в който предварително е записан резултата от АЦП-то (8битов) ENDC ********************* ПОДПРОГРАМА ************************
BinToASKII clrf Dig_10 clrf Dig_100 movf Temp,w movwf Dig_1 Ch_100 movlw D'100' ;Проверка за стотици subwf Dig_1,w btfsc STATUS,C ;Провери за пренос, бит С=1? goto Ch_10 ;Да - С=1, премини към проверка за десетици movwf Dig_1 ;Не - С=0 incf Dig_100,f goto Ch_100 Ch_10 movlw D'10' subwf Dig_1,w btfsc STATUS,C goto end_conv movwf Dig_1 incf Dig_10,f goto Ch_10 end_conv ;Конвертиране в ASKII формат movf Dig_100,w addlw H'30' movwf Dig_100 ;тук мога да пратя резултата направо на диплея ? ;call Send_char movf Dig_10,w addlw H'30' movwf Dig_10 movf Dig_1,w addlw H'30' movwf Dig_1 RETURN
|  |  |  |  |
Правилно ли е ?
edit: Малко кофти се размести кода като го копирах, но предполагам се няма проблем 
|
| Вто Яну 30, 2007 5:48 pm |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
Виж сега бе чудо как се прави тази работа:
АЦП-то ти е 10 битово(примерно),т.е заема 2 клетки - binh_reg:binl_reg.
Резултата след преобразуването на ШЕСТНАДЕСЕТИЧНОТО ЧИСЛО (HEX) 0xFFFF в десетично число - еденици,десетици,стотици,хилядни и десетохиядни 65535 е в регистрите :
tenk_reg(x10k),thous_reg(x1k),hund_reg(x100), tens_reg(x10),ones_reg(x1)
Правиш следното:
movf ........,0 ;старша част
movwf binh_reg
movf ........,0 ; младша част
movwf binl_reg
;-------------------------------------------
call conv_16bin_bcd
;-------------------------------------------
След което си получил стойностите и ти трябват ASCII за изобразяване на LCD правиш следното:
movf tenk_reg,0 ;десетохилядни
addlw H'30'
movwf ............ ;в буфера или където ти душа сака
;-----------------------------------
movf thous_reg,0 ;хилядни
addlw H'30'
movwf ............
;-----------------------------------
movf hund_reg,0 ;стотици
addlw H'30'
movwf ............
;-----------------------------------
movf tens_reg,0 ;десетици
addlw H'30'
movwf ............
;-----------------------------------
movf ones_reg,0 ;еденици
addlw H'30'
movwf ............
Програмата conv_16bin_bcd е следната:
;---------------------------------------------------------
conv_16bin_bcd
banksel binh_reg
swapf binh_reg,w
andlw B'00001111'
addlw B'11110000'
movwf thous_reg
addwf thous_reg,f
addlw H'E2'
movwf hund_reg
addlw H'32'
movwf ones_reg
movf binh_reg,w
andlw B'00001111'
addwf hund_reg,f
addwf hund_reg,f
addwf ones_reg,f
addlw H'E9'
movwf tens_reg
addwf tens_reg,f
addwf tens_reg,f
swapf binl_reg,w
andlw B'00001111'
addwf tens_reg,f
addwf ones_reg,f
rlf tens_reg,f
rlf ones_reg,f
comf ones_reg,f
rlf ones_reg,f
movf binl_reg,w
andlw B'00001111'
addwf ones_reg,f
rlf thous_reg,f
movlw H'07'
movwf tenk_reg
movlw H'0A'
label1 addwf ones_reg,f
decf tens_reg,f
btfss STATUS,C
goto label1
label2 addwf tens_reg,f
decf hund_reg,f
btfss STATUS,C
goto label2
label3 addwf hund_reg,f
decf thous_reg,f
btfss STATUS,C
goto label3
label4 addwf thous_reg,f
decf tenk_reg,f
btfss STATUS,C
goto label4
retlw 0
;****************************************
Това е за 16 серия !!!! Айде ползвай,кефи се и се развивай.Аз така правя
Сорса не е мой но работи перфектно.Бях го изнамерил от нейде отдавна но от къде ли беше.....
|
| Вто Яну 30, 2007 7:31 pm |
|
 |
|
MegatroniC
Ранг: Минаващ
Регистриран на: Сря Яну 04, 2006 6:23 pm Мнения: 43 Местоположение: Earth
|
Мерси !
Моя пример го правих като съм смятал делта Т с 2^8 и ползвам резултата получен в ADRESH с дясно подравняване, и ми се ще някой да ми каже има ли нещо вярно в него
А ти ми показваш кода за преобразуване на резултата от ADRESH и L,  и непознати за мен rlf и banksel  ще тярва да прочета за тях по-подробно. Не ми се ще да използвам на готово кода без да знам как точно работи. Иначе благодаря много, ще го разуча като за начало 
|
| Сря Яну 31, 2007 12:37 am |
|
 |
|
Ки4о
Ранг: Форумен бог
Регистриран на: Съб Юли 22, 2006 9:50 pm Мнения: 1638
|
banksel- това е директива - използва се вместо BSF STATUS,RPx
rlf - ротация на ляво
Виж си инструкциите,направи си деин тест проек в МП-лаба и ще разбереш как работи 
|
| Сря Яну 31, 2007 10:38 am |
|
 |
|
mash
Ранг: Новодошъл
Регистриран на: Пет Окт 27, 2006 6:23 pm Мнения: 162 Местоположение: Севлиево
|
Кирчо! Как от 10 битово АЦП се получава числото 65535 ?
Това може да се получи за 16 битово АЦП.
Този код работи , но според мен нее много точен !
Реално би трябвало при +5V да се получи 1024......
|
| Сря Юни 06, 2007 12:37 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 4 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|