Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

CCP capture
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=6178
Страница 1 от 1

Автор:  mash [ Сря Окт 15, 2008 12:28 pm ]
Заглавие:  CCP capture

здравейте
За да измеря продължителността на импулса позвам това:
setup_ccp1(CCP_CAPTURE_RE); // ccp1 - da reagira na PREDEN front
CCP1IF=0;
T1IF=0;
while (!CCP1IF && !T1IF);
t1_=CCP_1; // 4islo pri preden front
setup_ccp1(CCP_CAPTURE_FE); // ccp1 - da reagira na Zaden front
CCP1IF=0;
while (!CCP1IF && !T1IF);
t2_=CCP_1; // 4islo pri zaden front
digit = (t2_-t1_) ;

Как да измеря целия период? т.е. от преден фронт пак до преден?

Автор:  setoy [ Сря Окт 15, 2008 12:35 pm ]
Заглавие: 

Естествено :)

Автор:  mash [ Сря Окт 15, 2008 12:39 pm ]
Заглавие: 

setoy написа:
Естествено :)

кое ти се стори естествено ?

Автор:  setoy [ Сря Окт 15, 2008 12:41 pm ]
Заглавие:  Re: CCP capture

mash написа:
Как да измеря целия период? т.е. от преден фронт пак до преден?


Отговарям : естествено, че да. Или от заден до заден, все едно.

Автор:  perro_iv [ Чет Окт 16, 2008 4:42 pm ]
Заглавие: 

Особеното при този модул е, че за засичане на стойността се използва ТМР1, но трябва да го нулираш софтуерно при фронта от който започва измерването, за да ти измери коректно стойността.
Също трябва да си сигурен че не се е препълнил в рамките на измервания период или ако да, да знаеш колко пъти и да коригираш крайната стойност.

Автор:  mash [ Чет Окт 16, 2008 6:37 pm ]
Заглавие: 

Ами.. да това го правя т.е. нулирам го, но аз ще измервам стойности от порядъка на 600 микросекунди. Тактовата честота е 4 МГц. Т.е. един такт една микросекунда. Практически за моите цели няма да се препълни. Проблем ми е да разбера как да го накарам да мери от нарастващ фронт пак до нарастващ. т.е. цялата продължителност на периода?

Автор:  perro_iv [ Чет Окт 16, 2008 10:26 pm ]
Заглавие: 

Ами кво има да му се чудиш:
1. Следиш CCP-пина и чакаш положителен фронт, примерно btfss или while(CCP.пин == 0).
2. На следващата стъпка от програмата нулираш ТМР1 и активираш CCP модула, като го конфигурираш да реагира по положителен фронт.
3.Чакаш флага и това е...

Автор:  MYXATA [ Чет Окт 16, 2008 10:50 pm ]
Заглавие: 

mash написа:
Ами.. да това го правя т.е. нулирам го, но аз ще измервам стойности от порядъка на 600 микросекунди. Тактовата честота е 4 МГц. Т.е. един такт една микросекунда. Практически за моите цели няма да се препълни. Проблем ми е да разбера как да го накарам да мери от нарастващ фронт пак до нарастващ. т.е. цялата продължителност на периода?


я сметни пак :!:
f = 1MHz = 1,000,000Hz
T = 1/f
T = 1/1е6
T = 0.000001sec.
и излиза, че 1 микросекунда е периода на 1 МХз... :)
а 4МХз = замести го по начина описан по-горе за да видиш колко части от секундата е периода :)

Автор:  ji4ka [ Чет Окт 16, 2008 11:16 pm ]
Заглавие: 

mash написа:
Ами.. да това го правя т.е. нулирам го, но аз ще измервам стойности от порядъка на 600 микросекунди. Тактовата честота е 4 МГц. Т.е. един такт една микросекунда. Практически за моите цели няма да се препълни. Проблем ми е да разбера как да го накарам да мери от нарастващ фронт пак до нарастващ. т.е. цялата продължителност на периода?

