Quellcode durchsuchen

Промежуточный коммит.

TelenkovDmitry vor 7 Monaten
Ursprung
Commit
22308a94b0

+ 40 - 7
fw/modules/io/analog_input.c

@@ -8,11 +8,13 @@
 #include "adc_transport.h"
 #include "ms5192t.h"
 #include "monitoring.h"
+#include "mux.h"
 #include <stdio.h>
 
 #undef DBG
 #define DBG if(1)
 
+#if defined (MAI_12)  
 
 uint8_t ai_mux;     // выход сдвигового регистра U1010 (управляет MUX 301, 401)
                     // мультиплексоры отвечат за коммутацию аналоговых входов и АЦП
@@ -33,20 +35,29 @@ ANALOG_IN_t channel_name[NUMBER_ADC_CH] = {AN_INP_1, AN_INP_2, AN_INP_3,
 
 uint16_t adc_raw_data[NUMBER_ADC_CH];
 
-//en_crnt_alrm_in
-
+led_t ai_alarm_led[12] = {IO_1_R, IO_2_R, IO_3_R, IO_4_R, 
+                          IO_5_R, IO_6_R, IO_7_R, IO_8_R, 
+                          IO_9_R, IO_10_R, IO_11_R, IO_12_R};
 
 
+//
+void ai_init(void)
+{
+    sh_init();          // Сдвиговые регистры
+    ai_set_meas_mode(); // Режим измерения
+    ai_ext_sens_power(settings.ext_sens_power); // Питание внешних датчиков
+    ai_adc_init();      // Внешинй ADC
+}
 
 // Установить режим измерения каналов с 1 по 12.
 void ai_set_meas_mode(void)
 {
-    uint8_t bit = 0;
-    
     for (uint8_t i = 1; i < 13; i++)
     {
-        bit = settings.ai_mode_bits & (1 << (i - 1));
-        ai_set_mode_word((MEAS_CHAN_MODE_t)bit, i);
+        if (settings.ai_mode_bits & (1 << (i - 1)))
+            ai_set_mode_word((MEAS_CHAN_MODE_t)1, i);
+        else
+            ai_set_mode_word((MEAS_CHAN_MODE_t)0, i);
     }
 }   
 
@@ -184,7 +195,11 @@ void adc_task(void *params)
     for (;;)
     {
         ai_alarm = sh_ai_mode(ai_mode);
+        
         ai_processing();
+        
+        ai_leds_processing();
+        
         vTaskDelay(10);
     }
 }
@@ -283,6 +298,24 @@ void ai_ext_sens_power(uint16_t state)
 {
     if (state)
         ai_mux |= 0x80;
+    else
+        ai_mux &= ~(0x80);
+}
+
+// Управления LED
+void ai_leds_processing(void)
+{
+    //uint16_t foo = 0x800;
+    
+    // Управление индикацией аварий (12 красных LED) (слово ai_alarm)
+    for (uint8_t i = 0; i < AI_NUMBER; i++) {
+        if (ai_alarm & (1 << i)) {
+            leds[ai_alarm_led[i]].state = LED_ON;
+        }
+        else {
+            leds[ai_alarm_led[i]].state = LED_OFF;
+        }
+    }
 }
 
 //
@@ -316,4 +349,4 @@ void ai_mode_test(void)
     }
 }
 
-
+#endif

+ 7 - 0
fw/modules/io/analog_input.h

@@ -41,6 +41,10 @@ typedef enum
     
 } ANALOG_IN_t;
 
+
+//
+void ai_init(void);
+
 //
 void ai_set_meas_mode(void);
 
@@ -71,6 +75,9 @@ void ai_set_mode_word(MEAS_CHAN_MODE_t mode, uint8_t channel);
 //
 void ai_ext_sens_power(uint16_t state);
 
+//
+void ai_leds_processing(void);
+
 //
 void ai_connect_test(void);
 

+ 21 - 0
fw/modules/io/analog_output.c

@@ -0,0 +1,21 @@
+#include "at32f403a_407.h"
+#include "analog_output.h"
+#include "shift_reg.h"
+#include "utility.h"
+#include "FreeRTOS.h"
+#include "task.h"
+#include "settings_api.h"
+#include "ms5192t.h"
+#include "monitoring.h"
+#include "mux.h"
+#include <stdio.h>
+
+#undef DBG
+#define DBG if(1)
+
+#if defined (MAO_8)
+
+
+
+
+#endif

+ 9 - 0
fw/modules/io/analog_output.h

@@ -0,0 +1,9 @@
+#ifndef __ANALOG_OUTPUT_H
+#define __ANALOG_OUTPUT_H
+
+#include <stdbool.h>
+
+
+
+#endif  // __ANALOG_OUTPUT_H
+

