Pārlūkot izejas kodu

Подключаю индикацию, работа с входами/выходами.

TelenkovDmitry 1 gadu atpakaļ
vecāks
revīzija
e19a31521d

+ 16 - 0
fw/modules/io/input.c

@@ -76,6 +76,15 @@ void in_exint_init(void)
     exint_init_struct.line_polarity = EXINT_TRIGGER_RISING_EDGE;
     exint_init(&exint_init_struct);
     
+    exint_flag_clear(EXINT_LINE_0);
+    exint_flag_clear(EXINT_LINE_1);
+    exint_flag_clear(EXINT_LINE_2);
+    exint_flag_clear(EXINT_LINE_3);
+    exint_flag_clear(EXINT_LINE_10);
+    exint_flag_clear(EXINT_LINE_11);
+    exint_flag_clear(EXINT_LINE_14);
+    exint_flag_clear(EXINT_LINE_15);
+    
     nvic_irq_enable(EXINT0_IRQn, 5, 0);
     nvic_irq_enable(EXINT1_IRQn, 5, 0);
     nvic_irq_enable(EXINT2_IRQn, 5, 0);
@@ -159,6 +168,13 @@ inline void debounce(void)
             if (++inputs[i].cnt == settings.di_debounce[i]) {
                 inputs[i].cnt = 0;
                 inputs[i].p_flag = false;
+                
+                input_state[i] = (uint16_t)gpio_input_data_bit_read(inputs[i].port, inputs[i].pin);
+                
+                if (!input_state[i])
+                    input_state_bit &= ~(1 << i); // снять бит
+                else
+                    input_state_bit |= input_state[i] << i;
             }
         }
     }

+ 2 - 2
fw/modules/io/io.c

@@ -43,7 +43,7 @@ void io_port_init(void)
     crm_periph_clock_enable(CRM_BPR_PERIPH_CLOCK, TRUE);
     pwc_battery_powered_domain_access(TRUE);
     
-    //io_tim_init();
+    io_tim_init();
 }
 
 //
@@ -67,7 +67,7 @@ void io_init(void)
         output_pwm_period[i] = settings.do_pwm_period[i];
         output_pwm_period_save[i] = settings.do_pwm_period_save[i];
 
-        if (get_save_mode()) {
+        if (save_mode_get()) {
             outputs[i].pwm_duty = settings.do_pwm_save[i];
             outputs[i].pwm_period = settings.do_pwm_period_save[i];
         }

+ 20 - 3
fw/modules/io/io_utils.c

@@ -5,25 +5,42 @@
 #include "input.h"
 #include "output.h"
 #include "settings_api.h"
+#include "mux.h"
 #include <stdio.h>
 
 
 bool save_mode = false;
+static uint16_t counter = 0;
 
 //
 void save_mode_init(void)
 {
     save_mode = settings.save_mode;
+    save_mode ? mux_led_status(false) : mux_led_status(true);
 }
 
 //
-void set_save_mode(bool state)
+void save_mode_set(bool state)
 {
     save_mode = state;
+    save_mode ? mux_led_status(false) : mux_led_status(true);
 }
 
 //
-bool get_save_mode(void)
+bool save_mode_get(void)
 {
     return save_mode;
-}
+}
+
+// Должна вызываться раз в секунду
+void save_mode_inc_cnt(void)
+{
+    bool foo = counter++ > settings.save_delay ? true : false;
+    save_mode_set(foo);
+}
+
+//
+void save_mode_reset_cnt(void)
+{
+    counter = 0;
+}

+ 7 - 2
fw/modules/io/io_utils.h

@@ -8,11 +8,16 @@
 void save_mode_init(void);
 
 //
-void set_save_mode(bool state);
+void save_mode_set(bool state);
 
 //
-bool get_save_mode(void);
+bool save_mode_get(void);
 
+//
+void save_mode_inc_cnt(void);
+
+//
+void save_mode_reset_cnt(void);
 
 #endif  // __IO_UTILS_H
 

+ 44 - 31
fw/modules/io/mux.c

