Отговори на тема  [ 20 мнения ]  Отиди на страница 1, 2  Следваща
Проблем с АЦП на PIC16F88 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Пет Окт 05, 2007 8:34 pm
Мнения: 76
Местоположение: Русе
Мнение Проблем с АЦП на 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 серия.

Ако някой от Вас се е сблъсквал с подобен проблем ще Ви бъда много благодарен за съвети относно решаването му!


Пон Юни 14, 2010 11:19 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Окт 10, 2004 9:55 am
Мнения: 1718
Мнение 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

_________________
Избийте баламите и тарикатите сами ще умрат!
Няма невъзможни работи - има много трудни работи!
----------------------------------------------------------------------------------
"Я в Москве с киркой уран найду, при такой повышенной зарплате" !


Последна промяна plameniv на Пон Юни 14, 2010 1:10 pm, променена общо 4 пъти



Пон Юни 14, 2010 12:17 pm
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Пет Окт 05, 2007 8:34 pm
Мнения: 76
Местоположение: Русе
Мнение 
Доколкото съм запознат с pdf на пиковете на АДЦ то му трябва малко време за да се зареди "запомнящия " кондензатор за да беде коректно измерването. Именно за това съм използвал nop. Относно бързината на АЦП то - като установя флага GO и чакам да завърши меренето (когато падне GO), като през това време процесора цикли на тези 2 реда:

check btfsc ADCON0,GO ; Завършило ли е преобразуването?
goto check ; Не, провери отново

Интересно как този код работи без проблем на PIC16F876/877, а тук не става!


Пон Юни 14, 2010 12:50 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Окт 10, 2004 9:55 am
Мнения: 1718
Мнение 
the_electronic_m@n написа:
Доколкото съм запознат с pdf на пиковете на АДЦ то му трябва малко време за да се зареди "запомнящия " кондензатор за да беде коректно измерването. Именно за това съм използвал nop. Относно бързината на АЦП то - като установя флага GO и чакам да завърши меренето (когато падне GO), като през това време процесора цикли на тези 2 реда:

check btfsc ADCON0,GO ; Завършило ли е преобразуването?
goto check ; Не, провери отново

Интересно как този код работи без проблем на PIC16F876/877, а тук не става!

NOP не върши нищо а самото зацикляне по надолу ще изчака, всеки NOP е един такт на 4MHZ = 1mks, трябват ти най малко 20мкс за да измери в най добрия случай, но няма смисъл да зацикляш програмата докато изчете резултата.
Правиш го по интелигентно без да цикли просто от време на време викаш тази подпрограма и ако имаш някакви сметки или ако имаш да правиш каквото и да е по добре да иде там времето а когато стане готово АДЦ ще ти върне друг флаг , виж по нагоре ползвай RETLW

_________________
Избийте баламите и тарикатите сами ще умрат!
Няма невъзможни работи - има много трудни работи!
----------------------------------------------------------------------------------
"Я в Москве с киркой уран найду, при такой повышенной зарплате" !


Пон Юни 14, 2010 1:06 pm
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Пет Окт 05, 2007 8:34 pm
Мнения: 76
Местоположение: Русе
Мнение 
Да, за nop си прав и за по-интелигентното също. Това ще го направя когато започна да пиша основната програма. Задачката сега е да подкарам АЦП-то, защото всичко останало в главната програма е вързано с него. Затова и съм драснал този код просто за тест.

Компараторите са изключени (CMCON 0x07). Помислих,че от там е проблема, тъй като често ги забравям на default, но проблема си остава.


Пон Юни 14, 2010 1:17 pm
Профил ICQ
Ранг: Популярен
Ранг: Популярен

Регистриран на: Вто Юни 27, 2006 11:13 am
Мнения: 381
Местоположение: Варна
Мнение 
поне веднъж получаваш ли точно измерване?


Пон Юни 14, 2010 2:37 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Пет Окт 05, 2007 8:34 pm
Мнения: 76
Местоположение: Русе
Мнение 
Измерването е точно всеки път. Затова вече съм в задънена улица. Мери точно, но еднократно. Значи АЦП работи. Сменихчипа , пробвах с друг, с трети - същата история. Такова чудо не ми се е случвало досега, но пък за пръв път работя с PIC16f88. Дане би да има нещо специфично което да изпускам?


