Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Помощ за АЦП
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=3583
Страница 1 от 3

Автор:  MegatroniC [ Сря Яну 17, 2007 3:26 pm ]
Заглавие:  Помощ за АЦП

Здравейте, от известно време съм се захванал да уча асемблер за PIC микроконтролерите и за тая цел взех двете книжки на "Млад конструктор"
Горе долу усвойх материала в първата част, след което реших все още да не минавам на втората част защото е за пик18 а да затвърдя наученото.
Взех за известно време от един познат една ICD2-ка и една демо платка PICDEM 2 PLUS на който да пробвам някой програмки, също и с помоща на Proteus вече може да се каже че умея да управлявам бутони, релета, седем сегментни индикации и т.н., от нещата описани в " PIC микроконтролери" 1 част. (е поне начално ниво :oops: :)
Сега обаче много ме мъчи АЦП модула (в книгата няма описано за него тъй като pic16F84 не притежава такъв).
На разположение имам един 28 пинов PIC16F913, изчетох пдф-а за него и наблегнах най-вече на ADC-то, но нещо все ми е мътно и реших да поискам помощ от вас :oops:
Може ли някой да ми даде примерна програмка (не искам да занимавам някой да пише заради мен, само ако му се намира под ръка нещо), като за начинаещи която използва АЦП-то и извежда резултат от преобразуването на ЛСД дисплей. На демо платката има 2х16 дисплей (мисля че е с драйвер аналог на HD44780) та въз основа на примерната програмка да си разясня по обстойно начина на работа с този модул и да си направя собствена такава :roll:

Edit: Бях пропуснал да погледна темата за записа в ЕЕПРОМ-а, та прочетох как някой хора нападнаха автора 8O . Ако смятате че и аз съм поредния "мързелив новобранец" моля модераторите да затрият темата, а аз ще се справям сам както до сега :roll:
Пояснявам защо искам примерна програмка а не задавам конкретни въпроси - разбрах до някъде принципа на управление на АЦП модула, но има някой неща който ми се неясни, и понеже незнам как точно да формулирам въпрос за тях, сметхан че ще е по добре да анализирам първо готова програмка и да си запълня дупките в знанията. Пак се извинявам ако темата е с неподходящо съдържание :oops:

Автор:  didofen [ Сря Яну 17, 2007 4:50 pm ]
Заглавие: 

ами то ацп-то се управлява много лесно. имаш два контролни регистъра адсон1 и адсон2, с които се задават номера на аналоговия вход, опорно напрежение, време на конвертиране и т.н. резултата се получава в два регистъра (при повече от 8 битово ацп, иначе е само един) адресх и адресл. особеностите са следните. да се осигури време от вкючването на ацпто, през избор на вход до задаване на преобразуването. другото е да се зададе кои входове (обикновено на порта) ще са аналогови и да се зададат като входове. мисля че няма нищо по особено тук. трябва да научиш всеки бит от контролните регистри за какво служи и ще успееш да го подкараш. запиши си първо резултата в еепрома и после с програматора го прочети. чак след това дбави и лсд-то. успех !!!

Автор:  Ки4о [ Сря Яну 17, 2007 5:04 pm ]
Заглавие: 

Скоро подобна тема бе дискутирана ! Даже има и пуснати сорсове на асемблери и С тука-просто се разрови.Първо сърч в архивите,после питане!
Та даже се дискутираше и 4/8 битов режим на работа на ЛСД-то.Е ако не можеш да се справиш-кажи да помагаме.Поздрави

Автор:  MegatroniC [ Сря Яну 17, 2007 5:18 pm ]
Заглавие: 

@didofen тези работи са ми ясни вече. Бобре ще се опитам да задам въпроси за неясните неща :)

За опорно напрежение може да се избере захранващото напрежение на контролера както и външно, за външното има ограничение Vref+<(Vdd+0,3V)
i Vref->(Vss-0,3V) като разликата със захранващото на мк-то е много малка. Каква е разлиата при изпозване на външно опорно или това на контролера, нещо в точноста на преобразуването ли се отразява ?

Да кажем изчислил съм делта V като искам 8 битов резултат, който се записва в ADRESH като искам да я изведа на ЛЦД-то, първо трябва да умножа резултата с делта V и да запиша получилото се в някой предварително дефиниран темп регистър и от там да "заминава" за визуализиране, точно тоя момент малко ми е неясен ?
didofen защо да записвам резултата в паметта преди да го изпратя към лцд-то ?

@Ки4о
Търсих доста с ключова дума АЦП или ADC но не открих нещо което би ми помогнало или съм го пропуснал. Пак ще потърся
Благодаря

