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

timer1 count problem pic18f4580

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



Joined: 27 Oct 2011
Posts: 3
Location: Portugal

View user's profile Send private message

timer1 count problem pic18f4580
PostPosted: Thu Oct 27, 2011 4:52 am     Reply with quote

Hi all,

I'm programming timer1 on pic18f4580.
I want to make timer1 overflow every 10 usec. To analyze that, I use a led, and if led blink every 5 sec I know that it's correct.

So, I calculate values for timer, but led blinks every 30 sec, not 5 sec as I expect.

I also try make timer1 overflow every 104.896ms (as in the example), and it works this away.

So, can anyone help me to find what I'm doing wrong !
My code is:
Code:

#include <18F4580.h>

#fuses NOWDT, NOFCMEN, INTRC_IO, NOPUT, NOPROTECT, NOIESO, NOBROWNOUT, MCLR, NOLPT1OSC, PBADEN, STVREN, WDT32768, NOXINST, NOCPD, NOWRT
#use delay(clock=8M)
#use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)


int32 countTimer;

#INT_TIMER1
void isr_timer1()
{
   output_toggle(PIN_A1); 
   
   if(countTimer < (500000))
      countTimer ++;
   else
   {     
      output_toggle(PIN_A0);     
      countTimer = 0;           
   }
   
   set_timer1(65531);
}

void main()
{     
   countTimer = 0;
   set_tris_a(0b00000000);         
   output_bit(PIN_A0, 0);
   output_bit(PIN_A1, 0);
   
   enable_interrupts(INT_TIMER1);           // Enable Timer 1 Interrupt
   enable_interrupts (GLOBAL) ;
     
   //arranca o timer1
   set_timer1(65531);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_4);
   
   /* timer1 calculate:
   8MHz / 4 = 2MHz
   2MHz / 4 = 500000 Hz
   1 / 500000Hz = 0.2 useg  -> timer1  will increment every  0.2 useg
   
   I want overflow every 10 useg: 10 useg / 2 useg = 5
   
   65536 - 5 = 65531
   
     
   To blink a led every 5 seconds:
     
   5 seg / 0.00001 = 500000
   
   when my countTimer count to 500000, i toggle output to blink led.     
   */
   
     
   while(TRUE)
   {         

   }
}


Thanks!
Ttelmah



Joined: 11 Mar 2010
Posts: 19515

View user's profile Send private message

PostPosted: Thu Oct 27, 2011 5:03 am     Reply with quote

No hope......
You can't execute an interrupt that fast especially at 8MHz.
Calling an interrupt takes typically about 60 instruction times (call and return). Then in your interrupt you are comparing a 32bit value (about a dozen instructions), then incrementing a 32bit value (about 15 instructions), and setting the timer to a value (probably another 4 instructions). So total of about 90+ instructions. At 8Mhz, each instruction takes 0.5uSec, so I'd guess about 45uSec _minimum_ for successive interrupts. When you set the timer, about 60 instructions have already executed, so the time will be this much long.
Seriously, if you want to do something this fast, your processor will have to do it in the main loop (not using interrupts), and do nothing else. You are trying to push performance beyond anything the chip is capable of.

Best Wishes
pedrocnp



Joined: 26 Mar 2011
Posts: 1
Location: Portugal

View user's profile Send private message

PostPosted: Thu Oct 27, 2011 7:00 am     Reply with quote

Hi Ttelmah

This happens only in a timer1? I did experience with the timer 2 and resulted, why?

best regards

Ttelmah wrote:
No hope......
You can't execute an interrupt that fast especially at 8MHz.
Calling an interrupt takes typically about 60 instruction times (call and return). Then in your interrupt you are comparing a 32bit value (about a dozen instructions), then incrementing a 32bit value (about 15 instructions), and setting the timer to a value (probably another 4 instructions). So total of about 90+ instructions. At 8Mhz, each instruction takes 0.5uSec, so I'd guess about 45uSec _minimum_ for successive interrupts. When you set the timer, about 60 instructions have already executed, so the time will be this much long.
Seriously, if you want to do something this fast, your processor will have to do it in the main loop (not using interrupts), and do nothing else. You are trying to push performance beyond anything the chip is capable of.

Best Wishes
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