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

Регистриран на: Пон Мар 06, 2006 7:47 pm
Мнения: 43
Местоположение: Пловдив
Мнение Проблем с АЦПто на PIC16F876A
Имам проблем с АЦПто на PIC16F876A ако може да момогне някой. Проблема е следния: от време на време АЦПто ми връща 0000 и немога да разбера от какво. Хардуера е наред.
Блягодаря ви предварително.


Пон Мар 06, 2006 7:53 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
А изчакваш ли достатъчно преди да вземеш резултата?


Пон Мар 06, 2006 8:42 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Мар 06, 2006 7:47 pm
Мнения: 43
Местоположение: Пловдив
Мнение 
Да изчаквам. Проверявам бита GO/DONE и когато е преклучило конвертирането тогава взимам резултата


Пон Мар 06, 2006 8:59 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
Така поставен проблема, и да искаме не можем да ти помогнем. Поства се задължително част от кода, на прекъсване ли е , на полиране ли е, инициализация и т.н. Този процесор има и компаратори на крачетата на АЦП-то, забранени ли са ?
Сигурно ли е че на заден фон някой друг програмен сегмент не забърсва резултата от АЦП-то ( имах такъв тъп случай, загубих няколко часа, докато разбера какво правя). По време на конверсията бъзикаш ли TRISA и PORTA ?
Ако външната схема е някакъв бисер на схемотехниката, също можеш нещо от нея да постнеш. Така най-бързо ще може да ти се помогне. Иначе, ще отидат 2-3 дни във въпроси и отговори, докато разбереш къде е причината.

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


Последна промяна на Пон Мар 06, 2006 9:23 pm, променена общо 1 път



Пон Мар 06, 2006 9:21 pm
Профил WWW
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Пет Фев 04, 2005 3:18 pm
Мнения: 309
Местоположение: Sofia
Мнение 
мда


Пон Мар 06, 2006 9:22 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Мар 06, 2006 7:47 pm
Мнения: 43
Местоположение: Пловдив
Мнение 
ОК извинявайте ама съм нов в тия работи
Сега ще ви обясня. АЦПто не е на прекъсване но ползвам прекъсване от таймер0. Порт А го ползвам само за АЦПто. Използвам RA0 и RA1 за аналогови входове и външни Vреф+ и Vреф-. Другите пинове на порт А ми са свободни. Конфигурирам го по следния начин
Код:
ADCconfig
   BSF   ADCON0,0   

   BCF   ADCON0,5   
   BCF   ADCON0,4   ; ADCHS1=0
   BCF   ADCON0,3   ; ADCHS0=0

   BCF   ADCON0,7   ; ADCS1=0
   BSF   ADCON0,6   ; ADCS0=1

   BSF   STATUS,RP0   ; Bank1
   clrf   ADCON1
   BSF   ADCON1,0
   BSF   ADCON1,2
   BSF   ADCON1,3   
   BSF   ADCON1,7   ; ADFM=1
   BCF   STATUS,RP0   ; Bank0
   return

а резултата го получавам така
Код:
meashur

   clrf   ADCcount
aqui   
   decfsz   ADCcount,f
   goto   aqui
   bsf   ADCON0,2
ADCloop
   btfsc   ADCON0,2
   goto   ADCloop
   movf   ADRESH,w
   movwf   ADCconh
   bsf   STATUS,RP0
   movf   ADRESL,w
   bcf   STATUS,RP0
   movwf   ADCconl

   clrf   ADCcount
aqui1
   decfsz   ADCcount,f
   goto   aqui1

   return

Възможно ли е при прекъсването от таймера да става нещо и резултата да се губи?


Последна промяна elmi на Вто Мар 07, 2006 9:26 pm, променена общо 2 пъти



Пон Мар 06, 2006 9:46 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
На тоя сорс всичко ми изглежда прилично (е, като изключим многото BSF/BCF които могат да бъдат заместени с movwf...). В случая виждам, че мериш AD1, единственото за което се сещам в момента е че може да имаш някакъв проблем с хардуера, но ти го изключваш като вариант. Другото важно е, има едно време което трябва да изчакваш при превключване на каналите преди да вдигнеш Go/Done бита за да четеш


Вто Мар 07, 2006 12:51 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
Постни кода на запазване на служебните регистри, когато влизаш в прекъсването на TMR0. При влизане трябва да изглежда така ( това е на MicroChip код ):
Код:
        movwf    Wtemp       ; Store W-reg
   swapf    STATUS,W    ; Swap status to be saved into W
   clrf    STATUS       ; bank 0, Clears IRP,RP1,RP0
   movwf    STATUStemp    ; Save status to bank zero STATUS_TEMP
   movf    PCLATH,W   ; pages 1, 2 and/or 3
   movwf    PCLATHtemp   ; Save PCLATH into W
   clrf    PCLATH       ; Page zero, regardless of current page
   movf    FSR,W       ; Copy FSR to W
   movwf    FSRtemp    ; Copy FSR from W to FSR_TEMP

, а при напускане на прекъсването така:
Код:
   clrf   STATUS      ; bank0
   movf   FSRtemp,W   ; Restore FSR register
   movwf   FSR
   movf    PCLATHtemp,W    ; Restore PCLATH
   movwf    PCLATH       ; Move W into PCLATH
   swapf    STATUStemp,W    ; Swap STATUS_TEMP register into W
            ; (sets bank to original state)
   movwf    STATUS       ; Move W into STATUS register
   swapf    Wtemp,F    ; Swap W_TEMP
   swapf    Wtemp,W    ; Swap W_TEMP into W
   retfie         ; end of interrupt vector


Клетките Wtemp, STATUStemp,PCLATHtemp и FSRtemp ги разполагаш на симетрични адреси в банка0, банка1, банка2 и банк3. Най-удобно е така:
Код:

