CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

6 input capture configuration

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
mahdi70



Joined: 05 Jan 2016
Posts: 44

View user's profile Send private message

6 input capture configuration
PostPosted: Tue Feb 14, 2017 4:22 am     Reply with quote

hi buddies...i have 6 pwm channel with 1 khz freq and 6 input capture(icx)...i want to capture 6 channel wave with timer3 but Interferometry between output...how can i capture waves One by one with one timer(timer3)?

this my simple code

Code:
#INT_IC1
void  ic1_isr(void)
{
if (input(pin_d8)) {
   set_timer3(0);
  }

if (!input(pin_d8) {
   ic1=get_timer3();
  }

}

#INT_IC2
void  ic2_isr(void)
{
if (input(pin_d9)) {
   set_timer4(0);
  }

if (!input(pin_d9)) {
   ic2=get_timer4();
  }

}


and ......

Code:
void main()
{
setup_timer3(TMR_INTERNAL | TMR_DIV_BY_1,55000);

setup_capture(1, CAPTURE_EE | INTERRUPT_FOURTH_CAPTURe | CAPTURE_TIMER3);
setup_capture(2, CAPTURE_EE | INTERRUPT_FOURTH_CAPTURe | CAPTURE_TIMER3);
setup_capture(3, CAPTURE_EE | INTERRUPT_FOURTH_CAPTURe | CAPTURE_TIMER3);
setup_capture(4, CAPTURE_EE | INTERRUPT_FOURTH_CAPTURe | CAPTURE_TIMER3);
setup_capture(5, CAPTURE_EE | INTERRUPT_FOURTH_CAPTURe | CAPTURE_TIMER3);
setup_capture(6, CAPTURE_EE | INTERRUPT_FOURTH_CAPTURe | CAPTURE_TIMER3);

enable_interrupts(INT_IC1);
enable_interrupts(INT_IC2);
enable_interrupts(INT_IC3);
enable_interrupts(INT_IC4);
enable_interrupts(INT_IC5);
enable_interrupts(INT_IC6);
enable_interrupts(INTR_GLOBAL);


tnx alot
temtronic



Joined: 01 Jul 2010
Posts: 9241
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Tue Feb 14, 2017 8:07 am     Reply with quote

It'd help if you told us which PIC you're using !
I can't tell if that code is correct let alone do what you want.

Obvious place to start would be trying 1 PWM input, then 2,then more...


You will need a stable KNOWN set of PWM sources ranging from 0 to 100%.
Another PIC could be used for this,giving 0,10,25,50,75,100 % PWM signals.

Without a KNOWN source any code you cut cannot be easily or properly tested !

Jay
Ttelmah



Joined: 11 Mar 2010
Posts: 19536

View user's profile Send private message

PostPosted: Tue Feb 14, 2017 8:28 am     Reply with quote

Generally on IC type modules, you don't read the timer. You read the capture register. The whole point of these modules is that they record the timer value when triggered, then interrupt. The compiler provides 'get_capture' functions for this.
Then your code is mixing capture modes. You are selecting the 'every edge' mode, but then trying to use the 'every fourth event' option. Look at the data sheet. Look at the capture mode settings. Note:

001 = Capture mode, every edge (rising and falling); ICI<1:0> does not control interrupt generation
for this mode

Every edge mode _prevents_ the /4 option from working.....

You seem to be trying to time just the 'low time' of the waveform.

Don't set the timer in the capture (this is what is causing them the interfere). The timer should be set to count to 65536 (not limited to 55000), so it just 'free runs'. Then record the time when the signal is low (get_capture) as the 'start', and the time when you see it high as the 'stop'. The low period is then just stop-start. Do this for all the channels using the same timer.

If you don't want the low time, but the period, then switch to using just the rising or falling edge.
mahdi70



Joined: 05 Jan 2016
Posts: 44

View user's profile Send private message

PostPosted: Tue Feb 14, 2017 9:17 am     Reply with quote

temtronic wrote:
It'd help if you told us which PIC you're using !
I can't tell if that code is correct let alone do what you want.

Obvious place to start would be trying 1 PWM input, then 2,then more...


You will need a stable KNOWN set of PWM sources ranging from 0 to 100%.
Another PIC could be used for this,giving 0,10,25,50,75,100 % PWM signals.

Without a KNOWN source any code you cut cannot be easily or properly tested !

Jay



dspic33fj256mc710


i test 1 pwm and one input capture and it work...my problem start when i want use 2 capture channel with one timer...but i test 4 capture channel with 4 timer and its work
Ttelmah



Joined: 11 Mar 2010
Posts: 19536

View user's profile Send private message

PostPosted: Tue Feb 14, 2017 9:41 am     Reply with quote

That is because you are setting the timer in the interrupt. Don't. Just record the values. Let the timer keep 'free running'.
mahdi70



Joined: 05 Jan 2016
Posts: 44

View user's profile Send private message

PostPosted: Tue Feb 14, 2017 12:17 pm     Reply with quote

Ttelmah wrote:
Generally on IC type modules, you don't read the timer. You read the capture register. The whole point of these modules is that they record the timer value when triggered, then interrupt. The compiler provides 'get_capture' functions for this.
Then your code is mixing capture modes. You are selecting the 'every edge' mode, but then trying to use the 'every fourth event' option. Look at the data sheet. Look at the capture mode settings. Note:

001 = Capture mode, every edge (rising and falling); ICI<1:0> does not control interrupt generation
for this mode

Every edge mode _prevents_ the /4 option from working.....

You seem to be trying to time just the 'low time' of the waveform.

Don't set the timer in the capture (this is what is causing them the interfere). The timer should be set to count to 65536 (not limited to 55000), so it just 'free runs'. Then record the time when the signal is low (get_capture) as the 'start', and the time when you see it high as the 'stop'. The low period is then just stop-start. Do this for all the channels using the same timer.

If you don't want the low time, but the period, then switch to using just the rising or falling edge.


hi...thanks alot sir....i understand some of your point of view ...can you offering simple code till i underestand?

tnx alot
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group