瀏覽代碼

Begin IN-14x6.

Vladimir N. Shilov 4 年之前
父節點
當前提交
409f78345a
共有 21 個文件被更改,包括 405 次插入371 次删除
  1. 4 4
      Makefile
  2. 5 3
      ReadMe.txt
  3. 2 8
      SNC.cbp
  4. 7 0
      flash.cmd
  5. 8 0
      fuse.cmd
  6. 二進制
      hw/cpu-w104.dip
  7. 二進制
      hw/cpu.dch
  8. 二進制
      hw/disp-in4x6.dch
  9. 二進制
      hw/disp-in4x6.dip
  10. 二進制
      hw/disp-in82x4.dch
  11. 二進制
      hw/disp-in82x4.dip
  12. 6 1
      inc/common.h
  13. 1 0
      inc/ds3231.h
  14. 19 25
      inc/event-system.h
  15. 5 13
      inc/list_event.h
  16. 2 0
      inc/main.h
  17. 11 0
      src/ds3231.c
  18. 49 33
      src/event-system.c
  19. 2 2
      src/fuse.c
  20. 9 5
      src/i2c.c
  21. 275 277
      src/main.c

+ 4 - 4
Makefile

@@ -62,7 +62,7 @@ MCU = atmega8a
 #         F_CPU = 16000000
 #         F_CPU = 18432000
 #         F_CPU = 20000000
-F_CPU = 16000000
+F_CPU = 8000000
 
 
 # Output format. (can be srec, ihex, binary)
@@ -117,7 +117,7 @@ ASRC =
 # Optimization level, can be [0, 1, 2, 3, s].
 #     0 = turn off optimization. s = optimize for size.
 #     (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
-OPT = s
+OPT = 2
 
 
 # Debugging format.
@@ -139,7 +139,7 @@ EXTRAINCDIRS = inc
 #     gnu89 = c89 plus GCC extensions
 #     c99   = ISO C99 standard (not yet fully implemented)
 #     gnu99 = c99 plus GCC extensions
-CSTANDARD = -std=gnu99
+CSTANDARD = -std=gnu11
 
 
 # Place -D or -U options here for C sources
@@ -555,7 +555,7 @@ extcoff: $(BINDIR)/$(TARGET).elf
 %.eep: %.elf
 #	@echo
 	@echo $(MSG_EEPROM) $@
-	@-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
+	@-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom='alloc,load' \
 	--change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
 
 # Create extended listing file from ELF output file.

+ 5 - 3
ReadMe.txt

@@ -8,6 +8,8 @@ PWR: MAX771
 
 Начальный исходный код от проекта "My Nixie Clock IN-12".
 =====
-2020.01.12
-Поправил под схему на 6 индикаторов.
-Идут 2 секунды и виснут...
+2020.12.28
+
+Слил исходники от версии "ИН-4*6".
+Особенность данной платы - не запускались кварцы,
+работает от внутренних 8МГц.

+ 2 - 8
SNC.cbp

@@ -29,9 +29,6 @@
 					<Add option="-g" />
 					<Add option="-std=gnu99" />
 				</Compiler>
-				<Environment>
-					<Variable name="USE_DHT" value="1" />
-				</Environment>
 			</Target>
 			<Target title="Release">
 				<Option output="build/SNC.elf" prefix_auto="1" extension_auto="0" />
@@ -54,8 +51,8 @@
 			</Target>
 			<Environment>
 				<Variable name="MCU" value="atmega8" />
-				<Variable name="USE_DHT" value="1" />
-				<Variable name="USE_UART" value="1" />
+				<Variable name="USE_BRIGHT_CONTROL" value="1" />
+				<Variable name="USE_UART" value="0" />
 			</Environment>
 		</Build>
 		<Compiler>
@@ -435,9 +432,6 @@
 			<Option compilerVar="CC" />
 		</Unit>
 		<Extensions>
-			<code_completion />
-			<envvars />
-			<debugger />
 			<lib_finder disable_auto="1" />
 		</Extensions>
 	</Project>

+ 7 - 0
flash.cmd

@@ -0,0 +1,7 @@
+@echo off
+
+SET AVRDUDE=D:\Program\avrdude\avrdude.exe -C D:\Program\avrdude\avrdude.conf
+SET MCU=m8
+
+%AVRDUDE% -p %MCU% -c usbasp -U flash:w:build\snc.hex:a
+rem -U eeprom:w:build\snc.eep:a

+ 8 - 0
fuse.cmd

@@ -0,0 +1,8 @@
+@echo off
+
+SET AVRDUDE=D:\Program\avrdude\avrdude.exe -C D:\Program\avrdude\avrdude.conf
+SET MCU=m8
+
+# 0x24 0xD1 -- internal 8Mhz, Brouwn detector, preserve eeprom
+# 0x3F 0xC1 -- ext hi speed q, Brouwn detector, preserve eeprom
+%AVRDUDE% -p %MCU% -c usbasp -U lfuse:w:0x3E:m -U hfuse:w:0xC9:m

二進制
hw/cpu-w104.dip


二進制
hw/cpu.dch


二進制
hw/disp-in4x6.dch


二進制
hw/disp-in4x6.dip


二進制
hw/disp-in82x4.dch


二進制
hw/disp-in82x4.dip


+ 6 - 1
inc/common.h

@@ -5,8 +5,13 @@
 /**
  * Global defines
  */
-//#define USE_BRIGHT_CONTROL
+#ifndef F_CPU
+  #define F_CPU               16000000
+#endif // F_CPU
+
+#define USE_BRIGHT_CONTROL  1
 //#define USE_DHT
 //#define USE_UART