CBLOCK 0x7C
Wtemp,STATUStemp,PCLATHtemp,FSRtemp
ENDC

CBLOCK 0xFC
ReserveBank1:4
ENDC

CBLOCK 0x17C
ReserveBank2:4
ENDC

CBLOCK 0x1FC
ReserveBank3:4
ENDC



Много е важно, преди да си запазил STATUS регистъра да не използваш инструкция movf, тъй като тя променя Z флага.

Сега по инициализацията на ADC-то: още първата ти инструкция е проблематична, първо се инициализират регистрите на ADC-то и едва тогава се включва захранването на ADC модула. Даваш такт Fosc/8. Fosc/8 дали не превишава максимално допустимата за АЦП-то ? ADCconfig ти е направена като подпрограма. Сигурен ли си, че я извикваш от нулевата банка RAM ( RP0 = 0 ) ? Имаш едно времезакъснение преди стартирането на ново измерване. Това времезакъснение е технологично необходимо време на ADC-то за да се разреди вътрешния му запомнящ кондензатор. Виж в data sheet на професора, според твоята Fosc/8 колко трябва да бъде минимума на това време. Стабилни ли са ти опорните напрежения ? Да не би да има по някой пик в тях ? За друго не се сещам.

П.П. И един безплатен съвет :wink: , както ти каза и Predator_MF, не е прегледно да използваш толкова инструкции bsf и bcf при положение, че за ADCON1 можеш да напишеш примерно така:
Код:
movlw b'10001101'
movwf ADCON1

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


Вто Мар 07, 2006 1:05 am
Профил WWW
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Пет Окт 21, 2005 8:45 am
Мнения: 499
Мнение 
А направил ли си пина дето ползваш за вход на АЦП-то, вход? (съответния TRIS -> 1)

_________________
Простотията е Божи дар, но човек не бива да парадира с подаръците си!


Вто Мар 07, 2006 9:31 am
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Мар 06, 2006 7:47 pm
Мнения: 43
Местоположение: Пловдив
Мнение 
Влизам в прекъсването на TMR0 така:
Код:
   movwf   backup_w
   movf   STATUS,w
   movwf   backup_st
   movf   PCLATH,w
   movwf   backup_PCL
   clrf   PCLATH


а излизането го правя
Код:
   movf   backup_PCL,w
   movwf   PCLATH
   movf   backup_st,w
   movwf   STATUS
   movf   backup_w,w
   retfie

има разлика с това което казваш.
Fosc/8 не преминава максимално допостимата на АЦПто. Извиквам ADCconfig от нулева банка, обаче не правя това време закъснение преди новото измерване което казваш. Ще подледана data sheetа. Опорнито е стабилно ползжам TL431.
Благодаря за съсета за многото bsf i bcf :)


Вто Мар 07, 2006 9:44 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
Значи всичко е ясно, АЦП-то ти работи, a проблема ти е в прекъсването, и по-точно във втората инструкция. Запазваш STATUS регистъра, но инструкцията променя _Z флага, така че запазваш променен STATUS регистър. Като излезне от прекъсването STATUS регистъра е с променен Z флаг. Оттук и това, че от време на време ти дава АЦП-то резултат 0. Използвай кода, който постнах по-горе, за влизане/излизане в/от прекъсване и ще се оправи работата.
Успех !

П.П. Сега погледнах кода на MicroChip за влизане в прекъсване, значи не е нужно 4--те клетки да са на симетрични адреси, достатъчно е само Wtemp, тъй като само при запазване нa WREG не е ясно в коя банка RAM сме. След като се запази WREG следва превключване в банка 0, така че STATUStemp, PCLATHtemp & FSRtemp може да са на произволно място в банка 0.

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


Последна промяна на Вто Мар 07, 2006 9:54 am, променена общо 1 път



Вто Мар 07, 2006 9:50 am
Профил WWW
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Мар 06, 2006 7:47 pm
Мнения: 43
Местоположение: Пловдив
Мнение 
evc написа:
А направил ли си пина дето ползваш за вход на АЦП-то, вход? (съответния TRIS -> 1)


Като кажа че съотвентия пин го ползвам за аналогов вход не е ли достатъчно? TRISA не го променям.


Вто Мар 07, 2006 9:50 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Мар 06, 2006 7:47 pm
Мнения: 43
Местоположение: Пловдив
Мнение 
¶ написа:
Значи всичко е ясно, АЦП-то ти работи, a проблема ти е в прекъсването, и по-точно във втората инструкция. Запазваш STATUS регистъра, но инструкцията променя _Z флага, така че запазваш променен STATUS регистър. Като излезне от прекъсването STATUS регистъра е с променен Z флаг. Оттук и това, че от време на време ти дава АЦП-то резултат 0. Използвай кода, който постнах по-горе, за влизане/излизане в/от прекъсване и ще се оправи работата.
Успех !


Благодаря ти много :)
Ще го оправя


Вто Мар 07, 2006 9:52 am
Профил
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Пет Окт 21, 2005 8:45 am
Мнения: 499
Мнение 
Еми трябва да ти кажа, че не е достатъчно! Ако си го направил изход в "0" АЦП-то това и ще ти мери.

_________________
Простотията е Божи дар, но човек не бива да парадира с подаръците си!


Вто Мар 07, 2006 10:19 am
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пон Мар 06, 2006 7:47 pm
Мнения: 43
Местоположение: Пловдив
Мнение 
ама то не мери постояно 0. Само от време на време ми връща 0. Мисля че проблема е точно от прекъсването на ТМR0 като казва ¶


Вто Мар 07, 2006 10:39 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 16 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

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


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

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