Отговори на тема  [ 20 мнения ]  Отиди на страница 1, 2  Следваща
Capture модул при PIC 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение Capture модул при PIC
За първи път ми се налага да го ползвам (до сега съм ползвал само PWM) та възникна следния въпрос:
- събитието на Capture-a не нулира таймера - или трябва да го нулира ако искаме да измерваме период?
Ако някой се е сблъсквал с подобна ситуация - моля да сподели впечатление.


Сря Яну 23, 2008 2:29 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

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


Сря Яну 23, 2008 4:50 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Да ама като го нулираш ти "краде" импулси от измерената стойност.Пример:
Инициализиране Capture:
Цитат:
void setup_capture_1(void){
__asm__ volatile("BSET IPC0,#4" );//desired priority level
__asm__ volatile("BSET IPC0,#5" );
__asm__ volatile("BCLR IPC0,#6" );
IFS0bits.IC1IF=0; //Clear the IC1 interrupt status flag
IEC0bits.IC1IE=1; //Enable IC1 interrupts
IC1CON=0x0003; //Turn on Input Capture 1 Module
}

Инициализиране TMR3:
Цитат:
void init_TIMER3(void){
T3CON=0;
TMR3=0;
PR3=0xFFFF;
__asm__ volatile("BCLR T3CON,#4" ); // 1:1
__asm__ volatile("BCLR T3CON,#5" );
__asm__ volatile("BCLR IPC1,#12" );
__asm__ volatile("BCLR IPC1,#13" );
__asm__ volatile("BCLR IPC1,#14" ); // Disable IRQ
__asm__ volatile("BCLR IFS0,#7" ); //Clear the Timer3 interrupt status flag
__asm__ volatile("BCLR T2CON,#3" ); // Disable 32-bit Timer operation
__asm__ volatile("BSET T3CON,#15");
}


Първата отчетена стойност е грешна - с това се примирих.
Сегмента по прекъсване е :
Цитат:
void _ISR _IC1Interrupt(void)
{
IFS0bits.IC1IF = 0; // Clear IC1 interrupt flag
//__asm__ volatile("CLR TMR3" );
value=IC1BUF;
}


На съответния пин съм пуснал сигнал със импулс/пауза по 100 цикъла.Когато сегмента по прекъсване е като тук дадения - първия път си отчита
някакво число - 92,на следващото прекъсване стойността в буфера е 292 ! ,на по-следващото - 492, т.е увеличава се с по 200 както му е реда,
но почне ли да се пипа в прекъсването се забозяват нещата,в смисъл отчита 173 или 182 или стойността се колебае между 179-181.Каква е
хвaтката в този случай?Контролера е dsPIC30F4013.


Сря Яну 23, 2008 7:16 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
Запомняш предната стойност и изваждаш от новата без да пипаш таймера. Препълването на таймера не пречи.


Чет Яну 24, 2008 10:41 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Пречи - в един момент стойността става отрицателна а при плавно изменение трудно ще разбереш какво измерваш .


Последна промяна Ки4о на Чет Яну 24, 2008 10:30 pm, променена общо 1 път



Чет Яну 24, 2008 9:58 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Фев 01, 2007 4:04 am
Мнения: 1539
Мнение 
Ако е отрицателен резултата , вземаш допълнението.


Чет Яну 24, 2008 10:23 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
@ji4ka,съгласен съм с тов което казваш,ама като се променя честотата,респективно периода как точно ше измериш периода? Трябва да правиш буфер,да сумираш да речем 10 резултата,после да усредняваш,.... а преди това имаш изваждане със следене на знак,че и Capture модула трябва да го следищ за препълване - става много дълга.Търся по-елегантно решение.Хищника спомена за нулиране на таймера и пускане на модула - ама ако може да пообясни как го прави без да се губят отчети.Струва ми се че греша някъде,ама мамка му не мога да усетя къде :cry:


Чет Яну 24, 2008 10:35 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Фев 01, 2007 4:04 am
Мнения: 1539
Мнение 
Нещо не е ясно заданието. Ами нали с каптурето мериш точно периода. А и другото си е елементарна аритметика. Честота се мери по друг начин - с брояч. Мерене на променлива честота няма реален смисил. Модула си има прекъсвания , не ги следиш - те те викат.


