]> git.tdb.fi Git - model-railway-devices.git/blobdiff - common/timer.c
Provide peak current since last read
[model-railway-devices.git] / common / timer.c
index 99625f8c2abd4b6df8ca0dd552b760499d09bf6e..491e4707d7e870898211f48405e9463392ed70cb 100644 (file)
@@ -10,9 +10,7 @@ static void timer_start(uint8_t num, uint32_t period)
        if(num==0)
        {
                if(period<0x100)
-               {
                        cs = BIT(CS00);
-               }
                else if(period<0x800)
                {
                        cs = BIT(CS01);
@@ -40,12 +38,10 @@ static void timer_start(uint8_t num, uint32_t period)
                OCR0A = period;
                TIMSK0 = BIT(OCIE0A);
        }
-       if(num==1)
+       else if(num==1)
        {
                if(period<0x10000)
-               {
                        cs = BIT(CS10);
-               }
                else if(period<0x80000)
                {
                        cs = BIT(CS11);
@@ -74,6 +70,47 @@ static void timer_start(uint8_t num, uint32_t period)
                OCR1AL = period;
                TIMSK1 = BIT(OCIE1A);
        }
+       else if(num==2)
+       {
+               if(period<0x100)
+                       cs = BIT(CS20);
+               else if(period<0x800)
+               {
+                       cs = BIT(CS21);
+                       period /= 8;
+               }
+               else if(period<0x2000)
+               {
+                       cs = BIT(CS21) | BIT(CS20);
+                       period /= 32;
+               }
+               else if(period<0x4000)
+               {
+                       cs = BIT(CS22);
+                       period /= 64;
+               }
+               else if(period<0x8000)
+               {
+                       cs = BIT(CS22) | BIT(CS20);
+                       period /= 128;
+               }
+               else if(period<0x10000)
+               {
+                       cs = BIT(CS22) | BIT(CS21);
+                       period /= 256;
+               }
+               else
+               {
+                       cs = BIT(CS22) | BIT(CS21) | BIT(CS20);
+                       period /= 1024;
+                       if(period>0xFF)
+                               period = 0xFF;
+               }
+               TCCR2A = BIT(WGM21);
+               TCCR2B = cs;
+               OCR2A = period;
+               TIMSK2 = BIT(OCIE2A);
+       }
 }
 
 void timer_start_hz(uint8_t num, uint32_t freq_p, uint8_t freq_q)
@@ -98,4 +135,9 @@ void timer_stop(uint8_t num)
                TCCR1B = 0;
                TIMSK1 = 0;
        }
+       else if(num==2)
+       {
+               TCCR2B = 0;
+               TIMSK2 = 0;
+       }
 }