| Автор |
Съобщение |
|
mash
Ранг: Новодошъл
Регистриран на: Пет Окт 27, 2006 6:23 pm Мнения: 162 Местоположение: Севлиево
|
 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_) ;
Как да измеря целия период? т.е. от преден фронт пак до преден?
|
| Сря Окт 15, 2008 12:28 pm |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
Естествено 
|
| Сря Окт 15, 2008 12:35 pm |
|
 |
|
mash
Ранг: Новодошъл
Регистриран на: Пет Окт 27, 2006 6:23 pm Мнения: 162 Местоположение: Севлиево
|
кое ти се стори естествено ?
|
| Сря Окт 15, 2008 12:39 pm |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
 Re: CCP capture
Отговарям : естествено, че да. Или от заден до заден, все едно.
|
| Сря Окт 15, 2008 12:41 pm |
|
 |
|
perro_iv
Ранг: Новодошъл
Регистриран на: Вто Авг 23, 2005 10:36 am Мнения: 156 Местоположение: Казанлък
|
Особеното при този модул е, че за засичане на стойността се използва ТМР1, но трябва да го нулираш софтуерно при фронта от който започва измерването, за да ти измери коректно стойността.
Също трябва да си сигурен че не се е препълнил в рамките на измервания период или ако да, да знаеш колко пъти и да коригираш крайната стойност.
|
| Чет Окт 16, 2008 4:42 pm |
|
 |
|
mash
Ранг: Новодошъл
Регистриран на: Пет Окт 27, 2006 6:23 pm Мнения: 162 Местоположение: Севлиево
|
Ами.. да това го правя т.е. нулирам го, но аз ще измервам стойности от порядъка на 600 микросекунди. Тактовата честота е 4 МГц. Т.е. един такт една микросекунда. Практически за моите цели няма да се препълни. Проблем ми е да разбера как да го накарам да мери от нарастващ фронт пак до нарастващ. т.е. цялата продължителност на периода?
|
| Чет Окт 16, 2008 6:37 pm |
|
 |
|
perro_iv
Ранг: Новодошъл
Регистриран на: Вто Авг 23, 2005 10:36 am Мнения: 156 Местоположение: Казанлък
|
Ами кво има да му се чудиш:
1. Следиш CCP-пина и чакаш положителен фронт, примерно btfss или while(CCP.пин == 0).
2. На следващата стъпка от програмата нулираш ТМР1 и активираш CCP модула, като го конфигурираш да реагира по положителен фронт.
3.Чакаш флага и това е...
|
| Чет Окт 16, 2008 10:26 pm |
|
 |
|
MYXATA
Ранг: Форумен бог
Регистриран на: Пон Юни 05, 2006 1:48 pm Мнения: 4906 Местоположение: където небето среща земята, ракията е Jameson, а бирата Guinness
|
я сметни пак
f = 1MHz = 1,000,000Hz
T = 1/f
T = 1/1е6
T = 0.000001sec.
и излиза, че 1 микросекунда е периода на 1 МХз...
а 4МХз = замести го по начина описан по-горе за да видиш колко части от секундата е периода 
_________________ ... ако трети ден не ти се работи... това означава, че е сряда !
|
| Чет Окт 16, 2008 10:50 pm |
|
 |
|
ji4ka
Ранг: Форумен бог
Регистриран на: Чет Фев 01, 2007 4:04 am Мнения: 1539
|
Нищо не трябва да нулирваш. При първото прекъсване запомняш текущата стойност на ТМР1 (която се прехвърля автоматично в CCP регистрите) , при следващото прекъсване от новата стойност вадиш предишната. Не е важна стойността на таймера - важна е разликата между две замервания.
|
| Чет Окт 16, 2008 11:16 pm |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
Да, именно разликата. Ако го нулираш след събитието, което чакаш, само внасяш грешка. Доакто измерваш не го пипаш.
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_) ;
@MYXATA, заклетите пикоборци делят винаги на 4. Сметката му е вярна.
|
| Пет Окт 17, 2008 9:37 am |
|
 |
|
mash
Ранг: Новодошъл
Регистриран на: Пет Окт 27, 2006 6:23 pm Мнения: 162 Местоположение: Севлиево
|
ясно
Значи трябва след като измеря от нарастващ към спадащ фронт после да направя още едно измерване отново за нарастващ за да имам целия период?
и като от т2 извадя т1нулирам таймера и после към тях да добавя т3, което ми е от спадащ към нараствщ ?
|
| Пет Окт 17, 2008 10:50 am |
|
 |
|
setoy
Ранг: Почетен член
Регистриран на: Пет Фев 17, 2006 9:17 am Мнения: 765 Местоположение: Стара Загора
|
Не бре човек! Написал съм ти го. Виж реда, който съм закоментирал. Не преинициализираш кепчъра! И той реагира единствено на преден (или заден) фронт. Времето между две сработвания ти е периода. Какво по-просто 
|
| Пет Окт 17, 2008 11:59 am |
|
 |
|
bkulev
Ранг: Популярен
Регистриран на: Сря Яну 25, 2006 12:47 pm Мнения: 305 Местоположение: Varna
|
Хей mash, нещо си се пообъркал човече. Понякога така се получава. Като ти чета постовете и имам чувството, че не знаеш какво е ПЕРИОД на сигнал. Извини ме, но ще ти припомня: най - просто казано, това е времето м/у два съседни едноименни фронта, т.е. м/у два съседни нарастващи или два съседни падащи. Та в този смисъл техниката ти трябва да е следната:
1. Настройваш си CCP-то да ти реагира на който от двата фронта си избереш и повече не го пипаш!
2. При първия пускаш таймера
3. При следващия вземаш отчета и ако искаш нулираш таймера. Ако питаш мен с нулирането става по - лесно. Времето за нулирането можеш да го прибавиш към времето за измерването на следващия период. Инъче ти трябва код, който да получи разликата м/у начало и край.
4. От време на време осредняваш (зависи колко ти е стабилна честотата), но каквато и да е трябва да осредняваш.
5. Имай предвид и разделиталната способност на системата си, т.е. фронта на сигнала, който мериш може да пристигне току преди да ти се е клокнал таймера или току след като ти се е клокнал, т.е. имаш +- 0.5 от периода на тактовата честота на таймера.
6. Ако изолзваш прекъсване за обслужване на измерването и нулираш таймера, трябва да добавиш и времето за влизане в прекъсването до съответната инструкция.
Извини ме, че обяснявам като на начинаещ, ама...
|
| Пет Окт 17, 2008 5:11 pm |
|
 |
|
mash
Ранг: Новодошъл
Регистриран на: Пет Окт 27, 2006 6:23 pm Мнения: 162 Местоположение: Севлиево
|
Значи разбрах къде ми е проблема....
До сега си мислех, че след като го инициализирам за нарастващ фронт започва да отчита времето не до следващия нарасващ, а докъто фронта стане спадащ. т.е. за един положителен импулс, а не от началото на един до началото на следващия. Това ми заблуждение е породило всичките ми въпроси в тази тема
Чак сега ми светна и.... утре ще си коригирам кода. Днес ми е празнично 
|
| Съб Окт 18, 2008 11:57 am |
|
|