|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 11:46 pm
Странен проблем с CCP на PIC - моля за помощ
| Автор |
Съобщение |
|
t_i_t_o
Ранг: Почетен член
Регистриран на: Вто Окт 25, 2005 10:54 am Мнения: 896
|
 Странен проблем с CCP на PIC - моля за помощ
Меря ширината на един импулс но ПИКа ми дава прекалено много грешни данни, на осцилоскоп ясно се вижда че самите импулси са чисти, остава въпроса защо се получава така? Бъг в ПИКа или аз не правя нещата както трябва?
Това е кода:
п.с. Гарантирано е че таймера има по голям период на препълване от най широкия импулс за мерене.
Преди време за една дипломна работа пак имах същия проблем - мереше се коефициент за запълване от температурен датчик - тогава закърпих нещата, но сега наистина трябва да ги реша 
|
| Пон Окт 02, 2006 9:09 am |
|
 |
|
mndsl
Ранг: Новодошъл
Регистриран на: Вто Май 23, 2006 4:56 pm Мнения: 113 Местоположение: Варна
|
Кой ПИК използваш?
|
| Пон Окт 02, 2006 9:15 am |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
PIC-а е някаква 16-ка, компилатора като гледам е CCS (където volatile и static нямат ефект).
Проблема е много вероятно да е в следната ти сметка:
По-точно - при Front меренето приравняваш ccp2_start на регистъра ccp2, който в момента е някакво 16-битово число, при Rear измерване имаш разликата между ccp2 и това число, обаче представи си, че в първия момент (Front) имаш число близко до 65536, във втория момент когато правиш разликата ccp2 вече е превъртял през 0 и получаваш грешна сметка....в случая е много възможно да имаш повече от 50% грешки в зависимост от измерваната честота.
PS: Направи така, че при Front (стартиране) на измерването да зануляваш CCP2, а при следващия импулс просто четеш резултата от него 
|
| Пон Окт 02, 2006 12:02 pm |
|
 |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 17, 2005 5:07 pm Мнения: 813 Местоположение: Сливен
|
Нулираш ли таймера преди всяко измерване.
Има чудесен работещ пример май беше за измерването на реакция на реле . Потърси го в примерите на CCS-a.

|
| Пон Окт 02, 2006 1:30 pm |
|
 |
|
t_i_t_o
Ранг: Почетен член
Регистриран на: Вто Окт 25, 2005 10:54 am Мнения: 896
|
Единия ПИК беше 16ф628 а другия май 16ф87.
Проблема с препълването според мен го няма, просто защото дори и при препълване аритметиката си е правилна стига да е гарантирано че мерения импулс е по малак и не може да позволи таймера да препълни два пъти, пример:
първо мерене 0xFFF0, второ 0x0008, разликата 8-0xFFF0 е 0x0018 - т.е. точно колкото си е.
Друг е въпроса ако наистина статик не важи, т.е. ако стойността не се пази между две извиквания, от друга страна обаче ПИКовете нямат стек за променливи и ако всички променливи са на едно и също място винаги то стойността не би трябвало да се губи.
Според мен няма нужда таймера да се нулира, просто защото аритметиката си е вярна дори и таймера да е препълнил (еднократно).
|
| Пон Окт 02, 2006 1:34 pm |
|
 |
|
mndsl
Ранг: Новодошъл
Регистриран на: Вто Май 23, 2006 4:56 pm Мнения: 113 Местоположение: Варна
|
#locate ccp2 = 0x1B
на адрес 0x1B няма нищо - Unimplemented data memory locations, read as ‘0’.
При Capture режима резултата се записва в CCPR1L и CCPR1H регистрите, т.е. в тях се прехвърля стойноста на Таймер1 при импулс на входа. Този ccp2 регистър на адрес 0х1В, освен че не съществува, няма нищо общо с това което искаш да направиш.
Освен това с тази програма дори и да тръгне ще измериш периода на импулсите , а не ширината им ,защото CCP модула се задейства или само по преден или само по заден фронт. За да измериш ширината трябва след като получиш стойноста при предния фронт, да промениш CCP Модула да сработва на заден фронт.
Хората са направили такава хубава документация, ама кой да чете...
|
| Пон Окт 02, 2006 2:15 pm |
|
 |
|
t_i_t_o
Ранг: Почетен член
Регистриран на: Вто Окт 25, 2005 10:54 am Мнения: 896
|
Съжалявам че съм те подвел с ПИКа - става дума за 16Ф73, при него точно на 0х1В си е ССР регистъра от който трябва да чета.
А сега по поста ти: пределно ми е ясно как работи ССР модула. Ако малко се загледаш ще видиш че точно втория ред в прекъснването сменя фронтовете.
Доста добре съм проче менюала.
|
| Пон Окт 02, 2006 2:35 pm |
|
 |
