Kaynağa Gözat

Выбросил диспетчер. Распихал переменные по регистрам.

Vladimir N. Shilov 8 yıl önce
ebeveyn
işleme
aa3578a702
7 değiştirilmiş dosya ile 224 ekleme ve 370 silme
  1. 1 10
      MegaClock.ewp
  2. 0 9
      MegaClock.ewt
  3. 181 104
      main.c
  4. 42 12
      main.h
  5. 0 169
      rtos.c
  6. 0 65
      rtos.h
  7. 0 1
      twim.h

+ 1 - 10
MegaClock.ewp

@@ -331,7 +331,7 @@
         <option>
           <name>CCLockRegs</name>
           <version>0</version>
-          <state>0</state>
+          <state>9</state>
         </option>
         <option>
           <name>CCAllowList</name>
@@ -2106,15 +2106,6 @@
       <data/>
     </settings>
   </configuration>
-  <group>
-    <name>Sheduler</name>
-    <file>
-      <name>$PROJ_DIR$\rtos.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\rtos.h</name>
-    </file>
-  </group>
   <group>
     <name>TWI</name>
     <file>

+ 0 - 9
MegaClock.ewt

@@ -2098,15 +2098,6 @@
       </data>
     </settings>
   </configuration>
-  <group>
-    <name>Sheduler</name>
-    <file>
-      <name>$PROJ_DIR$\rtos.c</name>
-    </file>
-    <file>
-      <name>$PROJ_DIR$\rtos.h</name>
-    </file>
-  </group>
   <group>
     <name>TWI</name>
     <file>

+ 181 - 104
main.c

