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

Capture модул при PIC
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=5370
Страница 1 от 2

Автор:  Ки4о [ Сря Яну 23, 2008 2:29 pm ]
Заглавие:  Capture модул при PIC

За първи път ми се налага да го ползвам (до сега съм ползвал само PWM) та възникна следния въпрос:
- събитието на Capture-a не нулира таймера - или трябва да го нулира ако искаме да измерваме период?
Ако някой се е сблъсквал с подобна ситуация - моля да сподели впечатление.

Автор:  Predator_MF [ Сря Яну 23, 2008 4:50 pm ]
Заглавие: 

Не го нулира, зануляваш таймера, пускаш модула - при прекъсване получаваш стойността.

Автор:  Ки4о [ Сря Яну 23, 2008 7:16 pm ]
Заглавие: 

Да ама като го нулираш ти "краде" импулси от измерената стойност.Пример:
Инициализиране 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.

Автор:  setoy [ Чет Яну 24, 2008 10:41 am ]
Заглавие: 

Запомняш предната стойност и изваждаш от новата без да пипаш таймера. Препълването на таймера не пречи.

Автор:  Ки4о [ Чет Яну 24, 2008 9:58 pm ]
Заглавие: 

Пречи - в един момент стойността става отрицателна а при плавно изменение трудно ще разбереш какво измерваш .

Автор:  ji4ka [ Чет Яну 24, 2008 10:23 pm ]
Заглавие: 

Ако е отрицателен резултата , вземаш допълнението.

Автор:  Ки4о [ Чет Яну 24, 2008 10:35 pm ]
Заглавие: 

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

Автор:  ji4ka [ Чет Яну 24, 2008 11:05 pm ]
Заглавие: 

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

Автор:  nik [ Пет Яну 25, 2008 12:05 am ]
Заглавие: 

периода ти е аналогова величина, която опитваш да дискретизираш, нормално е да мърда, но с 1, не повече ( ако всичко е изпълнено правилно )
брояча може да не го пипаш, само копираш, и ако има разлика на разредността на таймера и процесора внимаваш много
копираш го в unsigned, после от новото вадиш старото и готово, и поради натрупване на грешката от време на време ще показва с 1 повече, това е полезно за последващо интегриране, може да се постигне точност с още 1-2 разряда повече от брояча
може и да го нулираш, но тогава трябва внимателно да следиш за колко време се изпълнява прекъсването и всеки път да е гарантирано едно и също, първо копираш после нулираш и продължаваш нататък

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

Автор:  Syrius-B [ Пет Яну 25, 2008 1:36 am ]
Заглавие: 

Никакъв проблем не е преминаването през оверфлоу.
Ако е само веднаж, естествено.
При изваждането пренебрегваш преноса (заема) и числото си е вярно.
За да няма повече от един пренос, избираш така честотата на таймера (с прескалерите), че FFFF такта да са повече от най-дългия ти период

Автор:  ji4ka [ Пет Яну 25, 2008 2:42 am ]
Заглавие: 

А бе той таймера не дава ли прекъсване при препълване? Какъв таймер е той тогава? :)
Броиш прекъсванията и ги добавяш към разликата.

Автор:  Ки4о [ Пет Яну 25, 2008 9:49 am ]
Заглавие: 

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

Автор:  nik [ Пет Яну 25, 2008 12:26 pm ]
Заглавие: 

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.

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

Автор:  Ки4о [ Пет Яну 25, 2008 8:50 pm ]
Заглавие: 

Цитат:
а другия сработил от преход са отделни събития и ти трябва да следиш кое кога е станало, и колко пъти е станало
- напълно съм наясно с това ,но се чудех има ли вариант да следиш само прекъсването на кепчъра без всички останали подробности - препълвания,изваждания,....

Автор:  Syrius-B [ Съб Яну 26, 2008 12:46 am ]
Заглавие: 

Ки4о написа:
Цитат:
а другия сработил от преход са отделни събития и ти трябва да следиш кое кога е станало, и колко пъти е станало
- напълно съм наясно с това ,но се чудех има ли вариант да следиш само прекъсването на кепчъра без всички останали подробности - препълвания,изваждания,....

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

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