+ 5 - 3
fw/modules/io/mux.c

@@ -89,9 +89,11 @@ mux_channel_t leds[LED_NUMBER] = {
 
 #else
 //# defined (MAO_8)
-mux_channel_t leds[1] = {
-                                  {INP_1, {0, 0, 0}, LED_OFF, 0},
-                                 };
+
+#if 1
+mux_channel_t leds[1];
+#endif
+
 #endif
 
 //

+ 5 - 4
fw/modules/io/mux.h

@@ -69,8 +69,9 @@ typedef enum
     OUT_8_G,
       
 } led_t;
+#endif
 
-#elif defined(MAI_12)
+#if defined(MAI_12)
 
 #define LED_NUMBER      28
 
@@ -112,11 +113,11 @@ typedef enum
     IO_12_R,
     
 } led_t;
+#endif
 
-//#elif defined (MAO_8)
-#else
+#if defined (MAO_8)
 
-#define LED_NUMBER      28
+#define LED_NUMBER      12
 
 typedef enum
 {

+ 16 - 0
fw/modules/modbus/modbus_ai_params.c

@@ -180,6 +180,15 @@ uint16_t mb_init_ai_params(uint16_t i)
     
     index++;
     
+    mb_param[index].reg = 0x0320;
+	mb_param[index].size = 1;
+	mb_param[index].param = (uint8_t*)&settings.ext_sens_power;
+	mb_param[index].set = mb_set_ext_sens_power;
+    mb_param[index].get = NULL;
+    mb_param[index].check_handler = mb_check_dummy;
+    
+    index++;
+    
     return index;
 }
 
@@ -195,5 +204,12 @@ mb_delay_action_t mb_set_ai_mode(void)
     return MB_SAVE_SETTINGS;
 }
 
+//
+mb_delay_action_t mb_set_ext_sens_power(void)
+{
+    ai_ext_sens_power(settings.ext_sens_power);
+    return MB_SAVE_SETTINGS;
+}
+
 
 #endif

+ 3 - 0
fw/modules/modbus/modbus_ai_params.h

@@ -24,6 +24,9 @@ uint16_t mb_init_ai_params(uint16_t i);
 //
 mb_delay_action_t mb_set_ai_mode(void);
 
+//
+mb_delay_action_t mb_set_ext_sens_power(void);
+
 
 #ifdef __cplusplus
 }

+ 5 - 1
fw/modules/modbus/modbus_params.h