@@ -2,9 +2,6 @@
 
 __C_task void main(void)
 {
-  uint8_t i;
-  //uint8_t tmp8;
-
   /* Disable comaparator */
   ACSR = 1<<ACD;
 
@@ -20,11 +17,7 @@ __C_task void main(void)
   INDCTR_COMMON_DDR = INDCTR_COMMON_ALL; // common pins to output
   INDCTR_COMMON_PORT = ~INDCTR_COMMON_ALL; // off all indikators
 
-  for(i=0; i<INDCTR_NUMS; i++) {
-    Display[i] = Sym_minus;
-  }
-
-  Flag.needDot = 0;
+  Flag2.needDot = 0;
 
   /* Timer0 every 4 ms switch showing LED */
   TCCR0 = TIM0_PRESCALER;
@@ -36,6 +29,11 @@ __C_task void main(void)
 //  TCNT1 = 64536;
 //  TIMSK |= 1<<TOIE1; // enable TIM1_OVF interrupt
 
+  /* Timer2 count 1 ms */
+  TCCR2 = TIM2_PRESCALER;
+  TCNT2 = TIM2_CNT; // load timer
+  TIMSK |= 1<<TOV2; // enable TIM2_OVF interrupt
+
   /* ADC init */
   resultADC = 0;
   ADMUX = (1<<REFS0) | (1<<ADLAR); // Vref = AVcc, channel ADC0, Left adjusted result
@@ -46,111 +44,147 @@ __C_task void main(void)
 
   __enable_interrupt();
 
-  /* Init Scheduler and TDelay */
-  RTOS_Init();
-
-  // Tasks for sheduler
-  RTOS_SetTask(startADC,0,50);
-  RTOS_SetTask(getTime,4,500);
-  RTOS_SetTask(showHHMM,8,500);
-  RTOS_SetTask(ds18b20_StartMeasure,12,10000);
+  // Start tasks
+  counterADC = PERIOD_ADC; // every 50 ms start ADC measure
+  counterTWI = 4; // small delay
+  counterDS18B20s = 12; // small delay
   
   State = show_HHMM;
 
   while(1) {
 
     /* check time */
+    if (1 == Flag.getTime) {
+      Flag.getTime = 0;
+      getTime();
+    } // end of Flag.getTime
+
     if  (1 == Flag.newTime) {
       Flag.newTime = 0;
       
-      if (show_HHMM == State) {
+      switch (State) {
+      case show_HHMM:
         // every 25 and 55 seconds shoe temperature for 5 seconds
         if ((25 == Clock.seconds) || (55 == Clock.seconds)) {
-          RTOS_SetTask(showHHMM,5000,500);
-          RTOS_SetTask(showTEMP,0,1000);
+          State = show_TEMPt;
+          counterShowTemp = PERIOD_SHT;
+          showTEMP();
+        } else {
+          showHHMM();
         }
+        break;
+        
+      case show_MMSS:
+        showMMSS();
+        break;
+        
+      default:
+        break;
       }
+    } // end of Flag.newTime
+
+    /* Temperature */
+    if (1 == Flag.startDS18B20) {
+      Flag.startDS18B20 = 0;
+      ds18b20_StartMeasure();
+    }
+    
+    if (1 == Flag.readDS18B20) {
+      Flag.readDS18B20 = 0;
+      ds18b20_ReadTemperature();
     }
 
+    if (1 == Flag.newTemp) {
+      Flag.newTemp = 0;
+      if ((show_TEMPt == State) || (show_TEMPp == State)) {
+        showTEMP();
+      }
+    } // end of Flag.newTemp
+
     /* check buttons */
     if (1 == Flag.newBTN) {
-      uint8_t mm, hh;
-      
       Flag.newBTN = 0;
+
+      uint8_t mm, hh;
       
       btn_t btn = getBTN();
       switch (btn) {
       case btn_1:
         // show HH:MM
         State = show_HHMM;
-        RTOS_SetTask(showTEMP,0,0);
-        RTOS_SetTask(showMMSS,0,0);
-        RTOS_SetTask(showHHMM,0,500);
+        counterShowTemp = 0;
+        showHHMM();
         break;
 
       case btn_2:
         // show MM SS
         State = show_MMSS;
-        Flag.needDot = 0;
-        RTOS_SetTask(showHHMM,0,0);
-        RTOS_SetTask(showTEMP,0,0);
-        RTOS_SetTask(showMMSS,0,500);
+        Flag2.needDot = 1;
+        counterShowTemp = 0;
+        showMMSS();
         break;
 
       case btn_3:
         // show temperature
-        State = show_TEMP;
-        Flag.needDot = 0;
-        RTOS_SetTask(showMMSS,0,0);
-        RTOS_SetTask(showHHMM,0,0);
-        RTOS_SetTask(showTEMP,0,1000);
+        State = show_TEMPp;
+        Flag2.needDot = 0;
+        counterShowTemp = 0;
+        showTEMP();
         break;
 
       case btn_4:
         // time --
-        mm = bcd2bin(Clock.minutes);
-        hh = bcd2bin(Clock.hours);
-        if (mm > 0) {
-          mm --;
-        } else {
-          mm = 59;
-          if (hh > 0) {
-            hh --;
+        if (Flag.setTime == 1) {
+          mm = bcd2bin(Clock.minutes);
+          hh = bcd2bin(Clock.hours);
+          if (mm > 0) {
+            mm --;
           } else {
-            hh = 23;
+            mm = 59;
+            if (hh > 0) {
+              hh --;
+            } else {
+              hh = 23;
+            }
           }
+          Clock.minutes = bin2bcd(mm);
+          Clock.hours = bin2bcd(hh);
         }
-        Clock.minutes = bin2bcd(mm);
-        Clock.hours = bin2bcd(hh);
         break;
 
       case btn_5:
         // time ++
-        mm = bcd2bin(Clock.minutes);
-        hh = bcd2bin(Clock.hours);
-        mm ++;
-        if (mm > 59) {
-          mm = 0;
-          hh ++;
-          if (hh > 23) {
-            hh = 0;
+        if (Flag.setTime == 1) {
+          mm = bcd2bin(Clock.minutes);
+          hh = bcd2bin(Clock.hours);
+          mm ++;
+          if (mm > 59) {
+            mm = 0;
+            hh ++;
+            if (hh > 23) {
+              hh = 0;
+            }
           }
+          Clock.minutes = bin2bcd(mm);
+          Clock.hours = bin2bcd(hh);
         }
-        Clock.minutes = bin2bcd(mm);
-        Clock.hours = bin2bcd(hh);
         break;
 
       case btn_6:
         // save new time
-        Flag.blankIndktr = 0;
-        setTime();
-        RTOS_SetTask(getTime,4,500);
+        if (Flag.setTime == 1) {
+          Flag.setTime = 0;
+          Flag2.blankIndktr = 0;
+          setTime();
+          counterTWI = PERIOD_TWI;
+        }
         break;
 
       case btn_7:
         // time set
-        Flag.blankIndktr = 1;
-        RTOS_SetTask(getTime,0,0);
+        Flag.setTime = 1;
+        Flag2.blankIndktr = 1;
+        counterTWI = 0;
         break;
 
       default:
@@ -159,8 +193,12 @@ __C_task void main(void)
       
     } // end of new BTN
 
-    tdelay_ms(10); // sleep and rotate dispatcher
+    // делать нехрен -- спим, ждём прерывание
+    MCUCR = 1<<SE;
+    __sleep();
+
   } // end of while(1)
+
 } // end of main()
 
 /**
@@ -176,42 +214,37 @@ static uint8_t bin2bcd(uint8_t bin) {
 
 static void showHHMM(void) {
   State = show_HHMM;
-  Display[0] = IndctrNums[(0x0F & (Clock.hours>>4))];
-  Display[1] = IndctrNums[(0x0F & Clock.hours)];
-  Display[2] = IndctrNums[(0x0F & (Clock.minutes>>4))];
-  Display[3] = IndctrNums[(0x0F & Clock.minutes)];
+  Indicator1 = IndctrNums[(0x0F & (Clock.hours>>4))];
+  Indicator2 = IndctrNums[(0x0F & Clock.hours)];
+  Indicator3 = IndctrNums[(0x0F & (Clock.minutes>>4))];
+  Indicator4 = IndctrNums[(0x0F & Clock.minutes)];
 }
 
 static void showMMSS(void) {
-  Display[0] = IndctrNums[(0x0F & (Clock.minutes>>4))];
-  Display[1] = IndctrNums[(0x0F & Clock.minutes)];
-  Display[2] = IndctrNums[(0x0F & (Clock.seconds>>4))];
-  Display[3] = IndctrNums[(0x0F & Clock.seconds)];
+  Indicator1 = IndctrNums[(0x0F & (Clock.minutes>>4))];
+  Indicator2 = IndctrNums[(0x0F & Clock.minutes)];
+  Indicator3 = IndctrNums[(0x0F & (Clock.seconds>>4))];
+  Indicator4 = IndctrNums[(0x0F & Clock.seconds)];
 }
 
 static void showTEMP(void) {
   int8_t t = Temperature;
   
   if (t < 0) {
-    Display[0] = Sym_minus;
+    Indicator1 = Sym_minus;
     t = -t;
   } else {
-    Display[0] = Sym_blank;
+    Indicator1 = Sym_blank;
   }
 
   // convert to BCD
   t = bin2bcd(t);
 
-  Display[1] = IndctrNums[(0x0F & (t>>4))];
-  Display[2] = IndctrNums[(0x0F & t)];
-  Display[3] = Sym_gradus;
+  Indicator2 = IndctrNums[(0x0F & (t>>4))];
+  Indicator3 = IndctrNums[(0x0F & t)];
+  Indicator4 = Sym_gradus;
   
-  Flag.needDot = 0;
-}
-
-static void startADC(void) {
-  // enable interrupt and start conversion
-  ADCSR |= ((1<<ADSC) | (1<<ADIE));
+  Flag2.needDot = 0;
 }
 
 static btn_t getBTN(void) {
@@ -239,8 +272,8 @@ static void getTime(void) {
   static uint8_t old_sec;
 
   /* Sync with indicators */
-  Flag.waitIndktr = 1;
-  while (Flag.waitIndktr == 1);
+  Flag2.waitIndktr = 1;
+  while (Flag2.waitIndktr == 1);
  
   /*устанавливаем указатель DS1307 на нулевой адрес*/
   twi_buf[0] = (DS1307_ADR<<1)|0; //адресный пакет
@@ -260,9 +293,9 @@ static void getTime(void) {
   
   if (show_HHMM == State) {
     if (old_sec != Clock.seconds) {
-      Flag.needDot = 1;
+      Flag2.needDot = 1;
     } else {
-      Flag.needDot = 0;
+      Flag2.needDot = 0;
     }
   }
 
@@ -272,8 +305,8 @@ static void getTime(void) {
 
 static void setTime(void) {
   /* Sync with indicators */
-  Flag.waitIndktr = 1;
-  while (Flag.waitIndktr == 1);
+  Flag2.waitIndktr = 1;
+  while (Flag2.waitIndktr == 1);
  
    /* prepare new time */
   twi_buf[0] = (DS1307_ADR<<1)|0; //адресный пакет
@@ -296,14 +329,14 @@ static uint8_t ds18b20_Reset(void) {
 
   //ds18b20_delay(us(480));
   TCNT1 = 0;
-  while (TCNT1 <= 500) {
+  while (TCNT1 <= 480) {
   }
 
   /* Release line and wait for 60uS */
   DS18B20_INPUT_MODE;
   //ds18b20_delay(us(60));
   TCNT1 = 0;
-  while (TCNT1 <= 70) {
+  while (TCNT1 <= 60) {
   }
 
   /* Store line value and wait until the completion of 480uS period */
@@ -311,7 +344,7 @@ static uint8_t ds18b20_Reset(void) {
   //ds18b20_delay(us(420));
   //OCR1B = 420;
   TCNT1 = 0;
-  while (TCNT1 <= 430) {
+  while (TCNT1 <= 420) {
   }
 
   /* Return the value read from the presence pulse (0=OK, else=WRONG) */
@@ -394,8 +427,8 @@ static void ds18b20_WriteByte(uint8_t byte) {
 
 static void ds18b20_StartMeasure(void) {
   /* Sync with indicators */
-  Flag.waitIndktr = 1;
-  while (Flag.waitIndktr == 1);
+  Flag2.waitIndktr = 1;
+  while (Flag2.waitIndktr == 1);
  
   /* Reset, skip ROM and start temperature conversion */
   if (ds18b20_Reset() != 0) {
@@ -404,7 +437,7 @@ static void ds18b20_StartMeasure(void) {
   } else {
     ds18b20_WriteByte(DS18B20_CMD_SKIPROM);
     ds18b20_WriteByte(DS18B20_CMD_CONVERTTEMP);
-    RTOS_SetTask(ds18b20_ReadTemperature, 800, 0);
+    counterDS18B20r = PERIOD_DS18B20r;
   }
 }
 
@@ -413,8 +446,8 @@ static void ds18b20_ReadTemperature(void) {
   uint8_t decimal;
 
   /* Sync with indicators */
-  Flag.waitIndktr = 1;
-  while (Flag.waitIndktr == 1);
+  Flag2.waitIndktr = 1;
+  while (Flag2.waitIndktr == 1);
  
   /* Reset, skip ROM and send command to read Scratchpad */
   if (ds18b20_Reset() != 0) {
@@ -463,12 +496,12 @@ __interrupt void TIMER0_OVF_ISR(void) {
 
   INDCTR_COMMON_PORT &= ~INDCTR_COMMON_ALL; // off all indikators
 
-  Flag.waitIndktr = 0;
+  Flag2.waitIndktr = 0;
 
-  if (1 == Flag.blankIndktr) {
-    if (blank_time <= 200) {
-      blank_time ++;
+  if (1 == Flag2.blankIndktr) {
+    if (blank_time <= 150) {
       flag = 1;
+      blank_time ++;
     } else if (blank_time <= 250) {
       blank_time ++;
       flag = 0;
@@ -481,29 +514,29 @@ __interrupt void TIMER0_OVF_ISR(void) {
   if (1 == flag) {
     switch (indicator) {
     case 0:
-      INDCTR_SEGMENT_PORT = Display[0];
+      INDCTR_SEGMENT_PORT = Indicator1;
       INDCTR_COMMON_PORT |= 0x01;
       indicator = 1;
       break;
 
     case 1:
-      if (1 == Flag.needDot) {
-        INDCTR_SEGMENT_PORT = Display[1] | Sym_dot;
+      if (1 == Flag2.needDot) {
+        INDCTR_SEGMENT_PORT = Indicator2 | Sym_dot;
       } else {
-        INDCTR_SEGMENT_PORT = Display[1];
+        INDCTR_SEGMENT_PORT = Indicator2;
       }
       INDCTR_COMMON_PORT |= 0x02;
       indicator = 2;
       break;
 
     case 2:
-      INDCTR_SEGMENT_PORT = Display[2];
+      INDCTR_SEGMENT_PORT = Indicator3;
       INDCTR_COMMON_PORT |= 0x04;
       indicator = 3;
       break;
 
     case 3:
-      INDCTR_SEGMENT_PORT = Display[3];
+      INDCTR_SEGMENT_PORT = Indicator4;
       INDCTR_COMMON_PORT |= 0x08;
 
     default:
@@ -523,7 +556,51 @@ __interrupt void TIMER1_COMPB_ISR(void) {
 
 #pragma vector=TIMER1_OVF_vect
 __interrupt void TIMER1_OVF_ISR(void) {
-  Flag.T1OC = 1;
+//  Flag.T1OC = 1;
+}
+
+#pragma vector=TIMER2_OVF_vect
+__interrupt void TIMER2_OVF_ISR(void) {
+  TCNT2 = TIM2_CNT; // reload timer
+
+  if (counterADC > 0) {
+    counterADC --;
+    if (counterADC == 0) {
+      counterADC = PERIOD_ADC;
+      // enable interrupt and start conversion
+      ADCSR |= ((1<<ADSC) | (1<<ADIE));
+    }
+  }
+
+  if (counterTWI > 0) {
+    counterTWI --;
+    if (counterTWI == 0) {
+      counterTWI = PERIOD_TWI;
+      Flag.getTime = 1;
+    }
+  }
+
+  if (counterShowTemp > 0) {
+    counterShowTemp --;
+    if (counterShowTemp == 0) {
+      State = show_HHMM;
+    }
+  }
+  
+  if (counterDS18B20s > 0) {
+    counterDS18B20s --;
+    if (counterDS18B20s == 0) {
+      counterDS18B20s = PERIOD_DS18B20s;
+      Flag.startDS18B20 = 1;
+    }
+  }
+  
+  if (counterDS18B20r > 0) {
+    counterDS18B20r --;
+    if (counterDS18B20r == 0) {
+      Flag.readDS18B20 = 1;
+    }
+  }
 }
 
 #pragma vector=ADC_vect

+ 42 - 12
main.h

@@ -4,14 +4,20 @@
 #include <ioavr.h>
 #include <intrinsics.h>
 #include <stdint.h>
-#include "rtos.h"
 #include "twim.h"
 
+#ifndef F_CPU
+   #define F_CPU  8000000UL
+#endif
+
 /* Timers */
 // T0 period 4 ms == 0x100 - (8000000 / 256 * 0.004) 
 #define TIM0_PRESCALER  1<<CS02
 #define TIM0_CNT        0x83
-#define TIM0_CHANNEL    0x00
+
+// T2 period 1 ms == 0x100 - (8000000 / 64 * 0.001)
+#define TIM2_PRESCALER  1<<CS22
+#define TIM2_CNT        0x83
 
 /* LEDs */
 #define LED_PORT        PORTC
@@ -113,7 +119,7 @@ const indctr_sym_t IndctrNums[16] = {
 #define DS18B20_HIGH            DS18B20_PORT|=(1<<DS18B20_PAD)
 #define DS18B20_VALUE           (DS18B20_PIN & (1<<DS18B20_PAD))
 
-static int8_t Temperature;
+__no_init int8_t Temperature @7;
 
 static uint8_t ds18b20_Reset(void);
 static void ds18b20_WriteBit(uint8_t bit);
@@ -149,6 +155,7 @@ typedef enum {
 #define DS1307_ADR              0x68
 #define DS1307_ADR_RD           0xD0
 #define DS1307_ADR_WR           0xD1
+
 typedef struct {
   uint8_t seconds;
   uint8_t minutes;
@@ -160,33 +167,56 @@ typedef enum {
   show_None = 0,
   show_HHMM,
   show_MMSS,
-  show_TEMP
+  show_TEMPp,
+  show_TEMPt
 } state_t;
 
-volatile struct {
-  uint8_t needDot       : 1;
+__no_init struct {
   uint8_t newTime       : 1;
   uint8_t newTemp       : 1;
   uint8_t newBTN        : 1;
   uint8_t T1OC          : 1;
   uint8_t setTime       : 1;
+  uint8_t getTime       : 1;
+  uint8_t startDS18B20  : 1;
+  uint8_t readDS18B20   : 1;
+} Flag @10;
+
+__no_init struct {
+  uint8_t needDot       : 1;
   uint8_t blankIndktr   : 1;
   uint8_t waitIndktr    : 1;
-} Flag;
+  uint8_t               : 5;
+} Flag2 @9;
+
+__no_init state_t State @8;
+__no_init indctr_sym_t Indicator1 @15;
+__no_init indctr_sym_t Indicator2 @14;
+__no_init indctr_sym_t Indicator3 @13;
+__no_init indctr_sym_t Indicator4 @12;
+__no_init uint8_t resultADC @11;
 
-volatile static state_t State;
-volatile static indctr_sym_t Display[4];
-volatile static uint8_t resultADC;
 static uint8_t twi_buf[8];
 static time_t Clock;
-static void setTime(void);
+
+#define PERIOD_ADC      50
+#define PERIOD_TWI      500
+#define PERIOD_SHT      5000
+#define PERIOD_DS18B20s 10000
+#define PERIOD_DS18B20r 750
+volatile static uint8_t counterADC;
+volatile static uint16_t counterTWI;
+volatile static uint16_t counterShowTemp;
+volatile static uint16_t counterDS18B20s;
+volatile static uint16_t counterDS18B20r;
+
 
 /* Functions prototypes */
 static void showHHMM(void);
 static void showMMSS(void);
 static void showTEMP(void);
-static void startADC(void);
 static btn_t getBTN(void);
+static void setTime(void);
 static void getTime(void);
 static uint8_t bcd2bin(uint8_t bcd);
 static uint8_t bin2bcd(uint8_t bin);

+ 0 - 169
rtos.c

@@ -1,169 +0,0 @@
-#include "rtos.h"
-
-/**
- * Переменные модуля
- */
-static volatile task TaskArray[MAX_TASKS]; // очередь задач
-static volatile uint8_t arrayTail;         // "хвост" очереди
-static volatile uint8_t interruptStatus;
-
-#define DISABLE_INTERRUPT       {interruptStatus = __save_interrupt(); __disable_interrupt();}
-#define RESTORE_INTERRUPT       __restore_interrupt(interruptStatus)
-
-// счётчик задержки
-static volatile uint16_t TDelay;
-
-/**
- * Инициализация РТОС и t_delay, время тика - 1 мс
- */
-inline void RTOS_Init()
-{
-  // настраиваем основной таймер
-  TIMER_TCCR = TIMER_CSB;
-  TIMER_TCNT = TIMER_CNT;
-  TIMER_TIMSK |= TIMER_INT;
-
-  // "хвост" в 0
-  arrayTail = 0;
-}
-
-/**
- * Добавление задачи в список
- */
-void RTOS_SetTask (void (*taskFunc)(void), uint16_t taskDelay, uint16_t taskPeriod)
-{
-   uint8_t i;
-
-   if(!taskFunc) return;
-   for(i = 0; i < arrayTail; i++)               // поиск задачи в текущем списке
-   {
-      if(TaskArray[i].pFunc == taskFunc)        // если нашли, то обновляем переменные
-      {
-         DISABLE_INTERRUPT;
-
-         TaskArray[i].delay  = taskDelay;
-         TaskArray[i].period = taskPeriod;
-         TaskArray[i].run    = 0;
-
-         RESTORE_INTERRUPT;
-         return;                                // обновив, выходим
-      }
-   }
-
-   if (arrayTail < MAX_TASKS)                   // если такой задачи в списке нет
-   {                                            // и есть место,то добавляем
-      DISABLE_INTERRUPT;
-
-      TaskArray[arrayTail].pFunc  = taskFunc;
-      TaskArray[arrayTail].delay  = taskDelay;
-      TaskArray[arrayTail].period = taskPeriod;
-      TaskArray[arrayTail].run    = 0;
-
-      arrayTail++;                              // увеличиваем "хвост"
-      RESTORE_INTERRUPT;
-   }
-}
-
-/**
- * Удаление задачи из списка
- */
-inline void RTOS_DeleteTask (void (*taskFunc)(void))
-{
-   uint8_t i;
-
-   for (i=0; i<arrayTail; i++)                  // проходим по списку задач
-   {
-      if(TaskArray[i].pFunc == taskFunc)        // если задача в списке найдена
-      {
-
-         DISABLE_INTERRUPT;
-         if(i != (arrayTail - 1))               // переносим последнюю задачу
-         {                                      // на место удаляемой
-            TaskArray[i] = TaskArray[arrayTail - 1];
-         }
-         arrayTail--;                           // уменьшаем указатель "хвоста"
-         RESTORE_INTERRUPT;
-         return;
-      }
-   }
-}
-
-/**
- * Диспетчер РТОС, вызывается в main
- */
-
-void RTOS_DispatchTask(void)
-{
-   uint8_t i;
-   void (*function) (void);
-   for (i=0; i<arrayTail; i++)                  // проходим по списку задач
-   {
-      if (TaskArray[i].run == 1)                // если флаг на выполнение взведен,
-      {                                         // запоминаем задачу, т.к. во
-         function = TaskArray[i].pFunc;         // время выполнения может
-                                                // измениться индекс
-         if(TaskArray[i].period == 0)
-         {                                      // если период равен 0
-            RTOS_DeleteTask(TaskArray[i].pFunc);// удаляем задачу из списка,
-
-         }
-         else
-         {
-            TaskArray[i].run = 0;               // иначе снимаем флаг запуска
-            if(!TaskArray[i].delay)             // если задача не изменила задержку
-            {                                   // задаем ее
-               TaskArray[i].delay = TaskArray[i].period-1;
-            }                                   // задача для себя может сделать паузу
-         }
-         (*function)();                         // выполняем задачу
-      }
-   }
-}
-
-/**
- * Delay, msek
- * также, что-бы зря не терять время -- крутим диспетчер
- */
-void tdelay_ms(uint16_t msek) {
-
-  TDelay = msek;
-
-  do {
-    RTOS_DispatchTask();
-    // делать нехрен -- спим, ждём прерывание
-    MCUCR = 1<<SE;
-    __sleep();
-  } while (TDelay>0);
-
-}
-
-/**
- * Таймерная служба РТОС и tdelay (прерывание аппаратного таймера)
- */
-#pragma vector=TIMER_OVF_VECT
-__interrupt void TIMER_OVF_ISR(void) {
-
-  // перезарядим таймер
-  TIMER_TCNT = TIMER_CNT;
-
-  /* RTOS_Timer */
-  uint8_t i;
-
-  // проходим по списку задач
-  for (i=0; i<arrayTail; i++) {
-    // если время до выполнения истекло
-    if (TaskArray[i].delay == 0) {
-      // взводим флаг запуска,
-      TaskArray[i].run = 1;
-    } else {
-      // иначе уменьшаем время
-      TaskArray[i].delay--;
-    }
-  }
-
-  /* TDelay_Timer -- уменьшим счётчик */
-  if (TDelay > 0) {
-    TDelay --;
-  }
-
-}

+ 0 - 65
rtos.h

@@ -1,65 +0,0 @@
-/******************************************************************************************
- * За основу взят планировщик задач с сайта ChipEnable.ru                                 *
- * http://chipenable.ru/index.php/programming-avr/item/110-planirovschik.html             *
- *                                                                                        *
- * Доработал Шибанов Владимир aka KontAr                                                  *
- * Дата: 26.03.2014                                                                       *
- *                                                                                        *
- * Изменения:                                                                             *
- * - добавлен однократный вызов задачи                                                    *
- * - добавлено удаление задачи по имени                                                   *
- * - при повторном добавлении задачи обновляются ее переменные                            *
- * - добавлен указатель на "хвост" списка                                                 *
- * - функции РТОС скорректированы с учетом "хвоста"                                       *
- ******************************************************************************************
- * shilov, 2015.04.07									  *
- * совместил с модулем милисекундных задержек на таймере				  *
- ******************************************************************************************/
-
-#ifndef __RTOS_H
-#define __RTOS_H
-
-#include <ioavr.h>
-#include <intrinsics.h>
-#include <stdint.h>
-
-// Количество задач
-#define MAX_TASKS               10
-
-/**
- * Будем использовать второй таймер, период -- 1 мсек
- */
-#define TIMER_HZ		1000
-#define TIMER_PRESCALER         64
-#define	TIMER_CNT		(0x100 - (F_CPU / TIMER_PRESCALER / TIMER_HZ))
-
-#define TIMER_TCCR		TCCR2
-#define TIMER_TCNT		TCNT2
-#define TIMER_TIMSK		TIMSK
-#define TIMER_CSB		(1<<CS22)
-#define TIMER_INT		(1<<TOV2)
-#define TIMER_OVF_VECT          TIMER2_OVF_vect
-
-/**
- * Структура задачи
- */
-typedef struct task
-{
-   void (*pFunc) (void); // указатель на функцию
-   uint16_t delay;       // задержка перед первым запуском задачи
-   uint16_t period;      // период запуска задачи
-   uint8_t run;          // флаг готовности задачи к запуску
-} task;
-
-/**
- * Прототипы фукнций
- */
-void RTOS_Init (void);
-void RTOS_SetTask (void (*taskFunc)(void), uint16_t taskDelay, uint16_t taskPeriod);
-void RTOS_DeleteTask (void (*taskFunc)(void));
-void RTOS_DispatchTask (void);
-void RTOS_Timer (void);
-
-void tdelay_ms(uint16_t msek);
-
-#endif // __RTOS_H

+ 0 - 1
twim.h

@@ -27,7 +27,6 @@
 частота, определяем ее здесь*/
 #ifndef F_CPU
    #error F_CPU!!!
-   #define F_CPU  16000000UL
 #endif
 
 /*размер буфера TWI модуля*/