time.c

Go to the documentation of this file.
00001 /*
00002  * File:        time.c
00003  * Purpose:     Real time clock function and interrupt handler
00004  * Author:      Peter Ivanov, Olimex Ltd.
00005  * Modified by:
00006  * Created:     2007-05-19 11:29:32
00007  * Last modify: 2007-10-03 21:20:56 ivanovp {Time-stamp}
00008  * Copyright:   (C) Peter Ivanov, Olimex Ltd., 2007
00009  * Licence:     GPL
00010  */
00016 #include <msp430xG461x.h>
00017 #include <signal.h>
00018 #include "time.h"
00019 #include "diskio.h"
00020 
00021 volatile uint32_t jiffies = 0; // counts milliseconds
00022 
00028 void RTC_init (void) 
00029 {
00030     // Real-Time Clock Control Register -> ACLK, Counter Mode, 32bit overflow, enable interupt
00031     //RTCCTL = RTCTEV0 + RTCIE;
00032 
00033     // Enable Timer Interupt (RTC in counter mode is like Timer)
00034     //IFG2 = BTIE;
00035 
00036     // 32768
00037     //RTCNT1 = 0x00;
00038     //RTCNT2 = 0x80;
00039 
00040     // Real-Time Clock Control Register -> ACLK, Calendar Mode, enable interupt
00041     RTCCTL = RTCMODE_3 | RTCTEV_0 | RTCIE | RTCHOLD;
00042 
00043     RTCYEARH = TIME_DEFAULT_YEAR >> 8;
00044     RTCYEARL = TIME_DEFAULT_YEAR & 0xFF;
00045     RTCMON = TIME_DEFAULT_MONTH;
00046     RTCDAY = TIME_DEFAULT_DAY;
00047     RTCHOUR = TIME_DEFAULT_HOUR;
00048     RTCMIN = TIME_DEFAULT_MIN;
00049     RTCSEC = TIME_DEFAULT_SEC;
00050 
00051     RTCCTL &= ~RTCHOLD;
00052 }
00053 
00054 #define DISK_TIMERPROC_CNT 10 
00055 
00056 
00061 interrupt (WDT_VECTOR) wakeup watchdog_isr (void)
00062 {
00063     static uint8_t cnt = DISK_TIMERPROC_CNT;
00064 
00065     jiffies++;
00066 
00067     cnt--;
00068     if (cnt == 0)
00069     {
00070         cnt = DISK_TIMERPROC_CNT;
00071         // call every 10 milliseconds @ 8 MHz
00072         disk_timerproc ();
00073     }
00074     //LPM3_EXIT;
00075 }
00076 
00077 void TIME_init ()
00078 {
00079     RTC_init ();
00080     //FLL_CTL0 |= XCAP18PF;       // Set load cap for 32k xtal
00081     // WDT interrupt in every 0.5 ms @ 1 MHz -> 0.625 us @ 8 MHz
00082     //WDTCTL = WDTPW | WDTTMSEL | WDTCNTCL | WDTIS1;
00083     // WDT interrupt in every 8 ms @ 1 MHz -> 1 ms @ 8 MHz
00084     WDTCTL = WDTPW | WDTTMSEL | WDTCNTCL | WDTIS0;
00085     IE1 |= WDTIE;
00086     // Interrupt enable
00087     _EINT ();
00088 }
00089 
00090 void TIME_getDate (TIME_date_t *const date)
00091 {
00092     //RTCCTL |= RTCHOLD;
00093     date->year = RTCYEARH << 8 | RTCYEARL;
00094     date->month = RTCMON;
00095     date->day = RTCDAY;
00096     date->hour = RTCHOUR;
00097     date->min = RTCMIN;
00098     date->sec = RTCSEC;
00099     //RTCCTL &= ~RTCHOLD;
00100 }
00101 
00102 void TIME_setDate (const TIME_date_t *date)
00103 {
00104     RTCCTL |= RTCHOLD;
00105     RTCYEARH = date->year >> 8;
00106     RTCYEARL = date->year & 0xFF;
00107     RTCMON = date->month;
00108     RTCDAY = date->day;
00109     RTCHOUR = date->hour;
00110     RTCMIN = date->min;
00111     RTCSEC = date->sec;
00112     RTCCTL &= ~RTCHOLD;
00113 }
00114 
00115 void mdelay (uint32_t milliseconds)
00116 {
00117     uint32_t j = jiffies;
00118     while (jiffies - j < milliseconds);
00119 }
00120 
00121 void delay (uint32_t seconds)
00122 {
00123     uint32_t j = jiffies;
00124     uint32_t ms = seconds * 1000;
00125     while (jiffies - j < ms);
00126 }
00127 

Generated on Sun Dec 9 17:17:10 2007 for Sample MSP430-4619LCD Project by  doxygen 1.5.1