+//#define LAMP_TEST  1
 
 #endif /* _COMMON_H */

+ 1 - 0
inc/ds3231.h

@@ -89,6 +89,7 @@ void RTC_ReadCalendar(rtc_t * data);
 
 void RTC_WriteAll(rtc_t * data);
 void RTC_WriteTime(rtc_t * data);
+void RTC_WriteHH(rtc_t * data);
 void RTC_WriteHHMM(rtc_t * data);
 void RTC_WriteCalendar(rtc_t * data);
 

+ 19 - 25
inc/event-system.h

@@ -31,12 +31,10 @@ void ES_Dispatch(es_event_t event);     /* вызов диспетчера */
  * ES function prototypes
  */
 void dotOnPersistent(void);
+void dotOn(void);
 void dotOff(void);
 void showTime(void);
-void showMMSS(void);
-void showWDay(void);
-void showMDay(void);
-void showMonth(void);
+void showWDM(void);
 void showYear(void);
 
 #ifdef USE_BRIGHT_CONTROL
@@ -45,27 +43,6 @@ void incBright(void);
 void decBright(void);
 #endif
 
-#ifdef USE_DHT
-void showTemperature(void);
-void showHumidity(void);
-#endif // USE_DHT
-
-void incHH(void);
-void incMM(void);
-void incSS(void);
-void decHH(void);
-void decMM(void);
-void decSS(void);
-
-void incWDay(void);
-void incMDay(void);
-void incMonth(void);
-void incYear(void);
-void decWDay(void);
-void decMDay(void);
-void decMonth(void);
-void decYear(void);
-
 void setTimeShow(void);
 void setTimeBegin(void);
 void setHHBegin(void);
@@ -76,4 +53,21 @@ void setMMInc(void);
 void setMMDec(void);
 void setTimeEnd(void);
 
+void setDateBegin(void);
+void setDateEnd(void);
+void setWDMShow(void);
+void setYearShow(void);
+void setWDayBegin(void);
+void setMDayBegin(void);
+void setMonthBegin(void);
+void setYearBegin(void);
+void setIncWDay(void);
+void setIncMDay(void);
+void setIncMonth(void);
+void setIncYear(void);
+void setDecWDay(void);
+void setDecMDay(void);
+void setDecMonth(void);
+void setDecYear(void);
+
 #endif /* EVENT_SYSTEM_H */

+ 5 - 13
inc/list_event.h

@@ -13,11 +13,6 @@ typedef enum {
   evBTN2Holded,
   evBTN3Holded,
   evRefreshCal,
-#ifdef USE_DHT
-  evShTime,
-  evShTemp,
-  evShHum,
-#endif // USE_DHT
   evDisplayWDT
 } es_event_t;
 
