|
|
View previous topic :: View next topic |
Author |
Message |
Izolator
Joined: 10 Feb 2004 Posts: 12 Location: Denmark, (Scandinavia-Europe)
|
setup_timer_2(??,??,??) with Neoton zero drift RTC |
Posted: Mon Feb 23, 2004 3:29 pm |
|
|
Hi Guys,
I'm using a slightly minimized version of Neotone's old code, cutting out month, years and leapyears.
Code: |
//RTC variables
int32 const xtl = 19660800;
int32 clock = xtl;
int8 days=0,hours=0,minutes=0,seconds=0;
int1 leapyear=0,tick=0;
// 0.83mS resolution with my xtl value
// -=Process Zero Drift Real Time Clock Information=-
// Decrement cycles per interupt
// Increment seconds counter, Set 1 second flag, Add number of ticks per second to clock
// Increment minutes counter
// Increment hours counter
// Increment days counter
#int_TIMER2
void TIMER2_isr() { clock -= 16384;
if(clock < 16384) {seconds++;clock += xtl;Tick= 1;
if(seconds == 60) {minutes++;seconds = 0;
if(minutes == 60) {hours++;minutes = 0;
if(hours == 24) {days++;hours= 0;
}}}}}
|
Problem:
As I am a total newbie with Timers & Interrupt I just recently discovered that the interrupt needs to be setup and enabled. I dont understand the math of it ?!?!?
I'm using:
20Mhz osc. quartz
Pic16F877
PCM 3.173
...what do I do to make the routine work as intended, with my crystal ?
I tried with:
setup_timer_2(T2_DIV_BY_16,0xff,1);
but that makes it count a little too fast: some 30sec in 20 min, hmm.
Keep in mind that to me the 3 variables are just numbers and I guessed at random to test it....not the correct way I know.
Code: |
main() {
setup_timer_2(??,??,??); // what do I put instead of the ??'s to make Neotrons code behave as intended, a RTC that puts secs, mins, hours....
enable_interrupts(int_timer2);
enable_interrupts(global);
while(1) {
}
} |
side question:
what does the dear mr. Neotone mean by the following:
1) // 0.83mS resolution with my xtl value
2) int32 const xtl = 19660800; => do I need to change this to 20000000 ?
Thanks for you assistance guys, this is making my head hurt
BR
Rasmus 'Izolator'
Last edited by Izolator on Mon Feb 23, 2004 4:45 pm; edited 2 times in total |
|
|
Neutone
Joined: 08 Sep 2003 Posts: 839 Location: Houston
|
|
Posted: Mon Feb 23, 2004 4:40 pm |
|
|
I think this has better comments. 19660800 is a frequency that can be divided to get the most common baud rates. It's the frequency of the crystle I use.
Code: |
/*********************************************
* Initialize RTC *
*********************************************/
void Initialize_RTC(void)
{ Ticker = XTAL_FREQUENCY;
setup_timer_2 ( T2_DIV_BY_4, 0xff, 4 ); // initialize 8 bit counter/timer 2 to interupt every 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=-
{ tickmSec = 1; // set each MS very approximately
Ticker -= 16384; // Decrement ticker by clocks per interupt
if ( Ticker < 16384 ) // If second has expired
{ Ticker += XTAL_FREQUENCY; // Increment ticker by clocks per second
second++; // Increment number of seconds
tickSec = 1; // set each Second very accuratly
}
}
|
Last edited by Neutone on Mon Feb 23, 2004 4:43 pm; edited 1 time in total |
|
|
Izolator
Joined: 10 Feb 2004 Posts: 12 Location: Denmark, (Scandinavia-Europe)
|
|
Posted: Mon Feb 23, 2004 4:43 pm |
|
|
Thankyou good Sir,
It seems to work right out of the box.
Bless you, I might still pass my exam
BR
Rasmus 'Izolator' |
|
|
|
|
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
|