Автор:  VSU [ Сря Яну 17, 2007 6:27 pm ]
Заглавие: 

Когато ползваш външен Ref ( + ref не може да е по-голямо от Vdd+0.3V но може да е по малко :) например 2.5V ) (-Ref не може да е по малко от GND но може да е по голямо но не по голямо от +Ref :) ) това се ползва когато мерения ти сигнал е в граници различни от GND i VDD например (+1V +3V) тогава подаваш на Vref- +1V a na Vref+ +3V и ползваш целия диапазон на ADC то останалото гледам ти е ясно

Автор:  Syrius-B [ Чет Яну 18, 2007 1:36 am ]
Заглавие: 

Главното съображение да се избира външен V-Ref, е по-голямата точност.
Vсс не е достатъчно стабилно, при нужда от максимална точност на меренето

Автор:  didofen [ Чет Яну 18, 2007 8:49 am ]
Заглавие: 

ясно, ти си оправил ацпто. казах ти да го записваш преди визуализация, за да си сигурен, че ацпто ти работи правилно и че грешка в програмата не е в лсдто. и последно се разбира, че проблема ти е в начина на контрол на лсдто. ако е така, питай и за него. а ако все пак нещо по ацпто не ти е ясно, пак питай.

Автор:  MegatroniC [ Чет Яну 18, 2007 12:53 pm ]
Заглавие: 

Здравейте момчета, значи снощи направих следното:

зададох за опорно напрежение захранващото на пик-а, и на единия аналогов вход RA0 подадох напрежение което променях с тример. Резултатите записах в ЕЕПРОМ паметта и после чрез натискане на бутон :D извеждам на RB0-RB7, към тях сързани светодиоди. Според мен умножавайки резултата с делта V се получи горе долу същата стойност каквато има след тримера. Но мен ме гложди мисълта на дисплея да се изобразява някаква стойност. Но не ми е ясно как двойчното число да се изобрази като десетично на дисплея :oops:
И още нещо се чудя, ако използвам повече от един аналогови входа, а канала е един :roll: Мъча се да измисля някакъв цикъл но не ми идва идея :?

Автор:  Predator_MF [ Чет Яну 18, 2007 1:11 pm ]
Заглавие: 

Цитат:
Но не ми е ясно как двойчното число да се изобрази като десетично на дисплея
И това го има във форума...

Автор:  didofen [ Чет Яну 18, 2007 1:22 pm ]
Заглавие: 

резултата, които се получава от ацпто, е шеснайстичен. превръщаш го в десетичен с вадене на 100, 10 и едно, след това се добавя 30х за аскии код и се праща на лсдто.
а по отношение на входа, нищо интересно. просто сменяш номера и мериш другия вход (изчаква се малко време).

Автор:  MegatroniC [ Вто Яну 30, 2007 5:48 pm ]
Заглавие: 

Здравейте отново, след като свърших някои други задължения с които загубих една седмица, ето че пак съм на тема 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: Малко кофти се размести кода като го копирах, но предполагам се няма проблем :D

Автор:  Ки4о [ Вто Яну 30, 2007 7:31 pm ]
Заглавие: 

Виж сега бе чудо как се прави тази работа:
АЦП-то ти е 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 серия !!!! Айде ползвай,кефи се и се развивай.Аз така правя :wink: :lol:
Сорса не е мой но работи перфектно.Бях го изнамерил от нейде отдавна но от къде ли беше.....

Автор:  MegatroniC [ Сря Яну 31, 2007 12:37 am ]
Заглавие: 

Мерси !

Моя пример го правих като съм смятал делта Т с 2^8 и ползвам резултата получен в ADRESH с дясно подравняване, и ми се ще някой да ми каже има ли нещо вярно в него :roll:

А ти ми показваш кода за преобразуване на резултата от ADRESH и L, :) и непознати за мен rlf и banksel :oops: ще тярва да прочета за тях по-подробно. Не ми се ще да използвам на готово кода без да знам как точно работи. Иначе благодаря много, ще го разуча като за начало :)

Автор:  Ки4о [ Сря Яну 31, 2007 10:38 am ]
Заглавие: 

banksel- това е директива - използва се вместо BSF STATUS,RPx
rlf - ротация на ляво
Виж си инструкциите,направи си деин тест проек в МП-лаба и ще разбереш как работи :wink:

Автор:  mash [ Сря Юни 06, 2007 12:37 pm ]
Заглавие: 

Кирчо! Как от 10 битово АЦП се получава числото 65535 ?
Това може да се получи за 16 битово АЦП.
Този код работи , но според мен нее много точен !
Реално би трябвало при +5V да се получи 1024......

Страница 1 от 3 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/