浏览代码

Nightly Low Bright Mode.

Vladimir Shilov 5 年之前
父节点
当前提交
85a489eb4b
共有 5 个文件被更改,包括 86 次插入18 次删除
  1. 4 0
      ReadMe.txt
  2. 3 0
      inc/event-system.h
  3. 1 0
      inc/list_event.h
  4. 7 7
      src/event-system.c
  5. 71 11
      src/main.c

+ 4 - 0
ReadMe.txt

@@ -48,3 +48,7 @@ My Nixie Clock IN-12 / Мои часы на ГРИ ИН-12
 2019.06.01
 Всё отлично. Есть один-два несущественных момента.
 Первый релиз.
+---
+2019.06.03
+Продолжаем.
+Пониженная яркость с 22:00 до 06:00.

+ 3 - 0
inc/event-system.h

@@ -37,6 +37,7 @@ void showWDay(void);
 void showMDay(void);
 void showMonth(void);
 void showYear(void);
+void showBright(void);
 
 void incHH(void);
 void incMM(void);
@@ -49,10 +50,12 @@ void incWDay(void);
 void incMDay(void);
 void incMonth(void);
 void incYear(void);
+void incBright(void);
 void decWDay(void);
 void decMDay(void);
 void decMonth(void);
 void decYear(void);
+void decBright(void);
 
 void setTimeShow(void);
 void setTimeBegin(void);

+ 1 - 0
inc/list_event.h

