/* Настройка АЦП, обработка преобразований и первичная фильтрация измерений. Русские пояснения сохранены в UTF-8. */ /* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */ #include "DSP2833x_Device.h" // DSP281x Headerfile Include File /* Подключает "DSP2833x_Examples.h": поставляемое TI описание Examples для семейства C2833x. */ #include "DSP2833x_Examples.h" // DSP281x Examples Include File /* Подключает "DSP2833x_SWPrioritizedIsrLevels.h": поставляемое TI описание SWPrioritizedIsrLevels для семейства C2833x. */ #include "DSP2833x_SWPrioritizedIsrLevels.h" /* Подключает "ADC.h": настройка АЦП, обработка преобразований и первичная фильтрация измерений. */ #include "ADC.h" /* Подключает "log_to_mem.h": двухбанковый регистратор событий нагрузки во внешней RAM. */ #include "log_to_mem.h" /* Подключает "RS485.h": приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */ #include "RS485.h" /* Подключает "filter_bat2.h": накопительный фильтр измерительных каналов. */ #include "filter_bat2.h" /* Подключает "measure.h": обработка датчиков, вычисление величин и миллисекундный такт системы. */ #include "measure.h" /* Подключает "message.h": обработка Modbus, заводские параметры и сохранение настроек. */ #include "message.h" /* Подключает "package.h": адреса устройств, типы плат и псевдонимы технологических регистров. */ #include "package.h" /* Подключает "peripher.h": перемычки режима платы, дискретные входы и выходы. */ #include "peripher.h" /* Объявляет adc_table_lem — АЦП table lem. */ Uint16 adc_table_lem[4]; /* Объявляет ADC_table — АЦП table. */ Uint16 ADC_table[28]; // Потому что +4 калибр /* Объявляет prev_ok — данные prev_ok. */ Uint16 prev_ok[28]; /* Объявляет COUNT_ONE_CANAL — число ONE CANAL. */ unsigned int COUNT_ONE_CANAL; /* Объявляет COUNT_DISCHARGE — число DISCHARGE. */ unsigned int COUNT_DISCHARGE; /* Объявляет COUNT_TRANSICIA — число TRANSICIA. */ unsigned int COUNT_TRANSICIA; /* Объявляет FILTER_CLIP — данные FILTER_CLIP. */ unsigned int FILTER_CLIP; /* Объявляет WAKE — данные WAKE; WAKE_TIME — данные WAKE_TIME. */ long WAKE, WAKE_TIME; // Prototype statements for functions found within this file. /* Принимает результаты последовательности АЦП и обновляет измерительные фильтры в прерывании. */ interrupt void adc_isr(void); /* Настраивает каналы, последовательность преобразований и запуск АЦП. */ void setup_adc() /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ { /* Объявляет CLKdiv — данные CLKdiv; HSPCLKdiv — данные HSPCLKdiv; Rate — данные Rate. */ long CLKdiv,HSPCLKdiv,Rate; /* Объявляет i — данные i. */ int i; /* Условие компиляции (CPU_FRQ_150MHZ): выбранный блок включается в текущий вариант прошивки. */ #if (CPU_FRQ_150MHZ) // Default - 150 MHz SYSCLKOUT /* Задаёт ADC_MODCLK = 0x3; АЦП MODCLK. */ #define ADC_MODCLK 0x3 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 150/(2*3) = 25.0 MHz /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ #endif /* Условие компиляции (CPU_FRQ_100MHZ): выбранный блок включается в текущий вариант прошивки. */ #if (CPU_FRQ_100MHZ) /* Задаёт ADC_MODCLK = 0x2; АЦП MODCLK. */ #define ADC_MODCLK 0x2 // HSPCLK = SYSCLKOUT/2*ADC_MODCLK2 = 100/(2*2) = 25.0 MHz /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */ #endif // Specific clock setting for this example: // EALLOW; // SysCtrlRegs.HISPCP.all = ADC_MODCLK; // HSPCLK = SYSCLKOUT/ADC_MODCLK // EDIS; // Interrupts that are used in this example are re-mapped to // ISR functions found within this file. /* Разрешение записи в защищённые регистры периферии. */ EALLOW; // This is needed to write to EALLOW protected register /* Записывает PieVectTable.ADCINT значением &adc_isr; данные ADCINT. */ PieVectTable.ADCINT = &adc_isr; /* Закрытие доступа к защищённым регистрам периферии. */ EDIS; // This is needed to disable write to EALLOW protected registers /* Инициализирует модуль вызовом InitAdc(); перед его дальнейшим использованием. */ InitAdc(); // For this example, init the ADC // Enable ADCINT in PIE /* Записывает PieCtrlRegs.PIEIER1.bit.INTx6 значением 1; данные INTx6. */ PieCtrlRegs.PIEIER1.bit.INTx6 = 1; /* Устанавливает биты IER значением M_INT1; регистр разрешения прерываний ядра C28x. */ IER |= M_INT1; // Enable CPU Interrupt 1 // EINT; // Enable Global interrupt INTM // ERTM; // Enable Global realtime interrupt DBGM /* Цикл for(i=0;i<28;i++); задаёт начальное значение, условие продолжения и шаг перебора. */ for(i=0;i<28;i++) /* Записывает ADC_table[i] значением ; АЦП table. */ ADC_table[i]= /* Записывает prev_ok[i] значением 0; данные prev_ok. */ prev_ok[i] = 0; // Configure ADC /* Проверяет if(Desk==dsk_LOAD); последующий оператор выполняется только при истинном условии. */ if(Desk==dsk_LOAD) /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ { /* Записывает AdcRegs.ADCMAXCONV.bit.MAX_CONV1 значением 0x0005; данные MAX_CONV1. */ AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0005; // Setup 2 conv's on SEQ1 /* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV00 значением 0x3; данные CONV00. */ AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x3; // температура (которой нет) /* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV01 значением 0x1; данные CONV01. */ AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; // омега /* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV02 значением 0x5; данные CONV02. */ AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x5; // напруга 1 /* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV03 значением 0x4; данные CONV03. */ AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x4; // напруга 2 /* Записывает AdcRegs.ADCCHSELSEQ2.bit.CONV04 значением 0x7; данные CONV04. */ AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x7; // ток 1 /* Записывает AdcRegs.ADCCHSELSEQ2.bit.CONV05 значением 0x2; данные CONV05. */ AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x2; // ток 2 /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ } /* Проверяет if(Desk==dsk_BKST); последующий оператор выполняется только при истинном условии. */ if(Desk==dsk_BKST) /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ { /* Записывает AdcRegs.ADCMAXCONV.bit.MAX_CONV1 значением 0x0002; данные MAX_CONV1. */ AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0002; // Setup 2 conv's on SEQ1 /* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV00 значением 0x0; данные CONV00. */ AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; //0x5;//0x7; // Setup ADCINA3 as 1st SEQ1 conv. /* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV01 значением 0x1; данные CONV01. */ AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; //0x4;// Setup ADCINA2 as 2nd SEQ1 conv. /* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV02 значением 0x2; данные CONV02. */ AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x2; //0x4;// Setup ADCINA2 as 2nd SEQ1 conv. /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ } /* Проверяет if(Desk==dsk_COMM); последующий оператор выполняется только при истинном условии. */ if(Desk==dsk_COMM) /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ { /* Записывает AdcRegs.ADCMAXCONV.bit.MAX_CONV1 значением 0x0006; данные MAX_CONV1. */ AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0006; // Setup 2 conv's on SEQ1 /* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV00 значением 0x5; данные CONV00. */ AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x5; // сначала тоже будут температуры /* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV01 значением 0x4; данные CONV01. */ AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x4; // Setup ADCINA2 as 2nd SEQ1 conv. /* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV02 значением 0x7; данные CONV02. */ AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x7; // Setup ADCINA2 as 2nd SEQ1 conv. /* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV03 значением 0x2; данные CONV03. */ AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x2; // Setup ADCINA2 as 2nd SEQ1 conv. /* Записывает AdcRegs.ADCCHSELSEQ2.bit.CONV04 значением 0x3; данные CONV04. */ AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x3; // Setup ADCINA2 as 2nd SEQ1 conv. /* Записывает AdcRegs.ADCCHSELSEQ2.bit.CONV05 значением 0x6; данные CONV05. */ AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x6; // Setup ADCINA2 as 2nd SEQ1 conv. /* Записывает AdcRegs.ADCCHSELSEQ2.bit.CONV06 значением 0x1; данные CONV06. */ AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x1; // Setup ADCINA2 as 2nd SEQ1 conv. /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ } /* Проверяет if(Desk==dsk_BKSD); последующий оператор выполняется только при истинном условии. */ if(Desk==dsk_BKSD) /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ { /* Записывает AdcRegs.ADCMAXCONV.bit.MAX_CONV1 значением 0x0000; данные MAX_CONV1. */ AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0000; // Setup 2 conv's on SEQ1 /* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV00 значением 0x0; данные CONV00. */ AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA3 as 1st SEQ1 conv. /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ } /* Проверяет if(Desk==dsk_SHKF); последующий оператор выполняется только при истинном условии. */ if(Desk==dsk_SHKF) /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ { /* Записывает AdcRegs.ADCMAXCONV.bit.MAX_CONV1 значением 0x000F; данные MAX_CONV1. */ AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x000F; // Setup 2 conv's on SEQ1 /* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV00 значением 0x2; данные CONV00. */ AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x2; // 380В Ф1 /* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV01 значением 0x3; данные CONV01. */ AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x3; // 380В Ф2 /* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV02 значением 0x6; данные CONV02. */ AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x6; // 31В Ф1 /* Записывает AdcRegs.ADCCHSELSEQ1.bit.CONV03 значением 0xC; данные CONV03. */ AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0xC; // 31В Ф2 ? /* Записывает AdcRegs.ADCCHSELSEQ2.bit.CONV04 значением 0xA; данные CONV04. */ AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0xA; // 31В UC1 /* Записывает AdcRegs.ADCCHSELSEQ2.bit.CONV05 значением 0xB; данные CONV05. */ AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0xB; // 31В UC2 /* Записывает AdcRegs.ADCCHSELSEQ2.bit.CONV06 значением 0x7; данные CONV06. */ AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x7; // 24В ПУ /* Записывает AdcRegs.ADCCHSELSEQ2.bit.CONV07 значением 0x4; данные CONV07. */ AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x4; // 24В ПУ /* Записывает AdcRegs.ADCCHSELSEQ3.bit.CONV08 значением 0x5; данные CONV08. */ AdcRegs.ADCCHSELSEQ3.bit.CONV08 = 0x5; // 24В ПК было 5 /* Записывает AdcRegs.ADCCHSELSEQ3.bit.CONV09 значением 0x1; данные CONV09. */ AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x1; // 15В Др /* Записывает AdcRegs.ADCCHSELSEQ3.bit.CONV10 значением 0xE; данные CONV10. */ AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0xE; // +24В Дт /* Записывает AdcRegs.ADCCHSELSEQ3.bit.CONV11 значением 0x0; данные CONV11. */ AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0x0; // +24В Дт /* Записывает AdcRegs.ADCCHSELSEQ4.bit.CONV12 значением 0x8; данные CONV12. */ AdcRegs.ADCCHSELSEQ4.bit.CONV12 = 0x8; // -24В Дт было 8 /* Записывает AdcRegs.ADCCHSELSEQ4.bit.CONV13 значением 0xF; данные CONV13. */ AdcRegs.ADCCHSELSEQ4.bit.CONV13 = 0xF;//0xF; // ДТ° 1 /* Записывает AdcRegs.ADCCHSELSEQ4.bit.CONV14 значением 0xD; данные CONV14. */ AdcRegs.ADCCHSELSEQ4.bit.CONV14 = 0xD;//0xD; // ДТ° 2 /* Записывает AdcRegs.ADCCHSELSEQ4.bit.CONV15 значением 0x9; данные CONV15. */ AdcRegs.ADCCHSELSEQ4.bit.CONV15 = 0x9;//0x9; /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ } /* Записывает AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 значением 1; данные EPWM_SOCA_SEQ1. */ AdcRegs.ADCTRL2.bit.EPWM_SOCA_SEQ1 = 1;// Enable SOCA from ePWM to start SEQ1 /* Записывает AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 значением 1; данные INT_ENA_SEQ1. */ AdcRegs.ADCTRL2.bit.INT_ENA_SEQ1 = 1; // Enable SEQ1 interrupt (every EOS) /* Записывает AdcRegs.ADCST.bit.INT_SEQ1_CLR значением 1; данные INT_SEQ1_CLR. */ AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear INT SEQ1 bit /* Записывает AdcRegs.ADCTRL1.bit.SEQ_CASC значением 1; данные SEQ_CASC. */ AdcRegs.ADCTRL1.bit.SEQ_CASC = 1; // 1 Cascaded mode /* Записывает AdcRegs.ADCTRL1.bit.CONT_RUN значением 0; данные CONT_RUN. */ AdcRegs.ADCTRL1.bit.CONT_RUN=0; /* Записывает AdcRegs.ADCTRL1.bit.ACQ_PS значением 15; данные ACQ_PS. */ AdcRegs.ADCTRL1.bit.ACQ_PS = 15; //AdcRegs.ADCTRL1.bit.CPS=1; /* Записывает AdcRegs.ADCTRL2.bit.RST_SEQ1 значением 1; данные RST_SEQ1. */ AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1 /* Записывает PieCtrlRegs.PIEACK.all значением PIEACK_GROUP1; представление регистра целым словом без разбиения на битовые поля. */ PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE // Assumes ePWM1 clock is already enabled in InitSysCtrl(); /* Записывает EPwm1Regs.ETSEL.bit.SOCAEN значением 1; данные SOCAEN. */ EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Enable SOC on A group /* Записывает EPwm1Regs.ETSEL.bit.SOCASEL значением 4; данные SOCASEL. */ EPwm1Regs.ETSEL.bit.SOCASEL = 4; // Select SOC from from CPMA on upcount /* Записывает EPwm1Regs.ETPS.bit.SOCAPRD значением 1; данные SOCAPRD. */ EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Generate pulse on 1st event /* Записывает EPwm1Regs.CMPA.half.CMPA значением 0x0080; данные CMPA. */ EPwm1Regs.CMPA.half.CMPA = 0x0080; // Set compare A value /* Записывает EPwm1Regs.TBCTL.bit.HSPCLKDIV значением CLKMULT; данные HSPCLKDIV. */ EPwm1Regs.TBCTL.bit.HSPCLKDIV = CLKMULT; /* Записывает EPwm1Regs.TBCTL.bit.CLKDIV значением 2; данные CLKDIV. */ EPwm1Regs.TBCTL.bit.CLKDIV=2; /* Записывает CLKdiv значением 1<>4; Current_count(i); АЦП table lem. */ adc_table_lem[i] = *((&AdcRegs.ADCRESULT0)+i+2) >>4; Current_count(i); /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ } } /* Проверяет if(Desk==dsk_LOAD); последующий оператор выполняется только при истинном условии. */ if(Desk==dsk_LOAD) /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ { /* Записывает Temper значением AdcRegs.ADCRESULT1 >> 4; данные Temper. */ Temper = AdcRegs.ADCRESULT1 >> 4; /* Записывает modbus[0x63] значением Temper; массив технологических регистров; слово int на C28x занимает 16 бит. */ modbus[0x63] = Temper; /* Записывает Temper значением filterbat(&adc_filter[0],Temper); данные Temper. */ Temper = filterbat(&adc_filter[0],Temper); /* Записывает modbus[0x1D] значением (Temper-DAC_04)/(DAC_20-DAC_04)*(200-40)+40; массив технологических регистров; слово int на C28x занимает 16 бит. */ modbus[0x1D] = (Temper-DAC_04)/(DAC_20-DAC_04)*(200-40)+40; /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ } /* Проверяет if(Desk==dsk_SHKF); последующий оператор выполняется только при истинном условии. */ if(Desk==dsk_SHKF) /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ { /* Цикл for(i=0;i=tpl_cans) cownt_cans=0; последующий оператор выполняется только при истинном условии. */ if (++cownt_cans>=tpl_cans) cownt_cans=0; // Именно здесь нет дыр // if(sens_type[cownt_cans]) /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ { /* Изменяет счётчик в выражении i++; на один для следующего шага. */ i++; /* Записывает Temper значением *(&AdcRegs.ADCRESULT0 + cownt_cans) >>4; данные Temper. */ Temper= *(&AdcRegs.ADCRESULT0 + cownt_cans) >>4; /* Записывает ADC_table[cownt_cans] значением filterbat(&adc_filter[cownt_cans],Temper); АЦП table. */ ADC_table[cownt_cans]=filterbat(&adc_filter[cownt_cans],Temper); /* Проверяет if(sens_type[cownt_cans]==TERMO_AD) Temper_count(cownt_cans,0); последующий оператор выполняется только при истинном условии. */ if(sens_type[cownt_cans]==TERMO_AD) Temper_count(cownt_cans,0); /* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */ else Power_count(cownt_cans); /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ } } } /* Проверяет if(TermoSW); последующий оператор выполняется только при истинном условии. */ if(TermoSW) /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ { /* Проверяет if(cownt_one_canal==COUNT_DISCHARGE); последующий оператор выполняется только при истинном условии. */ if(cownt_one_canal==COUNT_DISCHARGE) /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ { /* Записывает code_tpl_canal значением cownt_cans; данные code_tpl_canal. */ code_tpl_canal = cownt_cans; /* Проверяет if(TermoAD); последующий оператор выполняется только при истинном условии. */ if(TermoAD) /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ { /* Проверяет if(cownt_cans == TPL_CANS ) code_tpl_canal = TERMOPAIR-1; последующий оператор выполняется только при истинном условии. */ if(cownt_cans == TPL_CANS ) code_tpl_canal = TERMOPAIR-1; /* Проверяет if(cownt_cans == TPL_CANS+1) code_tpl_canal = TERMOPAIR-2; последующий оператор выполняется только при истинном условии. */ if(cownt_cans == TPL_CANS+1) code_tpl_canal = TERMOPAIR-2; // потому что 300 и 400 наоборот /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ } /* Вызывает select_tpl_canal с аргументами (code_tpl_canal) в текущей последовательности операций. */ select_tpl_canal(code_tpl_canal); /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ } /* Проверяет if(cownt_one_canal > COUNT_TRANSICIA); последующий оператор выполняется только при истинном условии. */ if(cownt_one_canal > COUNT_TRANSICIA) /* Цикл for(i=0;i>4; данные Temper. */ Temper = *(&AdcRegs.ADCRESULT0 + i) >>4; /* Записывает ok значением abs(ADC_table[n]-Temper) < FILTER_CLIP; данные ok. */ ok = abs(ADC_table[n]-Temper) < FILTER_CLIP; /* Проверяет if(ok) cwnt_ok[i]++; последующий оператор выполняется только при истинном условии. */ if(ok) cwnt_ok[i]++; /* Проверяет if(ok|!prev_ok[n]); последующий оператор выполняется только при истинном условии. */ if(ok|!prev_ok[n]) /* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */ { /* Записывает Filter значением filterbat(&adc_filter[n],Temper); данные Filter. */ Filter = filterbat(&adc_filter[n],Temper); /* Проверяет if(WAKE)ADC_table[n] = Temper; последующий оператор выполняется только при истинном условии. */ if(WAKE)ADC_table[n] = Temper; /* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */ else ADC_table[n] = Filter; /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ } /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */ } /* if(cownt_cans == TPL_CANS) { Test_mem_limit(8); modbus[0x2F]=Log.Adres; for(i=0;i<1;i++) { Log_to_mem(*(&AdcRegs.ADCRESULT0 + i) >>4); Log_to_mem(ADC_table[2*cownt_cans+i]); } } */ /* Проверяет if(++cownt_one_canal>=COUNT_ONE_CANAL); последующий оператор выполняется только при истинном условии. */ if(++cownt_one_canal>=COUNT_ONE_CANAL) /* Записывает cownt_one_canal значением 0; данные cownt_one_canal. */ { cownt_one_canal=0; /* Вызывает select_tpl_255 с аргументами () в текущей последовательности операций. */ select_tpl_255(); /* Цикл for(i=0;i= TPL_CANS+2); последующий оператор выполняется только при истинном условии. */ if(++cownt_cans >= TPL_CANS+2) /* Записывает cownt_cans значением 0; данные cownt_cans. */ { cownt_cans=0; /* Цикл for(i=0;i