Пон Юни 14, 2010 2:47 pm
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Пет Юли 08, 2005 3:46 pm
Мнения: 112
Местоположение: Пловдив
Мнение 
Здравей,
провери ли настройките на ANSEL регистъра (ANALOG SELECT REGISTER(ADDRESS 9Bh))
:)


Пон Юни 14, 2010 2:48 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Окт 10, 2004 9:55 am
Мнения: 1718
Мнение 
the_electronic_m@n написа:
Измерването е точно всеки път. Затова вече съм в задънена улица. Мери точно, но еднократно. Значи АЦП работи. Сменихчипа , пробвах с друг, с трети - същата история. Такова чудо не ми се е случвало досега, но пък за пръв път работя с PIC16f88. Дане би да има нещо специфично което да изпускам?

Каква ти е ролята с това прекъсване, защо всеки път го установяваш, ако не го ползваш го установи в 0 и не го пипай ?

_________________
Избийте баламите и тарикатите сами ще умрат!
Няма невъзможни работи - има много трудни работи!
----------------------------------------------------------------------------------
"Я в Москве с киркой уран найду, при такой повышенной зарплате" !


Пон Юни 14, 2010 3:35 pm
Профил
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Пет Окт 05, 2007 8:34 pm
Мнения: 76
Местоположение: Русе
Мнение 
Да, проверих ги и са правилно настроени, но забелязах нещо различно. Това по-долу е инициализацията, която трябва да се направи на 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 3:37 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение 
АЦП на Ф88 работи със сигурност.

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

Чети листите внимателно.


Пон Юни 14, 2010 5:10 pm
Профил
Ранг: Популярен
Ранг: Популярен

Регистриран на: Вто Юни 27, 2006 11:13 am
Мнения: 381
Местоположение: Варна
Мнение 
това което те притеснява дори не е инструкция и прави точно това - наглася битовете за избор на банка с статус регистъра. аз също не ползвам такива, ами класически като теб си ги настройвам ръчно :)
това че имаш поне едно вярно мерене означава че инициализацията ти е верна. виж си процедурата по подпрограмата, как се вика и как се излиза. по принцип изглежда добре. и остави наистина бита за прекъсването


Пон Юни 14, 2010 5:11 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Юни 01, 2008 9:54 pm
Мнения: 1503
Местоположение: Пловдив
Мнение 
не че съм вещ в пиковете, ама по спомени от едно време - вместо ти да селектваш банката, която ти е необходима, за да имаш достъп до желаният от теб регистър - използваш BANKSEL посочвайки до кой от регистрите искаш достъп и промяната на битовете определящи банката би трябвало да стане "автоматично"- това ти спестява малко проверки кой регистър в коя банка е (тъй де ровене по даташита), че после "ръчно" да зареждаш съответните битове за определяне на банката за достъп.

Едит: гледам че с колегата сме писали по едно и също време, ама нищо - то повторението е майка на знанието... или беше баща? оплескаха се роднинските връзки в тоя покварен свят :D


Пон Юни 14, 2010 5:12 pm
Профил WWW
Ранг: Минаващ
Ранг: Минаващ
Аватар

Регистриран на: Пет Окт 05, 2007 8:34 pm
Мнения: 76
Местоположение: Русе
Мнение 
Това е цялата инициализация на процесора:

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


Гледах, четох, и нищо странно не забелязах :( . Затова постнах цялата инициализация, може би когато повече очи гледат, все някое ще забележи нещо :roll:


Пон Юни 14, 2010 5:46 pm
Профил ICQ
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Съб Окт 30, 2004 11:19 pm
Мнения: 609
Мнение 
не се задълбочих много в кода, единственото което ми прави впечатление, че разрешаваш прекъсване на таймер2, а имаш ли код да го обработваш, щото при възникване гърмиш като тапа на шампанско..


Пон Юни 14, 2010 6:32 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 20 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 3 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни