Вс дек 29, 2019 14:59:22
Пн дек 30, 2019 14:48:50
казнить нельзя помиловать __enable_irq ();ivan dimir писал(а):работает в основном цикле не работает в прерывании в чём дело не понимаю
Пн дек 30, 2019 17:48:22
Пн дек 30, 2019 18:20:51
Пн дек 30, 2019 19:09:19
ADC1->SR &=~ ADC_SR_EOC;
ADC1->SR =~ ADC_SR_EOC;
Пн дек 30, 2019 19:15:30
Пн дек 30, 2019 19:34:07
Во вторых, &= это чтение, побитовое И, запись, т.е. лишние команды без необходимости (запись 1 в регистр статуса никак не влияет на содержимое).ivan dimir писал(а):а почему в Hal это работает?
Пн дек 30, 2019 20:05:59
Пн дек 30, 2019 20:10:31
Я объяснил почему. Что значит не работает? Сброса флага нет или что?ivan dimir писал(а):Я думаю никаких косяков нет.Ваш вариант не работает
Пн дек 30, 2019 20:28:10
Чт янв 02, 2020 19:26:09
Пт янв 10, 2020 04:52:35
Вс янв 12, 2020 22:02:40
Вс мар 29, 2020 22:02:45
Пн мар 30, 2020 12:25:39
/*----------
* файл adc.c
* работа с АЦП
*----------*/
#include "stm32f4xx.h"
#include "stm32f446_it.h"
#include "adc.h"
#include "messages.h"
#include "button.h"
#include "global.h"
#define ADC_START_PERIOD (100) // период запуска АЦП
#define BATTERY_WAIT_TO_START (1000) // время между включением питания и включением делителя напряжения батареи
#define BATTERY_WAIT_TO_MEASURE (1000) // время между включением делителя и началом слежения за батареей
#define BATTERY_PERIOD (1000) // период запуска программы напряжения батареи
#define V_REF (322) // напряжение питания 3,20В
#define N_MAX (0x0FFF) // максимальное число от АЦП
// определения портов контроллера
#define V_ACC_ON_0 (GPIOB->BSRR = GPIO_BSRR_BR_2)
#define V_ACC_ON_1 (GPIOB->BSRR = GPIO_BSRR_BS_2)
#define V_ACC_ON(a) (a ? V_ACC_ON_1 : V_ACC_ON_0)
int16_t adc_buttons; // значение АЦП кнопок
static int16_t adc_battery; // значение АЦП батареи
/*******************************************************************************
* Инициализация АЦП
* Подключение:
* PB0 - SW (ADC1_IN8)
* PB1 - V_ACC (ADC1_IN9)
* Режим: два инжектированных канала
*******************************************************************************/
void adc_init (void)
{
ADC1->CR1 = ADC_CR1_AWDCH_0 * 0 /*!<AWDCH[4:0] bits (Analog watchdog channel select bits) */
| ADC_CR1_AWDCH_1 * 0
| ADC_CR1_AWDCH_2 * 0
| ADC_CR1_AWDCH_3 * 0
| ADC_CR1_AWDCH_4 * 0
| ADC_CR1_EOCIE * 0 /*!<Interrupt enable for EOC */
| ADC_CR1_AWDIE * 0 /*!<AAnalog Watchdog interrupt enable */
| ADC_CR1_JEOCIE * 1 /*!<Interrupt enable for injected channels */
| ADC_CR1_SCAN * 1 /*!<Scan mode */
| ADC_CR1_AWDSGL * 0 /*!<Enable the watchdog on a single channel in scan mode */
| ADC_CR1_JAUTO * 1 /*!<Automatic injected group conversion */
| ADC_CR1_DISCEN * 0 /*!<Discontinuous mode on regular channels */
| ADC_CR1_JDISCEN * 1 /*!<Discontinuous mode on injected channels */
| ADC_CR1_DISCNUM_0 * 1 /*!<Bit 0 *//*!<DISCNUM[2:0] bits (Discontinuous mode channel count) */
| ADC_CR1_DISCNUM_1 * 0 /*!<Bit 1 */
| ADC_CR1_DISCNUM_2 * 0 /*!<Bit 2 */ // 001 - 2 канала
| ADC_CR1_JAWDEN * 0 /*!<Analog watchdog enable on injected channels */
| ADC_CR1_AWDEN * 0 /*!<Analog watchdog enable on regular channels */
| ADC_CR1_RES_0 * 0 /*!<Bit 0 */ /*!<RES[2:0] bits (Resolution) */
| ADC_CR1_RES_1 * 0 /*!<Bit 1 */ // 00-12 бит
| ADC_CR1_OVRIE * 0; /*!<overrun interrupt enable */
ADC1->CR2 = ADC_CR2_ADON * 1 /*!<A/D Converter ON / OFF */
| ADC_CR2_CONT * 0 /*!<Continuous Conversion */
| ADC_CR2_DMA * 0 /*!<Direct Memory access mode */
| ADC_CR2_DDS * 0 /*!<DMA disable selection (Single ADC) */
| ADC_CR2_EOCS * 0 /*!<End of conversion selection */
| ADC_CR2_ALIGN * 0 /*!<Data Alignment 0: Right alignment */
| ADC_CR2_JEXTSEL_0 * 0 /*!<Bit 0 */
| ADC_CR2_JEXTSEL_1 * 0 /*!<Bit 1 */
| ADC_CR2_JEXTSEL_2 * 0 /*!<Bit 2 */
| ADC_CR2_JEXTSEL_3 * 0 /*!<Bit 3 */
| ADC_CR2_JEXTEN_0 * 0 /*!<Bit 0 */
| ADC_CR2_JEXTEN_1 * 0 /*!<Bit 1 */
| ADC_CR2_JSWSTART * 1 /*!<Start Conversion of injected channels */
| ADC_CR2_EXTSEL_0 * 0 /*!<Bit 0 */
| ADC_CR2_EXTSEL_1 * 0 /*!<Bit 1 */
| ADC_CR2_EXTSEL_2 * 0 /*!<Bit 2 */
| ADC_CR2_EXTSEL_3 * 0 /*!<Bit 3 */
| ADC_CR2_EXTEN_0 * 0 /*!<Bit 0 */
| ADC_CR2_EXTEN_1 * 0 /*!<Bit 1 */
| ADC_CR2_SWSTART * 0; /*!<Start Conversion of regular channels */
ADC1->SMPR1 = 0;
ADC1->SMPR2 = ADC_SMPR2_SMP8_0 * 0 /*!<Bit 0 */
| ADC_SMPR2_SMP8_1 * 0 /*!<Bit 1 */
| ADC_SMPR2_SMP8_2 * 1 /*!<Bit 2 100: 84 cycles */
| ADC_SMPR2_SMP9_0 * 0 /*!<Bit 0 */
| ADC_SMPR2_SMP9_1 * 0 /*!<Bit 1 */
| ADC_SMPR2_SMP9_2 * 1; /*!<Bit 2 */
ADC1->SQR1 = ADC_SQR1_L_0 * 0 /*!<Bit 0 *//*!<L[3:0] bits (Regular channel sequence length) */
| ADC_SQR1_L_1 * 0 /*!<Bit 1 */
| ADC_SQR1_L_2 * 0 /*!<Bit 2 */
| ADC_SQR1_L_3 * 0; /*!<Bit 3 */ // 0000 - 1 канал
ADC1->SQR2 = 0;
ADC1->SQR3 = 0;
ADC1->JSQR = ADC_JSQR_JSQ3_0 * 0 /*!<Bit 0 */ /*!<JSQ1[4:0] bits (1st conversion in injected sequence) */
| ADC_JSQR_JSQ3_1 * 0 /*!<Bit 1 */
| ADC_JSQR_JSQ3_2 * 0 /*!<Bit 2 */
| ADC_JSQR_JSQ3_3 * 1 /*!<Bit 3 */ // 3-й канал номер 8
| ADC_JSQR_JSQ3_4 * 0 /*!<Bit 4 */
| ADC_JSQR_JSQ4_0 * 1 /*!<Bit 0 */ /*!<JSQ2[4:0] bits (2nd conversion in injected sequence) */
| ADC_JSQR_JSQ4_1 * 0 /*!<Bit 1 */
| ADC_JSQR_JSQ4_2 * 0 /*!<Bit 2 */
| ADC_JSQR_JSQ4_3 * 1 /*!<Bit 3 */ // 4-й канал номер 9
| ADC_JSQR_JSQ4_4 * 0 /*!<Bit 4 */
| ADC_JSQR_JL_0 * 1 /*!<Bit 0 */ /*!<JL[1:0] bits (Injected Sequence length) */
| ADC_JSQR_JL_1 * 0; /*!<Bit 1 */ // 01 - 2 измерения
ADC->CCR = ADC_CCR_MULTI_0 * 0 /*!<Bit 0 */ /*!<MULTI[4:0] bits (Multi-ADC mode selection) */
| ADC_CCR_MULTI_1 * 0 /*!<Bit 1 */
| ADC_CCR_MULTI_2 * 0 /*!<Bit 2 */
| ADC_CCR_MULTI_3 * 0 /*!<Bit 3 */
| ADC_CCR_MULTI_4 * 0 /*!<Bit 4 */ // 00000 - Independent mode
| ADC_CCR_DDS * 0 /*!<DMA disable selection (Multi-ADC mode) */
| ADC_CCR_ADCPRE_0 * 1 /*!<Bit 0 */ /*!<ADCPRE[1:0] bits (ADC prescaler) */
| ADC_CCR_ADCPRE_1 * 1 /*!<Bit 1 */ // 11 - делитель на 8 APB2(90МГЦ)/8= 11,25МГц
| ADC_CCR_VBATE * 0 /*!<VBAT Enable */
| ADC_CCR_TSVREFE * 0; /*!<Temperature Sensor and VREFINT Enable */
// разрешение прерываний в контроллере прерываний
}
/*******************************************************************************
* прерывание АЦП
*
*******************************************************************************/
#pragma call_graph_root = "interrupt" // interrupt category
void ADC_IRQHandler (void)
{
if (ADC1->SR & ADC_SR_JEOC)
{
ADC1->SR = 0; //~ADC_SR_JEOC; // сброс флага
adc_buttons = (int16_t)ADC1->JDR1; // запись значений АЦП
adc_battery = (int16_t)ADC1->JDR2;
send_message (M_ADC_READY); // обработать данные
}
}
/*******************************************************************************
* функция работы АЦП
* Период запуска - 100 мс
* После окончания измерения запускается функция обработки кнопок
* Выход - сообщения
*******************************************************************************/
void adc_func (void)
{
typedef enum _adc_func_states
{
ADC_FUNC_INIT = 0,
ADC_FUNC_WORK
} adc_func_states;
static adc_func_states adc_func_state = ADC_FUNC_INIT;
static uint32_t adc_timer = 0;
switch (adc_func_state)
{
case ADC_FUNC_INIT:
adc_init ();
adc_func_state = ADC_FUNC_WORK;
V_ACC_ON (1);
break;
case ADC_FUNC_WORK:
if ((system_time () - adc_timer) >= ADC_START_PERIOD)
{
adc_timer = system_time ();
ADC1->CR2 |= ADC_CR2_JSWSTART; // раз в 100 мс запустить АЦП
}
if (get_message (M_ADC_READY))
{
button_func (); // после измерения обработать кнопки
g.v_battery = (adc_battery * V_REF * 2) / N_MAX; // вычислить напряжение батареи
}
break;
default:
adc_func_state = ADC_FUNC_INIT;
break;
}
}
/*******************************************************************************
* Измерение напряжения батареи
* Вход - данные adc_battery
* один раз в секунду запускается функция слежения за напряжением питания.
* Выход - сообщение M_OFF и уровень заряда батареи в g.battery
*******************************************************************************/
void battery_func (void)
{
}
/*----------
* Конфигурация RCC кварц 12288000Гц Частота процессора 179.931МГц
* Частота SysTick 179.931МГц Частота периферии 45МГц
*----------*/
#include "stm32f4xx.h"
#include "system_stm32f4xx.h"
#include "stm32f446_it.h"
#include "global.h"
#include "pll_modes.h"
#include "init.h"
#include "messages.h"
#include "adc.h"
#include "test.h"
int main()
{
RCC_ClocksTypeDef RCC_Clocks;
SystemInit (); // from startup files startup_stm32f429_439xx.s, refer to system_stm32f4xx.c
SystemCoreClockUpdate (); // установка тактирования
RCC_GetClocksFreq (&RCC_Clocks); // получить текущие значения частот и тактирования
GPIO_init (); // конфигурация выводов процессора
RCC_ClockSecuritySystemCmd(ENABLE); // Enable Clock Security System(CSS): this will generate an NMI exception when HSE clock fails
init_irq ();
SysTick_Config ((RCC_Clocks.HCLK_Frequency / 1000) - 1); // конфигурация системного таймера 1000 Гц (1 мс)
init_midi ();
uart_ext_init (115200);
esp8266_uart_init (115200);
init_messages ();
init_variables ();
while (1)
{
adc_func (); // работа с АЦП. Кнопки
test_func (); // тесты системы
process_messages ();
}
}
/*******************************************************************************
* Инициализация переменных
*******************************************************************************/
void init_variables (void)
{
}
Пн мар 30, 2020 17:22:49
Ср апр 08, 2020 02:03:31
/*----------
* файл adc.c
* работа с АЦП
*----------*/
#include "stm32f4xx.h"
#include "stm32f446_it.h"
#include "adc.h"
#include "messages.h"
#include "button.h"
#include "global.h"
#define ADC_START_PERIOD (100) // период запуска АЦП
#define BATTERY_WAIT_TO_START (1000) // время между включением питания и включением делителя напряжения батареи
#define BATTERY_WAIT_TO_MEASURE (1000) // время между включением делителя и началом слежения за батареей
#define BATTERY_PERIOD (1000) // период запуска программы напряжения батареи
#define V_REF (322) // напряжение питания 3,20В
#define N_MAX (0x0FFF) // максимальное число от АЦП
// определения портов контроллера
#define V_ACC_ON_0 (GPIOB->BSRR = GPIO_BSRR_BR_2)
#define V_ACC_ON_1 (GPIOB->BSRR = GPIO_BSRR_BS_2)
#define V_ACC_ON(a) (a ? V_ACC_ON_1 : V_ACC_ON_0)
int16_t adc_buttons; // значение АЦП кнопок
static int16_t adc_battery; // значение АЦП батареи
/*******************************************************************************
* Инициализация АЦП
* Подключение:
* PB0 - SW (ADC1_IN8)
* PB1 - V_ACC (ADC1_IN9)
* Режим: два инжектированных канала
*******************************************************************************/
void adc_init (void)
{
ADC1->CR1 = ADC_CR1_AWDCH_0 * 0 /*!<AWDCH[4:0] bits (Analog watchdog channel select bits) */
| ADC_CR1_AWDCH_1 * 0
| ADC_CR1_AWDCH_2 * 0
| ADC_CR1_AWDCH_3 * 0
| ADC_CR1_AWDCH_4 * 0
| ADC_CR1_EOCIE * 0 /*!<Interrupt enable for EOC */
| ADC_CR1_AWDIE * 0 /*!<AAnalog Watchdog interrupt enable */
| ADC_CR1_JEOCIE * 1 /*!<Interrupt enable for injected channels */
| ADC_CR1_SCAN * 1 /*!<Scan mode */
| ADC_CR1_AWDSGL * 0 /*!<Enable the watchdog on a single channel in scan mode */
| ADC_CR1_JAUTO * 1 /*!<Automatic injected group conversion */
| ADC_CR1_DISCEN * 0 /*!<Discontinuous mode on regular channels */
| ADC_CR1_JDISCEN * 1 /*!<Discontinuous mode on injected channels */
| ADC_CR1_DISCNUM_0 * 1 /*!<Bit 0 *//*!<DISCNUM[2:0] bits (Discontinuous mode channel count) */
| ADC_CR1_DISCNUM_1 * 0 /*!<Bit 1 */
| ADC_CR1_DISCNUM_2 * 0 /*!<Bit 2 */ // 001 - 2 канала
| ADC_CR1_JAWDEN * 0 /*!<Analog watchdog enable on injected channels */
| ADC_CR1_AWDEN * 0 /*!<Analog watchdog enable on regular channels */
| ADC_CR1_RES_0 * 0 /*!<Bit 0 */ /*!<RES[2:0] bits (Resolution) */
| ADC_CR1_RES_1 * 0 /*!<Bit 1 */ // 00-12 бит
| ADC_CR1_OVRIE * 0; /*!<overrun interrupt enable */
ADC1->CR2 = ADC_CR2_ADON * 1 /*!<A/D Converter ON / OFF */
| ADC_CR2_CONT * 0 /*!<Continuous Conversion */
| ADC_CR2_DMA * 0 /*!<Direct Memory access mode */
| ADC_CR2_DDS * 0 /*!<DMA disable selection (Single ADC) */
| ADC_CR2_EOCS * 0 /*!<End of conversion selection */
| ADC_CR2_ALIGN * 0 /*!<Data Alignment 0: Right alignment */
| ADC_CR2_JEXTSEL_0 * 0 /*!<Bit 0 */
| ADC_CR2_JEXTSEL_1 * 0 /*!<Bit 1 */
| ADC_CR2_JEXTSEL_2 * 0 /*!<Bit 2 */
| ADC_CR2_JEXTSEL_3 * 0 /*!<Bit 3 */
| ADC_CR2_JEXTEN_0 * 0 /*!<Bit 0 */
| ADC_CR2_JEXTEN_1 * 0 /*!<Bit 1 */
| ADC_CR2_JSWSTART * 1 /*!<Start Conversion of injected channels */
| ADC_CR2_EXTSEL_0 * 0 /*!<Bit 0 */
| ADC_CR2_EXTSEL_1 * 0 /*!<Bit 1 */
| ADC_CR2_EXTSEL_2 * 0 /*!<Bit 2 */
| ADC_CR2_EXTSEL_3 * 0 /*!<Bit 3 */
| ADC_CR2_EXTEN_0 * 0 /*!<Bit 0 */
| ADC_CR2_EXTEN_1 * 0 /*!<Bit 1 */
| ADC_CR2_SWSTART * 0; /*!<Start Conversion of regular channels */
ADC1->SMPR1 = 0;
ADC1->SMPR2 = ADC_SMPR2_SMP8_0 * 0 /*!<Bit 0 */
| ADC_SMPR2_SMP8_1 * 0 /*!<Bit 1 */
| ADC_SMPR2_SMP8_2 * 1 /*!<Bit 2 100: 84 cycles */
| ADC_SMPR2_SMP9_0 * 0 /*!<Bit 0 */
| ADC_SMPR2_SMP9_1 * 0 /*!<Bit 1 */
| ADC_SMPR2_SMP9_2 * 1; /*!<Bit 2 */
ADC1->SQR1 = ADC_SQR1_L_0 * 0 /*!<Bit 0 *//*!<L[3:0] bits (Regular channel sequence length) */
| ADC_SQR1_L_1 * 0 /*!<Bit 1 */
| ADC_SQR1_L_2 * 0 /*!<Bit 2 */
| ADC_SQR1_L_3 * 0; /*!<Bit 3 */ // 0000 - 1 канал
ADC1->SQR2 = 0;
ADC1->SQR3 = 0;
ADC1->JSQR = ADC_JSQR_JSQ3_0 * 0 /*!<Bit 0 */ /*!<JSQ1[4:0] bits (1st conversion in injected sequence) */
| ADC_JSQR_JSQ3_1 * 0 /*!<Bit 1 */
| ADC_JSQR_JSQ3_2 * 0 /*!<Bit 2 */
| ADC_JSQR_JSQ3_3 * 1 /*!<Bit 3 */ // 3-й канал номер 8
| ADC_JSQR_JSQ3_4 * 0 /*!<Bit 4 */
| ADC_JSQR_JSQ4_0 * 1 /*!<Bit 0 */ /*!<JSQ2[4:0] bits (2nd conversion in injected sequence) */
| ADC_JSQR_JSQ4_1 * 0 /*!<Bit 1 */
| ADC_JSQR_JSQ4_2 * 0 /*!<Bit 2 */
| ADC_JSQR_JSQ4_3 * 1 /*!<Bit 3 */ // 4-й канал номер 9
| ADC_JSQR_JSQ4_4 * 0 /*!<Bit 4 */
| ADC_JSQR_JL_0 * 1 /*!<Bit 0 */ /*!<JL[1:0] bits (Injected Sequence length) */
| ADC_JSQR_JL_1 * 0; /*!<Bit 1 */ // 01 - 2 измерения
ADC->CCR = ADC_CCR_MULTI_0 * 0 /*!<Bit 0 */ /*!<MULTI[4:0] bits (Multi-ADC mode selection) */
| ADC_CCR_MULTI_1 * 0 /*!<Bit 1 */
| ADC_CCR_MULTI_2 * 0 /*!<Bit 2 */
| ADC_CCR_MULTI_3 * 0 /*!<Bit 3 */
| ADC_CCR_MULTI_4 * 0 /*!<Bit 4 */ // 00000 - Independent mode
| ADC_CCR_DDS * 0 /*!<DMA disable selection (Multi-ADC mode) */
| ADC_CCR_ADCPRE_0 * 1 /*!<Bit 0 */ /*!<ADCPRE[1:0] bits (ADC prescaler) */
| ADC_CCR_ADCPRE_1 * 1 /*!<Bit 1 */ // 11 - делитель на 8 APB2(90МГЦ)/8= 11,25МГц
| ADC_CCR_VBATE * 0 /*!<VBAT Enable */
| ADC_CCR_TSVREFE * 0; /*!<Temperature Sensor and VREFINT Enable */
// разрешение прерываний в контроллере прерываний
}
/*******************************************************************************
* прерывание АЦП
*
*******************************************************************************/
#pragma call_graph_root = "interrupt" // interrupt category
void ADC_IRQHandler (void)
{
if (ADC1->SR & ADC_SR_JEOC)
{
ADC1->SR = 0; //~ADC_SR_JEOC; // сброс флага
adc_buttons = (int16_t)ADC1->JDR1; // запись значений АЦП
adc_battery = (int16_t)ADC1->JDR2;
send_message (M_ADC_READY); // обработать данные
}
}
/*******************************************************************************
* функция работы АЦП
* Период запуска - 100 мс
* После окончания измерения запускается функция обработки кнопок
* Выход - сообщения
*******************************************************************************/
void adc_func (void)
{
typedef enum _adc_func_states
{
ADC_FUNC_INIT = 0,
ADC_FUNC_WORK
} adc_func_states;
static adc_func_states adc_func_state = ADC_FUNC_INIT;
static uint32_t adc_timer = 0;
switch (adc_func_state)
{
case ADC_FUNC_INIT:
adc_init ();
adc_func_state = ADC_FUNC_WORK;
V_ACC_ON (1);
break;
case ADC_FUNC_WORK:
if ((system_time () - adc_timer) >= ADC_START_PERIOD)
{
adc_timer = system_time ();
ADC1->CR2 |= ADC_CR2_JSWSTART; // раз в 100 мс запустить АЦП
}
if (get_message (M_ADC_READY))
{
button_func (); // после измерения обработать кнопки
g.v_battery = (adc_battery * V_REF * 2) / N_MAX; // вычислить напряжение батареи
}
break;
default:
adc_func_state = ADC_FUNC_INIT;
break;
}
}
/*******************************************************************************
* Измерение напряжения батареи
* Вход - данные adc_battery
* один раз в секунду запускается функция слежения за напряжением питания.
* Выход - сообщение M_OFF и уровень заряда батареи в g.battery
*******************************************************************************/
void battery_func (void)
{
}
/*----------
* Конфигурация RCC кварц 12288000Гц Частота процессора 179.931МГц
* Частота SysTick 179.931МГц Частота периферии 45МГц
*----------*/
#include "stm32f4xx.h"
#include "system_stm32f4xx.h"
#include "stm32f446_it.h"
#include "global.h"
#include "pll_modes.h"
#include "init.h"
#include "messages.h"
#include "adc.h"
#include "test.h"
int main()
{
RCC_ClocksTypeDef RCC_Clocks;
SystemInit (); // from startup files startup_stm32f429_439xx.s, refer to system_stm32f4xx.c
SystemCoreClockUpdate (); // установка тактирования
RCC_GetClocksFreq (&RCC_Clocks); // получить текущие значения частот и тактирования
GPIO_init (); // конфигурация выводов процессора
RCC_ClockSecuritySystemCmd(ENABLE); // Enable Clock Security System(CSS): this will generate an NMI exception when HSE clock fails
init_irq ();
SysTick_Config ((RCC_Clocks.HCLK_Frequency / 1000) - 1); // конфигурация системного таймера 1000 Гц (1 мс)
init_midi ();
uart_ext_init (115200);
esp8266_uart_init (115200);
init_messages ();
init_variables ();
while (1)
{
adc_func (); // работа с АЦП. Кнопки
test_func (); // тесты системы
process_messages ();
}
}
/*******************************************************************************
* Инициализация переменных
*******************************************************************************/
void init_variables (void)
{
}
Как то у вас всё вместе.И настройка регулярных каналов и инжекторных?
Чт апр 09, 2020 10:25:29
Вт апр 14, 2020 13:18:35