| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Проблем с АЦПто на PIC16F876A http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=1954 |
Страница 1 от 2 |
| Автор: | elmi [ Пон Мар 06, 2006 7:53 pm ] |
| Заглавие: | Проблем с АЦПто на PIC16F876A |
Имам проблем с АЦПто на PIC16F876A ако може да момогне някой. Проблема е следния: от време на време АЦПто ми връща 0000 и немога да разбера от какво. Хардуера е наред. Блягодаря ви предварително. |
|
| Автор: | Predator_MF [ Пон Мар 06, 2006 8:42 pm ] |
| Заглавие: | |
А изчакваш ли достатъчно преди да вземеш резултата? |
|
| Автор: | elmi [ Пон Мар 06, 2006 8:59 pm ] |
| Заглавие: | |
Да изчаквам. Проверявам бита GO/DONE и когато е преклучило конвертирането тогава взимам резултата |
|
| Автор: | ¶ [ Пон Мар 06, 2006 9:21 pm ] |
| Заглавие: | |
Така поставен проблема, и да искаме не можем да ти помогнем. Поства се задължително част от кода, на прекъсване ли е , на полиране ли е, инициализация и т.н. Този процесор има и компаратори на крачетата на АЦП-то, забранени ли са ? Сигурно ли е че на заден фон някой друг програмен сегмент не забърсва резултата от АЦП-то ( имах такъв тъп случай, загубих няколко часа, докато разбера какво правя). По време на конверсията бъзикаш ли TRISA и PORTA ? Ако външната схема е някакъв бисер на схемотехниката, също можеш нещо от нея да постнеш. Така най-бързо ще може да ти се помогне. Иначе, ще отидат 2-3 дни във въпроси и отговори, докато разбереш къде е причината. |
|
| Автор: | Dimiter [ Пон Мар 06, 2006 9:22 pm ] |
| Заглавие: | |
мда |
|
| Автор: | elmi [ Пон Мар 06, 2006 9:46 pm ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
ОК извинявайте ама съм нов в тия работи Сега ще ви обясня. АЦПто не е на прекъсване но ползвам прекъсване от таймер0. Порт А го ползвам само за АЦПто. Използвам RA0 и RA1 за аналогови входове и външни Vреф+ и Vреф-. Другите пинове на порт А ми са свободни. Конфигурирам го по следния начин
а резултата го получавам така
Възможно ли е при прекъсването от таймера да става нещо и резултата да се губи? |
|||||||||||||||||||
| Автор: | Predator_MF [ Вто Мар 07, 2006 12:51 am ] |
| Заглавие: | |
На тоя сорс всичко ми изглежда прилично (е, като изключим многото BSF/BCF които могат да бъдат заместени с movwf...). В случая виждам, че мериш AD1, единственото за което се сещам в момента е че може да имаш някакъв проблем с хардуера, но ти го изключваш като вариант. Другото важно е, има едно време което трябва да изчакваш при превключване на каналите преди да вдигнеш Go/Done бита за да четеш |
|
| Автор: | ¶ [ Вто Мар 07, 2006 1:05 am ] | ||||||||||||||||||||||||||||||||||||
| Заглавие: | |||||||||||||||||||||||||||||||||||||
Постни кода на запазване на служебните регистри, когато влизаш в прекъсването на TMR0. При влизане трябва да изглежда така ( това е на MicroChip код ):
, а при напускане на прекъсването така:
Клетките Wtemp, STATUStemp,PCLATHtemp и FSRtemp ги разполагаш на симетрични адреси в банка0, банка1, банка2 и банк3. Най-удобно е така:
Много е важно, преди да си запазил STATUS регистъра да не използваш инструкция movf, тъй като тя променя Z флага. Сега по инициализацията на ADC-то: още първата ти инструкция е проблематична, първо се инициализират регистрите на ADC-то и едва тогава се включва захранването на ADC модула. Даваш такт Fosc/8. Fosc/8 дали не превишава максимално допустимата за АЦП-то ? ADCconfig ти е направена като подпрограма. Сигурен ли си, че я извикваш от нулевата банка RAM ( RP0 = 0 ) ? Имаш едно времезакъснение преди стартирането на ново измерване. Това времезакъснение е технологично необходимо време на ADC-то за да се разреди вътрешния му запомнящ кондензатор. Виж в data sheet на професора, според твоята Fosc/8 колко трябва да бъде минимума на това време. Стабилни ли са ти опорните напрежения ? Да не би да има по някой пик в тях ? За друго не се сещам. П.П. И един безплатен съвет
|
|||||||||||||||||||||||||||||||||||||
| Автор: | evc [ Вто Мар 07, 2006 9:31 am ] |
| Заглавие: | |
А направил ли си пина дето ползваш за вход на АЦП-то, вход? (съответния TRIS -> 1) |
|
| Автор: | elmi [ Вто Мар 07, 2006 9:44 am ] | ||||||||||||||||||
| Заглавие: | |||||||||||||||||||
Влизам в прекъсването на TMR0 така:
а излизането го правя
има разлика с това което казваш. Fosc/8 не преминава максимално допостимата на АЦПто. Извиквам ADCconfig от нулева банка, обаче не правя това време закъснение преди новото измерване което казваш. Ще подледана data sheetа. Опорнито е стабилно ползжам TL431. Благодаря за съсета за многото bsf i bcf |
|||||||||||||||||||
| Автор: | ¶ [ Вто Мар 07, 2006 9:50 am ] |
| Заглавие: | |
Значи всичко е ясно, АЦП-то ти работи, a проблема ти е в прекъсването, и по-точно във втората инструкция. Запазваш STATUS регистъра, но инструкцията променя _Z флага, така че запазваш променен STATUS регистър. Като излезне от прекъсването STATUS регистъра е с променен Z флаг. Оттук и това, че от време на време ти дава АЦП-то резултат 0. Използвай кода, който постнах по-горе, за влизане/излизане в/от прекъсване и ще се оправи работата. Успех ! П.П. Сега погледнах кода на MicroChip за влизане в прекъсване, значи не е нужно 4--те клетки да са на симетрични адреси, достатъчно е само Wtemp, тъй като само при запазване нa WREG не е ясно в коя банка RAM сме. След като се запази WREG следва превключване в банка 0, така че STATUStemp, PCLATHtemp & FSRtemp може да са на произволно място в банка 0. |
|
| Автор: | elmi [ Вто Мар 07, 2006 9:50 am ] | |||||||||
| Заглавие: | ||||||||||
Като кажа че съотвентия пин го ползвам за аналогов вход не е ли достатъчно? TRISA не го променям. |
||||||||||
| Автор: | elmi [ Вто Мар 07, 2006 9:52 am ] | |||||||||
| Заглавие: | ||||||||||
Благодаря ти много Ще го оправя |
||||||||||
| Автор: | evc [ Вто Мар 07, 2006 10:19 am ] |
| Заглавие: | |
Еми трябва да ти кажа, че не е достатъчно! Ако си го направил изход в "0" АЦП-то това и ще ти мери. |
|
| Автор: | elmi [ Вто Мар 07, 2006 10:39 am ] |
| Заглавие: | |
ама то не мери постояно 0. Само от време на време ми връща 0. Мисля че проблема е точно от прекъсването на ТМR0 като казва ¶ |
|
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|