@@ -17,7 +17,11 @@ extern "C" {
 
 #if defined (MAI_12)  
 #define MB_PARAM_MAX			87  
-#endif  
+#endif
+
+#if defined (MAO_8)
+#define MB_PARAM_MAX			87
+#endif
 
 
 //

+ 5 - 1
fw/modules/settings/settings_ai.c

@@ -3,6 +3,8 @@
 #include "settings_ai.h"
 
 
+#if defined (MAI_12)
+
 //
 void settings_ai_set_all_default(void)
 {
@@ -23,4 +25,6 @@ void settings_ai_def(settings_t *settings)
 void settings_ext_sens_power_def(settings_t *settings)
 {
     settings->ext_sens_power = 0;
-}
+}
+
+#endif

+ 3 - 0
fw/modules/settings/settings_ai.h

@@ -10,6 +10,9 @@ void settings_ai_set_all_default(void);
 //
 void settings_ai_def(settings_t *settings);
 
+//
+void settings_ext_sens_power_def(settings_t *settings);
+
 
 #endif /* #ifndef SETTINGS_AI_API_H */
 

+ 16 - 5
fw/modules/shift_reg/shift_reg.c

@@ -63,6 +63,8 @@ void sh_init(void)
     gpio_initstructure.gpio_pins           = GPIO_PINS_3;
     gpio_init(GPIOD, &gpio_initstructure); 
         
+    gpio_bits_reset(GPIOD, GPIO_PINS_0 | GPIO_PINS_1 | GPIO_PINS_3);
+    
     crm_periph_clock_enable(CRM_SPI2_PERIPH_CLOCK, TRUE);
     
     spi_default_para_init(&spi_init_struct);
@@ -87,6 +89,7 @@ void sh_init(void)
 uint16_t sh_ai_mode(uint16_t val)
 {
     uint16_t ret = 0;
+    uint16_t tmp = 0;
     
     // Данные отправлеяются во второй регистр U402
     while (spi_i2s_flag_get(SH_SPI, SPI_I2S_TDBE_FLAG) == RESET);
@@ -94,7 +97,8 @@ uint16_t sh_ai_mode(uint16_t val)
   
     // Данные из второго регистра U400
     while (spi_i2s_flag_get(SH_SPI, SPI_I2S_RDBF_FLAG) == RESET);
-    ret = SH_SPI->dt & 0x3F;
+    tmp = SH_SPI->dt;
+    ret = tmp & 0x3F;
 
     // Данные отправлеяются во второй регистр U302
     while (spi_i2s_flag_get(SH_SPI, SPI_I2S_TDBE_FLAG) == RESET);
@@ -102,7 +106,7 @@ uint16_t sh_ai_mode(uint16_t val)
   
     // Данные из первого регистра U300
     while (spi_i2s_flag_get(SH_SPI, SPI_I2S_RDBF_FLAG) == RESET);
-    ret |= (SH_SPI->dt & 0x3F) << 8;
+    ret |= (SH_SPI->dt & 0x3F) << 6;
     
     gpio_bits_set(GPIOD, GPIO_PINS_0 | GPIO_PINS_1);
     nop(10);
@@ -115,14 +119,21 @@ uint16_t sh_ai_mode(uint16_t val)
 // Подключает выбранный канал к АЦП
 void sh_ai_connect(uint16_t val)
 {
-    //uint16_t ret;
+    uint16_t ret;
+    
+    while (spi_i2s_flag_get(SH_SPI, SPI_I2S_TDBE_FLAG) == RESET);
+    SH_SPI->dt = val;
+#if 0  
+    while (spi_i2s_flag_get(SH_SPI, SPI_I2S_RDBF_FLAG) == RESET);
+    ret = SH_SPI->dt;
     
     while (spi_i2s_flag_get(SH_SPI, SPI_I2S_TDBE_FLAG) == RESET);
     SH_SPI->dt = val;
-/*  
+    
     while (spi_i2s_flag_get(SH_SPI, SPI_I2S_RDBF_FLAG) == RESET);
     ret = SH_SPI->dt;
-*/    
+#endif    
+    
     gpio_bits_set(GPIOD, GPIO_PINS_3);
     nop(100);
     gpio_bits_reset(GPIOD, GPIO_PINS_3);

+ 6 - 1
fw/modules/testing/soft_test.c

@@ -3,6 +3,7 @@
 #include "FreeRTOS.h"
 #include "task.h"
 #include "digital_input.h"
+#include "mux.h"
 #include <stdio.h>
 
 
@@ -10,6 +11,8 @@ void test_hw_task(void *argument)
 {
     for (;;)
     {
+      
+#if 0      
         vTaskDelay(1000);
               
         printf("\r\n");
@@ -17,8 +20,10 @@ void test_hw_task(void *argument)
         {
             printf("Channel: %u, state = %u\r\n", i + 1, di_get(i));
         }
+#endif
+
         
-#if 0      
+#if 1      
         vTaskDelay(100);
         
         mux_led_blink();

+ 10 - 18
fw/user/main.cpp

@@ -137,27 +137,15 @@ void init_task(void *argument)
     
 #if defined (MAI_12)    
     
-        //ai_connect_test();
-    //ai_mode_test();
-    //ai_connect_channel(V_ISO);  
-    //ai_connect_channel(AN_INP_1);  
-    //ai_connect_channel(AN_INP_7); 
-    
-    sh_init();          // Сдвиговые регистры
-    ai_set_meas_mode(); // Режим измерения из настроек
-    ai_adc_init();      // Внешинй ADC
-    
-    // Режим зимерения напряженния
-    //ai_mode_test();
-    
-    //ai_connect_channel(V_ISO_CL);
-    //ai_connect_channel(V_ISO);
-    
+    ai_init();    
     xTaskCreate(adc_task, "adc_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
+    
 #endif    
     
 #if defined (MAO_8)    
+    
     xTaskCreate(dac_task, "dac_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
+    
 #endif 
     
 // -------------------------------------------------------------------------- //
@@ -237,8 +225,7 @@ void init_task(void *argument)
     usb_eth_init();
 #endif 
     
-// Удаляем стартовую задачу 
-    vTaskDelete(NULL);
+
     
 // -------------------------------------------------------------------------- //        
 // Тесты
@@ -291,5 +278,10 @@ void init_task(void *argument)
     
     // Тесты GPIO
     //xTaskCreate(test_gpio, "gpio_task", 2*configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL);
+    
+// -------------------------------------------------------------------------- //
+// Удаляем стартовую задачу 
+    
+    vTaskDelete(NULL);
 }
 

BIN
output/fw.bin


Datei-Diff unterdrückt, da er zu groß ist
+ 397 - 377
project/ewarm/iap/iap.dep


Datei-Diff unterdrückt, da er zu groß ist
+ 747 - 1652
project/ewarm/module_universal_io.dep


+ 3 - 0
project/ewarm/module_universal_io.ewp

@@ -2185,6 +2185,9 @@
                 <file>
                     <name>$PROJ_DIR$\..\..\fw\modules\io\analog_input.c</name>
                 </file>
+                <file>
+                    <name>$PROJ_DIR$\..\..\fw\modules\io\analog_output.c</name>
+                </file>
                 <file>
                     <name>$PROJ_DIR$\..\..\fw\modules\io\digital_input.c</name>
                 </file>

+ 3 - 0
project/ewarm/module_universal_io.ewt

@@ -2393,6 +2393,9 @@
                 <file>
                     <name>$PROJ_DIR$\..\..\fw\modules\io\analog_input.c</name>
                 </file>
+                <file>
+                    <name>$PROJ_DIR$\..\..\fw\modules\io\analog_output.c</name>
+                </file>
                 <file>
                     <name>$PROJ_DIR$\..\..\fw\modules\io\digital_input.c</name>
                 </file>

BIN
tools/__pycache__/mb_registers.cpython-312.pyc


+ 11 - 5
tools/analog_in.py

@@ -52,6 +52,9 @@ class IO_AnalogInput(IO_Module):
     def set_inputs_mode(self, val):
         self.modbus.write_holding_register(AI_REGS['ain_mode'], val)
 
+    def set_ext_sens_power(self, val):
+        self.modbus.write_holding_register(AI_REGS['esens_pow'], val)
+
     '''Вывод параметров'''
     def print_raw_inputs(self):
         data = self.get_raw_inputs()
@@ -98,17 +101,20 @@ def main():
     
     modbus_tester = Modbus(serial_port, 1)
     # dev_tester = IO_Digital(modbus_tester)
-    ai = IO_AnalogInput(modbus_tester)
+    ai = IO_AnalogInput(modbus_tester) 
 
     '''Режим работы аналоговых входов'''
     # print(ai.get_inputs_mode())
-    ai.set_inputs_mode(0b000000001)
+    # ai.set_inputs_mode(0b00000)
     # print(ai.get_inputs_mode())
 
+    '''Питание внешних датчиков'''
+    # ai.set_ext_sens_power(1)
+
     '''Аварии аналоговых входов'''
-    for i in range(100):
-        print(ai.get_inputs_alarm())
-        sleep(1)
+    # for i in range(100):
+    #     print(ai.get_inputs_alarm())
+    #     sleep(1)
     # ai.get_raw_inputs()
     # ai.print_raw_inputs()
 

+ 3 - 3
tools/digital_io.py

@@ -179,7 +179,7 @@ class IO_DigitalTester:
 def main():
     colorama.init(autoreset=True)
     
-    serial_port = Serial('COM56', 115200, timeout=0.05, parity='N', xonxoff=False)
+    serial_port = Serial('COM24', 115200, timeout=0.05, parity='N', xonxoff=False)
     
     modbus_tester = Modbus(serial_port, 1)
     # dev_tester = IO_Digital(modbus_tester)
@@ -187,7 +187,7 @@ def main():
 
 
     '''Тесты отдельного модуля DIO'''
-    dio.sys.get_system_vars()
+    # dio.sys.get_system_vars()
 
     # dio.print_inputs()
     # dio.get_inputs_counters()
@@ -259,7 +259,7 @@ def main():
     # dev.print_inputs()
 
     '''Обновление'''
-    # dev.updater.update('fw.bin', 'MDIO-88')
+    dio.updater.update('fw.bin', 'MAI_12')
     
     
 if __name__ == '__main__':

BIN
tools/fw.bin


+ 1 - 1
tools/mb_registers.py

@@ -10,6 +10,6 @@ reg_table = {'out_cur': 0x0200, 'out_mode': 0x0202, 'out_mode_save': 0x0203, 'pw
 DIO_REGS = {'in_bits': 0x0100, 'in_cnt': 0x0102,'in_mode': 0x0120, 'in_norm': 0x0122,
             'in_deb_start': 0x124, 'load_bits': 0x0130, 'cred_bits': 0x0131, 'out_cur': 0x0200}
 
-AI_REGS = {'ain_mode': 0x0300, 'ain_alarm': 0x0301,'ain_raw': 0x0302}
+AI_REGS = {'ain_mode': 0x0300, 'ain_alarm': 0x0301, 'ain_raw': 0x0302, 'esens_pow': 0x0320}
 
 LOG_REGS = {'log_info': 0x0900, 'log_ent': 0x0901, 'arch_cap': 0x0902, 'arch_ent': 0x0903, 'arch_per': 0x0904}

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.