Prechádzať zdrojové kódy

Добавил сброс счётчиков.

Vladimir N. Shilov 8 rokov pred
rodič
commit
fd197960a6
5 zmenil súbory, kde vykonal 122 pridanie a 50 odobranie
  1. 2 1
      Makefile
  2. 17 2
      ReadMe.txt
  3. 2 2
      lib/adc.c
  4. 3 3
      lib/adc.h
  5. 98 42
      src/main.c

+ 2 - 1
Makefile

@@ -110,7 +110,7 @@ DBG_CFLAGS += -lC $(LIST_DIR) -lB $(LIST_DIR)
 DBG_CFLAGS += --diag_suppress Pa050
 
 ASMFLAGS = -M'<>' -ld $(OUT_DIR)\list --diag_suppress Pa050
-ASMFLAGS += --code_model small --data_model small
+ASMFLAGS += --code_model $(CODE_MODEL) --data_model $(DATA_MODEL)
 
 DBG_ASMFLAGS = -M'<>' -r -ld $(OUT_DIR)\list --diag_suppress Pa050
 DBG_ASMFLAGS += --code_model $(CODE_MODEL) --data_model $(DATA_MODEL)
@@ -140,6 +140,7 @@ DBG_LINKFLAGS += --entry __iar_program_start
 all: $(OUT_DIR) $(PROJ_S19) $(PROJ_HEX)
 Release: all
 flash: all
+cleanRelease: clean
 
 # Make build/output directory
 $(OUT_DIR):

+ 17 - 2
ReadMe.txt

@@ -217,12 +217,12 @@ Factory_VREFINT у меня == 0x7E, т.е. полное значение 0x067E
    в этом буфере сырые данные (код от ацп);
  - раз в 100 мсек усредняем/обрабатываем эти 64 значения и складываем во
    второй буфер на 10 значений;
- - раз в секунду усредняем и считаем данные из воторого буфера.
+ - раз в секунду усредняем и считаем данные из второго буфера.
 
  Закончил.
  Получился слегка затянутым -- "фронт" изменения показаний около 3-х секунд.
  Шаг вольтметра в 1 мВ я получил, но смысла особого не вижу :-)
- Без "оверсэмплинга" показания более сабильны.
+ Без "оверсэмплинга" показания более стабильны.
 
  Фильтрация по каналу тока -- её не заметно. хз куда смотреть.
  В канале тока постоянно "висит" 3-4 мА, когда-то я считал,
@@ -266,3 +266,18 @@ Factory_VREFINT у меня == 0x7E, т.е. полное значение 0x067E
 
 Сделал переключение режимов построчно.
 Пора подумать о сохранении настроек в eeprom.
+
+---
+2016.12.01
+
+В режимах отображения ёмкостей, времени длинным нажатие будем сбрасывать
+счётчики ёмкостей и времени.
+При старте, при обоих нажатых кнопках делать коррекцию 0 амперметра.
+
+Наверное, нужно не каждые 100 мсек брать данные от АЦП, а в модуле АЦП
+генерить флаг готовности данных. И объеденить быстрые буферы в одну структуру.
+
+Нужно попробовать чтобы ПДП перебрасывал 2 по 2 по 64 байт, сразу в быстрый буфер.
+
+Сделал чтобы напряжение и ток показывало не среднее за секунду, а последнее за 100 мсек.
+Если будет сильно быстро, можно будет брать последние 2-4 результата.

+ 2 - 2
lib/adc.c