|
mndsl
Ранг: Новодошъл
Регистриран на: Вто Май 23, 2006 4:56 pm Мнения: 113 Местоположение: Варна
|
Ами с това трябваше да започнеш. Като даваш грешно задание е нормално да получиш грешен отговор.
Като се задават такива въпроси трябва да се дава всичка необходима информация. Как е настроен таймер1 и делите му, как е конфигуриран ССП модула, колко е честотата на процесора. Даваш 1 функция и ние трябва да гадаем защо не работи ли?! Вече за 2-и път задавам въпрос за доизясняване и само си губим взаимно времето.
Не го приемай лично, просто казвам на всички като задават въпроси да изясняват всичко, за да се реши проблема с минимално писане и за максимално кратко време.
|
| Пон Окт 02, 2006 2:54 pm |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Аз все си мисля, че няма да се затрудниш особено да проваш със зануляване на CCP2, два реда имаш да напишеш, пък и песитш едни 2 байта в RAM-а...
И недей да разчиташ на CCS компилатора да ти направи сметката, както я написа, освен това за него две различни неща са числото 13 и (unsigned int16)13
|
| Пон Окт 02, 2006 5:56 pm |
|
 |
|
t_i_t_o
Ранг: Почетен член
Регистриран на: Вто Окт 25, 2005 10:54 am Мнения: 896
|
Нарочно не искам да нулирам таймера (не ССР) защото това ще ми вкара стaтична грешка, т.е. крайния резултат трябва да го събера с времето което е минало от каптуре момента до нулирането на таймера. Разчитам на сметките защото са такива, т.е. при изваждане на голямо от малко число се получава един вид "обратно" препълване (преход от 0 към 0xFFFF) и резултата си е пак както трябва.
|
| Вто Окт 03, 2006 8:26 pm |
|
 |
|
perlsite
Ранг: Ориентиран
Регистриран на: Пон Апр 17, 2006 1:44 pm Мнения: 291
|
Виждам, че хем не работи и хем искаш да е по твоя начин
Защо не пробваш както предлагат колегите... може и да стане 
|
| Вто Окт 03, 2006 9:05 pm |
|
 |
|
VSU
Ранг: Напреднал
Регистриран на: Нед Авг 14, 2005 1:08 pm Мнения: 433 Местоположение: Казанлък
|
Просто защото не е необходимо да го прави както му казват колегите подхода му е правилен така че давай тито
|
| Сря Окт 04, 2006 12:15 am |
|
 |
|
Predator_MF
Ранг: Форумен бог
Регистриран на: Чет Окт 07, 2004 1:22 pm Мнения: 1949 Местоположение: София
|
Ами аз съм ползвал CCP в няколко 16-ки, в 12-kа и 18-ка, никъде не съм срещал подобен проблем, мери се абсолютно точно...поне CCP е мястото където Microchip нямат errata и всичко работи както си го пише. Евентуално се опитвам да помогна на колегата t_i_t_o с прост съвет, опита ще отнеме до 5 минути, ама като е сигурен, че проблема не е там, да продължава напред...все пак кода, който е постнал съдържа само тези два реда и по пътя на логиката, като изключим проблем в инициализацията и хардуера на CCP, остава само този код 
|
| Сря Окт 04, 2006 12:37 am |
|
 |
|
VSU
Ранг: Напреднал
Регистриран на: Нед Авг 14, 2005 1:08 pm Мнения: 433 Местоположение: Казанлък
|
Predator много добре знаеш че проблема не е до CCP модула както ти така и аз и много други тук са ползвали кепчара и той си работи .Много вероятно е да има смущаващи импулси които да генерират прекъсване и да дават грешки а най вероятно е да има проблем със софта от един фрагмен от програмата не може да се каже кое как е ами ако има и друго прекъсване а ако има и трето  ами ако ..... ами ако ..... та нека зор имащите или да постват по обширен код или да тестват само проблема си и тогава да плачат ако са сигурни че проблема е в кода иначе само догадки 
|
| Сря Окт 04, 2006 1:08 am |
|
 |
|
valioman
Ранг: Почетен член
Регистриран на: Съб Сеп 17, 2005 5:07 pm Мнения: 813 Местоположение: Сливен
|
if ( FE_RE )
ccp2_start = ccp2;
else
pulse_width = ccp2 - ccp2_start;
Ами ако точно тук Таймера се препълва и почвва от нулата а преди това ccp2_start ти е примерно 250 а ccp2 ти е 100 ?????
За предпочитане е да истирвеш един период но да си нулираш таймера така резултата ти е сигурен.
А и колко време мислиш отнема едно set_timer1(0);
Поздрави!!!
|
| Сря Окт 04, 2006 9:01 am |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 1 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|