2008-03-14 Martin Thomas <mthomas@rhrk.uni-kl.de>
[avr_bc100.git] / BaseTinyFirmware / GCC / time.c
index ee738bd3e63286842e5389d4ada7a76646d30c81..61df5c04e66bfb7217ce971d6c5c44945a9c4716 100644 (file)
@@ -38,7 +38,7 @@
 //******************************************************************************\r
 // Variables\r
 //******************************************************************************\r
-unsigned long timeval[TIMERS];  //!< Contains the values for each timer.\r
+volatile unsigned long timeval[TIMERS];  //!< Contains the values for each timer.\r
 \r
 // timer runs at 1 MHz and overflow will occur every 255 / 1 Mz ~= 0.25 ms \r
 //#pragma vector = TIM0_OVF_vect\r
@@ -76,7 +76,15 @@ ISR(TIMER0_COMPA_vect)
  */ \r
 unsigned char Time_Left(unsigned char timer)\r
 {\r
-       if(timeval[timer] > 0) {\r
+       unsigned long tval;\r
+       unsigned char sreg_saved;\r
+\r
+       sreg_saved = SREG;\r
+       cli();\r
+       tval = timeval[timer];\r
+       SREG = sreg_saved;\r
+\r
+       if( tval > 0 ) {\r
                return(TRUE);\r
        } else {\r
                return(FALSE);\r
@@ -99,9 +107,18 @@ void Time_Set(unsigned char timer, unsigned int min, unsigned char sec,
 //     timeval[i] += 4000 * (unsigned long)sec;\r
 //     timeval[i] += 4 * (unsigned long)ms;\r
 \r
-       timeval[timer] = 60000 * (unsigned long)min;\r
-       timeval[timer] += 1000 * (unsigned long)sec;\r
-       timeval[timer] += 1 * (unsigned long)ms;\r
+       unsigned long tval;\r
+       unsigned char sreg_saved;\r
+       \r
+\r
+       tval  = 60000 * (unsigned long)min;\r
+       tval += 1000 * (unsigned long)sec;\r
+       tval += 1 * (unsigned long)ms;\r
+\r
+       sreg_saved = SREG;\r
+       cli();\r
+       timeval[timer] = tval;\r
+       SREG = sreg_saved;\r
 }\r
 \r
 \r
@@ -133,10 +150,14 @@ void Time_Start(void)
 void Time_Init(void)\r
 {\r
        unsigned char i;\r
+       unsigned char sreg_saved;\r
        \r
+       sreg_saved = SREG;\r
+       cli();\r
        for (i = 0; i<<TIMERS; i++)     {\r
                timeval[i] = 0;\r
        }\r
+       SREG = sreg_saved;\r
 \r
        //    OCR0A = 0;  // Doesn't matter, will run in normal mode.\r
        \r
@@ -155,7 +176,4 @@ void Time_Init(void)
        //    TIMSK |= (1<<TOIE0);      // Overflow interrupt enabled.\r
 \r
        TIMSK |= (1<<OCIE0A);  // Timer 0, Compare match A interrupt enabled.\r
-\r
-       // Enable interrupts, just in case they weren't already.\r
-       sei();       \r
 }\r