@@ -212,8 +212,8 @@ uint16_t * ADC_GetValues(void) {
   volt *= ADC_VOLT_K;
   volt /= ADC_ODIV;
 #else
-  volt += 32;
-  volt >>= 6;
+  volt += 32; // для округления
+  volt >>= 6; // делим
   volt *= ADC_REF;
   volt *= ADC_VOLT_K;
   volt /= ADC_DIV;

+ 3 - 3
lib/adc.h

@@ -24,9 +24,9 @@
 
 /* Exported macro ------------------------------------------------------------*/
 /* Exported variables --------------------------------------------------------*/
-extern __IO uint16_t ADC_Buffer[];
-extern __IO uint16_t VoltageFastBuffer[];
-extern __IO uint16_t CurrentFastBuffer[];
+//extern __IO uint16_t ADC_Buffer[];
+//extern __IO uint16_t VoltageFastBuffer[];
+//extern __IO uint16_t CurrentFastBuffer[];
 
 /* Exported functions ------------------------------------------------------- */
 void ADC_Config(void);

+ 98 - 42
src/main.c

@@ -57,11 +57,8 @@ typedef enum _events {
 #define BTN_SCAN_PERIOD 10
 // кнопка считается нажатой через BTN_FACTOR * BTN_SCAN_PERIOD ms
 #define BTN_FACTOR      5
-/*
-#define BTNs_PORT       GPIOA
-#define BTN1_PIN        GPIO_Pin_2
-#define BTN2_PIN        GPIO_Pin_3
-*/
+
+// размер "медленного" буфера
 #define VALUES_BUFFER_SIZE  10
 
 /* Private macro -------------------------------------------------------------*/
@@ -84,8 +81,11 @@ static const max7219_sym_t num[16] = {
 };
 
 /* Private variables ---------------------------------------------------------*/
-static uint16_t bufVoltage[VALUES_BUFFER_SIZE];
-static uint16_t bufCurrent[VALUES_BUFFER_SIZE];
+static struct _slowBuf {
+  uint16_t Voltage[VALUES_BUFFER_SIZE];
+  uint16_t Current[VALUES_BUFFER_SIZE];
+  uint8_t idx;
+} slowBuf;
 
 /* averaged values for 1 sek */
 static uint16_t Voltage;
@@ -125,6 +125,8 @@ static void showLabelT(uint8_t pos);
 
 static void displayMode(mode_led_t * disp, event_t event, uint8_t pos);
 
+static void blankLine(uint8_t pos);
+
 /* RTOS function prototypes -----------------------------------------------*/
 static void getADCValues(void);
 static void calculateValues(void);
@@ -141,6 +143,9 @@ static void showBotLineAH(void);
 static void showBotLineWH(void);
 static void showBotLineT(void);
 
+static void blankTopLine(void);
+static void blankBotLine(void);
+
 static void btnScan(void);
 static void btnTest(uint8_t btnPin, uint8_t *pressCount, void (*taskShortPress)(void), void (*taskLongPress)(void));
 static void btn1Short(void);
@@ -174,10 +179,10 @@ void main(void)
 
   /* ROTS tasks */
   RTOS_SetTask(btnScan, 0, BTN_SCAN_PERIOD);
-  RTOS_SetTask(getADCValues, 100, 100);
-  RTOS_SetTask(calculateValues, 101, 1000);
-  RTOS_SetTask(showTopLineU, 102, 200);
-  RTOS_SetTask(showBotLineI, 103, 200);
+  RTOS_SetTask(getADCValues, 101, 100);
+  RTOS_SetTask(calculateValues, 102, 1000);
+  RTOS_SetTask(showTopLineU, 103, 200);
+  RTOS_SetTask(showBotLineI, 104, 200);
   displayTopLine = displayU;
   displayBotLine = displayI;
 
@@ -193,17 +198,16 @@ void main(void)
   * и складываем в медленный.
   */
 static void getADCValues(void) {
-  static uint8_t  bufIdx = 0;
   uint16_t * avgVal;
 
   avgVal = ADC_GetValues();
 
-  bufVoltage[bufIdx] = *avgVal;
-  bufCurrent[bufIdx] = *(avgVal + 1);
+  slowBuf.Voltage[slowBuf.idx] = *avgVal;
+  slowBuf.Current[slowBuf.idx] = *(avgVal + 1);
 
-  bufIdx ++;
-  if (bufIdx == VALUES_BUFFER_SIZE) {
-    bufIdx = 0;
+  slowBuf.idx ++;
+  if (slowBuf.idx >= VALUES_BUFFER_SIZE) {
+    slowBuf.idx = 0;
   }
 }
 
@@ -217,8 +221,8 @@ static void calculateValues(void) {
   uint32_t v=0;
 
   for (i=0; i<VALUES_BUFFER_SIZE; i++) {
-    v += bufVoltage[i];
-    c += bufCurrent[i];
+    v += slowBuf.Voltage[i];
+    c += slowBuf.Current[i];
   }
 
   Current = (c + (VALUES_BUFFER_SIZE/2)) / VALUES_BUFFER_SIZE;
@@ -270,6 +274,17 @@ static void showTopLineT(void) {
   showT(0);
 }
 
+static void blankTopLine(void) {
+  static uint8_t cnt = 0;
+  if (cnt < 4) {
+    blankLine(0);
+    cnt ++;
+  } else {
+    RTOS_DeleteTask(blankTopLine);
+    cnt = 0;
+  }
+}
+
 /**
   * вывод инфы на нижнем индикаторе
   */
@@ -297,6 +312,17 @@ static void showBotLineT(void) {
   showT(4);
 }
 
+static void blankBotLine(void) {
+  static uint8_t cnt = 0;
+  if (cnt < 4) {
+    blankLine(4);
+    cnt ++;
+  } else {
+    RTOS_DeleteTask(blankBotLine);
+    cnt = 0;
+  }
+}
+
 /**
   * Output given value to given indicator
   * param1: value to show, from '0.000' to '999.9'
@@ -370,21 +396,23 @@ static void showValue(uint32_t val, uint8_t pos) {
 
 }
 
+/**
+  * и как "морагать" только одной строкой?
+  */
+void blankLine(uint8_t pos) {
+  static uint8_t i;
+  for (i=0; i<4; i++) {
+    MAX7219_WriteData(dig[pos+i], Sym_BLANK);
+  }
+}
+
 /**
   * Output voltage values to given indicator
   * param: starting position -- 0 for top
   * any other for bottom.
   */
 static void showU(uint8_t pos) {
-  uint32_t vlt = 0;
-  uint8_t tmp;
-
-  for (tmp=0; tmp<VALUES_BUFFER_SIZE; tmp++) {
-    vlt += bufVoltage[tmp];
-  }
-  vlt /= VALUES_BUFFER_SIZE;
-
-  showValue(vlt, pos);
+  showValue(slowBuf.Voltage[slowBuf.idx], pos);
 }
 
 /**
@@ -393,15 +421,7 @@ static void showU(uint8_t pos) {
   * any other for bottom.
   */
 static void showI(uint8_t pos) {
-  uint32_t crnt = 0;
-  uint8_t tmp;
-
-  for (tmp=0; tmp<VALUES_BUFFER_SIZE; tmp++) {
-    crnt += bufCurrent[tmp];
-  }
-  crnt /= VALUES_BUFFER_SIZE;
-
-  showValue(crnt, pos);
+  showValue(slowBuf.Current[slowBuf.idx], pos);
 }
 
 /**
@@ -419,7 +439,7 @@ static void showP(uint8_t pos) {
   * any other for bottom.
   */
 static void showAH(uint8_t pos) {
-  showValue(CapacityAH, pos);
+  showValue(((CapacityAH + 1800) / 3600), pos);
 }
 
 /**
@@ -428,7 +448,7 @@ static void showAH(uint8_t pos) {
   * any other for bottom.
   */
 static void showWH(uint8_t pos) {
-  showValue(CapacityWH, pos);
+  showValue(((CapacityWH + 1800) / 3600), pos);
 }
 
 /**
@@ -537,7 +557,7 @@ static void btnTest(uint8_t btnPin, uint8_t *pressCount, void (*taskShortPress)(
     if (*pressCount >= (BTN_FACTOR * 10)) {
       RTOS_SetTask(taskLongPress, 1, 0); // вызов функции при длительном нажатии
     } else if (*pressCount >= BTN_FACTOR) {
-      RTOS_SetTask(taskShortPress, 2, 0); // вызов функции при коротком нажатии
+      RTOS_SetTask(taskShortPress, 1, 0); // вызов функции при коротком нажатии
     }
     *pressCount = 0;
   }
@@ -607,10 +627,10 @@ static void displayMode(mode_led_t * disp, event_t event, uint8_t pos) {
     case displayWH:
       if (pos == 0) {
         RTOS_DeleteTask(showTopLineWH);
-        RTOS_SetTask(showTopLineT, 1000, 500);
+        RTOS_SetTask(showTopLineT, 1000, 250);
       } else {
         RTOS_DeleteTask(showBotLineWH);
-        RTOS_SetTask(showBotLineT, 1000, 500);
+        RTOS_SetTask(showBotLineT, 1000, 250);
       }
       showLabelT(pos);
       *disp = displayT;
@@ -627,6 +647,40 @@ static void displayMode(mode_led_t * disp, event_t event, uint8_t pos) {
       *disp = displayU;
       break;
     }
+  } else if (event == eventLongPress) {
+    /* КА долгих нажатий */
+    switch (*disp) {
+    case displayAH:
+      if (pos == 0) {
+        RTOS_SetTask(blankTopLine, 0, 250);
+        RTOS_SetTask(showTopLineAH, 250, 250);
+      } else {
+        RTOS_SetTask(blankBotLine, 0, 250);
+        RTOS_SetTask(showBotLineAH, 250, 250);
+      }
+      showLabelAH(pos);
+      break;
+    case displayWH:
+      if (pos == 0) {
+        RTOS_SetTask(blankTopLine, 0, 250);
+        RTOS_SetTask(showTopLineWH, 250, 250);
+      } else {
+        RTOS_SetTask(blankBotLine, 0, 250);
+        RTOS_SetTask(showBotLineWH, 250, 250);
+      }
+      showLabelWH(pos);
+      break;
+    case displayT:
+      if (pos == 0) {
+        RTOS_SetTask(blankTopLine, 0, 250);
+        RTOS_SetTask(showTopLineT, 250, 250);
+      } else {
+        RTOS_SetTask(blankBotLine, 0, 250);
+        RTOS_SetTask(showBotLineT, 250, 250);
+      }
+      showLabelT(pos);
+      break;
+    }
   }
 }
 
@@ -637,6 +691,7 @@ static void btn1Short(void) {
 
 /** обработчик длинного нажатия первой кнопки */
 static void btn1Long(void) {
+  displayMode(&displayTopLine, eventLongPress, 0);
 }
 
 /** обработчик короткого нажатия второй кнопки */
@@ -651,6 +706,7 @@ static void btn2Long(void) {
   Timer.hh = 0;
   CapacityAH = 0;
   CapacityWH = 0;
+  displayMode(&displayBotLine, eventLongPress, 4);
 }
 
 /**