Чет Яну 24, 2008 11:05 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Мар 22, 2006 3:25 am
Мнения: 6418
Мнение 
периода ти е аналогова величина, която опитваш да дискретизираш, нормално е да мърда, но с 1, не повече ( ако всичко е изпълнено правилно )
брояча може да не го пипаш, само копираш, и ако има разлика на разредността на таймера и процесора внимаваш много
копираш го в unsigned, после от новото вадиш старото и готово, и поради натрупване на грешката от време на време ще показва с 1 повече, това е полезно за последващо интегриране, може да се постигне точност с още 1-2 разряда повече от брояча
може и да го нулираш, но тогава трябва внимателно да следиш за колко време се изпълнява прекъсването и всеки път да е гарантирано едно и също, първо копираш после нулираш и продължаваш нататък

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


Пет Яну 25, 2008 12:05 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Яну 30, 2006 2:48 am
Мнения: 1248
Местоположение: София
Мнение 
Никакъв проблем не е преминаването през оверфлоу.
Ако е само веднаж, естествено.
При изваждането пренебрегваш преноса (заема) и числото си е вярно.
За да няма повече от един пренос, избираш така честотата на таймера (с прескалерите), че FFFF такта да са повече от най-дългия ти период


Пет Яну 25, 2008 1:36 am
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Чет Фев 01, 2007 4:04 am
Мнения: 1539
Мнение 
А бе той таймера не дава ли прекъсване при препълване? Какъв таймер е той тогава? :)
Броиш прекъсванията и ги добавяш към разликата.


Пет Яну 25, 2008 2:42 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Идеята е да се пусне таймер 3 и всеки кепчър си е независим-има си собствен буфер и прекъсване.Така като ти генерира прекъсване четеш буфера,вздиш от него предната му стойност и получавашброя отчети от кепчъра.Работата е там че за 4 канала трябва да имаш за всеки канал по 3 буфера,за да може да откриеш изменение на резултата иначе като засечеш даден резултат и той е различен с повече от едно от предходния защото не си сигурен какво е станало а и непрекъснато трябва да се проверява статуса за препълване на буфера на кепчъра.Мислех че работи - пускащ таймера и кепчъра,кепчъра като си детектне събитието си го пише в буфера и отново се стартира и няма такива допълнителни мъки,ама явно много съм се лъгал :)


Пет Яну 25, 2008 9:49 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Мар 22, 2006 3:25 am
Мнения: 6418
Мнение 
Each capture channel has an associated FIFO buffer which is four 16-bit words deep. There are two status flags which provide status on the FIFO buffer:
• ICBNE – Input Capture Buffer Not Empty
• ICOV – Input Capture Overflow
........................
In the event that the FIFO is full with four capture events and a fifth capture event occurs prior to a read of the FIFO, an overflow condition occurs and the ICOV bit is set to a logic ‘1’. The fifth capture event is lost and is not stored in the FIFO. No additional events are captured until all four events have been read from the buffer.
If a FIFO read is performed after the last read and no new capture event has been received, the read will yield indeterminate results.

така че това което си си мислел е така, но с тази подробност, че таймер и кепчър са два отделни модула, работещи всеки за себе си, и кога единия е превъртял, а другия сработил от преход са отделни събития и ти трябва да следиш кое кога е станало, и колко пъти е станало


Пет Яну 25, 2008 12:26 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Съб Юли 22, 2006 9:50 pm
Мнения: 1638
Мнение 
Цитат:
а другия сработил от преход са отделни събития и ти трябва да следиш кое кога е станало, и колко пъти е станало
- напълно съм наясно с това ,но се чудех има ли вариант да следиш само прекъсването на кепчъра без всички останали подробности - препълвания,изваждания,....


Пет Яну 25, 2008 8:50 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Яну 30, 2006 2:48 am
Мнения: 1248
Местоположение: София
Мнение 
Ки4о написа:
Цитат:
а другия сработил от преход са отделни събития и ти трябва да следиш кое кога е станало, и колко пъти е станало
- напълно съм наясно с това ,но се чудех има ли вариант да следиш само прекъсването на кепчъра без всички останали подробности - препълвания,изваждания,....

Ако прочетеш какво съм ти написал по-горе - ДА


Съб Яну 26, 2008 12:46 am
Профил WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 20 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

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


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

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