@@ -25,6 +25,7 @@ typedef enum {
   stShowMDay,
   stShowMon,
   stShowYear,
+  stShowBright,
   stSetHH,
   stSetMM,
   /* end */

+ 7 - 7
src/event-system.c

@@ -38,12 +38,14 @@ const table_state_t stateTable[] PROGMEM = {
   {stShowWDay, evBTN1Pressed, stShowMDay, showMDay, dotOff},
   {stShowMDay, evBTN1Pressed, stShowMon,  showMonth, dotOff},
   {stShowMon,  evBTN1Pressed, stShowYear, showYear, dotOff},
-  {stShowYear, evBTN1Pressed, stShowTime, showTime, NULL},
+  {stShowYear, evBTN1Pressed, stShowBright, showBright, NULL},
+  {stShowBright, evBTN1Pressed, stShowTime, showTime, NULL},
   /* display wdt */
   {stShowWDay, evDisplayWDT, stShowTime, showTime, NULL},
   {stShowMDay, evDisplayWDT, stShowTime, showTime, NULL},
   {stShowMon,  evDisplayWDT, stShowTime, showTime, NULL},
   {stShowYear, evDisplayWDT, stShowTime, showTime, NULL},
+  {stShowBright, evDisplayWDT, stShowTime, showTime, NULL},
   /* refresh output */
   {stShowTime, evNewSecond,  stNoChange, showTime, NULL},
   {stShowMMSS, evNewSecond,  stNoChange, showMMSS, NULL},
@@ -54,22 +56,17 @@ const table_state_t stateTable[] PROGMEM = {
   /* set time */
   {stShowTime, evBTN1Holded, stSetHH, setTimeBegin, setHHBegin},
   {stShowMMSS, evBTN1Holded, stSetHH, setTimeBegin, setMMBegin},
-
   {stSetHH, evBTN1Pressed, stSetMM, setMMBegin, NULL},
   {stSetMM, evBTN1Pressed, stSetHH, setHHBegin, NULL},
-
   {stSetHH, evNewSecond, stNoChange, setTimeShow, NULL},
   {stSetMM, evNewSecond, stNoChange, setTimeShow, NULL},
-
   {stSetHH, evBTN1Holded, stShowTime, setTimeEnd, showTime},
   {stSetMM, evBTN1Holded, stShowTime, setTimeEnd, showTime},
-
   {stSetHH, evBTN3Pressed, stNoChange, setHHInc, setTimeShow},
   {stSetHH, evBTN2Pressed, stNoChange, setHHDec, setTimeShow},
-
   {stSetMM, evBTN3Pressed, stNoChange, setMMInc, setTimeShow},
   {stSetMM, evBTN2Pressed, stNoChange, setMMDec, setTimeShow},
-  /* edit calendar */
+  /* set calendar */
   {stShowWDay, evBTN3Pressed, stNoChange, incWDay,  showWDay},
   {stShowMDay, evBTN3Pressed, stNoChange, incMDay,  showMDay},
   {stShowMon,  evBTN3Pressed, stNoChange, incMonth, showMonth},
@@ -78,6 +75,9 @@ const table_state_t stateTable[] PROGMEM = {
   {stShowMDay, evBTN2Pressed, stNoChange, decMDay,  showMDay},
   {stShowMon,  evBTN2Pressed, stNoChange, decMonth, showMonth},
   {stShowYear, evBTN2Pressed, stNoChange, decYear,  showYear},
+  /* set bright */
+  {stShowBright, evBTN3Pressed, stNoChange, incBright, showBright},
+  {stShowBright, evBTN2Pressed, stNoChange, decBright, showBright},
   /* обязательная пустая строка таблицы */
   {stNoChange, eventNull, stNoChange, EmptyFunc, EmptyFunc}
 };

+ 71 - 11
src/main.c

@@ -9,7 +9,8 @@
 #include <stdlib.h>
 #include <avr/io.h>
 #include <avr/interrupt.h>
-#include <avr/sleep.h >
+#include <avr/sleep.h>
+#include <avr/eeprom.h>
 
 #include "main.h"
 #include "i2c.h"
@@ -21,7 +22,11 @@
 #define TIMER2_HZ         250
 #define TIMER2_PRESCALER  256
 #define TIMER2_CS         (1<<CS22 | 1<<CS21 | 0<<CS20)
-#define  TIMER2_CNT       (0x100 - (F_CPU / TIMER2_PRESCALER / TIMER2_HZ))
+#define TIMER2_CNT        (0x100 - (F_CPU / TIMER2_PRESCALER / TIMER2_HZ))
+#define OCR2_MIN          (0xFF - TIMER2_CNT)
+#define OCR2_MAX          0xFF
+#define FULL_BRIGHT_ON    0x06
+#define FULL_BRIGHT_OFF   0x22
 
 /* Variables */
 static volatile uint8_t Digit[4] = {1, 2, 3, 4};
@@ -34,7 +39,7 @@ static volatile struct {
   uint8_t blink1:   1;
   uint8_t blink2:   1;
   uint8_t blink3:   1;
-  uint8_t rezerv:   1;
+  uint8_t saveEEP:  1;
 } Flag;
 static btn_t Button[BTN_NUM] = {
   {0, evBTN1Pressed, evBTN1Holded, BUTTON1_PIN},
@@ -42,6 +47,8 @@ static btn_t Button[BTN_NUM] = {
   {0, evBTN3Pressed, evBTN2Pressed, BUTTON3_PIN}
 };
 static volatile uint8_t DISP_WDT = 0;
+static EEMEM uint8_t EEP_Bright;
+static uint8_t Bright;
 
 /* Constants */
 /* Function prototypes */
@@ -64,6 +71,8 @@ void main(void) {
   Flag.blink2 = 0;
   Flag.blink3 = 0;
   Flag.blinkC = 0;
+  Flag.saveEEP = 0;
+  Bright = eeprom_read_byte(&EEP_Bright);
 
   /**
    * Инициализация, настройка...
@@ -92,19 +101,32 @@ void main(void) {
       ES_PlaceEvent(evNewSecond);
 
       RTC_ReadTime(&RTC);
-      if (RTC.Sec == 0 && RTC.Min == 0 && RTC.Hr == 0) {
-        RTC_ReadCalendar(&RTC);
-        ES_PlaceEvent(evRefreshCal);
+      if (RTC.Sec == 0 && RTC.Min == 0) {
+        if (RTC.Hr == 0) {
+          RTC_ReadCalendar(&RTC);
+          ES_PlaceEvent(evRefreshCal);
+        }
+        if (RTC.Hr >= FULL_BRIGHT_ON && RTC.Hr < FULL_BRIGHT_OFF) {
+          OCR2 = OCR2_MAX;
+        } else {
+          OCR2 = Bright;
+        }
       }
 
       if (DISP_WDT != 0) {
         DISP_WDT --;
         if (DISP_WDT == 0) {
           ES_PlaceEvent(evDisplayWDT);
+
           if (Flag.saveCal != 0) {
             Flag.saveCal = 0;
             RTC_WriteCalendar(&RTC);
           }
+
+          if (Flag.saveEEP != 0) {
+            Flag.saveEEP = 0;
+            eeprom_update_byte(&EEP_Bright, Bright);
+          }
         }
       }
     }
@@ -143,7 +165,8 @@ static void Board_Init(void) {
   /* Timer2 - refresh Nixie values */
   TCCR2 = TIMER2_CS;
   TCNT2 = TIMER2_CNT;
-  TIMSK = _BV(TOIE2);
+  TIMSK = _BV(TOIE2) | _BV(OCIE2);
+  OCR2 = Bright;
 
   /* Interrupt from RTC */
   MCUCR = _BV(ISC11); // falling edge
@@ -252,6 +275,14 @@ void showYear(void) {
   Digit[3] = RTC.Year & 0x0F;
 }
 
+void showBright(void) {
+  DISP_WDT = DISP_WDT_TIME;
+  Digit[0] = DIGIT_BLANK;
+  Digit[1] = 0x00;
+  Digit[2] = RTC.Year >> 4;
+  Digit[3] = RTC.Year & 0x0F;
+}
+
 void incWDay(void) {
   if (RTC.WD < 7) {
     RTC.WD ++;
@@ -306,6 +337,26 @@ void decYear(void) {
   Flag.saveCal = 1;
 }
 
+void incBright(void) {
+  if (Bright < 0xFF) {
+    Bright ++;
+  } else {
+    Bright = OCR2_MIN;
+  }
+  OCR2 = Bright;
+  Flag.saveEEP = 1;
+}
+
+void decBright(void) {
+  if (Bright > OCR2_MIN) {
+    Bright --;
+  } else {
+    Bright = 0xFF;
+  }
+  OCR2 = Bright;
+  Flag.saveEEP = 1;
+}
+
 static void blink(void) {
   static uint8_t s = 0;
   switch (s) {
@@ -391,7 +442,6 @@ void setTimeEnd(void) {
   RTC_ReadTime(&RTC);
 }
 
-
 /**
   * @brief  Increase BCD value.
   * @param  : val, max
@@ -436,7 +486,7 @@ ISR (INT1_vect) {
 
 /**
  * @brief Refresh Nixie output
- * @note Digit[] must be in range 0x00 - 0x0F
+ * @note  Digit[] must be in range 0x00 - 0x0F
  */
 ISR(TIMER2_OVF_vect) {
   static uint8_t idx = 0;
@@ -449,8 +499,8 @@ ISR(TIMER2_OVF_vect) {
   uint8_t pc = PORTC & ~DIGIT_PINS;
 
   // power off lamps
-  PORTD = pd;
-  PORTC = pc;
+//  PORTD = pd;
+//  PORTC = pc;
 
   switch (idx) {
   case 0:
@@ -501,6 +551,16 @@ ISR(TIMER2_OVF_vect) {
   }
 }
 
+/**
+ * @brief Power Off Nixie output
+ * @note  For Brightnes dimming
+ */
+ISR(TIMER2_COMP_vect) {
+  // power off lamps
+  PORTD &= ~ANOD_PINS;
+  PORTC &= ~DIGIT_PINS;
+}
+
 /**
  * @brief заглушка для неиспользуемых прерываний
  */