Kaynağa Gözat

Первичная цель достигнута. Переходим ко второму этапу.

Vladimir N. Shilov 9 yıl önce
ebeveyn
işleme
ee272fd6f4
6 değiştirilmiş dosya ile 90 ekleme ve 72 silme
  1. 15 0
      ReadMe.txt
  2. 8 8
      lib/max7219.c
  3. 63 60
      lib/max7219.h
  4. BIN
      sch/VAPC-meter.dch
  5. BIN
      sch/VAPC-meter.dip
  6. 4 4
      src/main.c

+ 15 - 0
ReadMe.txt

@@ -88,3 +88,18 @@ SVN-инит 2014.12.29
 переносе инициализации то туда, то сюда...
 
 Повторяем заповедь -- "Часы, ноги, перефирия".
+
+Вобщем, SPI работает. Проблема была в том, что токозадающий резистор для 
+MAX нужно подключать на +5В, а у меня он был на земле. Напаял навесом.
+Картинка появилась, но на индикаторах какой-то бред.
+
+Исправил коды символов. Исправил позиции индикаторов.
+Вылезло два момента -- неправильно запаял индикаторы, собирался красный 
+вниз, под ток, а жёлтый вверх под напряжение. В итоге запаял наоборот. Так 
+ещё и на схеме они местами попутаны, так как на плате DS1 внизу, а DS2 
+вверху. Исправил схему и позиции индикаторов под факт.
+
+Добился картинки. Похоже тут какой-то бешенный оптимизатор -- выкинул нах 
+похожую функцию. Нужно учесть на будущее.
+
+Пора браться за ADC.

+ 8 - 8
lib/max7219.c

@@ -13,7 +13,7 @@
 #include "max7219.h"
 
 #define SPI_PORT        GPIOB
-#define SPI_NSS         GPIO_Pin_4
+#define SPI_CS          GPIO_Pin_4
 #define SPI_SCK         GPIO_Pin_5
 #define SPI_MOSI        GPIO_Pin_6
 #define SPI_PINS        (SPI_SCK|SPI_MOSI)