@@ -25,20 +20,17 @@ typedef enum {
 typedef enum {
   stNoChange = 0x00,
   stShowTime,
-  stShowMMSS,
-  stShowWDay,
-  stShowMDay,
-  stShowMon,
+  stShowWDM,
   stShowYear,
 #ifdef USE_BRIGHT_CONTROL
   stShowBright,
 #endif // USE_BRIGHT_CONTROL
-#ifdef USE_DHT
-  stShowTemperature,
-  stShowHumidity,
-#endif // USE_DHT
   stSetHH,
   stSetMM,
+  stSetWDay,
+  stSetMDay,
+  stSetMon,
+  stSetYear,
   /* end */
   stLastState
 } es_state_t;

+ 2 - 0
inc/main.h

@@ -23,6 +23,8 @@
 /**
  * Дефайны
  */
+#define LAMP_NUM          6
+
 /* Port B, puttons, input, pull-up */
 #define DHT_PIN            _BV(PB0)
 #define DHT_PIN_LOW        DDRB |= DHT_PIN

+ 11 - 0
src/ds3231.c

@@ -98,6 +98,17 @@ void RTC_WriteTime(rtc_t * data) {
   I2C_Stop();
 }
 
+/**
+ * @brief Запись часов
+ */
+void RTC_WriteHH(rtc_t * data) {
+  I2C_Start();
+  I2C_WriteByte(DS3231_I2C_WRADDR);
+  I2C_WriteByte(DS3231_TIME_CAL_ADDR + 2);
+  I2C_WriteByte(data->Hr);
+  I2C_Stop();
+}
+
 /**
  * @brief Запись часов и минут
  */

+ 49 - 33
src/event-system.c

@@ -32,61 +32,77 @@ typedef struct {
 const table_state_t stateTable[] PROGMEM = {
 /* STATE    EVENT   NEXT STATE  STATE_FUNC1 STATE_FUNC2 */
   /* show date, time */
-  {stShowTime, evBTN1Pressed, stShowMMSS, dotOnPersistent, showMMSS},
-  {stShowMMSS, evBTN1Pressed, stShowWDay, showWDay,        dotOff},
-  {stShowWDay, evBTN1Pressed, stShowMDay, showMDay,        dotOff},
-  {stShowMDay, evBTN1Pressed, stShowMon,  showMonth,       dotOff},
-  {stShowMon,  evBTN1Pressed, stShowYear, showYear,        dotOff},
+  {stShowTime, evBTN1Pressed, stShowWDM, showWDM,  dotOn},
+  {stShowWDM, evBTN1Pressed, stShowYear, showYear, dotOff},
 #ifdef USE_BRIGHT_CONTROL
   {stShowYear,   evBTN1Pressed, stShowBright, showBright, NULL},
   {stShowBright, evBTN1Pressed, stShowTime,   showTime,   NULL},
 #else
   {stShowYear, evBTN1Pressed, stShowTime, showTime, NULL},
 #endif
-#ifdef USE_DHT
-  {stShowTime,        evShTemp,      stShowTemperature,  dotOnPersistent, showTemperature},
-  {stShowTemperature, evShHum,       stShowHumidity,     showHumidity,    NULL},
-  {stShowHumidity,    evShTime,      stShowTime,         showTime,        NULL},
-  {stShowTemperature, evBTN1Pressed, stShowTime,         showTime,        NULL},
-  {stShowHumidity,    evBTN1Pressed, stShowTemperature,  dotOnPersistent, showTemperature},
-#endif // USE_DHT
   /* display wdt */
-  {stShowWDay,   evDisplayWDT, stShowTime, showTime, NULL},
-  {stShowMDay,   evDisplayWDT, stShowTime, showTime, NULL},
-  {stShowMon,    evDisplayWDT, stShowTime, showTime, NULL},
-  {stShowYear,   evDisplayWDT, stShowTime, showTime, NULL},
+  {stShowWDM,  evDisplayWDT, stShowTime, showTime, NULL},
+  {stShowYear, evDisplayWDT, stShowTime, showTime, NULL},
 #ifdef USE_BRIGHT_CONTROL
   {stShowBright, evDisplayWDT, stShowTime, showTime, NULL},
 #endif
+
   /* refresh output */
-  {stShowTime, evNewSecond,  stNoChange, showTime,  NULL},
-  {stShowMMSS, evNewSecond,  stNoChange, showMMSS,  NULL},
-  {stShowWDay, evRefreshCal, stNoChange, showWDay,  NULL},
-  {stShowMDay, evRefreshCal, stNoChange, showMDay,  NULL},
-  {stShowMon,  evRefreshCal, stNoChange, showMonth, NULL},
-  {stShowYear, evRefreshCal, stNoChange, showYear,  NULL},
+  {stShowTime, evNewSecond,  stNoChange, showTime, NULL},
+  {stShowWDM,  evRefreshCal, stNoChange, showWDM,  NULL},
+  {stShowYear, evRefreshCal, stNoChange, showYear, NULL},
+
   /* 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,    evBTN1Pressed, stSetMM,    setMMBegin,   NULL},
+  {stSetMM,    evBTN1Pressed, stSetHH,    setHHBegin,   NULL},
   {stSetHH,    evBTN3Pressed, stNoChange, setHHInc,     setTimeShow},
   {stSetHH,    evBTN2Pressed, stNoChange, setHHDec,     setTimeShow},
   {stSetMM,    evBTN3Pressed, stNoChange, setMMInc,     setTimeShow},
   {stSetMM,    evBTN2Pressed, stNoChange, setMMDec,     setTimeShow},
+
+  {stSetHH,    evNewSecond,   stNoChange, setTimeShow,  NULL},
+  {stSetMM,    evNewSecond,   stNoChange, setTimeShow,  NULL},
+
+  {stSetHH,    evDisplayWDT,  stShowTime, showTime,     NULL},
+  {stSetMM,    evDisplayWDT,  stShowTime, showTime,     NULL},
+
   /* set calendar */
-  {stShowWDay, evBTN3Pressed, stNoChange, incWDay,  showWDay},
-  {stShowMDay, evBTN3Pressed, stNoChange, incMDay,  showMDay},
-  {stShowMon,  evBTN3Pressed, stNoChange, incMonth, showMonth},
+  {stShowWDM, evBTN1Holded,  stSetWDay, setDateBegin, setWDayBegin},
+  {stSetWDay, evBTN1Holded,  stShowWDM, setDateEnd,   showWDM},
+  {stSetMDay, evBTN1Holded,  stShowWDM, setDateEnd,   showWDM},
+  {stSetMon,  evBTN1Holded,  stShowWDM, setDateEnd,   showWDM},
+  {stSetWDay, evBTN1Pressed, stSetMDay, setMDayBegin, NULL},
+  {stSetMDay, evBTN1Pressed, stSetMon,  setMonthBegin, NULL},
+  {stSetMon,  evBTN1Pressed, stSetWDay, setWDayBegin, NULL},
+  {stSetWDay, evBTN2Pressed, stNoChange, setDecWDay,  setWDMShow},
+  {stSetWDay, evBTN3Pressed, stNoChange, setIncWDay,  setWDMShow},
+  {stSetMDay, evBTN2Pressed, stNoChange, setDecMDay,  setWDMShow},
+  {stSetMDay, evBTN3Pressed, stNoChange, setIncMDay,  setWDMShow},
+  {stSetMon,  evBTN2Pressed, stNoChange, setDecMonth, setWDMShow},
+  {stSetMon,  evBTN3Pressed, stNoChange, setIncMonth, setWDMShow},
+
+  {stShowYear, evBTN1Holded,  stSetYear,  setDateBegin, setYearBegin},
+  {stSetYear,  evBTN1Holded,  stShowYear, setDateEnd,   showYear},
+  {stSetYear,  evBTN2Pressed, stNoChange, setDecYear,   setYearShow},
+  {stSetYear,  evBTN3Pressed, stNoChange, setIncYear,   setYearShow},
+
+  {stSetWDay, evDisplayWDT, stShowTime, showTime, NULL},
+  {stSetMDay, evDisplayWDT, stShowTime, showTime, NULL},
+  {stSetMon,  evDisplayWDT, stShowTime, showTime, NULL},
+  {stSetYear, evDisplayWDT, stShowTime, showTime, NULL},
+  /*
+  {stShowWDay, evBTN3Pressed, stNoChange, incWDay,  showWDM},
+  {stShowMDay, evBTN3Pressed, stNoChange, incMDay,  showWDM},
+  {stShowMon,  evBTN3Pressed, stNoChange, incMonth, showWDM},
   {stShowYear, evBTN3Pressed, stNoChange, incYear,  showYear},
-  {stShowWDay, evBTN2Pressed, stNoChange, decWDay,  showWDay},
-  {stShowMDay, evBTN2Pressed, stNoChange, decMDay,  showMDay},
-  {stShowMon,  evBTN2Pressed, stNoChange, decMonth, showMonth},
+  {stShowWDay, evBTN2Pressed, stNoChange, decWDay,  showWDM},
+  {stShowMDay, evBTN2Pressed, stNoChange, decMDay,  showWDM},
+  {stShowMon,  evBTN2Pressed, stNoChange, decMonth, showWDM},
   {stShowYear, evBTN2Pressed, stNoChange, decYear,  showYear},
+  */
   #ifdef USE_BRIGHT_CONTROL
   /* set bright */
   {stShowBright, evBTN3Pressed, stNoChange, incBright, showBright},

+ 2 - 2
src/fuse.c

@@ -5,6 +5,6 @@
  */
 
 FUSES = {
-    .low = 0x3E,
-    .high = 0xC9
+    .low = 0x24,
+    .high = 0xD1
 };

+ 9 - 5
src/i2c.c

@@ -11,15 +11,19 @@ COPYRIGHT (C) 2008-2009 EXTREME ELECTRONICS INDIA
 #include "i2c.h"
 
 /* Private defines */
-// twi_br must be 3
-#define TWI_SPEED       400000UL
-#define TWI_PRESCALER   4
-#define TWI_BR          ((F_CPU / TWI_SPEED) - 16) / (2 * TWI_PRESCALER)
 #define TWPS_1          ((0<<TWPS1) | (0<<TWPS0))
 #define TWPS_4          ((0<<TWPS1) | (1<<TWPS0))
 #define TWPS_16         ((1<<TWPS1) | (0<<TWPS0))
 #define TWPS_64         ((1<<TWPS1) | (1<<TWPS0))
-#define TWI_PS          TWPS_4
+#define TWI_SPEED       400000UL
+#if (F_CPU == 16000000)
+  #define TWI_PRESCALER   4
+  #define TWI_PS          TWPS_4
+#elif (F_CPU == 8000000)
+  #define TWI_PRESCALER   1
+  #define TWI_PS          TWPS_1
+#endif // F_CPU
+#define TWI_BR          ((F_CPU / TWI_SPEED) - 16) / (2 * TWI_PRESCALER)
 
 #define TWI_WDT_TIMEOUT 10
 

+ 275 - 277
src/main.c

@@ -18,14 +18,19 @@
 #include "ds3231.h"
 #include "rtos.h"
 #include "event-system.h"
-#include "common.h"
 #include "main.h"
+#include "common.h"
 
 /* Defines */
 /* Timer2 settings */
-#define TIMER2_HZ         400
-#define TIMER2_PRESCALER  1024
-#define TIMER2_CS         (1<<CS22 | 1<<CS21 | 1<<CS20)
+#define TIMER2_HZ         600
+#if F_CPU == 16000000
+  #define TIMER2_PRESCALER  256
+  #define TIMER2_CS         (1<<CS22 | 0<<CS21 | 0<<CS20)
+#elif F_CPU == 8000000
+  #define TIMER2_PRESCALER  64
+  #define TIMER2_CS         (0<<CS22 | 1<<CS21 | 1<<CS20)
+#endif // F_CPU
 #define TIMER2_CNT        (0x100 - (F_CPU / TIMER2_PRESCALER / TIMER2_HZ))
 
 /* Display timeout, sec */
@@ -41,38 +46,34 @@
 #endif // USE_UART
 
 #ifdef USE_BRIGHT_CONTROL
+//static void startADC(void);
+//volatile uint8_t resultADC = 0;
 /* Lamp brightness */
 #define BRIGHT_IDX_MAX    4
+#define LIGHT_LEVEL       100
 #define FULL_BRIGHT_ON    0x06
 #define FULL_BRIGHT_OFF   0x22
 static const uint8_t PROGMEM brightConv[BRIGHT_IDX_MAX+1] = {
-  218, 225, 230, 240, 255
+#if F_CPU == 16000000
+  155, 164, 181, 211, 255
+#elif F_CPU == 8000000
+	54, 71, 106, 165, 255
+#endif // F_CPU
 };
 #endif // USE_BRIGHT_CONTROL
 
-#ifdef USE_DHT
-// timeout in timer tiks, step 4 mks
-#define DHT_TIMEOUT       1500
-#define DHT_TOUT1         55
-static struct {
-  uint8_t Humidity;
-  uint16_t Temperature;
-} dhtData;
-#endif // USE_DHT
-
 
 /* Variables */
-static volatile uint8_t Digit[6] = {7, 7, 7, 7, 7, 7};
+static volatile uint8_t Digit[LAMP_NUM] = {1, 2, 3, 4, 5, 6};
 static rtc_t RTC, setRTC;
 static volatile struct {
   uint8_t RTC_Int:  1;
-  uint8_t saveCal:  1;
   uint8_t blinkC:   1; // флаг задающий ритм мигания
   uint8_t blink0:   1; // мигать разрядами 1-2
   uint8_t blink1:   1; // мигать разрядами 3-4
   uint8_t blink2:   1; // мигать разрядами 5-6
-  uint8_t rezerv:   1;
   uint8_t saveEEP:  1;
+  uint8_t rezerv:   2;
 } Flag;
 static btn_t Button[BTN_NUM] = {
   {0, evBTN1Pressed, evBTN1Holded, BUTTON1_PIN},
@@ -86,19 +87,14 @@ static EEMEM uint8_t EEP_SummerTime;
 
 /* Function prototypes */
 static void Board_Init(void);
-static void dotOn(void);
 static void btnProcess(void);
 static void valIncrease(uint8_t * val, uint8_t max);
 static void valDecrease(uint8_t * val, uint8_t max);
 static void blink(void);
 static void setSummerWinterTime(void);
-#ifdef USE_DHT
-static void dhtStart(void);
-static void dhtProcess(void);
-static void dhtEnd(void);
-static void dhtTimeout(void);
-static void dhtNoAck(void);
-#endif // USE_DHT
+#ifdef LAMP_TEST
+static void lampTest(void);
+#endif // LAMP_TEST
 #ifdef USE_UART
 void usart_putc (char send);
 void usart_puts (const char *send);
@@ -110,7 +106,6 @@ void main(void) {
    */
   uint8_t event = 0;
   Flag.RTC_Int = 0;
-  Flag.saveCal = 0;
   Flag.blink0 = 0;
   Flag.blink1 = 0;
   Flag.blink2 = 0;
@@ -131,6 +126,12 @@ void main(void) {
 
   /* Initialize Scheduler */
   RTOS_Init();
+  tdelay_ms(2000);
+
+#ifdef LAMP_TEST
+  lampTest();
+  tdelay_ms(5000);
+#endif // LAMP_TEST
 
   /* Initialize I2C Bus and RTC */
   I2C_Init();
@@ -140,28 +141,13 @@ void main(void) {
   /* Initialize Event State Machine */
   ES_Init(stShowTime);
 
+  RTOS_SetTask(btnProcess, 3, BTN_SCAN_PERIOD);
+#ifdef USE_BRIGHT_CONTROL
+//  RTOS_SetTask(startADC, 10, 500);
+#endif // USE_BRIGHT_CONTROL
+
   showTime();
 
-  RTOS_SetTask(btnProcess, 3, BTN_SCAN_PERIOD);
-#ifdef USE_DHT
-  RTOS_SetTask(dhtStart, 2000, 15000);
-#endif // USE_DHT
-
-    uint8_t i;
-    for (i=0;i<10;i++) {
-      Digit[0] = i;
-      tdelay_ms(50);
-      Digit[1] = i;
-      tdelay_ms(50);
-      Digit[2] = i;
-      tdelay_ms(50);
-      Digit[3] = i;
-      tdelay_ms(50);
-      Digit[4] = i;
-      tdelay_ms(50);
-      Digit[5] = i;
-      tdelay_ms(50);
-    }
   /** main loop */
   do {
     /* new second interrupt from RTC */
@@ -171,13 +157,15 @@ void main(void) {
 
       RTC_ReadTime(&RTC);
       if (RTC.Sec == 0 && RTC.Min == 0) {
-        // begin of new hour
+      // begin of new hour
         if (RTC.Hr == 0) {
+        // begin of new day
           RTC_ReadCalendar(&RTC);
           ES_PlaceEvent(evRefreshCal);
         }
 #ifdef USE_BRIGHT_CONTROL
         if (RTC.Hr >= FULL_BRIGHT_ON && RTC.Hr < FULL_BRIGHT_OFF) {
+//        if (resultADC < LIGHT_LEVEL) {
           OCR2 = pgm_read_byte(&brightConv[BRIGHT_IDX_MAX]);
         } else {
           OCR2 = pgm_read_byte(&brightConv[brightIdx]);
@@ -192,35 +180,12 @@ void main(void) {
         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_BrightIdx, brightIdx);
           }
         }
       }
-#ifdef USE_DHT
-      switch(RTC.Sec) {
-      case 0x20:
-      case 0x50:
-        ES_PlaceEvent(evShTemp);
-        break;
-
-      case 0x22:
-      case 0x52:
-        ES_PlaceEvent(evShHum);
-        break;
-
-      case 0x24:
-      case 0x54:
-        ES_PlaceEvent(evShTime);
-        break;
-      }
-#endif // USE_DHT
     } // End of New Second
 
     event = ES_GetEvent();
@@ -255,17 +220,16 @@ static void Board_Init(void) {
   DDRC = DIGIT_PINS; // as output
   DDRD = (DOT_PIN | ANODD_PINS); // as output
 
-#ifdef USE_DHT
-  /* Timer1, IC negative edge, CTC mode, 64 prescaler, 4 mks one tick */
-  TCCR1B = ((0<<ICES1) | (1<<CS11) | (1<<CS10));
-#endif // USE_DHT
-
   /* Timer2 - refresh Nixie values */
   TCCR2 = TIMER2_CS;
   TCNT2 = TIMER2_CNT;
   TIMSK = _BV(TOIE2);
 
 #ifdef USE_BRIGHT_CONTROL
+  /* ADC init */
+//  ADMUX = (1<<REFS0 | 1<<ADLAR | 1<<MUX2 | 1<<MUX1 | 1<<MUX0); // Vref = AVcc, channel ADC7, Left adjusted result
+//  ADCSRA = (1<<ADEN | 1<<ADSC | 1<<ADIE | 1<<ADPS2 | 1<<ADPS1 | 1<<ADPS0); // enable ADC, prescaler = 128
+
   OCR2 = pgm_read_byte(&brightConv[BRIGHT_IDX_MAX]);
   TIMSK |= _BV(OCIE2);
 #endif // USE_BRIGHT_CONTROL
@@ -299,8 +263,9 @@ static void setSummerWinterTime(void) {
   if ((RTC.Mon == 3) && (RTC.WD == 7) && (RTC.Hr == 3) && (sunTime != 0)) {
     if ((RTC.Day + 7) > 31) {
       RTC.Hr = 4;
-      RTC_WriteHHMM(&RTC);
+      RTC_WriteHH(&RTC);
       sunTime = 0;
+      eeprom_update_byte(&EEP_SummerTime, sunTime);
     }
   }
 
@@ -308,15 +273,15 @@ static void setSummerWinterTime(void) {
   if ((RTC.Mon == 10) && (RTC.WD == 7) && (RTC.Hr == 4) && (sunTime == 0)) {
     if ((RTC.Day + 7) > 31) {
       RTC.Hr = 3;
-      RTC_WriteHHMM(&RTC);
+      RTC_WriteHH(&RTC);
       sunTime = 1;
+      eeprom_update_byte(&EEP_SummerTime, sunTime);
     }
   }
 
-  eeprom_update_byte(&EEP_SummerTime, sunTime);
 }
 
-static void dotOn(void) {
+void dotOn(void) {
   PORTD |= DOT_PIN;
 }
 
@@ -326,119 +291,9 @@ void dotOff(void) {
 
 void dotOnPersistent(void) {
   RTOS_DeleteTask(dotOff);
-  PORTD |= DOT_PIN;
-}
-
-#ifdef USE_DHT
-static void dhtStart(void) {
-  RTOS_SetTask(dhtProcess, 2, 0);
-  DHT_PIN_LOW;
-}
-
-static void dhtProcess(void) {
-  uint8_t cnt1, cnt2, buf;
-  uint16_t tcnt_old, hmdt, tmprtr;
-
-  DHT_PIN_INPUT;
-  TCNT1 = 0;
-
-  // ждём первого "0"
-  while(bit_is_set(PINB, PB0) && TCNT1<DHT_TOUT1);
-  if (TCNT1 >= DHT_TOUT1) {
-    RTOS_SetTask(dhtNoAck, 0, 0);
-    return;
-  }
-  // white for end of preamble
-  while(bit_is_clear(PINB, PB0));
-  while(bit_is_set(PINB, PB0) && TCNT1<DHT_TIMEOUT);
-  if (TCNT1 >= DHT_TIMEOUT) {
-    RTOS_SetTask(dhtTimeout, 0, 0);
-  }
-  hmdt = 0; tmprtr = 0;
-  for (cnt1=0; cnt1<32; cnt1+=8) { // 0 8 16 24 32
-    buf = 0;
-    for (cnt2=0; cnt2<8; cnt2++) {
-      buf <<= 1;
-      // "0", начало периода
-      while(bit_is_clear(PINB, PB0)); // ждём начало импульса
-      tcnt_old = TCNT1; // начало импульса
-      while(bit_is_set(PINB, PB0) && TCNT1<DHT_TIMEOUT); // ждём конец импульса
-      if ((TCNT1 - tcnt_old) > 10) {
-        buf |= 1;
-      }
-    }
-    switch (cnt1) {
-    case 0:
-      hmdt = buf << 8;
-      break;
-    case 8:
-      hmdt |= buf;
-      break;
-    case 16:
-      tmprtr = buf << 8;
-      break;
-    case 24:
-      tmprtr |= buf;
-      break;
-    }
-  }
-  if (TCNT1 >= DHT_TIMEOUT) {
-    RTOS_SetTask(dhtTimeout, 0, 0);
-    return;
-  }
-
-  dhtData.Humidity = (uint8_t)((hmdt + 5) / 10);
-  dhtData.Temperature = tmprtr;
-
-  RTOS_SetTask(dhtEnd, 0, 0);
-}
-
-static void dhtEnd(void) {
-#ifdef USE_UART
-  char buffer[6];
-
-  usart_puts("Humidity: ");
-  itoa(dhtData.Humidity, buffer, 10);
-  usart_puts(buffer);
-  usart_puts(" %\t\t");
-
-  usart_puts("Temperature: ");
-  itoa(dhtData.Temperature/10, buffer, 10);
-  usart_puts(buffer);
-  usart_putc('.');
-  itoa(dhtData.Temperature%10, buffer, 10);
-  usart_puts(buffer);
-  usart_puts("oC\r\n");
-#endif // USE_UART
-}
-
-static void dhtNoAck(void) {
-#ifdef USE_UART
-  usart_puts("DHT22 no ACK occurred.\r\n");
-#endif // USE_UART
-}
-
-static void dhtTimeout(void) {
-#ifdef USE_UART
-  usart_puts("DHT22 Timeout occurred.\r\n");
-#endif // USE_UART
-}
-
-void showTemperature(void) {
-  uint8_t a = dhtData.Temperature / 10;
-  uint8_t b = dhtData.Temperature % 10;
-  Digit[0] = a / 10;
-  Digit[1] = a % 10;
-  Digit[2] = b;
-  Digit[3] = DIGIT_BLANK;
+  dotOn();
 }
 
-void showHumidity(void) {
-  Digit[0] = DIGIT_BLANK;
-  Digit[1] = DIGIT_BLANK;
-  Digit[2] = dhtData.Humidity / 10;
-  Digit[3] = dhtData.Humidity % 10;}
-#endif // USE_DHT
 
 /**
   * @brief  Обработка кнопок.
@@ -474,6 +329,14 @@ static void btnProcess(void) {
 }
 
 void showTime(void) {
+/*
+  Digit[0] = DIGIT_BLANK;
+  Digit[1] = DIGIT_BLANK;
+  Digit[2] = DIGIT_BLANK;
+  Digit[3] = resultADC / 100;
+  Digit[4] = (resultADC % 100) / 10;
+  Digit[5] = resultADC % 10;
+*/
   dotOn();
   RTOS_SetTask(dotOff, 500, 0);
 
@@ -489,106 +352,38 @@ void showTime(void) {
   Digit[5] = RTC.Sec & 0x0F;
 }
 
-void showMMSS(void) {
-  Digit[0] = RTC.Min >> 4;
-  Digit[1] = RTC.Min & 0x0F;
-  Digit[2] = RTC.Sec >> 4;
-  Digit[3] = RTC.Sec & 0x0F;
-}
-
-void showWDay(void) {
-  DISP_WDT = DISP_WDT_TIME;
-  Digit[0] = DIGIT_BLANK;
-  Digit[1] = DIGIT_BLANK;
-  Digit[2] = RTC.WD & 0x0F;
-  Digit[3] = DIGIT_BLANK;
-}
-
-void showMDay(void) {
+void showWDM(void) {
   DISP_WDT = DISP_WDT_TIME;
-  Digit[0] = RTC.Day >> 4;
-  Digit[1] = RTC.Day & 0x0F;
-  Digit[2] = DIGIT_BLANK;
-  Digit[3] = DIGIT_BLANK;
-}
 
-void showMonth(void) {
-  DISP_WDT = DISP_WDT_TIME;
-  Digit[0] = DIGIT_BLANK;
+  Digit[0] = RTC.WD & 0x0F;
   Digit[1] = DIGIT_BLANK;
-  Digit[2] = RTC.Mon >> 4;
-  Digit[3] = RTC.Mon & 0x0F;
+  Digit[2] = RTC.Day >> 4;
+  Digit[3] = RTC.Day & 0x0F;
+  Digit[4] = RTC.Mon >> 4;
+  Digit[5] = RTC.Mon & 0x0F;
 }
 
 void showYear(void) {
   DISP_WDT = DISP_WDT_TIME;
-  Digit[0] = 0x02;
-  Digit[1] = 0x00;
-  Digit[2] = RTC.Year >> 4;
-  Digit[3] = RTC.Year & 0x0F;
-}
-
-void incWDay(void) {
-  if (RTC.WD < 7) {
-    RTC.WD ++;
-  } else {
-    RTC.WD = 1;
-  }
-  Flag.saveCal = 1;
-}
-
-void decWDay(void) {
-  if (RTC.WD > 1) {
-    RTC.WD --;
-  } else {
-    RTC.WD = 7;
-  }
-  Flag.saveCal = 1;
-}
-
-void incMDay(void) {
-  valIncrease(&RTC.Day, 31);
-  Flag.saveCal = 1;
-}
-
-void decMDay(void) {
-  valDecrease(&RTC.Day, 31);
-  Flag.saveCal = 1;
-}
-
-void incMonth(void) {
-  valIncrease(&RTC.Mon, 12);
-  if (RTC.Mon == 0) {
-    RTC.Mon = 1;
-  }
-  Flag.saveCal = 1;
-}
-
-void decMonth(void) {
-  valDecrease(&RTC.Mon, 12);
-  if (RTC.Mon == 0) {
-    RTC.Mon = 0x12;
-  }
-  Flag.saveCal = 1;
-}
-
-void incYear(void) {
-  valIncrease(&RTC.Year, 99);
-  Flag.saveCal = 1;
-}
 
-void decYear(void) {
-  valDecrease(&RTC.Year, 99);
-  Flag.saveCal = 1;
+  Digit[0] = DIGIT_BLANK;
+  Digit[1] = DIGIT_BLANK;
+  Digit[2] = 0x02;
+  Digit[3] = 0x00;
+  Digit[4] = RTC.Year >> 4;
+  Digit[5] = RTC.Year & 0x0F;
 }
 
 #ifdef USE_BRIGHT_CONTROL
 void showBright(void) {
   DISP_WDT = DISP_WDT_TIME;
+
   Digit[0] = DIGIT_BLANK;
   Digit[1] = DIGIT_BLANK;
-  Digit[2] = brightIdx;
-  Digit[3] = DIGIT_BLANK;
+  Digit[2] = DIGIT_BLANK;
+  Digit[3] = brightIdx;
+  Digit[4] = DIGIT_BLANK;
+  Digit[5] = DIGIT_BLANK;
 }
 
 void incBright(void) {
@@ -606,6 +401,11 @@ void decBright(void) {
     Flag.saveEEP = 1;
   }
 }
+/*
+static void startADC(void) {
+  // enable interrupt and start conversion
+  ADCSRA |= ((1<<ADSC) | (1<<ADIE));
+}*/
 #endif // USE_BRIGHT_CONTROL
 
 static void blink(void) {
@@ -629,13 +429,16 @@ static void blink(void) {
 }
 
 void setTimeShow(void) {
-  dotOn();
+  DISP_WDT = DISP_WDT_TIME;
+  dotOnPersistent();
   RTOS_SetTask(dotOff, 500, 0);
 
   Digit[0] = setRTC.Hr >> 4;
   Digit[1] = setRTC.Hr & 0x0F;
   Digit[2] = setRTC.Min >> 4;
   Digit[3] = setRTC.Min & 0x0F;
+  Digit[4] = 0x0;
+  Digit[5] = 0x0;
 }
 
 void setTimeBegin(void) {
@@ -690,6 +493,136 @@ void setTimeEnd(void) {
   RTC_ReadTime(&RTC);
 }
 
+/**
+  * Setup Calendar functions
+  */
+void setDateBegin(void) {
+  RTC_ReadCalendar(&setRTC);
+  RTOS_SetTask(btnProcess, 500, BTN_SCAN_PERIOD);
+}
+
+void setDateEnd(void) {
+  RTOS_SetTask(btnProcess, 500, BTN_SCAN_PERIOD);
+
+  RTC_WriteCalendar(&setRTC);
+
+  Flag.blink0 = 0;
+  Flag.blink1 = 0;
+  Flag.blink2 = 0;
+  Flag.blinkC = 0;
+
+  RTC_ReadCalendar(&RTC);
+  dotOff();
+}
+
+void setWDMShow(void) {
+  DISP_WDT = DISP_WDT_TIME;
+  dotOnPersistent();
+
+  Digit[0] = setRTC.WD & 0x0F;
+  Digit[1] = DIGIT_BLANK;
+  Digit[2] = setRTC.Day >> 4;
+  Digit[3] = setRTC.Day & 0x0F;
+  Digit[4] = setRTC.Mon >> 4;
+  Digit[5] = setRTC.Mon & 0x0F;
+}
+
+void setYearShow(void) {
+  DISP_WDT = DISP_WDT_TIME;
+  dotOff();
+
+  Digit[0] = DIGIT_BLANK;
+  Digit[1] = DIGIT_BLANK;
+  Digit[2] = 0x02;
+  Digit[3] = 0x00;
+  Digit[4] = setRTC.Year >> 4;
+  Digit[5] = setRTC.Year & 0x0F;
+}
+
+void setWDayBegin(void) {
+  Flag.blink0 = 1;
+  Flag.blink1 = 0;
+  Flag.blink2 = 0;
+  RTOS_SetTask(blink, 0, 0);
+  setWDMShow();
+}
+
+void setMDayBegin(void) {
+  Flag.blink0 = 0;
+  Flag.blink1 = 1;
+  Flag.blink2 = 0;
+  RTOS_SetTask(blink, 0, 0);
+  setWDMShow();
+}
+
+void setMonthBegin(void) {
+  Flag.blink0 = 0;
+  Flag.blink1 = 0;
+  Flag.blink2 = 1;
+  RTOS_SetTask(blink, 0, 0);
+  setWDMShow();
+}
+
+void setYearBegin(void) {
+  Flag.blink0 = 0;
+  Flag.blink1 = 0;
+  Flag.blink2 = 1;
+  RTOS_SetTask(blink, 0, 0);
+  setYearShow();
+}
+
+void setIncWDay(void) {
+  if (setRTC.WD < 7) {
+    setRTC.WD ++;
+  } else {
+    setRTC.WD = 1;
+  }
+}
+
+void setDecWDay(void) {
+  if (setRTC.WD > 1) {
+    setRTC.WD --;
+  } else {
+    setRTC.WD = 7;
+  }
+}
+
+void setIncMDay(void) {
+  valIncrease(&setRTC.Day, 31);
+  if (setRTC.Day == 0) {
+    setRTC.Day = 1;
+  }
+}
+
+void setDecMDay(void) {
+  valDecrease(&setRTC.Day, 31);
+  if (setRTC.Day == 0) {
+    setRTC.Day = 0x31;
+  }
+}
+
+void setIncMonth(void) {
+  valIncrease(&setRTC.Mon, 12);
+  if (setRTC.Mon == 0) {
+    setRTC.Mon = 1;
+  }
+}
+
+void setDecMonth(void) {
+  valDecrease(&setRTC.Mon, 12);
+  if (setRTC.Mon == 0) {
+    setRTC.Mon = 0x12;
+  }
+}
+
+void setIncYear(void) {
+  valIncrease(&setRTC.Year, 99);
+}
+
+void setDecYear(void) {
+  valDecrease(&setRTC.Year, 99);
+}
+
 /**
   * @brief  Increase BCD value.
   * @param  : val, max
@@ -736,6 +669,66 @@ void usart_puts (const char *send) {
 }
 #endif // USE_UART
 
+#ifdef LAMP_TEST
+/**
+ * Lamp Test
+ */
+static void lampValInc(uint8_t n)
+{
+  if (Digit[n] != DIGIT_BLANK) {
+    Digit[n] ++;
+  } else {
+    Digit[n] = 1;
+  }
+
+  if (Digit[n] > 9) {
+    Digit[n] = 0;
+    if (n > 0) {
+      lampValInc(n-1);
+    }
+  }
+}
+
+static void lampTest(void)
+{
+  uint8_t i=0;
+  uint8_t k, x;
+
+  dotOn();
+  for (k = 0; k<LAMP_NUM; k++) {
+    Digit[k] = DIGIT_BLANK;
+  }
+
+  while (true) {
+
+    Digit[LAMP_NUM-1] = i;
+    i ++;
+    if (i > 9) {
+      dotOn();
+      i = 0;
+      lampValInc(LAMP_NUM-2);
+    }
+    tdelay_ms(10);
+
+    if (i == 5) {
+        dotOff();
+    }
+
+    x = 1;
+    for (k = 0; k<LAMP_NUM; k++) {
+      if (Digit[k] == 9) {
+        x ++;
+      }
+    }
+    if (x == LAMP_NUM) {
+      tdelay_ms(2000);
+      break;
+    }
+
+  }
+}
+#endif // LAMP_TEST
+
 /**
  *  П р е р ы в а н и я
  */
@@ -851,6 +844,11 @@ ISR(TIMER2_COMP_vect) {
   PORTD &= ~ANODD_PINS;
   PORTC &= ~DIGIT_PINS;
 }
+/*
+ISR(ADC_vect) {
+  resultADC = ADCH;
+  ADCSRA &= ~(1<<ADIE); // disable interrupt
+}*/
 #endif // USE_BRIGHT_CONTROL
 
 /**