| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Проблем с АЦП на PIC16F88 http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=7897 |
Страница 1 от 2 |
| Автор: | the_electronic_m@n [ Пон Юни 14, 2010 11:19 am ] |
| Заглавие: | Проблем с АЦП на PIC16F88 |
Здравейте, АЦП-то на този пик "чете" напрежението подадено на входа му само след ресет. Многократно проверих инициализацията, свързването на изводите, но всичко е ок. Кода за работа на АЦП-то е следния: ADC bcf STATUS,RP0 bsf ADCON0,0 nop nop nop nop nop nop bcf INTCON,GIE bsf ADCON0,GO check btfsc ADCON0,GO goto check bcf ADCON0,0 bsf INTCON,GIE RETURN Кода с който извеждам данните е този: cvb сall ADC bsf STATUS,RP0 movf ADRESL,w bcf STATUS,RP0 movwf PORTB goto cvb Идеята тук е да тествам работата на АЦП-то, като с този код при промяна на подаваното напрежение на аналоговия вход, ще се променя и двоичното число на PORTB. Да, ама не, гимнастиката не се получава!? Извежда се числото "прочетено" след първоначалното подаване на напрежение и до там, сякаш това goto cvb не е написано в програмата, но го има. За тези два кода съм 100% сигурен, че работят, защото съм ги ползвал и при други пикове от 16 серия. Ако някой от Вас се е сблъсквал с подобен проблем ще Ви бъда много благодарен за съвети относно решаването му! |
|
| Автор: | plameniv [ Пон Юни 14, 2010 12:17 pm ] |
| Заглавие: | Re: Проблем с АЦП на PIC16F88 |
Бита за приключване на измерването, трябва да го следиш докато се промени, възможно е да не си изчакал меренето, всички АДЦ на PIC са бавни. Нямаш нужда от тези NOP просто проверявай GO когато се вдигне флага тогава си чети резултата!!! Когато викаш тази подпрограма първо проверяваш клетката ADCON0,0 дали си стратирал АДЦ ако си стратирал прескачаш всичко и проверяваш флага докато се нулира това означава че АДЦ е готово, чак когато прочетеш резултата нулираш този флаг че си си прочел АДЦ и е готов за ново мерене. Нещо такова: ADCL equ 0x2A; ресултат младши бит ADCH equ 0x2B; ресултат старши бит ...... ...... ADC btfsc ADCON0,0 GOTO Check bcf STATUS,RP0 bsf ADCON0,0 bsf ADCON0,GO Check btfsc ADCON0,GO goto Wait bcf ADCON0,0 BSF STATUS,RP0 MOVF ADRESL,W BCF STATUS,RP0 MOVWF ADCL MOVF ADRESH,W MOVWF ADCH FINISH RETLW 0 Wait RETLW 0x01 |
|
| Автор: | the_electronic_m@n [ Пон Юни 14, 2010 12:50 pm ] |
| Заглавие: | |
Доколкото съм запознат с pdf на пиковете на АДЦ то му трябва малко време за да се зареди "запомнящия " кондензатор за да беде коректно измерването. Именно за това съм използвал nop. Относно бързината на АЦП то - като установя флага GO и чакам да завърши меренето (когато падне GO), като през това време процесора цикли на тези 2 реда: check btfsc ADCON0,GO ; Завършило ли е преобразуването? goto check ; Не, провери отново Интересно как този код работи без проблем на PIC16F876/877, а тук не става! |
|
| Автор: | plameniv [ Пон Юни 14, 2010 1:06 pm ] | |||||||||
| Заглавие: | ||||||||||
NOP не върши нищо а самото зацикляне по надолу ще изчака, всеки NOP е един такт на 4MHZ = 1mks, трябват ти най малко 20мкс за да измери в най добрия случай, но няма смисъл да зацикляш програмата докато изчете резултата. Правиш го по интелигентно без да цикли просто от време на време викаш тази подпрограма и ако имаш някакви сметки или ако имаш да правиш каквото и да е по добре да иде там времето а когато стане готово АДЦ ще ти върне друг флаг , виж по нагоре ползвай RETLW |
||||||||||
| Автор: | the_electronic_m@n [ Пон Юни 14, 2010 1:17 pm ] |
| Заглавие: | |
Да, за nop си прав и за по-интелигентното също. Това ще го направя когато започна да пиша основната програма. Задачката сега е да подкарам АЦП-то, защото всичко останало в главната програма е вързано с него. Затова и съм драснал този код просто за тест. Компараторите са изключени (CMCON 0x07). Помислих,че от там е проблема, тъй като често ги забравям на default, но проблема си остава. |
|
| Автор: | didofen [ Пон Юни 14, 2010 2:37 pm ] |
| Заглавие: | |
поне веднъж получаваш ли точно измерване? |
|
| Автор: | the_electronic_m@n [ Пон Юни 14, 2010 2:47 pm ] |
| Заглавие: | |
Измерването е точно всеки път. Затова вече съм в задънена улица. Мери точно, но еднократно. Значи АЦП работи. Сменихчипа , пробвах с друг, с трети - същата история. Такова чудо не ми се е случвало досега, но пък за пръв път работя с PIC16f88. Дане би да има нещо специфично което да изпускам? |
|
| Автор: | Taner [ Пон Юни 14, 2010 2:48 pm ] |
| Заглавие: | |
Здравей, провери ли настройките на ANSEL регистъра (ANALOG SELECT REGISTER(ADDRESS 9Bh)) |
|
| Автор: | plameniv [ Пон Юни 14, 2010 3:35 pm ] | |||||||||
| Заглавие: | ||||||||||
Каква ти е ролята с това прекъсване, защо всеки път го установяваш, ако не го ползваш го установи в 0 и не го пипай ? |
||||||||||
| Автор: | the_electronic_m@n [ Пон Юни 14, 2010 3:37 pm ] |
| Заглавие: | |
Да, проверих ги и са правилно настроени, но забелязах нещо различно. Това по-долу е инициализацията, която трябва да се направи на PORTA дадена от MICROHIP. ПРитеснява ме отбелязаното в червено, а иминно BANKSEL. Що за животно е това. ПРи други 16ки не съм го срещал. BANKSEL PORTA ; select bank of PORTA CLRF PORTA ; Initialize PORTA by ; clearing output ; data latches BANKSEL ANSEL ; Select Bank of ANSEL MOVLW 0x00 ; Configure all pins MOVWF ANSEL ; as digital inputs MOVLW 0xFF ; Value used to ; initialize data ; direction MOVWF TRISA ; Set RA<7:0> as inputs Аз използвам bcf STATUS,RP0 или bsf STATUS,RP0 в зависимост от банката. Това дали е равносилно на BANKSEL. Ипри двата варианта компилатора не ми дава грешка. |
|
| Автор: | Ники [ Пон Юни 14, 2010 5:10 pm ] |
| Заглавие: | |
АЦП на Ф88 работи със сигурност. Добави си правилни инициализации на всички регистри свързани с модула, в кода който си дал, не се виждат някои от тях. Чети листите внимателно. |
|
| Автор: | didofen [ Пон Юни 14, 2010 5:11 pm ] |
| Заглавие: | |
това което те притеснява дори не е инструкция и прави точно това - наглася битовете за избор на банка с статус регистъра. аз също не ползвам такива, ами класически като теб си ги настройвам ръчно това че имаш поне едно вярно мерене означава че инициализацията ти е верна. виж си процедурата по подпрограмата, как се вика и как се излиза. по принцип изглежда добре. и остави наистина бита за прекъсването |
|
| Автор: | head_up [ Пон Юни 14, 2010 5:12 pm ] |
| Заглавие: | |
не че съм вещ в пиковете, ама по спомени от едно време - вместо ти да селектваш банката, която ти е необходима, за да имаш достъп до желаният от теб регистър - използваш BANKSEL посочвайки до кой от регистрите искаш достъп и промяната на битовете определящи банката би трябвало да стане "автоматично"- това ти спестява малко проверки кой регистър в коя банка е (тъй де ровене по даташита), че после "ръчно" да зареждаш съответните битове за определяне на банката за достъп. Едит: гледам че с колегата сме писали по едно и също време, ама нищо - то повторението е майка на знанието... или беше баща? оплескаха се роднинските връзки в тоя покварен свят |
|
| Автор: | the_electronic_m@n [ Пон Юни 14, 2010 5:46 pm ] |
| Заглавие: | |
Това е цялата инициализация на процесора: bcf STATUS,RP1 bsf STATUS,RP0 CLRF OSCTUNE movlw b'01110000';вътрешен RC генератор на movwf OSCCON ;8Mhz MOVLW b'00001101' ; Configure all pins MOVWF ANSEL ; MOVLW b'00111111' ; Value used to MOVWF TRISA ; MOVLW b'00000001' ; Value used to MOVWF TRISB ; movlw b'10000111' movwf OPTION_REG bsf PIE1,TMR2IE clrf PR2 movlw b'00000111';изключване на компараторите movwf CMCON movlw b'10000000';дясно подравняване,опорни напрежения movwf ADCON1 ; clrf CVRCON bcf STATUS,RP0 CLRF PORTA ; Initialize PORTA by CLRF PORTB ; Initialize PORTA by movlw b'01000001' movwf T2CON bcf PIR1,TMR2IF movlw b'11100000' movwf INTCON movlw b'01000000'; аналогов вход 0 movwf ADCON0 CLRF CCP1CON Гледах, четох, и нищо странно не забелязах |
|
| Автор: | Ники [ Пон Юни 14, 2010 6:32 pm ] |
| Заглавие: | |
не се задълбочих много в кода, единственото което ми прави впечатление, че разрешаваш прекъсване на таймер2, а имаш ли код да го обработваш, щото при възникване гърмиш като тапа на шампанско.. |
|
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|