@@ -24,9 +24,9 @@ void MAX7219_Init(void) {
     CLK_PeripheralClockConfig(CLK_Peripheral_SPI1, ENABLE);
     /* Set the MOSI,MISO and SCK at high level */
     GPIO_ExternalPullUpConfig(SPI_PORT, SPI_PINS, ENABLE);
-    /* Configure Lock pin */
-    GPIO_Init(SPI_PORT, SPI_NSS, GPIO_Mode_Out_PP_High_Fast);
-    GPIO_SetBits(SPI_PORT, SPI_NSS);
+    /* Configure LOAD pin */
+    GPIO_Init(SPI_PORT, SPI_CS, GPIO_Mode_Out_PP_High_Fast);
+    GPIO_SetBits(SPI_PORT, SPI_CS);
     /* Init SPI */
     SPI_Init(SPI1, SPI_FirstBit_MSB, SPI_BaudRatePrescaler_2, SPI_Mode_Master,
              SPI_CPOL_High, SPI_CPHA_2Edge, SPI_Direction_1Line_Tx, SPI_NSS_Soft, 0x00);
@@ -45,8 +45,8 @@ void MAX7219_WriteData(max7219_reg_t reg, uint8_t data)
 {
     /*!< Wait wait until the completion of the transfer. */
     while (SPI_GetFlagStatus(SPI1, SPI_FLAG_BSY) == SET) {}
-    /* Down LOCK pin */
-    GPIO_ResetBits(SPI_PORT, SPI_NSS);
+    /* Down LOAD pin */
+    GPIO_ResetBits(SPI_PORT, SPI_CS);
 
     /*!< Wait until the transmit buffer is empty */
     while (SPI_GetFlagStatus(SPI1, SPI_FLAG_TXE) == RESET) {}
@@ -62,6 +62,6 @@ void MAX7219_WriteData(max7219_reg_t reg, uint8_t data)
 
     /*!< Wait wait until the completion of the transfer. */
     while (SPI_GetFlagStatus(SPI1, SPI_FLAG_BSY) == SET) {}
-    /* Up LOCK pin */
-    GPIO_SetBits(SPI_PORT, SPI_NSS);
+    /* Up LOAD pin */
+    GPIO_SetBits(SPI_PORT, SPI_CS);
 }

+ 63 - 60
lib/max7219.h

@@ -34,30 +34,32 @@
 #define MAX7219_CHAR_BLANK	0x0F
 #define MAX7219_CHAR_FULL	0x88
 // без кодирования
-#define SYM_0		0x7B
-#define SYM_1		0x18
-#define SYM_2		0xAB
-#define SYM_3		0xBA
-#define SYM_4		0xD8
-#define SYM_5		0xF2
-#define SYM_6		0xF3
-#define SYM_7		0x38
-#define SYM_8		0xFB
-#define SYM_9		0xFA
-#define SYM_A		0xF9
-#define SYM_b		0xD3
-#define SYM_c		0x83
+#define SYM_0		0x6F
+#define SYM_1		0x0C
+#define SYM_2		0xEA
+#define SYM_3		0xAE
+#define SYM_4		0x8D
+#define SYM_5		0xA7
+#define SYM_6		0xE7
+#define SYM_7		0x0E
+#define SYM_8		0xEF
+#define SYM_9		0xAF
+#define SYM_A		0xCF
+#define SYM_b		0xE5
+#define SYM_c		0xE0
 #define SYM_C		0x63
-#define SYM_d		0x9B
+#define SYM_d		0xEC
 #define SYM_E		0xE3
-#define SYM_F		0xE1
-#define SYM_P		0xE9
-#define SYM_Gradus	0xE8
-#define SYM_LGradus	0x93
-#define SYM_Temp	0xC3
+#define SYM_F		0xC3
+#define SYM_P		0xCB
+#define SYM_Gradus	0x8B
+#define SYM_LGradus	0xE4
+#define SYM_Temp	0xE1
 #define SYM_Minus	0x80
+#define SYM_Plus	0xD1
 #define SYM_BLANK	0x00
 #define SYM_FULL	0xFF
+#define SYM_DOT 	0x10
 
 #define MAX7219_ON			0x01
 #define MAX7219_OFF			0x00
@@ -69,14 +71,14 @@
 /* Exported types ------------------------------------------------------------*/
 typedef enum {
     NoOp        = 0x00,
-    Digit0      = 0x08,
-    Digit1      = 0x07,
-    Digit2      = 0x05,
-    Digit3      = 0x02,
-    Digit4      = 0x04,
-    Digit5      = 0x03,
-    Digit6      = 0x01,
-    Digit7      = 0x06,
+    Digit0      = 0x03,
+    Digit1      = 0x08,
+    Digit2      = 0x02,
+    Digit3      = 0x01,
+    Digit4      = 0x07,
+    Digit5      = 0x04,
+    Digit6      = 0x06,
+    Digit7      = 0x05,
     DecodeMode  = 0x09,
     Intensity   = 0x0A,
     ScanLimit   = 0x0B,
@@ -85,42 +87,43 @@ typedef enum {
 } max7219_reg_t;
 
 typedef enum {
-    SegA    = 5,
-    SegB    = 3,
-    SegC    = 4,
-    SegD    = 1,
-    SegE    = 0,
-    SegF    = 6,
-    SegG    = 7,
-    SegDP   = 2,
+    SegA    = SEG_A,
+    SegB    = SEG_B,
+    SegC    = SEG_C,
+    SegD    = SEG_D,
+    SegE    = SEG_E,
+    SegF    = SEG_F,
+    SegG    = SEG_G,
+    SegDP   = SEG_DP,
 } max7219_seg_t;
 
 typedef enum {
-    Sym_0        = 0x7B,
-    Sym_1        = 0x18,
-    Sym_2        = 0xAB,
-    Sym_3        = 0xBA,
-    Sym_4        = 0xD8,
-    Sym_5        = 0xF2,
-    Sym_6        = 0xF3,
-    Sym_7        = 0x38,
-    Sym_8        = 0xFB,
-    Sym_9        = 0xFA,
-    Sym_A        = 0xF9,
-    Sym_b        = 0xD3,
-    Sym_c        = 0x83,
-    Sym_C        = 0x63,
-    Sym_d        = 0x9B,
-    Sym_E        = 0xE3,
-    Sym_F        = 0xE1,
-    Sym_P        = 0xE9,
-    Sym_Gradus	 = 0xE8,
-    Sym_LGradus	 = 0x93,
-    Sym_Temp	 = 0xC3,
-    Sym_Minus	 = 0x80,
-    Sym_Plus	 = 0x98, // C1 ?
-    Sym_BLANK	 = 0x00,
-    Sym_FULL	 = 0xFF
+    Sym_0        = SYM_0,
+    Sym_1        = SYM_1,
+    Sym_2        = SYM_2,
+    Sym_3        = SYM_3,
+    Sym_4        = SYM_4,
+    Sym_5        = SYM_5,
+    Sym_6        = SYM_6,
+    Sym_7        = SYM_7,
+    Sym_8        = SYM_8,
+    Sym_9        = SYM_9,
+    Sym_A        = SYM_A,
+    Sym_b        = SYM_b,
+    Sym_c        = SYM_c,
+    Sym_C        = SYM_C,
+    Sym_d        = SYM_d,
+    Sym_E        = SYM_E,
+    Sym_F        = SYM_F,
+    Sym_P        = SYM_P,
+    Sym_Gradus	 = SYM_Gradus,
+    Sym_LGradus	 = SYM_LGradus,
+    Sym_Temp	 = SYM_Temp,
+    Sym_Minus	 = SYM_Minus,
+    Sym_Plus	 = SYM_P,
+    Sym_BLANK	 = SYM_BLANK,
+    Sym_FULL	 = SYM_FULL,
+    Sym_Dot      = SYM_DOT
 } max7219_sym_t;
 
 /* Exported constants --------------------------------------------------------*/

BIN
sch/VAPC-meter.dch


BIN
sch/VAPC-meter.dip


+ 4 - 4
src/main.c

@@ -105,8 +105,8 @@ void main(void)
   MAX7219_Init();
 
   /* ROTS tasks */
-  RTOS_SetTask(OutLed07,0,10000);
-  RTOS_SetTask(OutLed8f,5000,10000);
+  RTOS_SetTask(OutLed8f,0,10000);
+  RTOS_SetTask(OutLed07,5000,10000);
   RTOS_SetTask(ToggleLed,1000,1000);
 
   /* Infinite loop */
@@ -127,8 +127,8 @@ static void OutLed07(void){
 
 static void OutLed8f(void){
   uint8_t i;
-  for (i=0;i<8;i++) {
-    MAX7219_WriteData(dig[i], num[i+8]);
+  for (i=15;i>7;i--) {
+    MAX7219_WriteData(dig[i-8], num[i]);
   }
 }