| Микроконтролери и електроника 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 част. (е поне начално ниво Сега обаче много ме мъчи АЦП модула (в книгата няма описано за него тъй като pic16F84 не притежава такъв). На разположение имам един 28 пинов PIC16F913, изчетох пдф-а за него и наблегнах най-вече на ADC-то, но нещо все ми е мътно и реших да поискам помощ от вас Може ли някой да ми даде примерна програмка (не искам да занимавам някой да пише заради мен, само ако му се намира под ръка нещо), като за начинаещи която използва АЦП-то и извежда резултат от преобразуването на ЛСД дисплей. На демо платката има 2х16 дисплей (мисля че е с драйвер аналог на HD44780) та въз основа на примерната програмка да си разясня по обстойно начина на работа с този модул и да си направя собствена такава Edit: Бях пропуснал да погледна темата за записа в ЕЕПРОМ-а, та прочетох как някой хора нападнаха автора Пояснявам защо искам примерна програмка а не задавам конкретни въпроси - разбрах до някъде принципа на управление на АЦП модула, но има някой неща който ми се неясни, и понеже незнам как точно да формулирам въпрос за тях, сметхан че ще е по добре да анализирам първо готова програмка и да си запълня дупките в знанията. Пак се извинявам ако темата е с неподходящо съдържание |
|
| Автор: | 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 но може да е по малко |
|
| Автор: | Syrius-B [ Чет Яну 18, 2007 1:36 am ] |
| Заглавие: | |
Главното съображение да се избира външен V-Ref, е по-голямата точност. Vсс не е достатъчно стабилно, при нужда от максимална точност на меренето |
|
| Автор: | didofen [ Чет Яну 18, 2007 8:49 am ] |
| Заглавие: | |
ясно, ти си оправил ацпто. казах ти да го записваш преди визуализация, за да си сигурен, че ацпто ти работи правилно и че грешка в програмата не е в лсдто. и последно се разбира, че проблема ти е в начина на контрол на лсдто. ако е така, питай и за него. а ако все пак нещо по ацпто не ти е ясно, пак питай. |
|
| Автор: | MegatroniC [ Чет Яну 18, 2007 12:53 pm ] |
| Заглавие: | |
Здравейте момчета, значи снощи направих следното: зададох за опорно напрежение захранващото на пик-а, и на единия аналогов вход RA0 подадох напрежение което променях с тример. Резултатите записах в ЕЕПРОМ паметта и после чрез натискане на бутон И още нещо се чудя, ако използвам повече от един аналогови входа, а канала е един |
|
| Автор: | Predator_MF [ Чет Яну 18, 2007 1:11 pm ] | |||||||||
| Заглавие: | ||||||||||
|
||||||||||
| Автор: | didofen [ Чет Яну 18, 2007 1:22 pm ] |
| Заглавие: | |
резултата, които се получава от ацпто, е шеснайстичен. превръщаш го в десетичен с вадене на 100, 10 и едно, след това се добавя 30х за аскии код и се праща на лсдто. а по отношение на входа, нищо интересно. просто сменяш номера и мериш другия вход (изчаква се малко време). |
|
| Автор: | MegatroniC [ Вто Яну 30, 2007 5:48 pm ] | |||||||||
| Заглавие: | ||||||||||
Здравейте отново, след като свърших някои други задължения с които загубих една седмица, ето че пак съм на тема PIC микроконтролери. След известно умуване ето какво скалъпих за преобразуването:
Правилно ли е ? edit: Малко кофти се размести кода като го копирах, но предполагам се няма проблем |
||||||||||
| Автор: | Ки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 серия !!!! Айде ползвай,кефи се и се развивай.Аз така правя Сорса не е мой но работи перфектно.Бях го изнамерил от нейде отдавна но от къде ли беше..... |
|
| Автор: | MegatroniC [ Сря Яну 31, 2007 12:37 am ] |
| Заглавие: | |
Мерси ! Моя пример го правих като съм смятал делта Т с 2^8 и ползвам резултата получен в ADRESH с дясно подравняване, и ми се ще някой да ми каже има ли нещо вярно в него А ти ми показваш кода за преобразуване на резултата от ADRESH и L, |
|
| Автор: | Ки4о [ Сря Яну 31, 2007 10:38 am ] |
| Заглавие: | |
banksel- това е директива - използва се вместо BSF STATUS,RPx rlf - ротация на ляво Виж си инструкциите,направи си деин тест проек в МП-лаба и ще разбереш как работи |
|
| Автор: | 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/ |
|