Ver Fonte

Проверка обработки кнопок, вывода времени и даты.

Vladimir Shilov há 5 anos atrás
pai
commit
c41e0e5aa2
6 ficheiros alterados com 188 adições e 25 exclusões
  1. 23 0
      ReadMe.txt
  2. 7 0
      inc/event-system.h
  3. 13 0
      inc/list_event.h
  4. 26 8
      inc/main.h
  5. 21 2
      src/event-system.c
  6. 98 15
      src/main.c

+ 23 - 0
ReadMe.txt

@@ -9,3 +9,26 @@ My Nixie Clock IN-12 / Мои часы на ГРИ ИН-12
 минут и секунд, раз в секунду переключение точки. Без кнопок.
 Чтение из RTC сделано без малейших проверок, в случае проблем вместо 
 времени будет мусор.
+---
+2019.05.27
+Опять застой.
+Платы собраны и работают.
+
+Были нюансы с анодным питанием - нужен конденсатор на вывод обратной связи MC, 
+! не забыть исправить схему и плату. Был писк дросслей - почти избавился.
+
+Конденсаторы на кнопках - не дают работать SPI для прошивки.
+Само расположение кнопок - неудачное. Они должны "смотреть" назад, а 
+получилось, что вверх. Нужно или переставтиь на заднюю часть платы - для 
+уменьшения проблем с корпусировкой, или ставить другие - чтобы толкатели 
+выходили на заднюю стенку. Как вариант - убрать кнопки совсем, настраивать 
+через ком-порт.
+
+Обработчик кнопок взял из "Старт 7231", который туда тоже взял из прошлого проекта.
+---
+2019.05.28
+Кнопка1 - "выбор", 2 - "+", 3 - "-".
+Пока не придумаю, как лучше сделать мигание разрядами...
+---
+2019.05.29
+При нажатии на кнопки "1"/"2" должно переключать отображение.

+ 7 - 0
inc/event-system.h

@@ -29,5 +29,12 @@ void ES_Dispatch(es_event_t event);     /* вызов диспетчера */
 /**
  * ES function prototypes
  */
+void dotOnPersistent(void);
+void showTime(void);
+void showMMSS(void);
+void showWDay(void);
+void showMDay(void);
+void showMonth(void);
+void showYear(void);
 
 #endif /* EVENT_SYSTEM_H */

+ 13 - 0
inc/list_event.h

@@ -5,12 +5,25 @@
 /* коды событий */
 typedef enum {
   eventNull = 0x00,
+  evNewSecond,
+  evBTN1Pressed,
+  evBTN2Pressed,
+  evBTN3Pressed,
+  evBTN1Holded,
+  evBTN2Holded,
+  evBTN3Holded,
   evMenuWDT
 } es_event_t;
 
 /* коды состояний */
 typedef enum {
   stNoChange = 0x00,
+  stShowTime,
+  stShowMMSS,
+  stShowWDay,
+  stShowMDay,
+  stShowMon,
+  stShowYear,
   /* end */
   stLastState
 } es_state_t;

+ 26 - 8
inc/main.h

@@ -2,6 +2,8 @@
 #ifndef _MAIN_H
 #define _MAIN_H
 
+#include "event-system.h"
+
 //#define F_CPU          16000000UL
 
 /**
@@ -26,14 +28,22 @@
  * Дефайны
  */
 /* Port B, puttons, input, pull-up */
-#define BUTTON1_PIN     _BV(PB3)
-#define BUTTON2_PIN     _BV(PB4)
-#define BUTTON3_PIN     _BV(PB5)
-#define BUTTON_PINS     (BUTTON1_PIN | BUTTON2_PIN | BUTTON3_PIN)
-#define BUTTON1_STATE   (PINB & BUTTON1_PIN)
-#define BUTTON2_STATE   (PINB & BUTTON2_PIN)
-#define BUTTON3_STATE   (PINB & BUTTON3_PIN)
-#define BUTTONS_STATE   (PINB & BUTTON_PINS)
+#define BTN_NUM            3
+#define BUTTON1_PIN        _BV(PB3)
+#define BUTTON2_PIN        _BV(PB4)
+#define BUTTON3_PIN        _BV(PB5)
+#define BUTTON_PINS        (BUTTON1_PIN | BUTTON2_PIN | BUTTON3_PIN)
+#define BUTTON1_STATE      (PINB & BUTTON1_PIN)
+#define BUTTON2_STATE      (PINB & BUTTON2_PIN)
+#define BUTTON3_STATE      (PINB & BUTTON3_PIN)
+#define BUTTONS_STATE      (PINB & BUTTON_PINS)
+#define BUTTON_STATE(pin)  (PINB & pin)
+#define BUTTON_PERIOD      10
+/* все временные константы кнопок кратны периоду опроса кнопок. */
+#define BTN_TIME_PRESSED   5
+#define BTN_TIME_HOLDED    25
+#define BTN_TIME_REPEATED  10
+#define BTN_TIME_PAUSE     5
 
 /* Port C, Lamp digits, output */
 #define DIGIT_BLANK     0x0F
@@ -52,4 +62,12 @@
 #define ANOD_PINS       (ANOD1 | ANOD2 | ANOD3 | ANOD4)
 
 
+typedef struct {
+  uint8_t     time;
+  es_event_t  pressed;
+  es_event_t  holded;
+  uint8_t     pin;
+} btn_t;
+
+
 #endif

+ 21 - 2
src/event-system.c

@@ -32,8 +32,27 @@ typedef struct {
 
 /** таблица состояний */
 const table_state_t table[] = {
-/* STATE from   STATE to     EVENT from       EVENT to         NEXT STATE   STATE_FUNC1   STATE_FUNC2 */
-
+/* STATE from  STATE to    EVENT from     EVENT to       NEXT STATE  STATE_FUNC1 STATE_FUNC2 */
+  /* show date, time */
+  {stShowTime, stShowTime, evBTN1Pressed, evBTN1Pressed, stShowMMSS, dotOnPersistent, showMMSS},
+  {stShowTime, stShowTime, evBTN2Pressed, evBTN2Pressed, stShowYear, showYear, EmptyFunc},
+  {stShowMMSS, stShowMMSS, evBTN1Pressed, evBTN1Pressed, stShowWDay, showWDay, EmptyFunc},
+  {stShowMMSS, stShowMMSS, evBTN2Pressed, evBTN2Pressed, stShowTime, showTime, EmptyFunc},
+  {stShowWDay, stShowWDay, evBTN1Pressed, evBTN1Pressed, stShowMDay, showMDay, EmptyFunc},
+  {stShowWDay, stShowWDay, evBTN2Pressed, evBTN2Pressed, stShowMMSS, dotOnPersistent, showMMSS},
+  {stShowMDay, stShowMDay, evBTN1Pressed, evBTN1Pressed, stShowMon,  showMonth, EmptyFunc},
+  {stShowMDay, stShowMDay, evBTN2Pressed, evBTN2Pressed, stShowWDay, showWDay, EmptyFunc},
+  {stShowMon,  stShowMon,  evBTN1Pressed, evBTN1Pressed, stShowYear, showYear, EmptyFunc},
+  {stShowMon,  stShowMon,  evBTN2Pressed, evBTN2Pressed, stShowMDay, showMDay, EmptyFunc},
+  {stShowYear, stShowYear, evBTN1Pressed, evBTN1Pressed, stShowTime, showTime, EmptyFunc},
+  {stShowYear, stShowYear, evBTN2Pressed, evBTN2Pressed, stShowMon,  showMonth, EmptyFunc},
+  /* Refresh output */
+  {stShowTime, stShowTime, evNewSecond, evNewSecond, stNoChange, showTime, EmptyFunc},
+  {stShowMMSS, stShowMMSS, evNewSecond, evNewSecond, stNoChange, showMMSS, EmptyFunc},
+  {stShowWDay, stShowWDay, evNewSecond, evNewSecond, stNoChange, showWDay, EmptyFunc},
+  {stShowMDay, stShowMDay, evNewSecond, evNewSecond, stNoChange, showMDay, EmptyFunc},
+  {stShowMon,  stShowMon,  evNewSecond, evNewSecond, stNoChange, showMonth, EmptyFunc},
+  {stShowYear, stShowYear, evNewSecond, evNewSecond, stNoChange, showYear, EmptyFunc},
   /* обязательная пустая строка таблицы */
   {stNoChange, stNoChange, eventNull, eventNull, stNoChange, EmptyFunc, EmptyFunc}
 };

+ 98 - 15
src/main.c

@@ -30,12 +30,18 @@ volatile struct {
 	uint8_t RTC_Int:	1;
 	uint8_t rezerv:   7;
 } Flag;
+static btn_t Button[BTN_NUM] = {
+  {0, evBTN1Pressed, evBTN1Holded, BUTTON1_PIN},
+  {0, evBTN2Pressed, evBTN2Holded, BUTTON2_PIN},
+  {0, evBTN3Pressed, evBTN3Holded, BUTTON3_PIN}
+};
 
 /* Constants */
 /* Function prototypes */
-void Board_Init(void);
-void onDot(void);
-void offDot(void);
+static void Board_Init(void);
+static void dotOn(void);
+static void dotOff(void);
+static void btnProcess(void);
 
 void main(void) {
   /**
@@ -58,24 +64,22 @@ void main(void) {
   RTC_ReadAll(&RTC);
 
   // Initialize Event State Machine
-  ES_Init(stNoChange);
+  ES_Init(stShowTime);
 
-  //RTOS_SetTask(onDot, 0, 1000);
-  //RTOS_SetTask(offDot, 500, 1000);
+  RTOS_SetTask(btnProcess, 0, 10000);
 
   /** main loop */
   do {
     if (Flag.RTC_Int != 0) {
       Flag.RTC_Int = 0;
+      ES_PlaceEvent(evNewSecond);
 
       RTC_ReadTime(&RTC);
-      Digit[0] = RTC.Min >> 4;
-      Digit[1] = RTC.Min & 0x0F;
-      Digit[2] = RTC.Sec >> 4;
-      Digit[3] = RTC.Sec & 0x0F;
 
-      onDot();
-      RTOS_SetTask(offDot, 500, 0);
+      /* Blink dot if show HH:MM */
+      if (ES_GetState() == stShowTime) {
+        RTOS_SetTask(dotOff, 500, 0);
+      }
     }
 
     event = ES_GetEvent();
@@ -100,7 +104,7 @@ void main(void) {
 /**
  * @brief Initializy perephireal
  */
-void Board_Init(void) {
+static void Board_Init(void) {
   /* power off Analog Comparator */
   ACSR = ACD;
 
@@ -122,14 +126,93 @@ void Board_Init(void) {
   sei();
 }
 
-void onDot(void) {
+static void dotOn(void) {
   PORTD |= DOT_PIN;
 }
 
-void offDot(void) {
+static void dotOff(void) {
   PORTD &= ~(DOT_PIN);
 }
 
+void dotOnPersistent(void) {
+  RTOS_DeleteTask(dotOff);
+  PORTD |= DOT_PIN;
+}
+
+/**
+  * @brief  Обработка кнопок.
+  * @param  : None
+  * @retval : None
+  */
+static void btnProcess(void) {
+  uint8_t i;
+  for (i=0; i<BTN_NUM; i++) {
+    if (Button[i].pin != 0) {
+      // button pressed
+      if (BUTTON_STATE(Button[i].pin) == 0) {
+        Button[i].time ++;
+        if (Button[i].time > BTN_TIME_HOLDED) {
+          Button[i].time -= BTN_TIME_REPEATED;
+          ES_PlaceEvent(Button[i].holded); // button pressed auto repeat
+        }
+      } else {
+        // button released
+        if (Button[i].time >= BTN_TIME_PRESSED) {
+          ES_PlaceEvent(Button[i].pressed); // process short press.
+        }
+        Button[i].time = 0;
+      }
+    } /* end (pin == 0) */
+  } /* end FOR */
+}
+
+void showTime(void) {
+  dotOn();
+  Digit[0] = RTC.Hr >> 4;
+  Digit[1] = RTC.Hr & 0x0F;
+  Digit[2] = RTC.Min >> 4;
+  Digit[3] = RTC.Min & 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) {
+  PORTD &= ~(DOT_PIN);
+  Digit[0] = DIGIT_BLANK;
+  Digit[1] = DIGIT_BLANK;
+  Digit[2] = RTC.WD & 0x0F;
+  Digit[3] = DIGIT_BLANK;
+}
+
+void showMDay(void) {
+  PORTD &= ~(DOT_PIN);
+  Digit[0] = RTC.Day >> 4;
+  Digit[1] = RTC.Day & 0x0F;
+  Digit[2] = DIGIT_BLANK;
+  Digit[3] = DIGIT_BLANK;
+}
+
+void showMonth(void) {
+  PORTD &= ~(DOT_PIN);
+  Digit[0] = DIGIT_BLANK;
+  Digit[1] = DIGIT_BLANK;
+  Digit[2] = RTC.Mon >> 4;
+  Digit[3] = RTC.Mon & 0x0F;
+}
+
+void showYear(void) {
+  PORTD &= ~(DOT_PIN);
+  Digit[0] = 0x02;
+  Digit[1] = 0x00;
+  Digit[2] = RTC.Year >> 4;
+  Digit[3] = RTC.Year & 0x0F;
+}
+
 
 /**
  *  П р е р ы в а н и я