Нищо не трябва да нулирваш. При първото прекъсване запомняш текущата стойност на ТМР1 (която се прехвърля автоматично в CCP регистрите) , при следващото прекъсване от новата стойност вадиш предишната. Не е важна стойността на таймера - важна е разликата между две замервания.

Автор:  setoy [ Пет Окт 17, 2008 9:37 am ]
Заглавие: 

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

CCP1IF=0;
T1IF=0;
while (!CCP1IF && !T1IF);
t1_=CCP_1; // 4islo pri preden front

//setup_ccp1(CCP_CAPTURE_FE); // ccp1 - da reagira na Zaden front

CCP1IF=0;
while (!CCP1IF && !T1IF);
t2_=CCP_1; // 4islo pri zaden front
digit = (t2_-t1_) ;




Цитат:
mash написа:
Ами.. да това го правя т.е. нулирам го, но аз ще измервам стойности от порядъка на 600 микросекунди. Тактовата честота е 4 МГц. Т.е. един такт една микросекунда. Практически за моите цели няма да се препълни. Проблем ми е да разбера как да го накарам да мери от нарастващ фронт пак до нарастващ. т.е. цялата продължителност на периода?



я сметни пак Exclamation
f = 1MHz = 1,000,000Hz
T = 1/f
T = 1/1е6
T = 0.000001sec.
и излиза, че 1 микросекунда е периода на 1 МХз... Smile


@MYXATA, заклетите пикоборци делят винаги на 4. Сметката му е вярна.

Автор:  mash [ Пет Окт 17, 2008 10:50 am ]
Заглавие: 

:)
ясно
Значи трябва след като измеря от нарастващ към спадащ фронт после да направя още едно измерване отново за нарастващ за да имам целия период?
и като от т2 извадя т1нулирам таймера и после към тях да добавя т3, което ми е от спадащ към нараствщ ?

Автор:  setoy [ Пет Окт 17, 2008 11:59 am ]
Заглавие: 

Не бре човек! Написал съм ти го. Виж реда, който съм закоментирал. Не преинициализираш кепчъра! И той реагира единствено на преден (или заден) фронт. Времето между две сработвания ти е периода. Какво по-просто :idea:

Автор:  bkulev [ Пет Окт 17, 2008 5:11 pm ]
Заглавие: 

Хей mash, нещо си се пообъркал човече. Понякога така се получава. Като ти чета постовете и имам чувството, че не знаеш какво е ПЕРИОД на сигнал. Извини ме, но ще ти припомня: най - просто казано, това е времето м/у два съседни едноименни фронта, т.е. м/у два съседни нарастващи или два съседни падащи. Та в този смисъл техниката ти трябва да е следната:
1. Настройваш си CCP-то да ти реагира на който от двата фронта си избереш и повече не го пипаш!
2. При първия пускаш таймера
3. При следващия вземаш отчета и ако искаш нулираш таймера. Ако питаш мен с нулирането става по - лесно. Времето за нулирането можеш да го прибавиш към времето за измерването на следващия период. Инъче ти трябва код, който да получи разликата м/у начало и край.
4. От време на време осредняваш (зависи колко ти е стабилна честотата), но каквато и да е трябва да осредняваш.
5. Имай предвид и разделиталната способност на системата си, т.е. фронта на сигнала, който мериш може да пристигне току преди да ти се е клокнал таймера или току след като ти се е клокнал, т.е. имаш +- 0.5 от периода на тактовата честота на таймера.
6. Ако изолзваш прекъсване за обслужване на измерването и нулираш таймера, трябва да добавиш и времето за влизане в прекъсването до съответната инструкция.

Извини ме, че обяснявам като на начинаещ, ама...

Автор:  mash [ Съб Окт 18, 2008 11:57 am ]
Заглавие: 

Значи разбрах къде ми е проблема....
До сега си мислех, че след като го инициализирам за нарастващ фронт започва да отчита времето не до следващия нарасващ, а докъто фронта стане спадащ. т.е. за един положителен импулс, а не от началото на един до началото на следващия. Това ми заблуждение е породило всичките ми въпроси в тази тема :)
Чак сега ми светна и.... утре ще си коригирам кода. Днес ми е празнично :)

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/