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

ms into MIN and SEC algorithm

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



Joined: 04 Feb 2005
Posts: 5

View user's profile Send private message ICQ Number

ms into MIN and SEC algorithm
PostPosted: Sat Feb 05, 2005 5:00 pm     Reply with quote

Hi, i'm looking for extremly fast (read effecient) algorithm of converting the milliseconds into minutes and seconds : something like
Code:

temp=time_ms/1000;
time_min=temp/60;
time_sec=temp%60;

but much more optimized.
Can somebody help me?
Charlie U



Joined: 09 Sep 2003
Posts: 183
Location: Somewhere under water in the Great Lakes

View user's profile Send private message

PostPosted: Sat Feb 05, 2005 6:48 pm     Reply with quote

You're not giving us much to go on, but if you are counting the ms yourself, how about just using registers for your seconds and minutes as you count up. Each time the milliseconds hits 1000, clear them and increment the seconds. If the seconds is 60, then clear the seconds and increment the minutes. This adds a little overhead to each cycle, but it is just increment and compares, and you don't need to do much math to display the resulting time.
ckielstra



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

View user's profile Send private message

PostPosted: Sat Feb 05, 2005 7:20 pm     Reply with quote

Skiffex,
Let me guess: Your 'time_ms' is a 32-bit variable and you found out that 32-bit division is very slow?

Charlie U's suggestion is the same line as I was thinking.
The best implementation I have seen was given by Neutone. Special in this routine is that despite the milliseconds interrupt not being exactly at the millisecond accurate, the seconds have a zero long time drift.
Code:
//RTC variables
#define XTAL_FREQUENCY  19660800
int32 Ticker;
int8 seconds=0;
//optional:
//int8 year=0,Month=0,days=0,hours=0,minutes=0;int1 leapyear=0;

/*********************************************
*    Initialize RTC                          *
*********************************************/
void Initialize_RTC(void)
{  Ticker = XTAL_FREQUENCY;
   setup_timer_2(T2_DIV_BY_4, 0xff, 4);  // initialize 8-bit Timer2 to interrupt about
                                         // every 1ms (16384 clock cycles)
   enable_interrupts( INT_TIMER2 );      // Start RTC
}

// Global Real Time Clock Information
#int_TIMER2                              // Clock interrupt adjusted to occurs ~ 1ms
void TIMER2_isr()                        //  -=Process Zero Drift Real Time Clock Information=-
{
   Ticker -= 16384;                      // Decrement ticker by clocks per interrupt
   if ( Ticker < 16384 )                 // If second has expired
   {  Ticker += XTAL_FREQUENCY;          // Increment ticker by clocks per second
      second++;                          // Increment number of seconds
   }

  // Optional:
  /*
  if(seconds == 60) {minutes++;seconds = 0;
    if(minutes == 60) {hours++;minutes = 0;
      if(hours == 24) {days++;hours= 0;
        if(days == 29 && Month==2 && !leapyear){Month++;days=0;}
        if(days == 30 && Month==2){Month++;days=0;}
        if(days == 31 && (Month==4 || Month==6 || Month==9 || Month==11 )){Month++;days=0;}
        if(days == 32) {Month++;days=0;
          if(Month == 13) {year++;Month=0;
            if((year & 3) == 0) {leapyear=1}
            else{leapyear=0}
  }}}}}}
  */
}
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