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 support@ccsinfo.com

get_ticks not counting high enough

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



Joined: 16 Oct 2010
Posts: 31
Location: Florissant, CO

View user's profile Send private message

get_ticks not counting high enough
PostPosted: Mon Nov 19, 2012 8:55 pm     Reply with quote

I am trying to make a timer to count mS up to around 24-32 bits for a "session timer". I am trying to use the #USE TIMER(TIMER=1,TICK=1ms,BITS=32,NOISR) pre-processor and the Set/get ticks functions to use it. Here is basically what I am trying to accomplish in the code:
Code:

#USE TIMER(TIMER=1,TICK=1ms,BITS=32,NOISR)      //  Get Timer1 ready to serve at the mercy of the Tick counter

void CheckEncoderMotion (void)
{
   int8  EncoderTemp;

   EncoderTemp = (input_e() & 0b00011110);
   if (EncoderTemp ^ EncoderCurrent)         //  Check to see if the current masked encoder is different than the last "current" reading
   {
         EncoderHistory = EncoderCurrent;    //  Backup the new setting to the global registers
         EncoderCurrent = EncoderTemp;
         EncoderTimeAccu = get_ticks();          //  Get the current tick reading so we know how many mS it has been
         set_ticks(0x00000000);              //  Clear the tick register so that we can start counting new
   }
   return;
}

For some reason it seems like it is getting "stuck" and will only increment the first few bits. I would really appreciate it if someone could give me a clue as to why it isn't filling up this 32-bit register.

This seems to be a rather obscure function, so your input is greatly appreciated.
_________________
Life is too short to only write code in assembly...
ckielstra



Joined: 18 Mar 2004
Posts: 3680
Location: The Netherlands

View user's profile Send private message

PostPosted: Tue Nov 20, 2012 1:04 am     Reply with quote

You don't post a complete program so we will have to guess some details:
First obvious answer would be that it never counts high because you keep setting it to zero. That is, I expect your encode to be called every few milliseconds?

If your encoder is slow and you expect larger time outs, then the second answer would be the NOISR parameter. With this parameter present it is up to your code to call the get_ticks function before it overflows. How fast the timer overflows depends on your PIC model. An 8 bit timer with your settings would overflow in 255ms.

Please provide PIC type number, program version and a small but _complete_ program for more help.


Then another tiny style remark:
Code:
if (EncoderTemp ^ EncoderCurrent)         //  Check to see if the current masked encoder is different than the last "current" reading
I find the XOR construction difficult to read, I always have to think three times what's happening to understand the code. You expect the same trouble, that's why you added the comments. Much better is to write code that shows your intention and then have the compiler worry about optimizations. Speed isn't critical here anyway and though I didn't check the resulting assembly code I doubt your version is faster than the easier to read:
Code:
if (EncoderTemp != EncoderCurrent)      // Reading changed?
RF_Developer



Joined: 07 Feb 2011
Posts: 839

View user's profile Send private message

PostPosted: Tue Nov 20, 2012 5:10 am     Reply with quote

Yes, with NOISR the tick counter will only be updated when you call get_ticks(). To get it to update automatically use ISR AND enable global interrupts, even if your code does use any (other) interrupts. The compiler will supply the necessary interrupt routine, though probably not as C source.

Also be aware you might not get precisely the tick interval you requested. It will give the nearest available and generate a compiler warning telling you the actual tick time. or so the help says as I confess I hadn't seen this before and even the help index in my PCWH 4.132 doesn't have this function!

RF Developer
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