@@ -6,40 +6,40 @@
 
 
 mux_channel_t leds[LED_NUMBER] = {
-                                  {"INP_1", {0, 0, 0}, LED_OFF, 0},
-                                  {"INP_2", {0, 0, 0}, LED_OFF, 0},
-                                  {"INP_3", {0, 0, 0}, LED_OFF, 0},
-                                  {"INP_4", {0, 0, 0}, LED_OFF, 0},
-
-                                  {"OUT_1_G", {1, 0, 0}, LED_OFF, 0},
-                                  {"OUT_2_G", {1, 0, 0}, LED_OFF, 0},
-                                  {"OUT_3_G", {1, 0, 0}, LED_OFF, 0},
-                                  {"OUT_4_G", {1, 0, 0}, LED_OFF, 0},
+                                  {INP_1, {0, 0, 0}, LED_OFF, 0},
+                                  {INP_2, {0, 0, 0}, LED_OFF, 0},
+                                  {INP_3, {0, 0, 0}, LED_OFF, 0},
+                                  {INP_4, {0, 0, 0}, LED_OFF, 0},
+
+                                  {OUT_1_G, {1, 0, 0}, LED_OFF, 0},
+                                  {OUT_2_G, {1, 0, 0}, LED_OFF, 0},
+                                  {OUT_3_G, {1, 0, 0}, LED_OFF, 0},
+                                  {OUT_4_G, {1, 0, 0}, LED_OFF, 0},
                                   
-                                  {"OUT_1_R", {0, 1, 0}, LED_OFF, 0},
-                                  {"OUT_2_R", {0, 1, 0}, LED_OFF, 0},
-                                  {"OUT_3_R", {0, 1, 0}, LED_OFF, 0},
-                                  {"OUT_4_R", {0, 1, 0}, LED_OFF, 0},
-
-                                  {"STATUS_G", {1, 1, 0}, LED_OFF, 0},
-                                  {"STATUS_R", {1, 1, 0}, LED_OFF, 0},
-                                  {"RX_G", {1, 1, 0}, LED_OFF, 0},
-                                  {"TX_R", {1, 1, 0}, LED_OFF, 0},
+                                  {OUT_1_R, {0, 1, 0}, LED_OFF, 0},
+                                  {OUT_2_R, {0, 1, 0}, LED_OFF, 0},
+                                  {OUT_3_R, {0, 1, 0}, LED_OFF, 0},
+                                  {OUT_4_R, {0, 1, 0}, LED_OFF, 0},
+
+                                  {STATUS_G, {1, 1, 0}, LED_OFF, 0},
+                                  {STATUS_R, {1, 1, 0}, LED_OFF, 0},
+                                  {RX_G, {1, 1, 0}, LED_OFF, 0},
+                                  {TX_R, {1, 1, 0}, LED_OFF, 0},
                                   
-                                  {"OUT_5_R", {0, 0, 1}, LED_OFF, 0},
-                                  {"OUT_6_R", {0, 0, 1}, LED_OFF, 0},
-                                  {"OUT_7_R", {0, 0, 1}, LED_OFF, 0},
-                                  {"OUT_8_R", {0, 0, 1}, LED_OFF, 0},
-
-                                  {"OUT_5_G", {1, 0, 1}, LED_OFF, 0},
-                                  {"OUT_6_G", {1, 0, 1}, LED_OFF, 0},
-                                  {"OUT_7_G", {1, 0, 1}, LED_OFF, 0},
-                                  {"OUT_8_G", {1, 0, 1}, LED_OFF, 0},
+                                  {OUT_5_R, {0, 0, 1}, LED_OFF, 0},
+                                  {OUT_6_R, {0, 0, 1}, LED_OFF, 0},
+                                  {OUT_7_R, {0, 0, 1}, LED_OFF, 0},
+                                  {OUT_8_R, {0, 0, 1}, LED_OFF, 0},
+
+                                  {OUT_5_G, {1, 0, 1}, LED_OFF, 0},
+                                  {OUT_6_G, {1, 0, 1}, LED_OFF, 0},
+                                  {OUT_7_G, {1, 0, 1}, LED_OFF, 0},
+                                  {OUT_8_G, {1, 0, 1}, LED_OFF, 0},
                                   
-                                  {"INP_5", {0, 1, 1}, LED_OFF, 0},
-                                  {"INP_6", {0, 1, 1}, LED_OFF, 0},
-                                  {"INP_7", {0, 1, 1}, LED_OFF, 0},
-                                  {"INP_8", {0, 1, 1}, LED_OFF, 0}
+                                  {INP_5, {0, 1, 1}, LED_OFF, 0},
+                                  {INP_6, {0, 1, 1}, LED_OFF, 0},
+                                  {INP_7, {0, 1, 1}, LED_OFF, 0},
+                                  {INP_8, {0, 1, 1}, LED_OFF, 0}
                                  };
 
 
@@ -159,3 +159,16 @@ void mux_led_blink(void)
     }
 }
 
+// true - normal
+// false - alarm
+void mux_led_status(bool state)
+{
+    if (state) {
+        leds[STATUS_G].state = LED_ON;
+        leds[STATUS_R].state = LED_OFF;
+    }
+    else {
+        leds[STATUS_G].state = LED_OFF;
+        leds[STATUS_R].state = LED_ON;
+    }
+}

+ 46 - 1
fw/modules/io/mux.h

