Przeglądaj źródła

Make faded digits change. Try #1.

Vladimir N. Shilov 3 lat temu
rodzic
commit
21357032a6
4 zmienionych plików z 111 dodań i 71 usunięć
  1. 14 3
      Inc/board.h
  2. 7 4
      MNC-IN12x5.emSession
  3. 40 14
      Src/board.c
  4. 50 50
      Src/clock.c

+ 14 - 3
Inc/board.h

@@ -20,7 +20,7 @@
 #define TUBE_D_ON       TIM3->CCER |= (TIM_CCER_CC2E)
 #define TUBE_E_ON       TIM3->CCER |= (TIM_CCER_CC1E)
 #define TUBE_BCDE_ON    TIM3->CCER |= (TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E)
-#define TUBE_ALL_ON		TUBE_A_ON; TUBE_BCDE_ON
+#define TUBE_ALL_ON     TUBE_A_ON; TUBE_BCDE_ON
 
 #define TUBE_A_OFF      TIM1->CCER &= ~(TIM_CCER_CC1E)
 #define TUBE_B_OFF      TIM3->CCER &= ~(TIM_CCER_CC4E)
@@ -28,7 +28,7 @@
 #define TUBE_D_OFF      TIM3->CCER &= ~(TIM_CCER_CC2E)
 #define TUBE_E_OFF      TIM3->CCER &= ~(TIM_CCER_CC1E)
 #define TUBE_BCDE_OFF   TIM3->CCER &= ~(TIM_CCER_CC1E | TIM_CCER_CC2E | TIM_CCER_CC3E | TIM_CCER_CC4E)
-#define TUBE_ALL_OFF	TUBE_A_OFF; TUBE_BCDE_OFF
+#define TUBE_ALL_OFF    TUBE_A_OFF; TUBE_BCDE_OFF
 
 #define IN15_P          GPIOA->BSRR = 0x1
 #define IN15_Plus       GPIOA->BSRR = 0x2
@@ -145,12 +145,23 @@ typedef struct {
     uint8_t v;
 } HSV_t;
 
+typedef union {
+  uint32_t u32;  /* element specifier for accessing whole u32 */
+  uint8_t ar[4]; /* element specifier for accessing as array  */
+  struct {
+    uint8_t tE;  /* element specifier for accessing Tube_E(4) */
+    uint8_t tD;  /* element specifier for accessing Tube_D(3) */
+    uint8_t tB;  /* element specifier for accessing Tube_B(2) */
+    uint8_t tA;  /* element specifier for accessing Tube_A(1) */
+  } s32;         /* element spec. for acc. struct with tubes  */
+} tube4_t;
+
 /* Exported funcions */
 void SystemClock_Config(void);
 void Board_Init(void);
 void Blink_Start(void);
 void Blink_Stop(void);
-void showDigits(uint8_t * dig);
+void showDigits(tube4_t dig);
 void HSV2LED(const uint8_t hue, const uint8_t sat, const uint8_t val);
 
 #endif /* _BPARD_H */

+ 7 - 4
MNC-IN12x5.emSession

@@ -13,10 +13,10 @@
  <Project>
   <ProjectSessionItem path="MNC-IN12x5"/>
   <ProjectSessionItem path="MNC-IN12x5;MNC-IN12x5"/>
-  <ProjectSessionItem path="MNC-IN12x5;MNC-IN12x5;Internal Files"/>
-  <ProjectSessionItem path="MNC-IN12x5;MNC-IN12x5;Drivers/CMSIS"/>
-  <ProjectSessionItem path="MNC-IN12x5;MNC-IN12x5;Application/User"/>
   <ProjectSessionItem path="MNC-IN12x5;MNC-IN12x5;Application/MDK-ARM"/>
+  <ProjectSessionItem path="MNC-IN12x5;MNC-IN12x5;Application/User"/>
+  <ProjectSessionItem path="MNC-IN12x5;MNC-IN12x5;Drivers/CMSIS"/>
+  <ProjectSessionItem path="MNC-IN12x5;MNC-IN12x5;Internal Files"/>
  </Project>
  <Register1/>
  <Register2/>
@@ -41,8 +41,11 @@
   <Watches active="0" update="Never"/>
  </Watch4>
  <Files>
-  <SessionOpenFile windowGroup="DockEditLeft" x="0" y="22" useTextEdit="1" openedFrom="" useBinaryEdit="0" left="0" path="Src/sensor.c" selected="1" top="0" codecName="UTF-8"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="0" y="22" useTextEdit="1" openedFrom="" useBinaryEdit="0" left="0" path="Src/sensor.c" selected="0" top="0" codecName="UTF-8"/>
   <SessionOpenFile windowGroup="DockEditLeft" x="0" y="64" useTextEdit="1" openedFrom="" useBinaryEdit="0" left="0" path="Src/main.c" selected="0" top="54" codecName="UTF-8"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="16" y="163" useTextEdit="1" openedFrom="" useBinaryEdit="0" left="0" path="Inc/board.h" selected="0" top="125" codecName="UTF-8"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="0" y="127" useTextEdit="1" openedFrom="" useBinaryEdit="0" left="0" path="Src/board.c" selected="1" top="92" codecName="UTF-8"/>
+  <SessionOpenFile windowGroup="DockEditLeft" x="0" y="130" useTextEdit="1" openedFrom="" useBinaryEdit="0" left="0" path="Src/clock.c" selected="0" top="98" codecName="UTF-8"/>
  </Files>
  <ARMCrossStudioWindow activeProject="MNC-IN12x5" fileDialogDefaultFilter="*.c" autoConnectTarget="J-Link" buildConfiguration="Debug" sessionSettings="" debugSearchFileMap="" fileDialogInitialDirectory="" debugSearchPath="" autoConnectCapabilities="3199"/>
 </session>

+ 40 - 14
Src/board.c

@@ -30,6 +30,7 @@ static uint8_t tubesBuffer[SPI_BUFFER_SIZE] = {0};
 /* private typedef */
 
 /* private functions */
+static void _show_digits(const tube4_t dig);
 static void GPIO_Init(void);
 static void DMA_Init(void);
 static void I2C1_Init(void);
@@ -102,7 +103,33 @@ void Board_Init(void)
   * @param  : array with four BCD digits
   * @retval : None
   */
-void showDigits(uint8_t * dig)
+void showDigits(tube4_t dig)
+{
+  static uint32_t old_dig = 0;
+  uint8_t st = 0, ov = 0;
+
+  if (old_dig == dig.u32) {
+    _show_digits(dig);
+  } else {
+    while (ov < 20) {
+      if (st == 0) {
+        // new tube value
+        st = 1;
+        _show_digits(dig);
+        ov += 2;
+        tdelay_ms(ov);
+      } else {
+        // old tube value
+        st = 0;
+        _show_digits((tube4_t)old_dig);
+        tdelay_ms(20 - ov);
+      }
+    } // End of while
+    old_dig = dig.u32;
+  } // End of if-else
+}
+
+static void _show_digits(tube4_t dig)
 {
   /* Clear buffer */
   tubesBuffer[0] = 0;
@@ -114,9 +141,9 @@ void showDigits(uint8_t * dig)
   /* check values range */
   int i;
   for (i=0; i<4; i++) {
-    if (dig[i] > 9) {
-      if (dig[i] != 0xf) {
-        dig[i] = 0;
+    if (dig.ar[i] > 9) {
+      if (dig.ar[i] != 0xf) {
+        dig.ar[i] = 0;
       }
     }
   }
@@ -126,37 +153,36 @@ void showDigits(uint8_t * dig)
   Flag.SPI_TX_End = 0;
 
   /* Feel buffer */
-  tubesBuffer[0] = (uint8_t)(nixieCathodeMap[Tube_E][dig[Tube_E]] >> 8);
-  tubesBuffer[1] = (uint8_t)((nixieCathodeMap[Tube_E][dig[Tube_E]]) | (nixieCathodeMap[Tube_D][dig[Tube_D]] >> 8));
-  tubesBuffer[2] = (uint8_t)((nixieCathodeMap[Tube_D][dig[Tube_D]]) | (nixieCathodeMap[Tube_B][dig[Tube_B]] >> 8));
-  tubesBuffer[3] = (uint8_t)((nixieCathodeMap[Tube_B][dig[Tube_B]]) | (nixieCathodeMap[Tube_A][dig[Tube_A]] >> 8));
-  tubesBuffer[4] = (uint8_t)(nixieCathodeMap[Tube_A][dig[Tube_A]]);
+  tubesBuffer[0] = (uint8_t)(nixieCathodeMap[Tube_E][dig.s32.tE] >> 8);
+  tubesBuffer[1] = (uint8_t)((nixieCathodeMap[Tube_E][dig.s32.tE]) | (nixieCathodeMap[Tube_D][dig.s32.tD] >> 8));
+  tubesBuffer[2] = (uint8_t)((nixieCathodeMap[Tube_D][dig.s32.tD]) | (nixieCathodeMap[Tube_B][dig.s32.tB] >> 8));
+  tubesBuffer[3] = (uint8_t)((nixieCathodeMap[Tube_B][dig.s32.tB]) | (nixieCathodeMap[Tube_A][dig.s32.tA] >> 8));
+  tubesBuffer[4] = (uint8_t)(nixieCathodeMap[Tube_A][dig.s32.tA]);
 
   /* Start DMA transfer to SPI */
   DMA1_Channel1->CCR |= DMA_CCR_EN;
 
   /* On/Off tube power */
-  if (dig[Tube_A] == 0xf) {
+  if (dig.s32.tA == 0xf) {
     TUBE_A_OFF;
   } else {
     TUBE_A_ON;
   }
-  if (dig[Tube_B] == 0xf) {
+  if (dig.s32.tB == 0xf) {
     TUBE_B_OFF;
   } else {
     TUBE_B_ON;
   }
-  if (dig[Tube_D] == 0xf) {
+  if (dig.s32.tD == 0xf) {
     TUBE_D_OFF;
   } else {
     TUBE_D_ON;
   }
-  if (dig[Tube_E] == 0xf) {
+  if (dig.s32.tE == 0xf) {
     TUBE_E_OFF;
   } else {
     TUBE_E_ON;
   }
-
 }
 
 /**

+ 50 - 50
Src/clock.c

@@ -107,7 +107,7 @@ void in15P(void) {
 }
 
 /** 'Faded' funcions */
- static void MinusFadeIn(void) {
+static void MinusFadeIn(void) {
   static uint8_t on = 0;
   static uint8_t off = 20;
   static uint8_t st = 0;
@@ -161,17 +161,17 @@ void showTime(void) {
   uint8_t hue = bcd2bin(Clock.Sec);// * 6;
   HSV2LED(hue, 255, 255);
 
-  uint8_t buf[4];
+  tube4_t buf;
 /*
-  buf[Tube_A] = Clock.Hr >> 4;
-  buf[Tube_B] = Clock.Hr & 0xf;
-  buf[Tube_D] = Clock.Min >> 4;
-  buf[Tube_E] = Clock.Min & 0xf;
+  buf.s32.tA = Clock.Hr >> 4;
+  buf.s32.tB = Clock.Hr & 0xf;
+  buf.s32.tD = Clock.Min >> 4;
+  buf.s32.tE = Clock.Min & 0xf;
 */
-  buf[Tube_A] = Clock.Min >> 4;
-  buf[Tube_B] = Clock.Min & 0xf;
-  buf[Tube_D] = Clock.Sec >> 4;
-  buf[Tube_E] = Clock.Sec & 0xf;
+  buf.s32.tA = Clock.Min >> 4;
+  buf.s32.tB = Clock.Min & 0xf;
+  buf.s32.tD = Clock.Sec >> 4;
+  buf.s32.tE = Clock.Sec & 0xf;
   showDigits(buf);
 }
 
@@ -179,11 +179,11 @@ void showWD(void) {
   dispWDT = DISP_WDT_TIME;
   IN15_OFF;
 
-  uint8_t buf[4];
-  buf[Tube_A] = 0xf;
-  buf[Tube_B] = Clock.WD & 0xf;
-  buf[Tube_D] = 0xf;
-  buf[Tube_E] = 0xf;
+  tube4_t buf;
+  buf.s32.tA = 0xf;
+  buf.s32.tB = Clock.WD & 0xf;
+  buf.s32.tD = 0xf;
+  buf.s32.tE = 0xf;
   showDigits(buf);
 }
 
@@ -191,11 +191,11 @@ void showDay(void) {
   dispWDT = DISP_WDT_TIME;
   IN15_OFF;
 
-  uint8_t buf[4];
-  buf[Tube_A] = Clock.Day >> 4;
-  buf[Tube_B] = Clock.Day & 0xf;
-  buf[Tube_D] = 0xf;
-  buf[Tube_E] = 0xf;
+  tube4_t buf;
+  buf.s32.tA = Clock.Day >> 4;
+  buf.s32.tB = Clock.Day & 0xf;
+  buf.s32.tD = 0xf;
+  buf.s32.tE = 0xf;
   showDigits(buf);
 }
 
@@ -203,11 +203,11 @@ void showMonth(void) {
   dispWDT = DISP_WDT_TIME;
   IN15_OFF;
 
-  uint8_t buf[4];
-  buf[Tube_A] = 0xf;
-  buf[Tube_B] = 0xf;
-  buf[Tube_D] = Clock.Mon >> 4;
-  buf[Tube_E] = Clock.Mon & 0xf;
+  tube4_t buf;
+  buf.s32.tA = 0xf;
+  buf.s32.tB = 0xf;
+  buf.s32.tD = Clock.Mon >> 4;
+  buf.s32.tE = Clock.Mon & 0xf;
   showDigits(buf);
 }
 
@@ -215,11 +215,11 @@ void showDayMon(void) {
   dispWDT = DISP_WDT_TIME;
   IN15_OFF;
 
-  uint8_t buf[4];
-  buf[Tube_A] = Clock.Day >> 4;
-  buf[Tube_B] = Clock.Day & 0xf;
-  buf[Tube_D] = Clock.Mon >> 4;
-  buf[Tube_E] = Clock.Mon & 0xf;
+  tube4_t buf;
+  buf.s32.tA = Clock.Day >> 4;
+  buf.s32.tB = Clock.Day & 0xf;
+  buf.s32.tD = Clock.Mon >> 4;
+  buf.s32.tE = Clock.Mon & 0xf;
   showDigits(buf);
 }
 
@@ -227,11 +227,11 @@ void showYear(void) {
   dispWDT = DISP_WDT_TIME;
   IN15_OFF;
 
-  uint8_t buf[4];
-  buf[Tube_A] = 2;
-  buf[Tube_B] = 0;
-  buf[Tube_D] = Clock.Year >> 4;
-  buf[Tube_E] = Clock.Year & 0xf;
+  tube4_t buf;
+  buf.s32.tA = 2;
+  buf.s32.tB = 0;
+  buf.s32.tD = Clock.Year >> 4;
+  buf.s32.tE = Clock.Year & 0xf;
   showDigits(buf);
 }
 
@@ -239,11 +239,11 @@ void showHumidity(void) {
   dispWDT = DISP_WDT_TIME;
   in15Percent();
 
-  uint8_t buf[4];
-  buf[Tube_A] = Humidity / 10;
-  buf[Tube_B] = Humidity % 10;
-  buf[Tube_D] = 0xf;
-  buf[Tube_E] = 0xf;
+  tube4_t buf;
+  buf.s32.tA = Humidity / 10;
+  buf.s32.tB = Humidity % 10;
+  buf.s32.tD = 0xf;
+  buf.s32.tE = 0xf;
   showDigits(buf);
 }
 
@@ -251,11 +251,11 @@ void showTemperature(void) {
   dispWDT = DISP_WDT_TIME;
   in15Plus();
 
-  uint8_t buf[4];
-  buf[Tube_A] = 0xf;
-  buf[Tube_B] = 0xf;
-  buf[Tube_D] = Temperature / 10;
-  buf[Tube_E] = Temperature % 10;
+  tube4_t buf;
+  buf.s32.tA = 0xf;
+  buf.s32.tB = 0xf;
+  buf.s32.tD = Temperature / 10;
+  buf.s32.tE = Temperature % 10;
   showDigits(buf);
 }
 
@@ -263,13 +263,13 @@ void showPressure(void) {
   dispWDT = DISP_WDT_TIME;
   in15P();
 
-  uint8_t buf[4];
+  tube4_t buf;
   int tmp;
-  buf[Tube_A] = 0xf;
-  buf[Tube_B] = Pressure / 100;
+  buf.s32.tA = 0xf;
+  buf.s32.tB = Pressure / 100;
   tmp = Pressure % 100;
-  buf[Tube_D] = tmp / 10;
-  buf[Tube_E] = tmp % 10;
+  buf.s32.tD = tmp / 10;
+  buf.s32.tE = tmp % 10;
   showDigits(buf);
 }