@@ -1,6 +1,7 @@
 #ifndef __MUX_H
 #define __MUX_H
 
+#include <stdbool.h>
 
 //
 #define LED_NUMBER      28
@@ -27,6 +28,45 @@
 #define COL_4_RESET    GPIOB->clr = GPIO_PINS_7
 
 
+typedef enum
+{
+    INP_1 = 0, 
+    INP_2, 
+    INP_3, 
+    INP_4, 
+    
+    OUT_1_G,
+    OUT_2_G,
+    OUT_3_G,
+    OUT_4_G,
+    
+    OUT_1_R,
+    OUT_2_R,
+    OUT_3_R,
+    OUT_4_R,
+    
+    STATUS_G,
+    STATUS_R,
+    RX_G,
+    TX_R,
+    
+    OUT_5_R,
+    OUT_6_R,
+    OUT_7_R,
+    OUT_8_R,
+    
+    OUT_5_G,
+    OUT_6_G,
+    OUT_7_G,
+    OUT_8_G,
+    
+    INP_5, 
+    INP_6, 
+    INP_7, 
+    INP_8,
+      
+} led_t;
+
 
 typedef enum
 {
@@ -39,7 +79,7 @@ typedef enum
 
 typedef struct 
 {
-    char            label[8];
+    led_t           name;
     uint8_t         line[3];    // [line_0, line_1, line_2]
     led_state_t     state;
     uint32_t        cnt;
@@ -65,6 +105,11 @@ void mux_led_test_init(void);
 //
 void mux_led_test_toggle(void);
 
+//
+void mux_led_status(bool state);
+
+
+extern mux_channel_t leds[];
 
 #endif  // __MUX_H
 

+ 17 - 2
fw/modules/io/output.c

@@ -118,7 +118,7 @@ void do_update(out_t *out, uint8_t i)
     // Режим ШИМ
     if (settings.do_mode_bits & (1 << i)) {
         // Безопасный режим включен
-        if (get_save_mode())
+        if (save_mode_get())
             do_set_pwm(settings.do_pwm_period_save[i], settings.do_pwm_save[i], i);
         else
             do_set_pwm(settings.do_pwm_period[i], settings.do_pwm[i], i);
@@ -127,7 +127,7 @@ void do_update(out_t *out, uint8_t i)
     else {
         out->mode = 0;
         // Безопасный режим включен
-        if (get_save_mode())
+        if (save_mode_get())
             do_set_out(out, settings.do_save_bits & (1 << i));
         else
             do_set_out(out, settings.do_bits & (1 << i));
@@ -321,6 +321,21 @@ void out_test(void)
     }  
 }
 
+//
+void load_test(void)
+{
+    printf("LOAD_1: %u LOAD_2: %u LOAD_3: %u LOAD_4: %u LOAD_5: %u LOAD_6: %u LOAD_7: %u LOAD_8: %u\r\n", 
+           gpio_input_data_bit_read(load_sens[0].port, load_sens[0].pin),
+           gpio_input_data_bit_read(load_sens[1].port, load_sens[1].pin),
+           gpio_input_data_bit_read(load_sens[2].port, load_sens[2].pin),
+           gpio_input_data_bit_read(load_sens[3].port, load_sens[3].pin),
+           gpio_input_data_bit_read(load_sens[4].port, load_sens[4].pin),
+           gpio_input_data_bit_read(load_sens[5].port, load_sens[5].pin),
+           gpio_input_data_bit_read(load_sens[6].port, load_sens[6].pin), 
+           gpio_input_data_bit_read(load_sens[7].port, load_sens[7].pin));
+}
+
+
 //
 void TMR1_BRK_TMR9_IRQHandler(void)
 {

+ 4 - 0
fw/modules/io/output.h

@@ -50,5 +50,9 @@ void load_sens_init(simple_gpio_t *sens);
 //
 void out_test(void);
 
+//
+void load_test(void);
+
+
 #endif  // __OUTPUT_H
 

+ 2 - 0
fw/modules/misc/uptime.c

@@ -1,5 +1,6 @@
 #include "uptime.h"
 #include "rtc.h"
+#include "io_utils.h"
 #include <stdio.h>
 
 
@@ -42,6 +43,7 @@ void TMR1_OVF_TMR10_IRQHandler(void)
         tmr_flag_clear(TMR10, TMR_OVF_FLAG);
         uptime++;
         rtc_unix = RTC_GetUnixTime();
+        save_mode_inc_cnt();
     }
 }
 

+ 7 - 1
fw/modules/modbus/modbus.c

@@ -10,6 +10,7 @@
 #include "tim_delay.h"
 #include "modbus_params.h"
 #include "common_gpio.h"
+#include "io_utils.h"
 #include <stdio.h>
 #include <string.h>
 #include <stdbool.h>
@@ -267,11 +268,16 @@ eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegi
 	printf("usNRegs: %u\r\n", usNRegs);
 	printf("eMode: %u\r\n", eMode);
     printf("pucRegBuffer :%X\r\n", pucRegBuffer[0]);
-*/    
+*/  
+    
+    save_mode_reset_cnt();
+      
     mb_package_flag = true;
     
 	iRegIndex = (int)(usAddress - usRegHoldingStart);
 
+    
+    
 #if 1    
 	switch (eMode)
 	{

+ 3 - 0
fw/modules/settings/settings_api.c

@@ -123,6 +123,9 @@ void settings_set_all_default(void)
     // Безопасный режим
     settings.save_mode = 1; 
     
+    // Время ожидания опроса (сек.)
+    settings.save_delay = 60;
+    
 #if 0  
     SETTINGS_SetWebParamsDef();
     SETTINGS_SetTempWebParamsDef();

+ 2 - 0
fw/modules/settings/settings_api.h

@@ -87,6 +87,8 @@ typedef struct
     uint16_t    do_pwm_period_save[DO_NUMBER]; // период ШИМ в безопасном режиме [0.1с (10..1000)]
     
     bool        save_mode;          // безопасный режим, 0 - выкл, 1 - вкл
+    uint16_t    save_delay;         // время ожидания опроса (сек.)
+    
     
 } settings_t;
 

+ 5 - 3
fw/user/main.c

@@ -45,11 +45,11 @@ int main(void)
     
     xTaskCreate(init_task, "init_task", 10*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
     
-    xTaskCreate(test_hw_task, "hw_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
+    //xTaskCreate(test_hw_task, "hw_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
     
     xTaskCreate(test_gpio, "gpio_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
     
-    xTaskCreate(input_task, "input_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
+    //xTaskCreate(input_task, "input_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
     
     xTaskCreate(misc_task, "misc_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
     
@@ -90,7 +90,7 @@ void init_task(void *argument)
 
     save_mode_init();
     // TODO Для теста отключаем безопасный режим работы
-    set_save_mode(false);   
+    save_mode_set(false);   
     io_port_init();
     in_exint_init();
     cm_gpio_init();
@@ -195,8 +195,10 @@ void test_gpio(void *params)
         vTaskDelay(1000);
         //io_test();
         //out_test();
+        //load_test();
         
         //printf("HW rev: %u\r\n", cm_gpio_get_rev());
+        printf("Save mode: %u\r\n", save_mode_get());
     }
 }
 

BIN
output/fw.bin


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 424 - 399
project/ewarm/iap/iap.dep


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 546 - 516
project/ewarm/module_universal_io.dep


+ 2 - 0
shared/freemodbus/port/portserial.c

@@ -6,6 +6,7 @@
 #include "port.h"
 #include "mbport.h"
 #include "tim_delay.h"
+#include "mux.h"
 #include <stdlib.h>
 #include <stdbool.h>
 
@@ -221,6 +222,7 @@ void USART3_IRQHandler(void)
     {
         if (usart_flag_get(MB_UART, USART_RDBF_FLAG) == SET) 
         {
+            leds[RX_G].state = LED_ON;
             pxMBFrameCBByteReceived();
         }
     }  

+ 2 - 0
shared/freemodbus/port/porttimer.c

@@ -4,6 +4,7 @@
 #include "port.h"
 #include "mb.h"
 #include "mbport.h"
+#include "mux.h"
 #include <stdbool.h>
 
 
@@ -50,6 +51,7 @@ void TMR7_GLOBAL_IRQHandler(void)
 
       vMBPortSetWithinException(TRUE);
       prvvTIMERExpiredISR();
+      leds[RX_G].state = LED_OFF;
       vMBPortSetWithinException(FALSE);
     }
 }

+ 7 - 3
shared/freemodbus/port/tim_delay.c

@@ -1,5 +1,6 @@
 #include "at32f403a_407.h"
 #include "tim_delay.h"
+#include "mux.h"
 
 
 static bool tx_enable = false;
@@ -63,11 +64,14 @@ void TMR6_GLOBAL_IRQHandler(void)
     if(tmr_flag_get(TMR6, TMR_OVF_FLAG) != RESET)
     {
         tmr_flag_clear(TMR6, TMR_OVF_FLAG);
-        if (tx_enable)
+        if (tx_enable) {
             usart_interrupt_enable(USART3, USART_TDBE_INT, TRUE);
-        else
+            leds[TX_R].state = LED_ON;
+        }
+        else {
             gpio_bits_reset(GPIOD, GPIO_PINS_10);
-        
+            leds[TX_R].state = LED_OFF;
+        }
         mb_helper_tim_disable();
     }
 }

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels