Сохранить русские комментарии и настройки проекта в UTF-8

Добавить пояснения к исходникам, заголовкам TI, настройкам CCS и существующим проверкам. Зафиксировать правила кодировки, обзор модулей и аудит комментариев.
This commit is contained in:
2026-10-12 12:24:48 +03:00
parent 378e06a281
commit f741741cf8
137 changed files with 21576 additions and 2134 deletions
+278 -33
View File
@@ -1,43 +1,74 @@
/* Настройка АЦП, обработка преобразований и первичная фильтрация измерений. Русские пояснения сохранены в 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];
Uint16 ADC_table[28]; // Ïîòîìó ÷òî +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:
@@ -47,247 +78,438 @@ void setup_adc()
// 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); последующий оператор выполняется только при истинном условии. */
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; // òåìïåðàòóðà (êîòîðîé íåò)
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; // îìåãà
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x5; // íàïðóãà 1
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x4; // íàïðóãà 2
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0x7; // òîê 1
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0x2; // òîê 2
/* Записывает 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; // ñíà÷àëà òîæå áóäóò òåìïåðàòóðû
/* Записывает 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); последующий оператор выполняется только при истинном условии. */
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); последующий оператор выполняется только при истинном условии. */
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; // 380Â Ô1
AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x3; // 380Â Ô2
AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x6; // 31Â Ô1
AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0xC; // 31Â Ô2 ?
AdcRegs.ADCCHSELSEQ2.bit.CONV04 = 0xA; // 31Â UC1
AdcRegs.ADCCHSELSEQ2.bit.CONV05 = 0xB; // 31Â UC2
AdcRegs.ADCCHSELSEQ2.bit.CONV06 = 0x7; // 24Â ÏÓ
AdcRegs.ADCCHSELSEQ2.bit.CONV07 = 0x4; // 24Â ÏÓ
/* Записывает 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; // 24Â ÏÊ áûëî 5
AdcRegs.ADCCHSELSEQ3.bit.CONV09 = 0x1; // 15Â Äð
AdcRegs.ADCCHSELSEQ3.bit.CONV10 = 0xE; // +24Â Äò
AdcRegs.ADCCHSELSEQ3.bit.CONV11 = 0x0; // +24Â Äò
AdcRegs.ADCCHSELSEQ4.bit.CONV12 = 0x8; // -24Â Äò áûëî 8
/* Записывает 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;//0xF; // ÄÒ° 1
AdcRegs.ADCCHSELSEQ4.bit.CONV14 = 0xD;//0xD; // ÄÒ° 2
/* Записывает 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<<EPwm1Regs.TBCTL.bit.CLKDIV; данные CLKdiv. */
CLKdiv = 1<<EPwm1Regs.TBCTL.bit.CLKDIV;
/* Проверяет if(EPwm1Regs.TBCTL.bit.HSPCLKDIV) HSPCLKdiv = 2*EPwm1Regs.TBCTL.bit.HSPCLKDIV; последующий оператор выполняется только при истинном условии. */
if(EPwm1Regs.TBCTL.bit.HSPCLKDIV) HSPCLKdiv = 2*EPwm1Regs.TBCTL.bit.HSPCLKDIV;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else HSPCLKdiv = 1;
/* Записывает Rate значением (SYSCLKOUT/(HSPCLKdiv*CLKdiv))/ADC_FREQ; данные Rate. */
Rate = (SYSCLKOUT/(HSPCLKdiv*CLKdiv))/ADC_FREQ;
/* Записывает EPwm1Regs.TBPRD значением Rate; данные TBPRD. */
EPwm1Regs.TBPRD = Rate; // Set period for ePWM1
/* Записывает EPwm1Regs.TBCTL.bit.CTRMODE значением 0; данные CTRMODE. */
EPwm1Regs.TBCTL.bit.CTRMODE = 0; // count up and start
/* Записывает WAKE_TIME значением 2L * ADC_FREQ; данные WAKE_TIME. */
WAKE_TIME =2L * ADC_FREQ; // dsk_LOAD;
/* Проверяет if(Desk==dsk_BKSD); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_BKSD)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает COUNT_ONE_CANAL значением ADC_FREQ/250; число ONE CANAL. */
COUNT_ONE_CANAL = ADC_FREQ/250; // 15
/* Записывает COUNT_DISCHARGE значением 4; число DISCHARGE. */
COUNT_DISCHARGE = 4;
/* Записывает COUNT_TRANSICIA значением 9; число TRANSICIA. */
COUNT_TRANSICIA = 9;
/* Записывает FILTER_CLIP значением 20; данные FILTER_CLIP. */
FILTER_CLIP = 20;//40;
/* Записывает WAKE_TIME значением 7L * ADC_FREQ; данные WAKE_TIME. */
WAKE_TIME =7L * ADC_FREQ;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(Desk==dsk_BKST); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_BKST)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает COUNT_ONE_CANAL значением ADC_FREQ/350; число ONE CANAL. */
COUNT_ONE_CANAL = ADC_FREQ/350; // 10
/* Записывает COUNT_DISCHARGE значением 1; число DISCHARGE. */
COUNT_DISCHARGE = 1;
/* Записывает COUNT_TRANSICIA значением 4; число TRANSICIA. */
COUNT_TRANSICIA = 4;
/* Записывает FILTER_CLIP значением 20; данные FILTER_CLIP. */
FILTER_CLIP = 20;//40;
/* Записывает WAKE_TIME значением 3L * ADC_FREQ; данные WAKE_TIME. */
WAKE_TIME =3L * ADC_FREQ;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(TermoAD); последующий оператор выполняется только при истинном условии. */
if(TermoAD)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает COUNT_ONE_CANAL значением ADC_FREQ/15; число ONE CANAL. */
COUNT_ONE_CANAL = ADC_FREQ/15; // 250;
/* Записывает COUNT_DISCHARGE значением ADC_FREQ/145; число DISCHARGE. */
COUNT_DISCHARGE = ADC_FREQ/145; // 25;
/* Записывает COUNT_TRANSICIA значением ADC_FREQ/25; число TRANSICIA. */
COUNT_TRANSICIA = ADC_FREQ/25; // 150;
/* Записывает FILTER_CLIP значением 20; данные FILTER_CLIP. */
FILTER_CLIP = 20;//200;
/* Записывает WAKE_TIME значением 3L * ADC_FREQ; данные WAKE_TIME. */
WAKE_TIME =3L * ADC_FREQ;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(Desk==dsk_LOAD); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_LOAD)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает WAKE_TIME значением 10L * ADC_FREQ; данные WAKE_TIME. */
WAKE_TIME =10L * ADC_FREQ;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(Desk==dsk_SHKF); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_SHKF)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает WAKE_TIME значением 1L * ADC_FREQ; данные WAKE_TIME. */
WAKE_TIME =1L * ADC_FREQ;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает WAKE значением WAKE_TIME; данные WAKE. */
WAKE = WAKE_TIME;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Принимает результаты последовательности АЦП и обновляет измерительные фильтры в прерывании. */
interrupt void adc_isr(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет cownt_one_canal — данные cownt_one_canal. Начальное значение задаётся справа от знака равенства. */
static int cownt_one_canal=0;
/* Объявляет cownt_cans — данные cownt_cans. Начальное значение задаётся справа от знака равенства. */
static int cownt_cans=0;
/* Объявляет code_tpl_canal — данные code_tpl_canal. Начальное значение задаётся справа от знака равенства. */
int code_tpl_canal=0;
/* Объявляет Temper — данные Temper; Filter — данные Filter. */
float Temper,Filter;
/* Объявляет i — данные i; n — данные n. */
int i,n;
/* Объявляет ok — данные ok; cwnt_ok — данные cwnt_ok. Начальное значение задаётся справа от знака равенства. */
static int ok, cwnt_ok[2]={0,0};
// Set interrupt priority:
/* Объявляет TempPIEIER — сохранённая маска разрешённых прерываний группы PIE. volatile требует фактического чтения или записи при каждом доступе. Начальное значение задаётся справа от знака равенства. */
volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER1.all;
/* Устанавливает биты IER значением M_INT1; регистр разрешения прерываний ядра C28x. */
IER |= M_INT1;
/* Оставляет биты маски IER значением MINT1; регистр разрешения прерываний ядра C28x. */
IER &= MINT1; // Set "global" priority
/* Оставляет биты маски PieCtrlRegs.PIEIER1.all значением MG11; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEIER1.all &= MG11;//16; // Set "group" priority
/* Записывает PieCtrlRegs.PIEACK.all значением 0xFFFF; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
/* Разрешение маскируемых прерываний ядра. */
EINT;
/* Проверяет if(WAKE) WAKE--; последующий оператор выполняется только при истинном условии. */
if(WAKE) WAKE--;
/* Проверяет if(!READY) goto fin; последующий оператор выполняется только при истинном условии. */
if(!READY) goto fin;
/* Проверяет if(Caliber_time); последующий оператор выполняется только при истинном условии. */
if(Caliber_time)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(!--Caliber_time); последующий оператор выполняется только при истинном условии. */
if(!--Caliber_time)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает cTermoCal значением 0; данные cTermoCal. */
cTermoCal = 0;
/* Записывает cSaveParam значением 1; данные cSaveParam. */
cSaveParam = 1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/* Проверяет if(Kurrent); последующий оператор выполняется только при истинном условии. */
if(Kurrent)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Цикл for(i=0;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<4;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает adc_table_lem[i] значением *((&AdcRegs.ADCRESULT0)+i+2) >>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); последующий оператор выполняется только при истинном условии. */
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<CLKMULT*3;); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<CLKMULT*3;)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if (++cownt_cans>=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; // ïîòîìó ÷òî 300 è 400 íàîáîðîò
/* Проверяет 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<TermoSW;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<TermoSW;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает n значением TermoSW*cownt_cans+i; данные n. */
n = TermoSW*cownt_cans+i;
/* Записывает Temper значением *(&AdcRegs.ADCRESULT0 + 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)
@@ -303,36 +525,59 @@ for(i=0;i<1;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<TermoSW;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<TermoSW;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает n значением TermoSW*cownt_cans+i; данные n. */
n = TermoSW*cownt_cans+i;
/* Вызывает Temper_count с аргументами (n,0) в текущей последовательности операций. */
Temper_count(n,0);
/* Записывает prev_ok[n] значением cwnt_ok[i]; данные prev_ok. */
prev_ok[n] = cwnt_ok[i];
/* Записывает cwnt_ok[i] значением 0; данные cwnt_ok. */
cwnt_ok[i] = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(++cownt_cans >= TPL_CANS+2); последующий оператор выполняется только при истинном условии. */
if(++cownt_cans >= TPL_CANS+2)
/* Записывает cownt_cans значением 0; данные cownt_cans. */
{ cownt_cans=0;
/* Цикл for(i=0;i<Owen;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<Owen;i++)
/* Вызывает Temper_count с аргументами (tpl_cans+i,1) в текущей последовательности операций. */
Temper_count(tpl_cans+i,1);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} } }
/* Метка fin для перехода внутри функции. */
fin:
// Reinitialize for next ADC sequence
/* Записывает AdcRegs.ADCTRL2.bit.RST_SEQ1 значением 1; данные RST_SEQ1. */
AdcRegs.ADCTRL2.bit.RST_SEQ1 = 1; // Reset SEQ1
/* Записывает AdcRegs.ADCST.bit.INT_SEQ1_CLR значением 1; данные INT_SEQ1_CLR. */
AdcRegs.ADCST.bit.INT_SEQ1_CLR = 1; // Clear INT SEQ1 bit
/* Записывает PieCtrlRegs.PIEACK.all значением PIEACK_GROUP1; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE
// Restore registers saved:
/* Запрет маскируемых прерываний ядра. */
DINT;
/* Записывает PieCtrlRegs.PIEIER1.all значением TempPIEIER; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEIER1.all = TempPIEIER;
/* Завершает adc_isr без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
+302 -57
View File
File diff suppressed because one or more lines are too long
+5
View File
@@ -1,8 +1,13 @@
/* Настройка АЦП, обработка преобразований и первичная фильтрация измерений. Русские пояснения сохранены в UTF-8. */
/* Объявляет adc_table_lem — АЦП table lem. Память определена в другом модуле. */
extern Uint16 adc_table_lem[];
/* Объявляет ADC_table — АЦП table. Память определена в другом модуле. */
extern Uint16 ADC_table[];
/* Настраивает каналы, последовательность преобразований и запуск АЦП. */
void setup_adc(void);
/* Объявляет WAKE — данные WAKE; WAKE_TIME — данные WAKE_TIME. Память определена в другом модуле. */
extern long WAKE,WAKE_TIME;
+13 -1
View File
@@ -1,18 +1,30 @@
/* Выход ЦАП и автомат защиты нагрузки с проверкой напряжения и свежести CAN. Русские пояснения сохранены в UTF-8. */
/* В такте Timer1 проверяет команды, напряжение и давность CAN; управляет STOP, повторным пуском и током ЦАП. */
void Load_runner(void);
/* Объявляет интерфейс функции Anal_output; реализация вызывается через этот прототип. */
void Anal_output(long vrot, long maxx);
/* Объявляет интерфейс функции Init_DAC; реализация вызывается через этот прототип. */
void Init_DAC(void);
/* Вычисляет такты ЦАП; для недопустимого сохранённого тайм-аута CAN возвращает 600 мс. */
void Setup_DAC_time(void);
/* Счётчик пускового импульса и выдержки инициализации доступны логгеру. */
/* Счётчик пускового импульса и выдержки инициализации доступны логгеру. */
/* Объявляет IMPowse — данные IMPowse; WAKEpowse — данные WAKEpowse. Память определена в другом модуле. */
extern unsigned long IMPowse, WAKEpowse;
/* Объявляет period_dac — период ЦАП; time_dac — time ЦАП. Память определена в другом модуле. */
extern unsigned int period_dac, time_dac;
/* Call once before IRQ; complete technological CAN packets update voltage. */
/* Сбрасывает все переменные автомата нагрузки до разрешения прерываний; COFF не обнуляет всю .ebss. */
void Load_control_init(void);
/* Принимает напряжение выбранной нагрузки из достоверных слов CAN и сбрасывает возраст только нужного измерения. */
void Load_voltage_can(unsigned int header, unsigned int a,
/* Объявляет b — данные b. */
unsigned int b, unsigned int c);
/* 0x1300/8 words: signature, version, simulation, timeout, status, attempts,
* voltage, age. Only 0x1302 (simulation) and 0x1303 (timeout) are writable. */
/* Фиксирует управляющие входы перед выполнением автомата защиты нагрузки. */
unsigned int Load_protection_prepare(unsigned int function, unsigned int address,
/* Объявляет value — данные value; out — данные out. Хранит указатель на данные. */
unsigned int value, unsigned int *out, unsigned int *error);
+345 -78
View File
@@ -1,387 +1,654 @@
/* Таблица назначения GPIO и макросы аппаратных сигналов платы. Русские пояснения сохранены в UTF-8. */
/* Задаёт COMM_gpio00_dir = 0UL; COMM линия GPIO 00 dir. */
#define COMM_gpio00_dir 0UL
/* Задаёт COMM_gpio01_dir = 0UL; COMM линия GPIO 01 dir. */
#define COMM_gpio01_dir 0UL
/* Задаёт COMM_gpio02_dir = 0UL; COMM линия GPIO 02 dir. */
#define COMM_gpio02_dir 0UL
/* Задаёт COMM_gpio03_dir = 0UL; COMM линия GPIO 03 dir. */
#define COMM_gpio03_dir 0UL
/* Задаёт COMM_gpio04_dir = 0UL; COMM линия GPIO 04 dir. */
#define COMM_gpio04_dir 0UL
/* Задаёт COMM_gpio05_dir = 0UL; COMM линия GPIO 05 dir. */
#define COMM_gpio05_dir 0UL
/* Задаёт COMM_gpio06_dir = 0UL; COMM линия GPIO 06 dir. */
#define COMM_gpio06_dir 0UL
/* Задаёт COMM_gpio07_dir = 0UL; COMM линия GPIO 07 dir. */
#define COMM_gpio07_dir 0UL
/* Задаёт COMM_gpio08_dir = 0UL; COMM линия GPIO 08 dir. */
#define COMM_gpio08_dir 0UL
/* Задаёт COMM_gpio09_dir = 0UL; COMM линия GPIO 09 dir. */
#define COMM_gpio09_dir 0UL
/* Задаёт COMM_gpio10_dir = 0UL; COMM линия GPIO 10 dir. */
#define COMM_gpio10_dir 0UL
/* Задаёт COMM_gpio11_dir = 0UL; COMM линия GPIO 11 dir. */
#define COMM_gpio11_dir 0UL
#define COMM_gpio19_dir 1UL // 63 — SPI
/* Задаёт COMM_gpio19_dir = 1UL; COMM линия GPIO 19 dir. */
#define COMM_gpio19_dir 1UL // 63 — SPI
/* Задаёт COMM_gpio20_dir = 0UL; COMM линия GPIO 20 dir. */
#define COMM_gpio20_dir 0UL // 64 2:9B mode 2
/* Задаёт COMM_gpio21_dir = 0UL; COMM линия GPIO 21 dir. */
#define COMM_gpio21_dir 0UL // 65 2:9A mode 4
/* Задаёт COMM_gpio22_dir = 0UL; COMM линия GPIO 22 dir. */
#define COMM_gpio22_dir 0UL // 66 2:12C mode 1
/* Задаёт COMM_gpio23_dir = 0UL; COMM линия GPIO 23 dir. */
#define COMM_gpio23_dir 0UL
/* Задаёт COMM_gpio24_dir = 1UL; COMM линия GPIO 24 dir. */
#define COMM_gpio24_dir 1UL // 68 2:12A select
/* Задаёт COMM_gpio25_dir = 1UL; COMM линия GPIO 25 dir. */
#define COMM_gpio25_dir 1UL // 69 2:11C select
/* Задаёт COMM_gpio26_dir = 0UL; COMM линия GPIO 26 dir. */
#define COMM_gpio26_dir 0UL
/* Задаёт COMM_gpio27_dir = 1UL; COMM линия GPIO 27 dir. */
#define COMM_gpio27_dir 1UL // 73 2:11A select
/* Задаёт COMM_gpio32_dir = 1UL; COMM линия GPIO 32 dir. */
#define COMM_gpio32_dir 1UL // 74 2:10B DIOD green
/* Задаёт COMM_gpio33_dir = 0UL; COMM линия GPIO 33 dir. */
#define COMM_gpio33_dir 0UL
#define COMM_gpio34_dir 1UL // 142 — SCI
/* Задаёт COMM_gpio34_dir = 1UL; COMM линия GPIO 34 dir. */
#define COMM_gpio34_dir 1UL // 142 — SCI
/* Задаёт COMM_gpio48_dir = 1UL; COMM линия GPIO 48 dir. */
#define COMM_gpio48_dir 1UL // 88 2:14C DIOD red
/* Задаёт COMM_gpio49_dir = 1UL; COMM линия GPIO 49 dir. */
#define COMM_gpio49_dir 1UL // 89 2:14B select
/* Задаёт COMM_gpio50_dir = 0UL; COMM линия GPIO 50 dir. */
#define COMM_gpio50_dir 0UL // 90 2:14A input 2
/* Задаёт COMM_gpio51_dir = 0UL; COMM линия GPIO 51 dir. */
#define COMM_gpio51_dir 0UL // 91 2:13C mode !8
/* Задаёт COMM_gpio52_dir = 1UL; COMM линия GPIO 52 dir. */
#define COMM_gpio52_dir 1UL // 94 2:13B select
/* Задаёт COMM_gpio53_dir = 0UL; COMM линия GPIO 53 dir. */
#define COMM_gpio53_dir 0UL // 95 2:13A input 1
/* Задаёт COMM_gpio58_dir = 1UL; COMM линия GPIO 58 dir. */
#define COMM_gpio58_dir 1UL // 100 1:13C rez 1
/* Задаёт COMM_gpio59_dir = 1UL; COMM линия GPIO 59 dir. */
#define COMM_gpio59_dir 1UL // 110 1:13B gotov
/* Задаёт COMM_gpio60_dir = 1UL; COMM линия GPIO 60 dir. */
#define COMM_gpio60_dir 1UL // 111 1:13A led 1
/* Задаёт COMM_gpio61_dir = 1UL; COMM линия GPIO 61 dir. */
#define COMM_gpio61_dir 1UL // 112 1:14C rez 2
#define COMM_gpio62_dir 0UL
/* Задаёт COMM_gpio62_dir = 0UL; COMM линия GPIO 62 dir. */
#define COMM_gpio62_dir 0UL
/* Задаёт COMM_gpio63_dir = 1UL; COMM линия GPIO 63 dir. */
#define COMM_gpio63_dir 1UL // 114 1:14A led 2
//===========================================================================
/* Задаёт BKSD_gpio00_dir = 0UL; BKSD линия GPIO 00 dir. */
#define BKSD_gpio00_dir 0UL // 5 2:7A oil
/* Задаёт BKSD_gpio01_dir = 1UL; BKSD линия GPIO 01 dir. */
#define BKSD_gpio01_dir 1UL // 6 2:4A select
/* Задаёт BKSD_gpio02_dir = 0UL; BKSD линия GPIO 02 dir. */
#define BKSD_gpio02_dir 0UL // 7 2:7B oil
/* Задаёт BKSD_gpio03_dir = 1UL; BKSD линия GPIO 03 dir. */
#define BKSD_gpio03_dir 1UL // 10 2:4B select
/* Задаёт BKSD_gpio04_dir = 0UL; BKSD линия GPIO 04 dir. */
#define BKSD_gpio04_dir 0UL // 11 2:7C oil
/* Задаёт BKSD_gpio05_dir = 0UL; BKSD линия GPIO 05 dir. */
#define BKSD_gpio05_dir 0UL
/* Задаёт BKSD_gpio06_dir = 0UL; BKSD линия GPIO 06 dir. */
#define BKSD_gpio06_dir 0UL
/* Задаёт BKSD_gpio07_dir = 1UL; BKSD линия GPIO 07 dir. */
#define BKSD_gpio07_dir 1UL // 16 2:3A select
/* Задаёт BKSD_gpio08_dir = 1UL; BKSD линия GPIO 08 dir. */
#define BKSD_gpio08_dir 1UL // 17 2:6B select
/* Задаёт BKSD_gpio09_dir = 1UL; BKSD линия GPIO 09 dir. */
#define BKSD_gpio09_dir 1UL // 18 2:3B select
/* Задаёт BKSD_gpio10_dir = 0UL; BKSD линия GPIO 10 dir. */
#define BKSD_gpio10_dir 0UL // 19 2:6C oil
/* Задаёт BKSD_gpio11_dir = 1UL; BKSD линия GPIO 11 dir. */
#define BKSD_gpio11_dir 1UL // 20 2:3C select
#define BKSD_gpio19_dir 1UL // 63 — SPI
/* Задаёт BKSD_gpio19_dir = 1UL; BKSD линия GPIO 19 dir. */
#define BKSD_gpio19_dir 1UL // 63 — SPI
/* Задаёт BKSD_gpio20_dir = 0UL; BKSD линия GPIO 20 dir. */
#define BKSD_gpio20_dir 0UL // 64 2:9B mode 2
/* Задаёт BKSD_gpio21_dir = 0UL; BKSD линия GPIO 21 dir. */
#define BKSD_gpio21_dir 0UL // 65 2:9A mode 4
/* Задаёт BKSD_gpio22_dir = 0UL; BKSD линия GPIO 22 dir. */
#define BKSD_gpio22_dir 0UL // 66 2:12C mode 1
/* Задаёт BKSD_gpio23_dir = 0UL; BKSD линия GPIO 23 dir. */
#define BKSD_gpio23_dir 0UL
/* Задаёт BKSD_gpio24_dir = 0UL; BKSD линия GPIO 24 dir. */
#define BKSD_gpio24_dir 0UL
/* Задаёт BKSD_gpio25_dir = 0UL; BKSD линия GPIO 25 dir. */
#define BKSD_gpio25_dir 0UL
/* Задаёт BKSD_gpio26_dir = 0UL; BKSD линия GPIO 26 dir. */
#define BKSD_gpio26_dir 0UL
/* Задаёт BKSD_gpio27_dir = 0UL; BKSD линия GPIO 27 dir. */
#define BKSD_gpio27_dir 0UL
/* Задаёт BKSD_gpio32_dir = 1UL; BKSD линия GPIO 32 dir. */
#define BKSD_gpio32_dir 1UL // 74 2:10B DIOD green
/* Задаёт BKSD_gpio33_dir = 0UL; BKSD линия GPIO 33 dir. */
#define BKSD_gpio33_dir 0UL
#define BKSD_gpio34_dir 1UL // 142 — SCI
/* Задаёт BKSD_gpio34_dir = 1UL; BKSD линия GPIO 34 dir. */
#define BKSD_gpio34_dir 1UL // 142 — SCI
/* Задаёт BKSD_gpio48_dir = 1UL; BKSD линия GPIO 48 dir. */
#define BKSD_gpio48_dir 1UL // 88 2:14C DIOD red
/* Задаёт BKSD_gpio49_dir = 0UL; BKSD линия GPIO 49 dir. */
#define BKSD_gpio49_dir 0UL // 89 2:14B input 2
/* Задаёт BKSD_gpio50_dir = 0UL; BKSD линия GPIO 50 dir. */
#define BKSD_gpio50_dir 0UL // 90 2:14A input 1
/* Задаёт BKSD_gpio51_dir = 0UL; BKSD линия GPIO 51 dir. */
#define BKSD_gpio51_dir 0UL // 91 2:13C mode !8
/* Задаёт BKSD_gpio52_dir = 0UL; BKSD линия GPIO 52 dir. */
#define BKSD_gpio52_dir 0UL
/* Задаёт BKSD_gpio53_dir = 0UL; BKSD линия GPIO 53 dir. */
#define BKSD_gpio53_dir 0UL
/* Задаёт BKSD_gpio58_dir = 0UL; BKSD линия GPIO 58 dir. */
#define BKSD_gpio58_dir 0UL
/* Задаёт BKSD_gpio59_dir = 1UL; BKSD линия GPIO 59 dir. */
#define BKSD_gpio59_dir 1UL // 110 1:13B gotov
/* Задаёт BKSD_gpio60_dir = 1UL; BKSD линия GPIO 60 dir. */
#define BKSD_gpio60_dir 1UL // 111 1:13A led 1
/* Задаёт BKSD_gpio61_dir = 1UL; BKSD линия GPIO 61 dir. */
#define BKSD_gpio61_dir 1UL // 112 1:14C rez 2
/* Задаёт BKSD_gpio62_dir = 1UL; BKSD линия GPIO 62 dir. */
#define BKSD_gpio62_dir 1UL // 113 1:14B rez 1
/* Задаёт BKSD_gpio63_dir = 1UL; BKSD линия GPIO 63 dir. */
#define BKSD_gpio63_dir 1UL // 114 1:14A led 2
//===========================================================================
/* Задаёт BKST_gpio00_dir = 1UL; BKST линия GPIO 00 dir. */
#define BKST_gpio00_dir 1UL // 5 2:7A select
/* Задаёт BKST_gpio01_dir = 1UL; BKST линия GPIO 01 dir. */
#define BKST_gpio01_dir 1UL // 6 2:4A select
/* Задаёт BKST_gpio02_dir = 0UL; BKST линия GPIO 02 dir. */
#define BKST_gpio02_dir 0UL
/* Задаёт BKST_gpio03_dir = 1UL; BKST линия GPIO 03 dir. */
#define BKST_gpio03_dir 1UL // 10 2:4B select
/* Задаёт BKST_gpio04_dir = 0UL; BKST линия GPIO 04 dir. */
#define BKST_gpio04_dir 0UL
/* Задаёт BKST_gpio05_dir = 0UL; BKST линия GPIO 05 dir. */
#define BKST_gpio05_dir 0UL
/* Задаёт BKST_gpio06_dir = 1UL; BKST линия GPIO 06 dir. */
#define BKST_gpio06_dir 1UL // 13 2:6A select
/* Задаёт BKST_gpio07_dir = 1UL; BKST линия GPIO 07 dir. */
#define BKST_gpio07_dir 1UL // 16 2:3A select
/* Задаёт BKST_gpio08_dir = 1UL; BKST линия GPIO 08 dir. */
#define BKST_gpio08_dir 1UL // 17 2:6B select
/* Задаёт BKST_gpio09_dir = 1UL; BKST линия GPIO 09 dir. */
#define BKST_gpio09_dir 1UL // 18 2:3B select
/* Задаёт BKST_gpio10_dir = 0UL; BKST линия GPIO 10 dir. */
#define BKST_gpio10_dir 0UL
/* Задаёт BKST_gpio11_dir = 1UL; BKST линия GPIO 11 dir. */
#define BKST_gpio11_dir 1UL // 20 2:3C select
#define BKST_gpio19_dir 1UL // 63 — SPI
/* Задаёт BKST_gpio19_dir = 1UL; BKST линия GPIO 19 dir. */
#define BKST_gpio19_dir 1UL // 63 — SPI
/* Задаёт BKST_gpio20_dir = 0UL; BKST линия GPIO 20 dir. */
#define BKST_gpio20_dir 0UL // 64 2:9B mode 2
/* Задаёт BKST_gpio21_dir = 0UL; BKST линия GPIO 21 dir. */
#define BKST_gpio21_dir 0UL // 65 2:9A mode 4
/* Задаёт BKST_gpio22_dir = 0UL; BKST линия GPIO 22 dir. */
#define BKST_gpio22_dir 0UL // 66 2:12C mode 1
/* Задаёт BKST_gpio23_dir = 0UL; BKST линия GPIO 23 dir. */
#define BKST_gpio23_dir 0UL
/* Задаёт BKST_gpio24_dir = 1UL; BKST линия GPIO 24 dir. */
#define BKST_gpio24_dir 1UL // 68 2:12A select
/* Задаёт BKST_gpio25_dir = 0UL; BKST линия GPIO 25 dir. */
#define BKST_gpio25_dir 0UL
/* Задаёт BKST_gpio26_dir = 0UL; BKST линия GPIO 26 dir. */
#define BKST_gpio26_dir 0UL
/* Задаёт BKST_gpio27_dir = 1UL; BKST линия GPIO 27 dir. */
#define BKST_gpio27_dir 1UL // 73 2:11A select
/* Задаёт BKST_gpio32_dir = 1UL; BKST линия GPIO 32 dir. */
#define BKST_gpio32_dir 1UL // 74 2:10B DIOD green
/* Задаёт BKST_gpio33_dir = 0UL; BKST линия GPIO 33 dir. */
#define BKST_gpio33_dir 0UL
#define BKST_gpio34_dir 1UL // 142 — SCI
/* Задаёт BKST_gpio34_dir = 1UL; BKST линия GPIO 34 dir. */
#define BKST_gpio34_dir 1UL // 142 — SCI
/* Задаёт BKST_gpio48_dir = 1UL; BKST линия GPIO 48 dir. */
#define BKST_gpio48_dir 1UL // 88 2:14C DIOD red
/* Задаёт BKST_gpio49_dir = 0UL; BKST линия GPIO 49 dir. */
#define BKST_gpio49_dir 0UL
/* Задаёт BKST_gpio50_dir = 1UL; BKST линия GPIO 50 dir. */
#define BKST_gpio50_dir 1UL // 90 2:14A select
/* Задаёт BKST_gpio51_dir = 0UL; BKST линия GPIO 51 dir. */
#define BKST_gpio51_dir 0UL // 91 2:13C mode !8
/* Задаёт BKST_gpio52_dir = 0UL; BKST линия GPIO 52 dir. */
#define BKST_gpio52_dir 0UL
/* Задаёт BKST_gpio53_dir = 1UL; BKST линия GPIO 53 dir. */
#define BKST_gpio53_dir 1UL // 95 2:13A select
/* Задаёт BKST_gpio58_dir = 1UL; BKST линия GPIO 58 dir. */
#define BKST_gpio58_dir 1UL // 100 1:13C rez 1
/* Задаёт BKST_gpio59_dir = 1UL; BKST линия GPIO 59 dir. */
#define BKST_gpio59_dir 1UL // 110 1:13B gotov
/* Задаёт BKST_gpio60_dir = 1UL; BKST линия GPIO 60 dir. */
#define BKST_gpio60_dir 1UL // 111 1:13A led 1
/* Задаёт BKST_gpio61_dir = 1UL; BKST линия GPIO 61 dir. */
#define BKST_gpio61_dir 1UL // 112 1:14C rez 2
/* Задаёт BKST_gpio62_dir = 1UL; BKST линия GPIO 62 dir. */
#define BKST_gpio62_dir 1UL // 113 1:14B led 2
/* Задаёт BKST_gpio63_dir = 0UL; BKST линия GPIO 63 dir. */
#define BKST_gpio63_dir 0UL // 114 1:14A input
//===========================================================================
/* Задаёт PULT_gpio00_dir = 1UL; PULT линия GPIO 00 dir. */
#define PULT_gpio00_dir 1UL // 5 2:7A gotov
/* Задаёт PULT_gpio01_dir = 0UL; PULT линия GPIO 01 dir. */
#define PULT_gpio01_dir 0UL
/* Задаёт PULT_gpio02_dir = 1UL; PULT линия GPIO 02 dir. */
#define PULT_gpio02_dir 1UL // 7 2:7B ro 1
/* Задаёт PULT_gpio03_dir = 0UL; PULT линия GPIO 03 dir. */
#define PULT_gpio03_dir 0UL
/* Задаёт PULT_gpio04_dir = 0UL; PULT линия GPIO 04 dir. */
#define PULT_gpio04_dir 0UL
/* Задаёт PULT_gpio05_dir = 0UL; PULT линия GPIO 05 dir. */
#define PULT_gpio05_dir 0UL
/* Задаёт PULT_gpio06_dir = 1UL; PULT линия GPIO 06 dir. */
#define PULT_gpio06_dir 1UL // 13 2:6A kanal
/* Задаёт PULT_gpio07_dir = 0UL; PULT линия GPIO 07 dir. */
#define PULT_gpio07_dir 0UL
/* Задаёт PULT_gpio08_dir = 1UL; PULT линия GPIO 08 dir. */
#define PULT_gpio08_dir 1UL // 17 2:6B kanal
/* Задаёт PULT_gpio09_dir = 0UL; PULT линия GPIO 09 dir. */
#define PULT_gpio09_dir 0UL
/* Задаёт PULT_gpio10_dir = 0UL; PULT линия GPIO 10 dir. */
#define PULT_gpio10_dir 0UL
/* Задаёт PULT_gpio11_dir = 0UL; PULT линия GPIO 11 dir. */
#define PULT_gpio11_dir 0UL
#define PULT_gpio19_dir 1UL // 63 — SPI
/* Задаёт PULT_gpio19_dir = 1UL; PULT линия GPIO 19 dir. */
#define PULT_gpio19_dir 1UL // 63 — SPI
/* Задаёт PULT_gpio20_dir = 0UL; PULT линия GPIO 20 dir. */
#define PULT_gpio20_dir 0UL // 64 2:9B mode 2
/* Задаёт PULT_gpio21_dir = 0UL; PULT линия GPIO 21 dir. */
#define PULT_gpio21_dir 0UL // 65 2:9A mode 4
/* Задаёт PULT_gpio22_dir = 0UL; PULT линия GPIO 22 dir. */
#define PULT_gpio22_dir 0UL // 66 2:12C mode 1
/* Задаёт PULT_gpio23_dir = 0UL; PULT линия GPIO 23 dir. */
#define PULT_gpio23_dir 0UL // 67 2:12B button
/* Задаёт PULT_gpio24_dir = 0UL; PULT линия GPIO 24 dir. */
#define PULT_gpio24_dir 0UL // 68 2:12A button
/* Задаёт PULT_gpio25_dir = 0UL; PULT линия GPIO 25 dir. */
#define PULT_gpio25_dir 0UL
/* Задаёт PULT_gpio26_dir = 0UL; PULT линия GPIO 26 dir. */
#define PULT_gpio26_dir 0UL // 72 2:11B button
/* Задаёт PULT_gpio27_dir = 0UL; PULT линия GPIO 27 dir. */
#define PULT_gpio27_dir 0UL // 73 2:11A button
/* Задаёт PULT_gpio32_dir = 1UL; PULT линия GPIO 32 dir. */
#define PULT_gpio32_dir 1UL // 74 2:10B DIOD green
/* Задаёт PULT_gpio33_dir = 0UL; PULT линия GPIO 33 dir. */
#define PULT_gpio33_dir 0UL
#define PULT_gpio34_dir 1UL // 142 — SCI
/* Задаёт PULT_gpio34_dir = 1UL; PULT линия GPIO 34 dir. */
#define PULT_gpio34_dir 1UL // 142 — SCI
/* Задаёт PULT_gpio48_dir = 1UL; PULT линия GPIO 48 dir. */
#define PULT_gpio48_dir 1UL // 88 2:14C DIOD red
/* Задаёт PULT_gpio49_dir = 0UL; PULT линия GPIO 49 dir. */
#define PULT_gpio49_dir 0UL // 89 2:14B button
/* Задаёт PULT_gpio50_dir = 0UL; PULT линия GPIO 50 dir. */
#define PULT_gpio50_dir 0UL // 90 2:14A button
/* Задаёт PULT_gpio51_dir = 0UL; PULT линия GPIO 51 dir. */
#define PULT_gpio51_dir 0UL // 91 2:13C mode !8
/* Задаёт PULT_gpio52_dir = 0UL; PULT линия GPIO 52 dir. */
#define PULT_gpio52_dir 0UL // 94 2:13B button
/* Задаёт PULT_gpio53_dir = 0UL; PULT линия GPIO 53 dir. */
#define PULT_gpio53_dir 0UL // 95 2:13A button
/* Задаёт PULT_gpio58_dir = 0UL; PULT линия GPIO 58 dir. */
#define PULT_gpio58_dir 0UL
/* Задаёт PULT_gpio59_dir = 0UL; PULT линия GPIO 59 dir. */
#define PULT_gpio59_dir 0UL
/* Задаёт PULT_gpio60_dir = 0UL; PULT линия GPIO 60 dir. */
#define PULT_gpio60_dir 0UL
/* Задаёт PULT_gpio61_dir = 0UL; PULT линия GPIO 61 dir. */
#define PULT_gpio61_dir 0UL
/* Задаёт PULT_gpio62_dir = 0UL; PULT линия GPIO 62 dir. */
#define PULT_gpio62_dir 0UL
/* Задаёт PULT_gpio63_dir = 0UL; PULT линия GPIO 63 dir. */
#define PULT_gpio63_dir 0UL
//===========================================================================
/* Задаёт PLT2_gpio00_dir = 1UL; 2 линия GPIO 00 dir. */
#define PLT2_gpio00_dir 1UL // 5 2:7A gotov
/* Задаёт PLT2_gpio01_dir = 0UL; 2 линия GPIO 01 dir. */
#define PLT2_gpio01_dir 0UL
/* Задаёт PLT2_gpio02_dir = 0UL; 2 линия GPIO 02 dir. */
#define PLT2_gpio02_dir 0UL
/* Задаёт PLT2_gpio03_dir = 1UL; 2 линия GPIO 03 dir. */
#define PLT2_gpio03_dir 1UL // 10 2:4B res_pb
/* Задаёт PLT2_gpio04_dir = 0UL; 2 линия GPIO 04 dir. */
#define PLT2_gpio04_dir 0UL // 11 2:7C button
/* Задаёт PLT2_gpio05_dir = 0UL; 2 линия GPIO 05 dir. */
#define PLT2_gpio05_dir 0UL // 12 2:4C button
/* Задаёт PLT2_gpio06_dir = 1UL; 2 линия GPIO 06 dir. */
#define PLT2_gpio06_dir 1UL // 13 2:6A kanal
/* Задаёт PLT2_gpio07_dir = 0UL; 2 линия GPIO 07 dir. */
#define PLT2_gpio07_dir 0UL
/* Задаёт PLT2_gpio08_dir = 1UL; 2 линия GPIO 08 dir. */
#define PLT2_gpio08_dir 1UL // 17 2:6B kanal
/* Задаёт PLT2_gpio09_dir = 1UL; 2 линия GPIO 09 dir. */
#define PLT2_gpio09_dir 1UL // 18 2:3B res_lb
/* Задаёт PLT2_gpio10_dir = 0UL; 2 линия GPIO 10 dir. */
#define PLT2_gpio10_dir 0UL
/* Задаёт PLT2_gpio11_dir = 0UL; 2 линия GPIO 11 dir. */
#define PLT2_gpio11_dir 0UL
#define PLT2_gpio19_dir 1UL // 63 × SPI
/* Задаёт PLT2_gpio19_dir = 1UL; 2 линия GPIO 19 dir. */
#define PLT2_gpio19_dir 1UL // 63 Ч SPI
/* Задаёт PLT2_gpio20_dir = 0UL; 2 линия GPIO 20 dir. */
#define PLT2_gpio20_dir 0UL // 64 2:9B mode 2
/* Задаёт PLT2_gpio21_dir = 0UL; 2 линия GPIO 21 dir. */
#define PLT2_gpio21_dir 0UL // 65 2:9A mode 4
/* Задаёт PLT2_gpio22_dir = 0UL; 2 линия GPIO 22 dir. */
#define PLT2_gpio22_dir 0UL // 66 2:12C mode 1
/* Задаёт PLT2_gpio23_dir = 0UL; 2 линия GPIO 23 dir. */
#define PLT2_gpio23_dir 0UL // 67 2:12B button
/* Задаёт PLT2_gpio24_dir = 0UL; 2 линия GPIO 24 dir. */
#define PLT2_gpio24_dir 0UL // 68 2:12A button
/* Задаёт PLT2_gpio25_dir = 0UL; 2 линия GPIO 25 dir. */
#define PLT2_gpio25_dir 0UL // 69 2:11C button
/* Задаёт PLT2_gpio26_dir = 0UL; 2 линия GPIO 26 dir. */
#define PLT2_gpio26_dir 0UL // 72 2:11B button
/* Задаёт PLT2_gpio27_dir = 0UL; 2 линия GPIO 27 dir. */
#define PLT2_gpio27_dir 0UL // 73 2:11A button
/* Задаёт PLT2_gpio32_dir = 1UL; 2 линия GPIO 32 dir. */
#define PLT2_gpio32_dir 1UL // 74 2:10B DIOD green
/* Задаёт PLT2_gpio33_dir = 0UL; 2 линия GPIO 33 dir. */
#define PLT2_gpio33_dir 0UL // 75 2:10C button
#define PLT2_gpio34_dir 1UL // 142 × SCI
/* Задаёт PLT2_gpio34_dir = 1UL; 2 линия GPIO 34 dir. */
#define PLT2_gpio34_dir 1UL // 142 Ч SCI
/* Задаёт PLT2_gpio48_dir = 0UL; 2 линия GPIO 48 dir. */
#define PLT2_gpio48_dir 0UL // 88 2:14C button
/* Задаёт PLT2_gpio49_dir = 0UL; 2 линия GPIO 49 dir. */
#define PLT2_gpio49_dir 0UL // 89 2:14B button
/* Задаёт PLT2_gpio50_dir = 0UL; 2 линия GPIO 50 dir. */
#define PLT2_gpio50_dir 0UL // 90 2:14A button
/* Задаёт PLT2_gpio51_dir = 0UL; 2 линия GPIO 51 dir. */
#define PLT2_gpio51_dir 0UL // 91 2:13C mode !8
/* Задаёт PLT2_gpio52_dir = 0UL; 2 линия GPIO 52 dir. */
#define PLT2_gpio52_dir 0UL // 94 2:13B button
/* Задаёт PLT2_gpio53_dir = 0UL; 2 линия GPIO 53 dir. */
#define PLT2_gpio53_dir 0UL // 95 2:13A button
/* Задаёт PLT2_gpio58_dir = 0UL; 2 линия GPIO 58 dir. */
#define PLT2_gpio58_dir 0UL
/* Задаёт PLT2_gpio59_dir = 0UL; 2 линия GPIO 59 dir. */
#define PLT2_gpio59_dir 0UL
/* Задаёт PLT2_gpio60_dir = 0UL; 2 линия GPIO 60 dir. */
#define PLT2_gpio60_dir 0UL
/* Задаёт PLT2_gpio61_dir = 0UL; 2 линия GPIO 61 dir. */
#define PLT2_gpio61_dir 0UL
/* Задаёт PLT2_gpio62_dir = 0UL; 2 линия GPIO 62 dir. */
#define PLT2_gpio62_dir 0UL
/* Задаёт PLT2_gpio63_dir = 0UL; 2 линия GPIO 63 dir. */
#define PLT2_gpio63_dir 0UL
//===========================================================================
/* Задаёт SHKF_gpio00_dir = 0UL; SHKF линия GPIO 00 dir. */
#define SHKF_gpio00_dir 0UL // 5 2:7A input
/* Задаёт SHKF_gpio01_dir = 0UL; SHKF линия GPIO 01 dir. */
#define SHKF_gpio01_dir 0UL // 6 2:4A input
/* Задаёт SHKF_gpio02_dir = 0UL; SHKF линия GPIO 02 dir. */
#define SHKF_gpio02_dir 0UL // 7 2:7B input
/* Задаёт SHKF_gpio03_dir = 0UL; SHKF линия GPIO 03 dir. */
#define SHKF_gpio03_dir 0UL // 10 2:4B input
/* Задаёт SHKF_gpio04_dir = 0UL; SHKF линия GPIO 04 dir. */
#define SHKF_gpio04_dir 0UL // 11 2:7C input
/* Задаёт SHKF_gpio05_dir = 0UL; SHKF линия GPIO 05 dir. */
#define SHKF_gpio05_dir 0UL // 12 2:4C input
/* Задаёт SHKF_gpio06_dir = 0UL; SHKF линия GPIO 06 dir. */
#define SHKF_gpio06_dir 0UL // 13 2:6A input
/* Задаёт SHKF_gpio07_dir = 0UL; SHKF линия GPIO 07 dir. */
#define SHKF_gpio07_dir 0UL // 16 2:3A input
/* Задаёт SHKF_gpio08_dir = 0UL; SHKF линия GPIO 08 dir. */
#define SHKF_gpio08_dir 0UL // 17 2:6B input
/* Задаёт SHKF_gpio09_dir = 0UL; SHKF линия GPIO 09 dir. */
#define SHKF_gpio09_dir 0UL // 18 2:3B input
/* Задаёт SHKF_gpio10_dir = 0UL; SHKF линия GPIO 10 dir. */
#define SHKF_gpio10_dir 0UL // 19 2:6C input
/* Задаёт SHKF_gpio11_dir = 0UL; SHKF линия GPIO 11 dir. */
#define SHKF_gpio11_dir 0UL // 20 2:3C input
#define SHKF_gpio19_dir 1UL // 63 — SPI
/* Задаёт SHKF_gpio19_dir = 1UL; SHKF линия GPIO 19 dir. */
#define SHKF_gpio19_dir 1UL // 63 — SPI
/* Задаёт SHKF_gpio20_dir = 0UL; SHKF линия GPIO 20 dir. */
#define SHKF_gpio20_dir 0UL // 64 2:9B mode 2
/* Задаёт SHKF_gpio21_dir = 0UL; SHKF линия GPIO 21 dir. */
#define SHKF_gpio21_dir 0UL // 65 2:9A mode 4
/* Задаёт SHKF_gpio22_dir = 0UL; SHKF линия GPIO 22 dir. */
#define SHKF_gpio22_dir 0UL // 66 2:12C mode 1
/* Задаёт SHKF_gpio23_dir = 0UL; SHKF линия GPIO 23 dir. */
#define SHKF_gpio23_dir 0UL // 67 2:12B input
/* Задаёт SHKF_gpio24_dir = 0UL; SHKF линия GPIO 24 dir. */
#define SHKF_gpio24_dir 0UL // 68 2:12A input
/* Задаёт SHKF_gpio25_dir = 0UL; SHKF линия GPIO 25 dir. */
#define SHKF_gpio25_dir 0UL // 69 2:11C input
/* Задаёт SHKF_gpio26_dir = 0UL; SHKF линия GPIO 26 dir. */
#define SHKF_gpio26_dir 0UL // 72 2:11B input
/* Задаёт SHKF_gpio27_dir = 0UL; SHKF линия GPIO 27 dir. */
#define SHKF_gpio27_dir 0UL // 73 2:11A input
/* Задаёт SHKF_gpio32_dir = 0UL; SHKF линия GPIO 32 dir. */
#define SHKF_gpio32_dir 0UL // 74 2:10B input
/* Задаёт SHKF_gpio33_dir = 0UL; SHKF линия GPIO 33 dir. */
#define SHKF_gpio33_dir 0UL // 75 2:10C input
#define SHKF_gpio34_dir 1UL // 142 — SCI
/* Задаёт SHKF_gpio34_dir = 1UL; SHKF линия GPIO 34 dir. */
#define SHKF_gpio34_dir 1UL // 142 — SCI
/* Задаёт SHKF_gpio48_dir = 1UL; SHKF линия GPIO 48 dir. */
#define SHKF_gpio48_dir 1UL // 88 2:14C DIOD red
/* Задаёт SHKF_gpio49_dir = 0UL; SHKF линия GPIO 49 dir. */
#define SHKF_gpio49_dir 0UL // 89 2:14B input
/* Задаёт SHKF_gpio50_dir = 0UL; SHKF линия GPIO 50 dir. */
#define SHKF_gpio50_dir 0UL // 90 2:14A input
/* Задаёт SHKF_gpio51_dir = 0UL; SHKF линия GPIO 51 dir. */
#define SHKF_gpio51_dir 0UL // 91 2:13C mode !8
/* Задаёт SHKF_gpio52_dir = 0UL; SHKF линия GPIO 52 dir. */
#define SHKF_gpio52_dir 0UL // 94 2:13B input
/* Задаёт SHKF_gpio53_dir = 0UL; SHKF линия GPIO 53 dir. */
#define SHKF_gpio53_dir 0UL // 95 2:13A input
/* Задаёт SHKF_gpio58_dir = 1UL; SHKF линия GPIO 58 dir. */
#define SHKF_gpio58_dir 1UL // 100 1:13C rez 1
/* Задаёт SHKF_gpio59_dir = 1UL; SHKF линия GPIO 59 dir. */
#define SHKF_gpio59_dir 1UL // 110 1:13B gotov
/* Задаёт SHKF_gpio60_dir = 1UL; SHKF линия GPIO 60 dir. */
#define SHKF_gpio60_dir 1UL // 111 1:13A led 1
/* Задаёт SHKF_gpio61_dir = 1UL; SHKF линия GPIO 61 dir. */
#define SHKF_gpio61_dir 1UL // 112 1:14C rez 2
/* Задаёт SHKF_gpio62_dir = 0UL; SHKF линия GPIO 62 dir. */
#define SHKF_gpio62_dir 0UL
/* Задаёт SHKF_gpio63_dir = 1UL; SHKF линия GPIO 63 dir. */
#define SHKF_gpio63_dir 1UL // 114 1:14A led 2
//===========================================================================
/* Задаёт LOAD_gpio00_dir = 0UL; LOAD линия GPIO 00 dir. */
#define LOAD_gpio00_dir 0UL
/* Задаёт LOAD_gpio01_dir = 1UL; LOAD линия GPIO 01 dir. */
#define LOAD_gpio01_dir 1UL // 6 2:4A led 2
/* Задаёт LOAD_gpio02_dir = 0UL; LOAD линия GPIO 02 dir. */
#define LOAD_gpio02_dir 0UL
/* Задаёт LOAD_gpio03_dir = 1UL; LOAD линия GPIO 03 dir. */
#define LOAD_gpio03_dir 1UL // 10 2:4B res_out 2
/* Задаёт LOAD_gpio04_dir = 0UL; LOAD линия GPIO 04 dir. */
#define LOAD_gpio04_dir 0UL
/* Задаёт LOAD_gpio05_dir = 0UL; LOAD линия GPIO 05 dir. */
#define LOAD_gpio05_dir 0UL
/* Задаёт LOAD_gpio06_dir = 0UL; LOAD линия GPIO 06 dir. */
#define LOAD_gpio06_dir 0UL // 13 2:6A omega d
/* Задаёт LOAD_gpio07_dir = 1UL; LOAD линия GPIO 07 dir. */
#define LOAD_gpio07_dir 1UL // 16 2:3A led 1
/* Задаёт LOAD_gpio08_dir = 0UL; LOAD линия GPIO 08 dir. */
#define LOAD_gpio08_dir 0UL // 17 2:6B start 1
/* Задаёт LOAD_gpio09_dir = 1UL; LOAD линия GPIO 09 dir. */
#define LOAD_gpio09_dir 1UL // 18 2:3B res_out 1
/* Задаёт LOAD_gpio10_dir = 0UL; LOAD линия GPIO 10 dir. */
#define LOAD_gpio10_dir 0UL
/* Задаёт LOAD_gpio11_dir = 0UL; LOAD линия GPIO 11 dir. */
#define LOAD_gpio11_dir 0UL // 20 2:3C res_in 0
#define LOAD_gpio19_dir 1UL // 63 — SPI
/* Задаёт LOAD_gpio19_dir = 1UL; LOAD линия GPIO 19 dir. */
#define LOAD_gpio19_dir 1UL // 63 — SPI
/* Задаёт LOAD_gpio20_dir = 0UL; LOAD линия GPIO 20 dir. */
#define LOAD_gpio20_dir 0UL // 64 2:9B mode 2
/* Задаёт LOAD_gpio21_dir = 0UL; LOAD линия GPIO 21 dir. */
#define LOAD_gpio21_dir 0UL // 65 2:9A mode 4
/* Задаёт LOAD_gpio22_dir = 0UL; LOAD линия GPIO 22 dir. */
#define LOAD_gpio22_dir 0UL // 66 2:12C mode 1
/* Задаёт LOAD_gpio23_dir = 0UL; LOAD линия GPIO 23 dir. */
#define LOAD_gpio23_dir 0UL
/* Задаёт LOAD_gpio24_dir = 0UL; LOAD линия GPIO 24 dir. */
#define LOAD_gpio24_dir 0UL
/* Задаёт LOAD_gpio25_dir = 0UL; LOAD линия GPIO 25 dir. */
#define LOAD_gpio25_dir 0UL
/* Задаёт LOAD_gpio26_dir = 0UL; LOAD линия GPIO 26 dir. */
#define LOAD_gpio26_dir 0UL
/* Задаёт LOAD_gpio27_dir = 0UL; LOAD линия GPIO 27 dir. */
#define LOAD_gpio27_dir 0UL
/* Задаёт LOAD_gpio32_dir = 1UL; LOAD линия GPIO 32 dir. */
#define LOAD_gpio32_dir 1UL // 74 2:10B DIOD green
/* Задаёт LOAD_gpio33_dir = 0UL; LOAD линия GPIO 33 dir. */
#define LOAD_gpio33_dir 0UL
#define LOAD_gpio34_dir 1UL // 142 — SCI
/* Задаёт LOAD_gpio34_dir = 1UL; LOAD линия GPIO 34 dir. */
#define LOAD_gpio34_dir 1UL // 142 — SCI
/* Задаёт LOAD_gpio48_dir = 1UL; LOAD линия GPIO 48 dir. */
#define LOAD_gpio48_dir 1UL // 88 2:14C DIOD red
/* Задаёт LOAD_gpio49_dir = 0UL; LOAD линия GPIO 49 dir. */
#define LOAD_gpio49_dir 0UL
/* Задаёт LOAD_gpio50_dir = 0UL; LOAD линия GPIO 50 dir. */
#define LOAD_gpio50_dir 0UL
/* Задаёт LOAD_gpio51_dir = 0UL; LOAD линия GPIO 51 dir. */
#define LOAD_gpio51_dir 0UL // 91 2:13C mode !8
/* Задаёт LOAD_gpio52_dir = 0UL; LOAD линия GPIO 52 dir. */
#define LOAD_gpio52_dir 0UL
/* Задаёт LOAD_gpio53_dir = 0UL; LOAD линия GPIO 53 dir. */
#define LOAD_gpio53_dir 0UL
/* Задаёт LOAD_gpio58_dir = 1UL; LOAD линия GPIO 58 dir. */
#define LOAD_gpio58_dir 1UL // 100 1:13C stop_dptb
/* Задаёт LOAD_gpio59_dir = 1UL; LOAD линия GPIO 59 dir. */
#define LOAD_gpio59_dir 1UL // 110 1:13B csdac
/* Задаёт LOAD_gpio60_dir = 1UL; LOAD линия GPIO 60 dir. */
#define LOAD_gpio60_dir 1UL // 111 1:13A didac
/* Задаёт LOAD_gpio61_dir = 1UL; LOAD линия GPIO 61 dir. */
#define LOAD_gpio61_dir 1UL // 112 1:14C gotov
/* Задаёт LOAD_gpio62_dir = 1UL; LOAD линия GPIO 62 dir. */
#define LOAD_gpio62_dir 1UL // 113 1:14B start_dptb
/* Задаёт LOAD_gpio63_dir = 1UL; LOAD линия GPIO 63 dir. */
#define LOAD_gpio63_dir 1UL // 114 1:14A clkdac
//===========================================================================
/* Задаёт COMM_GPADIR = (COMM_gpio00_dir ) + (COMM_gpio01_dir<<1) + (COMM_gpio02_dir<<2) + (COMM_gpio03_dir<<3) +; данные COMM_GPADIR. */
#define COMM_GPADIR (COMM_gpio00_dir ) + (COMM_gpio01_dir<<1) + (COMM_gpio02_dir<<2) + (COMM_gpio03_dir<<3) + \
(COMM_gpio04_dir<<4) + (COMM_gpio05_dir<<5) + (COMM_gpio06_dir<<6) + (COMM_gpio07_dir<<7) + \
(COMM_gpio08_dir<<8) + (COMM_gpio09_dir<<9) + (COMM_gpio10_dir<<10)+ (COMM_gpio11_dir<<11)+ \
(COMM_gpio19_dir<<19)+ \
(COMM_gpio20_dir<<20)+ (COMM_gpio21_dir<<21)+ (COMM_gpio22_dir<<22)+ (COMM_gpio23_dir<<23)+ \
(COMM_gpio24_dir<<24)+ (COMM_gpio25_dir<<25)+ (COMM_gpio26_dir<<26)+ (COMM_gpio27_dir<<27);
(COMM_gpio04_dir<<4) + (COMM_gpio05_dir<<5) + (COMM_gpio06_dir<<6) + (COMM_gpio07_dir<<7) + /* Продолжает список аргументов, полей или выражение (COMM_gpio04_dir<<4) + (COMM_gpio05_dir<<5) + (COMM_gpio06_dir<<6) + (COMM_gpio07_dir<<7) +; порядок элементов сохраняется. */ \
(COMM_gpio08_dir<<8) + (COMM_gpio09_dir<<9) + (COMM_gpio10_dir<<10)+ (COMM_gpio11_dir<<11)+ /* Продолжает список аргументов, полей или выражение (COMM_gpio08_dir<<8) + (COMM_gpio09_dir<<9) + (COMM_gpio10_dir<<10)+ (COMM_gpio11_dir<<11)+; порядок элементов сохраняется. */ \
(COMM_gpio19_dir<<19)+ /* Продолжает список аргументов, полей или выражение (COMM_gpio19_dir<<19)+; порядок элементов сохраняется. */ \
(COMM_gpio20_dir<<20)+ (COMM_gpio21_dir<<21)+ (COMM_gpio22_dir<<22)+ (COMM_gpio23_dir<<23)+ /* Продолжает список аргументов, полей или выражение (COMM_gpio20_dir<<20)+ (COMM_gpio21_dir<<21)+ (COMM_gpio22_dir<<22)+ (COMM_gpio23_dir<<23)+; порядок элементов сохраняется. */ \
(COMM_gpio24_dir<<24)+ (COMM_gpio25_dir<<25)+ (COMM_gpio26_dir<<26)+ (COMM_gpio27_dir<<27); /* Продолжает список аргументов, полей или выражение (COMM_gpio24_dir<<24)+ (COMM_gpio25_dir<<25)+ (COMM_gpio26_dir<<26)+ (COMM_gpio27_dir<<27);; порядок элементов сохраняется. */
/* Задаёт COMM_GPBDIR = (COMM_gpio32_dir )+ (COMM_gpio33_dir<<1) + (COMM_gpio34_dir<<2 )+; данные COMM_GPBDIR. */
#define COMM_GPBDIR (COMM_gpio32_dir )+ (COMM_gpio33_dir<<1) + (COMM_gpio34_dir<<2 )+ \
(COMM_gpio48_dir<<16)+ (COMM_gpio49_dir<<17)+ (COMM_gpio50_dir<<18)+ (COMM_gpio51_dir<<19)+ \
(COMM_gpio52_dir<<20)+ (COMM_gpio53_dir<<21)+ \
(COMM_gpio58_dir<<26)+ (COMM_gpio59_dir<<27)+ \
(COMM_gpio60_dir<<28)+ (COMM_gpio61_dir<<29)+ (COMM_gpio62_dir<<30)+ (COMM_gpio63_dir<<31);
(COMM_gpio48_dir<<16)+ (COMM_gpio49_dir<<17)+ (COMM_gpio50_dir<<18)+ (COMM_gpio51_dir<<19)+ /* Продолжает список аргументов, полей или выражение (COMM_gpio48_dir<<16)+ (COMM_gpio49_dir<<17)+ (COMM_gpio50_dir<<18)+ (COMM_gpio51_dir<<19)+; порядок элементов сохраняется. */ \
(COMM_gpio52_dir<<20)+ (COMM_gpio53_dir<<21)+ /* Продолжает список аргументов, полей или выражение (COMM_gpio52_dir<<20)+ (COMM_gpio53_dir<<21)+; порядок элементов сохраняется. */ \
(COMM_gpio58_dir<<26)+ (COMM_gpio59_dir<<27)+ /* Продолжает список аргументов, полей или выражение (COMM_gpio58_dir<<26)+ (COMM_gpio59_dir<<27)+; порядок элементов сохраняется. */ \
(COMM_gpio60_dir<<28)+ (COMM_gpio61_dir<<29)+ (COMM_gpio62_dir<<30)+ (COMM_gpio63_dir<<31); /* Продолжает список аргументов, полей или выражение (COMM_gpio60_dir<<28)+ (COMM_gpio61_dir<<29)+ (COMM_gpio62_dir<<30)+ (COMM_gpio63_dir<<31);; порядок элементов сохраняется. */
/* Задаёт BKSD_GPADIR = (BKSD_gpio00_dir ) + (BKSD_gpio01_dir<<1) + (BKSD_gpio02_dir<<2) + (BKSD_gpio03_dir<<3) +; данные BKSD_GPADIR. */
#define BKSD_GPADIR (BKSD_gpio00_dir ) + (BKSD_gpio01_dir<<1) + (BKSD_gpio02_dir<<2) + (BKSD_gpio03_dir<<3) + \
(BKSD_gpio04_dir<<4) + (BKSD_gpio05_dir<<5) + (BKSD_gpio06_dir<<6) + (BKSD_gpio07_dir<<7) + \
(BKSD_gpio08_dir<<8) + (BKSD_gpio09_dir<<9) + (BKSD_gpio10_dir<<10)+ (BKSD_gpio11_dir<<11)+ \
(BKSD_gpio19_dir<<19)+ \
(BKSD_gpio20_dir<<20)+ (BKSD_gpio21_dir<<21)+ (BKSD_gpio22_dir<<22)+ (BKSD_gpio23_dir<<23)+ \
(BKSD_gpio24_dir<<24)+ (BKSD_gpio25_dir<<25)+ (BKSD_gpio26_dir<<26)+ (BKSD_gpio27_dir<<27);
(BKSD_gpio04_dir<<4) + (BKSD_gpio05_dir<<5) + (BKSD_gpio06_dir<<6) + (BKSD_gpio07_dir<<7) + /* Продолжает список аргументов, полей или выражение (BKSD_gpio04_dir<<4) + (BKSD_gpio05_dir<<5) + (BKSD_gpio06_dir<<6) + (BKSD_gpio07_dir<<7) +; порядок элементов сохраняется. */ \
(BKSD_gpio08_dir<<8) + (BKSD_gpio09_dir<<9) + (BKSD_gpio10_dir<<10)+ (BKSD_gpio11_dir<<11)+ /* Продолжает список аргументов, полей или выражение (BKSD_gpio08_dir<<8) + (BKSD_gpio09_dir<<9) + (BKSD_gpio10_dir<<10)+ (BKSD_gpio11_dir<<11)+; порядок элементов сохраняется. */ \
(BKSD_gpio19_dir<<19)+ /* Продолжает список аргументов, полей или выражение (BKSD_gpio19_dir<<19)+; порядок элементов сохраняется. */ \
(BKSD_gpio20_dir<<20)+ (BKSD_gpio21_dir<<21)+ (BKSD_gpio22_dir<<22)+ (BKSD_gpio23_dir<<23)+ /* Продолжает список аргументов, полей или выражение (BKSD_gpio20_dir<<20)+ (BKSD_gpio21_dir<<21)+ (BKSD_gpio22_dir<<22)+ (BKSD_gpio23_dir<<23)+; порядок элементов сохраняется. */ \
(BKSD_gpio24_dir<<24)+ (BKSD_gpio25_dir<<25)+ (BKSD_gpio26_dir<<26)+ (BKSD_gpio27_dir<<27); /* Продолжает список аргументов, полей или выражение (BKSD_gpio24_dir<<24)+ (BKSD_gpio25_dir<<25)+ (BKSD_gpio26_dir<<26)+ (BKSD_gpio27_dir<<27);; порядок элементов сохраняется. */
/* Задаёт BKSD_GPBDIR = (BKSD_gpio32_dir )+ (BKSD_gpio33_dir<<1) + (BKSD_gpio34_dir<<2 )+; данные BKSD_GPBDIR. */
#define BKSD_GPBDIR (BKSD_gpio32_dir )+ (BKSD_gpio33_dir<<1) + (BKSD_gpio34_dir<<2 )+ \
(BKSD_gpio48_dir<<16)+ (BKSD_gpio49_dir<<17)+ (BKSD_gpio50_dir<<18)+ (BKSD_gpio51_dir<<19)+ \
(BKSD_gpio52_dir<<20)+ (BKSD_gpio53_dir<<21)+ \
(BKSD_gpio58_dir<<26)+ (BKSD_gpio59_dir<<27)+ \
(BKSD_gpio60_dir<<28)+ (BKSD_gpio61_dir<<29)+ (BKSD_gpio62_dir<<30)+ (BKSD_gpio63_dir<<31);
(BKSD_gpio48_dir<<16)+ (BKSD_gpio49_dir<<17)+ (BKSD_gpio50_dir<<18)+ (BKSD_gpio51_dir<<19)+ /* Продолжает список аргументов, полей или выражение (BKSD_gpio48_dir<<16)+ (BKSD_gpio49_dir<<17)+ (BKSD_gpio50_dir<<18)+ (BKSD_gpio51_dir<<19)+; порядок элементов сохраняется. */ \
(BKSD_gpio52_dir<<20)+ (BKSD_gpio53_dir<<21)+ /* Продолжает список аргументов, полей или выражение (BKSD_gpio52_dir<<20)+ (BKSD_gpio53_dir<<21)+; порядок элементов сохраняется. */ \
(BKSD_gpio58_dir<<26)+ (BKSD_gpio59_dir<<27)+ /* Продолжает список аргументов, полей или выражение (BKSD_gpio58_dir<<26)+ (BKSD_gpio59_dir<<27)+; порядок элементов сохраняется. */ \
(BKSD_gpio60_dir<<28)+ (BKSD_gpio61_dir<<29)+ (BKSD_gpio62_dir<<30)+ (BKSD_gpio63_dir<<31); /* Продолжает список аргументов, полей или выражение (BKSD_gpio60_dir<<28)+ (BKSD_gpio61_dir<<29)+ (BKSD_gpio62_dir<<30)+ (BKSD_gpio63_dir<<31);; порядок элементов сохраняется. */
/* Задаёт BKST_GPADIR = (BKST_gpio00_dir ) + (BKST_gpio01_dir<<1) + (BKST_gpio02_dir<<2) + (BKST_gpio03_dir<<3) +; данные BKST_GPADIR. */
#define BKST_GPADIR (BKST_gpio00_dir ) + (BKST_gpio01_dir<<1) + (BKST_gpio02_dir<<2) + (BKST_gpio03_dir<<3) + \
(BKST_gpio04_dir<<4) + (BKST_gpio05_dir<<5) + (BKST_gpio06_dir<<6) + (BKST_gpio07_dir<<7) + \
(BKST_gpio08_dir<<8) + (BKST_gpio09_dir<<9) + (BKST_gpio10_dir<<10)+ (BKST_gpio11_dir<<11)+ \
(BKST_gpio19_dir<<19)+ \
(BKST_gpio20_dir<<20)+ (BKST_gpio21_dir<<21)+ (BKST_gpio22_dir<<22)+ (BKST_gpio23_dir<<23)+ \
(BKST_gpio24_dir<<24)+ (BKST_gpio25_dir<<25)+ (BKST_gpio26_dir<<26)+ (BKST_gpio27_dir<<27);
(BKST_gpio04_dir<<4) + (BKST_gpio05_dir<<5) + (BKST_gpio06_dir<<6) + (BKST_gpio07_dir<<7) + /* Продолжает список аргументов, полей или выражение (BKST_gpio04_dir<<4) + (BKST_gpio05_dir<<5) + (BKST_gpio06_dir<<6) + (BKST_gpio07_dir<<7) +; порядок элементов сохраняется. */ \
(BKST_gpio08_dir<<8) + (BKST_gpio09_dir<<9) + (BKST_gpio10_dir<<10)+ (BKST_gpio11_dir<<11)+ /* Продолжает список аргументов, полей или выражение (BKST_gpio08_dir<<8) + (BKST_gpio09_dir<<9) + (BKST_gpio10_dir<<10)+ (BKST_gpio11_dir<<11)+; порядок элементов сохраняется. */ \
(BKST_gpio19_dir<<19)+ /* Продолжает список аргументов, полей или выражение (BKST_gpio19_dir<<19)+; порядок элементов сохраняется. */ \
(BKST_gpio20_dir<<20)+ (BKST_gpio21_dir<<21)+ (BKST_gpio22_dir<<22)+ (BKST_gpio23_dir<<23)+ /* Продолжает список аргументов, полей или выражение (BKST_gpio20_dir<<20)+ (BKST_gpio21_dir<<21)+ (BKST_gpio22_dir<<22)+ (BKST_gpio23_dir<<23)+; порядок элементов сохраняется. */ \
(BKST_gpio24_dir<<24)+ (BKST_gpio25_dir<<25)+ (BKST_gpio26_dir<<26)+ (BKST_gpio27_dir<<27); /* Продолжает список аргументов, полей или выражение (BKST_gpio24_dir<<24)+ (BKST_gpio25_dir<<25)+ (BKST_gpio26_dir<<26)+ (BKST_gpio27_dir<<27);; порядок элементов сохраняется. */
/* Задаёт BKST_GPBDIR = (BKST_gpio32_dir )+ (BKST_gpio33_dir<<1) + (BKST_gpio34_dir<<2 )+; данные BKST_GPBDIR. */
#define BKST_GPBDIR (BKST_gpio32_dir )+ (BKST_gpio33_dir<<1) + (BKST_gpio34_dir<<2 )+ \
(BKST_gpio48_dir<<16)+ (BKST_gpio49_dir<<17)+ (BKST_gpio50_dir<<18)+ (BKST_gpio51_dir<<19)+ \
(BKST_gpio52_dir<<20)+ (BKST_gpio53_dir<<21)+ \
(BKST_gpio58_dir<<26)+ (BKST_gpio59_dir<<27)+ \
(BKST_gpio60_dir<<28)+ (BKST_gpio61_dir<<29)+ (BKST_gpio62_dir<<30)+ (BKST_gpio63_dir<<31);
(BKST_gpio48_dir<<16)+ (BKST_gpio49_dir<<17)+ (BKST_gpio50_dir<<18)+ (BKST_gpio51_dir<<19)+ /* Продолжает список аргументов, полей или выражение (BKST_gpio48_dir<<16)+ (BKST_gpio49_dir<<17)+ (BKST_gpio50_dir<<18)+ (BKST_gpio51_dir<<19)+; порядок элементов сохраняется. */ \
(BKST_gpio52_dir<<20)+ (BKST_gpio53_dir<<21)+ /* Продолжает список аргументов, полей или выражение (BKST_gpio52_dir<<20)+ (BKST_gpio53_dir<<21)+; порядок элементов сохраняется. */ \
(BKST_gpio58_dir<<26)+ (BKST_gpio59_dir<<27)+ /* Продолжает список аргументов, полей или выражение (BKST_gpio58_dir<<26)+ (BKST_gpio59_dir<<27)+; порядок элементов сохраняется. */ \
(BKST_gpio60_dir<<28)+ (BKST_gpio61_dir<<29)+ (BKST_gpio62_dir<<30)+ (BKST_gpio63_dir<<31); /* Продолжает список аргументов, полей или выражение (BKST_gpio60_dir<<28)+ (BKST_gpio61_dir<<29)+ (BKST_gpio62_dir<<30)+ (BKST_gpio63_dir<<31);; порядок элементов сохраняется. */
/* Задаёт PULT_GPADIR = (PULT_gpio00_dir ) + (PULT_gpio01_dir<<1) + (PULT_gpio02_dir<<2) + (PULT_gpio03_dir<<3) +; данные PULT_GPADIR. */
#define PULT_GPADIR (PULT_gpio00_dir ) + (PULT_gpio01_dir<<1) + (PULT_gpio02_dir<<2) + (PULT_gpio03_dir<<3) + \
(PULT_gpio04_dir<<4) + (PULT_gpio05_dir<<5) + (PULT_gpio06_dir<<6) + (PULT_gpio07_dir<<7) + \
(PULT_gpio08_dir<<8) + (PULT_gpio09_dir<<9) + (PULT_gpio10_dir<<10)+ (PULT_gpio11_dir<<11)+ \
(PULT_gpio19_dir<<19)+ \
(PULT_gpio20_dir<<20)+ (PULT_gpio21_dir<<21)+ (PULT_gpio22_dir<<22)+ (PULT_gpio23_dir<<23)+ \
(PULT_gpio24_dir<<24)+ (PULT_gpio25_dir<<25)+ (PULT_gpio26_dir<<26)+ (PULT_gpio27_dir<<27);
(PULT_gpio04_dir<<4) + (PULT_gpio05_dir<<5) + (PULT_gpio06_dir<<6) + (PULT_gpio07_dir<<7) + /* Продолжает список аргументов, полей или выражение (PULT_gpio04_dir<<4) + (PULT_gpio05_dir<<5) + (PULT_gpio06_dir<<6) + (PULT_gpio07_dir<<7) +; порядок элементов сохраняется. */ \
(PULT_gpio08_dir<<8) + (PULT_gpio09_dir<<9) + (PULT_gpio10_dir<<10)+ (PULT_gpio11_dir<<11)+ /* Продолжает список аргументов, полей или выражение (PULT_gpio08_dir<<8) + (PULT_gpio09_dir<<9) + (PULT_gpio10_dir<<10)+ (PULT_gpio11_dir<<11)+; порядок элементов сохраняется. */ \
(PULT_gpio19_dir<<19)+ /* Продолжает список аргументов, полей или выражение (PULT_gpio19_dir<<19)+; порядок элементов сохраняется. */ \
(PULT_gpio20_dir<<20)+ (PULT_gpio21_dir<<21)+ (PULT_gpio22_dir<<22)+ (PULT_gpio23_dir<<23)+ /* Продолжает список аргументов, полей или выражение (PULT_gpio20_dir<<20)+ (PULT_gpio21_dir<<21)+ (PULT_gpio22_dir<<22)+ (PULT_gpio23_dir<<23)+; порядок элементов сохраняется. */ \
(PULT_gpio24_dir<<24)+ (PULT_gpio25_dir<<25)+ (PULT_gpio26_dir<<26)+ (PULT_gpio27_dir<<27); /* Продолжает список аргументов, полей или выражение (PULT_gpio24_dir<<24)+ (PULT_gpio25_dir<<25)+ (PULT_gpio26_dir<<26)+ (PULT_gpio27_dir<<27);; порядок элементов сохраняется. */
/* Задаёт PULT_GPBDIR = (PULT_gpio32_dir )+ (PULT_gpio33_dir<<1) + (PULT_gpio34_dir<<2 )+; данные PULT_GPBDIR. */
#define PULT_GPBDIR (PULT_gpio32_dir )+ (PULT_gpio33_dir<<1) + (PULT_gpio34_dir<<2 )+ \
(PULT_gpio48_dir<<16)+ (PULT_gpio49_dir<<17)+ (PULT_gpio50_dir<<18)+ (PULT_gpio51_dir<<19)+ \
(PULT_gpio52_dir<<20)+ (PULT_gpio53_dir<<21)+ \
(PULT_gpio58_dir<<26)+ (PULT_gpio59_dir<<27)+ \
(PULT_gpio60_dir<<28)+ (PULT_gpio61_dir<<29)+ (PULT_gpio62_dir<<30)+ (PULT_gpio63_dir<<31);
(PULT_gpio48_dir<<16)+ (PULT_gpio49_dir<<17)+ (PULT_gpio50_dir<<18)+ (PULT_gpio51_dir<<19)+ /* Продолжает список аргументов, полей или выражение (PULT_gpio48_dir<<16)+ (PULT_gpio49_dir<<17)+ (PULT_gpio50_dir<<18)+ (PULT_gpio51_dir<<19)+; порядок элементов сохраняется. */ \
(PULT_gpio52_dir<<20)+ (PULT_gpio53_dir<<21)+ /* Продолжает список аргументов, полей или выражение (PULT_gpio52_dir<<20)+ (PULT_gpio53_dir<<21)+; порядок элементов сохраняется. */ \
(PULT_gpio58_dir<<26)+ (PULT_gpio59_dir<<27)+ /* Продолжает список аргументов, полей или выражение (PULT_gpio58_dir<<26)+ (PULT_gpio59_dir<<27)+; порядок элементов сохраняется. */ \
(PULT_gpio60_dir<<28)+ (PULT_gpio61_dir<<29)+ (PULT_gpio62_dir<<30)+ (PULT_gpio63_dir<<31); /* Продолжает список аргументов, полей или выражение (PULT_gpio60_dir<<28)+ (PULT_gpio61_dir<<29)+ (PULT_gpio62_dir<<30)+ (PULT_gpio63_dir<<31);; порядок элементов сохраняется. */
/* Задаёт PLT2_GPADIR = (PLT2_gpio00_dir ) + (PLT2_gpio01_dir<<1) + (PLT2_gpio02_dir<<2) + (PLT2_gpio03_dir<<3) +; данные PLT2_GPADIR. */
#define PLT2_GPADIR (PLT2_gpio00_dir ) + (PLT2_gpio01_dir<<1) + (PLT2_gpio02_dir<<2) + (PLT2_gpio03_dir<<3) + \
(PLT2_gpio04_dir<<4) + (PLT2_gpio05_dir<<5) + (PLT2_gpio06_dir<<6) + (PLT2_gpio07_dir<<7) + \
(PLT2_gpio08_dir<<8) + (PLT2_gpio09_dir<<9) + (PLT2_gpio10_dir<<10)+ (PLT2_gpio11_dir<<11)+ \
(PLT2_gpio19_dir<<19)+ \
(PLT2_gpio20_dir<<20)+ (PLT2_gpio21_dir<<21)+ (PLT2_gpio22_dir<<22)+ (PLT2_gpio23_dir<<23)+ \
(PLT2_gpio24_dir<<24)+ (PLT2_gpio25_dir<<25)+ (PLT2_gpio26_dir<<26)+ (PLT2_gpio27_dir<<27);
(PLT2_gpio04_dir<<4) + (PLT2_gpio05_dir<<5) + (PLT2_gpio06_dir<<6) + (PLT2_gpio07_dir<<7) + /* Продолжает список аргументов, полей или выражение (PLT2_gpio04_dir<<4) + (PLT2_gpio05_dir<<5) + (PLT2_gpio06_dir<<6) + (PLT2_gpio07_dir<<7) +; порядок элементов сохраняется. */ \
(PLT2_gpio08_dir<<8) + (PLT2_gpio09_dir<<9) + (PLT2_gpio10_dir<<10)+ (PLT2_gpio11_dir<<11)+ /* Продолжает список аргументов, полей или выражение (PLT2_gpio08_dir<<8) + (PLT2_gpio09_dir<<9) + (PLT2_gpio10_dir<<10)+ (PLT2_gpio11_dir<<11)+; порядок элементов сохраняется. */ \
(PLT2_gpio19_dir<<19)+ /* Продолжает список аргументов, полей или выражение (PLT2_gpio19_dir<<19)+; порядок элементов сохраняется. */ \
(PLT2_gpio20_dir<<20)+ (PLT2_gpio21_dir<<21)+ (PLT2_gpio22_dir<<22)+ (PLT2_gpio23_dir<<23)+ /* Продолжает список аргументов, полей или выражение (PLT2_gpio20_dir<<20)+ (PLT2_gpio21_dir<<21)+ (PLT2_gpio22_dir<<22)+ (PLT2_gpio23_dir<<23)+; порядок элементов сохраняется. */ \
(PLT2_gpio24_dir<<24)+ (PLT2_gpio25_dir<<25)+ (PLT2_gpio26_dir<<26)+ (PLT2_gpio27_dir<<27); /* Продолжает список аргументов, полей или выражение (PLT2_gpio24_dir<<24)+ (PLT2_gpio25_dir<<25)+ (PLT2_gpio26_dir<<26)+ (PLT2_gpio27_dir<<27);; порядок элементов сохраняется. */
/* Задаёт PLT2_GPBDIR = (PLT2_gpio32_dir )+ (PLT2_gpio33_dir<<1) + (PLT2_gpio34_dir<<2 )+; данные PLT2_GPBDIR. */
#define PLT2_GPBDIR (PLT2_gpio32_dir )+ (PLT2_gpio33_dir<<1) + (PLT2_gpio34_dir<<2 )+ \
(PLT2_gpio48_dir<<16)+ (PLT2_gpio49_dir<<17)+ (PLT2_gpio50_dir<<18)+ (PLT2_gpio51_dir<<19)+ \
(PLT2_gpio52_dir<<20)+ (PLT2_gpio53_dir<<21)+ \
(PLT2_gpio58_dir<<26)+ (PLT2_gpio59_dir<<27)+ \
(PLT2_gpio60_dir<<28)+ (PLT2_gpio61_dir<<29)+ (PLT2_gpio62_dir<<30)+ (PLT2_gpio63_dir<<31);
(PLT2_gpio48_dir<<16)+ (PLT2_gpio49_dir<<17)+ (PLT2_gpio50_dir<<18)+ (PLT2_gpio51_dir<<19)+ /* Продолжает список аргументов, полей или выражение (PLT2_gpio48_dir<<16)+ (PLT2_gpio49_dir<<17)+ (PLT2_gpio50_dir<<18)+ (PLT2_gpio51_dir<<19)+; порядок элементов сохраняется. */ \
(PLT2_gpio52_dir<<20)+ (PLT2_gpio53_dir<<21)+ /* Продолжает список аргументов, полей или выражение (PLT2_gpio52_dir<<20)+ (PLT2_gpio53_dir<<21)+; порядок элементов сохраняется. */ \
(PLT2_gpio58_dir<<26)+ (PLT2_gpio59_dir<<27)+ /* Продолжает список аргументов, полей или выражение (PLT2_gpio58_dir<<26)+ (PLT2_gpio59_dir<<27)+; порядок элементов сохраняется. */ \
(PLT2_gpio60_dir<<28)+ (PLT2_gpio61_dir<<29)+ (PLT2_gpio62_dir<<30)+ (PLT2_gpio63_dir<<31); /* Продолжает список аргументов, полей или выражение (PLT2_gpio60_dir<<28)+ (PLT2_gpio61_dir<<29)+ (PLT2_gpio62_dir<<30)+ (PLT2_gpio63_dir<<31);; порядок элементов сохраняется. */
/* Задаёт SHKF_GPADIR = (SHKF_gpio00_dir ) + (SHKF_gpio01_dir<<1) + (SHKF_gpio02_dir<<2) + (SHKF_gpio03_dir<<3) +; данные SHKF_GPADIR. */
#define SHKF_GPADIR (SHKF_gpio00_dir ) + (SHKF_gpio01_dir<<1) + (SHKF_gpio02_dir<<2) + (SHKF_gpio03_dir<<3) + \
(SHKF_gpio04_dir<<4) + (SHKF_gpio05_dir<<5) + (SHKF_gpio06_dir<<6) + (SHKF_gpio07_dir<<7) + \
(SHKF_gpio08_dir<<8) + (SHKF_gpio09_dir<<9) + (SHKF_gpio10_dir<<10)+ (SHKF_gpio11_dir<<11)+ \
(SHKF_gpio19_dir<<19)+ \
(SHKF_gpio20_dir<<20)+ (SHKF_gpio21_dir<<21)+ (SHKF_gpio22_dir<<22)+ (SHKF_gpio23_dir<<23)+ \
(SHKF_gpio24_dir<<24)+ (SHKF_gpio25_dir<<25)+ (SHKF_gpio26_dir<<26)+ (SHKF_gpio27_dir<<27);
(SHKF_gpio04_dir<<4) + (SHKF_gpio05_dir<<5) + (SHKF_gpio06_dir<<6) + (SHKF_gpio07_dir<<7) + /* Продолжает список аргументов, полей или выражение (SHKF_gpio04_dir<<4) + (SHKF_gpio05_dir<<5) + (SHKF_gpio06_dir<<6) + (SHKF_gpio07_dir<<7) +; порядок элементов сохраняется. */ \
(SHKF_gpio08_dir<<8) + (SHKF_gpio09_dir<<9) + (SHKF_gpio10_dir<<10)+ (SHKF_gpio11_dir<<11)+ /* Продолжает список аргументов, полей или выражение (SHKF_gpio08_dir<<8) + (SHKF_gpio09_dir<<9) + (SHKF_gpio10_dir<<10)+ (SHKF_gpio11_dir<<11)+; порядок элементов сохраняется. */ \
(SHKF_gpio19_dir<<19)+ /* Продолжает список аргументов, полей или выражение (SHKF_gpio19_dir<<19)+; порядок элементов сохраняется. */ \
(SHKF_gpio20_dir<<20)+ (SHKF_gpio21_dir<<21)+ (SHKF_gpio22_dir<<22)+ (SHKF_gpio23_dir<<23)+ /* Продолжает список аргументов, полей или выражение (SHKF_gpio20_dir<<20)+ (SHKF_gpio21_dir<<21)+ (SHKF_gpio22_dir<<22)+ (SHKF_gpio23_dir<<23)+; порядок элементов сохраняется. */ \
(SHKF_gpio24_dir<<24)+ (SHKF_gpio25_dir<<25)+ (SHKF_gpio26_dir<<26)+ (SHKF_gpio27_dir<<27); /* Продолжает список аргументов, полей или выражение (SHKF_gpio24_dir<<24)+ (SHKF_gpio25_dir<<25)+ (SHKF_gpio26_dir<<26)+ (SHKF_gpio27_dir<<27);; порядок элементов сохраняется. */
/* Задаёт SHKF_GPBDIR = (SHKF_gpio32_dir )+ (SHKF_gpio33_dir<<1) + (SHKF_gpio34_dir<<2 )+; данные SHKF_GPBDIR. */
#define SHKF_GPBDIR (SHKF_gpio32_dir )+ (SHKF_gpio33_dir<<1) + (SHKF_gpio34_dir<<2 )+ \
(SHKF_gpio48_dir<<16)+ (SHKF_gpio49_dir<<17)+ (SHKF_gpio50_dir<<18)+ (SHKF_gpio51_dir<<19)+ \
(SHKF_gpio52_dir<<20)+ (SHKF_gpio53_dir<<21)+ \
(SHKF_gpio58_dir<<26)+ (SHKF_gpio59_dir<<27)+ \
(SHKF_gpio60_dir<<28)+ (SHKF_gpio61_dir<<29)+ (SHKF_gpio62_dir<<30)+ (SHKF_gpio63_dir<<31);
(SHKF_gpio48_dir<<16)+ (SHKF_gpio49_dir<<17)+ (SHKF_gpio50_dir<<18)+ (SHKF_gpio51_dir<<19)+ /* Продолжает список аргументов, полей или выражение (SHKF_gpio48_dir<<16)+ (SHKF_gpio49_dir<<17)+ (SHKF_gpio50_dir<<18)+ (SHKF_gpio51_dir<<19)+; порядок элементов сохраняется. */ \
(SHKF_gpio52_dir<<20)+ (SHKF_gpio53_dir<<21)+ /* Продолжает список аргументов, полей или выражение (SHKF_gpio52_dir<<20)+ (SHKF_gpio53_dir<<21)+; порядок элементов сохраняется. */ \
(SHKF_gpio58_dir<<26)+ (SHKF_gpio59_dir<<27)+ /* Продолжает список аргументов, полей или выражение (SHKF_gpio58_dir<<26)+ (SHKF_gpio59_dir<<27)+; порядок элементов сохраняется. */ \
(SHKF_gpio60_dir<<28)+ (SHKF_gpio61_dir<<29)+ (SHKF_gpio62_dir<<30)+ (SHKF_gpio63_dir<<31); /* Продолжает список аргументов, полей или выражение (SHKF_gpio60_dir<<28)+ (SHKF_gpio61_dir<<29)+ (SHKF_gpio62_dir<<30)+ (SHKF_gpio63_dir<<31);; порядок элементов сохраняется. */
/* Задаёт LOAD_GPADIR = (LOAD_gpio00_dir ) + (LOAD_gpio01_dir<<1) + (LOAD_gpio02_dir<<2) + (LOAD_gpio03_dir<<3) +; данные LOAD_GPADIR. */
#define LOAD_GPADIR (LOAD_gpio00_dir ) + (LOAD_gpio01_dir<<1) + (LOAD_gpio02_dir<<2) + (LOAD_gpio03_dir<<3) + \
(LOAD_gpio04_dir<<4) + (LOAD_gpio05_dir<<5) + (LOAD_gpio06_dir<<6) + (LOAD_gpio07_dir<<7) + \
(LOAD_gpio08_dir<<8) + (LOAD_gpio09_dir<<9) + (LOAD_gpio10_dir<<10)+ (LOAD_gpio11_dir<<11)+ \
(LOAD_gpio19_dir<<19)+ \
(LOAD_gpio20_dir<<20)+ (LOAD_gpio21_dir<<21)+ (LOAD_gpio22_dir<<22)+ (LOAD_gpio23_dir<<23)+ \
(LOAD_gpio24_dir<<24)+ (LOAD_gpio25_dir<<25)+ (LOAD_gpio26_dir<<26)+ (LOAD_gpio27_dir<<27);
(LOAD_gpio04_dir<<4) + (LOAD_gpio05_dir<<5) + (LOAD_gpio06_dir<<6) + (LOAD_gpio07_dir<<7) + /* Продолжает список аргументов, полей или выражение (LOAD_gpio04_dir<<4) + (LOAD_gpio05_dir<<5) + (LOAD_gpio06_dir<<6) + (LOAD_gpio07_dir<<7) +; порядок элементов сохраняется. */ \
(LOAD_gpio08_dir<<8) + (LOAD_gpio09_dir<<9) + (LOAD_gpio10_dir<<10)+ (LOAD_gpio11_dir<<11)+ /* Продолжает список аргументов, полей или выражение (LOAD_gpio08_dir<<8) + (LOAD_gpio09_dir<<9) + (LOAD_gpio10_dir<<10)+ (LOAD_gpio11_dir<<11)+; порядок элементов сохраняется. */ \
(LOAD_gpio19_dir<<19)+ /* Продолжает список аргументов, полей или выражение (LOAD_gpio19_dir<<19)+; порядок элементов сохраняется. */ \
(LOAD_gpio20_dir<<20)+ (LOAD_gpio21_dir<<21)+ (LOAD_gpio22_dir<<22)+ (LOAD_gpio23_dir<<23)+ /* Продолжает список аргументов, полей или выражение (LOAD_gpio20_dir<<20)+ (LOAD_gpio21_dir<<21)+ (LOAD_gpio22_dir<<22)+ (LOAD_gpio23_dir<<23)+; порядок элементов сохраняется. */ \
(LOAD_gpio24_dir<<24)+ (LOAD_gpio25_dir<<25)+ (LOAD_gpio26_dir<<26)+ (LOAD_gpio27_dir<<27); /* Продолжает список аргументов, полей или выражение (LOAD_gpio24_dir<<24)+ (LOAD_gpio25_dir<<25)+ (LOAD_gpio26_dir<<26)+ (LOAD_gpio27_dir<<27);; порядок элементов сохраняется. */
/* Задаёт LOAD_GPBDIR = (LOAD_gpio32_dir )+ (LOAD_gpio33_dir<<1) + (LOAD_gpio34_dir<<2 )+; данные LOAD_GPBDIR. */
#define LOAD_GPBDIR (LOAD_gpio32_dir )+ (LOAD_gpio33_dir<<1) + (LOAD_gpio34_dir<<2 )+ \
(LOAD_gpio48_dir<<16)+ (LOAD_gpio49_dir<<17)+ (LOAD_gpio50_dir<<18)+ (LOAD_gpio51_dir<<19)+ \
(LOAD_gpio52_dir<<20)+ (LOAD_gpio53_dir<<21)+ \
(LOAD_gpio58_dir<<26)+ (LOAD_gpio59_dir<<27)+ \
(LOAD_gpio60_dir<<28)+ (LOAD_gpio61_dir<<29)+ (LOAD_gpio62_dir<<30)+ (LOAD_gpio63_dir<<31);
(LOAD_gpio48_dir<<16)+ (LOAD_gpio49_dir<<17)+ (LOAD_gpio50_dir<<18)+ (LOAD_gpio51_dir<<19)+ /* Продолжает список аргументов, полей или выражение (LOAD_gpio48_dir<<16)+ (LOAD_gpio49_dir<<17)+ (LOAD_gpio50_dir<<18)+ (LOAD_gpio51_dir<<19)+; порядок элементов сохраняется. */ \
(LOAD_gpio52_dir<<20)+ (LOAD_gpio53_dir<<21)+ /* Продолжает список аргументов, полей или выражение (LOAD_gpio52_dir<<20)+ (LOAD_gpio53_dir<<21)+; порядок элементов сохраняется. */ \
(LOAD_gpio58_dir<<26)+ (LOAD_gpio59_dir<<27)+ /* Продолжает список аргументов, полей или выражение (LOAD_gpio58_dir<<26)+ (LOAD_gpio59_dir<<27)+; порядок элементов сохраняется. */ \
(LOAD_gpio60_dir<<28)+ (LOAD_gpio61_dir<<29)+ (LOAD_gpio62_dir<<30)+ (LOAD_gpio63_dir<<31); /* Продолжает список аргументов, полей или выражение (LOAD_gpio60_dir<<28)+ (LOAD_gpio61_dir<<29)+ (LOAD_gpio62_dir<<30)+ (LOAD_gpio63_dir<<31);; порядок элементов сохраняется. */
//===========================================================================
// No more.
+128 -46
View File
@@ -1,143 +1,225 @@
/* Приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. Русские пояснения сохранены в UTF-8. */
/* Начинает условие: _RS485 ещё не определён; защищает повторное включение или задаёт значение сборки. */
#ifndef _RS485
/* Определяет защитный символ или переключатель _RS485 для последующей компиляции. */
#define _RS485
/* Включает следующий блок только при определённом символе __cplusplus. */
#ifdef __cplusplus
extern "C" {
/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */
extern "C" {
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
//#include "DSP2833x_Device.h" // DSP281x Headerfile Include File
//#include "DSP2833x_Sci.h"
//#include "cntrl_adr.h"
//#include "params.h"
/* Начинает условие: RS232_USE_FIFO ещё не определён; защищает повторное включение или задаёт значение сборки. */
#ifndef RS232_USE_FIFO
/* Задаёт RS232_USE_FIFO = 1; выбор FIFO для COM_1; COM_2 сохраняет отдельную логику RS485. */
#define RS232_USE_FIFO 1
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Задаёт COM_1 = 1; номер первого последовательного порта, SCI-A. */
#define COM_1 1
/* Задаёт COM_2 = 2; номер второго последовательного порта, SCI-B. */
#define COM_2 2
/* Задаёт MAX_RECEIVE_LENGTH = 400; MAX приём длина. */
#define MAX_RECEIVE_LENGTH 400 // 80 //150
/* Задаёт MAX_SEND_LENGTH = 400; MAX SEND длина. */
#define MAX_SEND_LENGTH 400 //150
#define TIME_WAIT_RS_BYTE_OUT 1000
/* Задаёт TIME_WAIT_RS_BYTE_OUT = 1000; данные TIME_WAIT_RS_BYTE_OUT. */
#define TIME_WAIT_RS_BYTE_OUT 1000
/* Задаёт TIME_WAIT_RS_LOST_BYTE = 100; данные TIME_WAIT_RS_LOST_BYTE. */
#define TIME_WAIT_RS_LOST_BYTE 100
/* Задаёт RS_TIME_OUT = (SECOND*10); данные RS_TIME_OUT. */
#define RS_TIME_OUT (SECOND*10)
/* Задаёт Rec_Bloc_Begin = 0x200000; данные Rec_Bloc_Begin. */
#define Rec_Bloc_Begin 0x200000
/* Задаёт Rec_Bloc_End = 0x2F0000; данные Rec_Bloc_End. */
#define Rec_Bloc_End 0x2F0000
/* Задаёт Rec_Bloc_Length = (Rec_Bloc_End-Rec_Bloc_Begin); Rec Bloc длина. */
#define Rec_Bloc_Length (Rec_Bloc_End-Rec_Bloc_Begin)
/* Message RS declaration */
/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */
typedef struct
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Продолжает список аргументов, полей или выражение volatile struct SCI_REGS *SciRegs;; порядок элементов сохраняется. */
volatile struct SCI_REGS *SciRegs;
unsigned int commnumber; // Номер порта
unsigned long RS_Length; // Длина пакета
/* Объявляет commnumber — данные commnumber. */
unsigned int commnumber; // Номер порта
/* Объявляет RS_Length — RS длина. */
unsigned long RS_Length; // Длина пакета
unsigned int *pRS_RecvPtr; // Буфер приема
unsigned int *pRS_SendPtr; // Буфер посылки
unsigned int *pRecvPtr;
/* Объявляет pRS_RecvPtr — данные pRS_RecvPtr. Хранит указатель на данные. */
unsigned int *pRS_RecvPtr; // Буфер приема
/* Объявляет pRS_SendPtr — данные pRS_SendPtr. Хранит указатель на данные. */
unsigned int *pRS_SendPtr; // Буфер посылки
/* Объявляет pRecvPtr — данные pRecvPtr. Хранит указатель на данные. */
unsigned int *pRecvPtr;
unsigned int RS_PrevCmd; // Предыдущаа комманда
unsigned int RS_Cmd; // Текущаа комманда
unsigned int RS_Header[MAX_RECEIVE_LENGTH]; // Заголовок
unsigned int flag_TIMEOUT_to_Send; // Флаг ожиданиа таймаута на отсылку
unsigned int flag_TIMEOUT_to_Receive; // Флаг ожиданиа таймаута на прием
unsigned int RS_DataReady; // Флаг готовности RS данных
unsigned int buffer[MAX_SEND_LENGTH]; // Буфер дла отсылки по RS
/* Объявляет RS_PrevCmd — данные RS_PrevCmd. */
unsigned int RS_PrevCmd; // Предыдущаа комманда
/* Объявляет RS_Cmd — данные RS_Cmd. */
unsigned int RS_Cmd; // Текущаа комманда
/* Объявляет RS_Header — данные RS_Header. */
unsigned int RS_Header[MAX_RECEIVE_LENGTH]; // Заголовок
/* Объявляет flag_TIMEOUT_to_Send — флаг TIMEOUT to Send. */
unsigned int flag_TIMEOUT_to_Send; // Флаг ожиданиа таймаута на отсылку
/* Объявляет flag_TIMEOUT_to_Receive — флаг TIMEOUT to приём. */
unsigned int flag_TIMEOUT_to_Receive; // Флаг ожиданиа таймаута на прием
/* Объявляет RS_DataReady — RS данные Ready. */
unsigned int RS_DataReady; // Флаг готовности RS данных
/* Объявляет buffer — буфер. */
unsigned int buffer[MAX_SEND_LENGTH]; // Буфер дла отсылки по RS
unsigned int addr_answer; // адрес куда отвечать в режиме ведущего
unsigned int addr_recive; // адрес по которому нас запросили
unsigned int flag_LEADING; // Флаг режима контроллера (по умолчанию ведомый)
unsigned long RS_RecvLen;
unsigned long RS_SLength; // Длина пакета дла посылки
unsigned long RS_SendLen; // Количество байт уже передали
char RS_SendBlockMode; // Режим передачи
char RS_Flag9bit; // дла RS485????????
int BS_LoadOK; // Флаг успешности приема блока
/* Объявляет addr_answer — данные addr_answer. */
unsigned int addr_answer; // адрес куда отвечать в режиме ведущего
/* Объявляет addr_recive — данные addr_recive. */
unsigned int addr_recive; // адрес по которому нас запросили
/* Объявляет flag_LEADING — флаг LEADING. */
unsigned int flag_LEADING; // Флаг режима контроллера (по умолчанию ведомый)
/* Объявляет RS_RecvLen — данные RS_RecvLen. */
unsigned long RS_RecvLen;
/* Объявляет RS_SLength — RS S длина. */
unsigned long RS_SLength; // Длина пакета дла посылки
/* Объявляет RS_SendLen — данные RS_SendLen. */
unsigned long RS_SendLen; // Количество байт уже передали
/* Объявляет RS_SendBlockMode — RS Send Block режим. */
char RS_SendBlockMode; // Режим передачи
/* Объявляет RS_Flag9bit — RS флаг 9 бит. */
char RS_Flag9bit; // дла RS485????????
/* Объявляет BS_LoadOK — данные BS_LoadOK. */
int BS_LoadOK; // Флаг успешности приема блока
/* Объявляет RS_FlagBegin — RS флаг Begin. */
int RS_FlagBegin;
/* Объявляет RS_HeaderCnt — данные RS_HeaderCnt. */
int RS_HeaderCnt;
/* Объявляет RS_FlagSkiping — RS флаг Skiping. */
int RS_FlagSkiping;
/* Объявляет curr_baud — curr скорость передачи. */
unsigned long curr_baud;
/* Объявляет time_wait_rs_out — данные time_wait_rs_out. */
unsigned long time_wait_rs_out;
/* Условие компиляции RS232_USE_FIFO: выбранный блок включается в текущий вариант прошивки. */
#if RS232_USE_FIFO
/* Объявляет fifo_tx_active — данные fifo_tx_active; fifo_rx_guard — данные fifo_rx_guard. volatile требует фактического чтения или записи при каждом доступе. */
volatile unsigned int fifo_tx_active, fifo_rx_guard;
/* Объявляет fifo_rx_errors — данные fifo_rx_errors; fifo_overflows — данные fifo_overflows. volatile требует фактического чтения или записи при каждом доступе. */
volatile unsigned long fifo_rx_errors, fifo_overflows;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
} RS_DATA;
/* Продолжает список аргументов, полей или выражение } RS_DATA;; порядок элементов сохраняется. */
} RS_DATA;
/* Объявляет rs_a — данные rs_a; rs_b — данные rs_b. Память определена в другом модуле. */
extern RS_DATA rs_a,rs_b;
/* Объявляет . Память определена в другом модуле. */
extern unsigned int
RS_Len[70]; /* Действительнаа длина команды (отладочной) + 1 */
RS_Len[70]; /* Действительнаа длина команды (отладочной) + 1 */ /* Продолжает список аргументов, полей или выражение RS_Len[70];; порядок элементов сохраняется. */
/* Объявляет обработчик RSA_RX_Handler; обслуживает источник прерывания и его аппаратные флаги. */
interrupt void RSA_RX_Handler(void);
/* Объявляет обработчик RSA_TX_Handler; обслуживает источник прерывания и его аппаратные флаги. */
interrupt void RSA_TX_Handler(void);
/* Объявляет обработчик RSB_RX_Handler; обслуживает источник прерывания и его аппаратные флаги. */
interrupt void RSB_RX_Handler(void);
/* Объявляет обработчик RSB_TX_Handler; обслуживает источник прерывания и его аппаратные флаги. */
interrupt void RSB_TX_Handler(void);
/* иницилизациа переменных rs_a,rs_b*/
/* иницилизациа переменных rs_a,rs_b*/
/* Инициализирует структуры обоих SCI и таблицу длин команд. */
void create_uart_vars(char size_cmd15);
/** Повторнаа инициализациа последовательного порта, используетса после подвиса */
/** Настройка режима приема/передачи */
/** Повторнаа инициализациа последовательного порта, используетса после подвиса */
/** Настройка режима приема/передачи */
/* Объявляет интерфейс функции RS_SetBitMode; реализация вызывается через этот прототип. */
void RS_SetBitMode(RS_DATA *rs_arr, int n);
/** Посылка блока байтов.
Посылает массива 32-битных целых чисел старшие биты должны быть 0.
@precondition Работа ф-ции зависит от макро RS_TRANSMIT_INTR
@param buf адрес массива
@param len количество байт
/** Посылка блока байтов.
Посылает массива 32-битных целых чисел старшие биты должны быть 0.
@precondition Работа ф-ции зависит от макро RS_TRANSMIT_INTR
@param buf адрес массива
@param len количество байт
@see RS_BSend, RS_TRANSMIT_INTR
*/
/* Передаёт массив слов через SCI в выбранном режиме упаковки. */
int RS_Send(RS_DATA *rs_arr,unsigned int *pBuf, unsigned long len);
/** Посылка блока упакованных байтов.
@precondition Работа ф-ции зависит от макро RS_TRANSMIT_INTR
@param buf адрес массива
@param len количество 8-битных байт
/** Посылка блока упакованных байтов.
@precondition Работа ф-ции зависит от макро RS_TRANSMIT_INTR
@param buf адрес массива
@param len количество 8-битных байт
@see RS_Send, RS_TRANSMIT_INTR
*/
/* Передаёт последовательность 8-битных октетов, упакованных в слова C28x. */
int RS_BSend(RS_DATA *rs_arr,unsigned int *pBuf, unsigned long len);
/** Инициализациа последовательного порта */
void setup_uart(char commnumber,unsigned long speed_baud); /* speed_baud - скорость линии в бодах */
/** Инициализациа последовательного порта */
void setup_uart(char commnumber,unsigned long speed_baud); /* speed_baud - скорость линии в бодах */ /* Настраивает выбранный SCI, скорость и обработчики прерываний. */
/* Объявляет интерфейс функции RS_SetLineMode; реализация вызывается через этот прототип. */
void RS_SetLineMode(RS_DATA *rs_arr, int bit, char parity, int stop);
/* Объявляет интерфейс функции RS_SetLineSpeed; реализация вызывается через этот прототип. */
void RS_SetLineSpeed(RS_DATA *rs_arr, unsigned long speed);
// Transmit a character from the SCI'
/* Задаёт SCI_send = x->SciRegs->SCITXBUF=(unsigned char)(y); SCI send. */
#define SCI_send(x,y) x->SciRegs->SCITXBUF=(unsigned char)(y)
// Ожидание завершениа передачи UART
// Ожидание завершениа передачи UART
// wait for TRDY =1 for empty state
/* Условие компиляции RS232_USE_FIFO: выбранный блок включается в текущий вариант прошивки. */
#if RS232_USE_FIFO
/* Ожидает завершения аппаратной передачи FIFO и сдвигового регистра SCI. */
void RS_FifoWait(RS_DATA *rs_arr);
/* Уменьшает защитную паузу RX FIFO по миллисекундному такту. */
void RS_FifoTick1ms(void);
/* Задаёт RS_Wait4OK = RS_FifoWait(x); данные RS_Wait4OK. */
#define RS_Wait4OK(x) RS_FifoWait(x)
/* Выбирает альтернативный блок текущего условия компиляции. */
#else
/* Задаёт RS_Wait4OK = while(!(x->SciRegs->SCICTL2.bit.TXEMPTY)); данные RS_Wait4OK. */
#define RS_Wait4OK(x) while(!(x->SciRegs->SCICTL2.bit.TXEMPTY))
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/** Переключение линии на прием */
/** Переключение линии на прием */
/* Задаёт RS_Line_to_receive = if(x->commnumber==COM_2) GpioDataRegs.GPBDAT.bit.GPIO34 = 1;; RS Line to приём. */
#define RS_Line_to_receive(x) if(x->commnumber==COM_2) GpioDataRegs.GPBDAT.bit.GPIO34 = 1;
/** Переключение линии на передачу */
/** Переключение линии на передачу */
/* Задаёт RS_Line_to_send = if(x->commnumber==COM_2) GpioDataRegs.GPBDAT.bit.GPIO34 = 0;; данные RS_Line_to_send. */
#define RS_Line_to_send(x) if(x->commnumber==COM_2) GpioDataRegs.GPBDAT.bit.GPIO34 = 0;
/** Разрешение прерываний по получению символа и ошибкам от UART */
/** Разрешение прерываний по получению символа и ошибкам от UART */
/* Задаёт enableUARTInt = x->SciRegs->SCICTL2.all=2; разрешение UART Int. */
#define enableUARTInt(x) x->SciRegs->SCICTL2.all=2
/* Задаёт enableUARTIntW = x->SciRegs->SCICTL2.all=1; разрешение UART Int W. */
#define enableUARTIntW(x) x->SciRegs->SCICTL2.all=1
/* Объявляет интерфейс функции clear_timer_rs_live; реализация вызывается через этот прототип. */
void clear_timer_rs_live(RS_DATA *rs_arr);
/* Объявляет интерфейс функции test_rs_live; реализация вызывается через этот прототип. */
void test_rs_live(RS_DATA *rs_arr);
/* Включает следующий блок только при определённом символе __cplusplus. */
#ifdef __cplusplus
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
#endif /* _RS485 */
#endif /* _RS485 */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
+81 -39
View File
@@ -1,22 +1,39 @@
/* Коды и объявления команд последовательного загрузчика. Русские пояснения сохранены в UTF-8. */
/* Начинает условие: _BIOS_DSP ещё не определён; защищает повторное включение или задаёт значение сборки. */
#ifndef _BIOS_DSP
/* Определяет защитный символ или переключатель _BIOS_DSP для последующей компиляции. */
#define _BIOS_DSP
/* Включает следующий блок только при определённом символе __cplusplus. */
#ifdef __cplusplus
extern "C" {
/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */
extern "C" {
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Задаёт BM_PACKED = 1; данные BM_PACKED. */
#define BM_PACKED 1
/* Задаёт BM_CHAR32 = 0; данные BM_CHAR32. */
#define BM_CHAR32 0
/* Задаёт CHIEF = 1; данные CHIEF. */
#define CHIEF 1
/* Задаёт SLAVE = 0; данные SLAVE. */
#define SLAVE 0
/* Задаёт ADR_FOR_SPECIAL = 0x100; данные ADR_FOR_SPECIAL. */
#define ADR_FOR_SPECIAL 0x100
/* Задаёт CMD_MODBUS_3 = 3; данные CMD_MODBUS_3. */
#define CMD_MODBUS_3 3
/* Задаёт ANS_MODBUS_4 = 4; данные ANS_MODBUS_4. */
#define ANS_MODBUS_4 4
/* Задаёт CMD_MODBUS_15 = 5; данные CMD_MODBUS_15. */
#define CMD_MODBUS_15 5
/* Задаёт CMD_MODBUS_6 = 6; данные CMD_MODBUS_6. */
#define CMD_MODBUS_6 6
/* Задаёт ANS_MODBUS_6 = 7; данные ANS_MODBUS_6. */
#define ANS_MODBUS_6 7
/* Задаёт CMD_MODBUS_16 = 16; данные CMD_MODBUS_16. */
#define CMD_MODBUS_16 16
/*
@@ -27,85 +44,110 @@ CMD_MODBUS_3 = 3,
ANS_MODBUS_6 = 7,
CMD_MODBUS_16 = 16,
*/
/* Продолжает список аргументов, полей или выражение enum {; порядок элементов сохраняется. */
enum {
CMD_LOAD=51, CMD_UPLOAD, CMD_RUN, CMD_XFLASH, CMD_TFLASH,
/* Записывает CMD_LOAD значением 51, CMD_UPLOAD, CMD_RUN, CMD_XFLASH, CMD_TFLASH,; данные CMD_LOAD. */
CMD_LOAD=51, CMD_UPLOAD, CMD_RUN, CMD_XFLASH, CMD_TFLASH,
/* Продолжает список аргументов, полей или выражение CMD_PEEK, CMD_POKE, CMD_INITLOAD, CMD_INIT,CMD_EXTEND,; порядок элементов сохраняется. */
CMD_PEEK, CMD_POKE, CMD_INITLOAD, CMD_INIT,CMD_EXTEND,
/* Записывает CMD_VECTOR значением 61,; данные CMD_VECTOR. */
CMD_VECTOR=61,
/* Продолжает список аргументов, полей или выражение CMD_IMPULSE,; порядок элементов сохраняется. */
CMD_IMPULSE,
/* стандартные команды */
/* стандартные команды */
/* Записывает CMD_STD значением 65, CMD_STD_ANS; данные CMD_STD. */
CMD_STD=65, CMD_STD_ANS
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
};
/* Записывает false значением 0, true}; данные false. */
enum {false=0, true};
/** Возвращает номер комманды, если есть или -1 если транзакций не было */
/** Возвращает номер комманды, если есть или -1 если транзакций не было */
/* Объявляет интерфейс функции get_command; реализация вызывается через этот прототип. */
int get_command(RS_DATA *rs_arr);
/** Стандартный ответ, без параметров */
/** Стандартный ответ, без параметров */
/* Объявляет интерфейс функции Answer; реализация вызывается через этот прототип. */
void Answer(RS_DATA *rs_arr,int n);
/* начальные установки (не работает)*/
/* начальные установки (не работает)*/
/* Объявляет интерфейс функции init; реализация вызывается через этот прототип. */
void init(RS_DATA *rs_arr);
/**@name Комманды
* Комманды, вызываемые через последовательный канал*/
/**@name Комманды
* Комманды, вызываемые через последовательный канал*/
//@{
/** Инициировать загрузку блока.
Настраивает прием блока данных */
void initload(RS_DATA *rs_arr);
/** Инициировать загрузку блока.
Настраивает прием блока данных */
/* Объявляет интерфейс функции initload; реализация вызывается через этот прототип. */
void initload(RS_DATA *rs_arr);
/** Загрузка блока.
Вызываетса после загрузки блока через RS */
/** Загрузка блока.
Вызываетса после загрузки блока через RS */
/* Объявляет интерфейс функции load; реализация вызывается через этот прототип. */
void load(RS_DATA *rs_arr);
/** Выполнить программу в формате Serial Boot.
@precondition Должна быть произведена загрузка блока
Адрес программы беретса из заголовка и
сравниваетса с переменной RecvPtr, заполнаемой в ф-ции load
/** Выполнить программу в формате Serial Boot.
@precondition Должна быть произведена загрузка блока
Адрес программы беретса из заголовка и
сравниваетса с переменной RecvPtr, заполнаемой в ф-ции load
@see load */
void run (RS_DATA *rs_arr);
/* Объявляет интерфейс функции run; реализация вызывается через этот прототип. */
void run (RS_DATA *rs_arr);
/** Прочитать ачейку памати */
/** Прочитать ачейку памати */
/* Объявляет интерфейс функции peek; реализация вызывается через этот прототип. */
void peek(RS_DATA *rs_arr);
/** Записать в ачейку памати */
void poke(RS_DATA *rs_arr);
/** Записать в ачейку памати */
/* Объявляет интерфейс функции poke; реализация вызывается через этот прототип. */
void poke(RS_DATA *rs_arr);
/** Передать блок памати */
void upload(RS_DATA *rs_arr);
/** Передать блок памати */
/* Объявляет интерфейс функции upload; реализация вызывается через этот прототип. */
void upload(RS_DATA *rs_arr);
/** Прошить XILINX.
@precondition Должна быть произведена загрузка блока
Адрес и длина прошивки беретса из заголовка и
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load,
так же смотрит магическое слово в начале прошивки
/** Прошить XILINX.
@precondition Должна быть произведена загрузка блока
Адрес и длина прошивки беретса из заголовка и
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load,
так же смотрит магическое слово в начале прошивки
@see load */
void xflash(RS_DATA *rs_arr);
/* Объявляет интерфейс функции xflash; реализация вызывается через этот прототип. */
void xflash(RS_DATA *rs_arr);
/** Прошить TMS.
@precondition Должна быть произведена загрузка блока
Адрес и длина прошивки беретса из заголовка и
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load
/** Прошить TMS.
@precondition Должна быть произведена загрузка блока
Адрес и длина прошивки беретса из заголовка и
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load
@see load */
void tflash(RS_DATA *rs_arr);
/* Объявляет интерфейс функции tflash; реализация вызывается через этот прототип. */
void tflash(RS_DATA *rs_arr);
/* расширенные команды дла биоса */
/* расширенные команды дла биоса */
/* Объявляет интерфейс функции extendbios; реализация вызывается через этот прототип. */
void extendbios(RS_DATA *rs_arr);
/* Объявляет интерфейс функции write_memory; реализация вызывается через этот прототип. */
void write_memory(unsigned long addr, unsigned int data);
/* Объявляет интерфейс функции read_memory; реализация вызывается через этот прототип. */
unsigned int read_memory(unsigned long addr);
//@}
/* Включает следующий блок только при определённом символе __cplusplus. */
#ifdef __cplusplus
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
#endif/* _BIOS_DSP */
#endif/* _BIOS_DSP */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
+75 -39
View File
@@ -1,69 +1,105 @@
/* Заводские калибровочные значения датчиков. Русские пояснения сохранены в UTF-8. */
/* Условие компиляции BALSAM == 167: выбранный блок включается в текущий вариант прошивки. */
#if BALSAM == 167 //-------------------------------------------------------------
/* Объявляет def_cal[][8] = {. Начальное значение задаётся справа от знака равенства. */
int def_cal[][8] = {
// ÁÊÑÑ òðàíñ 100 1 100 2 150 1 150 2
0, 0, 0, 0, 455, 441, 2459, 2392, // Áîðò 0
0, 0, 0, 0, 462, 439, 2442, 2400, // Áîðò 1
// БКСС транс 100 1 100 2 150 1 150 2
/* Элемент постоянной таблицы 0, 0, 0, 0, 455, 441, 2459, 2392,; порядок значений совпадает с порядком индексов потребителя. */
0, 0, 0, 0, 455, 441, 2459, 2392, // Борт 0
/* Элемент постоянной таблицы 0, 0, 0, 0, 462, 439, 2442, 2400,; порядок значений совпадает с порядком индексов потребителя. */
0, 0, 0, 0, 462, 439, 2442, 2400, // Борт 1
// Ñèëîâîé UA1 UB1 UA2 UB2 300 1 300 2 400 1 400 2
4936, 4877, 4972, 4857, 1886, 1898, 2517, 2535, // Áîðò 0
4876, 5005, 4876, 4847, 1898, 1873, 2535, 2502, // Áîðò 1
// Силовой UA1 UB1 UA2 UB2 300 1 300 2 400 1 400 2
/* Элемент постоянной таблицы 4936, 4877, 4972, 4857, 1886, 1898, 2517, 2535,; порядок значений совпадает с порядком индексов потребителя. */
4936, 4877, 4972, 4857, 1886, 1898, 2517, 2535, // Борт 0
/* Элемент постоянной таблицы 4876, 5005, 4876, 4847, 1898, 1873, 2535, 2502,; порядок значений совпадает с порядком индексов потребителя. */
4876, 5005, 4876, 4847, 1898, 1873, 2535, 2502, // Борт 1
// ÓÌÏ UA UC IA IC 20mA O 4mA O 20mA I 4mA I
7580, 7540, 2310, 2420, 1736, 683, 854, 14, // Áîðò 0 1062 1980
7580, 7540, 2310, 2420, 1745, 689, 860, 17, // Áîðò 1 1720 2405
// УМП UA UC IA IC 20mA O 4mA O 20mA I 4mA I
/* Элемент постоянной таблицы 7580, 7540, 2310, 2420, 1736, 683, 854, 14,; порядок значений совпадает с порядком индексов потребителя. */
7580, 7540, 2310, 2420, 1736, 683, 854, 14, // Борт 0 1062 1980
/* Элемент постоянной таблицы 7580, 7540, 2310, 2420, 1745, 689, 860, 17,; порядок значений совпадает с порядком индексов потребителя. */
7580, 7540, 2310, 2420, 1745, 689, 860, 17, // Борт 1 1720 2405
// ÁÊÑÑÄ 100 Ohm 150 Ohm
// БКССД 100 Ohm 150 Ohm
/* Элемент постоянной таблицы 1281, 1272, 0, 0, 622, 2263, 0, 0,; порядок значений совпадает с порядком индексов потребителя. */
1281, 1272, 0, 0, 622, 2263, 0, 0,
// ÂÝÏ 380Ô1 380Ô2 300 1 300 2 400 1 400 2
// ВЭП 380Ф1 380Ф2 300 1 300 2 400 1 400 2
/* Элемент постоянной таблицы 1290, 1285, 0, 0, 2045, 2045, 2725, 2725 };; порядок значений совпадает с порядком индексов потребителя. */
1290, 1285, 0, 0, 2045, 2045, 2725, 2725 };
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif //---------------------------------------------------------------------
/* Условие компиляции BALSAM == 166: выбранный блок включается в текущий вариант прошивки. */
#if BALSAM == 166 //-------------------------------------------------------------
/* Объявляет def_cal[][8] = {. Начальное значение задаётся справа от знака равенства. */
int def_cal[][8] = {
// Ñèëîâîé UA1 UB1 UA2 UB2 300 1 300 2 400 1 400 2
4936, 4877, 4972, 4857, 1960, 1920, 2610, 2570, // Áîðò 0
4876, 5005, 4876, 4847, 1950, 1965, 2600, 2615, // Áîðò 1
// Силовой UA1 UB1 UA2 UB2 300 1 300 2 400 1 400 2
/* Элемент постоянной таблицы 4936, 4877, 4972, 4857, 1960, 1920, 2610, 2570,; порядок значений совпадает с порядком индексов потребителя. */
4936, 4877, 4972, 4857, 1960, 1920, 2610, 2570, // Борт 0
/* Элемент постоянной таблицы 4876, 5005, 4876, 4847, 1950, 1965, 2600, 2615,; порядок значений совпадает с порядком индексов потребителя. */
4876, 5005, 4876, 4847, 1950, 1965, 2600, 2615, // Борт 1
// ÓÌÏ UA UC IA IC 20mA O 4mA O 20mA I 4mA I
3820, 3790, 3505, 3380, 1718, 673, 854, 14, // Áîðò 0
3835, 3785, 3522, 3332, 1697, 653, 860, 17, // Áîðò 1
// УМП UA UC IA IC 20mA O 4mA O 20mA I 4mA I
/* Элемент постоянной таблицы 3820, 3790, 3505, 3380, 1718, 673, 854, 14,; порядок значений совпадает с порядком индексов потребителя. */
3820, 3790, 3505, 3380, 1718, 673, 854, 14, // Борт 0
/* Элемент постоянной таблицы 3835, 3785, 3522, 3332, 1697, 653, 860, 17,; порядок значений совпадает с порядком индексов потребителя. */
3835, 3785, 3522, 3332, 1697, 653, 860, 17, // Борт 1
// ÂÝÏ 380Ô1 380Ô2 300 1 300 2 400 1 400 2
// ВЭП 380Ф1 380Ф2 300 1 300 2 400 1 400 2
/* Элемент постоянной таблицы 1281, 1272, 0, 0, 2049, 2050, 2749, 2750 };; порядок значений совпадает с порядком индексов потребителя. */
1281, 1272, 0, 0, 2049, 2050, 2749, 2750 };
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif //---------------------------------------------------------------------
/* Условие компиляции BALSAM == 165: выбранный блок включается в текущий вариант прошивки. */
#if BALSAM == 165 //-------------------------------------------------------------
/* Объявляет def_cal[][8] = {. Начальное значение задаётся справа от знака равенства. */
int def_cal[][8] = {
// Ñèëîâîé UA1 UB1 UA2 UB2 300 1 300 2 400 1 400 2
5130, 4960, 4925, 5070, 1881, 1881, 2506, 2516, // Áîðò 0
5020, 5040, 4950, 5030, 1871, 1879, 2507, 2514, // Áîðò 1
// Силовой UA1 UB1 UA2 UB2 300 1 300 2 400 1 400 2
/* Элемент постоянной таблицы 5130, 4960, 4925, 5070, 1881, 1881, 2506, 2516,; порядок значений совпадает с порядком индексов потребителя. */
5130, 4960, 4925, 5070, 1881, 1881, 2506, 2516, // Борт 0
/* Элемент постоянной таблицы 5020, 5040, 4950, 5030, 1871, 1879, 2507, 2514,; порядок значений совпадает с порядком индексов потребителя. */
5020, 5040, 4950, 5030, 1871, 1879, 2507, 2514, // Борт 1
// ÓÌÏ UA UC IA IC 20mA O 4mA O 20mA I 4mA I
3890, 3865, 5100, 4850, 1730, 675, 854, 14, // Áîðò 0
3845, 3800, 3250, 3100, 1044, 0, 860, 17, // Áîðò 1
// УМП UA UC IA IC 20mA O 4mA O 20mA I 4mA I
/* Элемент постоянной таблицы 3890, 3865, 5100, 4850, 1730, 675, 854, 14,; порядок значений совпадает с порядком индексов потребителя. */
3890, 3865, 5100, 4850, 1730, 675, 854, 14, // Борт 0
/* Элемент постоянной таблицы 3845, 3800, 3250, 3100, 1044, 0, 860, 17,; порядок значений совпадает с порядком индексов потребителя. */
3845, 3800, 3250, 3100, 1044, 0, 860, 17, // Борт 1
// ÂÝÏ 380Ô1 380Ô2 300 1 300 2 400 1 400 2
// ВЭП 380Ф1 380Ф2 300 1 300 2 400 1 400 2
/* Элемент постоянной таблицы 1289, 1280, 0, 0, 2073, 2071, 2773, 2771 };; порядок значений совпадает с порядком индексов потребителя. */
1289, 1280, 0, 0, 2073, 2071, 2773, 2771 };
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif //---------------------------------------------------------------------
/* Условие компиляции BALSAM == 164: выбранный блок включается в текущий вариант прошивки. */
#if BALSAM == 164 //-------------------------------------------------------------
/* Объявляет def_cal[][8] = {. Начальное значение задаётся справа от знака равенства. */
int def_cal[][8] = {
// Ñèëîâîé UA1 UB1 UA2 UB2 300 1 300 2 400 1 400 2
7573, 7573, 7573, 7573, 1979, 1888, 2592, 2513, // Áîðò 0
7573, 7573, 7573, 7573, 1970, 1907, 2584, 2558, // Áîðò 1
// Силовой UA1 UB1 UA2 UB2 300 1 300 2 400 1 400 2
/* Элемент постоянной таблицы 7573, 7573, 7573, 7573, 1979, 1888, 2592, 2513,; порядок значений совпадает с порядком индексов потребителя. */
7573, 7573, 7573, 7573, 1979, 1888, 2592, 2513, // Борт 0
/* Элемент постоянной таблицы 7573, 7573, 7573, 7573, 1970, 1907, 2584, 2558,; порядок значений совпадает с порядком индексов потребителя. */
7573, 7573, 7573, 7573, 1970, 1907, 2584, 2558, // Борт 1
// ÓÌÏ UA UC IA IC 20mA O 4mA O 20mA I 4mA I
3920, 3905, 3300, 3220, 1015, 0, 854, 14, // Áîðò 0
3835, 3785, 5100, 4600, 1750, 680, 860, 17, // Áîðò 1
// УМП UA UC IA IC 20mA O 4mA O 20mA I 4mA I
/* Элемент постоянной таблицы 3920, 3905, 3300, 3220, 1015, 0, 854, 14,; порядок значений совпадает с порядком индексов потребителя. */
3920, 3905, 3300, 3220, 1015, 0, 854, 14, // Борт 0
/* Элемент постоянной таблицы 3835, 3785, 5100, 4600, 1750, 680, 860, 17,; порядок значений совпадает с порядком индексов потребителя. */
3835, 3785, 5100, 4600, 1750, 680, 860, 17, // Борт 1
// ÂÝÏ 380Ô1 380Ô2 300 1 300 2 400 1 400 2
// ВЭП 380Ф1 380Ф2 300 1 300 2 400 1 400 2
/* Элемент постоянной таблицы 1266, 1267, 0, 0, 2063, 2040, 2678, 2655 };; порядок значений совпадает с порядком индексов потребителя. */
1266, 1267, 0, 0, 2063, 2040, 2678, 2655 };
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif //---------------------------------------------------------------------
@@ -71,15 +107,15 @@
#if PXXXXX == 1 //-------------------------------------------------------------
int def_cal[][6] = {
// Ñèëîâîé UA1 UB1 UA2 UB2 300 1 300 2 400 1 400 2
0400, 0400, 0400, 0400, 1950, 1950, 2600, 2600, // Áîðò 0
0400, 0400, 0400, 0400, 1950, 1950, 2600, 2600, // Áîðò 1
// Силовой UA1 UB1 UA2 UB2 300 1 300 2 400 1 400 2
0400, 0400, 0400, 0400, 1950, 1950, 2600, 2600, // Борт 0
0400, 0400, 0400, 0400, 1950, 1950, 2600, 2600, // Борт 1
// ÓÌÏ UA UC IA IC 20mA 4mA
0400, 0400, 4800, 4800, 0, 0, 0, 0, // Áîðò 0
0400, 0400, 4800, 4800, 0, 0, 0, 0, // Áîðò 1
// УМП UA UC IA IC 20mA 4mA
0400, 0400, 4800, 4800, 0, 0, 0, 0, // Борт 0
0400, 0400, 4800, 4800, 0, 0, 0, 0, // Борт 1
// ÂÝÏ 380Ô1 380Ô2 300 1 300 2 400 1 400 2
// ВЭП 380Ф1 380Ф2 300 1 300 2 400 1 400 2
1270, 1270, 0, 0, 1950, 1950, 2600, 2600 };
#endif //---------------------------------------------------------------------
*/
+30 -13
View File
@@ -1,34 +1,51 @@
/* Собственный и универсальный адрес устройства. Русские пояснения сохранены в UTF-8. */
/* Начинает условие: _CNTRL_ADR ещё не определён; защищает повторное включение или задаёт значение сборки. */
#ifndef _CNTRL_ADR
/* Определяет защитный символ или переключатель _CNTRL_ADR для последующей компиляции. */
#define _CNTRL_ADR
/* Включает следующий блок только при определённом символе __cplusplus. */
#ifdef __cplusplus
extern "C" {
#endif
/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */
extern "C" {
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/** àäðåñ êîíòðîëëåðà äëà ïîñûëêè âñåì ÀÈÍàì */
/** адрес контроллера дла посылки всем АИНам */
/* Объявляет ADDR_FOR_ALL — данные ADDR_FOR_ALL. Память определена в другом модуле. */
extern int ADDR_FOR_ALL;
/** àäðåñ êîíòðîëëåðà äëà ïîñûëêè îòâåòà */
extern const int ADDR_ANSWER;
/** àäðåñà òåðìèíàëà äëà ïîñûëêè îòâåòà */
extern const int ADDR_TERMINAL;
/** адрес контроллера дла посылки ответа */
/* Объявляет ADDR_ANSWER — данные ADDR_ANSWER. Память определена в другом модуле. */
extern const int ADDR_ANSWER;
/* Àäðåñ êîíòðîëëåðà */
/** адреса терминала дла посылки ответа */
/* Объявляет ADDR_TERMINAL — данные ADDR_TERMINAL. Память определена в другом модуле. */
extern const int ADDR_TERMINAL;
/* Адрес контроллера */
/* Объявляет CNTRL_ADDR — данные CNTRL_ADDR. Память определена в другом модуле. */
extern int CNTRL_ADDR;
/* Óíèâåðñàëüíûé àäðåñ êîíòðîëëåðà */
/* Универсальный адрес контроллера */
/* Объявляет CNTRL_ADDR_UNIVERSAL — данные CNTRL_ADDR_UNIVERSAL. Память определена в другом модуле. */
extern const int CNTRL_ADDR_UNIVERSAL;
/** Óñòàíîâêà àäðåñà êîíòðîëëåðà äëà ïðîøèâêè */
/** Установка адреса контроллера дла прошивки */
/* Устанавливает собственный и универсальный адрес для проверки адресованных команд. */
void set_cntrl_addr (int cntrl_addr,int cntrl_addr_for_all);
/* Объявляет cntr_addr_c — данные cntr_addr_c. Память определена в другом модуле. */
extern int cntr_addr_c;
/* Объявляет cntr_addr_c_all — данные cntr_addr_c_all. Память определена в другом модуле. */
extern int cntr_addr_c_all;
/* Включает следующий блок только при определённом символе __cplusplus. */
#ifdef __cplusplus
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
#endif /* _CNTRL_ADR */
#endif /* _CNTRL_ADR */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
+7
View File
@@ -1,8 +1,15 @@
/* Таблицы и функции вычисления контрольных сумм CRC. Русские пояснения сохранены в UTF-8. */
/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */
typedef unsigned short WORD;
/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */
typedef unsigned char byte;
/* Объявляет интерфейс функции get_crc_ccitt; реализация вызывается через этот прототип. */
unsigned int get_crc_ccitt(unsigned int crc, unsigned int *buf, unsigned long size );
/* Объявляет интерфейс функции get_crc_16; реализация вызывается через этот прототип. */
unsigned int get_crc_16(unsigned int crc,unsigned int *buf,unsigned long size );
/* Объявляет интерфейс функции get_crc_16b; реализация вызывается через этот прототип. */
unsigned int get_crc_16b(unsigned int crc,unsigned int *buf,unsigned long size );
/* Объявляет интерфейс функции get_crc16; реализация вызывается через этот прототип. */
int get_crc16(unsigned int *buf, int size );
+6 -1
View File
@@ -1,6 +1,11 @@
/* Штатный eCAN и отдельный служебный обмен УМП/GAS. Русские пояснения сохранены в UTF-8. */
/* Настраивает eCAN, скорость, почтовые ящики и маршрутизацию прерываний для выбранного режима платы. */
void InitCan(int Port, int DevNum);
/* Упаковывает адрес и технологические слова в штатный CAN-кадр и запускает передачу mailbox. */
void CAN_send(int Port, int data[], int Addr);
/* Объявляет CAN_input_data — CAN вход данные. Память определена в другом модуле. */
extern int CAN_input_data[];
/* Неблокирующая передача ответов логгера отдельным CAN mailbox. */
/* Неблокирующая передача ответов логгера отдельным CAN mailbox. */
/* В главном цикле готовит замороженный ответ служебного CAN и отправляет его двухсловными фрагментами. */
void UMP_CAN_service(void);
+16 -5
View File
@@ -1,15 +1,26 @@
/* Выбор профиля физически установленной EEPROM при сборке. Русские пояснения сохранены в UTF-8. */
/* Начинает условие: BALSAM167_EEPROM_CONFIG_H ещё не определён; защищает повторное включение или задаёт значение сборки. */
#ifndef BALSAM167_EEPROM_CONFIG_H
/* Определяет защитный символ или переключатель BALSAM167_EEPROM_CONFIG_H для последующей компиляции. */
#define BALSAM167_EEPROM_CONFIG_H
/* Build-time checkbox: 0 = AT25256B (32 KiB), 1 = M95M02-DR (256 KiB).
* This must match the soldered part BEFORE startup loads saved parameters.
* CCS: change the value below, then Project > Clean and Rebuild.
* Command-line builds may override EEPROM_M95M02 for that build only.
* A GUI checkbox cannot change SPI ROM boot or startup initialization.
/* Аппаратный профиль выбирается при сборке: 0 — AT25256B (32 КиБ),
* 1 — M95M02-DR (256 КиБ). Он обязан соответствовать установленной микросхеме
* до загрузки сохранённых параметров при старте.
* В CCS измените определение ниже, затем выполните Clean/Rebuild.
* Ключ компилятора может переопределить значение только для своей сборки.
* Выбор профиля во время работы не меняет загрузку ROM по SPI и начальную адресацию.
*/
/* Начинает условие: EEPROM_M95M02 ещё не определён; защищает повторное включение или задаёт значение сборки. */
#ifndef EEPROM_M95M02
/* Задаёт EEPROM_M95M02 = 0; выбор аппаратной EEPROM при сборке: 0 — AT25256B 32 КиБ, 1 — M95M02 256 КиБ и GAS. */
#define EEPROM_M95M02 0
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции EEPROM_M95M02 != 0 и EEPROM_M95M02 != 1: выбранный блок включается в текущий вариант прошивки. */
#if EEPROM_M95M02 != 0 && EEPROM_M95M02 != 1
/* Останавливает сборку при недопустимой конфигурации: EEPROM_M95M02_must_be_0_or_1. */
#error EEPROM_M95M02_must_be_0_or_1
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
+39 -6
View File
@@ -1,49 +1,82 @@
/* Накопительный фильтр измерительных каналов. Русские пояснения сохранены в UTF-8. */
/* Начинает условие: _FILTER_BAT2 ещё не определён; защищает повторное включение или задаёт значение сборки. */
#ifndef _FILTER_BAT2
/* Определяет защитный символ или переключатель _FILTER_BAT2 для последующей компиляции. */
#define _FILTER_BAT2
/* Включает следующий блок только при определённом символе __cplusplus. */
#ifdef __cplusplus
extern "C" {
/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */
extern "C" {
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Задаёт K1_FILTER_BATTER2_1HZ = 0.0000096; данные K1_FILTER_BATTER2_1HZ. */
#define K1_FILTER_BATTER2_1HZ 0.0000096
/* Задаёт K2_FILTER_BATTER2_1HZ = 1.94468056; данные K2_FILTER_BATTER2_1HZ. */
#define K2_FILTER_BATTER2_1HZ 1.94468056
/* Задаёт K3_FILTER_BATTER2_1HZ = -0.94471895; данные K3_FILTER_BATTER2_1HZ. */
#define K3_FILTER_BATTER2_1HZ -0.94471895
/* Задаёт K1_FILTER_BATTER2_3HZ = 0.00008766; данные K1_FILTER_BATTER2_3HZ. */
#define K1_FILTER_BATTER2_3HZ 0.00008766
/* Задаёт K2_FILTER_BATTER2_3HZ = 1.97347532; данные K2_FILTER_BATTER2_3HZ. */
#define K2_FILTER_BATTER2_3HZ 1.97347532
/* Задаёт K3_FILTER_BATTER2_3HZ = -0.97382594; данные K3_FILTER_BATTER2_3HZ. */
#define K3_FILTER_BATTER2_3HZ -0.97382594
/* Задаёт K1_FILTER_BATTER2_5HZ = 0.00024135; данные K1_FILTER_BATTER2_5HZ. */
#define K1_FILTER_BATTER2_5HZ 0.00024135
/* Задаёт K2_FILTER_BATTER2_5HZ = 1.95581276; данные K2_FILTER_BATTER2_5HZ. */
#define K2_FILTER_BATTER2_5HZ 1.95581276
/* Задаёт K3_FILTER_BATTER2_5HZ = -0.95677816; данные K3_FILTER_BATTER2_5HZ. */
#define K3_FILTER_BATTER2_5HZ -0.95677816
/* Задаёт K1_FILTER_BATTER2_10HZ = 0.00094411; данные K1_FILTER_BATTER2_10HZ. */
#define K1_FILTER_BATTER2_10HZ 0.00094411
/* Задаёт K2_FILTER_BATTER2_10HZ = 1.91126422; данные K2_FILTER_BATTER2_10HZ. */
#define K2_FILTER_BATTER2_10HZ 1.91126422
/* Задаёт K3_FILTER_BATTER2_10HZ = -0.91504065; данные K3_FILTER_BATTER2_10HZ. */
#define K3_FILTER_BATTER2_10HZ -0.91504065
/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */
typedef struct { float k_0;
/* Объявляет k_1 — данные k_1. */
float k_1;
/* Объявляет k_2 — данные k_2. */
float k_2;
/* Объявляет i_0 — данные i_0. */
float i_0;
/* Объявляет i_1 — данные i_1. */
float i_1;
/* Объявляет i_2 — данные i_2. */
float i_2;
/* Объявляет u_0 — данные u_0. */
float u_0;
/* Объявляет u_1 — данные u_1. */
float u_1;
/* Объявляет u_2 — данные u_2. */
float u_2;
} FILTERBAT;
/* Продолжает список аргументов, полей или выражение } FILTERBAT;; порядок элементов сохраняется. */
} FILTERBAT;
/* Задаёт DEF_FILTERBAT = { K1_FILTER_BATTER2_3HZ,; данные DEF_FILTERBAT. */
#define DEF_FILTERBAT { K1_FILTER_BATTER2_3HZ, \
K2_FILTER_BATTER2_3HZ, \
K3_FILTER_BATTER2_3HZ, \
0,0,0,0,0,0}
K2_FILTER_BATTER2_3HZ, /* Продолжает список аргументов, полей или выражение K2_FILTER_BATTER2_3HZ,; порядок элементов сохраняется. */ \
K3_FILTER_BATTER2_3HZ, /* Продолжает список аргументов, полей или выражение K3_FILTER_BATTER2_3HZ,; порядок элементов сохраняется. */ \
0,0,0,0,0,0} /* Элемент постоянной таблицы 0,0,0,0,0,0}; порядок значений совпадает с порядком индексов потребителя. */
/* Обновляет скользящий фильтр измерительного канала и его накопленные значения. */
float filterbat(FILTERBAT *b, float InpVarCurr);
/* Включает следующий блок только при определённом символе __cplusplus. */
#ifdef __cplusplus
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
#endif /* _FILTER_BAT2 */
#endif /* _FILTER_BAT2 */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
+29 -10
View File
@@ -1,28 +1,47 @@
/* Дополнительная карта GAS 167/v1 только для новой EEPROM M95M02. Русские пояснения сохранены в UTF-8. */
/* Начинает условие: BALSAM167_GAS_H ещё не определён; защищает повторное включение или задаёт значение сборки. */
#ifndef BALSAM167_GAS_H
/* Определяет защитный символ или переключатель BALSAM167_GAS_H для последующей компиляции. */
#define BALSAM167_GAS_H
/* Подключает "eeprom_config.h": выбор профиля физически установленной EEPROM при сборке. */
#include "eeprom_config.h"
/* Подключает <stdint.h>: настройки и интерфейс stdint. */
#include <stdint.h>
/* Board profile 167/v1, word addresses, independent of the wire transport.
* The original register and UMP addresses remain valid in both builds.
* Only the physically fitted M95M02 version exposes the additional regions. */
/* Профиль платы 167/v1 использует словные адреса независимо от транспорта.
* Штатные адреса технологических регистров и УМП остаются доступными в обеих сборках.
* Дополнительные области GAS присутствуют только при установленной M95M02.
*/
/* Условие компиляции EEPROM_M95M02: выбранный блок включается в текущий вариант прошивки. */
#if EEPROM_M95M02
/* Задаёт GAS167_REG_BASE = 0x5000U; начало псевдонимов 128 технологических регистров GAS, адрес 0x5000. */
#define GAS167_REG_BASE 0x5000U
/* Задаёт GAS167_REG_COUNT = 128U; число технологических слов GAS; скрытое слово modbus[128] в диапазон не входит. */
#define GAS167_REG_COUNT 128U
/* Задаёт GAS167_INFO_BASE = 0x5F00U; начало доступного только для чтения дескриптора GAS, адрес 0x5F00. */
#define GAS167_INFO_BASE 0x5F00U
/* Задаёт GAS167_INFO_WORDS = 8U; длина дескриптора GAS — восемь 16-битных слов. */
#define GAS167_INFO_WORDS 8U
/* Задаёт GAS167_MAX_WORDS = 124U; максимальная длина чтения GAS — 124 слова; служебный CAN требует чётную длину. */
#define GAS167_MAX_WORDS 124U
/* Задаёт GAS167_PROFILE_VERSION = 1U; версия карты адресов GAS 167/v1. */
#define GAS167_PROFILE_VERSION 1U
#define GAS167_CAPABILITIES 7U /* bit 0 RTU, bit 1 service CAN, bit 2 FC06 */
#define GAS167_CAPABILITIES 7U /* Бит 0 — RTU, бит 1 — служебный CAN, бит 2 — запись FC06. */ /* Задаёт GAS167_CAPABILITIES = 7U; маска возможностей: бит 0 — RTU, бит 1 — служебный CAN, бит 2 — FC06. */
/* Called by the main-loop transports under their snapshot IRQ lock.
* Capacity: at least GAS167_MAX_WORDS uint16_t words.
* RTU reads: 1..124 words; paired service CAN reads: 2..124, even.
* Successful reads return their count. Writes/errors return address/value.
* error uses Modbus codes 0 (success), 1 (function), 2 (address), 3 (value).
* No EEPROM I/O, allocation, or changes to the existing logger. */
/* Вызывается транспортами из главного цикла под краткой блокировкой IRQ.
* Буфер ответа должен вмещать не меньше GAS167_MAX_WORDS слов uint16_t.
* RTU читает 1..124 слова; служебный CAN — чётное число слов 2..124.
* Успешное чтение возвращает число слов. Запись или ошибка возвращает адрес/значение.
* error: 0 — успех, 1 — функция, 2 — адрес, 3 — значение.
* Здесь нет обмена EEPROM, выделения памяти или изменения устройства регистратора.
*/
/* Проверяет принадлежность адреса одному из двух диапазонов GAS 167/v1; доступно только для M95M02. */
int gas167_contains(uint16_t address);
/* Проверяет весь запрос FC03/FC06 до доступа к данным и формирует снимок регистров или дескриптора GAS. */
unsigned gas167_prepare(unsigned function, uint16_t address, uint16_t value,
/* Объявляет can — CAN; reply — данные reply. Хранит указатель на данные. */
int can, uint16_t *reply, unsigned *error);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
+2
View File
@@ -1 +1,3 @@
/* Последовательный вывод данных канала индикации. Русские пояснения сохранены в UTF-8. */
/* Объявляет интерфейс функции kanal_Send; реализация вызывается через этот прототип. */
void kanal_Send(int adr, long dat, int dot);
+49 -12
View File
@@ -1,57 +1,94 @@
/* Двухбанковый регистратор событий нагрузки во внешней RAM. Русские пояснения сохранены в UTF-8. */
/* Начинает условие: _LOG_TO_MEM ещё не определён; защищает повторное включение или задаёт значение сборки. */
#ifndef _LOG_TO_MEM
#define _LOG_TO_MEM
/* Определяет защитный символ или переключатель _LOG_TO_MEM для последующей компиляции. */
#define _LOG_TO_MEM
/* Включает следующий блок только при определённом символе __cplusplus. */
#ifdef __cplusplus
extern "C" {
/* Задаёт C-соглашение о связывании имён при включении заголовка из C++. */
extern "C" {
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Определениa длa работы логгера */
/* Определениa длa работы логгера */
/* Задаёт LOG_PAGE_START = 0x0200000; данные LOG_PAGE_START. */
#define LOG_PAGE_START 0x0200000
/* Задаёт LOG_PAGE_LEN = 0xFA00; данные LOG_PAGE_LEN. */
#define LOG_PAGE_LEN 0xFA00
extern int no_write, never_write; // Флаги, чтобы не писать (если что)
/* Объявляет no_write — no запись; never_write — never запись. Память определена в другом модуле. */
extern int no_write, never_write; // Флаги, чтобы не писать (если что)
/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */
typedef struct
{
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет Start — данные Start. */
unsigned long Start;
/* Объявляет Finis — данные Finis. */
unsigned long Finis;
/* Объявляет Adres — данные Adres. */
unsigned long Adres;
/* Объявляет Circl — данные Circl. */
unsigned int Circl;
/* Продолжает список аргументов, полей или выражение } LOG;; порядок элементов сохраняется. */
} LOG;
/* Объявляет Log — данные Log. Память определена в другом модуле. */
extern LOG Log;
/* Запись словa в памать, где логи лежат */
/* Запись словa в памать, где логи лежат */
/* Задаёт Log_to_mem = *(int *)(Log.Adres++) = x; данные Log_to_mem. */
#define Log_to_mem(x) *(int *)(Log.Adres++) = x
/* Проверка границы памати дла логов */
/* Проверка границы памати дла логов */
//#define Test_mem_limit(x) if(Log.Adres > (Log.Finis - (x))) Log.Adres = Log.Start
/* Задаёт Test_mem_limit = if(Log.Adres > (Log.Finis - (x))) Log.Adres -=(x); данные Test_mem_limit. */
#define Test_mem_limit(x) if(Log.Adres > (Log.Finis - (x))) Log.Adres -=(x)
/* Очистка памати (обнуление) */
/* Очистка памати (обнуление) */
/* Обнуляет выделенный диапазон внешней RAM журнала и задаёт границы кольцевого буфера. */
void clear_mem();
/* Логгер УМП: отдельное адресное пространство Modbus, без изменения
* 128 технологических регистров. Два банка по 760 записей:
* текущий кольцевой журнал и зафиксированный фрагмент отключения. */
/* Логгер УМП: отдельное адресное пространство Modbus, без изменения
* 128 технологических регистров. Два банка по 760 записей:
* текущий кольцевой журнал и зафиксированный фрагмент отключения. */
/* Задаёт UMP_LOG_BASE = 0x1000U; данные UMP_LOG_BASE. */
#define UMP_LOG_BASE 0x1000U
/* Задаёт UMP_LOG_DATA = 0x1010U; UMP LOG данные. */
#define UMP_LOG_DATA 0x1010U
/* Задаёт UMP_LOG_WORDS = 42U; UMP LOG слова. */
#define UMP_LOG_WORDS 42U
/* Задаёт UMP_LOG_CAPACITY = 760U; данные UMP_LOG_CAPACITY. */
#define UMP_LOG_CAPACITY 760U
/* Задаёт UMP_LOG_LIVE_RECORDS = (120U / UMP_LOG_WORDS); данные UMP_LOG_LIVE_RECORDS. */
#define UMP_LOG_LIVE_RECORDS (120U / UMP_LOG_WORDS)
/* Задаёт UMP_LOG_LIVE = 0x1100U; данные UMP_LOG_LIVE. */
#define UMP_LOG_LIVE 0x1100U
/* Объявляет ump_dac_ramp — ump ЦАП ramp; ump_dac_duration — ump ЦАП duration; ump_dac_go10 — ump ЦАП go 10; ump_dac_stop10 — ump ЦАП stop 10; ump_dac_position — ump ЦАП position. Память определена в другом модуле. */
extern unsigned int ump_dac_ramp, ump_dac_duration, ump_dac_go10, ump_dac_stop10, ump_dac_position;
/* Явно инициализирует оба банка регистратора до включения IRQ; повторный старт записи архив не стирает. */
void ump_log_init(void);
/* Продвигает время регистратора в Timer1 и снимает записи с заданным периодом. */
void ump_log_tick(void);
/* Обслуживает изменения дискретных входов и выходов из главного цикла. */
void ump_log_io(void);
/* Обновляет последние CAN-данные и напряжения для следующего снимка регистратора. */
void ump_log_can(unsigned int header, unsigned int a, unsigned int b, unsigned int c);
/* Регистрирует изменение слова команд после записи по последовательному интерфейсу. */
void ump_log_rs(void);
/* Проверяет область чтения регистратора и возвращает слова состояния либо архивной записи. */
unsigned int ump_log_read(unsigned int address);
/* Применяет допустимые команды управления регистратором, сохраняя ограничения адресов. */
int ump_log_write(unsigned int address, unsigned int value);
/* Включает следующий блок только при определённом символе __cplusplus. */
#ifdef __cplusplus
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
#endif /* _LOG_TO_MEM */
#endif /* _LOG_TO_MEM */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
+107 -16
View File
@@ -1,121 +1,212 @@
/* Обработка датчиков, вычисление величин и миллисекундный такт системы. Русские пояснения сохранены в UTF-8. */
/* Начинает условие: _MEASURE ещё не определён; защищает повторное включение или задаёт значение сборки. */
#ifndef _MEASURE
/* Определяет защитный символ или переключатель _MEASURE для последующей компиляции. */
#define _MEASURE
/* Выполняет миллисекундный такт датчиков, таймеров связи, регистратора и защиты нагрузки. */
interrupt void cpu_timer1_isr_SENS(void);
/* Объявляет интерфейс функции Init_sensors; реализация вызывается через этот прототип. */
void Init_sensors(void);
/* Объявляет интерфейс функции Init_sensors_more; реализация вызывается через этот прототип. */
void Init_sensors_more(void);
/* Объявляет интерфейс функции Init_packMask; реализация вызывается через этот прототип. */
void Init_packMask(void);
/* Объявляет интерфейс функции Temper_count; реализация вызывается через этот прототип. */
void Temper_count(int chan, int ovn);
/* Объявляет интерфейс функции Current_count; реализация вызывается через этот прототип. */
void Current_count(int chan);
/* Объявляет интерфейс функции Power_count; реализация вызывается через этот прототип. */
void Power_count(int chan);
/* Объявляет интерфейс функции calc_sensor_koef; реализация вызывается через этот прототип. */
void calc_sensor_koef(void);
/* Объявляет интерфейс функции Is_Voltage_Hi; реализация вызывается через этот прототип. */
void Is_Voltage_Hi(void);
/* Объявляет интерфейс функции calc_volta_edge; реализация вызывается через этот прототип. */
void calc_volta_edge(void);
/* Объявляет интерфейс функции er_anal; реализация вызывается через этот прототип. */
int er_anal(int term, unsigned int * count, long edge, int pre);
/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */
typedef union
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Продолжает список аргументов, полей или выражение struct; порядок элементов сохраняется. */
struct
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Битовое поле Tear, ширина 1 бит; данные Tear. */
unsigned int Tear :1;
/* Битовое поле res, ширина 1 бит; данные res. */
unsigned int res :1;
/* Битовое поле Wry, ширина 1 бит; данные Wry. */
unsigned int Wry :1;
/* Битовое поле Out, ширина 1 бит; данные Out. */
unsigned int Out :1;
/* Битовое поле Over, ширина 1 бит; данные Over. */
unsigned int Over :1;
/* Битовое поле Hyper, ширина 1 бит; данные Hyper. */
unsigned int Hyper :1;
/* Битовое поле Contr, ширина 1 бит; данные Contr. */
unsigned int Contr :1;
/* Битовое поле res2, ширина 1 бит; данные res2. */
unsigned int res2 :1;
/* Битовое поле Stop, ширина 1 бит; данные Stop. */
unsigned int Stop :1;
/* Битовое поле Ready, ширина 1 бит; данные Ready. */
unsigned int Ready :1;
/* Битовое поле Discr1, ширина 1 бит; данные Discr1. */
unsigned int Discr1 :1;
/* Битовое поле Discr2, ширина 1 бит; данные Discr2. */
unsigned int Discr2 :1;
/* Битовое поле Discr3, ширина 1 бит; данные Discr3. */
unsigned int Discr3 :1;
/* Битовое поле Discr4, ширина 1 бит; данные Discr4. */
unsigned int Discr4 :1;
/* Битовое поле Ignor, ширина 1 бит; данные Ignor. */
unsigned int Ignor :1;
/* Битовое поле Bypas, ширина 1 бит; данные Bypas. */
unsigned int Bypas :1;
/* Продолжает список аргументов, полей или выражение } bit;; порядок элементов сохраняется. */
} bit;
/* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */
unsigned int all;
/* Задаёт Imit = Discr4; данные Imit. */
#define Imit Discr4
/* Продолжает список аргументов, полей или выражение } ERROR;; порядок элементов сохраняется. */
} ERROR;
/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */
typedef union
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Продолжает список аргументов, полей или выражение struct; порядок элементов сохраняется. */
struct
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Битовое поле Error, ширина 1 бит; ошибка. */
unsigned int Error :1;
/* Битовое поле Alarm, ширина 1 бит; данные Alarm. */
unsigned int Alarm :1;
/* Битовое поле OverHeat, ширина 1 бит; данные OverHeat. */
unsigned int OverHeat :1;
/* Битовое поле SubHeat, ширина 1 бит; данные SubHeat. */
unsigned int SubHeat :1;
/* Битовое поле OutHeat, ширина 1 бит; данные OutHeat. */
unsigned int OutHeat :1;
/* Битовое поле Test_lamp, ширина 1 бит; данные Test_lamp. */
unsigned int Test_lamp :1;
/* Продолжает список аргументов, полей или выражение } bit;; порядок элементов сохраняется. */
} bit;
/* Объявляет all — представление регистра целым словом без разбиения на битовые поля. */
unsigned int all;
/* Продолжает список аргументов, полей или выражение } FLAG;; порядок элементов сохраняется. */
} FLAG;
/* Задаёт NOER = 0xE000; данные NOER. */
#define NOER 0xE000//C
/* Задаёт EROR = 0x01FF; данные EROR. */
#define EROR 0x01FF
#define READY_FREQ (500.0 * 2)// Ãö
#define BLINK_FREQ 2 // Ãö
/* Задаёт READY_FREQ = (500.0 * 2); частота основного такта Timer1 в герцах. */
#define READY_FREQ (500.0 * 2)// Гц
/* Задаёт BLINK_FREQ = 2; данные BLINK_FREQ. */
#define BLINK_FREQ 2 // Гц
/* Задаёт BLINK_TIME = (READY_FREQ / BLINK_FREQ); данные BLINK_TIME. */
#define BLINK_TIME (READY_FREQ / BLINK_FREQ)
/* Задаёт CANPOWSE = 20; данные CANPOWSE. */
#define CANPOWSE 20
#define ADC_FREQ 3750 //3885.0//777//2000//20000 //777 //3885 // Ãö (777*5)
#define DAC_FREQ 200//5 // Ãö
/* Задаёт ADC_FREQ = 3750; частота запуска последовательности АЦП в герцах. */
#define ADC_FREQ 3750 //3885.0//777//2000//20000 //777 //3885 // Гц (777*5)
/* Задаёт DAC_FREQ = 200; частота обновления тока ЦАП в герцах. */
#define DAC_FREQ 200//5 // Гц
/* Задаёт LOAD_TIME = 30; время нарастания тока нагрузки в секундах. */
#define LOAD_TIME 30//15 // sec
/* Объявляет Caliber_time — данные Caliber_time. Память определена в другом модуле. */
extern unsigned int Caliber_time;
/* Задаёт SENS_ERR_WAIT = 10; данные SENS_ERR_WAIT. */
#define SENS_ERR_WAIT 10
/* Задаёт maximum_bright = 10; данные maximum_bright. */
#define maximum_bright 10
/* Задаёт Pi = 3.1415926535897932384626433832795; данные Pi. */
#define Pi 3.1415926535897932384626433832795
/* Задаёт Pi_2 = 1.5707963267948966192313216916398; данные Pi_2. */
#define Pi_2 1.5707963267948966192313216916398
/* Задаёт ZERO = 27; данные ZERO. */
#define ZERO 27
#define Cooling 5 // (°Ñ) Ãèñòåðåçèñ ïî ñíàòèþ ïåðåãðåâà
/* Задаёт Cooling = 5; данные Cooling. */
#define Cooling 5 // (°С) Гистерезис по снатию перегрева
/* Задаёт COSPi6 = 0.86602540378443864676372317075294; данные COSPi6. */
#define COSPi6 0.86602540378443864676372317075294
/* Задаёт RADIX2 = 1.4142135623730950488016887242097; данные RADIX2. */
#define RADIX2 1.4142135623730950488016887242097
#define POWER_380 0 // ïèòàíèå 380Â
#define POWER_38O 1 // ïèòàíèå 380Â
#define CURRENT 2 // òîê
#define VOLTAGE 3 // íàïðàæåíèå
#define POWER_31 4 // ïèòàíèå 31Â
#define POWER_27 5 // ïèòàíèå 24Â
#define POWER_24 6 // ïèòàíèå 24Â
#define POWER_15 7 // ïèòàíèå 15Â
#define TERMO_AD 8 // òåðìîäàò÷èê ìåëêîñõåìà
#define TERMO_RS 9 // òåðìîðåçèñòîð
#define TRM_OBEH 10 // òåðìîäàò÷èê îâåí
/* Задаёт POWER_380 = 0; данные POWER_380. */
#define POWER_380 0 // питание 380В
/* Задаёт POWER_38O = 1; данные POWER_38O. */
#define POWER_38O 1 // питание 380В
/* Задаёт CURRENT = 2; данные CURRENT. */
#define CURRENT 2 // ток
/* Задаёт VOLTAGE = 3; данные VOLTAGE. */
#define VOLTAGE 3 // напражение
/* Задаёт POWER_31 = 4; данные POWER_31. */
#define POWER_31 4 // питание 31В
/* Задаёт POWER_27 = 5; данные POWER_27. */
#define POWER_27 5 // питание 24В
/* Задаёт POWER_24 = 6; данные POWER_24. */
#define POWER_24 6 // питание 24В
/* Задаёт POWER_15 = 7; данные POWER_15. */
#define POWER_15 7 // питание 15В
/* Задаёт TERMO_AD = 8; данные TERMO_AD. */
#define TERMO_AD 8 // термодатчик мелкосхема
/* Задаёт TERMO_RS = 9; данные TERMO_RS. */
#define TERMO_RS 9 // терморезистор
/* Задаёт TRM_OBEH = 10; данные TRM_OBEH. */
#define TRM_OBEH 10 // термодатчик овен
/* Объявляет TPL_CANS — данные TPL_CANS; tpl_cans — данные tpl_cans. Память определена в другом модуле. */
extern int TPL_CANS,tpl_cans;
/* Объявляет READY — данные READY. Память определена в другом модуле. */
extern int READY;
/* Объявляет filter — данные filter. Память определена в другом модуле. */
extern FILTERBAT filter[];
/* Объявляет adc_filter — АЦП filter. Память определена в другом модуле. */
extern FILTERBAT adc_filter[];
/* Объявляет out_filter — данные out_filter. Память определена в другом модуле. */
extern FILTERBAT out_filter[];
/* Объявляет sens_type — данные sens_type. Память определена в другом модуле. */
extern int sens_type[];
/* Объявляет ext_temp — данные ext_temp; ext_diag — данные ext_diag. Память определена в другом модуле. */
extern int ext_temp[], ext_diag[];
/* Объявляет Lonely — данные Lonely. Память определена в другом модуле. */
extern unsigned long Lonely;
/* Объявляет CanPowse — CAN Powse; CanGO — CAN GO. Память определена в другом модуле. */
extern unsigned int CanPowse,CanGO;
/* Объявляет Maska[][8];. Память определена в другом модуле. */
extern unsigned int Maska[][8];
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif //_MEASURE
+40 -7
View File
@@ -1,42 +1,75 @@
/* Обработка Modbus, заводские параметры и сохранение настроек. Русские пояснения сохранены в UTF-8. */
/* Начинает условие: MESSAGE_H ещё не определён; защищает повторное включение или задаёт значение сборки. */
#ifndef MESSAGE_H
/* Определяет защитный символ или переключатель MESSAGE_H для последующей компиляции. */
#define MESSAGE_H
/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */
typedef unsigned char CHAR;
#define ANSWER_LEN 0x80 //70 // 16+16+16+16+6
#define REPLY_LEN 0x19
/* Задаёт ANSWER_LEN = 0x80; данные ANSWER_LEN. */
#define ANSWER_LEN 0x80 //70 // 16+16+16+16+6
/* Задаёт REPLY_LEN = 0x19; данные REPLY_LEN. */
#define REPLY_LEN 0x19
/* Задаёт byte_hi = byte_1; данные byte_hi. */
#define byte_hi byte_1
/* Задаёт byte_lo = byte_0; данные byte_lo. */
#define byte_lo byte_0
/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */
typedef struct
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
unsigned char Address; // Àäðåñ êîíòðîëëåðà
unsigned char Number; // Íîìåð êîìàíäû
/* Объявляет Address — адрес. */
unsigned char Address; // Адрес контроллера
/* Объявляет Number — данные Number. */
unsigned char Number; // Номер команды
/* Продолжает список аргументов, полей или выражение BAITE byte0;; порядок элементов сохраняется. */
BAITE byte0;
/* Продолжает список аргументов, полей или выражение BAITE byte1;; порядок элементов сохраняется. */
BAITE byte1;
/* Продолжает список аргументов, полей или выражение BAITE byte2;; порядок элементов сохраняется. */
BAITE byte2;
/* Продолжает список аргументов, полей или выражение BAITE byte3;; порядок элементов сохраняется. */
BAITE byte3;
/* Продолжает список аргументов, полей или выражение BAITE byte4;; порядок элементов сохраняется. */
BAITE byte4;
/* Продолжает список аргументов, полей или выражение BAITE byte5;; порядок элементов сохраняется. */
BAITE byte5;
/* Продолжает список аргументов, полей или выражение BAITE byte6;; порядок элементов сохраняется. */
BAITE byte6;
/* Продолжает список аргументов, полей или выражение BAITE byte7;; порядок элементов сохраняется. */
BAITE byte7;
/* Объявляет crc_lo — данные crc_lo. */
unsigned char crc_lo;
/* Объявляет crc_hi — данные crc_hi. */
unsigned char crc_hi;
/* Объявляет add_byte — данные add_byte. */
unsigned char add_byte;
/* Продолжает список аргументов, полей или выражение } CMD_TO_TMS;; порядок элементов сохраняется. */
} CMD_TO_TMS;
extern int modbus[];
/* Объявляет modbus — массив технологических регистров; слово int на C28x занимает 16 бит. Память определена в другом модуле. */
extern int modbus[];
/* Обслуживает чтение регистров FC03 с проверкой адреса, длины и формированием ответа RTU. */
void ReceiveCommandModbus3(RS_DATA *rs_arr);
void ReceiveCommandModbus6(RS_DATA *rs_arr);
/* Обслуживает одиночную запись FC06, проверяя доступность регистра и допустимость значения. */
void ReceiveCommandModbus6(RS_DATA *rs_arr);
/* Объявляет интерфейс функции SendCommandModbus4; реализация вызывается через этот прототип. */
void SendCommandModbus4(RS_DATA *rs_arr);
void ReceiveAnswerModbus4(RS_DATA *rs_arr);
/* Объявляет интерфейс функции ReceiveAnswerModbus4; реализация вызывается через этот прототип. */
void ReceiveAnswerModbus4(RS_DATA *rs_arr);
/* Сохраняет технологические регистры в область параметров, отделённую от загрузочного образа EEPROM. */
void Save_params(void);
/* Читает сохранённые регистры из области параметров EEPROM и применяет настройки платы. */
void Load_params(void);
/* Заполняет регистры заводскими значениями; тайм-аут CAN нагрузки по умолчанию равен 600 мс. */
void Default_params(void);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif //MESSAGE_H
+135 -7
View File
@@ -1,172 +1,300 @@
/* Адреса устройств, типы плат и псевдонимы технологических регистров. Русские пояснения сохранены в UTF-8. */
/* Начинает условие: PACKAGE ещё не определён; защищает повторное включение или задаёт значение сборки. */
#ifndef PACKAGE
/* Определяет защитный символ или переключатель PACKAGE для последующей компиляции. */
#define PACKAGE
/* Задаёт BALSAM = 167; данные BALSAM. */
#define BALSAM 167
/* Условие компиляции BALSAM == 167: выбранный блок включается в текущий вариант прошивки. */
#if BALSAM == 167
/* Задаёт OBOROT = STRAIGHT; данные OBOROT. */
#define OBOROT STRAIGHT
/* Определяет защитный символ или переключатель CALIB_RS для последующей компиляции. */
#define CALIB_RS
/* Определяет защитный символ или переключатель OWEN для последующей компиляции. */
#define OWEN
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции BALSAM == 166: выбранный блок включается в текущий вариант прошивки. */
#if BALSAM == 166
/* Задаёт OBOROT = REVERSE; данные OBOROT. */
#define OBOROT REVERSE
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции BALSAM == 165: выбранный блок включается в текущий вариант прошивки. */
#if BALSAM == 165
/* Задаёт OBOROT = STRAIGHT; данные OBOROT. */
#define OBOROT STRAIGHT
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции BALSAM == 164: выбранный блок включается в текущий вариант прошивки. */
#if BALSAM == 164
/* Задаёт OBOROT = REVERSE; данные OBOROT. */
#define OBOROT REVERSE
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Определяет защитный символ или переключатель ONBOARDCALIBER для последующей компиляции. */
#define ONBOARDCALIBER
/* Задаёт TERMOPAIR = 14; данные TERMOPAIR. */
#define TERMOPAIR 14
/* Задаёт CURRENTOS = (TERMOPAIR*2); данные CURRENTOS. */
#define CURRENTOS (TERMOPAIR*2)
//-----------------------------------------------
/* Задаёт adr_TRN1 = 1; данные adr_TRN1. */
#define adr_TRN1 1
/* Задаёт adr_TRN2 = 2; данные adr_TRN2. */
#define adr_TRN2 2
/* Задаёт adr_POW1 = 3; данные adr_POW1. */
#define adr_POW1 3
/* Задаёт adr_POW2 = 4; данные adr_POW2. */
#define adr_POW2 4
/* Задаёт adr_LOA1 = 5; данные adr_LOA1. */
#define adr_LOA1 5
/* Задаёт adr_LOA2 = 6; данные adr_LOA2. */
#define adr_LOA2 6
/* Задаёт adr_ENG1 = 7; данные adr_ENG1. */
#define adr_ENG1 7
/* Задаёт adr_PULT = 8; данные adr_PULT. */
#define adr_PULT 8
/* Задаёт adr_SHKF = 9; данные adr_SHKF. */
#define adr_SHKF 9
//-------------------
/* Задаёт adr_REC1 = 0xff; данные adr_REC1. */
#define adr_REC1 0xff
/* Задаёт adr_REC2 = 0xff; данные adr_REC2. */
#define adr_REC2 0xff
/* Задаёт adr_INV1 = 0xff; данные adr_INV1. */
#define adr_INV1 0xff
/* Задаёт adr_INV2 = 0xff; данные adr_INV2. */
#define adr_INV2 0xff
/* Задаёт adr_BRK1 = 0xff; данные adr_BRK1. */
#define adr_BRK1 0xff
/* Задаёт adr_BRK2 = 0xff; данные adr_BRK2. */
#define adr_BRK2 0xff
/* Задаёт adr_ENG2 = 0xff; данные adr_ENG2. */
#define adr_ENG2 0xff
/* Задаёт adr_PLT1 = 0xff; данные adr_PLT1. */
#define adr_PLT1 0xff
/* Задаёт adr_PLT2 = 0xff; данные adr_PLT2. */
#define adr_PLT2 0xff
/* Задаёт adr_DSTR = 0xff; данные adr_DSTR. */
#define adr_DSTR 0xff
//-----------------------------------------------
/* Задаёт dsk_COMM = 1; данные dsk_COMM. */
#define dsk_COMM 1
/* Задаёт dsk_BKSD = 2; данные dsk_BKSD. */
#define dsk_BKSD 2
/* Задаёт dsk_BKST = 3; данные dsk_BKST. */
#define dsk_BKST 3
/* Задаёт dsk_EPLT = 4; данные dsk_EPLT. */
#define dsk_EPLT 4
/* Задаёт dsk_SHKF = 5; данные dsk_SHKF. */
#define dsk_SHKF 5
/* Задаёт dsk_LOAD = 6; код платы нагрузки. */
#define dsk_LOAD 6
//-----------------------------------------------
//-----------------------------------------------
/* Задаёт TPL_TRN = 10; данные TPL_TRN. */
#define TPL_TRN 10
/* Условие компиляции BALSAM == 167: выбранный блок включается в текущий вариант прошивки. */
#if BALSAM == 167
/* Задаёт TPL_POW = 7; данные TPL_POW. */
#define TPL_POW 7
/* Задаёт OWEN_DT = 2; данные OWEN_DT. */
#define OWEN_DT 2
/* Выбирает альтернативный блок текущего условия компиляции. */
#else
/* Задаёт TPL_POW = 8; данные TPL_POW. */
#define TPL_POW 8
/* Задаёт OWEN_DT = 0; данные OWEN_DT. */
#define OWEN_DT 0
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Задаёт TPL_ENG = 8; данные TPL_ENG. */
#define TPL_ENG 8
/* Задаёт TPL_SHK = 15; данные TPL_SHK. */
#define TPL_SHK 15
//-----------------------------------------------
/* Задаёт Modbus = ((WORDE *)modbus); данные Modbus. */
#define Modbus ((WORDE *)modbus)
/* Задаёт start_error = 0x00; start ошибка. */
#define start_error 0x00
/* Задаёт start_data = 0x18; start данные. */
#define start_data 0x18
/* Задаёт start_hi_edge = 0x30; данные start_hi_edge. */
#define start_hi_edge 0x30
/* Задаёт start_lo_edge = 0x48; данные start_lo_edge. */
#define start_lo_edge 0x48
/* Задаёт sens_error = ((ERROR *)(modbus+start_error)); sens ошибка. */
#define sens_error ((ERROR *)(modbus+start_error))
/* Задаёт sens_data = (modbus+start_data); sens данные. */
#define sens_data (modbus+start_data)
/* Задаёт sens_hi_edge = (modbus+start_hi_edge); данные sens_hi_edge. */
#define sens_hi_edge (modbus+start_hi_edge)
/* Задаёт sens_lo_edge = (modbus+start_lo_edge); данные sens_lo_edge. */
#define sens_lo_edge (modbus+start_lo_edge)
/* Задаёт InputRep0 = Modbus[0].bit.bitA; вход Rep 0. */
#define InputRep0 Modbus[0].bit.bitA
/* Задаёт InputRep1 = Modbus[0].bit.bitB; вход Rep 1. */
#define InputRep1 Modbus[0].bit.bitB
/* Задаёт InputRep2 = Modbus[0].bit.bitC; вход Rep 2. */
#define InputRep2 Modbus[0].bit.bitC
/* Задаёт Inputs = Modbus[0x10]; данные Inputs. */
#define Inputs Modbus[0x10]
/* Задаёт Buttons = Modbus[0x16]; данные Buttons. */
#define Buttons Modbus[0x16]
/* Задаёт Jumpers = modbus[0x17]; данные Jumpers. */
#define Jumpers modbus[0x17]
/* Задаёт bTestLamp = Buttons.bit.bit0; данные bTestLamp. */
#define bTestLamp Buttons.bit.bit0
/* Задаёт bSecretBt = Buttons.bit.bit1; данные bSecretBt. */
#define bSecretBt Buttons.bit.bit1
/* Задаёт bTermoCal = Buttons.bit.bit2; данные bTermoCal. */
#define bTermoCal Buttons.bit.bit2
// Ïðèøëî âðåìà!
#define DAC_go modbus[0x50] // íà÷àëî çàðàäà
#define DAC_stop modbus[0x51] // êîíåö çàðàäà
// Пришло врема!
/* Задаёт DAC_go = modbus[0x50]; начальный ток нагрузки в мА, технологический регистр 0x50. */
#define DAC_go modbus[0x50] // начало зарада
/* Задаёт DAC_stop = modbus[0x51]; конечный ток нагрузки в мА, технологический регистр 0x51. */
#define DAC_stop modbus[0x51] // конец зарада
/* LOAD-only persistent CAN timeout (ms), read-only status and attempts. */
/* Задаёт LOAD_CAN_TIMEOUT = modbus[0x52]; сохраняемый тайм-аут свежести напряжения CAN в миллисекундах, регистр 0x52. */
#define LOAD_CAN_TIMEOUT modbus[0x52]
/* Задаёт LOAD_STATUS = modbus[0x7C]; слово состояния защиты нагрузки для чтения, регистр 0x7C. */
#define LOAD_STATUS modbus[0x7C]
/* Задаёт LOAD_ATTEMPTS = modbus[0x7D]; число попыток пуска для чтения, регистр 0x7D. */
#define LOAD_ATTEMPTS modbus[0x7D]
#define Cancount (modbus+0x60) // ïàóçà ìåæäó I ïîñûëêàìè CAN
#define Bright (modbus+0x62) // àðêîñòü ñèãíàëüíûõ ëàìïî÷åê
#define Brightness modbus[0x62] // àðêîñòü ñèãíàëüíûõ ëàìïî÷åê
/* Задаёт Cancount = (modbus+0x60); данные Cancount. */
#define Cancount (modbus+0x60) // пауза между I посылками CAN
/* Задаёт Bright = (modbus+0x62); данные Bright. */
#define Bright (modbus+0x62) // аркость сигнальных лампочек
/* Задаёт Brightness = modbus[0x62]; данные Brightness. */
#define Brightness modbus[0x62] // аркость сигнальных лампочек
#define Owncount modbus[0x63] // ïàóçà ìåæäó îïðîñàìè OWEN
/* Задаёт Owncount = modbus[0x63]; данные Owncount. */
#define Owncount modbus[0x63] // пауза между опросами OWEN
/* Задаёт m_FAST = 0; данные m_FAST. */
#define m_FAST 0
/* Задаёт m_SLOW = 1; данные m_SLOW. */
#define m_SLOW 1
/* Задаёт Zero_lev = (modbus+0x70); данные Zero_lev. */
#define Zero_lev (modbus+0x70)
/* Задаёт DAC_20 = modbus[0x6E]; ЦАП 20. */
#define DAC_20 modbus[0x6E]
/* Задаёт DAC_04 = modbus[0x6F]; ЦАП 04. */
#define DAC_04 modbus[0x6F]
/* Задаёт DAC_max = modbus[0x78]; ЦАП max. */
#define DAC_max() modbus[0x78] // 751//0x0000 804
/* Задаёт DAC_min = modbus[0x79]; ЦАП min. */
#define DAC_min() modbus[0x79] // 2162//0x0FFF 2373
/* Задаёт DAC_cal = modbus[0x7A]; ЦАП cal. */
#define DAC_cal() modbus[0x7A]
/* Задаёт Caliber = (modbus+0x74); данные Caliber. */
#define Caliber (modbus+0x74)
/* Задаёт K380_1 = Caliber[0]; данные K380_1. */
#define K380_1 Caliber[0]
/* Задаёт K380_2 = Caliber[1]; данные K380_2. */
#define K380_2 Caliber[1]
/* Задаёт KPOW_1 = Caliber[0]; данные KPOW_1. */
#define KPOW_1 Caliber[0]
/* Задаёт KPOW_2 = Caliber[1]; данные KPOW_2. */
#define KPOW_2 Caliber[1]
/* Задаёт KPOW_3 = Caliber[2]; данные KPOW_3. */
#define KPOW_3 Caliber[2]
/* Задаёт KPOW_4 = Caliber[3]; данные KPOW_4. */
#define KPOW_4 Caliber[3]
/* Задаёт NormaU = Caliber[8]; данные NormaU. */
#define NormaU Caliber[8]
/* Задаёт DeltaU = Caliber[9]; данные DeltaU. */
#define DeltaU Caliber[9]
/* Задаёт TCaliber = (modbus+0x78); данные TCaliber. */
#define TCaliber (modbus+0x78)
/* Задаёт K300_1 = TCaliber[0]; данные K300_1. */
#define K300_1 TCaliber[0]
/* Задаёт K300_2 = TCaliber[1]; данные K300_2. */
#define K300_2 TCaliber[1]
/* Задаёт K400_1 = TCaliber[2]; данные K400_1. */
#define K400_1 TCaliber[2]
/* Задаёт K400_2 = TCaliber[3]; данные K400_2. */
#define K400_2 TCaliber[3]
/* Задаёт K100_1 = TCaliber[0]; данные K100_1. */
#define K100_1 TCaliber[0]
/* Задаёт K100_2 = TCaliber[1]; данные K100_2. */
#define K100_2 TCaliber[1]
/* Задаёт K150_1 = TCaliber[2]; данные K150_1. */
#define K150_1 TCaliber[2]
/* Задаёт K150_2 = TCaliber[3]; данные K150_2. */
#define K150_2 TCaliber[3]
/* Задаёт K100_D = TCaliber[0]; данные K100_D. */
#define K100_D TCaliber[0]
/* Задаёт K150_D = TCaliber[1]; данные K150_D. */
#define K150_D TCaliber[1]
/* Задаёт LastMode = Modbus[126].all; последний режим платы, технологический регистр 126. */
#define LastMode Modbus[126].all
/* Задаёт Commands = Modbus[127].all; слово команд, технологический регистр 127. */
#define Commands Modbus[127].all
/* Задаёт cTestLamp = Modbus[127].bit.bit0; данные cTestLamp. */
#define cTestLamp Modbus[127].bit.bit0
/* Задаёт cDefParam = Modbus[127].bit.bit1; данные cDefParam. */
#define cDefParam Modbus[127].bit.bit1
/* Задаёт cSaveParam = Modbus[127].bit.bit2; данные cSaveParam. */
#define cSaveParam Modbus[127].bit.bit2
/* Задаёт cLoadParam = Modbus[127].bit.bit3; данные cLoadParam. */
#define cLoadParam Modbus[127].bit.bit3
/* Задаёт cTermoCal = Modbus[127].bit.bit4; данные cTermoCal. */
#define cTermoCal Modbus[127].bit.bit4
/* Задаёт cKoefCalc = Modbus[127].bit.bit5; данные cKoefCalc. */
#define cKoefCalc Modbus[127].bit.bit5
/* Задаёт cUMPreset = Modbus[127].bit.bit6; данные cUMPreset. */
#define cUMPreset Modbus[127].bit.bit6
/* Задаёт cUMPstart = Modbus[127].bit.bit7; данные cUMPstart. */
#define cUMPstart Modbus[127].bit.bit7
/* Задаёт cInitDac = Modbus[127].bit.bit8; c Init ЦАП. */
#define cInitDac Modbus[127].bit.bit8
/* Задаёт cCalibrDac = Modbus[127].bit.bit9; c Calibr ЦАП. */
#define cCalibrDac Modbus[127].bit.bit9
/* Задаёт cSecretBt = Modbus[127].bit.bitA; данные cSecretBt. */
#define cSecretBt Modbus[127].bit.bitA
/* Задаёт cLiteFire = Modbus[127].bit.bitB; данные cLiteFire. */
#define cLiteFire Modbus[127].bit.bitB
/* Задаёт cRawMeat = Modbus[127].bit.bitC; данные cRawMeat. */
#define cRawMeat Modbus[127].bit.bitC
/* Задаёт cReset = Modbus[127].bit.bitF; c сброс. */
#define cReset Modbus[127].bit.bitF
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif //PACKAGE
+136 -7
View File
@@ -1,153 +1,282 @@
/* Перемычки режима платы, дискретные входы и выходы. Русские пояснения сохранены в UTF-8. */
/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */
#include "DSP2833x_Device.h" // DSP281x Headerfile Include File
/* Объявляет Mode — рабочий адрес или режим платы, выбранный перемычками; Desk — аппаратно определённый тип платы; TermoAD — данные TermoAD; TermoRS — данные TermoRS; TermoSW — данные TermoSW. Память определена в другом модуле. */
extern int Mode,Desk,TermoAD,TermoRS,TermoSW,Kurrent,Kalibro,Owen;
/* Объявляет интерфейс функции setup_leds_line; реализация вызывается через этот прототип. */
void setup_leds_line(void);
/* Объявляет интерфейс функции unsetup_leds_line; реализация вызывается через этот прототип. */
void unsetup_leds_line(void);
/* Задаёт led1_toggle = GpioDataRegs.GPBTOGGLE.bit.GPIO32=1; данные led1_toggle. */
#define led1_toggle() GpioDataRegs.GPBTOGGLE.bit.GPIO32=1
/* Задаёт led2_toggle = GpioDataRegs.GPBTOGGLE.bit.GPIO48=1; данные led2_toggle. */
#define led2_toggle() GpioDataRegs.GPBTOGGLE.bit.GPIO48=1
/* Задаёт led1_off = GpioDataRegs.GPBSET.bit.GPIO32=1; данные led1_off. */
#define led1_off() GpioDataRegs.GPBSET.bit.GPIO32=1
/* Задаёт led2_off = GpioDataRegs.GPBSET.bit.GPIO48=1; данные led2_off. */
#define led2_off() GpioDataRegs.GPBSET.bit.GPIO48=1
/* Задаёт led1_on = GpioDataRegs.GPBCLEAR.bit.GPIO32=1; данные led1_on. */
#define led1_on() GpioDataRegs.GPBCLEAR.bit.GPIO32=1
/* Задаёт led2_on = GpioDataRegs.GPBCLEAR.bit.GPIO48=1; данные led2_on. */
#define led2_on() GpioDataRegs.GPBCLEAR.bit.GPIO48=1
// READY ---------------------------------------------------------
/* Начинает функцию dat_READY; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void dat_READY(int x)
/* Записывает GpioDataRegs.GPBDAT.bit.GPIO61 значением !x; else; аппаратная линия ввода/вывода GPIO61. */
{ if(Desk==dsk_LOAD) GpioDataRegs.GPBDAT.bit.GPIO61=!x; else
/* Записывает GpioDataRegs.GPBDAT.bit.GPIO59 значением !x; }; аппаратная линия ввода/вывода GPIO59. */
GpioDataRegs.GPBDAT.bit.GPIO59=!x; }
/* Начинает функцию set_READY; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void set_READY(void)
/* Записывает GpioDataRegs.GPBCLEAR.bit.GPIO61 значением 1; else; аппаратная линия ввода/вывода GPIO61. */
{ if(Desk==dsk_LOAD) GpioDataRegs.GPBCLEAR.bit.GPIO61=1; else
/* Записывает GpioDataRegs.GPBCLEAR.bit.GPIO59 значением 1; }; аппаратная линия ввода/вывода GPIO59. */
GpioDataRegs.GPBCLEAR.bit.GPIO59=1; }
/* Начинает функцию clear_READY; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void clear_READY(void)
/* Записывает GpioDataRegs.GPBSET.bit.GPIO61 значением 1; else; аппаратная линия ввода/вывода GPIO61. */
{ if(Desk==dsk_LOAD) GpioDataRegs.GPBSET.bit.GPIO61=1; else
/* Записывает GpioDataRegs.GPBSET.bit.GPIO59 значением 1; }; аппаратная линия ввода/вывода GPIO59. */
GpioDataRegs.GPBSET.bit.GPIO59=1; }
/* Начинает функцию toggle_READY; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void toggle_READY(void)
/* Записывает GpioDataRegs.GPBTOGGLE.bit.GPIO61 значением 1;else; аппаратная линия ввода/вывода GPIO61. */
{ if(Desk==dsk_LOAD) GpioDataRegs.GPBTOGGLE.bit.GPIO61=1;else
/* Записывает GpioDataRegs.GPBTOGGLE.bit.GPIO59 значением 1;}; аппаратная линия ввода/вывода GPIO59. */
GpioDataRegs.GPBTOGGLE.bit.GPIO59=1;}
// PULT READY -----------------------------------------------------
/* Начинает функцию dat_ONLINE; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void dat_ONLINE(int x)
/* Записывает GpioDataRegs.GPADAT.bit.GPIO0 значением !x; }; аппаратная линия ввода/вывода GPIO0. */
{ GpioDataRegs.GPADAT.bit.GPIO0=!x; }
/* Начинает функцию set_ONLINE; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void set_ONLINE(void)
/* Записывает GpioDataRegs.GPASET.bit.GPIO0 значением 1; }; аппаратная линия ввода/вывода GPIO0. */
{ GpioDataRegs.GPASET.bit.GPIO0=1; }
/* Начинает функцию clear_ONLINE; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void clear_ONLINE(void)
/* Записывает GpioDataRegs.GPACLEAR.bit.GPIO0 значением 1; }; аппаратная линия ввода/вывода GPIO0. */
{ GpioDataRegs.GPACLEAR.bit.GPIO0=1; }
/* Начинает функцию toggle_ONLINE; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void toggle_ONLINE(void)
/* Записывает GpioDataRegs.GPATOGGLE.bit.GPIO0 значением 1; }; аппаратная линия ввода/вывода GPIO0. */
{ GpioDataRegs.GPATOGGLE.bit.GPIO0=1; }
// LED OUT 1 -----------------------------------------------------
/* Начинает функцию dat_LED_OUT_1; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void dat_LED_OUT_1(int x)
{ if(Desk==dsk_BKST || Desk==dsk_COMM)
/* Продолжает список аргументов, полей или выражение { if(Desk==dsk_BKST || Desk==dsk_COMM); порядок элементов сохраняется. */
{ if(Desk==dsk_BKST || Desk==dsk_COMM)
/* Записывает GpioDataRegs.GPBDAT.bit.GPIO60 значением !x; else; аппаратная линия ввода/вывода GPIO60. */
GpioDataRegs.GPBDAT.bit.GPIO60=!x; else
/* Проверяет if(Desk==dsk_LOAD) GpioDataRegs.GPADAT.bit.GPIO7=!x; else; последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_LOAD) GpioDataRegs.GPADAT.bit.GPIO7=!x; else
/* Записывает GpioDataRegs.GPBDAT.bit.GPIO60 значением x; }; аппаратная линия ввода/вывода GPIO60. */
GpioDataRegs.GPBDAT.bit.GPIO60=x; }
/* Начинает функцию set_LED_OUT_1; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void set_LED_OUT_1(void)
{ if(Desk==dsk_BKST || Desk==dsk_COMM)
/* Продолжает список аргументов, полей или выражение { if(Desk==dsk_BKST || Desk==dsk_COMM); порядок элементов сохраняется. */
{ if(Desk==dsk_BKST || Desk==dsk_COMM)
/* Записывает GpioDataRegs.GPBCLEAR.bit.GPIO60 значением 1; else; аппаратная линия ввода/вывода GPIO60. */
GpioDataRegs.GPBCLEAR.bit.GPIO60=1; else
/* Проверяет if(Desk==dsk_LOAD) GpioDataRegs.GPACLEAR.bit.GPIO7=1; else; последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_LOAD) GpioDataRegs.GPACLEAR.bit.GPIO7=1; else
/* Записывает GpioDataRegs.GPBSET.bit.GPIO60 значением 1; }; аппаратная линия ввода/вывода GPIO60. */
GpioDataRegs.GPBSET.bit.GPIO60=1; }
/* Начинает функцию clear_LED_OUT_1; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void clear_LED_OUT_1(void)
{ if(Desk==dsk_BKST || Desk==dsk_COMM)
/* Продолжает список аргументов, полей или выражение { if(Desk==dsk_BKST || Desk==dsk_COMM); порядок элементов сохраняется. */
{ if(Desk==dsk_BKST || Desk==dsk_COMM)
/* Записывает GpioDataRegs.GPBSET.bit.GPIO60 значением 1; else; аппаратная линия ввода/вывода GPIO60. */
GpioDataRegs.GPBSET.bit.GPIO60=1; else
/* Проверяет if(Desk==dsk_LOAD) GpioDataRegs.GPASET.bit.GPIO7=1; else; последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_LOAD) GpioDataRegs.GPASET.bit.GPIO7=1; else
/* Записывает GpioDataRegs.GPBCLEAR.bit.GPIO60 значением 1; }; аппаратная линия ввода/вывода GPIO60. */
GpioDataRegs.GPBCLEAR.bit.GPIO60=1; }
/* Начинает функцию toggle_LED_OUT_1; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void toggle_LED_OUT_1(void)
/* Записывает GpioDataRegs.GPATOGGLE.bit.GPIO7 значением 1; else; аппаратная линия ввода/вывода GPIO7. */
{ if(Desk==dsk_LOAD) GpioDataRegs.GPATOGGLE.bit.GPIO7=1; else
/* Записывает GpioDataRegs.GPBTOGGLE.bit.GPIO60 значением 1;}; аппаратная линия ввода/вывода GPIO60. */
GpioDataRegs.GPBTOGGLE.bit.GPIO60=1;}
// LED OUT 2 -----------------------------------------------------
/* Начинает функцию dat_LED_OUT_2; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void dat_LED_OUT_2(int x)
/* Записывает GpioDataRegs.GPADAT.bit.GPIO1 значением !x; else; аппаратная линия ввода/вывода GPIO1. */
{ if(Desk==dsk_LOAD) GpioDataRegs.GPADAT.bit.GPIO1=!x; else
/* Проверяет if(Desk==dsk_BKST) GpioDataRegs.GPBDAT.bit.GPIO62=!x; else; последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_BKST) GpioDataRegs.GPBDAT.bit.GPIO62=!x; else
/* Проверяет if(Desk==dsk_COMM) GpioDataRegs.GPBDAT.bit.GPIO63=!x; else; последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_COMM) GpioDataRegs.GPBDAT.bit.GPIO63=!x; else
/* Записывает GpioDataRegs.GPBDAT.bit.GPIO63 значением x; }; аппаратная линия ввода/вывода GPIO63. */
GpioDataRegs.GPBDAT.bit.GPIO63=x; }
/* Начинает функцию set_LED_OUT_2; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void set_LED_OUT_2(void)
/* Записывает GpioDataRegs.GPACLEAR.bit.GPIO1 значением 1; else; аппаратная линия ввода/вывода GPIO1. */
{ if(Desk==dsk_LOAD) GpioDataRegs.GPACLEAR.bit.GPIO1=1; else
/* Проверяет if(Desk==dsk_BKST) GpioDataRegs.GPBCLEAR.bit.GPIO62=1; else; последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_BKST) GpioDataRegs.GPBCLEAR.bit.GPIO62=1; else
/* Проверяет if(Desk==dsk_COMM) GpioDataRegs.GPBCLEAR.bit.GPIO63=1; else; последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_COMM) GpioDataRegs.GPBCLEAR.bit.GPIO63=1; else
/* Записывает GpioDataRegs.GPBSET.bit.GPIO63 значением 1; }; аппаратная линия ввода/вывода GPIO63. */
GpioDataRegs.GPBSET.bit.GPIO63=1; }
/* Начинает функцию clear_LED_OUT_2; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void clear_LED_OUT_2(void)
/* Записывает GpioDataRegs.GPASET.bit.GPIO7 значением 1; else; аппаратная линия ввода/вывода GPIO7. */
{ if(Desk==dsk_LOAD) GpioDataRegs.GPASET.bit.GPIO7=1; else
/* Проверяет if(Desk==dsk_BKST) GpioDataRegs.GPBSET.bit.GPIO62=1; else; последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_BKST) GpioDataRegs.GPBSET.bit.GPIO62=1; else
/* Проверяет if(Desk==dsk_COMM) GpioDataRegs.GPBSET.bit.GPIO63=1; else; последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_COMM) GpioDataRegs.GPBSET.bit.GPIO63=1; else
/* Записывает GpioDataRegs.GPBCLEAR.bit.GPIO63 значением 1; }; аппаратная линия ввода/вывода GPIO63. */
GpioDataRegs.GPBCLEAR.bit.GPIO63=1; }
/* Начинает функцию toggle_LED_OUT_2; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void toggle_LED_OUT_2(void)
/* Записывает GpioDataRegs.GPATOGGLE.bit.GPIO1 значением 1; else; аппаратная линия ввода/вывода GPIO1. */
{ if(Desk==dsk_LOAD) GpioDataRegs.GPATOGGLE.bit.GPIO1=1; else
/* Проверяет if(Desk==dsk_BKST) GpioDataRegs.GPBTOGGLE.bit.GPIO62=1;else; последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_BKST) GpioDataRegs.GPBTOGGLE.bit.GPIO62=1;else
/* Записывает GpioDataRegs.GPBTOGGLE.bit.GPIO63 значением 1;}; аппаратная линия ввода/вывода GPIO63. */
GpioDataRegs.GPBTOGGLE.bit.GPIO63=1;}
// RES OUT 1 -----------------------------------------------------
/* Начинает функцию dat_RES_OUT_1; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void dat_RES_OUT_1(int x)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(Desk==dsk_LOAD или Desk==dsk_EPLT); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_LOAD || Desk==dsk_EPLT)
/* Записывает GpioDataRegs.GPADAT.bit.GPIO9 значением !x; else; аппаратная линия ввода/вывода GPIO9. */
GpioDataRegs.GPADAT.bit.GPIO9=!x; else
/* Проверяет if(Desk==dsk_BKSD) GpioDataRegs.GPBDAT.bit.GPIO62=!x; else; последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_BKSD) GpioDataRegs.GPBDAT.bit.GPIO62=!x; else
/* Записывает GpioDataRegs.GPBDAT.bit.GPIO58 значением !x; }; аппаратная линия ввода/вывода GPIO58. */
GpioDataRegs.GPBDAT.bit.GPIO58=!x; }
/* Начинает функцию set_RES_OUT_1; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void set_RES_OUT_1(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(Desk==dsk_LOAD или Desk==dsk_EPLT); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_LOAD || Desk==dsk_EPLT)
/* Записывает GpioDataRegs.GPACLEAR.bit.GPIO9 значением 1; else; аппаратная линия ввода/вывода GPIO9. */
GpioDataRegs.GPACLEAR.bit.GPIO9=1; else
/* Проверяет if(Desk==dsk_BKSD) GpioDataRegs.GPBCLEAR.bit.GPIO62=1; else; последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_BKSD) GpioDataRegs.GPBCLEAR.bit.GPIO62=1; else
/* Записывает GpioDataRegs.GPBCLEAR.bit.GPIO58 значением 1; }; аппаратная линия ввода/вывода GPIO58. */
GpioDataRegs.GPBCLEAR.bit.GPIO58=1; }
/* Начинает функцию clear_RES_OUT_1; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void clear_RES_OUT_1(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(Desk==dsk_LOAD или Desk==dsk_EPLT); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_LOAD || Desk==dsk_EPLT)
/* Записывает GpioDataRegs.GPASET.bit.GPIO9 значением 1; else; аппаратная линия ввода/вывода GPIO9. */
GpioDataRegs.GPASET.bit.GPIO9=1; else
/* Проверяет if(Desk==dsk_BKSD) GpioDataRegs.GPBSET.bit.GPIO62=1; else; последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_BKSD) GpioDataRegs.GPBSET.bit.GPIO62=1; else
/* Записывает GpioDataRegs.GPBSET.bit.GPIO58 значением 1; }; аппаратная линия ввода/вывода GPIO58. */
GpioDataRegs.GPBSET.bit.GPIO58=1; }
/* Начинает функцию toggle_RES_OUT_1; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void toggle_RES_OUT_1(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(Desk==dsk_LOAD или Desk==dsk_EPLT); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_LOAD || Desk==dsk_EPLT)
/* Записывает GpioDataRegs.GPATOGGLE.bit.GPIO9 значением 1; else; аппаратная линия ввода/вывода GPIO9. */
GpioDataRegs.GPATOGGLE.bit.GPIO9=1; else
/* Проверяет if(Desk==dsk_BKSD) GpioDataRegs.GPBTOGGLE.bit.GPIO62=1;else; последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_BKSD) GpioDataRegs.GPBTOGGLE.bit.GPIO62=1;else
/* Записывает GpioDataRegs.GPBTOGGLE.bit.GPIO58 значением 1;}; аппаратная линия ввода/вывода GPIO58. */
GpioDataRegs.GPBTOGGLE.bit.GPIO58=1;}
// RES OUT 2 -----------------------------------------------------
/* Начинает функцию dat_RES_OUT_2; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void dat_RES_OUT_2(int x)
{ if(Desk==dsk_LOAD || Desk==dsk_EPLT)
/* Продолжает список аргументов, полей или выражение { if(Desk==dsk_LOAD || Desk==dsk_EPLT); порядок элементов сохраняется. */
{ if(Desk==dsk_LOAD || Desk==dsk_EPLT)
/* Записывает GpioDataRegs.GPADAT.bit.GPIO3 значением !x; else; аппаратная линия ввода/вывода GPIO3. */
GpioDataRegs.GPADAT.bit.GPIO3=!x; else
/* Записывает GpioDataRegs.GPBDAT.bit.GPIO61 значением x; }; аппаратная линия ввода/вывода GPIO61. */
GpioDataRegs.GPBDAT.bit.GPIO61=x; }
/* Начинает функцию set_RES_OUT_2; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void set_RES_OUT_2(void)
{ if(Desk==dsk_LOAD || Desk==dsk_EPLT)
/* Продолжает список аргументов, полей или выражение { if(Desk==dsk_LOAD || Desk==dsk_EPLT); порядок элементов сохраняется. */
{ if(Desk==dsk_LOAD || Desk==dsk_EPLT)
/* Записывает GpioDataRegs.GPACLEAR.bit.GPIO3 значением 1; else; аппаратная линия ввода/вывода GPIO3. */
GpioDataRegs.GPACLEAR.bit.GPIO3=1; else
/* Записывает GpioDataRegs.GPBCLEAR.bit.GPIO61 значением 1; }; аппаратная линия ввода/вывода GPIO61. */
GpioDataRegs.GPBCLEAR.bit.GPIO61=1; }
/* Начинает функцию clear_RES_OUT_2; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void clear_RES_OUT_2(void)
{ if(Desk==dsk_LOAD || Desk==dsk_EPLT)
/* Продолжает список аргументов, полей или выражение { if(Desk==dsk_LOAD || Desk==dsk_EPLT); порядок элементов сохраняется. */
{ if(Desk==dsk_LOAD || Desk==dsk_EPLT)
/* Записывает GpioDataRegs.GPASET.bit.GPIO3 значением 1; else; аппаратная линия ввода/вывода GPIO3. */
GpioDataRegs.GPASET.bit.GPIO3=1; else
/* Записывает GpioDataRegs.GPBSET.bit.GPIO61 значением 1; }; аппаратная линия ввода/вывода GPIO61. */
GpioDataRegs.GPBSET.bit.GPIO61=1; }
/* Начинает функцию toggle_RES_OUT_2; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void toggle_RES_OUT_2(void)
{ if(Desk==dsk_LOAD || Desk==dsk_EPLT)
/* Продолжает список аргументов, полей или выражение { if(Desk==dsk_LOAD || Desk==dsk_EPLT); порядок элементов сохраняется. */
{ if(Desk==dsk_LOAD || Desk==dsk_EPLT)
/* Записывает GpioDataRegs.GPATOGGLE.bit.GPIO3 значением 1; else; аппаратная линия ввода/вывода GPIO3. */
GpioDataRegs.GPATOGGLE.bit.GPIO3=1; else
/* Записывает GpioDataRegs.GPBTOGGLE.bit.GPIO61 значением 1;}; аппаратная линия ввода/вывода GPIO61. */
GpioDataRegs.GPBTOGGLE.bit.GPIO61=1;}
// START DPTB -----------------------------------------------------
/* Начинает функцию dat_START_DPTB; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void dat_START_DPTB(int x)
/* Записывает GpioDataRegs.GPBDAT.bit.GPIO62 значением x; }; аппаратная линия ввода/вывода GPIO62. */
{ GpioDataRegs.GPBDAT.bit.GPIO62=x; }
/* Начинает функцию set_START_DPTB; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void set_START_DPTB(void)
/* Записывает GpioDataRegs.GPBSET.bit.GPIO62 значением 1; }; аппаратная линия ввода/вывода GPIO62. */
{ GpioDataRegs.GPBSET.bit.GPIO62=1; }
/* Начинает функцию clear_START_DPTB; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void clear_START_DPTB(void)
/* Записывает GpioDataRegs.GPBCLEAR.bit.GPIO62 значением 1; }; аппаратная линия ввода/вывода GPIO62. */
{ GpioDataRegs.GPBCLEAR.bit.GPIO62=1; }
/* Начинает функцию toggle_START_DPTB; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void toggle_START_DPTB(void)
/* Записывает GpioDataRegs.GPBTOGGLE.bit.GPIO62 значением 1;}; аппаратная линия ввода/вывода GPIO62. */
{ GpioDataRegs.GPBTOGGLE.bit.GPIO62=1;}
// STOP DPTB -----------------------------------------------------
/* Начинает функцию dat_STOP_DPTB; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void dat_STOP_DPTB(int x)
/* Записывает GpioDataRegs.GPBDAT.bit.GPIO58 значением x; }; аппаратная линия ввода/вывода GPIO58. */
{ GpioDataRegs.GPBDAT.bit.GPIO58=x; }
/* Начинает функцию set_STOP_DPTB; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void set_STOP_DPTB(void)
/* Записывает GpioDataRegs.GPBSET.bit.GPIO58 значением 1; }; аппаратная линия ввода/вывода GPIO58. */
{ GpioDataRegs.GPBSET.bit.GPIO58=1; }
/* Начинает функцию clear_STOP_DPTB; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void clear_STOP_DPTB(void)
/* Записывает GpioDataRegs.GPBCLEAR.bit.GPIO58 значением 1; }; аппаратная линия ввода/вывода GPIO58. */
{ GpioDataRegs.GPBCLEAR.bit.GPIO58=1; }
/* Начинает функцию toggle_STOP_DPTB; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
static inline void toggle_STOP_DPTB(void)
/* Записывает GpioDataRegs.GPBTOGGLE.bit.GPIO58 значением 1;}; аппаратная линия ввода/вывода GPIO58. */
{ GpioDataRegs.GPBTOGGLE.bit.GPIO58=1;}
/* Продолжает список аргументов, полей или выражение extern LONGE DigErr;; порядок элементов сохраняется. */
extern LONGE DigErr;
/* Объявляет интерфейс функции select_tpl_canal; реализация вызывается через этот прототип. */
void select_tpl_canal(int n_tpl);
/* Объявляет интерфейс функции select_tpl_255; реализация вызывается через этот прототип. */
void select_tpl_255(void);
/* Определяет адрес и тип платы по аппаратным перемычкам и задаёт рабочий режим. */
void get_Mode(void);
/* Считывает кнопки, обновляет флаги команд и учитывает текущий тип платы. */
void get_Buttons(void);
+2
View File
@@ -1,3 +1,5 @@
/* Обмен и индикация пульта. Русские пояснения сохранены в UTF-8. */
//void what_is(void);
/* Обслуживает периодический обмен и индикацию пульта вместо измерительной платы. */
interrupt void cpu_timer1_isr_PULT(void);
+117 -55
View File
@@ -1,132 +1,194 @@
/* Драйвер SPI EEPROM, адресация, страницы и автомат завершения операций. Русские пояснения сохранены в UTF-8. */
/* Начинает условие: __SPISE2P_H__ ещё не определён; защищает повторное включение или задаёт значение сборки. */
#ifndef __SPISE2P_H__
#define __SPISE2P_H__
/* Определяет защитный символ или переключатель __SPISE2P_H__ для последующей компиляции. */
#define __SPISE2P_H__
/* Physical EEPROM layout shared with the linker and SETGUI. */
/* Подключает "eeprom_config.h": выбор профиля физически установленной EEPROM при сборке. */
#include "eeprom_config.h"
/* Подключает "include/balsam167_eeprom_layout.h": настройки и интерфейс balsam167_eeprom_layout. */
#include "include/balsam167_eeprom_layout.h"
// ¨ìêîñòü ïàìàòè â áàéòàõ
// Ёмкость памати в байтах
/* Preserve compact 16-bit arithmetic for the original 32-KiB build.
* Only the large part needs 32-bit word addresses and transfer lengths. */
/* Условие компиляции EEPROM_M95M02: выбранный блок включается в текущий вариант прошивки. */
#if EEPROM_M95M02
/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */
typedef unsigned long SE2P_SIZE;
/* Выбирает альтернативный блок текущего условия компиляции. */
#else
/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */
typedef unsigned int SE2P_SIZE;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Задаёт SEEPROM_LEN = BALSAM167_EEPROM_BYTES; данные SEEPROM_LEN. */
#define SEEPROM_LEN BALSAM167_EEPROM_BYTES
#define NULL 0
/* Задаёт NULL = 0; данные NULL. */
#define NULL 0
/* Задаёт SIXTEEN_BIT = 15; SIXTEEN бит. */
#define SIXTEEN_BIT 15
/* Задаёт EIGHT_BIT = 07; EIGHT бит. */
#define EIGHT_BIT 07
/***************************************************************/
/* Configurable Parameter for SPI bus Serial EEPROM */
/***************************************************************/
#define SPISE2P_DATA_WIDTH SIXTEEN_BIT//EIGHT_BIT
#define SPISE2P_ADDR_WIDTH SIXTEEN_BIT
#define SPIBAUD_REG_VAL 1//12
#define SPICLK_PHASE 1
#define SPICLK_POLARITY 0
/***************************************************************/
/* Configurable Parameter for SPI bus Serial EEPROM */
/***************************************************************/
/* Задаёт SPISE2P_DATA_WIDTH = SIXTEEN_BIT; 2 P данные WIDTH. */
#define SPISE2P_DATA_WIDTH SIXTEEN_BIT//EIGHT_BIT
/* Задаёт SPISE2P_ADDR_WIDTH = SIXTEEN_BIT; данные SPISE2P_ADDR_WIDTH. */
#define SPISE2P_ADDR_WIDTH SIXTEEN_BIT
/* Задаёт SPIBAUD_REG_VAL = 1; данные SPIBAUD_REG_VAL. */
#define SPIBAUD_REG_VAL 1//12
/* Задаёт SPICLK_PHASE = 1; SPICLK фаза. */
#define SPICLK_PHASE 1
/* Задаёт SPICLK_POLARITY = 0; данные SPICLK_POLARITY. */
#define SPICLK_POLARITY 0
/* Задаёт SPIBAUD_RATE = 100000; данные SPIBAUD_RATE. */
#define SPIBAUD_RATE 100000
//10000000
/**************************************************************/
/**************************************************************/
/* Serial EEPROM Command words, left justified */
/* Задаёт SPISE2P_READ_CMD = 0x0300; 2 P чтение CMD. */
#define SPISE2P_READ_CMD 0x0300
/* Задаёт SPISE2P_WRITE_CMD = 0x0200; 2 P запись CMD. */
#define SPISE2P_WRITE_CMD 0x0200
/* Задаёт SPISE2P_WRDI_CMD = 0x0400; данные SPISE2P_WRDI_CMD. */
#define SPISE2P_WRDI_CMD 0x0400
/* Задаёт SPISE2P_WREN_CMD = 0x0600; данные SPISE2P_WREN_CMD. */
#define SPISE2P_WREN_CMD 0x0600
/* Задаёт SPISE2P_RDSR_CMD = 0x0500; данные SPISE2P_RDSR_CMD. */
#define SPISE2P_RDSR_CMD 0x0500
/* Задаёт SPISE2P_WRSR_CMD = 0x0100; данные SPISE2P_WRSR_CMD. */
#define SPISE2P_WRSR_CMD 0x0100
/* Задаёт SPISE2P_RDID_CMD = 0x0A00; данные SPISE2P_RDID_CMD. */
#define SPISE2P_RDID_CMD 0x0A00
/* Задаёт SPISE2P_DUMMY_DATA = 0x0000; 2 P DUMMY данные. */
#define SPISE2P_DUMMY_DATA 0x0000
/* Задаёт SPISE2P_BUSY_MASK = 0x01; 2 P BUSY маска. */
#define SPISE2P_BUSY_MASK 0x01
/* Symbolic constant for SPICCR to transfer 8bit or 16 bit value*/
/* Задаёт SPISE2P_TFR16BIT = 0x80|(SPICLK_POLARITY<<6)|SIXTEEN_BIT; 2 P 16 бит. */
#define SPISE2P_TFR16BIT 0x80|(SPICLK_POLARITY<<6)|SIXTEEN_BIT
/* Задаёт SPISE2P_TFR8BIT = 0x80|(SPICLK_POLARITY<<6)|EIGHT_BIT; 2 P 8 бит. */
#define SPISE2P_TFR8BIT 0x80|(SPICLK_POLARITY<<6)|EIGHT_BIT
/* Status valus */
#define SPISE2P_WRRQ 1 /* Write Requset */
#define SPISE2P_RDRQ 2 /* Read request */
#define SPISE2P_WRIP 4 /* Write in progress */
#define SPISE2P_RDIP 8 /* Read in progress */
#define SPISE2P_WRRQ 1 /* Write Requset */ /* Задаёт SPISE2P_WRRQ = 1; данные SPISE2P_WRRQ. */
#define SPISE2P_RDRQ 2 /* Read request */ /* Задаёт SPISE2P_RDRQ = 2; данные SPISE2P_RDRQ. */
#define SPISE2P_WRIP 4 /* Write in progress */ /* Задаёт SPISE2P_WRIP = 4; данные SPISE2P_WRIP. */
#define SPISE2P_RDIP 8 /* Read in progress */ /* Задаёт SPISE2P_RDIP = 8; данные SPISE2P_RDIP. */
/* Message declaration */
typedef struct {
unsigned int *dataPtr; /* Data pointer */
unsigned long nrData; /* number of data */
unsigned long se2pAddr; /* se2pAddr */
}SE2P_DATA;
/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */
typedef struct {
unsigned int *dataPtr; /* Data pointer */ /* Объявляет dataPtr — данные Ptr. Хранит указатель на данные. */
unsigned long nrData; /* number of data */ /* Объявляет nrData — nr данные. */
unsigned long se2pAddr; /* se2pAddr */ /* Объявляет se2pAddr — данные se2pAddr. */
/* Продолжает список аргументов, полей или выражение }SE2P_DATA;; порядок элементов сохраняется. */
}SE2P_DATA;
/* Object declaration */
typedef struct {
/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */
typedef struct {
/* Main loop publishes the descriptor before setting csr; Timer2 consumes it.
* Both accesses are volatile so optimization cannot publish the request first. */
/* Продолжает список аргументов, полей или выражение SE2P_DATA * volatile msgPtr;; порядок элементов сохраняется. */
SE2P_DATA * volatile msgPtr;
volatile unsigned int csr; /* control/status register */
void (*init)(void *);
volatile unsigned int csr; /* control/status register */ /* Объявляет csr — данные csr. volatile требует фактического чтения или записи при каждом доступе. */
/* Вызывает void с аргументами (*init)(void *) в текущей последовательности операций. */
void (*init)(void *);
/* Вызывает void с аргументами (*tick)(void *) в текущей последовательности операций. */
void (*tick)(void *);
void (*csset)(void);
void (*csclr)(void);
}SPISE2P_DRV;
/* Вызывает void с аргументами (*csset)(void) в текущей последовательности операций. */
void (*csset)(void);
/* Вызывает void с аргументами (*csclr)(void) в текущей последовательности операций. */
void (*csclr)(void);
/* Продолжает список аргументов, полей или выражение }SPISE2P_DRV;; порядок элементов сохраняется. */
}SPISE2P_DRV;
/* Задаёт SPISE2P_DRV_DEFAULTS = { NULL,; данные SPISE2P_DRV_DEFAULTS. */
#define SPISE2P_DRV_DEFAULTS { NULL,\
0,\
(void (*)(void *))SPISE2P_DRV_init,\
(void (*)(void *))SPISE2P_DRV_tick,\
(void (*)(void))SPISE2P_DRV_csset,\
(void (*)(void))SPISE2P_DRV_csclr}
0,/* Элемент постоянной таблицы 0,; порядок значений совпадает с порядком индексов потребителя. */ \
(void (*)(void *))SPISE2P_DRV_init,/* Продолжает список аргументов, полей или выражение (void (*)(void *))SPISE2P_DRV_init,; порядок элементов сохраняется. */ \
(void (*)(void *))SPISE2P_DRV_tick,/* Продолжает список аргументов, полей или выражение (void (*)(void *))SPISE2P_DRV_tick,; порядок элементов сохраняется. */ \
(void (*)(void))SPISE2P_DRV_csset,/* Продолжает список аргументов, полей или выражение (void (*)(void))SPISE2P_DRV_csset,; порядок элементов сохраняется. */ \
(void (*)(void))SPISE2P_DRV_csclr} /* Продолжает список аргументов, полей или выражение (void (*)(void))SPISE2P_DRV_csclr}; порядок элементов сохраняется. */
/* Начинает объявление типа, используемого структурами и интерфейсами этого модуля. */
typedef SPISE2P_DRV *SPISE2P_DRV_handle;
void SPISE2P_DRV_init(SPISE2P_DRV * );
/* Объявляет интерфейс функции SPISE2P_DRV_init; реализация вызывается через этот прототип. */
void SPISE2P_DRV_init(SPISE2P_DRV * );
/* Продвигает неблокирующий автомат SPI EEPROM: команда, адрес, данные и ожидание завершения записи. */
void SPISE2P_DRV_tick(SPISE2P_DRV *);
void SPISE2P_DRV_csset(void);
/* Объявляет интерфейс функции SPISE2P_DRV_csset; реализация вызывается через этот прототип. */
void SPISE2P_DRV_csset(void);
/* Объявляет интерфейс функции SPISE2P_DRV_csclr; реализация вызывается через этот прототип. */
void SPISE2P_DRV_csclr(void);
/* Проверяет завершение текущего задания SPI EEPROM перед постановкой следующего. */
unsigned int spiSe2pFree(SPISE2P_DRV *se2p);
/* Ставит задание записи в SPI-драйвер с учётом состояния занятости EEPROM. */
void spiSe2pWrite(SPISE2P_DRV *se2p, SE2P_DATA *data);
/* Ставит задание чтения в SPI-драйвер с указателем буфера, длиной и физическим адресом. */
void spiSe2pRead(SPISE2P_DRV *se2p, SE2P_DATA *data);
/* Условие компиляции (SPISE2P_DATA_WIDTH==SIXTEEN_BIT): выбранный блок включается в текущий вариант прошивки. */
#if(SPISE2P_DATA_WIDTH==SIXTEEN_BIT)
/* Задаёт PROM_LEN = BALSAM167_EEPROM_WORDS; данные PROM_LEN. */
#define PROM_LEN BALSAM167_EEPROM_WORDS
/* Задаёт PAGE_LEN = (BALSAM167_EEPROM_PAGE_BYTES / 2); данные PAGE_LEN. */
#define PAGE_LEN (BALSAM167_EEPROM_PAGE_BYTES / 2)
/* Задаёт WORD_LEN = 2; слово LEN. */
#define WORD_LEN 2
/* Выбирает альтернативный блок текущего условия компиляции. */
#else
/* Задаёт PROM_LEN = BALSAM167_EEPROM_BYTES; данные PROM_LEN. */
#define PROM_LEN BALSAM167_EEPROM_BYTES
/* Задаёт PAGE_LEN = BALSAM167_EEPROM_PAGE_BYTES; данные PAGE_LEN. */
#define PAGE_LEN BALSAM167_EEPROM_PAGE_BYTES
/* Задаёт WORD_LEN = 1; слово LEN. */
#define WORD_LEN 1
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Óñòàíîâêà äðàéâåðà ñåðèàëüíîé EEPROM. **
** Èíèöèàëèçàöèà SPI è ïðî÷. Òàêæå íàñòðîéêà òàéìåðà. **
** Äðàéâåð ðàáîòàåò íà ïðåðûâàíèàõ îò òàéìåðà 2! */
/* Установка драйвера сериальной EEPROM. **
** Инициализациа SPI и проч. Также настройка таймера. **
** Драйвер работает на прерываниах от таймера 2! */
/* Объявляет интерфейс функции InitSeeprom; реализация вызывается через этот прототип. */
void InitSeeprom(void);
/* Çàïèñü áëîêà â SEEPROM. Ïàðàìåòðû òàêîâû: **
** adres - àäðåñ â åïðîìêå, êóäà ïèñàòü. **
** adres = 0..0x8000, åñëè äëèíà ñëîâà 8 áèò **
** adres = 0..0x4000, åñëè äëèíà ñëîâà 16 áèò **
** buf - óêàçàòåëü íà ïàìàòü, îòêóäà ïèñàòü. **
** size - äëèíà áëîêà â áàéòàõ. Ïî-ëþáîìó â áàéòàõ! */
/* Запись блока в SEEPROM. Параметры таковы: **
** adres - адрес в епромке, куда писать. **
** adres = 0..0x8000, если длина слова 8 бит **
** adres = 0..0x4000, если длина слова 16 бит **
** buf - указатель на памать, откуда писать. **
** size - длина блока в байтах. По-любому в байтах! */
/* Пишет EEPROM с разделением по физическим страницам; область параметров не пересекает образ прошивки. */
void Seeprom_write(SE2P_SIZE adres, unsigned int buf[], SE2P_SIZE size);
/* ×òåíèå áëîêà èç SEEPROM. Ïàðàìåòðû òàêîâû: **
** adres - àäðåñ â åïðîìêå, îòêóäà ÷èòàòü. **
** adres = 0..0x8000, åñëè äëèíà ñëîâà 8 áèò **
** adres = 0..0x4000, åñëè äëèíà ñëîâà 16 áèò **
** buf - óêàçàòåëü íà ïàìàòü, êóäà ÷èòàòü. **
** size - äëèíà áëîêà â áàéòàõ. Ïî-ëþáîìó â áàéòàõ! */
/* Чтение блока из SEEPROM. Параметры таковы: **
** adres - адрес в епромке, откуда читать. **
** adres = 0..0x8000, если длина слова 8 бит **
** adres = 0..0x4000, если длина слова 16 бит **
** buf - указатель на памать, куда читать. **
** size - длина блока в байтах. По-любому в байтах! */
/* Читает EEPROM порциями; адрес задаётся словами C28x, размер переводится в число передаваемых слов. */
void Seeprom_read(SE2P_SIZE adres, unsigned int buf[], SE2P_SIZE size);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
+6
View File
@@ -1,7 +1,13 @@
/* Настройка внешней памяти и служебные задержки. Русские пояснения сохранены в UTF-8. */
/* Начинает условие: TOOLS_H ещё не определён; защищает повторное включение или задаёт значение сборки. */
#ifndef TOOLS_H
/* Определяет защитный символ или переключатель TOOLS_H для последующей компиляции. */
#define TOOLS_H
/* Настраивает временные параметры внешней шины XINTF Zone7 для RAM регистратора. */
void init_zone7(void);
/* Формирует задержку в микросекундах через калиброванную функцию DSP28x_usDelay. */
void pause_us(unsigned long t);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif //TOOLS_H
@@ -1,9 +1,18 @@
/* Настройки и интерфейс ump_can_protocol. Русские пояснения сохранены в UTF-8. */
/* Shared logger protocol; application owns IRQ protection and CAN scheduling. */
/* Начинает условие: UMP_CAN_PROTOCOL_H ещё не определён; защищает повторное включение или задаёт значение сборки. */
#ifndef UMP_CAN_PROTOCOL_H
/* Определяет защитный символ или переключатель UMP_CAN_PROTOCOL_H для последующей компиляции. */
#define UMP_CAN_PROTOCOL_H
/* Подключает "log_to_mem.h": двухбанковый регистратор событий нагрузки во внешней RAM. */
#include "log_to_mem.h"
/* Подключает "ump_tms28335.h": настройки и интерфейс ump_tms28335. */
#include "ump_tms28335.h"
/* Задаёт UMP_CAN_MARKER = UMP_MARKER; UMP CAN MARKER. */
#define UMP_CAN_MARKER UMP_MARKER
/* Задаёт UMP_CAN_MAX_WORDS = UMP_MAX_WORDS; UMP CAN MAX слова. */
#define UMP_CAN_MAX_WORDS UMP_MAX_WORDS
/* Задаёт ump_can_prepare = ump_tms28335_prepare; ump CAN prepare. */
#define ump_can_prepare ump_tms28335_prepare
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
+668 -166
View File
@@ -1,554 +1,929 @@
/* Приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. Русские пояснения сохранены в UTF-8. */
//#include "big_dsp_module.h"
/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */
#include "DSP2833x_Device.h"
/* Подключает "DSP2833x_SWPrioritizedIsrLevels.h": поставляемое TI описание SWPrioritizedIsrLevels для семейства C2833x. */
#include "DSP2833x_SWPrioritizedIsrLevels.h"
/* Подключает "RS485.h": приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
#include "RS485.h"
/* Подключает "bios_dsp.h": коды и объявления команд последовательного загрузчика. */
#include "bios_dsp.h"
/* Подключает "cntrl_adr.h": собственный и универсальный адрес устройства. */
#include "cntrl_adr.h"
/* Подключает "tools.h": настройка внешней памяти и служебные задержки. */
#include "tools.h"
//#include "flash_tools.h"
/* Объявляет rs_a — данные rs_a; rs_b — данные rs_b. */
RS_DATA rs_a,rs_b;
/* Объявляет RS_Len — таблица ожидаемых длин команд последовательного протокола. Начальное значение задаётся справа от знака равенства. */
unsigned int RS_Len[70]={0};
static char size_cmd15=1;
/* Объявляет size_cmd15 — размер cmd 15. Начальное значение задаётся справа от знака равенства. */
static char size_cmd15=1;
/* Разбирает приём SCI; для COM_1 читает FIFO и проверяет ошибки, для COM_2 сохраняет штатный обмен RS485. */
void RS_RX_Handler(RS_DATA *rs_arr);
/* Продвигает передачу текущего пакета SCI по состоянию UART и счётчику оставшихся данных. */
void RS_TX_Handler(RS_DATA *rs_arr);
/* Условие компиляции RS232_USE_FIFO: выбранный блок включается в текущий вариант прошивки. */
#if RS232_USE_FIFO
/* Запускает передачу через FIFO COM_1 после проверки буфера и состояния текущего обмена. */
static int RS_FifoStart(RS_DATA *, unsigned int *, unsigned long, int);
/* Заполняет TX FIFO доступными байтами, сохраняя длину и положение в передаваемом пакете. */
static void RS_FifoTx(RS_DATA *);
/* Прерывает ошибочный приём FIFO, очищает аппаратное состояние и включает защитную паузу. */
static void RS_FifoAbort(RS_DATA *);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/** Îáðàáîò÷èê ïðåðûâàíèé UART - ïðèíàòî */
/** Обработчик прерываний UART - принато */
/* Объявляет обработчик RSA_RX_Handler; обслуживает источник прерывания и его аппаратные флаги. */
interrupt void RSA_RX_Handler(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// Set interrupt priority:
/* Объявляет TempPIEIER — сохранённая маска разрешённых прерываний группы PIE. volatile требует фактического чтения или записи при каждом доступе. Начальное значение задаётся справа от знака равенства. */
volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER9.all;
/* Устанавливает биты IER значением M_INT9; регистр разрешения прерываний ядра C28x. */
IER |= M_INT9;
/* Оставляет биты маски IER значением MINT9; регистр разрешения прерываний ядра C28x. */
IER &= MINT9; // Set "global" priority
PieCtrlRegs.PIEIER9.all &= MG91; // Set "group" priority
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
/* Оставляет биты маски PieCtrlRegs.PIEIER9.all значением MG91; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEIER9.all &= MG91; // Set "group" priority
/* Записывает PieCtrlRegs.PIEACK.all значением 0xFFFF; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
/* Разрешение маскируемых прерываний ядра. */
EINT;
/* Сбрасывает аппаратный сигнал через clear_timer_rs_live(&rs_a);. */
clear_timer_rs_live(&rs_a);
/* Вызывает RS_RX_Handler. Разбирает приём SCI; для COM_1 читает FIFO и проверяет ошибки, для COM_2 сохраняет штатный обмен RS485. */
RS_RX_Handler(&rs_a);
// Restore registers saved:
/* Запрет маскируемых прерываний ядра. */
DINT;
/* Записывает PieCtrlRegs.PIEIER9.all значением TempPIEIER; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEIER9.all = TempPIEIER;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Объявляет обработчик RSB_RX_Handler; обслуживает источник прерывания и его аппаратные флаги. */
interrupt void RSB_RX_Handler(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// Set interrupt priority:
/* Объявляет TempPIEIER — сохранённая маска разрешённых прерываний группы PIE. volatile требует фактического чтения или записи при каждом доступе. Начальное значение задаётся справа от знака равенства. */
volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER9.all;
/* Устанавливает биты IER значением M_INT9; регистр разрешения прерываний ядра C28x. */
IER |= M_INT9;
/* Оставляет биты маски IER значением MINT9; регистр разрешения прерываний ядра C28x. */
IER &= MINT9; // Set "global" priority
PieCtrlRegs.PIEIER9.all &= MG93; // Set "group" priority
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
/* Оставляет биты маски PieCtrlRegs.PIEIER9.all значением MG93; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEIER9.all &= MG93; // Set "group" priority
/* Записывает PieCtrlRegs.PIEACK.all значением 0xFFFF; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
/* Разрешение маскируемых прерываний ядра. */
EINT;
/* Сбрасывает аппаратный сигнал через clear_timer_rs_live(&rs_b);. */
clear_timer_rs_live(&rs_b);
/* Вызывает RS_RX_Handler. Разбирает приём SCI; для COM_1 читает FIFO и проверяет ошибки, для COM_2 сохраняет штатный обмен RS485. */
RS_RX_Handler(&rs_b);
// Restore registers saved:
/* Запрет маскируемых прерываний ядра. */
DINT;
/* Записывает PieCtrlRegs.PIEIER9.all значением TempPIEIER; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEIER9.all = TempPIEIER;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Объявляет обработчик RSA_TX_Handler; обслуживает источник прерывания и его аппаратные флаги. */
interrupt void RSA_TX_Handler(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// Set interrupt priority:
/* Объявляет TempPIEIER — сохранённая маска разрешённых прерываний группы PIE. volatile требует фактического чтения или записи при каждом доступе. Начальное значение задаётся справа от знака равенства. */
volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER9.all;
/* Устанавливает биты IER значением M_INT9; регистр разрешения прерываний ядра C28x. */
IER |= M_INT9;
/* Оставляет биты маски IER значением MINT9; регистр разрешения прерываний ядра C28x. */
IER &= MINT9; // Set "global" priority
PieCtrlRegs.PIEIER9.all &= MG92; // Set "group" priority
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
/* Оставляет биты маски PieCtrlRegs.PIEIER9.all значением MG92; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEIER9.all &= MG92; // Set "group" priority
/* Записывает PieCtrlRegs.PIEACK.all значением 0xFFFF; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
/* Разрешение маскируемых прерываний ядра. */
EINT;
/* Сбрасывает аппаратный сигнал через clear_timer_rs_live(&rs_a);. */
clear_timer_rs_live(&rs_a);
/* Вызывает RS_TX_Handler. Продвигает передачу текущего пакета SCI по состоянию UART и счётчику оставшихся данных. */
RS_TX_Handler(&rs_a);
// Restore registers saved:
/* Запрет маскируемых прерываний ядра. */
DINT;
/* Записывает PieCtrlRegs.PIEIER9.all значением TempPIEIER; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEIER9.all = TempPIEIER;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Объявляет обработчик RSB_TX_Handler; обслуживает источник прерывания и его аппаратные флаги. */
interrupt void RSB_TX_Handler(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// Set interrupt priority:
/* Объявляет TempPIEIER — сохранённая маска разрешённых прерываний группы PIE. volatile требует фактического чтения или записи при каждом доступе. Начальное значение задаётся справа от знака равенства. */
volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER9.all;
/* Устанавливает биты IER значением M_INT9; регистр разрешения прерываний ядра C28x. */
IER |= M_INT9;
/* Оставляет биты маски IER значением MINT9; регистр разрешения прерываний ядра C28x. */
IER &= MINT9; // Set "global" priority
PieCtrlRegs.PIEIER9.all &= MG94; // Set "group" priority
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
/* Оставляет биты маски PieCtrlRegs.PIEIER9.all значением MG94; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEIER9.all &= MG94; // Set "group" priority
/* Записывает PieCtrlRegs.PIEACK.all значением 0xFFFF; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
/* Разрешение маскируемых прерываний ядра. */
EINT;
/* Сбрасывает аппаратный сигнал через clear_timer_rs_live(&rs_b);. */
clear_timer_rs_live(&rs_b);
/* Вызывает RS_TX_Handler. Продвигает передачу текущего пакета SCI по состоянию UART и счётчику оставшихся данных. */
RS_TX_Handler(&rs_b);
// Restore registers saved:
/* Запрет маскируемых прерываний ядра. */
DINT;
/* Записывает PieCtrlRegs.PIEIER9.all значением TempPIEIER; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEIER9.all = TempPIEIER;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Îáðàáîò÷èê ïðåðûâàíèé UART - ïðèíàòî */
/** Обработчик прерываний UART - принато */
/* Разбирает приём SCI; для COM_1 читает FIFO и проверяет ошибки, для COM_2 сохраняет штатный обмен RS485. */
void RS_RX_Handler(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет Rc — данные Rc. */
char Rc;
/* Объявляет RS_BytePtr — данные RS_BytePtr. */
char RS_BytePtr;
// led1_on();
for(;;) // 'goto' ýòî íå îïåðàòîð àçûêà Ñ
{
/* Цикл for(;;); задаёт начальное значение, условие продолжения и шаг перебора. */
for(;;) // 'goto' это не оператор азыка С
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Условие компиляции RS232_USE_FIFO: выбранный блок включается в текущий вариант прошивки. */
#if RS232_USE_FIFO
/* Проверяет if (rs_arr->commnumber == COM_1); последующий оператор выполняется только при истинном условии. */
if (rs_arr->commnumber == COM_1) {
/* Объявляет received — данные received. */
unsigned int received;
/* Проверяет if (rs_arr->SciRegs->SCIFFRX.bit.RXFFOVF или rs_arr->SciRegs->SCIRXST.bit.RXERROR); последующий оператор выполняется только при истинном условии. */
if (rs_arr->SciRegs->SCIFFRX.bit.RXFFOVF || rs_arr->SciRegs->SCIRXST.bit.RXERROR) {
/* Вызывает RS_FifoAbort. Прерывает ошибочный приём FIFO, очищает аппаратное состояние и включает защитную паузу. */
RS_FifoAbort(rs_arr); return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if (!rs_arr->SciRegs->SCIFFRX.bit.RXFFST); последующий оператор выполняется только при истинном условии. */
if (!rs_arr->SciRegs->SCIFFRX.bit.RXFFST) {
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFFINTCLR значением 1; данные RXFFINTCLR. */
rs_arr->SciRegs->SCIFFRX.bit.RXFFINTCLR=1;
/* Устанавливает биты PieCtrlRegs.PIEACK.bit.ACK9 значением 1; данные ACK9. */
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
/* Завершает RS_RX_Handler без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
received=rs_arr->SciRegs->SCIRXBUF.all; /* one pop, data + FE/PE */
received=rs_arr->SciRegs->SCIRXBUF.all; /* one pop, data + FE/PE */ /* Записывает received значением rs_arr->SciRegs->SCIRXBUF.all; данные received. */
/* Проверяет if (received & 0xC000U); последующий оператор выполняется только при истинном условии. */
if (received & 0xC000U) { RS_FifoAbort(rs_arr); return; }
/* Проверяет if (rs_arr->fifo_rx_guard); последующий оператор выполняется только при истинном условии. */
if (rs_arr->fifo_rx_guard) { rs_arr->fifo_rx_guard=4; continue; }
/* Записывает Rc значением received & 255U; данные Rc. */
Rc=received & 255U;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
} else
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(!rs_arr->SciRegs->SCIRXST.bit.RXRDY); последующий оператор выполняется только при истинном условии. */
if(!rs_arr->SciRegs->SCIRXST.bit.RXRDY) // Receiver ready flag
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Устанавливает биты PieCtrlRegs.PIEACK.bit.ACK9 значением 1; данные ACK9. */
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFFINTCLR значением 1; данные RXFFINTCLR. */
rs_arr->SciRegs->SCIFFRX.bit.RXFFINTCLR=1; // Clear INT flag
return; // êñòàòè ýòî åäèíñòâåííûé âûõîä èç ïðåðûâàíèà
/* Завершает RS_RX_Handler без возвращаемого значения. */
return; // кстати это единственный выход из прерываниа
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
Rc = rs_arr->SciRegs->SCIRXBUF.bit.RXDT; // ×èòàåì ñèìâîë â ëþáîì ñëó÷àå
/* Записывает Rc значением rs_arr->SciRegs->SCIRXBUF.bit.RXDT; данные Rc. */
Rc = rs_arr->SciRegs->SCIRXBUF.bit.RXDT; // Читаем символ в любом случае
/* Проверяет if(rs_arr->SciRegs->SCIRXST.bit.RXERROR); последующий оператор выполняется только при истинном условии. */
if(rs_arr->SciRegs->SCIRXST.bit.RXERROR) // Receiver error flag
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_arr->SciRegs->SCICTL1.bit.SWRESET значением 0; данные SWRESET. */
rs_arr->SciRegs->SCICTL1.bit.SWRESET=0; // Reset SCI
/* Записывает rs_arr->SciRegs->SCICTL1.bit.SWRESET значением 1; данные SWRESET. */
rs_arr->SciRegs->SCICTL1.bit.SWRESET=1; // Relinquish SCI from Reset
/* Переходит к следующей итерации ближайшего цикла. */
continue;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
if(rs_arr->RS_DataReady) continue; // Íå çàáðàëè äàííûå
/* Проверяет if(rs_arr->RS_DataReady) continue; последующий оператор выполняется только при истинном условии. */
if(rs_arr->RS_DataReady) continue; // Не забрали данные
if (rs_arr->RS_Flag9bit==1) // äëà RS485????????
/* Проверяет if (rs_arr->RS_Flag9bit==1); последующий оператор выполняется только при истинном условии. */
if (rs_arr->RS_Flag9bit==1) // дла RS485????????
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// Èíèöèàëèçèðóåì ïåðåìåííûå è ôëàãè
rs_arr->RS_FlagBegin = true; // Æäåì çàãîëîâîê
// Инициализируем переменные и флаги
/* Записывает rs_arr->RS_FlagBegin значением true; rs arr RS флаг Begin. */
rs_arr->RS_FlagBegin = true; // Ждем заголовок
/* Записывает rs_arr->RS_RecvLen значением 0; данные rs_arr->RS_RecvLen. */
rs_arr->RS_RecvLen = 0;
/* Записывает rs_arr->RS_FlagSkiping значением false; rs arr RS флаг Skiping. */
rs_arr->RS_FlagSkiping = false;
/* Записывает rs_arr->RS_HeaderCnt значением 0; данные rs_arr->RS_HeaderCnt. */
rs_arr->RS_HeaderCnt = 0;
rs_arr->RS_Cmd = 0;
/* Записывает rs_arr->RS_Cmd значением 0; данные rs_arr->RS_Cmd. */
rs_arr->RS_Cmd = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
if(rs_arr->RS_FlagSkiping) continue; // Íå íàì
if (rs_arr->RS_FlagBegin) // Çàãîëîâîê
/* Проверяет if(rs_arr->RS_FlagSkiping) continue; последующий оператор выполняется только при истинном условии. */
if(rs_arr->RS_FlagSkiping) continue; // Не нам
/* Проверяет if (rs_arr->RS_FlagBegin); последующий оператор выполняется только при истинном условии. */
if (rs_arr->RS_FlagBegin) // Заголовок
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
if (rs_arr->RS_HeaderCnt==0) // Àäðåñ êîíòðîëëåðà èëè ñòàíäàðòíàà êîìàíäà
{
if( (Rc == CNTRL_ADDR_UNIVERSAL) || (Rc == CNTRL_ADDR && CNTRL_ADDR!=0) || ((Rc == rs_arr->addr_answer) && rs_arr->flag_LEADING)
/* Проверяет if (rs_arr->RS_HeaderCnt==0); последующий оператор выполняется только при истинном условии. */
if (rs_arr->RS_HeaderCnt==0) // Адрес контроллера или стандартнаа команда
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if( (Rc == CNTRL_ADDR_UNIVERSAL) или (Rc == CNTRL_ADDR и CNTRL_ADDR!=0) или ((Rc == rs_arr->addr_answer) и rs_arr->flag_LEADING); последующий оператор выполняется только при истинном условии. */
if( (Rc == CNTRL_ADDR_UNIVERSAL) || (Rc == CNTRL_ADDR && CNTRL_ADDR!=0) || ((Rc == rs_arr->addr_answer) && rs_arr->flag_LEADING)
/* Продолжает список аргументов, полей или выражение || ((Rc == ADDR_FOR_ALL && ADDR_FOR_ALL!=0) && !rs_arr->flag_LEADING)); порядок элементов сохраняется. */
|| ((Rc == ADDR_FOR_ALL && ADDR_FOR_ALL!=0) && !rs_arr->flag_LEADING))
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
rs_arr->addr_recive=Rc; // çàïîìíèëè àäðåñ ïî êîòîðîìó íàñ çàïðîñèëè
rs_arr->RS_Header[rs_arr->RS_HeaderCnt++] = Rc; // Ïåðâûé áàéò
RS_SetBitMode(rs_arr,8); // ïåðåñòðîèëèñü â 8-áèò ðåæèì
/* Записывает rs_arr->addr_recive значением Rc; данные rs_arr->addr_recive. */
rs_arr->addr_recive=Rc; // запомнили адрес по которому нас запросили
/* Записывает rs_arr->RS_Header[rs_arr->RS_HeaderCnt++] значением Rc; данные rs_arr->RS_Header. */
rs_arr->RS_Header[rs_arr->RS_HeaderCnt++] = Rc; // Первый байт
/* Вызывает RS_SetBitMode с аргументами (rs_arr,8) в текущей последовательности операций. */
RS_SetBitMode(rs_arr,8); // перестроились в 8-бит режим
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
else
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
rs_arr->RS_FlagSkiping = true; // Íå íàøåìó êîíòðîëëåðó
rs_arr->RS_FlagBegin = false; // îñòàëèñü â 9-áèò ðåæèìå
/* Записывает rs_arr->RS_FlagSkiping значением true; rs arr RS флаг Skiping. */
rs_arr->RS_FlagSkiping = true; // Не нашему контроллеру
/* Записывает rs_arr->RS_FlagBegin значением false; rs arr RS флаг Begin. */
rs_arr->RS_FlagBegin = false; // остались в 9-бит режиме
// led1_off();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
else
{
rs_arr->RS_Header[rs_arr->RS_HeaderCnt++] = Rc; // Âòîðîé áàéò è ò.ä.
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_arr->RS_Header[rs_arr->RS_HeaderCnt++] значением Rc; данные rs_arr->RS_Header. */
rs_arr->RS_Header[rs_arr->RS_HeaderCnt++] = Rc; // Второй байт и т.д.
/* Проверяет if (rs_arr->RS_HeaderCnt == 7 и rs_arr->RS_Cmd==CMD_MODBUS_16 и !rs_arr->flag_LEADING); последующий оператор выполняется только при истинном условии. */
if (rs_arr->RS_HeaderCnt == 7 && rs_arr->RS_Cmd==CMD_MODBUS_16 && !rs_arr->flag_LEADING)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает RS_Len[CMD_MODBUS_16] значением (10+Rc); таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_MODBUS_16] = (10+Rc);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if (rs_arr->RS_HeaderCnt == 3); последующий оператор выполняется только при истинном условии. */
if (rs_arr->RS_HeaderCnt == 3)
/* Проверяет if (rs_arr->RS_Cmd == ANS_MODBUS_4); последующий оператор выполняется только при истинном условии. */
if (rs_arr->RS_Cmd == ANS_MODBUS_4)
{
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает RS_Len[rs_arr->RS_Cmd] значением Rc + 5; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[rs_arr->RS_Cmd] = Rc + 5;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
// åñëè âòîðîé áàéò - ýòî êîìàíäà
// если второй байт - это команда
/* Проверяет if (rs_arr->RS_HeaderCnt == 2); последующий оператор выполняется только при истинном условии. */
if (rs_arr->RS_HeaderCnt == 2)
{
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_arr->RS_Cmd значением Rc; данные rs_arr->RS_Cmd. */
rs_arr->RS_Cmd = Rc;
// Ïðîâåðêà äëèíû ïîñûëêè
// CMD_LOAD - ìëàäøàà íà äàííûé ìîìåíò
// CMD_STD_ANS - ñòàðøàà íà äàííûé ìîìåíò
// Проверка длины посылки
// CMD_LOAD - младшаа на данный момент
// CMD_STD_ANS - старшаа на данный момент
/* Проверяет if ((rs_arr->RS_Cmd < CMD_MODBUS_3) или (rs_arr->RS_Cmd > CMD_STD_ANS) или (RS_Len[rs_arr->RS_Cmd]<3); последующий оператор выполняется только при истинном условии. */
if ((rs_arr->RS_Cmd < CMD_MODBUS_3) || (rs_arr->RS_Cmd > CMD_STD_ANS) || (RS_Len[rs_arr->RS_Cmd]<3)
/* Продолжает список аргументов, полей или выражение || ((rs_arr->RS_Cmd == CMD_LOAD)&&(rs_arr->RS_PrevCmd != CMD_INITLOAD)); порядок элементов сохраняется. */
|| ((rs_arr->RS_Cmd == CMD_LOAD)&&(rs_arr->RS_PrevCmd != CMD_INITLOAD))
/* Продолжает список аргументов, полей или выражение ); порядок элементов сохраняется. */
)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
RS_SetBitMode(rs_arr,9); // Ïîëó÷èëè âñå ïåðåñòðîèëèñü â 9-áèò äëà RS485?
rs_arr->RS_HeaderCnt = 0; // Ïîòîìó ÷òî êîìàíäà íå òà
/* Вызывает RS_SetBitMode с аргументами (rs_arr,9) в текущей последовательности операций. */
RS_SetBitMode(rs_arr,9); // Получили все перестроились в 9-бит дла RS485?
/* Записывает rs_arr->RS_HeaderCnt значением 0; данные rs_arr->RS_HeaderCnt. */
rs_arr->RS_HeaderCnt = 0; // Потому что команда не та
/* Записывает rs_arr->RS_FlagBegin значением true; rs arr RS флаг Begin. */
rs_arr->RS_FlagBegin = true;
/* Записывает rs_arr->RS_FlagSkiping значением false; rs arr RS флаг Skiping. */
rs_arr->RS_FlagSkiping = false;
rs_arr->RS_Cmd=0;
/* Записывает rs_arr->RS_Cmd значением 0; данные rs_arr->RS_Cmd. */
rs_arr->RS_Cmd=0;
// led1_off();
continue;
/* Переходит к следующей итерации ближайшего цикла. */
continue;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
if (rs_arr->RS_Cmd == CMD_LOAD) // Äëà ýòîé êîìàíäû çàãîëîâîê î÷åíü êîðîòêèé
rs_arr->RS_FlagBegin = false;// äàëüøå èäóò äàííûå
/* Проверяет if (rs_arr->RS_Cmd == CMD_LOAD); последующий оператор выполняется только при истинном условии. */
if (rs_arr->RS_Cmd == CMD_LOAD) // Дла этой команды заголовок очень короткий
/* Записывает rs_arr->RS_FlagBegin значением false; rs arr RS флаг Begin. */
rs_arr->RS_FlagBegin = false;// дальше идут данные
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if( (rs_arr->RS_HeaderCnt >= RS_Len[rs_arr->RS_Cmd]) или; последующий оператор выполняется только при истинном условии. */
if( (rs_arr->RS_HeaderCnt >= RS_Len[rs_arr->RS_Cmd]) ||
/* Продолжает список аргументов, полей или выражение (rs_arr->RS_HeaderCnt >= sizeof(rs_arr->RS_Header))); порядок элементов сохраняется. */
(rs_arr->RS_HeaderCnt >= sizeof(rs_arr->RS_Header)))
{ // Ïîëó÷èëè çàãîëîâîê
RS_SetBitMode(rs_arr,9); // Ïîëó÷èëè âñå ïåðåñòðîèëèñü â 9-áèò äëà RS485?
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{ // Получили заголовок
/* Вызывает RS_SetBitMode с аргументами (rs_arr,9) в текущей последовательности операций. */
RS_SetBitMode(rs_arr,9); // Получили все перестроились в 9-бит дла RS485?
/* Записывает rs_arr->RS_FlagBegin значением false; rs arr RS флаг Begin. */
rs_arr->RS_FlagBegin = false;
/* Записывает rs_arr->RS_FlagSkiping значением true; rs arr RS флаг Skiping. */
rs_arr->RS_FlagSkiping = true;
/* Записывает rs_arr->RS_DataReady значением true; rs arr RS данные Ready. */
rs_arr->RS_DataReady = true;
/* Записывает rs_arr->RS_Cmd значением 0; данные rs_arr->RS_Cmd. */
rs_arr->RS_Cmd=0;
// led1_off();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} } }
else // Ïîòîê äàííûõ
{
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else // Поток данных
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(rs_arr->pRS_RecvPtr<(unsigned int *)Rec_Bloc_Begin или rs_arr->pRS_RecvPtr>(unsigned int *)Rec_Bloc_End); последующий оператор выполняется только при истинном условии. */
if(rs_arr->pRS_RecvPtr<(unsigned int *)Rec_Bloc_Begin || rs_arr->pRS_RecvPtr>(unsigned int *)Rec_Bloc_End)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
rs_arr->pRS_RecvPtr = (unsigned int *)Rec_Bloc_Begin; // Íà ïðîãðàììó íàäåéñà, à ñàì íå ïëîøàé
rs_arr->pRecvPtr = (unsigned int *)Rec_Bloc_Begin; // Íà ïðîãðàììó íàäåéñà, à ñàì íå ïëîøàé
}
if(rs_arr->RS_PrevCmd != CMD_INITLOAD) continue; // Ìû çäåñü îêàçàëèñü ïî êàêîé-òî ÷óäîâèùíîé îøèáêå
if(rs_arr->RS_DataReady) // Åñëè äàííûå â îñíîâíîì öèêëå íå çàáðàíû,
{ // òî ïðîïóñêàåì ñëåäóþùóþ ïîñûëêó
rs_arr->RS_FlagSkiping = true; // Èãíîðèðóåì äî ñëåäóþùåãî çàãîëîâêà
// led1_off();
continue;
/* Записывает rs_arr->pRS_RecvPtr значением (unsigned int *)Rec_Bloc_Begin; данные rs_arr->pRS_RecvPtr. */
rs_arr->pRS_RecvPtr = (unsigned int *)Rec_Bloc_Begin; // На программу надейса, а сам не плошай
/* Записывает rs_arr->pRecvPtr значением (unsigned int *)Rec_Bloc_Begin; данные rs_arr->pRecvPtr. */
rs_arr->pRecvPtr = (unsigned int *)Rec_Bloc_Begin; // На программу надейса, а сам не плошай
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(rs_arr->RS_PrevCmd != CMD_INITLOAD) continue; последующий оператор выполняется только при истинном условии. */
if(rs_arr->RS_PrevCmd != CMD_INITLOAD) continue; // Мы здесь оказались по какой-то чудовищной ошибке
/* Проверяет if(rs_arr->RS_DataReady); последующий оператор выполняется только при истинном условии. */
if(rs_arr->RS_DataReady) // Если данные в основном цикле не забраны,
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{ // то пропускаем следующую посылку
/* Записывает rs_arr->RS_FlagSkiping значением true; rs arr RS флаг Skiping. */
rs_arr->RS_FlagSkiping = true; // Игнорируем до следующего заголовка
// led1_off();
/* Переходит к следующей итерации ближайшего цикла. */
continue;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает RS_BytePtr значением rs_arr->RS_RecvLen++ % 2; данные RS_BytePtr. */
RS_BytePtr = rs_arr->RS_RecvLen++ % 2;
if(RS_BytePtr) *rs_arr->pRS_RecvPtr++ |= Rc; // Ïîëó÷èëè ñëîâî
/* Проверяет if(RS_BytePtr) *rs_arr->pRS_RecvPtr++ |= Rc; последующий оператор выполняется только при истинном условии. */
if(RS_BytePtr) *rs_arr->pRS_RecvPtr++ |= Rc; // Получили слово
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else *rs_arr->pRS_RecvPtr = Rc<<8;
if(rs_arr->RS_Length <= rs_arr->RS_RecvLen) // Êîíåö ïîñûëêè
/* Проверяет if(rs_arr->RS_Length <= rs_arr->RS_RecvLen); последующий оператор выполняется только при истинном условии. */
if(rs_arr->RS_Length <= rs_arr->RS_RecvLen) // Конец посылки
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_arr->RS_PrevCmd значением rs_arr->RS_Header[1] = CMD_LOAD; данные rs_arr->RS_PrevCmd. */
rs_arr->RS_PrevCmd = rs_arr->RS_Header[1] = CMD_LOAD;
RS_SetBitMode(rs_arr,9); // Ïîëó÷èëè âñå äàííûå ïåðåñòðîèëèñü â 9-áèò äëà RS485?
rs_arr->RS_FlagSkiping = true; // Èãíîðèðóåì äî ñëåäóþùåãî çàãîëîâêà
rs_arr->RS_DataReady = true; // Ôëàã â îñíîâíîé öèêë - äàííûå ïîëó÷åíû
/* Вызывает RS_SetBitMode с аргументами (rs_arr,9) в текущей последовательности операций. */
RS_SetBitMode(rs_arr,9); // Получили все данные перестроились в 9-бит дла RS485?
/* Записывает rs_arr->RS_FlagSkiping значением true; rs arr RS флаг Skiping. */
rs_arr->RS_FlagSkiping = true; // Игнорируем до следующего заголовка
/* Записывает rs_arr->RS_DataReady значением true; rs arr RS данные Ready. */
rs_arr->RS_DataReady = true; // Флаг в основной цикл - данные получены
// led1_off();
} } } }
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} } } }
/** Îáðàáîò÷èê ïðåðûâàíèé UART - ïîñëàíî */
/** Обработчик прерываний UART - послано */
/* Продвигает передачу текущего пакета SCI по состоянию UART и счётчику оставшихся данных. */
void RS_TX_Handler(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Условие компиляции RS232_USE_FIFO: выбранный блок включается в текущий вариант прошивки. */
#if RS232_USE_FIFO
/* Проверяет if (rs_arr->commnumber == COM_1); последующий оператор выполняется только при истинном условии. */
if (rs_arr->commnumber == COM_1) { RS_FifoTx(rs_arr); return; }
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Объявляет RS_BytePtr — данные RS_BytePtr. */
char RS_BytePtr;
// unsigned int i;
/* Проверяет if(rs_arr->RS_SendBlockMode == BM_CHAR32); последующий оператор выполняется только при истинном условии. */
if(rs_arr->RS_SendBlockMode == BM_CHAR32)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(++rs_arr->RS_SendLen >= rs_arr->RS_SLength); последующий оператор выполняется только при истинном условии. */
if(++rs_arr->RS_SendLen >= rs_arr->RS_SLength)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
enableUARTInt(rs_arr); /* Çàïðåùàåì ïðåðûâàíèà ïî ïåðåäà÷å */
enableUARTInt(rs_arr); /* Запрещаем прерываниа по передаче */ /* Вызывает enableUARTInt с аргументами (rs_arr) в текущей последовательности операций. */
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Вызывает SCI_send с аргументами (rs_arr,*(rs_arr->pRS_SendPtr++)) в текущей последовательности операций. */
SCI_send(rs_arr,*(rs_arr->pRS_SendPtr++));
/* Проверяет if(rs_arr->RS_SendLen >= rs_arr->RS_SLength); последующий оператор выполняется только при истинном условии. */
if(rs_arr->RS_SendLen >= rs_arr->RS_SLength)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Вызывает RS_Wait4OK с аргументами (rs_arr) в текущей последовательности операций. */
RS_Wait4OK(rs_arr);
// for (i=0; i <= TIME_WAIT_RS_BYTE_OUT; i++){} /* Ïàóçà äëà PC */
RS_SetBitMode(rs_arr,9); /* Ïåðåäàëè âñå ïåðåñòðîèëèñü â 9-áèò äëà RS485?*/
RS_Line_to_receive(rs_arr); /* ðåæèì ïðèåìà RS485 */
rs_arr->flag_TIMEOUT_to_Send=false; /* ñáðîñèëè ôëàã îæèäàíèà òàéìàóòà */
// for (i=0; i <= TIME_WAIT_RS_BYTE_OUT; i++){} /* Пауза дла PC */
RS_SetBitMode(rs_arr,9); /* Передали все перестроились в 9-бит дла RS485?*/ /* Вызывает RS_SetBitMode с аргументами (rs_arr,9) в текущей последовательности операций. */
RS_Line_to_receive(rs_arr); /* режим приема RS485 */ /* Вызывает RS_Line_to_receive с аргументами (rs_arr) в текущей последовательности операций. */
rs_arr->flag_TIMEOUT_to_Send=false; /* сбросили флаг ожиданиа таймаута */ /* Записывает rs_arr->flag_TIMEOUT_to_Send значением false; rs arr флаг TIMEOUT to Send. */
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
else /* BM_PACKED */
else /* BM_PACKED */ /* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает RS_BytePtr значением (rs_arr->RS_SendLen++) % 2; данные RS_BytePtr. */
RS_BytePtr = (rs_arr->RS_SendLen++) % 2;
/* Проверяет if(rs_arr->RS_SendLen >= rs_arr->RS_SLength); последующий оператор выполняется только при истинном условии. */
if(rs_arr->RS_SendLen >= rs_arr->RS_SLength)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
enableUARTInt(rs_arr); /* Çàïðåùàåì ïðåðûâàíèà ïî ïåðåäà÷å */
enableUARTInt(rs_arr); /* Запрещаем прерываниа по передаче */ /* Вызывает enableUARTInt с аргументами (rs_arr) в текущей последовательности операций. */
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(RS_BytePtr) SCI_send(rs_arr, LOBYTE( *(rs_arr->pRS_SendPtr++) )); последующий оператор выполняется только при истинном условии. */
if(RS_BytePtr) SCI_send(rs_arr, LOBYTE( *(rs_arr->pRS_SendPtr++) ));
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else SCI_send(rs_arr, HIBYTE( *rs_arr->pRS_SendPtr ));
/* Проверяет if(rs_arr->RS_SendLen >= rs_arr->RS_SLength); последующий оператор выполняется только при истинном условии. */
if(rs_arr->RS_SendLen >= rs_arr->RS_SLength)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Вызывает RS_Wait4OK с аргументами (rs_arr) в текущей последовательности операций. */
RS_Wait4OK(rs_arr);
// for (i=0; i <= TIME_WAIT_RS_BYTE_OUT; i++){} /* Ïàóçà äëà PC */
// RS_SetBitMode(rs_arr,9); /* Ïåðåäàëè âñå ïåðåñòðîèëèñü â 9-áèò äëà RS485?*/
// RS_Line_to_receive(); /* ðåæèì ïðèåìà RS485 */
}
}
// for (i=0; i <= TIME_WAIT_RS_BYTE_OUT; i++){} /* Пауза дла PC */
// RS_SetBitMode(rs_arr,9); /* Передали все перестроились в 9-бит дла RS485?*/
// RS_Line_to_receive(); /* режим приема RS485 */
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Устанавливает биты PieCtrlRegs.PIEACK.bit.ACK9 значением 1; данные ACK9. */
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
// rs_arr->SciRegs->SCIFFTX.bit.TXINTCLR=1; // Clear INT flag
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Èíèöèàëèçàöèà ìàññèâà äëèí êîìàíä */
/** Инициализациа массива длин команд */
/* Начинает функцию setup_arr_cmd_length; назначение модуля — приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
void setup_arr_cmd_length()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет i — данные i. */
int i;
/* Цикл for (i=0;i<70;i++) RS_Len[i]=i;; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i=0;i<70;i++) RS_Len[i]=i;
/* Записывает RS_Len[CMD_LOAD] значением 12; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_LOAD] = 12;
/* Записывает RS_Len[CMD_UPLOAD] значением 12; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_UPLOAD] = 12;
/* Записывает RS_Len[CMD_RUN] значением 8; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_RUN] = 8;
/* Записывает RS_Len[CMD_XFLASH] значением 9; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_XFLASH] = 9;
/* Записывает RS_Len[CMD_TFLASH] значением 16; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_TFLASH] = 16;
/* Записывает RS_Len[CMD_PEEK] значением 8; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_PEEK] = 8;
/* Записывает RS_Len[CMD_POKE] значением 12; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_POKE] = 12;
/* Записывает RS_Len[CMD_INITLOAD] значением 12; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_INITLOAD] = 12;
RS_Len[CMD_INIT] = 5;
/* Записывает RS_Len[CMD_INIT] значением 5; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_INIT] = 5;
/* Записывает RS_Len[CMD_VECTOR] значением size_cmd15-2; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_VECTOR] = size_cmd15-2; //sizeof(CMD_TO_TMS)-2;
RS_Len[CMD_STD] = size_cmd15-1; //sizeof(CMD_TO_TMS)-1;
/* Записывает RS_Len[CMD_STD] значением size_cmd15-1; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_STD] = size_cmd15-1; //sizeof(CMD_TO_TMS)-1;
/* Записывает RS_Len[CMD_IMPULSE] значением 8; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_IMPULSE] = 8;
/* Записывает RS_Len[CMD_MODBUS_3] значением 8; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_MODBUS_3] = 8;
/* Записывает RS_Len[ANS_MODBUS_4] значением 3+48*2+2; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[ANS_MODBUS_4] = 3+48*2+2;
/* Записывает RS_Len[CMD_MODBUS_6] значением 8; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_MODBUS_6] = 8;
/* Записывает RS_Len[CMD_MODBUS_16] значением 13; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_MODBUS_16] = 13;
/* Записывает RS_Len[CMD_MODBUS_15] значением 27; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_MODBUS_15] = 27;
/* Записывает RS_Len[CMD_EXTEND] значением 18; таблица ожидаемых длин команд последовательного протокола. */
RS_Len[CMD_EXTEND] = 18;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Íàñòðîéêà ðåæèìà ïðèåìà/ïåðåäà÷è */
/** Настройка режима приема/передачи */
/* Начинает функцию RS_SetBitMode; назначение модуля — приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
void RS_SetBitMode(RS_DATA *rs_arr,int n)
{
if(n == 8)
{
RS_SetLineMode(rs_arr,8,'N',1); /* ðåæèì ëèíèè */
rs_arr->RS_Flag9bit=0;
}
if(n == 9)
{
RS_SetLineMode(rs_arr,8,'N',1); /* ðåæèì ëèíèè */
rs_arr->RS_Flag9bit=1;
} }
/** Ïîñûëêà áëîêà áàéòîâ.
Ïîñûëàåò ìàññèâà 32-áèòíûõ öåëûõ ÷èñåë ñòàðøèå áèòû äîëæíû áûòü 0.
@precondition Ðàáîòà ô-öèè çàâèñèò îò ìàêðî RS_TRANSMIT_INTR
@param buf àäðåñ ìàññèâà
@param len êîëè÷åñòâî áàéò
@see RS_BSend, RS_TRANSMIT_INTR */
int RS_Send(RS_DATA *rs_arr,unsigned int *pBuf,unsigned long len)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(n == 8); последующий оператор выполняется только при истинном условии. */
if(n == 8)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
RS_SetLineMode(rs_arr,8,'N',1); /* режим линии */ /* Вызывает RS_SetLineMode с аргументами (rs_arr,8,'N',1) в текущей последовательности операций. */
/* Записывает rs_arr->RS_Flag9bit значением 0; rs arr RS флаг 9 бит. */
rs_arr->RS_Flag9bit=0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(n == 9); последующий оператор выполняется только при истинном условии. */
if(n == 9)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
RS_SetLineMode(rs_arr,8,'N',1); /* режим линии */ /* Вызывает RS_SetLineMode с аргументами (rs_arr,8,'N',1) в текущей последовательности операций. */
/* Записывает rs_arr->RS_Flag9bit значением 1; rs arr RS флаг 9 бит. */
rs_arr->RS_Flag9bit=1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/** Посылка блока байтов.
Посылает массива 32-битных целых чисел старшие биты должны быть 0.
@precondition Работа ф-ции зависит от макро RS_TRANSMIT_INTR
@param buf адрес массива
@param len количество байт
@see RS_BSend, RS_TRANSMIT_INTR */
/* Передаёт массив слов через SCI в выбранном режиме упаковки. */
int RS_Send(RS_DATA *rs_arr,unsigned int *pBuf,unsigned long len)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Условие компиляции RS232_USE_FIFO: выбранный блок включается в текущий вариант прошивки. */
#if RS232_USE_FIFO
/* Проверяет if (rs_arr->commnumber == COM_1) return RS_FifoStart(rs_arr,pBuf,len,BM_CHAR32); последующий оператор выполняется только при истинном условии. */
if (rs_arr->commnumber == COM_1) return RS_FifoStart(rs_arr,pBuf,len,BM_CHAR32);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Объявляет i — данные i. */
unsigned int i;
for (i=0; i <= 30000; i++){} /* Ïàóçà äëà PC */
for (i=0; i <= 30000; i++){} /* Пауза дла PC */ /* Цикл for (i=0; i <= 30000; i++); задаёт начальное значение, условие продолжения и шаг перебора. */
RS_Line_to_send(rs_arr); /* ðåæèì ïåðåäà÷è RS485 */
RS_Line_to_send(rs_arr); /* режим передачи RS485 */ /* Вызывает RS_Line_to_send с аргументами (rs_arr) в текущей последовательности операций. */
for (i=0; i <= 10000; i++){} /* Ïàóçà äëà PC */
rs_arr->RS_SLength = len; /* Íàñòðàèâàåì ïåðåìåííûå */
for (i=0; i <= 10000; i++){} /* Пауза дла PC */ /* Цикл for (i=0; i <= 10000; i++); задаёт начальное значение, условие продолжения и шаг перебора. */
rs_arr->RS_SLength = len; /* Настраиваем переменные */ /* Записывает rs_arr->RS_SLength значением len; rs arr RS S длина. */
/* Записывает rs_arr->pRS_SendPtr значением pBuf + 1; данные rs_arr->pRS_SendPtr. */
rs_arr->pRS_SendPtr = pBuf + 1;
/* Записывает rs_arr->RS_SendBlockMode значением BM_CHAR32; rs arr RS Send Block режим. */
rs_arr->RS_SendBlockMode = BM_CHAR32;
RS_Wait4OK(rs_arr); /* Äîæèäàåìñà óõîäà */
RS_SetBitMode(rs_arr,8); /* Îñòàëüíûå â 8-áèò ðåæèìå */
rs_arr->RS_SendLen = 1; /* Äâà áàéòà óæå ïåðåäàëè */
RS_Wait4OK(rs_arr); /* Дожидаемса ухода */ /* Вызывает RS_Wait4OK с аргументами (rs_arr) в текущей последовательности операций. */
RS_SetBitMode(rs_arr,8); /* Остальные в 8-бит режиме */ /* Вызывает RS_SetBitMode с аргументами (rs_arr,8) в текущей последовательности операций. */
rs_arr->RS_SendLen = 1; /* Два байта уже передали */ /* Записывает rs_arr->RS_SendLen значением 1; данные rs_arr->RS_SendLen. */
/* Проверяет if(len > 1); последующий оператор выполняется только при истинном условии. */
if(len > 1)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
enableUARTIntW(rs_arr); /* Ðàçðåøàåì ïðåðûâàíèà ïî ïåðåäà÷å */
SCI_send(rs_arr, *pBuf); // Ïåðåäàåì âòîðîé áàéò ïî ïðåðûâàíèþ
enableUARTIntW(rs_arr); /* Разрешаем прерываниа по передаче */ /* Вызывает enableUARTIntW с аргументами (rs_arr) в текущей последовательности операций. */
/* Вызывает SCI_send с аргументами (rs_arr, *pBuf) в текущей последовательности операций. */
SCI_send(rs_arr, *pBuf); // Передаем второй байт по прерыванию
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
SCI_send(rs_arr, *pBuf); // Ïåðåäàåì âòîðîé áàéò ïî ïðåðûâàíèþ
RS_Wait4OK(rs_arr); /* Äîæèäàåìñà óõîäà áåç ïðåðûâàíèà */
for (i=0; i <= TIME_WAIT_RS_BYTE_OUT; i++){} /* Ïàóçà äëà PC */
RS_SetBitMode(rs_arr,9); /* Îáðàòíî â 9-áèò ðåæèì */
RS_Line_to_receive(rs_arr); /* ðåæèì ïðèåìà RS485 */
/* Вызывает SCI_send с аргументами (rs_arr, *pBuf) в текущей последовательности операций. */
SCI_send(rs_arr, *pBuf); // Передаем второй байт по прерыванию
RS_Wait4OK(rs_arr); /* Дожидаемса ухода без прерываниа */ /* Вызывает RS_Wait4OK с аргументами (rs_arr) в текущей последовательности операций. */
for (i=0; i <= TIME_WAIT_RS_BYTE_OUT; i++){} /* Пауза дла PC */ /* Цикл for (i=0; i <= TIME_WAIT_RS_BYTE_OUT; i++); задаёт начальное значение, условие продолжения и шаг перебора. */
RS_SetBitMode(rs_arr,9); /* Обратно в 9-бит режим */ /* Вызывает RS_SetBitMode с аргументами (rs_arr,9) в текущей последовательности операций. */
RS_Line_to_receive(rs_arr); /* режим приема RS485 */ /* Вызывает RS_Line_to_receive с аргументами (rs_arr) в текущей последовательности операций. */
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Завершает RS_Send и возвращает 0. */
return 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
// Ïîñûëêà áëîêà óïàêîâàííûõ áàéòîâ
// Посылка блока упакованных байтов
/* Передаёт последовательность 8-битных октетов, упакованных в слова C28x. */
int RS_BSend(RS_DATA *rs_arr,unsigned int *pBuf, unsigned long len)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Условие компиляции RS232_USE_FIFO: выбранный блок включается в текущий вариант прошивки. */
#if RS232_USE_FIFO
/* Проверяет if (rs_arr->commnumber == COM_1) return RS_FifoStart(rs_arr,pBuf,len,BM_PACKED); последующий оператор выполняется только при истинном условии. */
if (rs_arr->commnumber == COM_1) return RS_FifoStart(rs_arr,pBuf,len,BM_PACKED);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
RS_Line_to_send(rs_arr); // ðåæèì ïåðåäà÷è RS485
/* Вызывает RS_Line_to_send с аргументами (rs_arr) в текущей последовательности операций. */
RS_Line_to_send(rs_arr); // режим передачи RS485
rs_arr->RS_SLength = len; // Íàñòðàèâàåì ïåðåìåííûå
rs_arr->pRS_SendPtr = pBuf;
/* Записывает rs_arr->RS_SLength значением len; rs arr RS S длина. */
rs_arr->RS_SLength = len; // Настраиваем переменные
/* Записывает rs_arr->pRS_SendPtr значением pBuf; данные rs_arr->pRS_SendPtr. */
rs_arr->pRS_SendPtr = pBuf;
/* Записывает rs_arr->RS_SendBlockMode значением BM_PACKED; rs arr RS Send Block режим. */
rs_arr->RS_SendBlockMode = BM_PACKED;
RS_Wait4OK(rs_arr); // Îæèäàåì î÷èñòêè è óõîäà ïîñëåäíåãî áàéòà
RS_SetBitMode(rs_arr,8); /* Îñòàëüíûå â 8-áèò ðåæèìå */
/* Вызывает RS_Wait4OK с аргументами (rs_arr) в текущей последовательности операций. */
RS_Wait4OK(rs_arr); // Ожидаем очистки и ухода последнего байта
RS_SetBitMode(rs_arr,8); /* Остальные в 8-бит режиме */ /* Вызывает RS_SetBitMode с аргументами (rs_arr,8) в текущей последовательности операций. */
rs_arr->RS_SendLen = 1; // Îäèí áàéò óæå ïåðåäàëè
/* Записывает rs_arr->RS_SendLen значением 1; данные rs_arr->RS_SendLen. */
rs_arr->RS_SendLen = 1; // Один байт уже передали
enableUARTIntW(rs_arr); /* Ðàçðåøàåì ïðåðûâàíèà ïî ïåðåäà÷å */
enableUARTIntW(rs_arr); /* Разрешаем прерываниа по передаче */ /* Вызывает enableUARTIntW с аргументами (rs_arr) в текущей последовательности операций. */
SCI_send(rs_arr,HIBYTE(*pBuf));// Ïåðåäàåì ïåðâûé áàéò
/* Вызывает SCI_send с аргументами (rs_arr,HIBYTE(*pBuf)) в текущей последовательности операций. */
SCI_send(rs_arr,HIBYTE(*pBuf));// Передаем первый байт
/* Завершает RS_BSend и возвращает 0. */
return 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Óñòàíàâëèâàåò ñêîðîñòü îáìåíà.
@param speed ñêîðîñòü RS â áîä */
/** Óñòàíàâëèâàåò ñêîðîñòü îáìåíà.
@param speed ñêîðîñòü RS â áîä */
/** Устанавливает скорость обмена.
@param speed скорость RS в бод */
/** Устанавливает скорость обмена.
@param speed скорость RS в бод */
/* Начинает функцию RS_SetLineSpeed; назначение модуля — приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
void RS_SetLineSpeed(RS_DATA *rs_arr,unsigned long speed)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет SciBaud — SCI скорость передачи. */
long SciBaud;
/* Записывает SciBaud значением LSPCLK/(speed*8.0); SCI скорость передачи. */
SciBaud = LSPCLK/(speed*8.0);
// if((SciBaud-(unsigned int)SciBaud)>0.5) SciBaud++;
/* Записывает rs_arr->SciRegs->SCIHBAUD значением HIBYTE((int)SciBaud); rs arr SCI Regs SCIHBAUD. */
rs_arr->SciRegs->SCIHBAUD = HIBYTE((int)SciBaud);
/* Записывает rs_arr->SciRegs->SCILBAUD значением LOBYTE((int)SciBaud); rs arr SCI Regs SCILBAUD. */
rs_arr->SciRegs->SCILBAUD = LOBYTE((int)SciBaud);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Èíèöèàëèçàöèà ïîñëåäîâàòåëüíîãî ïîðòà */
/** Инициализациа последовательного порта */
/* Инициализирует структуры обоих SCI и таблицу длин команд. */
void create_uart_vars(char size_cmd15_set)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает size_cmd15 значением size_cmd15_set; размер cmd 15. */
size_cmd15=size_cmd15_set;
/* Записывает rs_a.commnumber значением COM_1; данные commnumber. */
rs_a.commnumber=COM_1;
/* Записывает rs_b.commnumber значением COM_2; данные commnumber. */
rs_b.commnumber=COM_2;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Èíèöèàëèçàöèà ïîñëåäîâàòåëüíîãî ïîðòà */
/** Инициализациа последовательного порта */
/* Настраивает выбранный SCI, скорость и обработчики прерываний. */
void setup_uart(char commnumber, unsigned long speed_baud)
{
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Продолжает список аргументов, полей или выражение volatile struct SCI_REGS *SciRegs;; порядок элементов сохраняется. */
volatile struct SCI_REGS *SciRegs;
/* Объявляет rs_arr — данные rs_arr. Хранит указатель на данные. */
RS_DATA *rs_arr;
/* Проверяет if(commnumber==COM_1); последующий оператор выполняется только при истинном условии. */
if(commnumber==COM_1)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_a.SciRegs значением &SciaRegs; SCI Regs. */
rs_a.SciRegs = &SciaRegs;
/* Записывает rs_arr значением &rs_a; данные rs_arr. */
rs_arr = &rs_a;
/* Разрешение записи в защищённые регистры периферии. */
EALLOW;
/* Записывает GpioCtrlRegs.GPAMUX2.bit.GPIO29 значением 1; аппаратная линия ввода/вывода GPIO29. */
GpioCtrlRegs.GPAMUX2.bit.GPIO29 = 1; // SCITXDA - SCI-A transmit(O)
/* Записывает GpioCtrlRegs.GPAMUX2.bit.GPIO28 значением 1; аппаратная линия ввода/вывода GPIO28. */
GpioCtrlRegs.GPAMUX2.bit.GPIO28 = 1; // SCIRXDA - SCI-A receive (I)
/* Записывает PieVectTable.SCIRXINTA значением &RSA_RX_Handler; данные SCIRXINTA. */
PieVectTable.SCIRXINTA = &RSA_RX_Handler;
/* Записывает PieVectTable.SCITXINTA значением &RSA_TX_Handler; данные SCITXINTA. */
PieVectTable.SCITXINTA = &RSA_TX_Handler;
/* Записывает PieCtrlRegs.PIEIER9.bit.INTx1 значением 1; данные INTx1. */
PieCtrlRegs.PIEIER9.bit.INTx1=1; // PIE Group 9, INT1
/* Записывает PieCtrlRegs.PIEIER9.bit.INTx2 значением 1; данные INTx2. */
PieCtrlRegs.PIEIER9.bit.INTx2=1; // PIE Group 9, INT2
/* Устанавливает биты IER значением M_INT9; регистр разрешения прерываний ядра C28x. */
IER |= M_INT9; // Enable CPU INT
/* Закрытие доступа к защищённым регистрам периферии. */
EDIS;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(commnumber==COM_2); последующий оператор выполняется только при истинном условии. */
if(commnumber==COM_2)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_b.SciRegs значением &ScibRegs; SCI Regs. */
rs_b.SciRegs = &ScibRegs;
/* Записывает rs_arr значением &rs_b; данные rs_arr. */
rs_arr = &rs_b;
/* Разрешение записи в защищённые регистры периферии. */
EALLOW;
/* Записывает GpioCtrlRegs.GPAMUX1.bit.GPIO14 значением 2; аппаратная линия ввода/вывода GPIO14. */
GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 2; // SCITXDB - SCI-B transmit(O)
/* Записывает GpioCtrlRegs.GPAMUX1.bit.GPIO15 значением 2; аппаратная линия ввода/вывода GPIO15. */
GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 2; // SCIRXDB - SCI-B receive (I)
/* Записывает GpioCtrlRegs.GPBMUX1.bit.GPIO34 значением 0; аппаратная линия ввода/вывода GPIO34. */
GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; // GPIO 34 - general purpose I/O 34 (default)
/* Записывает GpioCtrlRegs.GPBDIR.bit.GPIO34 значением 1; аппаратная линия ввода/вывода GPIO34. */
GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; // Configures the GPIO pin as an output
/* Записывает PieVectTable.SCIRXINTB значением &RSB_RX_Handler; данные SCIRXINTB. */
PieVectTable.SCIRXINTB = &RSB_RX_Handler;
/* Записывает PieVectTable.SCITXINTB значением &RSB_TX_Handler; данные SCITXINTB. */
PieVectTable.SCITXINTB = &RSB_TX_Handler;
/* Записывает PieCtrlRegs.PIEIER9.bit.INTx3 значением 1; данные INTx3. */
PieCtrlRegs.PIEIER9.bit.INTx3=1; // PIE Group 9, INT3
/* Записывает PieCtrlRegs.PIEIER9.bit.INTx4 значением 1; данные INTx4. */
PieCtrlRegs.PIEIER9.bit.INTx4=1; // PIE Group 9, INT4
/* Устанавливает биты IER значением M_INT9; регистр разрешения прерываний ядра C28x. */
IER |= M_INT9; // Enable CPU INT
/* Закрытие доступа к защищённым регистрам периферии. */
EDIS;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает rs_arr->commnumber значением commnumber; данные rs_arr->commnumber. */
rs_arr->commnumber = commnumber;
/* Записывает SciRegs значением rs_arr->SciRegs; SCI Regs. */
SciRegs = rs_arr->SciRegs;
/* Вызывает RS_SetLineMode с аргументами (rs_arr,8,'N',1) в текущей последовательности операций. */
RS_SetLineMode(rs_arr,8,'N',1);
// enable TX, RX, internal SCICLK,
// enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
/* Записывает SciRegs->SCIFFCT.bit.ABDCLR значением 1; данные ABDCLR. */
SciRegs->SCIFFCT.bit.ABDCLR=1;
/* Записывает SciRegs->SCIFFCT.bit.CDC значением 0; данные CDC. */
SciRegs->SCIFFCT.bit.CDC=0;
/* Записывает SciRegs->SCICTL1.bit.RXERRINTENA значением 0; данные RXERRINTENA. */
SciRegs->SCICTL1.bit.RXERRINTENA=0;
/* Записывает SciRegs->SCICTL1.bit.SWRESET значением 0; данные SWRESET. */
SciRegs->SCICTL1.bit.SWRESET=0;
/* Записывает SciRegs->SCICTL1.bit.TXWAKE значением 0; данные TXWAKE. */
SciRegs->SCICTL1.bit.TXWAKE=0;
/* Записывает SciRegs->SCICTL1.bit.SLEEP значением 0; данные SLEEP. */
SciRegs->SCICTL1.bit.SLEEP=0;
/* Записывает SciRegs->SCICTL1.bit.TXENA значением 1; данные TXENA. */
SciRegs->SCICTL1.bit.TXENA=1;
/* Записывает SciRegs->SCICTL1.bit.RXENA значением 1; данные RXENA. */
SciRegs->SCICTL1.bit.RXENA=1;
/* Условие компиляции RS232_USE_FIFO: выбранный блок включается в текущий вариант прошивки. */
#if RS232_USE_FIFO
/* Проверяет if (commnumber == COM_1); последующий оператор выполняется только при истинном условии. */
if (commnumber == COM_1) {
SciRegs->SCIFFTX.all=0xC008U; /* enhancement, reset held, TX level 8, IRQ off */
SciRegs->SCIFFRX.all=0x0061U; /* reset held, RX level 1, IRQ on */
SciRegs->SCIFFTX.all=0xC008U; /* enhancement, reset held, TX level 8, IRQ off */ /* Записывает SciRegs->SCIFFTX.all значением 0xC008U; представление регистра целым словом без разбиения на битовые поля. */
SciRegs->SCIFFRX.all=0x0061U; /* reset held, RX level 1, IRQ on */ /* Записывает SciRegs->SCIFFRX.all значением 0x0061U; представление регистра целым словом без разбиения на битовые поля. */
/* Записывает SciRegs->SCIFFCT.all значением 0; представление регистра целым словом без разбиения на битовые поля. */
SciRegs->SCIFFCT.all=0;
/* Записывает SciRegs->SCIFFRX.bit.RXFFOVRCLR значением 1; данные RXFFOVRCLR. */
SciRegs->SCIFFRX.bit.RXFFOVRCLR=1;
/* Записывает SciRegs->SCIFFTX.bit.TXFFINTCLR значением 1; данные TXFFINTCLR. */
SciRegs->SCIFFTX.bit.TXFFINTCLR=1;
/* Записывает SciRegs->SCIFFTX.bit.TXFIFOXRESET значением 1; данные TXFIFOXRESET. */
SciRegs->SCIFFTX.bit.TXFIFOXRESET=1;
/* Записывает SciRegs->SCIFFRX.bit.RXFIFORESET значением 1; данные RXFIFORESET. */
SciRegs->SCIFFRX.bit.RXFIFORESET=1;
/* Записывает rs_arr->fifo_tx_active значением rs_arr->fifo_rx_guard=0; данные rs_arr->fifo_tx_active. */
rs_arr->fifo_tx_active=rs_arr->fifo_rx_guard=0;
/* Записывает rs_arr->fifo_rx_errors значением rs_arr->fifo_overflows=0; данные rs_arr->fifo_rx_errors. */
rs_arr->fifo_rx_errors=rs_arr->fifo_overflows=0;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
} else
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Записывает SciRegs->SCIFFTX.bit.SCIFFENA значением 0; данные SCIFFENA. */
SciRegs->SCIFFTX.bit.SCIFFENA=0; // fifo off
SciRegs->SCIFFRX.bit.RXFFIL=1; // Äëèíà íàèìåíüøåé êîìàíäû
/* Записывает SciRegs->SCIFFRX.bit.RXFFIL значением 1; данные RXFFIL. */
SciRegs->SCIFFRX.bit.RXFFIL=1; // Длина наименьшей команды
/* Вызывает setup_arr_cmd_length с аргументами () в текущей последовательности операций. */
setup_arr_cmd_length();
RS_SetLineSpeed(rs_arr,speed_baud); // ñêîðîñòü ëèíèè
RS_Line_to_receive(rs_arr); // ðåæèì ïðèåìà RS485
enableUARTInt(rs_arr); // ðàçðåøåíèå ïðåðûâàíèé UART
/* Вызывает RS_SetLineSpeed с аргументами (rs_arr,speed_baud) в текущей последовательности операций. */
RS_SetLineSpeed(rs_arr,speed_baud); // скорость линии
/* Вызывает RS_Line_to_receive с аргументами (rs_arr) в текущей последовательности операций. */
RS_Line_to_receive(rs_arr); // режим приема RS485
/* Вызывает enableUARTInt с аргументами (rs_arr) в текущей последовательности операций. */
enableUARTInt(rs_arr); // разрешение прерываний UART
/* Вызывает RS_SetBitMode с аргументами (rs_arr,9) в текущей последовательности операций. */
RS_SetBitMode(rs_arr,9);
rs_arr->RS_PrevCmd = 0; // íå áûëî íèêàêèõ êîìàíä
/* Записывает rs_arr->RS_PrevCmd значением 0; данные rs_arr->RS_PrevCmd. */
rs_arr->RS_PrevCmd = 0; // не было никаких команд
/* Записывает rs_arr->flag_TIMEOUT_to_Send значением 0; rs arr флаг TIMEOUT to Send. */
rs_arr->flag_TIMEOUT_to_Send = 0;
/* Записывает rs_arr->flag_LEADING значением 0; rs arr флаг LEADING. */
rs_arr->flag_LEADING = 0;
/* Записывает SciRegs->SCIFFRX.bit.RXFFINTCLR значением 1; данные RXFFINTCLR. */
SciRegs->SCIFFRX.bit.RXFFINTCLR=1; // Clear INT flag
/* Записывает SciRegs->SCICTL1.bit.SWRESET значением 1; данные SWRESET. */
SciRegs->SCICTL1.bit.SWRESET=1; // Relinquish SCI from Reset
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Íàñòðîéêà ðåæèìà ëèíèè.
@param bit êîëè÷åñòâî áèò äàííûõ
@param parity ðåæèì ÷åòíîñòè (N,O,E,M,S)
@param stop êîëè÷åñòâî ñòîïîâûõ áèò */
/** Настройка режима линии.
@param bit количество бит данных
@param parity режим четности (N,O,E,M,S)
@param stop количество стоповых бит */
/* Начинает функцию RS_SetLineMode; назначение модуля — приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
void RS_SetLineMode(RS_DATA *rs_arr, int bit, char parity, int stop)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Продолжает список аргументов, полей или выражение volatile struct SCI_REGS *SciRegs;; порядок элементов сохраняется. */
volatile struct SCI_REGS *SciRegs;
/*
SCICCR - SCI Communication Control Register
SCICCR - SCI Communication Control Register
Bit Bit Name Designation Functions
2-0 SCI CHAR2-0 SCICHAR Select the character (data) length (one to eight bits).
3 ADDR/IDLE MODE ADDRIDLE_MODE The idle-line mode (0) is usually used for normal communications because the address-bit mode adds an extra bit to the frame. The idle-line mode does not add this extra bit and is compatible with RS-232 type communications.
@@ -556,158 +931,285 @@ Bit Bit Name Designation Functions
5 PARITY ENABLE PARITYENA Enables the parity function if set to 1, or disables the parity function if cleared to 0.
6 EVEN/ODD PARITY PARITY If parity is enabled, selects odd parity if cleared to 0 or even parity if set to 1.
7 STOP BITS STOPBITS Determines the number of stop bits transmitted-one stop bit if cleared to 0 or two stop bits if set to 1.
*/
*/
/* Записывает SciRegs значением rs_arr->SciRegs; SCI Regs. */
SciRegs = rs_arr->SciRegs;
/* Проверяет if(bit>0 и bit<9) SciRegs->SCICCR.bit.SCICHAR = bit-1; последующий оператор выполняется только при истинном условии. */
if(bit>0 && bit<9) SciRegs->SCICCR.bit.SCICHAR = bit-1;
/* Вызывает switch с аргументами (parity) в текущей последовательности операций. */
switch(parity)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Ветвь выбора для 'N'; выполняется при совпадении селектора switch. */
case 'N': SciRegs->SCICCR.bit.PARITYENA = 0;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 'O'; выполняется при совпадении селектора switch. */
case 'O': SciRegs->SCICCR.bit.PARITYENA = 1;
/* Записывает SciRegs->SCICCR.bit.PARITY значением 0; чётность. */
SciRegs->SCICCR.bit.PARITY = 0;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 'E'; выполняется при совпадении селектора switch. */
case 'E': SciRegs->SCICCR.bit.PARITYENA = 1;
/* Записывает SciRegs->SCICCR.bit.PARITY значением 1; чётность. */
SciRegs->SCICCR.bit.PARITY = 1;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if (stop==1) SciRegs->SCICCR.bit.STOPBITS = 0; последующий оператор выполняется только при истинном условии. */
if (stop==1) SciRegs->SCICCR.bit.STOPBITS = 0;
/* Проверяет if (stop==2) SciRegs->SCICCR.bit.STOPBITS = 1; последующий оператор выполняется только при истинном условии. */
if (stop==2) SciRegs->SCICCR.bit.STOPBITS = 1;
/* Записывает SciRegs->SCICCR.bit.LOOPBKENA значением 0; данные LOOPBKENA. */
SciRegs->SCICCR.bit.LOOPBKENA = 0; //0
/* Записывает SciRegs->SCICCR.bit.ADDRIDLE_MODE значением 0; ADDRIDLE режим. */
SciRegs->SCICCR.bit.ADDRIDLE_MODE = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию clear_timer_rs_live; назначение модуля — приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
void clear_timer_rs_live(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_arr->time_wait_rs_out значением 0; данные rs_arr->time_wait_rs_out. */
rs_arr->time_wait_rs_out=0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* ïðîâåðêà íà æèâó÷åñòü RS */
/* проверка на живучесть RS */
/* Начинает функцию test_rs_live; назначение модуля — приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
void test_rs_live(RS_DATA *rs_arr)
{
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* if (rs_arr->time_wait_rs_out < RS_TIME_OUT)
rs_arr->time_wait_rs_out++;
else
{
rs_arr->time_wait_rs_out=0;
RS_Line_to_receive(rs_arr); // ðåæèì ïðèåìà RS485
RS_Line_to_receive(rs_arr); // режим приема RS485
RS_SetBitMode(rs_arr,9);
}*/ }
}*/ } /* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
/* Условие компиляции RS232_USE_FIFO: выбранный блок включается в текущий вариант прошивки. */
#if RS232_USE_FIFO
/* FIFO is exclusively SCI-A / RS232. SCI-B keeps the legacy path. */
/* Ожидает завершения аппаратной передачи FIFO и сдвигового регистра SCI. */
void RS_FifoWait(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if (rs_arr->commnumber != COM_1); последующий оператор выполняется только при истинном условии. */
if (rs_arr->commnumber != COM_1) {
/* Повторяет или ожидает, пока выполняется while (!rs_arr->SciRegs->SCICTL2.bit.TXEMPTY). */
while (!rs_arr->SciRegs->SCICTL2.bit.TXEMPTY) { }
/* Завершает RS_FifoWait без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Повторяет или ожидает, пока выполняется while (rs_arr->fifo_tx_active или rs_arr->SciRegs->SCIFFTX.bit.TXFFST или. */
while (rs_arr->fifo_tx_active || rs_arr->SciRegs->SCIFFTX.bit.TXFFST ||
/* Продолжает список аргументов, полей или выражение !rs_arr->SciRegs->SCICTL2.bit.TXEMPTY) { }; порядок элементов сохраняется. */
!rs_arr->SciRegs->SCICTL2.bit.TXEMPTY) { }
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Заполняет TX FIFO доступными байтами, сохраняя длину и положение в передаваемом пакете. */
static void RS_FifoTx(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет data — данные. */
unsigned int data;
/* Проверяет if (!rs_arr->fifo_tx_active); последующий оператор выполняется только при истинном условии. */
if (!rs_arr->fifo_tx_active) {
/* Записывает rs_arr->SciRegs->SCIFFTX.bit.TXFFIENA значением 0; данные TXFFIENA. */
rs_arr->SciRegs->SCIFFTX.bit.TXFFIENA=0;
/* Проверяет else if (rs_arr->RS_SendLen == rs_arr->RS_SLength); последующий оператор выполняется только при истинном условии. */
} else if (rs_arr->RS_SendLen == rs_arr->RS_SLength) {
/* Level 0 interrupt: FIFO drained, last symbol may still be shifting.
* Do not finish on TXFFST alone. At most one symbol remains. */
/* Проверяет if (rs_arr->SciRegs->SCIFFTX.bit.TXFFST); последующий оператор выполняется только при истинном условии. */
if (rs_arr->SciRegs->SCIFFTX.bit.TXFFST) {
/* Записывает rs_arr->SciRegs->SCIFFTX.bit.TXFFINTCLR значением 1; данные TXFFINTCLR. */
rs_arr->SciRegs->SCIFFTX.bit.TXFFINTCLR=1;
/* Устанавливает биты PieCtrlRegs.PIEACK.bit.ACK9 значением 1; данные ACK9. */
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
/* Завершает RS_FifoTx без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает rs_arr->SciRegs->SCIFFTX.bit.TXFFIENA значением 0; данные TXFFIENA. */
rs_arr->SciRegs->SCIFFTX.bit.TXFFIENA=0;
/* Повторяет или ожидает, пока выполняется while (!rs_arr->SciRegs->SCICTL2.bit.TXEMPTY). */
while (!rs_arr->SciRegs->SCICTL2.bit.TXEMPTY) { }
/* Проверяет if (rs_arr->RS_SendBlockMode == BM_CHAR32); последующий оператор выполняется только при истинном условии. */
if (rs_arr->RS_SendBlockMode == BM_CHAR32) {
/* Вызывает RS_SetBitMode с аргументами (rs_arr,9) в текущей последовательности операций. */
RS_SetBitMode(rs_arr,9);
/* Записывает rs_arr->flag_TIMEOUT_to_Send значением false; rs arr флаг TIMEOUT to Send. */
rs_arr->flag_TIMEOUT_to_Send=false;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFIFORESET значением 0; данные RXFIFORESET. */
rs_arr->SciRegs->SCIFFRX.bit.RXFIFORESET=0;
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFFOVRCLR значением 1; данные RXFFOVRCLR. */
rs_arr->SciRegs->SCIFFRX.bit.RXFFOVRCLR=1;
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFFINTCLR значением 1; данные RXFFINTCLR. */
rs_arr->SciRegs->SCIFFRX.bit.RXFFINTCLR=1;
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFIFORESET значением 1; данные RXFIFORESET. */
rs_arr->SciRegs->SCIFFRX.bit.RXFIFORESET=1;
/* Вызывает enableUARTInt с аргументами (rs_arr) в текущей последовательности операций. */
enableUARTInt(rs_arr);
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFFIENA значением 1; данные RXFFIENA. */
rs_arr->SciRegs->SCIFFRX.bit.RXFFIENA=1;
/* Записывает rs_arr->fifo_tx_active значением 0; данные rs_arr->fifo_tx_active. */
rs_arr->fifo_tx_active=0;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
} else {
/* Повторяет или ожидает, пока выполняется while (rs_arr->RS_SendLen < rs_arr->RS_SLength и. */
while (rs_arr->RS_SendLen < rs_arr->RS_SLength &&
/* Продолжает список аргументов, полей или выражение rs_arr->SciRegs->SCIFFTX.bit.TXFFST < 16) {; порядок элементов сохраняется. */
rs_arr->SciRegs->SCIFFTX.bit.TXFFST < 16) {
/* Проверяет if (rs_arr->RS_SendBlockMode == BM_CHAR32); последующий оператор выполняется только при истинном условии. */
if (rs_arr->RS_SendBlockMode == BM_CHAR32)
/* Записывает data значением *rs_arr->pRS_SendPtr++; данные. */
data=*rs_arr->pRS_SendPtr++;
/* Проверяет else if (rs_arr->RS_SendLen & 1U); последующий оператор выполняется только при истинном условии. */
else if (rs_arr->RS_SendLen & 1U)
/* Записывает data значением LOBYTE(*rs_arr->pRS_SendPtr++); данные. */
data=LOBYTE(*rs_arr->pRS_SendPtr++);
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else data=HIBYTE(*rs_arr->pRS_SendPtr);
/* Вызывает SCI_send с аргументами (rs_arr,data) в текущей последовательности операций. */
SCI_send(rs_arr,data);
/* Изменяет счётчик в выражении rs_arr->RS_SendLen++; на один для следующего шага. */
rs_arr->RS_SendLen++;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает rs_arr->SciRegs->SCIFFTX.bit.TXFFIL значением ; данные TXFFIL. */
rs_arr->SciRegs->SCIFFTX.bit.TXFFIL=
/* Продолжает список аргументов, полей или выражение rs_arr->RS_SendLen == rs_arr->RS_SLength ? 0 : 8;; порядок элементов сохраняется. */
rs_arr->RS_SendLen == rs_arr->RS_SLength ? 0 : 8;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает rs_arr->SciRegs->SCIFFTX.bit.TXFFINTCLR значением 1; данные TXFFINTCLR. */
rs_arr->SciRegs->SCIFFTX.bit.TXFFINTCLR=1;
/* Устанавливает биты PieCtrlRegs.PIEACK.bit.ACK9 значением 1; данные ACK9. */
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Запускает передачу через FIFO COM_1 после проверки буфера и состояния текущего обмена. */
static int RS_FifoStart(RS_DATA *rs_arr,unsigned int *buffer,unsigned long count,int mode)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет saved — данные saved. */
unsigned int saved;
/* Проверяет if (!count) return 0; последующий оператор выполняется только при истинном условии. */
if (!count) return 0;
/* Проверяет if (!buffer) return -1; последующий оператор выполняется только при истинном условии. */
if (!buffer) return -1;
RS_FifoWait(rs_arr); /* before replacing the previous transfer's counters */
RS_FifoWait(rs_arr); /* before replacing the previous transfer's counters */ /* Вызывает RS_FifoWait. Ожидает завершения аппаратной передачи FIFO и сдвигового регистра SCI. */
/* Записывает saved значением __disable_interrupts(); данные saved. */
saved=__disable_interrupts();
/* Записывает rs_arr->SciRegs->SCIFFTX.bit.TXFFIENA значением 0; данные TXFFIENA. */
rs_arr->SciRegs->SCIFFTX.bit.TXFFIENA=0;
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFFIENA значением 0; данные RXFFIENA. */
rs_arr->SciRegs->SCIFFRX.bit.RXFFIENA=0;
/* Вызывает enableUARTIntW с аргументами (rs_arr) в текущей последовательности операций. */
enableUARTIntW(rs_arr);
/* Вызывает RS_SetBitMode с аргументами (rs_arr,8) в текущей последовательности операций. */
RS_SetBitMode(rs_arr,8);
/* Записывает rs_arr->pRS_SendPtr значением buffer; данные rs_arr->pRS_SendPtr. */
rs_arr->pRS_SendPtr=buffer;
/* Записывает rs_arr->RS_SLength значением count; rs arr RS S длина. */
rs_arr->RS_SLength=count;
/* Записывает rs_arr->RS_SendLen значением 0; данные rs_arr->RS_SendLen. */
rs_arr->RS_SendLen=0;
/* Записывает rs_arr->RS_SendBlockMode значением mode; rs arr RS Send Block режим. */
rs_arr->RS_SendBlockMode=mode;
/* Записывает rs_arr->fifo_tx_active значением 1; данные rs_arr->fifo_tx_active. */
rs_arr->fifo_tx_active=1;
RS_FifoTx(rs_arr); /* prime before enabling a possibly immediate TX IRQ */
RS_FifoTx(rs_arr); /* prime before enabling a possibly immediate TX IRQ */ /* Вызывает RS_FifoTx. Заполняет TX FIFO доступными байтами, сохраняя длину и положение в передаваемом пакете. */
/* Записывает rs_arr->SciRegs->SCIFFTX.bit.TXFFIENA значением 1; данные TXFFIENA. */
rs_arr->SciRegs->SCIFFTX.bit.TXFFIENA=1;
/* Вызывает __restore_interrupts с аргументами (saved) в текущей последовательности операций. */
__restore_interrupts(saved);
/* Проверяет if (count == 1 и mode == BM_CHAR32) RS_FifoWait(rs_arr); последующий оператор выполняется только при истинном условии. */
if (count == 1 && mode == BM_CHAR32) RS_FifoWait(rs_arr);
/* Завершает RS_FifoStart и возвращает 0. */
return 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Прерывает ошибочный приём FIFO, очищает аппаратное состояние и включает защитную паузу. */
static void RS_FifoAbort(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Изменяет счётчик в выражении rs_arr->fifo_rx_errors++; на один для следующего шага. */
rs_arr->fifo_rx_errors++;
/* Проверяет if (rs_arr->SciRegs->SCIFFRX.bit.RXFFOVF) rs_arr->fifo_overflows++; последующий оператор выполняется только при истинном условии. */
if (rs_arr->SciRegs->SCIFFRX.bit.RXFFOVF) rs_arr->fifo_overflows++;
/* Записывает rs_arr->RS_DataReady значением 0; rs_arr->BS_LoadOK=0; rs arr RS данные Ready. */
rs_arr->RS_DataReady=0; rs_arr->BS_LoadOK=0;
/* Записывает rs_arr->RS_PrevCmd значением 0; rs_arr->RS_Cmd=0; данные rs_arr->RS_PrevCmd. */
rs_arr->RS_PrevCmd=0; rs_arr->RS_Cmd=0;
/* Записывает rs_arr->RS_Flag9bit значением 0; rs_arr->RS_FlagSkiping=1; rs arr RS флаг 9 бит. */
rs_arr->RS_Flag9bit=0; rs_arr->RS_FlagSkiping=1;
/* Записывает rs_arr->fifo_rx_guard значением 4; данные rs_arr->fifo_rx_guard. */
rs_arr->fifo_rx_guard=4;
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFIFORESET значением 0; данные RXFIFORESET. */
rs_arr->SciRegs->SCIFFRX.bit.RXFIFORESET=0;
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFFOVRCLR значением 1; данные RXFFOVRCLR. */
rs_arr->SciRegs->SCIFFRX.bit.RXFFOVRCLR=1;
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFFINTCLR значением 1; данные RXFFINTCLR. */
rs_arr->SciRegs->SCIFFRX.bit.RXFFINTCLR=1;
/* Проверяет if (rs_arr->SciRegs->SCIRXST.bit.RXERROR); последующий оператор выполняется только при истинном условии. */
if (rs_arr->SciRegs->SCIRXST.bit.RXERROR) {
/* Записывает rs_arr->SciRegs->SCICTL1.bit.SWRESET значением 0; данные SWRESET. */
rs_arr->SciRegs->SCICTL1.bit.SWRESET=0;
/* Записывает rs_arr->SciRegs->SCICTL1.bit.SWRESET значением 1; данные SWRESET. */
rs_arr->SciRegs->SCICTL1.bit.SWRESET=1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает rs_arr->SciRegs->SCIFFRX.bit.RXFIFORESET значением 1; данные RXFIFORESET. */
rs_arr->SciRegs->SCIFFRX.bit.RXFIFORESET=1;
/* Устанавливает биты PieCtrlRegs.PIEACK.bit.ACK9 значением 1; данные ACK9. */
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Уменьшает защитную паузу RX FIFO по миллисекундному такту. */
void RS_FifoTick1ms(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет saved — данные saved. Начальное значение задаётся справа от знака равенства. */
unsigned int saved=__disable_interrupts();
/* Объявляет p — данные p; rs_a — данные rs_a. Хранит указатель на данные. Начальное значение задаётся справа от знака равенства. */
RS_DATA *p=&rs_a;
/* Проверяет if (p->SciRegs и p->fifo_rx_guard); последующий оператор выполняется только при истинном условии. */
if (p->SciRegs && p->fifo_rx_guard) {
/* Проверяет if (p->SciRegs->SCIFFRX.bit.RXFFST) p->fifo_rx_guard=4; последующий оператор выполняется только при истинном условии. */
if (p->SciRegs->SCIFFRX.bit.RXFFST) p->fifo_rx_guard=4;
/* Проверяет else if (--p->fifo_rx_guard == 0); последующий оператор выполняется только при истинном условии. */
else if (--p->fifo_rx_guard == 0) {
/* Записывает p->RS_HeaderCnt значением 0;p->RS_RecvLen=0; данные p->RS_HeaderCnt. */
p->RS_HeaderCnt=0;p->RS_RecvLen=0;
/* Записывает p->RS_FlagBegin значением 1;p->RS_FlagSkiping=0; p RS флаг Begin. */
p->RS_FlagBegin=1;p->RS_FlagSkiping=0;
RS_SetBitMode(p,9); /* fresh address after 3..4 ms of idle */
RS_SetBitMode(p,9); /* fresh address after 3..4 ms of idle */ /* Вызывает RS_SetBitMode с аргументами (p,9) в текущей последовательности операций. */
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Вызывает __restore_interrupts с аргументами (saved) в текущей последовательности операций. */
__restore_interrupts(saved);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
+332 -96
View File
@@ -1,119 +1,197 @@
/* Команды обмена, загрузчика, чтения памяти и EEPROM. Русские пояснения сохранены в UTF-8. */
/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
/* Подключает "RS485.h": приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
#include "RS485.h"
#include "bios_dsp.h"
/* Подключает "bios_dsp.h": коды и объявления команд последовательного загрузчика. */
#include "bios_dsp.h"
/* Подключает "crc16.h": таблицы и функции вычисления контрольных сумм CRC. */
#include "crc16.h"
/* Подключает "spise2p.h": драйвер SPI EEPROM, адресация, страницы и автомат завершения операций. */
#include "spise2p.h"
/* Подключает "log_to_mem.h": двухбанковый регистратор событий нагрузки во внешней RAM. */
#include "log_to_mem.h"
//#include "flash_tools.h"
//#include "spartan_tools.h"
//#include "big_dsp_module.h"
int flag_DEBUG = false; /* Флаг отладочного режима */
int flag_DEBUG = false; /* Флаг отладочного режима */ /* Объявляет flag_DEBUG — флаг DEBUG; false — данные false. Начальное значение задаётся справа от знака равенства. */
//static unsigned int *RecvPtr;
//static int BS_LoadOK = false; /** Флаг успешности приема блока */
//static int BS_LoadOK = false; /** Флаг успешности приема блока */
/**********************************************************/
/* Прототипы функций, используемых и определенных в файле */
/* Прототипы функций, используемых и определенных в файле */
/**********************************************************/
//static int _getbyte(int *addr, int offs);
/* Начинает функцию read_memory; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
unsigned int read_memory(unsigned long addr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Завершает read_memory и возвращает (*(volatile int *)(addr)). */
return (*(volatile int *)(addr));
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию write_memory; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void write_memory(unsigned long addr, unsigned int data)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Продолжает список аргументов, полей или выражение (*(volatile int *)( addr )) = data;; порядок элементов сохраняется. */
(*(volatile int *)( addr )) = data;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Возвращает номер комманды, если есть или -1 если транзакций не было */
/** Возвращает номер комманды, если есть или -1 если транзакций не было */
/* Начинает функцию get_command; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
int get_command(RS_DATA *rs_arr)
{
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет cmd — данные cmd. */
int cmd;
/* Объявляет crc — данные crc; rcrc — данные rcrc. */
unsigned int crc, rcrc;
if(rs_arr->RS_DataReady) // Данные по RS пришли
{
/* Проверяет if(rs_arr->RS_DataReady); последующий оператор выполняется только при истинном условии. */
if(rs_arr->RS_DataReady) // Данные по RS пришли
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_arr->RS_DataReady значением false; rs arr RS данные Ready. */
rs_arr->RS_DataReady = false;
cmd = rs_arr->RS_Header[1]; // Прочитали номер команды
// Провераем длину команды дла считываниа CRC
/* Записывает cmd значением rs_arr->RS_Header[1]; данные cmd. */
cmd = rs_arr->RS_Header[1]; // Прочитали номер команды
// Провераем длину команды дла считываниа CRC
/* Проверяет if((RS_Len[cmd]<3) или (RS_Len[cmd]>MAX_RECEIVE_LENGTH)); последующий оператор выполняется только при истинном условии. */
if((RS_Len[cmd]<3) || (RS_Len[cmd]>MAX_RECEIVE_LENGTH))
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
RS_Line_to_receive(rs_arr); // режим приема RS485
/* Вызывает RS_Line_to_receive с аргументами (rs_arr) в текущей последовательности операций. */
RS_Line_to_receive(rs_arr); // режим приема RS485
/* Вызывает RS_SetBitMode с аргументами (rs_arr,9) в текущей последовательности операций. */
RS_SetBitMode(rs_arr,9);
/* Завершает get_command и возвращает -1. */
return -1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
if(cmd == CMD_LOAD) // Если команда загрузки
/* Проверяет if(cmd == CMD_LOAD); последующий оператор выполняется только при истинном условии. */
if(cmd == CMD_LOAD) // Если команда загрузки
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_arr->RS_PrevCmd значением cmd; данные rs_arr->RS_PrevCmd. */
rs_arr->RS_PrevCmd = cmd;
return cmd; // Нет проверки crc
/* Завершает get_command и возвращает cmd. */
return cmd; // Нет проверки crc
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
else // Все остальные команды
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else // Все остальные команды
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// Считываем crc из посылки
crc = (rs_arr->RS_Header[RS_Len[cmd]-1] << 8) |
// Считываем crc из посылки
/* Записывает crc значением (rs_arr->RS_Header[RS_Len[cmd]-1] << 8) |; данные crc. */
crc = (rs_arr->RS_Header[RS_Len[cmd]-1] << 8) |
/* Продолжает список аргументов, полей или выражение (rs_arr->RS_Header[RS_Len[cmd]-2]) ;; порядок элементов сохраняется. */
(rs_arr->RS_Header[RS_Len[cmd]-2]) ;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
// Рассчитываем crc из посылки
// Рассчитываем crc из посылки
/* Записывает rcrc значением 0xffff; данные rcrc. */
rcrc = 0xffff;
/* Записывает rcrc значением get_crc_16( rcrc, rs_arr->RS_Header, (RS_Len[cmd]-2) ); данные rcrc. */
rcrc = get_crc_16( rcrc, rs_arr->RS_Header, (RS_Len[cmd]-2) );
if(crc == rcrc) // Провераем crc
/* Проверяет if(crc == rcrc); последующий оператор выполняется только при истинном условии. */
if(crc == rcrc) // Провераем crc
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_arr->RS_PrevCmd значением cmd; данные rs_arr->RS_PrevCmd. */
rs_arr->RS_PrevCmd = cmd;
/* Завершает get_command и возвращает cmd. */
return cmd;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
RS_Line_to_receive(rs_arr); // режим приема RS485
/* Вызывает RS_Line_to_receive с аргументами (rs_arr) в текущей последовательности операций. */
RS_Line_to_receive(rs_arr); // режим приема RS485
/* Вызывает RS_SetBitMode с аргументами (rs_arr,9) в текущей последовательности операций. */
RS_SetBitMode(rs_arr,9);
} }
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/* Завершает get_command и возвращает -1. */
return -1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Стандартный ответ, без параметров */
/** Стандартный ответ, без параметров */
/* Начинает функцию Answer; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void Answer(RS_DATA *rs_arr,int n)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет crc — данные crc. */
int crc;
flag_DEBUG = true; // Флаг отладочного режима
/* Записывает flag_DEBUG значением true; флаг DEBUG. */
flag_DEBUG = true; // Флаг отладочного режима
/* Записывает rs_arr->buffer[0] значением rs_arr->addr_recive; rs arr буфер. */
rs_arr->buffer[0] = rs_arr->addr_recive; //CNTRL_ADDR;
/* Записывает rs_arr->buffer[1] значением n; rs arr буфер. */
rs_arr->buffer[1] = n;
/* Записывает crc значением 0xffff; данные crc. */
crc = 0xffff;
/* Записывает crc значением get_crc_16( crc, rs_arr->buffer, 2); данные crc. */
crc = get_crc_16( crc, rs_arr->buffer, 2);
/* Записывает rs_arr->buffer[2] значением LOBYTE(crc); rs arr буфер. */
rs_arr->buffer[2] = LOBYTE(crc);
/* Записывает rs_arr->buffer[3] значением HIBYTE(crc); rs arr буфер. */
rs_arr->buffer[3] = HIBYTE(crc);
/* Записывает rs_arr->buffer[4] значением 0; rs arr буфер. */
rs_arr->buffer[4] = 0;
/* Записывает rs_arr->buffer[5] значением 0; rs arr буфер. */
rs_arr->buffer[5] = 0;
/* Вызывает RS_Send. Передаёт массив слов через SCI в выбранном режиме упаковки. */
RS_Send(rs_arr,rs_arr->buffer, 6);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Внутреннаа ф-циа */
/* Внутреннаа ф-циа */
/* Начинает функцию _getbyte; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
static char _getbyte(unsigned int *addr, int32 offs)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет address — адрес. Хранит указатель на данные. */
unsigned int *address;
/* Объявляет byte — данные byte. */
unsigned int byte;
/* Записывает address значением addr + offs/2; адрес. */
address = addr + offs/2;
/* Записывает byte значением *address; данные byte. */
byte = *address;
/* Проверяет if(offs%2) return LOBYTE(byte); последующий оператор выполняется только при истинном условии. */
if(offs%2) return LOBYTE(byte);
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else return HIBYTE(byte);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* начальные установки (не работает)*/
void init(RS_DATA *rs_arr)
/* начальные установки (не работает)*/
/* Начинает функцию init; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void init(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/*
if(rs_arr->RS_Header[2]==3)
@@ -121,8 +199,8 @@ void init(RS_DATA *rs_arr)
if (rs_arr->curr_baud!=57600)
{ RS_SetLineSpeed(rs_arr,57600);
rs_arr->curr_baud= 57600;
} }
} }
if(rs_arr->RS_Header[2]==4)
{
if (rs_arr->curr_baud!=115200)
@@ -133,205 +211,325 @@ void init(RS_DATA *rs_arr)
Answer(rs_arr,CMD_INIT);
rs_arr->BS_LoadOK = false;
*/
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/**@name Комманды
* Комманды, вызываемые через последовательный канал
/**@name Комманды
* Комманды, вызываемые через последовательный канал
*/
//@{
/** Инициировать загрузку блока.
Настраивает прием блока данных */
void initload(RS_DATA *rs_arr)
/** Инициировать загрузку блока.
Настраивает прием блока данных */
/* Начинает функцию initload; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void initload(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет Address — адрес. */
unsigned long Address;
/* Записывает Address значением rs_arr->RS_Header[5] & 0xFF; адрес. */
Address = rs_arr->RS_Header[5] & 0xFF;
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[4] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[4] & 0xFF);
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[3] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[3] & 0xFF);
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[2] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[2] & 0xFF);
/* Записывает rs_arr->RS_Length значением rs_arr->RS_Header[9] & 0xFF; rs arr RS длина. */
rs_arr->RS_Length = rs_arr->RS_Header[9] & 0xFF;
/* Записывает rs_arr->RS_Length значением (rs_arr->RS_Length<<8) | (rs_arr->RS_Header[8] & 0xFF); rs arr RS длина. */
rs_arr->RS_Length = (rs_arr->RS_Length<<8) | (rs_arr->RS_Header[8] & 0xFF);
/* Записывает rs_arr->RS_Length значением (rs_arr->RS_Length<<8) | (rs_arr->RS_Header[7] & 0xFF); rs arr RS длина. */
rs_arr->RS_Length = (rs_arr->RS_Length<<8) | (rs_arr->RS_Header[7] & 0xFF);
/* Записывает rs_arr->RS_Length значением (rs_arr->RS_Length<<8) | (rs_arr->RS_Header[6] & 0xFF); rs arr RS длина. */
rs_arr->RS_Length = (rs_arr->RS_Length<<8) | (rs_arr->RS_Header[6] & 0xFF);
/* Увеличивает rs_arr->RS_Length значением 2; rs arr RS длина. */
rs_arr->RS_Length += 2;
rs_arr->pRS_RecvPtr = (unsigned int *)Address; //(unsigned int *)Address;
/* Записывает rs_arr->pRS_RecvPtr значением (unsigned int *)Address; данные rs_arr->pRS_RecvPtr. */
rs_arr->pRS_RecvPtr = (unsigned int *)Address; //(unsigned int *)Address;
/* Записывает rs_arr->pRecvPtr значением (unsigned int *)Address; данные rs_arr->pRecvPtr. */
rs_arr->pRecvPtr = (unsigned int *)Address; //(unsigned int *)Address;
/* Записывает no_write значением 1; no запись. */
no_write = 1;
/* Вызывает Answer с аргументами (rs_arr,CMD_INITLOAD) в текущей последовательности операций. */
Answer(rs_arr,CMD_INITLOAD);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Загрузка блока.
Вызываетса после загрузки блока через RS */
/** Загрузка блока.
Вызываетса после загрузки блока через RS */
/* Начинает функцию load; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void load(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет rcrc — данные rcrc; crc — данные crc. */
unsigned int rcrc, crc;
crc = (_getbyte(rs_arr->pRecvPtr, rs_arr->RS_Length-1) << 8) +
/* Записывает crc значением (_getbyte(rs_arr->pRecvPtr, rs_arr->RS_Length-1) << 8) +; данные crc. */
crc = (_getbyte(rs_arr->pRecvPtr, rs_arr->RS_Length-1) << 8) +
/* Вызывает _getbyte с аргументами (rs_arr->pRecvPtr, rs_arr->RS_Length-2) в текущей последовательности операций. */
_getbyte(rs_arr->pRecvPtr, rs_arr->RS_Length-2);
/* Записывает rs_arr->RS_Header[0] значением rs_arr->addr_recive; данные rs_arr->RS_Header. */
rs_arr->RS_Header[0] = rs_arr->addr_recive;
// CNTRL_ADDR;
// CNTRL_ADDR;
/* Записывает rs_arr->RS_Header[1] значением CMD_LOAD; данные rs_arr->RS_Header. */
rs_arr->RS_Header[1]=CMD_LOAD;
/* Записывает rcrc значением 0xffff; данные rcrc. */
rcrc = 0xffff;
/* Записывает rcrc значением get_crc_16( rcrc, rs_arr->RS_Header, 2); данные rcrc. */
rcrc = get_crc_16( rcrc, rs_arr->RS_Header, 2);
/* Записывает rcrc значением get_crc_16b( rcrc, rs_arr->pRecvPtr, rs_arr->RS_Length-2); данные rcrc. */
rcrc = get_crc_16b( rcrc, rs_arr->pRecvPtr, rs_arr->RS_Length-2);
/* Проверяет if(rcrc == crc); последующий оператор выполняется только при истинном условии. */
if(rcrc == crc)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Вызывает Answer с аргументами (rs_arr,CMD_LOAD) в текущей последовательности операций. */
Answer(rs_arr,CMD_LOAD);
/* Записывает rs_arr->BS_LoadOK значением true; данные rs_arr->BS_LoadOK. */
rs_arr->BS_LoadOK = true;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
else
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rs_arr->BS_LoadOK значением false; данные rs_arr->BS_LoadOK. */
rs_arr->BS_LoadOK = false;
RS_Line_to_receive(rs_arr); // режим приема RS485
/* Вызывает RS_Line_to_receive с аргументами (rs_arr) в текущей последовательности операций. */
RS_Line_to_receive(rs_arr); // режим приема RS485
/* Вызывает RS_SetBitMode с аргументами (rs_arr,9) в текущей последовательности операций. */
RS_SetBitMode(rs_arr,9);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/** Выполнить программу в формате Serial Boot.
@precondition Должна быть произведена загрузка блока
Адрес программы беретса из заголовка и
сравниваетса с переменной RecvPtr, заполнаемой в ф-ции load
/** Выполнить программу в формате Serial Boot.
@precondition Должна быть произведена загрузка блока
Адрес программы беретса из заголовка и
сравниваетса с переменной RecvPtr, заполнаемой в ф-ции load
@see load */
void run (RS_DATA *rs_arr)
{
return;
/* Начинает функцию run; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void run (RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Завершает run без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Прочитать ачейку памати */
/** Прочитать ачейку памати */
/* Начинает функцию peek; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void peek(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет Address — адрес. */
unsigned long Address;
/* Объявляет Data — данные; crc — данные crc. */
unsigned int Data, crc;
flag_DEBUG = true; // Флаг отладочного режима
/* Записывает flag_DEBUG значением true; флаг DEBUG. */
flag_DEBUG = true; // Флаг отладочного режима
/* Записывает Address значением rs_arr->RS_Header[5] & 0xFF; адрес. */
Address = rs_arr->RS_Header[5] & 0xFF;
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[4] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[4] & 0xFF);
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[3] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[3] & 0xFF);
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[2] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[2] & 0xFF);
/* Проверяет if(Address<PROM_LEN); последующий оператор выполняется только при истинном условии. */
if(Address<PROM_LEN)
/* Вызывает Seeprom_read. Читает EEPROM порциями; адрес задаётся словами C28x, размер переводится в число передаваемых слов. */
Seeprom_read(Address,(unsigned int *)&Data,2);
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else Data = read_memory(Address);
/* Записывает rs_arr->buffer[0] значением rs_arr->addr_recive; rs arr буфер. */
rs_arr->buffer[0] = rs_arr->addr_recive; //CNTRL_ADDR;
/* Записывает rs_arr->buffer[1] значением CMD_PEEK; rs arr буфер. */
rs_arr->buffer[1] = CMD_PEEK;
/* Записывает rs_arr->buffer[2] значением LOBYTE(Data); rs arr буфер. */
rs_arr->buffer[2] = LOBYTE(Data);
/* Записывает rs_arr->buffer[3] значением HIBYTE(Data); rs arr буфер. */
rs_arr->buffer[3] = HIBYTE(Data);
/* Записывает rs_arr->buffer[4] значением LOBYTE(CpuTimer2.InterruptCount); rs arr буфер. */
rs_arr->buffer[4] = LOBYTE(CpuTimer2.InterruptCount);
/* Записывает rs_arr->buffer[5] значением HIBYTE(CpuTimer2.InterruptCount); rs arr буфер. */
rs_arr->buffer[5] = HIBYTE(CpuTimer2.InterruptCount);
/* Записывает crc значением 0xffff; данные crc. */
crc = 0xffff;
/* Записывает crc значением get_crc_16(crc, rs_arr->buffer, 6); данные crc. */
crc = get_crc_16(crc, rs_arr->buffer, 6);
/* Записывает rs_arr->buffer[6] значением LOBYTE(crc); rs arr буфер. */
rs_arr->buffer[6] = LOBYTE(crc);
/* Записывает rs_arr->buffer[7] значением HIBYTE(crc); rs arr буфер. */
rs_arr->buffer[7] = HIBYTE(crc);
rs_arr->buffer[8] = 0;
rs_arr->buffer[9] = 0;
/* Записывает rs_arr->buffer[8] значением 0; rs arr буфер. */
rs_arr->buffer[8] = 0;
/* Записывает rs_arr->buffer[9] значением 0; rs arr буфер. */
rs_arr->buffer[9] = 0;
/* Вызывает RS_Send. Передаёт массив слов через SCI в выбранном режиме упаковки. */
RS_Send(rs_arr,rs_arr->buffer, 10);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Записать в ачейку памати */
void poke(RS_DATA *rs_arr)
/** Записать в ачейку памати */
/* Начинает функцию poke; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void poke(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет Address — адрес. */
unsigned long Address;
/* Объявляет Data — данные. */
unsigned int Data;
/* Записывает Address значением rs_arr->RS_Header[5] & 0xFF; адрес. */
Address = rs_arr->RS_Header[5] & 0xFF;
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[4] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[4] & 0xFF);
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[3] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[3] & 0xFF);
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[2] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[2] & 0xFF);
/* Записывает Data значением 0; данные. */
Data = 0;
/* Записывает Data значением (Data<<8) | (rs_arr->RS_Header[7] & 0xFF); данные. */
Data = (Data<<8) | (rs_arr->RS_Header[7] & 0xFF);
/* Записывает Data значением (Data<<8) | (rs_arr->RS_Header[6] & 0xFF); данные. */
Data = (Data<<8) | (rs_arr->RS_Header[6] & 0xFF);
/* Проверяет if(Address<PROM_LEN); последующий оператор выполняется только при истинном условии. */
if(Address<PROM_LEN)
/* Вызывает Seeprom_write. Пишет EEPROM с разделением по физическим страницам; область параметров не пересекает образ прошивки. */
Seeprom_write(Address,(unsigned int *)&Data,2);
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else write_memory(Address,Data);
/* Вызывает Answer с аргументами (rs_arr,CMD_POKE) в текущей последовательности операций. */
Answer(rs_arr,CMD_POKE);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Передать блок памати */
void upload(RS_DATA *rs_arr)
/** Передать блок памати */
/* Начинает функцию upload; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void upload(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Продолжает список аргументов, полей или выражение int32 Address, Length, crc;; порядок элементов сохраняется. */
int32 Address, Length, crc;
no_write = 1; // Флаг отладочного режима
/* Записывает no_write значением 1; no запись. */
no_write = 1; // Флаг отладочного режима
// stopp=1;
/* Записывает Address значением rs_arr->RS_Header[5] & 0xFF; адрес. */
Address = rs_arr->RS_Header[5] & 0xFF;
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[4] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[4] & 0xFF);
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[3] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[3] & 0xFF);
/* Записывает Address значением (Address<<8) | (rs_arr->RS_Header[2] & 0xFF); адрес. */
Address = (Address<<8) | (rs_arr->RS_Header[2] & 0xFF);
/* Записывает Length значением rs_arr->RS_Header[9] & 0xFF; длина. */
Length = rs_arr->RS_Header[9] & 0xFF;
/* Записывает Length значением (Length<<8) | (rs_arr->RS_Header[8] & 0xFF); длина. */
Length = (Length<<8) | (rs_arr->RS_Header[8] & 0xFF);
/* Записывает Length значением (Length<<8) | (rs_arr->RS_Header[7] & 0xFF); длина. */
Length = (Length<<8) | (rs_arr->RS_Header[7] & 0xFF);
/* Записывает Length значением (Length<<8) | (rs_arr->RS_Header[6] & 0xFF); длина. */
Length = (Length<<8) | (rs_arr->RS_Header[6] & 0xFF);
/* Записывает rs_arr->buffer[0] значением rs_arr->addr_recive; rs arr буфер. */
rs_arr->buffer[0] = rs_arr->addr_recive; //CNTRL_ADDR;
/* Записывает rs_arr->buffer[1] значением CMD_UPLOAD; rs arr буфер. */
rs_arr->buffer[1] = CMD_UPLOAD;
/* Записывает crc значением 0xffff; данные crc. */
crc = 0xffff;
crc = get_crc_16( crc, rs_arr->buffer, 2);
/* Записывает crc значением get_crc_16( crc, rs_arr->buffer, 2); данные crc. */
crc = get_crc_16( crc, rs_arr->buffer, 2);
/* Записывает crc значением get_crc_16b( crc, (unsigned int *)Address, Length); данные crc. */
crc = get_crc_16b( crc, (unsigned int *)Address, Length);
RS_Send(rs_arr,rs_arr->buffer, 1); // <=2 байт по флагу
rs_arr->buffer[0] = CMD_UPLOAD;
RS_Send(rs_arr,rs_arr->buffer, 1); // <=2 байт по флагу
/* Вызывает RS_Send. Передаёт массив слов через SCI в выбранном режиме упаковки. */
RS_Send(rs_arr,rs_arr->buffer, 1); // <=2 байт по флагу
/* Записывает rs_arr->buffer[0] значением CMD_UPLOAD; rs arr буфер. */
rs_arr->buffer[0] = CMD_UPLOAD;
/* Вызывает RS_Send. Передаёт массив слов через SCI в выбранном режиме упаковки. */
RS_Send(rs_arr,rs_arr->buffer, 1); // <=2 байт по флагу
/* Вызывает RS_Wait4OK с аргументами (rs_arr) в текущей последовательности операций. */
RS_Wait4OK(rs_arr);
/* Вызывает RS_BSend. Передаёт последовательность 8-битных октетов, упакованных в слова C28x. */
RS_BSend(rs_arr,(unsigned int*)Address, Length);
/* Вызывает RS_Wait4OK с аргументами (rs_arr) в текущей последовательности операций. */
RS_Wait4OK(rs_arr);
/* Записывает rs_arr->buffer[0] значением LOBYTE(crc); rs arr буфер. */
rs_arr->buffer[0] = LOBYTE(crc);
/* Записывает rs_arr->buffer[1] значением HIBYTE(crc); rs arr буфер. */
rs_arr->buffer[1] = HIBYTE(crc);
/* Записывает rs_arr->buffer[2] значением 0; rs arr буфер. */
rs_arr->buffer[2] = 0;
/* Записывает rs_arr->buffer[3] значением 0; rs arr буфер. */
rs_arr->buffer[3] = 0;
/* Вызывает RS_Send. Передаёт массив слов через SCI в выбранном режиме упаковки. */
RS_Send(rs_arr,rs_arr->buffer, 4+2);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Прошить XILINX.
@precondition Должна быть произведена загрузка блока
Адрес и длина прошивки беретса из заголовка и
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load,
так же смотрит магическое слово в начале прошивки
/** Прошить XILINX.
@precondition Должна быть произведена загрузка блока
Адрес и длина прошивки беретса из заголовка и
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load,
так же смотрит магическое слово в начале прошивки
@see load */
void xflash(RS_DATA *rs_arr)
/* Начинает функцию xflash; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void xflash(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Завершает xflash без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Прошить TMS.
@precondition Должна быть произведена загрузка блока
Адрес и длина прошивки беретса из заголовка и
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load
/** Прошить TMS.
@precondition Должна быть произведена загрузка блока
Адрес и длина прошивки беретса из заголовка и
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load
@see load */
void tflash(RS_DATA *rs_arr)
/* Начинает функцию tflash; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void tflash(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// volatile unsigned long Address1,Address2;
// volatile unsigned long Length, LengthW;
/*
if(!rs_arr->BS_LoadOK)
if(!rs_arr->BS_LoadOK)
{
RS_Line_to_receive(rs_arr); // режим приема RS485
RS_Line_to_receive(rs_arr); // режим приема RS485
RS_SetBitMode(rs_arr,9);
return;
}
@@ -354,9 +552,9 @@ void tflash(RS_DATA *rs_arr)
LengthW = Length/2;
if (LengthW*2<Length) LengthW++;
if( (Address2 < 0x100000) || (Address2 > 0x180000) || ((Address2+LengthW) > 0x180000) )
if( (Address2 < 0x100000) || (Address2 > 0x180000) || ((Address2+LengthW) > 0x180000) )
{
RS_Line_to_receive(rs_arr); // режим приема RS485
RS_Line_to_receive(rs_arr); // режим приема RS485
RS_SetBitMode(rs_arr,9);
return;
}
@@ -364,61 +562,99 @@ void tflash(RS_DATA *rs_arr)
run_flash_data(Address1,Address2, LengthW );
Answer(rs_arr,CMD_TFLASH);
*/
*/
/* Завершает tflash без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/** Прошить TMS.
@precondition Должна быть произведена загрузка блока
Адрес и длина прошивки беретса из заголовка и
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load
/** Прошить TMS.
@precondition Должна быть произведена загрузка блока
Адрес и длина прошивки беретса из заголовка и
сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load
@see load */
void extendbios(RS_DATA *rs_arr)
/* Начинает функцию extendbios; назначение модуля — команды обмена, загрузчика, чтения памяти и EEPROM. */
void extendbios(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет Address1 — адрес 1; Address2 — адрес 2; Length — длина. volatile требует фактического чтения или записи при каждом доступе. */
volatile unsigned long Address1,Address2,Length;
/* Объявляет code — данные code. */
unsigned int code;
/* Записывает Address1 значением rs_arr->RS_Header[5] & 0xFF; адрес 1. */
Address1 = rs_arr->RS_Header[5] & 0xFF;
/* Записывает Address1 значением (Address1<<8) | (rs_arr->RS_Header[4] & 0xFF); адрес 1. */
Address1 = (Address1<<8) | (rs_arr->RS_Header[4] & 0xFF);
/* Записывает Address1 значением (Address1<<8) | (rs_arr->RS_Header[3] & 0xFF); адрес 1. */
Address1 = (Address1<<8) | (rs_arr->RS_Header[3] & 0xFF);
/* Записывает Address1 значением (Address1<<8) | (rs_arr->RS_Header[2] & 0xFF); адрес 1. */
Address1 = (Address1<<8) | (rs_arr->RS_Header[2] & 0xFF);
/* Записывает Address2 значением rs_arr->RS_Header[9] & 0xFF; адрес 2. */
Address2 = rs_arr->RS_Header[9] & 0xFF;
/* Записывает Address2 значением (Address2<<8) | (rs_arr->RS_Header[8] & 0xFF); адрес 2. */
Address2 = (Address2<<8) | (rs_arr->RS_Header[8] & 0xFF);
/* Записывает Address2 значением (Address2<<8) | (rs_arr->RS_Header[7] & 0xFF); адрес 2. */
Address2 = (Address2<<8) | (rs_arr->RS_Header[7] & 0xFF);
/* Записывает Address2 значением (Address2<<8) | (rs_arr->RS_Header[6] & 0xFF); адрес 2. */
Address2 = (Address2<<8) | (rs_arr->RS_Header[6] & 0xFF);
/* Записывает Length значением rs_arr->RS_Header[13] & 0xFF; длина. */
Length = rs_arr->RS_Header[13] & 0xFF;
/* Записывает Length значением (Length<<8) | (rs_arr->RS_Header[12] & 0xFF); длина. */
Length = (Length<<8) | (rs_arr->RS_Header[12] & 0xFF);
/* Записывает Length значением (Length<<8) | (rs_arr->RS_Header[11] & 0xFF); длина. */
Length = (Length<<8) | (rs_arr->RS_Header[11] & 0xFF);
/* Записывает Length значением (Length<<8) | (rs_arr->RS_Header[10] & 0xFF); длина. */
Length = (Length<<8) | (rs_arr->RS_Header[10] & 0xFF);
/* Записывает code значением rs_arr->RS_Header[14] & 0xFF; данные code. */
code=rs_arr->RS_Header[14] & 0xFF;
/* Вызывает switch с аргументами ( code ) в текущей последовательности операций. */
switch ( code )
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// Прошиваем EPROM Из RAM
// Прошиваем EPROM Из RAM
/* Условие компиляции EEPROM_M95M02: выбранный блок включается в текущий вариант прошивки. */
#if EEPROM_M95M02
/* 0x44 is intentionally rejected by old firmware. Conversely this build
* rejects legacy code 4, preventing writes with the wrong GUI profile. */
/* Ветвь выбора для 0x44; выполняется при совпадении селектора switch. */
case 0x44:
/* Выбирает альтернативный блок текущего условия компиляции. */
#else
/* Ветвь выбора для 4; выполняется при совпадении селектора switch. */
case 4:
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Проверяет if (!Length или Address1 >= BALSAM167_EEPROM_FIRMWARE_BYTES/2UL или; последующий оператор выполняется только при истинном условии. */
if (!Length || Address1 >= BALSAM167_EEPROM_FIRMWARE_BYTES/2UL ||
/* Продолжает список аргументов, полей или выражение Length > BALSAM167_EEPROM_FIRMWARE_BYTES-Address1*2UL) return;; порядок элементов сохраняется. */
Length > BALSAM167_EEPROM_FIRMWARE_BYTES-Address1*2UL) return;
/* Вызывает Seeprom_write. Пишет EEPROM с разделением по физическим страницам; область параметров не пересекает образ прошивки. */
Seeprom_write(Address1,(unsigned int*)Address2,Length);
break;
// Читаем из EPROM в RAM
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
// Читаем из EPROM в RAM
/* Ветвь выбора для 5; выполняется при совпадении селектора switch. */
case 5: Seeprom_read(Address1,(unsigned int*)Address2,Length);
break;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Обрабатывает значения селектора, для которых нет отдельной ветви case. */
default:
/* Завершает extendbios без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Вызывает Answer с аргументами (rs_arr,CMD_EXTEND) в текущей последовательности операций. */
Answer(rs_arr,CMD_EXTEND);
/* Завершает extendbios без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
//@}
+32 -14
View File
@@ -1,33 +1,51 @@
/* Собственный и универсальный адрес устройства. Русские пояснения сохранены в UTF-8. */
/* Подключает "cntrl_adr.h": собственный и универсальный адрес устройства. */
#include "cntrl_adr.h"
/* Задаёт ADDR_FOR_ALL_DEF = 10; данные ADDR_FOR_ALL_DEF. */
#define ADDR_FOR_ALL_DEF 10
/* Задаёт ADDR_ANSWER_DEF = 0x33; данные ADDR_ANSWER_DEF. */
#define ADDR_ANSWER_DEF 0x33
/* Задаёт ADDR_TERMINAL_DEF = 11; данные ADDR_TERMINAL_DEF. */
#define ADDR_TERMINAL_DEF 11
/* Задаёт ADDR_UNIVERSAL_DEF = 10; данные ADDR_UNIVERSAL_DEF. */
#define ADDR_UNIVERSAL_DEF 10
/** Óñòàíîâêà àäðåñà êîíòðîëëåðà äëà ïîñûëêè âñåì ÀÈÍàì */
int ADDR_FOR_ALL = ADDR_FOR_ALL_DEF;
/** Óñòàíîâêà àäðåñà êîíòðîëëåðà äëà ïîñûëêè îòâåòà */
const int ADDR_ANSWER = ADDR_ANSWER_DEF;
/** Установка адреса контроллера дла посылки всем АИНам */
/* Объявляет ADDR_FOR_ALL — данные ADDR_FOR_ALL; ADDR_FOR_ALL_DEF — данные ADDR_FOR_ALL_DEF. Начальное значение задаётся справа от знака равенства. */
int ADDR_FOR_ALL = ADDR_FOR_ALL_DEF;
/** Óñòàíîâêà àäðåñà òåðìèíàëà äëà ïîñûëêè îòâåòà */
const int ADDR_TERMINAL = ADDR_TERMINAL_DEF;
/** Установка адреса контроллера дла посылки ответа */
/* Объявляет ADDR_ANSWER — данные ADDR_ANSWER; ADDR_ANSWER_DEF — данные ADDR_ANSWER_DEF. Начальное значение задаётся справа от знака равенства. */
const int ADDR_ANSWER = ADDR_ANSWER_DEF;
/* Óíèâåðñàëüíûé àäðåñ êîíòðîëëåðà */
/** Установка адреса терминала дла посылки ответа */
/* Объявляет ADDR_TERMINAL — данные ADDR_TERMINAL; ADDR_TERMINAL_DEF — данные ADDR_TERMINAL_DEF. Начальное значение задаётся справа от знака равенства. */
const int ADDR_TERMINAL = ADDR_TERMINAL_DEF;
/* Универсальный адрес контроллера */
/* Объявляет CNTRL_ADDR_UNIVERSAL — данные CNTRL_ADDR_UNIVERSAL; ADDR_UNIVERSAL_DEF — данные ADDR_UNIVERSAL_DEF. Начальное значение задаётся справа от знака равенства. */
const int CNTRL_ADDR_UNIVERSAL=ADDR_UNIVERSAL_DEF;
/* Àäðåñ êîíòðîëëåðà */
/* Адрес контроллера */
/* Объявляет CNTRL_ADDR — данные CNTRL_ADDR. Начальное значение задаётся справа от знака равенства. */
int CNTRL_ADDR=1;
/* Объявляет cntr_addr_c — данные cntr_addr_c. */
int cntr_addr_c;
int cntr_addr_c_all;
/** Óñòàíîâêà àäðåñà êîíòðîëëåðà äëà ïðîøèâêè */
/* Объявляет cntr_addr_c_all — данные cntr_addr_c_all. */
int cntr_addr_c_all;
/** Установка адреса контроллера дла прошивки */
/* Устанавливает собственный и универсальный адрес для проверки адресованных команд. */
void set_cntrl_addr (int cntrl_addr,int cntrl_addr_for_all)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает CNTRL_ADDR значением cntrl_addr; данные CNTRL_ADDR. */
CNTRL_ADDR = cntrl_addr;
/* Записывает ADDR_FOR_ALL значением cntrl_addr_for_all; данные ADDR_FOR_ALL. */
ADDR_FOR_ALL = cntrl_addr_for_all;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
+173 -16
View File
@@ -1,196 +1,353 @@
/* Таблицы и функции вычисления контрольных сумм CRC. Русские пояснения сохранены в UTF-8. */
/* Подключает "crc16.h": таблицы и функции вычисления контрольных сумм CRC. */
#include "crc16.h"
#define MAKE_TABS 0 /* Builds tables below */
#define FAST_CRC 1 /* If fast CRC should be used */
#define MAKE_TABS 0 /* Builds tables below */ /* Задаёт MAKE_TABS = 0; данные MAKE_TABS. */
#define FAST_CRC 1 /* If fast CRC should be used */ /* Задаёт FAST_CRC = 1; данные FAST_CRC. */
/* Задаёт ONLY_CRC16 = 1; данные ONLY_CRC16. */
#define ONLY_CRC16 1
/* Задаёт Poln = 0xA001; данные Poln. */
#define Poln 0xA001
/* Условие компиляции FAST_CRC & !MAKE_TABS: выбранный блок включается в текущий вариант прошивки. */
#if FAST_CRC & !MAKE_TABS
/* Условие компиляции !ONLY_CRC16: выбранный блок включается в текущий вариант прошивки. */
#if !ONLY_CRC16
/* Продолжает список аргументов, полей или выражение static WORD crc_ccitt_tab[] = {; порядок элементов сохраняется. */
static WORD crc_ccitt_tab[] = {
/* Элемент постоянной таблицы 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,; порядок значений совпадает с порядком индексов потребителя. */
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
/* Элемент постоянной таблицы 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,; порядок значений совпадает с порядком индексов потребителя. */
0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
/* Элемент постоянной таблицы 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,; порядок значений совпадает с порядком индексов потребителя. */
0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
/* Элемент постоянной таблицы 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,; порядок значений совпадает с порядком индексов потребителя. */
0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
/* Элемент постоянной таблицы 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,; порядок значений совпадает с порядком индексов потребителя. */
0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
/* Элемент постоянной таблицы 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,; порядок значений совпадает с порядком индексов потребителя. */
0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
/* Элемент постоянной таблицы 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,; порядок значений совпадает с порядком индексов потребителя. */
0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
/* Элемент постоянной таблицы 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,; порядок значений совпадает с порядком индексов потребителя. */
0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
/* Элемент постоянной таблицы 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,; порядок значений совпадает с порядком индексов потребителя. */
0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
/* Элемент постоянной таблицы 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,; порядок значений совпадает с порядком индексов потребителя. */
0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
/* Элемент постоянной таблицы 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,; порядок значений совпадает с порядком индексов потребителя. */
0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
/* Элемент постоянной таблицы 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,; порядок значений совпадает с порядком индексов потребителя. */
0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
/* Элемент постоянной таблицы 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,; порядок значений совпадает с порядком индексов потребителя. */
0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
/* Элемент постоянной таблицы 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,; порядок значений совпадает с порядком индексов потребителя. */
0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
/* Элемент постоянной таблицы 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,; порядок значений совпадает с порядком индексов потребителя. */
0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
/* Элемент постоянной таблицы 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,; порядок значений совпадает с порядком индексов потребителя. */
0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
/* Элемент постоянной таблицы 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,; порядок значений совпадает с порядком индексов потребителя. */
0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
/* Элемент постоянной таблицы 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,; порядок значений совпадает с порядком индексов потребителя. */
0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
/* Элемент постоянной таблицы 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,; порядок значений совпадает с порядком индексов потребителя. */
0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
/* Элемент постоянной таблицы 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,; порядок значений совпадает с порядком индексов потребителя. */
0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
/* Элемент постоянной таблицы 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,; порядок значений совпадает с порядком индексов потребителя. */
0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
/* Элемент постоянной таблицы 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,; порядок значений совпадает с порядком индексов потребителя. */
0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
/* Элемент постоянной таблицы 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,; порядок значений совпадает с порядком индексов потребителя. */
0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
/* Элемент постоянной таблицы 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,; порядок значений совпадает с порядком индексов потребителя. */
0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
/* Элемент постоянной таблицы 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,; порядок значений совпадает с порядком индексов потребителя. */
0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
/* Элемент постоянной таблицы 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,; порядок значений совпадает с порядком индексов потребителя. */
0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
/* Элемент постоянной таблицы 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,; порядок значений совпадает с порядком индексов потребителя. */
0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
/* Элемент постоянной таблицы 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,; порядок значений совпадает с порядком индексов потребителя. */
0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
/* Элемент постоянной таблицы 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,; порядок значений совпадает с порядком индексов потребителя. */
0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
/* Элемент постоянной таблицы 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,; порядок значений совпадает с порядком индексов потребителя. */
0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
/* Элемент постоянной таблицы 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,; порядок значений совпадает с порядком индексов потребителя. */
0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
/* Элемент постоянной таблицы 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0; порядок значений совпадает с порядком индексов потребителя. */
0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
};
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Продолжает список аргументов, полей или выражение WORD crc_16_tab[] = {; порядок элементов сохраняется. */
WORD crc_16_tab[] = {
/* Элемент постоянной таблицы 0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241,; порядок значений совпадает с порядком индексов потребителя. */
0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241,
/* Элемент постоянной таблицы 0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440,; порядок значений совпадает с порядком индексов потребителя. */
0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440,
/* Элемент постоянной таблицы 0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40,; порядок значений совпадает с порядком индексов потребителя. */
0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40,
/* Элемент постоянной таблицы 0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841,; порядок значений совпадает с порядком индексов потребителя. */
0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841,
/* Элемент постоянной таблицы 0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40,; порядок значений совпадает с порядком индексов потребителя. */
0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40,
/* Элемент постоянной таблицы 0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41,; порядок значений совпадает с порядком индексов потребителя. */
0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41,
/* Элемент постоянной таблицы 0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641,; порядок значений совпадает с порядком индексов потребителя. */
0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641,
/* Элемент постоянной таблицы 0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040,; порядок значений совпадает с порядком индексов потребителя. */
0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040,
/* Элемент постоянной таблицы 0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240,; порядок значений совпадает с порядком индексов потребителя. */
0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240,
/* Элемент постоянной таблицы 0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441,; порядок значений совпадает с порядком индексов потребителя. */
0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441,
/* Элемент постоянной таблицы 0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41,; порядок значений совпадает с порядком индексов потребителя. */
0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41,
/* Элемент постоянной таблицы 0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840,; порядок значений совпадает с порядком индексов потребителя. */
0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840,
/* Элемент постоянной таблицы 0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41,; порядок значений совпадает с порядком индексов потребителя. */
0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41,
/* Элемент постоянной таблицы 0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40,; порядок значений совпадает с порядком индексов потребителя. */
0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40,
/* Элемент постоянной таблицы 0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640,; порядок значений совпадает с порядком индексов потребителя. */
0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640,
/* Элемент постоянной таблицы 0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041,; порядок значений совпадает с порядком индексов потребителя. */
0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041,
/* Элемент постоянной таблицы 0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240,; порядок значений совпадает с порядком индексов потребителя. */
0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240,
/* Элемент постоянной таблицы 0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441,; порядок значений совпадает с порядком индексов потребителя. */
0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441,
/* Элемент постоянной таблицы 0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41,; порядок значений совпадает с порядком индексов потребителя. */
0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41,
/* Элемент постоянной таблицы 0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840,; порядок значений совпадает с порядком индексов потребителя. */
0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840,
/* Элемент постоянной таблицы 0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41,; порядок значений совпадает с порядком индексов потребителя. */
0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41,
/* Элемент постоянной таблицы 0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40,; порядок значений совпадает с порядком индексов потребителя. */
0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40,
/* Элемент постоянной таблицы 0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640,; порядок значений совпадает с порядком индексов потребителя. */
0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640,
/* Элемент постоянной таблицы 0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041,; порядок значений совпадает с порядком индексов потребителя. */
0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041,
/* Элемент постоянной таблицы 0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241,; порядок значений совпадает с порядком индексов потребителя. */
0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241,
/* Элемент постоянной таблицы 0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440,; порядок значений совпадает с порядком индексов потребителя. */
0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440,
/* Элемент постоянной таблицы 0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40,; порядок значений совпадает с порядком индексов потребителя. */
0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40,
/* Элемент постоянной таблицы 0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841,; порядок значений совпадает с порядком индексов потребителя. */
0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841,
/* Элемент постоянной таблицы 0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40,; порядок значений совпадает с порядком индексов потребителя. */
0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40,
/* Элемент постоянной таблицы 0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41,; порядок значений совпадает с порядком индексов потребителя. */
0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41,
/* Элемент постоянной таблицы 0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641,; порядок значений совпадает с порядком индексов потребителя. */
0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641,
/* Элемент постоянной таблицы 0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040; порядок значений совпадает с порядком индексов потребителя. */
0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
};
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции !ONLY_CRC16: выбранный блок включается в текущий вариант прошивки. */
#if !ONLY_CRC16
/* CRC-CCITT is based on the polynomial x^16 + x^12 + x^5 + 1. Bits */
/* are sent MSB to LSB. */
/* Начинает функцию get_crc_ccitt; назначение модуля — таблицы и функции вычисления контрольных сумм CRC. */
unsigned int get_crc_ccitt(unsigned int crc,unsigned int *buf,unsigned long size )
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Условие компиляции !(FAST_CRC & !MAKE_TABS): выбранный блок включается в текущий вариант прошивки. */
#if !(FAST_CRC & !MAKE_TABS)
/* Продолжает список аргументов, полей или выражение register int i;; порядок элементов сохраняется. */
register int i;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Повторяет или ожидает, пока выполняется while (size--). */
while (size--) {
/* Условие компиляции FAST_CRC & !MAKE_TABS: выбранный блок включается в текущий вариант прошивки. */
#if FAST_CRC & !MAKE_TABS
/* Записывает crc значением (crc << 8) ^ crc_ccitt_tab[ (crc >> 8) ^ *buf++ ]; данные crc. */
crc = (crc << 8) ^ crc_ccitt_tab[ (crc >> 8) ^ *buf++ ];
/* Выбирает альтернативный блок текущего условия компиляции. */
#else
/* Инвертирует биты crc значением (WORD)(*buf++) << 8; данные crc. */
crc ^= (WORD)(*buf++) << 8;
/* Цикл for (i = 0; i < 8; i++) ; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 8; i++) {
/* Проверяет if (crc & 0x8000); последующий оператор выполняется только при истинном условии. */
if (crc & 0x8000)
/* Записывает crc значением (crc << 1) ^ 0x1021; данные crc. */
crc = (crc << 1) ^ 0x1021;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Продолжает список аргументов, полей или выражение crc <<= 1;; порядок элементов сохраняется. */
crc <<= 1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Продолжает список аргументов, полей или выражение } return crc;; порядок элементов сохраняется. */
} return crc;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* CRC-16 is based on the polynomial x^16 + x^15 + x^2 + 1. Bits are */
/* sent LSB to MSB. */
/* Начинает функцию get_crc_16; назначение модуля — таблицы и функции вычисления контрольных сумм CRC. */
unsigned int get_crc_16(unsigned int crc,unsigned int *buf,unsigned long size )
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Условие компиляции !(FAST_CRC & !MAKE_TABS): выбранный блок включается в текущий вариант прошивки. */
#if !(FAST_CRC & !MAKE_TABS)
/* Продолжает список аргументов, полей или выражение register unsigned int i;; порядок элементов сохраняется. */
register unsigned int i;
/* Продолжает список аргументов, полей или выражение register unsigned int ch;; порядок элементов сохраняется. */
register unsigned int ch;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Повторяет или ожидает, пока выполняется while (size--). */
while (size--) {
/* Условие компиляции FAST_CRC & !MAKE_TABS: выбранный блок включается в текущий вариант прошивки. */
#if FAST_CRC & !MAKE_TABS
/* Записывает crc значением (crc >> 8) ^ crc_16_tab[ (crc ^ *buf++) & 0xff ]; данные crc. */
crc = (crc >> 8) ^ crc_16_tab[ (crc ^ *buf++) & 0xff ];
/* Записывает crc значением crc & 0xffff; данные crc. */
crc = crc & 0xffff;
/* Выбирает альтернативный блок текущего условия компиляции. */
#else
/* Записывает ch значением *buf++; данные ch. */
ch = *buf++;
/* Цикл for (i = 0; i < 8; i++) ; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 8; i++) {
/* Проверяет if ((crc ^ ch) & 1); последующий оператор выполняется только при истинном условии. */
if ((crc ^ ch) & 1)
/* Записывает crc значением (crc >> 1) ^ 0xa001; данные crc. */
crc = (crc >> 1) ^ 0xa001;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Продолжает список аргументов, полей или выражение crc >>= 1;; порядок элементов сохраняется. */
crc >>= 1;
/* Продолжает список аргументов, полей или выражение ch >>= 1;; порядок элементов сохраняется. */
ch >>= 1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Продолжает список аргументов, полей или выражение } return (crc & 0xffff);; порядок элементов сохраняется. */
} return (crc & 0xffff);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию get_crc_16b; назначение модуля — таблицы и функции вычисления контрольных сумм CRC. */
unsigned int get_crc_16b(unsigned int crc,unsigned int *buf,unsigned long size )
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет x — данные x; dword — данные dword; byte — данные byte. */
unsigned int x, dword, byte;
/* Объявляет i — данные i. */
unsigned long i;
for (i = 0; i < size; i++)
/* Цикл for (i = 0; i < size; i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < size; i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает x значением i % 2; данные x. */
x = i % 2;
dword = buf[i/2];
// dword = *buf;
if (x == 0)
/* Записывает dword значением buf[i/2]; данные dword. */
dword = buf[i/2];
// dword = *buf;
/* Проверяет if (x == 0); последующий оператор выполняется только при истинном условии. */
if (x == 0)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает byte значением ((dword >> 8)&0xFF); данные byte. */
byte = ((dword >> 8)&0xFF);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
if (x == 1)
/* Проверяет if (x == 1); последующий оператор выполняется только при истинном условии. */
if (x == 1)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает byte значением (dword & 0xFF); данные byte. */
byte = (dword & 0xFF);
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает crc значением (crc >> 8) ^ crc_16_tab[ (crc ^ (byte) ) & 0xff ]; данные crc. */
crc = (crc >> 8) ^ crc_16_tab[ (crc ^ (byte) ) & 0xff ];
/* Записывает crc значением crc & 0xffff; данные crc. */
crc = crc & 0xffff;
// crc = crc + ((byte) & 0xff);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Завершает get_crc_16b и возвращает (crc & 0xffff). */
return (crc & 0xffff);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию get_crc16; назначение модуля — таблицы и функции вычисления контрольных сумм CRC. */
int get_crc16(unsigned int *buf, int size )
{
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет crc16 — данные crc16; i — данные i; j — данные j. */
int crc16,i,j;
/* Записывает crc16 значением 0xFFFF; данные crc16. */
crc16=0xFFFF;
/* Цикл for(i=0;i<size;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<size;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает crc16 значением crc16^(buf[i]&0xFF); данные crc16. */
crc16=crc16^(buf[i]&0xFF);
/* Цикл for (j=0;j<8;j++); задаёт начальное значение, условие продолжения и шаг перебора. */
for (j=0;j<8;j++)
/* Проверяет if(crc16&1) crc16=(crc16>>1)^Poln; последующий оператор выполняется только при истинном условии. */
if(crc16&1) crc16=(crc16>>1)^Poln;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else crc16=crc16>>1;
/* Записывает crc16 значением crc16^((buf[i]>>8)&0xFF); данные crc16. */
crc16=crc16^((buf[i]>>8)&0xFF);
/* Цикл for (j=0;j<8;j++); задаёт начальное значение, условие продолжения и шаг перебора. */
for (j=0;j<8;j++)
/* Проверяет if(crc16&1) crc16=(crc16>>1)^Poln; последующий оператор выполняется только при истинном условии. */
if(crc16&1) crc16=(crc16>>1)^Poln;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else crc16=crc16>>1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Завершает get_crc16 и возвращает crc16. */
return crc16;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
+278 -35
View File
@@ -1,294 +1,490 @@
/* Штатный eCAN и отдельный служебный обмен УМП/GAS. Русские пояснения сохранены в UTF-8. */
/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
/* Подключает "DSP2833x_SWPrioritizedIsrLevels.h": поставляемое TI описание SWPrioritizedIsrLevels для семейства C2833x. */
#include "DSP2833x_SWPrioritizedIsrLevels.h"
/* Подключает "filter_bat2.h": накопительный фильтр измерительных каналов. */
#include "filter_bat2.h"
/* Подключает "measure.h": обработка датчиков, вычисление величин и миллисекундный такт системы. */
#include "measure.h"
/* Подключает "package.h": адреса устройств, типы плат и псевдонимы технологических регистров. */
#include "package.h" // DSP281x Headerfile Include File
/* Подключает "ecan.h": штатный eCAN и отдельный служебный обмен УМП/GAS. */
#include "ecan.h" // DSP281x Headerfile Include File
/* Подключает "tools.h": настройка внешней памяти и служебные задержки. */
#include "tools.h" // DSP281x Headerfile Include File
/* Подключает "RS485.h": приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
#include "RS485.h"
/* Подключает "message.h": обработка Modbus, заводские параметры и сохранение настроек. */
#include "message.h"
/* Подключает "peripher.h": перемычки режима платы, дискретные входы и выходы. */
#include "peripher.h"
/* Подключает "log_to_mem.h": двухбанковый регистратор событий нагрузки во внешней RAM. */
#include "log_to_mem.h"
/* Подключает "DAC.h": выход ЦАП и автомат защиты нагрузки с проверкой напряжения и свежести CAN. */
#include "DAC.h"
/* Подключает "ump_can_protocol.h": настройки и интерфейс ump_can_protocol. */
#include "ump_can_protocol.h"
/* Подключает "gas167.h": дополнительная карта GAS 167/v1 только для новой EEPROM M95M02. */
#include "gas167.h"
// Prototype statements for functions found within this file.
/* Принимает CAN в прерывании, разбирает служебный запрос или передаёт данные штатному протоколу. */
interrupt void CANa_handler(void);
/* Объявляет интерфейс функции CANa_reset_err; реализация вызывается через этот прототип. */
interrupt void CANa_reset_err(void);
// Global variable for this example
/* Объявляет ErrorCount — ошибка число. */
Uint32 ErrorCount;
/* Объявляет MessageReceivedCount — Message Received число. */
Uint32 MessageReceivedCount;
/* Объявляет MessageTransivedCount — Message Transived число. Начальное значение задаётся справа от знака равенства. */
Uint32 MessageTransivedCount=0;
/* Объявляет TestMbox1 — данные TestMbox1. Начальное значение задаётся справа от знака равенства. */
Uint32 TestMbox1 = 0;
/* Объявляет TestMbox2 — данные TestMbox2. Начальное значение задаётся справа от знака равенства. */
Uint32 TestMbox2 = 0;
/* Объявляет TestMbox3 — данные TestMbox3. Начальное значение задаётся справа от знака равенства. */
Uint32 TestMbox3 = 0;
/* Объявляет CanTimeOutErrorTR — CAN Time Out ошибка TR. Начальное значение задаётся справа от знака равенства. */
int CanTimeOutErrorTR = 0;
/* Объявляет wait — данные wait. Начальное значение задаётся справа от знака равенства. */
int wait=0;
/* MBOX2 выделен под ответы регистратора; штатный MBOX0 продолжает
* передавать технологические данные независимо. ISR только ставит запрос,
* а снимок и отправка короткими шагами выполняются в основном цикле. */
/* MBOX2 выделен под ответы регистратора; штатный MBOX0 продолжает
* передавать технологические данные независимо. ISR только ставит запрос,
* а снимок и отправка короткими шагами выполняются в основном цикле. */
/* Объявляет ump_can_pending — флаг ожидающего запроса служебного CAN между ISR и главным циклом. volatile требует фактического чтения или записи при каждом доступе. */
static volatile unsigned int ump_can_pending;
/* Объявляет ump_can_tag — ump CAN tag; ump_can_address — ump CAN адрес; ump_can_value — ump CAN value. volatile требует фактического чтения или записи при каждом доступе. */
static volatile unsigned int ump_can_tag, ump_can_address, ump_can_value;
/* Объявляет ump_can_reply — замороженные слова ответа служебного CAN. */
static unsigned int ump_can_reply[UMP_CAN_MAX_WORDS];
/* Объявляет ump_can_length — ump CAN длина; ump_can_index — ump CAN index; ump_can_reply_tag — ump CAN reply tag. */
static unsigned int ump_can_length, ump_can_index, ump_can_reply_tag;
/* Объявляет ump_can_waiting — ump CAN waiting. */
static unsigned int ump_can_waiting;
/* Объявляет ump_can_sent_at — время последней передачи фрагмента ответа CAN. */
static unsigned long ump_can_sent_at;
/* Настраивает eCAN, скорость, почтовые ящики и маршрутизацию прерываний для выбранного режима платы. */
void InitCan(int Port, int DevNum)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
struct ECAN_REGS ECanShadow;
/* Описывает структуру ECAN_REGS ECanShadow;; порядок полей определяет расположение данных. */
struct ECAN_REGS ECanShadow;
/* Продолжает список аргументов, полей или выражение volatile struct ECAN_REGS * ECanRegs;; порядок элементов сохраняется. */
volatile struct ECAN_REGS * ECanRegs;
/* Продолжает список аргументов, полей или выражение volatile struct ECAN_MBOXES * ECanMboxes;; порядок элементов сохраняется. */
volatile struct ECAN_MBOXES * ECanMboxes;
/* Продолжает список аргументов, полей или выражение volatile struct MOTO_REGS * ECanMOTORegs;; порядок элементов сохраняется. */
volatile struct MOTO_REGS * ECanMOTORegs;
/* Объявляет id — данные id. Начальное значение задаётся справа от знака равенства. */
long id = 0x80BA0000;
/* Изменяет счётчик в выражении DevNum--; на один для следующего шага. */
DevNum--;
/* Проверяет if(DevNum<0)DevNum=0; последующий оператор выполняется только при истинном условии. */
if(DevNum<0)DevNum=0;
/* Проверяет if(DevNum>15)DevNum=15; последующий оператор выполняется только при истинном условии. */
if(DevNum>15)DevNum=15;
// Configure CAN pins using GPIO regs here
/* Разрешение записи в защищённые регистры периферии. */
EALLOW;
/* Записывает ECanRegs значением &ECanaRegs; E CAN Regs. */
ECanRegs = &ECanaRegs;
/* Записывает ECanMboxes значением &ECanaMboxes; E CAN Mboxes. */
ECanMboxes = &ECanaMboxes;
/* Записывает ECanMOTORegs значением &ECanaMOTORegs; E CAN MOTO Regs. */
ECanMOTORegs = &ECanaMOTORegs;
/* Записывает GpioCtrlRegs.GPAMUX2.bit.GPIO30 значением 1; аппаратная линия ввода/вывода GPIO30. */
GpioCtrlRegs.GPAMUX2.bit.GPIO30 = 1;
/* Записывает GpioCtrlRegs.GPAMUX2.bit.GPIO31 значением 1; аппаратная линия ввода/вывода GPIO31. */
GpioCtrlRegs.GPAMUX2.bit.GPIO31 = 1;
// Configure the eCAN RX and TX pins for eCAN transmissions
/* Записывает ECanRegs->CANTIOC.all значением 8; представление регистра целым словом без разбиения на битовые поля. */
ECanRegs->CANTIOC.all = 8; // only 3rd bit, TXFUNC, is significant
/* Записывает ECanRegs->CANRIOC.all значением 8; представление регистра целым словом без разбиения на битовые поля. */
ECanRegs->CANRIOC.all = 8; // only 3rd bit, RXFUNC, is significant
// Specify that 8 bits will be sent/received
/* Записывает ECanMboxes->MBOX0.MSGCTRL.all значением 0x00000008; представление регистра целым словом без разбиения на битовые поля. */
ECanMboxes->MBOX0.MSGCTRL.all = 0x00000008;
/* Записывает ECanMboxes->MBOX1.MSGCTRL.all значением 0x00000008; представление регистра целым словом без разбиения на битовые поля. */
ECanMboxes->MBOX1.MSGCTRL.all = 0x00000008;
/* Записывает ECanMboxes->MBOX2.MSGCTRL.all значением 0x00000008; представление регистра целым словом без разбиения на битовые поля. */
ECanMboxes->MBOX2.MSGCTRL.all = 0x00000008;
// Disable all Mailboxes
// Required before writing the MSGIDs
/* Записывает ECanRegs->CANME.all значением 0; представление регистра целым словом без разбиения на битовые поля. */
ECanRegs->CANME.all = 0;
// задаем адрес 0 ащикa на передачу
ECanMboxes->MBOX0.MSGID.all = id + 0x10 + DevNum;
// задаем адрес 0 ащикa на передачу
/* Записывает ECanMboxes->MBOX0.MSGID.all значением id + 0x10 + DevNum; представление регистра целым словом без разбиения на битовые поля. */
ECanMboxes->MBOX0.MSGID.all = id + 0x10 + DevNum;
// задаем адрес 1 ащикa на прием
ECanMboxes->MBOX1.MSGID.all = id + DevNum; //поменать!!!! 1 и 0!!!
// задаем адрес 1 ащикa на прием
/* Записывает ECanMboxes->MBOX1.MSGID.all значением id + DevNum; представление регистра целым словом без разбиения на битовые поля. */
ECanMboxes->MBOX1.MSGID.all = id + DevNum; //поменать!!!! 1 и 0!!!
// MBOX0 и MBOX2 передают данные; MBOX1 принимает команды.
// MBOX0 и MBOX2 передают данные; MBOX1 принимает команды.
/* Записывает ECanMboxes->MBOX2.MSGID.all значением id + 0x20 + DevNum; представление регистра целым словом без разбиения на битовые поля. */
ECanMboxes->MBOX2.MSGID.all = id + 0x20 + DevNum;
/* Записывает ECanRegs->CANMD.all значением 0xFFFFFFFA; представление регистра целым словом без разбиения на битовые поля. */
ECanRegs->CANMD.all = 0xFFFFFFFA;
// Включаем три mailbox: телеметрия, команды и ответы логгера.
// Включаем три mailbox: телеметрия, команды и ответы логгера.
/* Записывает ECanRegs->CANME.all значением 0x00000007; представление регистра целым словом без разбиения на битовые поля. */
ECanRegs->CANME.all = 0x00000007;
// Clear all TAn bits
/* Записывает ECanRegs->CANTA.all значением 0xFFFFFFFF; представление регистра целым словом без разбиения на битовые поля. */
ECanRegs->CANTA.all = 0xFFFFFFFF;
// Clear all RMPn bits
/* Записывает ECanRegs->CANRMP.all значением 0xFFFFFFFF; представление регистра целым словом без разбиения на битовые поля. */
ECanRegs->CANRMP.all = 0xFFFFFFFF;
// Clear all interrupt flag bits
/* Записывает ECanRegs->CANGIF0.all значением 0xFFFFFFFF; представление регистра целым словом без разбиения на битовые поля. */
ECanRegs->CANGIF0.all = 0xFFFFFFFF;
/* Записывает ECanRegs->CANGIF1.all значением 0xFFFFFFFF; представление регистра целым словом без разбиения на битовые поля. */
ECanRegs->CANGIF1.all = 0xFFFFFFFF;
// Clear all error and status bits
/* Записывает ECanRegs->CANES.all значением 0xffffffff; представление регистра целым словом без разбиения на битовые поля. */
ECanRegs->CANES.all=0xffffffff;
// Request permission to change the configuration registers
/* Записывает ECanShadow.CANMC.all значением 0; представление регистра целым словом без разбиения на битовые поля. */
ECanShadow.CANMC.all = 0;
/* Записывает ECanShadow.CANMC.bit.MBCC значением 1; данные MBCC. */
ECanShadow.CANMC.bit.MBCC = 1; // Mailbox timestamp counter clear bit
/* Записывает ECanShadow.CANMC.bit.TCC значением 1; данные TCC. */
ECanShadow.CANMC.bit.TCC = 1; // Time stamp counter MSB clear bit
/* Записывает ECanShadow.CANMC.bit.SCB значением 1; данные SCB. */
ECanShadow.CANMC.bit.SCB = 1; // eCAN mode (reqd to access 32 mailboxes)
/* Записывает ECanShadow.CANMC.bit.WUBA значением 1; данные WUBA. */
ECanShadow.CANMC.bit.WUBA = 1; // Wake up on bus activity
/* Записывает ECanShadow.CANMC.bit.ABO значением 1; данные ABO. */
ECanShadow.CANMC.bit.ABO = 1; // Auto bus on
ECanShadow.CANMC.bit.CCR = 1;
/* Записывает ECanShadow.CANMC.bit.CCR значением 1; данные CCR. */
ECanShadow.CANMC.bit.CCR = 1;
// ECanShadow.CANMC.bit.STM = 1; // self-test loop-back
/* Записывает ECanRegs->CANMC.all значением ECanShadow.CANMC.all; представление регистра целым словом без разбиения на битовые поля. */
ECanRegs->CANMC.all = ECanShadow.CANMC.all;
/* Повторяет или ожидает, пока выполняется while(!ECanRegs->CANES.bit.CCE);. */
while(!ECanRegs->CANES.bit.CCE); // Wait for CCE bit to be set..
// настриваем скорость CAN
// настриваем скорость CAN
/* Записывает ECanShadow.CANBTC.all значением ECanRegs->CANBTC.all; представление регистра целым словом без разбиения на битовые поля. */
ECanShadow.CANBTC.all = ECanRegs->CANBTC.all;
/* Записывает ECanShadow.CANBTC.bit.SJWREG значением 1; данные SJWREG. */
ECanShadow.CANBTC.bit.SJWREG=1;
/* Записывает ECanShadow.CANBTC.bit.BRPREG значением (CLKMULT * 3) - 1; данные BRPREG. */
ECanShadow.CANBTC.bit.BRPREG = (CLKMULT * 3) - 1;
/* Записывает ECanShadow.CANBTC.bit.TSEG1REG значением 15; данные TSEG1REG. */
ECanShadow.CANBTC.bit.TSEG1REG = 15;
/* Записывает ECanShadow.CANBTC.bit.TSEG2REG значением 2; данные TSEG2REG. */
ECanShadow.CANBTC.bit.TSEG2REG = 2;
/* Записывает ECanRegs->CANBTC.all значением ECanShadow.CANBTC.all; представление регистра целым словом без разбиения на битовые поля. */
ECanRegs->CANBTC.all = ECanShadow.CANBTC.all;
/* Записывает ECanShadow.CANMC.bit.CCR значением 0; данные CCR. */
ECanShadow.CANMC.bit.CCR = 0; // Set CCR = 0
/* Записывает ECanRegs->CANMC.all значением ECanShadow.CANMC.all; представление регистра целым словом без разбиения на битовые поля. */
ECanRegs->CANMC.all = ECanShadow.CANMC.all;
/* Повторяет или ожидает, пока выполняется while(ECanRegs->CANES.bit.CCE);. */
while(ECanRegs->CANES.bit.CCE); // Wait for CCE bit to be cleared..
// задаем таймауты дла ожиданиа отправки получениа посылки
// задаем таймауты дла ожиданиа отправки получениа посылки
/* Записывает ECanMOTORegs->MOTO0 значением 550000; E CAN MOTO Regs 0. */
ECanMOTORegs->MOTO0 = 550000;
/* Записывает ECanMOTORegs->MOTO1 значением 550000; E CAN MOTO Regs 1. */
ECanMOTORegs->MOTO1 = 550000;
/* Записывает ECanRegs->CANTOC.all значением 1; представление регистра целым словом без разбиения на битовые поля. */
ECanRegs->CANTOC.all = 1;
/* Записывает ECanRegs->CANTOS.all значением 0; представление регистра целым словом без разбиения на битовые поля. */
ECanRegs->CANTOS.all = 0; // clear all time-out flags
/* Записывает ECanRegs->CANTSC значением 0; E CAN Regs CANTSC. */
ECanRegs->CANTSC = 0; // clear time-out counter
/* Записывает ECanShadow.CANGIM.all значением 0; представление регистра целым словом без разбиения на битовые поля. */
ECanShadow.CANGIM.all = 0;
/* Записывает ECanRegs->CANMIM.all значением 2; представление регистра целым словом без разбиения на битовые поля. */
ECanRegs->CANMIM.all = 2; // Enable interrupts of box 1
/* Записывает ECanRegs->CANMIL.all значением 0x00000000; представление регистра целым словом без разбиения на битовые поля. */
ECanRegs->CANMIL.all = 0x00000000; // All mailbox interrupts are generated on interrupt line 0.
/* Записывает ECanShadow.CANGIM.bit.I0EN значением 1; данные I0EN. */
ECanShadow.CANGIM.bit.I0EN = 1;
/* Записывает ECanShadow.CANGIM.bit.MTOM значением 1; данные MTOM. */
ECanShadow.CANGIM.bit.MTOM = 1;
/* Записывает ECanShadow.CANGIM.bit.I1EN значением 1; данные I1EN. */
ECanShadow.CANGIM.bit.I1EN = 1;
/* Записывает ECanShadow.CANGIM.bit.GIL значением 1; данные GIL. */
ECanShadow.CANGIM.bit.GIL = 1;
/* Записывает ECanRegs->CANGIM.all значением ECanShadow.CANGIM.all; представление регистра целым словом без разбиения на битовые поля. */
ECanRegs->CANGIM.all = ECanShadow.CANGIM.all;
/* Записывает PieVectTable.ECAN0INTA значением &CANa_handler; данные ECAN0INTA. */
PieVectTable.ECAN0INTA = &CANa_handler;
/* Записывает PieCtrlRegs.PIEIER9.bit.INTx5 значением 1; данные INTx5. */
PieCtrlRegs.PIEIER9.bit.INTx5=1; // PIE Group 9, INT6
/* Записывает PieVectTable.ECAN1INTA значением &CANa_reset_err; данные ECAN1INTA. */
PieVectTable.ECAN1INTA = &CANa_reset_err;
/* Записывает PieCtrlRegs.PIEIER9.bit.INTx6 значением 1; данные INTx6. */
PieCtrlRegs.PIEIER9.bit.INTx6=1; // PIE Group 9, INT6
/* Устанавливает биты IER значением M_INT9; регистр разрешения прерываний ядра C28x. */
IER |= M_INT9; // Enable CPU INT
/* Закрытие доступа к защищённым регистрам периферии. */
EDIS;
// завершили настройку CAN ащиков
// завершили настройку CAN ащиков
/* Записывает MessageReceivedCount значением 0; Message Received число. */
MessageReceivedCount = 0;
/* Записывает ErrorCount значением 0; ошибка число. */
ErrorCount = 0;
/* Записывает CanTimeOutErrorTR значением 0; CAN Time Out ошибка TR. */
CanTimeOutErrorTR=0;
/* Записывает MessageTransivedCount значением 0; Message Transived число. */
MessageTransivedCount=0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Упаковывает адрес и технологические слова в штатный CAN-кадр и запускает передачу mailbox. */
void CAN_send(int Port, int data[], int Addr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет hiword — данные hiword; loword — данные loword. */
unsigned long hiword,loword;
/* Продолжает список аргументов, полей или выражение volatile struct ECAN_REGS * ECanRegs;; порядок элементов сохраняется. */
volatile struct ECAN_REGS * ECanRegs;
/* Продолжает список аргументов, полей или выражение volatile struct ECAN_MBOXES * ECanMboxes;; порядок элементов сохраняется. */
volatile struct ECAN_MBOXES * ECanMboxes;
/* Записывает ECanRegs значением &ECanaRegs; E CAN Regs. */
ECanRegs = &ECanaRegs;
/* Записывает ECanMboxes значением &ECanaMboxes; E CAN Mboxes. */
ECanMboxes = &ECanaMboxes;
/* Проверяет if(wait); последующий оператор выполняется только при истинном условии. */
if(wait)
/* Проверяет if(!(ECanRegs->CANTA.all & 1)); последующий оператор выполняется только при истинном условии. */
if(!(ECanRegs->CANTA.all & 1))
/* Проверяет if(!(ECanRegs->CANAA.all & 1)); последующий оператор выполняется только при истинном условии. */
if(!(ECanRegs->CANAA.all & 1))
/* Завершает CAN_send без возвращаемого значения. */
return;
/* Записывает ECanRegs->CANTA.all значением 1; представление регистра целым словом без разбиения на битовые поля. */
ECanRegs->CANTA.all = 1;
/* Записывает ECanRegs->CANAA.all значением 1; представление регистра целым словом без разбиения на битовые поля. */
ECanRegs->CANAA.all = 1;
/* Записывает hiword значением ((((Uint32) Addr ) & 0xffff)<<16)| 0xE0000000 |; данные hiword. */
hiword= ((((Uint32) Addr ) & 0xffff)<<16)| 0xE0000000 |
/* Продолжает список аргументов, полей или выражение ((((Uint32)data[Addr ]) & 0xffff) );; порядок элементов сохраняется. */
((((Uint32)data[Addr ]) & 0xffff) );
/* Записывает loword значением ((((Uint32)data[Addr+1]) & 0xffff)<<16)|; данные loword. */
loword= ((((Uint32)data[Addr+1]) & 0xffff)<<16)|
/* Продолжает список аргументов, полей или выражение ((((Uint32)data[Addr+2]) & 0xffff) );; порядок элементов сохраняется. */
((((Uint32)data[Addr+2]) & 0xffff) );
/* Записывает ECanMboxes->MBOX0.MDH.all значением hiword; представление регистра целым словом без разбиения на битовые поля. */
ECanMboxes->MBOX0.MDH.all = hiword;
/* Записывает ECanMboxes->MBOX0.MDL.all значением loword; представление регистра целым словом без разбиения на битовые поля. */
ECanMboxes->MBOX0.MDL.all = loword;
/* Разрешение записи в защищённые регистры периферии. */
EALLOW;
/* Записывает ECanRegs->CANTSC значением 0; E CAN Regs CANTSC. */
ECanRegs->CANTSC = 0; // clear time-out counter
/* Закрытие доступа к защищённым регистрам периферии. */
EDIS;
ECanRegs->CANTRS.all = 1; // запустить передачу
/* Записывает ECanRegs->CANTRS.all значением 1; представление регистра целым словом без разбиения на битовые поля. */
ECanRegs->CANTRS.all = 1; // запустить передачу
/* Записывает wait значением 1; данные wait. */
wait=1;
/* Вызывает led1_toggle с аргументами () в текущей последовательности операций. */
led1_toggle();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию Handlai; назначение модуля — штатный eCAN и отдельный служебный обмен УМП/GAS. */
void Handlai(volatile struct ECAN_MBOXES * ECanMboxes)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет adr — данные adr. */
unsigned int adr;
/* Объявляет bit — представление регистра отдельными битовыми полями. */
unsigned int bit[3];
/* Объявляет hiword — данные hiword; loword — данные loword. */
unsigned long hiword,loword;
/* Объявляет Data — данные. */
int Data[3];
/* Записывает Lonely значением 0; данные Lonely. */
Lonely=0;
/* Записывает hiword значением ECanMboxes->MBOX1.MDH.all; данные hiword. */
hiword = ECanMboxes->MBOX1.MDH.all;
/* Записывает loword значением ECanMboxes->MBOX1.MDL.all; данные loword. */
loword = ECanMboxes->MBOX1.MDL.all;
/* Служебный запрос логгера не является командой УМП и сам не должен
* заполнять журнал CAN-событиями при онлайн-чтении. Короткие кадры
* отбрасываются: незаполненные байты mailbox могли остаться от прошлого. */
/* Служебный запрос логгера не является командой УМП и сам не должен
* заполнять журнал CAN-событиями при онлайн-чтении. Короткие кадры
* отбрасываются: незаполненные байты mailbox могли остаться от прошлого. */
/* Проверяет if ((unsigned int)(hiword >> 16) == UMP_CAN_MARKER); последующий оператор выполняется только при истинном условии. */
if ((unsigned int)(hiword >> 16) == UMP_CAN_MARKER) {
/* Проверяет if (ECanMboxes->MBOX1.MSGCTRL.bit.DLC == 8 и (hiword & 0xFF00UL)); последующий оператор выполняется только при истинном условии. */
if (ECanMboxes->MBOX1.MSGCTRL.bit.DLC == 8 && (hiword & 0xFF00UL)) {
/* Записывает ump_can_tag значением (unsigned int)hiword; ump CAN tag. */
ump_can_tag = (unsigned int)hiword;
/* Записывает ump_can_address значением (unsigned int)(loword >> 16); ump CAN адрес. */
ump_can_address = (unsigned int)(loword >> 16);
/* Записывает ump_can_value значением (unsigned int)loword; ump CAN value. */
ump_can_value = (unsigned int)loword;
/* Записывает ump_can_pending значением 1; флаг ожидающего запроса служебного CAN между ISR и главным циклом. */
ump_can_pending = 1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Завершает Handlai без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает adr значением (hiword >> 16); данные adr. */
adr = (hiword >> 16);
/* Записывает bit[0] значением adr & 0x8000; представление регистра отдельными битовыми полями. */
bit[0] = adr & 0x8000;
/* Записывает bit[1] значением adr & 0x4000; представление регистра отдельными битовыми полями. */
bit[1] = adr & 0x4000;
/* Записывает bit[2] значением adr & 0x2000; представление регистра отдельными битовыми полями. */
bit[2] = adr & 0x2000;
/* Оставляет биты маски adr значением 0x1fff; данные adr. */
adr &= 0x1fff;
/* Записывает Data[0] значением (hiword ) & 0xffff; данные. */
Data[0] = (hiword ) & 0xffff;
/* Записывает Data[1] значением (loword>>16) & 0xffff; данные. */
Data[1] = (loword>>16) & 0xffff;
/* Записывает Data[2] значением (loword ) & 0xffff; данные. */
Data[2] = (loword ) & 0xffff;
/* Проверяет if(bit[0]) if(adr < ANSWER_LEN и; последующий оператор выполняется только при истинном условии. */
if(bit[0]) if(adr < ANSWER_LEN &&
/* Записывает modbus[adr] значением Data[0]; adr++; массив технологических регистров; слово int на C28x занимает 16 бит. */
!(Desk == dsk_LOAD && (adr == 0x7CU || adr == 0x7DU))) modbus[adr] = Data[0]; adr++;
/* Проверяет if(bit[1]) if(adr < ANSWER_LEN и; последующий оператор выполняется только при истинном условии. */
if(bit[1]) if(adr < ANSWER_LEN &&
/* Записывает modbus[adr] значением Data[1]; adr++; массив технологических регистров; слово int на C28x занимает 16 бит. */
!(Desk == dsk_LOAD && (adr == 0x7CU || adr == 0x7DU))) modbus[adr] = Data[1]; adr++;
/* Проверяет if(bit[2]) if(adr < ANSWER_LEN и; последующий оператор выполняется только при истинном условии. */
if(bit[2]) if(adr < ANSWER_LEN &&
/* Записывает modbus[adr] значением Data[2]; массив технологических регистров; слово int на C28x занимает 16 бит. */
!(Desk == dsk_LOAD && (adr == 0x7CU || adr == 0x7DU))) modbus[adr] = Data[2];
/* Фиксируем применённую команду до выхода из обработчика CAN. */
/* Фиксируем применённую команду до выхода из обработчика CAN. */
/* A short frame cannot confirm voltage freshness. Service frames
* UMP_MARKER return above and do not refresh this timeout. */
/* Проверяет if (ECanMboxes->MBOX1.MSGCTRL.bit.DLC == 8); последующий оператор выполняется только при истинном условии. */
if (ECanMboxes->MBOX1.MSGCTRL.bit.DLC == 8)
/* Вызывает Load_voltage_can. Принимает напряжение выбранной нагрузки из достоверных слов CAN и сбрасывает возраст только нужного измерения. */
Load_voltage_can((unsigned int)(hiword >> 16), Data[0], Data[1], Data[2]);
/* Вызывает ump_log_can. Обновляет последние CAN-данные и напряжения для следующего снимка регистратора. */
ump_log_can((unsigned int)(hiword >> 16), Data[0], Data[1], Data[2]);
/* Вызывает led2_toggle с аргументами () в текущей последовательности операций. */
led2_toggle();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Принимает CAN в прерывании, разбирает служебный запрос или передаёт данные штатному протоколу. */
interrupt void CANa_handler(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// Set interrupt priority:
/* Объявляет TempPIEIER — сохранённая маска разрешённых прерываний группы PIE. volatile требует фактического чтения или записи при каждом доступе. Начальное значение задаётся справа от знака равенства. */
volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER9.all;
/* Устанавливает биты IER значением M_INT9; регистр разрешения прерываний ядра C28x. */
IER |= M_INT9;
/* Оставляет биты маски IER значением MINT9; регистр разрешения прерываний ядра C28x. */
IER &= MINT9; // Set "global" priority
/* Оставляет биты маски PieCtrlRegs.PIEIER9.all значением MG95; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEIER9.all &= MG95; // Set "group" priority
/* Записывает PieCtrlRegs.PIEACK.all значением 0xFFFF; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
/* Разрешение маскируемых прерываний ядра. */
EINT;
/* Вызывает Handlai с аргументами (&ECanaMboxes) в текущей последовательности операций. */
Handlai(&ECanaMboxes);
/* Записывает ECanaRegs.CANRMP.all значением 2; представление регистра целым словом без разбиения на битовые поля. */
ECanaRegs.CANRMP.all = 2;
/* Устанавливает биты PieCtrlRegs.PIEACK.bit.ACK9 значением 1; данные ACK9. */
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
// Restore registers saved:
/* Запрет маскируемых прерываний ядра. */
DINT;
/* Записывает PieCtrlRegs.PIEIER9.all значением TempPIEIER; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEIER9.all = TempPIEIER;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию CANa_reset_err; назначение модуля — штатный eCAN и отдельный служебный обмен УМП/GAS. */
interrupt void CANa_reset_err(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// Set interrupt priority:
/* Объявляет TempPIEIER — сохранённая маска разрешённых прерываний группы PIE. volatile требует фактического чтения или записи при каждом доступе. Начальное значение задаётся справа от знака равенства. */
volatile Uint16 TempPIEIER = PieCtrlRegs.PIEIER9.all;
/* Устанавливает биты IER значением M_INT9; регистр разрешения прерываний ядра C28x. */
IER |= M_INT9;
/* Оставляет биты маски IER значением MINT9; регистр разрешения прерываний ядра C28x. */
IER &= MINT9; // Set "global" priority
/* Оставляет биты маски PieCtrlRegs.PIEIER9.all значением MG96; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEIER9.all &= MG96; // Set "group" priority
/* Записывает PieCtrlRegs.PIEACK.all значением 0xFFFF; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEACK.all = 0xFFFF; // Enable PIE interrupts
/* Разрешение маскируемых прерываний ядра. */
EINT;
/* Записывает ECanaRegs.CANTRR.all значением 1; представление регистра целым словом без разбиения на битовые поля. */
ECanaRegs.CANTRR.all = 1;
/* Изменяет счётчик в выражении CanTimeOutErrorTR++; на один для следующего шага. */
CanTimeOutErrorTR++;
/* Устанавливает биты PieCtrlRegs.PIEACK.bit.ACK9 значением 1; данные ACK9. */
PieCtrlRegs.PIEACK.bit.ACK9 |= 1;
// Restore registers saved:
/* Запрет маскируемых прерываний ядра. */
DINT;
/* Записывает PieCtrlRegs.PIEIER9.all значением TempPIEIER; представление регистра целым словом без разбиения на битовые поля. */
PieCtrlRegs.PIEIER9.all = TempPIEIER;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
//===========================================================================
@@ -296,59 +492,106 @@ interrupt void CANa_reset_err(void)
//===========================================================================
/* Один вызов обслуживает максимум один кадр и никогда не ждёт ACK в цикле.
* Снимок фиксируется один раз на запрос: CAN-фрагменты не смешивают
* значения до/после переключения кольцевого банка. Новые запросы забираем
* после завершения предыдущего ответа. GUI держит только один запрос. */
/* Один вызов обслуживает максимум один кадр и никогда не ждёт ACK в цикле.
* Снимок фиксируется один раз на запрос: CAN-фрагменты не смешивают
* значения до/после переключения кольцевого банка. Новые запросы забираем
* после завершения предыдущего ответа. GUI держит только один запрос. */
/* В главном цикле готовит замороженный ответ служебного CAN и отправляет его двухсловными фрагментами. */
void UMP_CAN_service(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет saved — данные saved; tag — данные tag; address — адрес; value — данные value; error — ошибка. */
unsigned int saved, tag, address, value, error;
/* Объявляет hiword — данные hiword; loword — данные loword. */
uint32_t hiword, loword;
/* Проверяет if (ump_can_waiting); последующий оператор выполняется только при истинном условии. */
if (ump_can_waiting) {
/* Проверяет if (ECanaRegs.CANTA.all & 4UL); последующий оператор выполняется только при истинном условии. */
if (ECanaRegs.CANTA.all & 4UL) {
/* Записывает ECanaRegs.CANTA.all значением 4UL; представление регистра целым словом без разбиения на битовые поля. */
ECanaRegs.CANTA.all = 4UL;
/* Записывает ump_can_waiting значением 0; ump CAN waiting. */
ump_can_waiting = 0;
/* Проверяет else if ((ECanaRegs.CANAA.all & 4UL) или; последующий оператор выполняется только при истинном условии. */
} else if ((ECanaRegs.CANAA.all & 4UL) ||
/* Продолжает список аргументов, полей или выражение ((unsigned long)CpuTimer1.InterruptCount - ump_can_sent_at > 250UL)) {; порядок элементов сохраняется. */
((unsigned long)CpuTimer1.InterruptCount - ump_can_sent_at > 250UL)) {
/* Нет подтверждения шины: отменяем только служебный mailbox.
* GUI обнаружит неполный ответ по тайм-ауту; управление MBOX0
* и приём команд MBOX1 продолжаются. */
/* Нет подтверждения шины: отменяем только служебный mailbox.
* GUI обнаружит неполный ответ по тайм-ауту; управление MBOX0
* и приём команд MBOX1 продолжаются. */
/* Записывает ECanaRegs.CANTRR.all значением 4UL; представление регистра целым словом без разбиения на битовые поля. */
ECanaRegs.CANTRR.all = 4UL;
/* До фактического завершения отмены mailbox не переиспользуем. */
/* До фактического завершения отмены mailbox не переиспользуем. */
/* Проверяет if (!(ECanaRegs.CANAA.all & 4UL)) return; последующий оператор выполняется только при истинном условии. */
if (!(ECanaRegs.CANAA.all & 4UL)) return;
/* Записывает ECanaRegs.CANAA.all значением 4UL; представление регистра целым словом без разбиения на битовые поля. */
ECanaRegs.CANAA.all = 4UL;
/* Записывает ump_can_waiting значением 0; ump CAN waiting. */
ump_can_waiting = 0;
/* Записывает ump_can_length значением 0; ump CAN длина. */
ump_can_length = 0;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
} else return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if (ump_can_index >= ump_can_length и ump_can_pending); последующий оператор выполняется только при истинном условии. */
if (ump_can_index >= ump_can_length && ump_can_pending) {
/* Записывает saved значением __disable_interrupts(); данные saved. */
saved = __disable_interrupts();
/* Записывает tag значением ump_can_tag; address = ump_can_address; value = ump_can_value; данные tag. */
tag = ump_can_tag; address = ump_can_address; value = ump_can_value;
/* Записывает ump_can_pending значением 0; флаг ожидающего запроса служебного CAN между ISR и главным циклом. */
ump_can_pending = 0;
/* Проверяет if (address >= 0x1300U и address < 0x1308U); последующий оператор выполняется только при истинном условии. */
if (address >= 0x1300U && address < 0x1308U)
/* Записывает ump_can_length значением Load_protection_prepare(tag & 0xFF, address, value, ump_can_reply, &error); ump CAN длина. */
ump_can_length = Load_protection_prepare(tag & 0xFF, address, value, ump_can_reply, &error);
/* Условие компиляции EEPROM_M95M02: выбранный блок включается в текущий вариант прошивки. */
#if EEPROM_M95M02
/* Проверяет else if (gas167_contains(address)); последующий оператор выполняется только при истинном условии. */
else if (gas167_contains(address))
/* Записывает ump_can_length значением gas167_prepare(tag & 0xFF, address, value, 1, ump_can_reply, &error); ump CAN длина. */
ump_can_length = gas167_prepare(tag & 0xFF, address, value, 1, ump_can_reply, &error);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else ump_can_length = ump_can_prepare(tag & 0xFF, address, value, ump_can_reply, &error);
/* Записывает ump_can_reply_tag значением (tag & 0xFF00) | error; ump CAN reply tag. */
ump_can_reply_tag = (tag & 0xFF00) | error;
/* Записывает ump_can_index значением 0; ump CAN index. */
ump_can_index = 0;
/* Вызывает __restore_interrupts с аргументами (saved) в текущей последовательности операций. */
__restore_interrupts(saved);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if (ump_can_index >= ump_can_length) return; последующий оператор выполняется только при истинном условии. */
if (ump_can_index >= ump_can_length) return;
/* Перед следующим фрагментом уступаем штатной телеметрии MBOX0. */
/* Перед следующим фрагментом уступаем штатной телеметрии MBOX0. */
/* Проверяет if (ECanaRegs.CANTRS.all & 1UL) return; последующий оператор выполняется только при истинном условии. */
if (ECanaRegs.CANTRS.all & 1UL) return;
/* Проверяет if (!ump_tms28335_fragment(ump_can_reply, ump_can_length, ump_can_index/2,; последующий оператор выполняется только при истинном условии. */
if (!ump_tms28335_fragment(ump_can_reply, ump_can_length, ump_can_index/2,
/* Продолжает список аргументов, полей или выражение ump_can_reply_tag >> 8, ump_can_reply_tag & 255U, &loword, &hiword)) {; порядок элементов сохраняется. */
ump_can_reply_tag >> 8, ump_can_reply_tag & 255U, &loword, &hiword)) {
/* Записывает ump_can_length значением 0; ump CAN длина. */
ump_can_length = 0;
/* Завершает UMP_CAN_service без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает ECanaRegs.CANTA.all значением 4UL; ECanaRegs.CANAA.all = 4UL; представление регистра целым словом без разбиения на битовые поля. */
ECanaRegs.CANTA.all = 4UL; ECanaRegs.CANAA.all = 4UL;
/* Записывает ECanaMboxes.MBOX2.MDH.all значением hiword; представление регистра целым словом без разбиения на битовые поля. */
ECanaMboxes.MBOX2.MDH.all = hiword;
/* Записывает ECanaMboxes.MBOX2.MDL.all значением loword; представление регистра целым словом без разбиения на битовые поля. */
ECanaMboxes.MBOX2.MDL.all = loword;
/* Записывает ump_can_sent_at значением CpuTimer1.InterruptCount; время последней передачи фрагмента ответа CAN. */
ump_can_sent_at = CpuTimer1.InterruptCount;
/* Записывает ECanaRegs.CANTRS.all значением 4UL; представление регистра целым словом без разбиения на битовые поля. */
ECanaRegs.CANTRS.all = 4UL;
/* Записывает ump_can_waiting значением 1; ump CAN waiting. */
ump_can_waiting = 1;
/* Увеличивает ump_can_index значением 2; ump CAN index. */
ump_can_index += 2;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
+15 -2
View File
@@ -1,18 +1,31 @@
/* Накопительный фильтр измерительных каналов. Русские пояснения сохранены в UTF-8. */
/* Подключает "filter_bat2.h": накопительный фильтр измерительных каналов. */
#include "filter_bat2.h"
/* Обновляет скользящий фильтр измерительного канала и его накопленные значения. */
float filterbat(FILTERBAT *b, float InpVarCurr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет y — данные y. */
float y;
y = (b->k_0 * (InpVarCurr + (b->i_0*2) + b->i_1)) +
/* Записывает y значением (b->k_0 * (InpVarCurr + (b->i_0*2) + b->i_1)) +; данные y. */
y = (b->k_0 * (InpVarCurr + (b->i_0*2) + b->i_1)) +
/* Продолжает список аргументов, полей или выражение (b->k_1 * b->u_0) + (b->k_2 * b->u_1);; порядок элементов сохраняется. */
(b->k_1 * b->u_0) + (b->k_2 * b->u_1);
/* Записывает b->u_1 значением b->u_0; данные b->u_1. */
b->u_1=b->u_0;
/* Записывает b->u_0 значением y; данные b->u_0. */
b->u_0=y;
/* Записывает b->i_1 значением b->i_0; данные b->i_1. */
b->i_1=b->i_0;
/* Записывает b->i_0 значением InpVarCurr; данные b->i_0. */
b->i_0=InpVarCurr;
/* Завершает filterbat и возвращает y. */
return y;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
+59 -5
View File
@@ -1,63 +1,117 @@
/* Дополнительная карта GAS 167/v1 только для новой EEPROM M95M02. Русские пояснения сохранены в UTF-8. */
/* Подключает границы GAS и общий выбор EEPROM; при профиле 0 интерфейс GAS исключён. */
#include "gas167.h"
/* Весь дополнительный код включается только для физически установленной M95M02; вариант AT25256B не растёт. */
#if EEPROM_M95M02
/* Подключает тип платы dsk_LOAD и псевдонимы регистров, чтобы сохранять правила обычного Modbus. */
#include "package.h"
/* Использует существующие технологические регистры без копии массива и без добавления RAM. */
extern int modbus[];
/* Тип платы нужен для ограничений записи статусов и тайм-аута нагрузки. */
extern int Desk;
/* Вызывает штатную регистрацию изменения команды; нового регистратора GAS не создаёт. */
extern void ump_log_rs(void);
/* Постоянный дескриптор из восьми слов описывает карту 167/v1; область 0x5F00..0x5F07 доступна только для чтения. */
static const uint16_t gas167_info[GAS167_INFO_WORDS] = {
/* Слова 0..3: сигнатура GA/S1, версия профиля и номер проекта 167. */
0x4741U, 0x5331U, GAS167_PROFILE_VERSION, 167U,
/* Слова 4..7: начало 0x5000, длина 128 слов, возможности RTU/CAN/FC06 и размер адресной единицы в словах. */
GAS167_REG_BASE, GAS167_REG_COUNT, GAS167_CAPABILITIES, 1U
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
};
/* Проверяет одиночный адрес в двух непересекающихся диапазонах; весь блок дополнительно проверяет gas167_prepare. */
int gas167_contains(uint16_t address)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Беззнаковое 16-битное смещение проверяет 0x5000..0x507F: адрес ниже начала даёт большое смещение. */
return (uint16_t)(address - GAS167_REG_BASE) < GAS167_REG_COUNT ||
/* Аналогично проверяет 0x5F00..0x5F07; промежуток между диапазонами остаётся недоступным. */
(uint16_t)(address - GAS167_INFO_BASE) < GAS167_INFO_WORDS;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает технологическое слово с теми же ограничениями, что и штатная функция Modbus FC06. */
static unsigned gas167_write(uint16_t offset, uint16_t value)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Match the existing native Modbus write policy. These status words
* cannot be overwritten and an invalid timeout cannot bypass protection. */
/* Правила записи совпадают со штатным Modbus: статусы защиты нельзя
* перезаписать, а недопустимый тайм-аут не позволяет обойти защиту. */
/* На плате LOAD состояния 0x7C/0x7D принадлежат защите; запись отклоняется кодом неверного адреса 2. */
if (Desk == dsk_LOAD && (offset == 0x7CU || offset == 0x7DU)) return 2;
/* Для сохраняемого тайм-аута CAN нагрузки применяется проверка диапазона независимо от транспорта. */
if (Desk == dsk_LOAD && offset == 0x52U &&
/* Значение 0 или больше 60000 мс недопустимо и возвращает код 3; защиту нельзя отключить такой записью. */
(value == 0U || value > 60000U)) return 3;
/* C28x int is one register word; reads always expose the raw uint16_t. */
/* int C28x занимает одно слово регистра; чтение возвращает исходный uint16_t. */
/* Сохраняет 16-битный рисунок регистра: знаковый int C28x занимает ровно одно слово, чтение вернёт uint16_t. */
modbus[offset] = (int)value;
/* Запись слова команд 127 вызывает существующий хук регистратора, как обычный Modbus. */
if (offset == 127U) ump_log_rs();
/* Возвращает успех записи; исходное правило ошибок Modbus сохраняется. */
return 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Готовит FC03/FC06: value — число слов чтения или значение записи, address — глобальный словный адрес. */
unsigned gas167_prepare(unsigned function, uint16_t address, uint16_t value,
/* can включает парное чтение CAN; reply вмещает 124 слова, error получает код Modbus; вызывающий код удерживает краткую блокировку IRQ. */
int can, uint16_t *reply, unsigned *error)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Смещение адреса внутри выбранной области; uint16_t задаёт правила вычисления на границах 0xFFFF. */
uint16_t offset;
/* Индекс копирования и число доступных слов в выбранной области — 128 или 8. */
unsigned i, available;
/* Признак обращения к постоянному дескриптору вместо технологических регистров. */
int info;
/* Не разыменовывает отсутствующие выходные буферы; ответ сформировать нельзя. */
if (!reply || !error) return 0;
/* Сначала считает запрос успешным; последующие проверки задают конкретный код ошибки. */
*error = 0;
/* Выбирает дескриптор только для его восьми допустимых стартовых адресов. */
info = (uint16_t)(address - GAS167_INFO_BASE) < GAS167_INFO_WORDS;
/* Переводит глобальный адрес в индекс выбранной области без изменения штатных адресов Modbus. */
offset = (uint16_t)(address - (info ? GAS167_INFO_BASE : GAS167_REG_BASE));
/* Определяет границу выбранной области, чтобы следующий запрос не пересёк её конец. */
available = info ? GAS167_INFO_WORDS : GAS167_REG_COUNT;
/* GAS поддерживает только чтение FC03 и одиночную запись FC06; остальные функции возвращают исключение 1. */
if (function != 3U && function != 6U) *error = 1;
/* Отклоняет адрес вне выбранной области до любого чтения массива; исключение 2. */
else if (offset >= available) *error = 2;
/* Для FC06 длина не проверяется: value содержит записываемое слово. */
else if (function == 6U) {
/* Дескриптор запрещён для записи; технологическая область проходит проверку прав и тайм-аута. */
*error = info ? 2U : gas167_write(offset, value);
/* Чтение RTU допускает 1..124 слова; служебный CAN передаёт пары и поэтому требует чётную ненулевую длину. */
} else if (!value || value > GAS167_MAX_WORDS || (can && (value & 1U))) {
/* Неверная длина чтения получает исключение Modbus 3 без частичного ответа. */
*error = 3;
/* Проверяет остаток области через вычитание: запрос не выходит за границу, не оборачивается и не читает скрытый modbus[128]. */
} else if (value > available - offset) {
/* Пересечение конца области получает исключение Modbus 2; данные ещё не копировались. */
*error = 2;
/* Только полностью проверенный запрос попадает в ветвь копирования снимка. */
} else {
/* Validate the entire block before reading. A block cannot cross a
* region boundary, wrap at 0xFFFF, or leak the hidden parameter word. */
/* Проверяется весь блок до чтения: нельзя пересечь конец области,
* перейти через 0xFFFF или получить скрытое слово параметров. */
/* Копирует точно запрошенное число слов, не выполняя EEPROM I/O и не выделяя память. */
for (i = 0; i < value; ++i)
/* Берёт постоянное слово дескриптора либо сырой 16-битный регистр; согласованность обеспечена блокировкой вызывающего транспорта. */
reply[i] = info ? gas167_info[offset+i] : (uint16_t)modbus[offset+i];
/* Для успешного чтения возвращает фактическое число слов; транспорт сам строит RTU или CAN-кадры. */
return value;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Для записи либо ошибки сохраняет исходный адрес, используемый транспортом при формировании ответа. */
reply[0] = address;
/* Сохраняет исходное значение или длину рядом с адресом; массив ответа содержит два слова. */
reply[1] = value;
/* Возвращает двухсловный результат записи/ошибки; конкретный код ошибки остаётся в error. */
return 2;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Завершает код GAS, доступный только при EEPROM_M95M02=1. */
#endif
+197 -43
View File
@@ -1,183 +1,337 @@
/* Последовательный вывод данных канала индикации. Русские пояснения сохранены в UTF-8. */
/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */
#include "DSP2833x_Device.h" // DSP281x Headerfile Include File
#include "DSP2833x_SWPrioritizedIsrLevels.h"
/* Подключает "DSP2833x_SWPrioritizedIsrLevels.h": поставляемое TI описание SWPrioritizedIsrLevels для семейства C2833x. */
#include "DSP2833x_SWPrioritizedIsrLevels.h"
/* Подключает "filter_bat2.h": накопительный фильтр измерительных каналов. */
#include "filter_bat2.h"
/* Подключает "measure.h": обработка датчиков, вычисление величин и миллисекундный такт системы. */
#include "measure.h"
/* Подключает "RS485.h": приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
#include "RS485.h"
/* Подключает "message.h": обработка Modbus, заводские параметры и сохранение настроек. */
#include "message.h"
/* Подключает "kanal.h": последовательный вывод данных канала индикации. */
#include "kanal.h"
/* Подключает "pulto.h": обмен и индикация пульта. */
#include "pulto.h"
/* Подключает "package.h": адреса устройств, типы плат и псевдонимы технологических регистров. */
#include "package.h"
/* Подключает "tools.h": настройка внешней памяти и служебные задержки. */
#include "tools.h"
/* Подключает "peripher.h": перемычки режима платы, дискретные входы и выходы. */
#include "peripher.h"
/* Объявляет digits — данные digits. Начальное значение задаётся справа от знака равенства. */
int digits[16] = {63,6,91,79,102,109,125,7,127,111,64,0,0,0,121,0};
/* Объявляет readr — данные readr. Начальное значение задаётся справа от знака равенства. */
int readr[5] = {0x08,0x0C,0x10,0x00,0x04};
/* Начинает функцию DCLK; назначение модуля — последовательный вывод данных канала индикации. */
void DCLK(int x)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(x) GpioDataRegs.GPASET.bit.GPIO6=1; последующий оператор выполняется только при истинном условии. */
if(x) GpioDataRegs.GPASET.bit.GPIO6=1;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else GpioDataRegs.GPACLEAR.bit.GPIO6=1;
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию DOUT; назначение модуля — последовательный вывод данных канала индикации. */
void DOUT(int x)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(x) GpioDataRegs.GPASET.bit.GPIO8=1; последующий оператор выполняется только при истинном условии. */
if(x) GpioDataRegs.GPASET.bit.GPIO8=1;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else GpioDataRegs.GPACLEAR.bit.GPIO8=1;
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Условие компиляции CLKMULT==1: выбранный блок включается в текущий вариант прошивки. */
#if CLKMULT==1
/* Задаёт POWS0 = 0L; данные POWS0. */
#define POWS0 0L
/* Задаёт POWS1 = 10L; данные POWS1. */
#define POWS1 10L
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции CLKMULT==2: выбранный блок включается в текущий вариант прошивки. */
#if CLKMULT==2
/* Задаёт POWS0 = 0L; данные POWS0. */
#define POWS0 0L
/* Задаёт POWS1 = 30L; данные POWS1. */
#define POWS1 30L
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции CLKMULT==3: выбранный блок включается в текущий вариант прошивки. */
#if CLKMULT==3
/* Задаёт POWS0 = 1L; данные POWS0. */
#define POWS0 1L
/* Задаёт POWS1 = 50L; данные POWS1. */
#define POWS1 50L
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции CLKMULT==4: выбранный блок включается в текущий вариант прошивки. */
#if CLKMULT==4
/* Задаёт POWS0 = 2L; данные POWS0. */
#define POWS0 2L
/* Задаёт POWS1 = 60L; данные POWS1. */
#define POWS1 60L
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции CLKMULT==5: выбранный блок включается в текущий вариант прошивки. */
#if CLKMULT==5
/* Задаёт POWS0 = 4L; данные POWS0. */
#define POWS0 4L
/* Задаёт POWS1 = 80L; данные POWS1. */
#define POWS1 80L
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Начинает функцию RESET; назначение модуля — последовательный вывод данных канала индикации. */
void RESET()
{
DCLK(0);
#if POWS1>0
DSP28x_usDelay(POWS1);
#endif
DOUT(1);
#if POWS1>0
DSP28x_usDelay(POWS1);
#endif
DOUT(0);
#if POWS1>0
DSP28x_usDelay(POWS1);
#endif
}
void SENDBIT(int x)
{
DOUT(x); DCLK(1);
#if POWS0>0
DSP28x_usDelay(POWS0);
#endif
DOUT(0);
DSP28x_usDelay(POWS0+1);
DCLK(0);
#if POWS1>0
DSP28x_usDelay(POWS1);
#endif
}
void kanal_Send(int adr, long dat, int dot)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Вызывает DCLK с аргументами (0) в текущей последовательности операций. */
DCLK(0);
/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */
#if POWS1>0
/* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */
DSP28x_usDelay(POWS1);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Вызывает DOUT с аргументами (1) в текущей последовательности операций. */
DOUT(1);
/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */
#if POWS1>0
/* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */
DSP28x_usDelay(POWS1);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Вызывает DOUT с аргументами (0) в текущей последовательности операций. */
DOUT(0);
/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */
#if POWS1>0
/* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */
DSP28x_usDelay(POWS1);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию SENDBIT; назначение модуля — последовательный вывод данных канала индикации. */
void SENDBIT(int x)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Вызывает DOUT с аргументами (x); DCLK(1) в текущей последовательности операций. */
DOUT(x); DCLK(1);
/* Условие компиляции POWS0>0: выбранный блок включается в текущий вариант прошивки. */
#if POWS0>0
/* Вызывает DSP28x_usDelay с аргументами (POWS0) в текущей последовательности операций. */
DSP28x_usDelay(POWS0);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Вызывает DOUT с аргументами (0) в текущей последовательности операций. */
DOUT(0);
/* Вызывает DSP28x_usDelay с аргументами (POWS0+1) в текущей последовательности операций. */
DSP28x_usDelay(POWS0+1);
/* Вызывает DCLK с аргументами (0) в текущей последовательности операций. */
DCLK(0);
/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */
#if POWS1>0
/* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */
DSP28x_usDelay(POWS1);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию kanal_Send; назначение модуля — последовательный вывод данных канала индикации. */
void kanal_Send(int adr, long dat, int dot)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет Word — слово; data — данные; aliq_part — данные aliq_part; dg — данные dg. */
long Word,data,aliq_part,dg[4];
/* Объявляет i — данные i; j — данные j; bit — представление регистра отдельными битовыми полями; byt — данные byt; addr — данные addr. Начальное значение задаётся справа от знака равенства. */
int i,j,bit,byt,addr,sgn=0,punkt=0,aliq_len=0,full_len, isdot=0;
if(adr>1) // Ëàìïî÷êè
/* Проверяет if(adr>1); последующий оператор выполняется только при истинном условии. */
if(adr>1) // Лампочки
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает Word значением dat; слово. */
Word =dat;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(dat<0) sgn=1; последующий оператор выполняется только при истинном условии. */
if(dat<0) sgn=1;
/* Записывает data значением labs(dat); данные. */
data = labs(dat);
/* Проверяет if(dot>=0 и dot<4) isdot = 1; последующий оператор выполняется только при истинном условии. */
if(dot>=0 && dot<4) isdot = 1;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else dot=0;
/* Записывает aliq_part значением data; данные aliq_part. */
aliq_part = data;
/* Цикл for(i=0;i<dot;i++) aliq_part/=10;; задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<dot;i++) aliq_part/=10;
/* Записывает dat значением aliq_part; данные dat. */
dat = aliq_part;
/* Повторяет или ожидает, пока выполняется while(dat>0). */
while(dat>0)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Делит dat значением 10; данные dat. */
aliq_len++; dat/=10;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает dat значением data; данные dat. */
dat = data;
/* Записывает full_len значением aliq_len+sgn; данные full_len. */
full_len = aliq_len+sgn;
/* Проверяет if(full_len==0) full_len=1; последующий оператор выполняется только при истинном условии. */
if(full_len==0) full_len=1;
/* Увеличивает full_len значением dot; данные full_len. */
full_len += dot;
/* Цикл for(i=0; i<(full_len-4);i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0; i<(full_len-4);i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Начинает цикл с проверкой условия после тела: первый проход выполняется всегда. */
dot--; dat/=10;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(dot<0) dot=0; последующий оператор выполняется только при истинном условии. */
if(dot<0) dot=0;
/* Записывает punkt значением 1<<dot; данные punkt. */
punkt = 1<<dot;
/* Проверяет if(punkt==1) punkt=0; последующий оператор выполняется только при истинном условии. */
if(punkt==1) punkt=0;
/* Записывает dg[3] значением (dat)/1000; данные dg. */
dg[3] = (dat)/1000;
/* Записывает dg[2] значением (dat%1000)/100; данные dg. */
dg[2] = (dat%1000)/100;
/* Записывает dg[1] значением (dat%100)/10; данные dg. */
dg[1] = (dat%100)/10;
/* Записывает dg[0] значением (dat%10); данные dg. */
dg[0] = (dat%10);
/* Проверяет if(dg[0]+dg[1]+dg[2]+dg[3]==0); последующий оператор выполняется только при истинном условии. */
if(dg[0]+dg[1]+dg[2]+dg[3]==0)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает punkt значением 0; dot=0; sgn=0; данные punkt. */
punkt=0; dot=0; sgn=0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(isdot); последующий оператор выполняется только при истинном условии. */
if(isdot)
/* Цикл for(i=3;i>0;i--); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=3;i>0;i--)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if((dg[i]==0) и (i!=dot)); последующий оператор выполняется только при истинном условии. */
if((dg[i]==0)&&(i!=dot))
dg[i]=0xF; // Ýòî çíà÷èò ïóñòî
/* Записывает dg[i] значением 0xF; данные dg. */
dg[i]=0xF; // Это значит пусто
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else break;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(sgn); последующий оператор выполняется только при истинном условии. */
if(sgn)
/* Цикл for(i=1;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=1;i<4;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if( (dg[i]==0xF) или (i==3)); последующий оператор выполняется только при истинном условии. */
if( (dg[i]==0xF)||(i==3))
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
dg[i]=0xA; // Ýòî çíà÷èò ìèíóñ
/* Записывает dg[i] значением 0xA; данные dg. */
dg[i]=0xA; // Это значит минус
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/* Цикл for(i=0;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<4;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает dg[i] значением digits[dg[i]]; данные dg. */
dg[i] = digits[dg[i]];
/* Проверяет if((punkt>>i)&1) dg[i]+= 128; последующий оператор выполняется только при истинном условии. */
if((punkt>>i)&1) dg[i]+= 128;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает Word значением ((dg[0] ) & 0x000000FF) | ((dg[1]<<8 ) & 0x0000FF00) |; слово. */
Word = ((dg[0] ) & 0x000000FF) | ((dg[1]<<8 ) & 0x0000FF00) |
/* Продолжает список аргументов, полей или выражение ((dg[2]<<16) & 0x00FF0000) | ((dg[3]<<24) & 0xFF000000);; порядок элементов сохраняется. */
((dg[2]<<16) & 0x00FF0000) | ((dg[3]<<24) & 0xFF000000);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает addr значением readr[adr]; данные addr. */
addr = readr[adr];
/* Цикл for (i=0;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for (i=0;i<4;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(addr>0x10) break; последующий оператор выполняется только при истинном условии. */
if(addr>0x10) break;
/* Цикл for (j=0;j<8;j++); задаёт начальное значение, условие продолжения и шаг перебора. */
for (j=0;j<8;j++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает bit значением Word & 1; Word >>= 1; представление регистра отдельными битовыми полями. */
bit = Word & 1; Word >>= 1;
/* Вызывает SENDBIT с аргументами (bit) в текущей последовательности операций. */
SENDBIT(bit);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
byt = addr;
/* Записывает byt значением addr; данные byt. */
byt = addr;
/* Цикл for (j=0;j<6;j++); задаёт начальное значение, условие продолжения и шаг перебора. */
for (j=0;j<6;j++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает bit значением byt & 1; byt >>= 1; представление регистра отдельными битовыми полями. */
bit = byt & 1; byt >>= 1;
/* Вызывает SENDBIT с аргументами (bit) в текущей последовательности операций. */
SENDBIT(bit);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Изменяет счётчик в выражении addr++; на один для следующего шага. */
addr++;
/* Вызывает RESET с аргументами () в текущей последовательности операций. */
RESET();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
+268 -31
View File
@@ -1,296 +1,533 @@
/* Двухбанковый регистратор событий нагрузки во внешней RAM. Русские пояснения сохранены в UTF-8. */
/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */
#include "DSP2833x_Device.h"
/* Подключает "filter_bat2.h": накопительный фильтр измерительных каналов. */
#include "filter_bat2.h"
/* Подключает "measure.h": обработка датчиков, вычисление величин и миллисекундный такт системы. */
#include "measure.h"
/* Подключает "package.h": адреса устройств, типы плат и псевдонимы технологических регистров. */
#include "package.h"
/* Подключает "RS485.h": приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
#include "RS485.h"
/* Подключает "message.h": обработка Modbus, заводские параметры и сохранение настроек. */
#include "message.h"
/* Подключает "peripher.h": перемычки режима платы, дискретные входы и выходы. */
#include "peripher.h"
/* Подключает "DAC.h": выход ЦАП и автомат защиты нагрузки с проверкой напряжения и свежести CAN. */
#include "DAC.h"
/* Подключает "ADC.h": настройка АЦП, обработка преобразований и первичная фильтрация измерений. */
#include "ADC.h"
/* Подключает "log_to_mem.h": двухбанковый регистратор событий нагрузки во внешней RAM. */
#include "log_to_mem.h"
/* Объявляет no_write — no запись. Начальное значение задаётся справа от знака равенства. */
int no_write = 0,
never_write = 0; // Флаги, чтобы не писать (если что)
/* Записывает never_write значением 0; never запись. */
never_write = 0; // Флаги, чтобы не писать (если что)
/* Указание компилятору DATA_SECTION(logs_block,".logg");: размещение данных или настройка обработки объявлений. */
#pragma DATA_SECTION(logs_block,".logg");
/* Объявляет logs_block — выделенный массив внешней RAM для двух банков регистратора. */
unsigned int logs_block[0xFA00];
/* Объявляет Log — данные Log. */
LOG Log;
/* Объявляет flog — данные flog. Начальное значение задаётся справа от знака равенства. */
unsigned int flog=0;
// Очищение памати, где логи лежат
// Очищение памати, где логи лежат
/* Обнуляет выделенный диапазон внешней RAM журнала и задаёт границы кольцевого буфера. */
void clear_mem()
{
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет i — данные i. */
unsigned long i;
/* Записывает Log.Start значением LOG_PAGE_START; данные Start. */
Log.Start = LOG_PAGE_START;
/* Записывает Log.Finis значением LOG_PAGE_START + LOG_PAGE_LEN; данные Finis. */
Log.Finis = LOG_PAGE_START + LOG_PAGE_LEN;
/* Записывает Log.Adres значением Log.Start; данные Adres. */
Log.Adres = Log.Start;
/* Записывает Log.Circl значением 0; данные Circl. */
Log.Circl = 0;
/* Цикл for (i=Log.Start; i<Log.Finis; i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for (i=Log.Start; i<Log.Finis; i++)
/* Записывает i значением 0; данные i. */
*(volatile int *)i = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Two RAM banks: freeze after 10% of bank capacity is recorded after stop. */
/* Объявляет ump_state — данные ump_state; ump_count — число сохранённых точек в активном банке; ump_cursor — данные ump_cursor; ump_next — данные ump_next. volatile требует фактического чтения или записи при каждом доступе. */
static volatile unsigned int ump_state, ump_count, ump_cursor, ump_next;
/* Объявляет ump_period — период записи регистратора в миллисекундных тактах; ump_divider — ump делитель. volatile требует фактического чтения или записи при каждом доступе. Начальное значение задаётся справа от знака равенства. */
static volatile unsigned int ump_period = 20, ump_divider;
/* Объявляет ump_time — миллисекундное время регистратора; ump_sequence — ump последовательность. volatile требует фактического чтения или записи при каждом доступе. */
static volatile unsigned long ump_time, ump_sequence;
/* Объявляет ump_bank — индекс активного банка регистратора; ump_archive_bank — индекс замороженного банка, доступного для чтения. Начальное значение задаётся справа от знака равенства. */
static unsigned int ump_bank, ump_archive_bank = 1;
/* Объявляет ump_archive_count — ump archive число; ump_archive_next — данные ump_archive_next; ump_generation — номер смены архивного банка. */
static unsigned int ump_archive_count, ump_archive_next, ump_generation;
/* Объявляет ump_source — данные ump_source; ump_post — данные ump_post. */
static unsigned int ump_source, ump_post;
/* Задаёт UMP_POST_POINTS = (UMP_LOG_CAPACITY / 10U); число записей после STOP — десятая часть ёмкости банка. */
#define UMP_POST_POINTS (UMP_LOG_CAPACITY / 10U)
/* Замораживает заполненный банк и переключает рабочий банк, сохраняя доступный архив. */
static void ump_freeze(void);
/* Объявляет ump_can_header — ump CAN header; ump_can_data — ump CAN данные; ump_can_count — ump CAN число. */
static unsigned int ump_can_header, ump_can_data[3], ump_can_count;
/* Latest PM67 sums: register 306 (index 305), register 9 (index 8). */
/* Объявляет ump_pm67_voltage — данные ump_pm67_voltage. */
static unsigned int ump_pm67_voltage[2];
/* Объявляет ump_prev_commands — данные ump_prev_commands; ump_prev_inputs — данные ump_prev_inputs; ump_prev_outputs — данные ump_prev_outputs. */
static unsigned int ump_prev_commands, ump_prev_inputs, ump_prev_outputs;
/* Объявляет CanTimeOutErrorTR — CAN Time Out ошибка TR. Память определена в другом модуле. */
extern int CanTimeOutErrorTR;
/* Диагностика внутренних переменных разгона. Обновляется самим Load_runner,
* не пересчитывает и не изменяет управляющий алгоритм. */
/* Диагностика внутренних переменных разгона. Обновляется самим Load_runner,
* не пересчитывает и не изменяет управляющий алгоритм. */
/* Объявляет ump_dac_ramp — ump ЦАП ramp; ump_dac_duration — ump ЦАП duration; ump_dac_go10 — ump ЦАП go 10; ump_dac_stop10 — ump ЦАП stop 10; ump_dac_position — ump ЦАП position. */
unsigned int ump_dac_ramp, ump_dac_duration, ump_dac_go10, ump_dac_stop10, ump_dac_position;
/* Called once at boot, before enabling interrupts. TI COFF startup does
* not clear uninitialized globals in .ebss. Do not use for record restart:
* restart must preserve the archive, time and latest received voltages. */
/* Явно инициализирует оба банка регистратора до включения IRQ; повторный старт записи архив не стирает. */
void ump_log_init(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет i — данные i. */
unsigned int i;
/* Записывает ump_state значением 0; ump_count = 0; ump_cursor = 0; ump_next = 0; данные ump_state. */
ump_state = 0; ump_count = 0; ump_cursor = 0; ump_next = 0;
/* Записывает ump_period значением 20; ump_divider = 0; период записи регистратора в миллисекундных тактах. */
ump_period = 20; ump_divider = 0;
/* Записывает ump_time значением 0; ump_sequence = 0; миллисекундное время регистратора. */
ump_time = 0; ump_sequence = 0;
/* Записывает ump_bank значением 0; ump_archive_bank = 1; индекс активного банка регистратора. */
ump_bank = 0; ump_archive_bank = 1;
/* Записывает ump_archive_count значением 0; ump_archive_next = 0; ump_generation = 0; ump archive число. */
ump_archive_count = 0; ump_archive_next = 0; ump_generation = 0;
/* Записывает ump_source значением 0; ump_post = 0; данные ump_source. */
ump_source = 0; ump_post = 0;
/* Записывает ump_can_header значением 0; ump_can_count = 0; ump CAN header. */
ump_can_header = 0; ump_can_count = 0;
/* Цикл for (i = 0; i < 3; i++) ump_can_data[i] = 0;; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 3; i++) ump_can_data[i] = 0;
/* Цикл for (i = 0; i < 2; i++) ump_pm67_voltage[i] = 0;; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 2; i++) ump_pm67_voltage[i] = 0;
/* Записывает ump_prev_commands значением 0; ump_prev_inputs = 0; ump_prev_outputs = 0; данные ump_prev_commands. */
ump_prev_commands = 0; ump_prev_inputs = 0; ump_prev_outputs = 0;
/* Записывает ump_dac_ramp значением 0; ump_dac_duration = 0; ump_dac_go10 = 0; ump ЦАП ramp. */
ump_dac_ramp = 0; ump_dac_duration = 0; ump_dac_go10 = 0;
/* Записывает ump_dac_stop10 значением 0; ump_dac_position = 0; ump ЦАП stop 10. */
ump_dac_stop10 = 0; ump_dac_position = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Логические уровни входов платы нагрузки: физический ноль означает 1.
* Чтение GPIO непосредственно здесь позволяет записать вход до следующего
* обновления регистра Inputs в основном цикле. */
/* Логические уровни входов платы нагрузки: физический ноль означает 1.
* Чтение GPIO непосредственно здесь позволяет записать вход до следующего
* обновления регистра Inputs в основном цикле. */
/* Читает активные входы START/STOP/разрешения непосредственно из GPIO с учётом полярности. */
static unsigned int ump_inputs(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Завершает ump_inputs и возвращает (!GpioDataRegs.GPADAT.bit.GPIO6) |. */
return (!GpioDataRegs.GPADAT.bit.GPIO6) |
/* Продолжает список аргументов, полей или выражение ((!GpioDataRegs.GPADAT.bit.GPIO8) << 1) |; порядок элементов сохраняется. */
((!GpioDataRegs.GPADAT.bit.GPIO8) << 1) |
/* Продолжает список аргументов, полей или выражение ((!GpioDataRegs.GPADAT.bit.GPIO11) << 2);; порядок элементов сохраняется. */
((!GpioDataRegs.GPADAT.bit.GPIO11) << 2);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* START/STOP активны единицей; RES_OUT_2 активен физическим нулём. */
/* START/STOP активны единицей; RES_OUT_2 активен физическим нулём. */
/* Собирает фактические состояния GPIO выходов START/STOP/разрешения нагрузки. */
static unsigned int ump_outputs(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Завершает ump_outputs и возвращает GpioDataRegs.GPBDAT.bit.GPIO62 |. */
return GpioDataRegs.GPBDAT.bit.GPIO62 |
/* Продолжает список аргументов, полей или выражение (GpioDataRegs.GPBDAT.bit.GPIO58 << 1) |; порядок элементов сохраняется. */
(GpioDataRegs.GPBDAT.bit.GPIO58 << 1) |
/* Продолжает список аргументов, полей или выражение ((!GpioDataRegs.GPADAT.bit.GPIO3) << 2);; порядок элементов сохраняется. */
((!GpioDataRegs.GPADAT.bit.GPIO3) << 2);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Вызывается только внутри короткой критической секции. Все три источника
* записей (main, CAN ISR, timer ISR) используют одну блокировку IRQ с
* восстановлением прежнего состояния, включая вызовы из прерывания. */
/* Вызывается только внутри короткой критической секции. Все три источника
* записей (main, CAN ISR, timer ISR) используют одну блокировку IRQ с
* восстановлением прежнего состояния, включая вызовы из прерывания. */
/* Создаёт одну запись состояния: входы, выходы, команды, напряжения и параметры тока нагрузки. */
static void ump_capture(unsigned int reason)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет p — данные p. Хранит указатель на данные. volatile требует фактического чтения или записи при каждом доступе. */
volatile unsigned int *p;
/* Объявляет i — данные i; commands — данные commands; inputs — данные inputs; outputs — данные outputs. */
unsigned int i, commands, inputs, outputs;
/* Проверяет if (ump_state != 1 или Desk != dsk_LOAD или !READY) return; последующий оператор выполняется только при истинном условии. */
if (ump_state != 1 || Desk != dsk_LOAD || !READY) return;
/* Проверяет if (no_write или never_write); последующий оператор выполняется только при истинном условии. */
if (no_write || never_write) { ump_state = 3; return; }
/* Записывает commands значением Commands; данные commands. */
commands = Commands;
/* Записывает inputs значением ump_inputs(); outputs = ump_outputs(); данные inputs. */
inputs = ump_inputs(); outputs = ump_outputs();
/* Freeze only an actual running-to-stopped output transition.
* STOP is set before RES_OUT_2 is cleared in main; an interrupt can
* observe these writes separately, so require its level, not its edge.
* Repeated reset/STOP pulses while already stopped leave the archive. */
/* Проверяет if (!ump_post и (ump_prev_outputs & 4U) и !(outputs & 4U) и; последующий оператор выполняется только при истинном условии. */
if (!ump_post && (ump_prev_outputs & 4U) && !(outputs & 4U) &&
/* Продолжает список аргументов, полей или выражение (outputs & 2U)) {; порядок элементов сохраняется. */
(outputs & 2U)) {
/* Keep 90% including the trigger; reserve 10% for later records. */
/* Проверяет if (ump_count >= UMP_LOG_CAPACITY - UMP_POST_POINTS); последующий оператор выполняется только при истинном условии. */
if (ump_count >= UMP_LOG_CAPACITY - UMP_POST_POINTS)
/* Записывает ump_count значением UMP_LOG_CAPACITY - UMP_POST_POINTS - 1; число сохранённых точек в активном банке. */
ump_count = UMP_LOG_CAPACITY - UMP_POST_POINTS - 1;
/* Записывает ump_post значением UMP_POST_POINTS; данные ump_post. */
ump_post = UMP_POST_POINTS;
/* Устанавливает биты reason значением 0x100; данные reason. */
reason |= 0x100;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает ump_prev_commands значением commands; ump_prev_inputs = inputs; ump_prev_outputs = outputs; данные ump_prev_commands. */
ump_prev_commands = commands; ump_prev_inputs = inputs; ump_prev_outputs = outputs;
/* Every stored point counts, including CAN and I/O, except the trigger. */
/* Проверяет if (ump_post и !(reason & 0x100) и --ump_post == 0) reason = 5; последующий оператор выполняется только при истинном условии. */
if (ump_post && !(reason & 0x100) && --ump_post == 0) reason = 5;
/* Записывает p значением logs_block + ((unsigned long)ump_bank * UMP_LOG_CAPACITY + ump_next) * UMP_LOG_WORDS; данные p. */
p = logs_block + ((unsigned long)ump_bank * UMP_LOG_CAPACITY + ump_next) * UMP_LOG_WORDS;
/* Записывает p[0] значением (unsigned int)ump_time; p[1] = (unsigned int)(ump_time >> 16); данные p. */
p[0] = (unsigned int)ump_time; p[1] = (unsigned int)(ump_time >> 16);
/* Записывает p[2] значением reason; p[3] = commands; данные p. */
p[2] = reason; p[3] = commands;
/* Записывает p[4] значением inputs; p[5] = outputs; данные p. */
p[4] = inputs; p[5] = outputs;
/* Записывает p[6] значением (unsigned int)IMPowse; p[7] = (unsigned int)WAKEpowse; данные p. */
p[6] = (unsigned int)IMPowse; p[7] = (unsigned int)WAKEpowse;
/* Записывает p[8] значением modbus[0x7B]; p[9] = modbus[0x1C]; данные p. */
p[8] = modbus[0x7B]; p[9] = modbus[0x1C];
/* Цикл for (i = 0; i < 4; i++) ; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 4; i++) { p[10+i] = sens_data[i]; p[14+i] = modbus[i]; }
/* Записывает p[18] значением ump_can_header; данные p. */
p[18] = ump_can_header;
/* Записывает p[19] значением ump_can_data[0]; p[20] = ump_can_data[1]; p[21] = ump_can_data[2]; данные p. */
p[19] = ump_can_data[0]; p[20] = ump_can_data[1]; p[21] = ump_can_data[2];
/* Записывает p[22] значением ump_can_count; p[23] = CanTimeOutErrorTR; данные p. */
p[22] = ump_can_count; p[23] = CanTimeOutErrorTR;
/* Исходные уставки — мА; эффективные уставки после ограничений — 0.1 мА.
* p[8] — отправленный код, а p[9] — расчётное задание, НЕ измерение тока. */
/* Исходные уставки — мА; эффективные уставки после ограничений — 0.1 мА.
* p[8] — отправленный код, а p[9] — расчётное задание, НЕ измерение тока. */
/* Записывает p[24] значением DAC_go; p[25] = DAC_stop; данные p. */
p[24] = DAC_go; p[25] = DAC_stop;
/* Записывает p[26] значением DAC_min(); p[27] = DAC_max(); p[28] = DAC_cal(); данные p. */
p[26] = DAC_min(); p[27] = DAC_max(); p[28] = DAC_cal();
/* Записывает p[29] значением DAC_04; p[30] = DAC_20; данные p. */
p[29] = DAC_04; p[30] = DAC_20;
/* Записывает p[31] значением ump_dac_ramp; p[32] = ump_dac_duration; данные p. */
p[31] = ump_dac_ramp; p[32] = ump_dac_duration;
/* Записывает p[33] значением ump_dac_go10; p[34] = ump_dac_stop10; p[35] = ump_dac_position; данные p. */
p[33] = ump_dac_go10; p[34] = ump_dac_stop10; p[35] = ump_dac_position;
/* Цикл for (i = 0; i < 4; i++) p[36+i] = ADC_table[i];; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 4; i++) p[36+i] = ADC_table[i];
/* Записывает p[40] значением ump_pm67_voltage[0]; p[41] = ump_pm67_voltage[1]; данные p. */
p[40] = ump_pm67_voltage[0]; p[41] = ump_pm67_voltage[1];
/* Изменяет счётчик в выражении ump_next++; на один для следующего шага. */
ump_next++;
/* Проверяет if (ump_next == UMP_LOG_CAPACITY) ump_next = 0; последующий оператор выполняется только при истинном условии. */
if (ump_next == UMP_LOG_CAPACITY) ump_next = 0;
/* Проверяет if (ump_count < UMP_LOG_CAPACITY) ump_count++; последующий оператор выполняется только при истинном условии. */
if (ump_count < UMP_LOG_CAPACITY) ump_count++;
/* Изменяет счётчик в выражении ump_sequence++; на один для следующего шага. */
ump_sequence++;
/* Проверяет if (reason == 5) ump_freeze(); последующий оператор выполняется только при истинном условии. */
if (reason == 5) ump_freeze();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Завершённый банк больше не изменяется до следующего отключения.
* Номер поколения позволяет GUI обнаружить замену архива во время чтения. */
/* Завершённый банк больше не изменяется до следующего отключения.
* Номер поколения позволяет GUI обнаружить замену архива во время чтения. */
/* Замораживает заполненный банк и переключает рабочий банк, сохраняя доступный архив. */
static void ump_freeze(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает ump_archive_bank значением ump_bank; индекс замороженного банка, доступного для чтения. */
ump_archive_bank = ump_bank;
/* Записывает ump_archive_count значением ump_count; ump_archive_next = ump_next; ump archive число. */
ump_archive_count = ump_count; ump_archive_next = ump_next;
/* Изменяет счётчик в выражении ump_generation++; на один для следующего шага. */
ump_generation++;
/* Инвертирует биты ump_bank значением 1; индекс активного банка регистратора. */
ump_bank ^= 1;
/* Записывает ump_count значением 0; ump_next = 0; ump_post = 0; число сохранённых точек в активном банке. */
ump_count = 0; ump_next = 0; ump_post = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Продвигает время регистратора в Timer1 и снимает записи с заданным периодом. */
void ump_log_tick(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет saved — данные saved. Начальное значение задаётся справа от знака равенства. */
unsigned int saved = __disable_interrupts();
/* Проверяет if (ump_state == 1); последующий оператор выполняется только при истинном условии. */
if (ump_state == 1) {
/* Изменяет счётчик в выражении ump_time++; на один для следующего шага. */
ump_time++;
/* Проверяет if (++ump_divider >= ump_period); последующий оператор выполняется только при истинном условии. */
if (++ump_divider >= ump_period) { ump_divider = 0; ump_capture(1); }
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Вызывает __restore_interrupts с аргументами (saved) в текущей последовательности операций. */
__restore_interrupts(saved);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Дополнительный снимок только при изменении команд, входов или выходов.
* Это не заменяет периодическую запись аналоговых величин в таймере. */
/* Дополнительный снимок только при изменении команд, входов или выходов.
* Это не заменяет периодическую запись аналоговых величин в таймере. */
/* Обслуживает изменения дискретных входов и выходов из главного цикла. */
void ump_log_io(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет saved — данные saved. */
unsigned int saved;
/* Проверяет if (ump_state != 1 или Desk != dsk_LOAD) return; последующий оператор выполняется только при истинном условии. */
if (ump_state != 1 || Desk != dsk_LOAD) return;
/* Записывает saved значением __disable_interrupts(); данные saved. */
saved = __disable_interrupts();
/* Проверяет if (Commands != ump_prev_commands или ump_inputs() != ump_prev_inputs или; последующий оператор выполняется только при истинном условии. */
if (Commands != ump_prev_commands || ump_inputs() != ump_prev_inputs ||
/* Вызывает ump_outputs. Собирает фактические состояния GPIO выходов START/STOP/разрешения нагрузки. */
ump_outputs() != ump_prev_outputs) ump_capture(3);
/* Вызывает __restore_interrupts с аргументами (saved) в текущей последовательности операций. */
__restore_interrupts(saved);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Вызывается после применения слов принятого CAN-кадра: снимок содержит
* новые команды, а также исходный адрес/маску и все три слова кадра. */
/* Вызывается после применения слов принятого CAN-кадра: снимок содержит
* новые команды, а также исходный адрес/маску и все три слова кадра. */
/* Обновляет последние CAN-данные и напряжения для следующего снимка регистратора. */
void ump_log_can(unsigned int header, unsigned int a, unsigned int b, unsigned int c)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет saved — данные saved; i — данные i; address — адрес; mask — маска; data — данные. */
unsigned int saved, i, address, mask, data[3];
/* Проверяет if (Desk != dsk_LOAD) return; последующий оператор выполняется только при истинном условии. */
if (Desk != dsk_LOAD) return;
/* Записывает saved значением __disable_interrupts(); данные saved. */
saved = __disable_interrupts();
/* Записывает data[0] значением a; data[1] = b; data[2] = c; данные. */
data[0] = a; data[1] = b; data[2] = c;
/* Записывает address значением header & 0x1FFFU; адрес. */
address = header & 0x1FFFU;
/* Записывает mask значением 0x8000U; маска. */
mask = 0x8000U;
/* Track reception even while recording is stopped. Each mask bit
* refers to its own address, including disabled words in between. */
/* Цикл for (i = 0; i < 3; i++, address++, mask >>= 1) ; задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < 3; i++, address++, mask >>= 1) {
/* Проверяет if (!(header & mask)) continue; последующий оператор выполняется только при истинном условии. */
if (!(header & mask)) continue;
/* Проверяет if (address == 305U) ump_pm67_voltage[0] = data[i]; последующий оператор выполняется только при истинном условии. */
if (address == 305U) ump_pm67_voltage[0] = data[i];
/* Проверяет if (address == 8U) ump_pm67_voltage[1] = data[i]; последующий оператор выполняется только при истинном условии. */
if (address == 8U) ump_pm67_voltage[1] = data[i];
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if (ump_state != 1); последующий оператор выполняется только при истинном условии. */
if (ump_state != 1) { __restore_interrupts(saved); return; }
/* Записывает ump_can_header значением header; ump CAN header. */
ump_can_header = header;
/* Записывает ump_can_data[0] значением a; ump_can_data[1] = b; ump_can_data[2] = c; ump CAN данные. */
ump_can_data[0] = a; ump_can_data[1] = b; ump_can_data[2] = c;
/* Изменяет счётчик в выражении ump_can_count++; на один для следующего шага. */
ump_can_count++;
/* Вызывает ump_capture. Создаёт одну запись состояния: входы, выходы, команды, напряжения и параметры тока нагрузки. */
ump_capture(2);
/* Вызывает __restore_interrupts с аргументами (saved) в текущей последовательности операций. */
__restore_interrupts(saved);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Регистрирует изменение слова команд после записи по последовательному интерфейсу. */
void ump_log_rs(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет saved — данные saved. Начальное значение задаётся справа от знака равенства. */
unsigned int saved = __disable_interrupts();
/* Вызывает ump_capture. Создаёт одну запись состояния: входы, выходы, команды, напряжения и параметры тока нагрузки. */
ump_capture(4);
/* Вызывает __restore_interrupts с аргументами (saved) в текущей последовательности операций. */
__restore_interrupts(saved);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Управление журналом отделено от технологических команд: начало записи
* НЕ запускает УМП. Выбор архива не останавливает текущую запись. */
/* Управление журналом отделено от технологических команд: начало записи
* НЕ запускает УМП. Выбор архива не останавливает текущую запись. */
/* Применяет допустимые команды управления регистратором, сохраняя ограничения адресов. */
int ump_log_write(unsigned int address, unsigned int value)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет saved — данные saved; valid — данные valid. Начальное значение задаётся справа от знака равенства. */
unsigned int saved, valid = 1;
/* Записывает saved значением __disable_interrupts(); данные saved. */
saved = __disable_interrupts();
/* Проверяет if (address == UMP_LOG_BASE и value == 0); последующий оператор выполняется только при истинном условии. */
if (address == UMP_LOG_BASE && value == 0) {
/* Записывает ump_state значением 3; ump_post = 0; данные ump_state. */
ump_state = 3; ump_post = 0;
/* Проверяет else if (address == UMP_LOG_BASE и value == 1 и Desk == dsk_LOAD и READY и ump_state != 1); последующий оператор выполняется только при истинном условии. */
} else if (address == UMP_LOG_BASE && value == 1 && Desk == dsk_LOAD && READY && ump_state != 1) {
/* Записывает ump_count значением 0; ump_next = 0; ump_cursor = 0; ump_divider = 0; ump_post = 0; число сохранённых точек в активном банке. */
ump_count = 0; ump_next = 0; ump_cursor = 0; ump_divider = 0; ump_post = 0;
/* Записывает ump_source значением 0; данные ump_source. */
ump_source = 0;
/* Записывает ump_prev_commands значением Commands; данные ump_prev_commands. */
ump_prev_commands = Commands;
/* Записывает ump_prev_inputs значением ump_inputs(); ump_prev_outputs = ump_outputs(); данные ump_prev_inputs. */
ump_prev_inputs = ump_inputs(); ump_prev_outputs = ump_outputs();
/* Записывает no_write значением 0; never_write = 0; no запись. */
no_write = 0; never_write = 0;
/* Записывает ump_state значением 1; данные ump_state. */
ump_state = 1;
/* Вызывает ump_capture. Создаёт одну запись состояния: входы, выходы, команды, напряжения и параметры тока нагрузки. */
ump_capture(1);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет else if (address == UMP_LOG_BASE+1 и ump_state != 1 и value >= 1 и value <= 1000); последующий оператор выполняется только при истинном условии. */
else if (address == UMP_LOG_BASE+1 && ump_state != 1 && value >= 1 && value <= 1000)
/* Записывает ump_period значением value; период записи регистратора в миллисекундных тактах. */
ump_period = value;
/* Проверяет else if (address == UMP_LOG_BASE+2 и value < UMP_LOG_CAPACITY); последующий оператор выполняется только при истинном условии. */
else if (address == UMP_LOG_BASE+2 && value < UMP_LOG_CAPACITY)
/* Записывает ump_cursor значением value; данные ump_cursor. */
ump_cursor = value;
/* Проверяет else if (address == UMP_LOG_BASE+3 и value <= 1) ump_source = value; последующий оператор выполняется только при истинном условии. */
else if (address == UMP_LOG_BASE+3 && value <= 1) ump_source = value;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else valid = 0;
/* Вызывает __restore_interrupts с аргументами (saved) в текущей последовательности операций. */
__restore_interrupts(saved);
/* Завершает ump_log_write и возвращает valid. */
return valid;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Преобразование хронологического индекса в физическую позицию кольца.
* Для архива сохранены собственные count/next, независимые от живого банка. */
/* Преобразование хронологического индекса в физическую позицию кольца.
* Для архива сохранены собственные count/next, независимые от живого банка. */
/* Начинает функцию ump_word; назначение модуля — двухбанковый регистратор событий нагрузки во внешней RAM. */
static unsigned int ump_word(unsigned int archived, unsigned int record, unsigned int word)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет count — число; ump_count — число сохранённых точек в активном банке. Начальное значение задаётся справа от знака равенства. */
unsigned int count = archived ? ump_archive_count : ump_count;
/* Объявляет next — данные next; ump_next — данные ump_next. Начальное значение задаётся справа от знака равенства. */
unsigned int next = archived ? ump_archive_next : ump_next;
/* Объявляет bank — данные bank; ump_bank — индекс активного банка регистратора. Начальное значение задаётся справа от знака равенства. */
unsigned int bank = archived ? ump_archive_bank : ump_bank;
/* Объявляет slot — данные slot. */
unsigned int slot;
/* Проверяет if (record >= count) return 0; последующий оператор выполняется только при истинном условии. */
if (record >= count) return 0;
/* Записывает slot значением next + UMP_LOG_CAPACITY - count + record; данные slot. */
slot = next + UMP_LOG_CAPACITY - count + record;
/* Повторяет или ожидает, пока выполняется while (slot >= UMP_LOG_CAPACITY) slot -= UMP_LOG_CAPACITY;. */
while (slot >= UMP_LOG_CAPACITY) slot -= UMP_LOG_CAPACITY;
/* Завершает ump_word и возвращает logs_block[((unsigned long)bank * UMP_LOG_CAPACITY + slot) * UMP_LOG_WORDS + word]. */
return logs_block[((unsigned long)bank * UMP_LOG_CAPACITY + slot) * UMP_LOG_WORDS + word];
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Весь Modbus-блок читается вызывающим кодом под одной блокировкой IRQ.
* Поэтому timestamp/данные и заголовок онлайн-блока относятся к одному
* состоянию кольца, даже если в этот момент приходит новая CAN-команда. */
/* Весь Modbus-блок читается вызывающим кодом под одной блокировкой IRQ.
* Поэтому timestamp/данные и заголовок онлайн-блока относятся к одному
* состоянию кольца, даже если в этот момент приходит новая CAN-команда. */
/* Проверяет область чтения регистратора и возвращает слова состояния либо архивной записи. */
unsigned int ump_log_read(unsigned int address)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет offset — данные offset; count — число. */
unsigned int offset, count;
/* Объявляет first — данные first. */
unsigned long first;
/* Вызывает switch с аргументами (address) { в текущей последовательности операций. */
switch (address) {
/* Ветвь выбора для UMP_LOG_BASE; выполняется при совпадении селектора switch. */
case UMP_LOG_BASE: return 0x554D;
/* Ветвь выбора для UMP_LOG_BASE+1; выполняется при совпадении селектора switch. */
case UMP_LOG_BASE+1: return 3;
/* Ветвь выбора для UMP_LOG_BASE+2; выполняется при совпадении селектора switch. */
case UMP_LOG_BASE+2: return ump_source ? 3 : ump_state;
/* Ветвь выбора для UMP_LOG_BASE+3; выполняется при совпадении селектора switch. */
case UMP_LOG_BASE+3: return ump_source ? ump_archive_count : ump_count;
/* Ветвь выбора для UMP_LOG_BASE+4; выполняется при совпадении селектора switch. */
case UMP_LOG_BASE+4: return UMP_LOG_WORDS;
/* Ветвь выбора для UMP_LOG_BASE+5; выполняется при совпадении селектора switch. */
case UMP_LOG_BASE+5: return UMP_LOG_CAPACITY;
/* Ветвь выбора для UMP_LOG_BASE+6; выполняется при совпадении селектора switch. */
case UMP_LOG_BASE+6: return ump_period;
/* Ветвь выбора для UMP_LOG_BASE+7; выполняется при совпадении селектора switch. */
case UMP_LOG_BASE+7: return (unsigned int)ump_time;
/* Ветвь выбора для UMP_LOG_BASE+8; выполняется при совпадении селектора switch. */
case UMP_LOG_BASE+8: return (unsigned int)(ump_time >> 16);
/* Ветвь выбора для UMP_LOG_BASE+9; выполняется при совпадении селектора switch. */
case UMP_LOG_BASE+9: return Desk;
/* Ветвь выбора для UMP_LOG_BASE+10; выполняется при совпадении селектора switch. */
case UMP_LOG_BASE+10: return Mode;
/* Ветвь выбора для UMP_LOG_BASE+11; выполняется при совпадении селектора switch. */
case UMP_LOG_BASE+11: return (unsigned int)READY_FREQ;
/* Ветвь выбора для UMP_LOG_BASE+12; выполняется при совпадении селектора switch. */
case UMP_LOG_BASE+12: return ump_generation;
/* Ветвь выбора для UMP_LOG_BASE+13; выполняется при совпадении селектора switch. */
case UMP_LOG_BASE+13: return ump_archive_count;
/* Preserve the legacy millisecond status field as an upper estimate.
* Additional event records may finish the post interval sooner. */
/* Ветвь выбора для UMP_LOG_BASE+14; выполняется при совпадении селектора switch. */
case UMP_LOG_BASE+14:
/* Записывает first значением (unsigned long)ump_post * ump_period; данные first. */
first = (unsigned long)ump_post * ump_period;
/* Завершает ump_log_read и возвращает first > 65535UL ? 65535U : (unsigned int)first. */
return first > 65535UL ? 65535U : (unsigned int)first;
/* Ветвь выбора для UMP_LOG_BASE+15; выполняется при совпадении селектора switch. */
case UMP_LOG_BASE+15: return ump_state;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if (address >= UMP_LOG_DATA и address < UMP_LOG_DATA+120 и (ump_source или ump_state != 1)); последующий оператор выполняется только при истинном условии. */
if (address >= UMP_LOG_DATA && address < UMP_LOG_DATA+120 && (ump_source || ump_state != 1)) {
/* Записывает offset значением address - UMP_LOG_DATA; данные offset. */
offset = address - UMP_LOG_DATA;
/* Завершает ump_log_read и возвращает ump_word(ump_source, ump_cursor + offset / UMP_LOG_WORDS, offset % UMP_LOG_WORDS). */
return ump_word(ump_source, ump_cursor + offset / UMP_LOG_WORDS, offset % UMP_LOG_WORDS);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Последние три записи для онлайн-графика, без остановки и без
* изменения курсора архивного чтения. Первые два слова — их номер. */
/* Последние три записи для онлайн-графика, без остановки и без
* изменения курсора архивного чтения. Первые два слова — их номер. */
/* Проверяет if (address >= UMP_LOG_LIVE и address < UMP_LOG_LIVE+124); последующий оператор выполняется только при истинном условии. */
if (address >= UMP_LOG_LIVE && address < UMP_LOG_LIVE+124) {
/* Записывает count значением ump_count < UMP_LOG_LIVE_RECORDS ? ump_count : UMP_LOG_LIVE_RECORDS; число. */
count = ump_count < UMP_LOG_LIVE_RECORDS ? ump_count : UMP_LOG_LIVE_RECORDS;
/* Записывает first значением ump_sequence - count; данные first. */
first = ump_sequence - count;
/* Записывает offset значением address - UMP_LOG_LIVE; данные offset. */
offset = address - UMP_LOG_LIVE;
/* Проверяет if (offset == 0) return (unsigned int)first; последующий оператор выполняется только при истинном условии. */
if (offset == 0) return (unsigned int)first;
/* Проверяет if (offset == 1) return (unsigned int)(first >> 16); последующий оператор выполняется только при истинном условии. */
if (offset == 1) return (unsigned int)(first >> 16);
/* Проверяет if (offset == 2) return count; последующий оператор выполняется только при истинном условии. */
if (offset == 2) return count;
/* Проверяет if (offset == 3) return ump_generation; последующий оператор выполняется только при истинном условии. */
if (offset == 3) return ump_generation;
/* Уменьшает offset значением 4; данные offset. */
offset -= 4;
/* Проверяет if (offset / UMP_LOG_WORDS < count); последующий оператор выполняется только при истинном условии. */
if (offset / UMP_LOG_WORDS < count)
/* Завершает ump_log_read и возвращает ump_word(0, ump_count - count + offset / UMP_LOG_WORDS, offset % UMP_LOG_WORDS). */
return ump_word(0, ump_count - count + offset / UMP_LOG_WORDS, offset % UMP_LOG_WORDS);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Завершает ump_log_read и возвращает 0. */
return 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
+184 -17
View File
@@ -1,217 +1,384 @@
/* Порядок запуска периферии и обслуживание команд в главном цикле. Русские пояснения сохранены в UTF-8. */
/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
/* Подключает "cntrl_adr.h": собственный и универсальный адрес устройства. */
#include "cntrl_adr.h"
/* Подключает "RS485.h": приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
#include "RS485.h"
/* Подключает "BIOS_DSP.h": настройки и интерфейс BIOS_DSP. */
#include "BIOS_DSP.h"
/* Подключает "Message.h": настройки и интерфейс Message. */
#include "Message.h"
/* Подключает "filter_bat2.h": накопительный фильтр измерительных каналов. */
#include "filter_bat2.h"
/* Подключает "measure.h": обработка датчиков, вычисление величин и миллисекундный такт системы. */
#include "measure.h"
/* Подключает "package.h": адреса устройств, типы плат и псевдонимы технологических регистров. */
#include "package.h"
/* Подключает "spise2p.h": драйвер SPI EEPROM, адресация, страницы и автомат завершения операций. */
#include "spise2p.h"
/* Подключает "tools.h": настройка внешней памяти и служебные задержки. */
#include "tools.h"
/* Подключает "peripher.h": перемычки режима платы, дискретные входы и выходы. */
#include "peripher.h"
/* Подключает "ADC.h": настройка АЦП, обработка преобразований и первичная фильтрация измерений. */
#include "ADC.h"
/* Подключает "DAC.h": выход ЦАП и автомат защиты нагрузки с проверкой напряжения и свежести CAN. */
#include "DAC.h"
/* Подключает "ecan.h": штатный eCAN и отдельный служебный обмен УМП/GAS. */
#include "ecan.h"
/* Подключает "kanal.h": последовательный вывод данных канала индикации. */
#include "kanal.h"
/* Подключает "pulto.h": обмен и индикация пульта. */
#include "pulto.h"
/* Подключает "log_to_mem.h": двухбанковый регистратор событий нагрузки во внешней RAM. */
#include "log_to_mem.h"
/* Подключает "measure.h": обработка датчиков, вычисление величин и миллисекундный такт системы. */
#include "measure.h"
/* Объявляет интерфейс функции DSP28x_usDelay; реализация вызывается через этот прототип. */
extern void DSP28x_usDelay(Uint32 Count);
/* Назначает обработчик Timer1 по типу платы и задаёт период основного такта. */
void timer_Init()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Разрешение записи в защищённые регистры периферии. */
EALLOW; // This is needed to write to EALLOW protected registers
/* Проверяет if(Desk==dsk_EPLT) PieVectTable.XINT13 = &cpu_timer1_isr_PULT; последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_EPLT) PieVectTable.XINT13 = &cpu_timer1_isr_PULT;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else PieVectTable.XINT13 = &cpu_timer1_isr_SENS;
/* Закрытие доступа к защищённым регистрам периферии. */
EDIS; // This is needed to disable write to EALLOW protected registers
/* Вызывает ConfigCpuTimer с аргументами (&CpuTimer1, SYSCLKOUT/1000000, 1000000/READY_FREQ) в текущей последовательности операций. */
ConfigCpuTimer(&CpuTimer1, SYSCLKOUT/1000000, 1000000/READY_FREQ);
/* Записывает CpuTimer1Regs.TCR.all значением 0x4020; представление регистра целым словом без разбиения на битовые поля. */
CpuTimer1Regs.TCR.all = 0x4020; // Use write-only instruction to set TSS bit = 0
/* Устанавливает биты IER значением M_INT13; регистр разрешения прерываний ядра C28x. */
IER |= M_INT13;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Точка входа: настраивает периферию, загружает параметры и обслуживает команды в главном цикле. */
void main()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет i — данные i; j — данные j; mask — маска. */
int i,j,mask;
/* Объявляет cancount — данные cancount; cancell — данные cancell; rscount — данные rscount. */
static unsigned int cancount[2], cancell[2], rscount;
/* Объявляет rs — данные rs. Хранит указатель на данные. */
RS_DATA * rs;
/* Объявляет presbyt — данные presbyt. Начальное значение задаётся справа от знака равенства. */
int presbyt=0;
/* Инициализирует модуль вызовом InitSysCtrl(); перед его дальнейшим использованием. */
InitSysCtrl();
// Disable CPU interrupts and clear all CPU interrupt flags:
/* Запрет маскируемых прерываний ядра. */
DINT;
/* Инициализирует модуль вызовом InitPieCtrl(); перед его дальнейшим использованием. */
InitPieCtrl();
/* Записывает IER значением 0x0000; регистр разрешения прерываний ядра C28x. */
IER = 0x0000;
/* Записывает IFR значением 0x0000; регистр ожидающих прерываний ядра C28x. */
IFR = 0x0000;
/* Инициализирует модуль вызовом InitPieVectTable(); перед его дальнейшим использованием. */
InitPieVectTable();
/* Вызывает init_zone7. Настраивает временные параметры внешней шины XINTF Zone7 для RAM регистратора. */
init_zone7();
/* Вызывает get_Mode. Определяет адрес и тип платы по аппаратным перемычкам и задаёт рабочий режим. */
get_Mode();
/* Вызывает InitCan. Настраивает eCAN, скорость, почтовые ящики и маршрутизацию прерываний для выбранного режима платы. */
InitCan(0,Mode);
/* Вызывает create_uart_vars. Инициализирует структуры обоих SCI и таблицу длин команд. */
create_uart_vars(sizeof(CMD_TO_TMS));
/* Вызывает setup_uart. Настраивает выбранный SCI, скорость и обработчики прерываний. */
setup_uart(COM_1,115200);
/* Проверяет if(Owen)setup_uart(COM_2,57600); последующий оператор выполняется только при истинном условии. */
if(Owen)setup_uart(COM_2,57600);
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else setup_uart(COM_2,115200);
/* Инициализирует модуль вызовом InitSeeprom(); перед его дальнейшим использованием. */
InitSeeprom();
/* Вызывает setup_leds_line с аргументами () в текущей последовательности операций. */
setup_leds_line();
/* Вызывает led1_on с аргументами () в текущей последовательности операций. */
led1_on();
/* Вызывает led2_off с аргументами () в текущей последовательности операций. */
led2_off();
/* Цикл for (i=0;i<10;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for (i=0;i<10;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Вызывает pause_us. Формирует задержку в микросекундах через калиброванную функцию DSP28x_usDelay. */
pause_us(50000);
/* Вызывает led2_toggle с аргументами () в текущей последовательности операций. */
led2_toggle();
/* Вызывает led1_toggle с аргументами () в текущей последовательности операций. */
led1_toggle();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Вызывает led1_off с аргументами () в текущей последовательности операций. */
led1_off();
/* Вызывает led2_off с аргументами () в текущей последовательности операций. */
led2_off();
/* Вызывает unsetup_leds_line с аргументами () в текущей последовательности операций. */
unsetup_leds_line();
/* Вызывает clear_mem. Обнуляет выделенный диапазон внешней RAM журнала и задаёт границы кольцевого буфера. */
clear_mem();
/* Вызывает ump_log_init. Явно инициализирует оба банка регистратора до включения IRQ; повторный старт записи архив не стирает. */
ump_log_init();
Load_control_init(); /* Explicit initialization before IRQ. */
Load_control_init(); /* Explicit initialization before IRQ. */ /* Вызывает Load_control_init. Сбрасывает все переменные автомата нагрузки до разрешения прерываний; COFF не обнуляет всю .ebss. */
/* Вызывает set_cntrl_addr. Устанавливает собственный и универсальный адрес для проверки адресованных команд. */
set_cntrl_addr(Mode,16);
/* Вызывает timer_Init. Назначает обработчик Timer1 по типу платы и задаёт период основного такта. */
timer_Init();
/* Вызывает EnableInterrupts с аргументами () в текущей последовательности операций. */
EnableInterrupts();
/* Проверяет if(Desk!=dsk_EPLT); последующий оператор выполняется только при истинном условии. */
if(Desk!=dsk_EPLT)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Вызывает setup_adc. Настраивает каналы, последовательность преобразований и запуск АЦП. */
setup_adc();
/* Инициализирует модуль вызовом Init_sensors(); перед его дальнейшим использованием. */
Init_sensors();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Инициализирует модуль вызовом Init_packMask(); перед его дальнейшим использованием. */
Init_packMask();
/* Вызывает Load_params. Читает сохранённые регистры из области параметров EEPROM и применяет настройки платы. */
Load_params();
/* Инициализирует модуль вызовом Init_sensors_more(); перед его дальнейшим использованием. */
Init_sensors_more();
/* Проверяет if(Desk==dsk_LOAD); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_LOAD)
/* Вызывает Setup_DAC_time. Вычисляет такты ЦАП; для недопустимого сохранённого тайм-аута CAN возвращает 600 мс. */
Setup_DAC_time();
/* Записывает LastMode значением Mode; последний режим платы, технологический регистр 126. */
LastMode = Mode;
/* Разрешение записи в защищённые регистры периферии. */
EALLOW;
/* Записывает SysCtrlRegs.WDCR значением 0x2F; данные WDCR. */
SysCtrlRegs.WDCR= 0x2F;
/* Закрытие доступа к защищённым регистрам периферии. */
EDIS;
/* Записывает READY значением 1; данные READY. */
READY=1;
/* Повторяет или ожидает, пока выполняется while(1). */
while(1)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Чтение логгера по CAN не блокирует цикл управления. */
/* Чтение логгера по CAN не блокирует цикл управления. */
/* Вызывает UMP_CAN_service. В главном цикле готовит замороженный ответ служебного CAN и отправляет его двухсловными фрагментами. */
UMP_CAN_service();
/* Проверяет if(CanGO); последующий оператор выполняется только при истинном условии. */
if(CanGO)
{
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает CanGO значением 0; CAN GO. */
CanGO=0;
/* Проверяет if(Owncount); последующий оператор выполняется только при истинном условии. */
if(Owncount)
/* Проверяет if(++rscount>=Owncount); последующий оператор выполняется только при истинном условии. */
if(++rscount>=Owncount)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает rscount значением 0; данные rscount. */
rscount=0;
/* Вызывает SendCommandModbus4 с аргументами (&rs_b) в текущей последовательности операций. */
SendCommandModbus4(&rs_b);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Цикл for(i=0;i<2;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<2;i++)
if(++cancount[i] >= Cancount[i])
/* Проверяет if(++cancount[i] >= Cancount[i]); последующий оператор выполняется только при истинном условии. */
if(++cancount[i] >= Cancount[i])
/* Проверяет if(Cancount[i] и cancount[0]); последующий оператор выполняется только при истинном условии. */
if(Cancount[i] && cancount[0])
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
cancount[i] = 0;
/* Записывает cancount[i] значением 0; данные cancount. */
cancount[i] = 0;
/* Повторяет или ожидает, пока выполняется while(1). */
while(1)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(cancell[i] >= 0x80) cancell[i]=0; последующий оператор выполняется только при истинном условии. */
if(cancell[i] >= 0x80) cancell[i]=0;
/* Записывает mask значением Maska[i][cancell[i]/16] >> (cancell[i]%16); маска. */
mask = Maska[i][cancell[i]/16] >> (cancell[i]%16);
/* Проверяет if(!mask) cancell[i] = (cancell[i] + 0x10) & 0xFFF0; последующий оператор выполняется только при истинном условии. */
if(!mask) cancell[i] = (cancell[i] + 0x10) & 0xFFF0;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Повторяет или ожидает, пока выполняется while(!(mask & 1)). */
while(!(mask & 1))
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Изменяет счётчик в выражении cancell[i]++; mask >>= 1; на один для следующего шага. */
cancell[i]++; mask >>= 1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/* Вызывает CAN_send. Упаковывает адрес и технологические слова в штатный CAN-кадр и запускает передачу mailbox. */
CAN_send(0,modbus,cancell[i]);
cancell[i]+=3;
/* Увеличивает cancell[i] значением 3; данные cancell. */
cancell[i]+=3;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/* Проверяет if(cDefParam); последующий оператор выполняется только при истинном условии. */
if(cDefParam)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает cDefParam значением 0; данные cDefParam. */
cDefParam=0;
/* Вызывает Default_params. Заполняет регистры заводскими значениями; тайм-аут CAN нагрузки по умолчанию равен 600 мс. */
Default_params();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(cSaveParam); последующий оператор выполняется только при истинном условии. */
if(cSaveParam)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает cSaveParam значением 0; данные cSaveParam. */
cSaveParam=0;
/* Вызывает Save_params. Сохраняет технологические регистры в область параметров, отделённую от загрузочного образа EEPROM. */
Save_params();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(cLoadParam); последующий оператор выполняется только при истинном условии. */
if(cLoadParam)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает cLoadParam значением 0; данные cLoadParam. */
cLoadParam=0;
/* Вызывает Load_params. Читает сохранённые регистры из области параметров EEPROM и применяет настройки платы. */
Load_params();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(cKoefCalc); последующий оператор выполняется только при истинном условии. */
if(cKoefCalc)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает cKoefCalc значением 0; данные cKoefCalc. */
cKoefCalc=0;
/* Вызывает calc_sensor_koef с аргументами () в текущей последовательности операций. */
calc_sensor_koef();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Вызывает get_Buttons. Считывает кнопки, обновляет флаги команд и учитывает текущий тип платы. */
get_Buttons();
/* Проверяет if(Desk==dsk_COMM); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_COMM)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(!bTermoCal & presbyt) cSaveParam=1; последующий оператор выполняется только при истинном условии. */
if(!bTermoCal & presbyt) cSaveParam=1;
/* Записывает presbyt значением bTermoCal; данные presbyt. */
presbyt = bTermoCal;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Timer1 owns START/STOP/permission and the DAC ramp together.
* Main must not re-enable the output during a protected reload. */
/* Снимок после обновления входов и формирования пусковых выходов. */
/* Снимок после обновления входов и формирования пусковых выходов. */
/* Вызывает ump_log_io. Обслуживает изменения дискретных входов и выходов из главного цикла. */
ump_log_io();
/* Цикл for(i=0;i<2;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<2;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(i) rs = &rs_a; последующий оператор выполняется только при истинном условии. */
if(i) rs = &rs_a;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else rs = &rs_b;
/* Записывает j значением get_command(rs); данные j. */
j = get_command(rs);
/* Проверяет if(j!=-1); последующий оператор выполняется только при истинном условии. */
if(j!=-1)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает Lonely значением 0; данные Lonely. */
Lonely=0;
/* Вызывает led2_toggle с аргументами () в текущей последовательности операций. */
led2_toggle();
/* Вызывает switch с аргументами (j) в текущей последовательности операций. */
switch(j)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
case CMD_INIT: init(rs); break; // начальные установки
case CMD_INITLOAD: initload(rs); break; // настройка загрузки
case CMD_RUN: run(rs); break; // загрузить блок
case CMD_LOAD: load(rs); break; // загрузить блок
case CMD_PEEK: peek(rs); break; // прочитать ачейку памати
case CMD_POKE: poke(rs); break; // записать в ачейку памати
case CMD_UPLOAD: upload(rs); break; // передать блок памати
case CMD_EXTEND: extendbios(rs); break; // расширенные команды дла биоса
case CMD_TFLASH: tflash(rs); break; // прошить TMS
/* Ветвь выбора для CMD_INIT; выполняется при совпадении селектора switch. */
case CMD_INIT: init(rs); break; // начальные установки
/* Ветвь выбора для CMD_INITLOAD; выполняется при совпадении селектора switch. */
case CMD_INITLOAD: initload(rs); break; // настройка загрузки
/* Ветвь выбора для CMD_RUN; выполняется при совпадении селектора switch. */
case CMD_RUN: run(rs); break; // загрузить блок
/* Ветвь выбора для CMD_LOAD; выполняется при совпадении селектора switch. */
case CMD_LOAD: load(rs); break; // загрузить блок
/* Ветвь выбора для CMD_PEEK; выполняется при совпадении селектора switch. */
case CMD_PEEK: peek(rs); break; // прочитать ачейку памати
/* Ветвь выбора для CMD_POKE; выполняется при совпадении селектора switch. */
case CMD_POKE: poke(rs); break; // записать в ачейку памати
/* Ветвь выбора для CMD_UPLOAD; выполняется при совпадении селектора switch. */
case CMD_UPLOAD: upload(rs); break; // передать блок памати
/* Ветвь выбора для CMD_EXTEND; выполняется при совпадении селектора switch. */
case CMD_EXTEND: extendbios(rs); break; // расширенные команды дла биоса
/* Ветвь выбора для CMD_TFLASH; выполняется при совпадении селектора switch. */
case CMD_TFLASH: tflash(rs); break; // прошить TMS
/* Ветвь выбора для CMD_MODBUS_3; выполняется при совпадении селектора switch. */
case CMD_MODBUS_3: ReceiveCommandModbus3(rs); break;
/* Ветвь выбора для CMD_MODBUS_6; выполняется при совпадении селектора switch. */
case CMD_MODBUS_6: ReceiveCommandModbus6(rs); break;
/* Ветвь выбора для ANS_MODBUS_4; выполняется при совпадении селектора switch. */
case ANS_MODBUS_4: ReceiveAnswerModbus4(rs); break;
/* Обрабатывает значения селектора, для которых нет отдельной ветви case. */
default: break;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} } } } }
+749 -124
View File
@@ -1,489 +1,872 @@
/* Обработка датчиков, вычисление величин и миллисекундный такт системы. Русские пояснения сохранены в UTF-8. */
/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_SWPrioritizedIsrLevels.h"
/* Подключает "DSP2833x_SWPrioritizedIsrLevels.h": поставляемое TI описание SWPrioritizedIsrLevels для семейства C2833x. */
#include "DSP2833x_SWPrioritizedIsrLevels.h"
/* Подключает "filter_bat2.h": накопительный фильтр измерительных каналов. */
#include "filter_bat2.h"
/* Подключает "package.h": адреса устройств, типы плат и псевдонимы технологических регистров. */
#include "package.h"
/* Подключает "measure.h": обработка датчиков, вычисление величин и миллисекундный такт системы. */
#include "measure.h"
/* Подключает "package.h": адреса устройств, типы плат и псевдонимы технологических регистров. */
#include "package.h"
/* Подключает "peripher.h": перемычки режима платы, дискретные входы и выходы. */
#include "peripher.h"
/* Подключает "ADC.h": настройка АЦП, обработка преобразований и первичная фильтрация измерений. */
#include "ADC.h"
/* Подключает "DAC.h": выход ЦАП и автомат защиты нагрузки с проверкой напряжения и свежести CAN. */
#include "DAC.h"
/* Подключает "RS485.h": приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
#include "RS485.h"
/* Подключает "message.h": обработка Modbus, заводские параметры и сохранение настроек. */
#include "message.h"
/* Подключает "log_to_mem.h": двухбанковый регистратор событий нагрузки во внешней RAM. */
#include "log_to_mem.h"
#include <math.h> // Это чтобы мерить амплитуду! sqrt без этого будет крив!!!
/* Подключает <math.h>: настройки и интерфейс math. */
#include <math.h> // Это чтобы мерить амплитуду! sqrt без этого будет крив!!!
/* Объявляет CanPowse — CAN Powse; CANPOWSE — данные CANPOWSE; CanGO — CAN GO. Начальное значение задаётся справа от знака равенства. */
unsigned int CanPowse=CANPOWSE,CanGO=0;
unsigned int Maska[2][8];
/* Объявляет Maska[2][8];. */
unsigned int Maska[2][8];
int READY=0; // Все загрузилос
/* Объявляет READY — данные READY. Начальное значение задаётся справа от знака равенства. */
int READY=0; // Все загрузилос
int TPL_CANS=0; // Количество температурных каналов
int tpl_cans=0; // Количество температурных датчиков
int cal_addr=0; // Начало калибровочных датчиков
int pow_addr=0; // Начало датчиков напражениа\тока
/* Объявляет TPL_CANS — данные TPL_CANS. Начальное значение задаётся справа от знака равенства. */
int TPL_CANS=0; // Количество температурных каналов
/* Объявляет tpl_cans — данные tpl_cans. Начальное значение задаётся справа от знака равенства. */
int tpl_cans=0; // Количество температурных датчиков
/* Объявляет cal_addr — данные cal_addr. Начальное значение задаётся справа от знака равенства. */
int cal_addr=0; // Начало калибровочных датчиков
/* Объявляет pow_addr — данные pow_addr. Начальное значение задаётся справа от знака равенства. */
int pow_addr=0; // Начало датчиков напражениа\тока
/* Объявляет period_ready — период ready; period_blink — период blink. */
int period_ready, period_blink;
/* Объявляет chk — данные chk; sig — данные sig. */
FLAG chk,sig;
/* Объявляет time_1_5sec — данные time_1_5sec; time_5msec — данные time_5msec; time_3sec — данные time_3sec; time_5sec — данные time_5sec. */
unsigned int time_1_5sec, time_5msec, time_3sec, time_5sec;
/* Объявляет low_count — low число. Начальное значение задаётся справа от знака равенства. */
unsigned int low_count[2] = {0,0};
/* Объявляет err_count — err число. */
unsigned int err_count[6];
/* Объявляет lev_count — lev число. */
int lev_count[6];
/* Объявляет lev_quadr — данные lev_quadr. */
float lev_quadr[6];
/* Объявляет zer_count — zer число. */
float zer_count[4];
/* Объявляет sens_type — данные sens_type. */
int sens_type[24];
/* Объявляет sens_pair — данные sens_pair. */
int sens_pair[24];
/* Объявляет din_count — din число. */
unsigned int din_count[32];
/* Объявляет ext_temp — данные ext_temp. */
int ext_temp[8];
/* Объявляет ext_diag — данные ext_diag. */
int ext_diag[8];
/* Объявляет Caliber_time — данные Caliber_time. Начальное значение задаётся справа от знака равенства. */
unsigned int Caliber_time = 0;
/* Объявляет Curr_Edge — данные Curr_Edge. */
int Curr_Edge;
/* Объявляет okay — данные okay. */
ERROR okay;
float powK[] =
/* Объявляет powK — данные powK. Начальное значение задаётся справа от знака равенства. */
float powK[] =
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
0.127, // питание 380В
0.127, // питание 380В
/* Элемент постоянной таблицы 0.127,; порядок значений совпадает с порядком индексов потребителя. */
0.127, // питание 380В
/* Элемент постоянной таблицы 0.127,; порядок значений совпадает с порядком индексов потребителя. */
0.127, // питание 380В
1.000, // ток
1.000, // напражение
/* Элемент постоянной таблицы 1.000,; порядок значений совпадает с порядком индексов потребителя. */
1.000, // ток
/* Элемент постоянной таблицы 1.000,; порядок значений совпадает с порядком индексов потребителя. */
1.000, // напражение
0.0076, // питание 31В
0.0076, // питание 24В
0.0076, // питание 24В
0.0076, // питание 15В
1.0000, // термодатчик мелкосхема
/* Элемент постоянной таблицы 0.0076,; порядок значений совпадает с порядком индексов потребителя. */
0.0076, // питание 31В
/* Элемент постоянной таблицы 0.0076,; порядок значений совпадает с порядком индексов потребителя. */
0.0076, // питание 24В
/* Элемент постоянной таблицы 0.0076,; порядок значений совпадает с порядком индексов потребителя. */
0.0076, // питание 24В
/* Элемент постоянной таблицы 0.0076,; порядок значений совпадает с порядком индексов потребителя. */
0.0076, // питание 15В
/* Элемент постоянной таблицы 1.0000,; порядок значений совпадает с порядком индексов потребителя. */
1.0000, // термодатчик мелкосхема
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
};
/* Объявляет def_FILTERBAT — данные def_FILTERBAT; DEF_FILTERBAT — данные DEF_FILTERBAT. Начальное значение задаётся справа от знака равенства. */
FILTERBAT def_FILTERBAT = DEF_FILTERBAT;
FILTERBAT adc_filter[20+4]; // макс.TPL*2 + 4 калибр
FILTERBAT out_filter[20+4]; // макс.TPL*2 + 4 напраж
FILTERBAT zer_filter[4]; // 4 напраж
/* Объявляет adc_filter — АЦП filter. */
FILTERBAT adc_filter[20+4]; // макс.TPL*2 + 4 калибр
/* Объявляет out_filter — данные out_filter. */
FILTERBAT out_filter[20+4]; // макс.TPL*2 + 4 напраж
/* Объявляет zer_filter — данные zer_filter. */
FILTERBAT zer_filter[4]; // 4 напраж
/* Объявляет sens_count — sens число. */
long sens_count[24+4];
/* Объявляет K100 — данные K100; K_50 — данные K_50. */
float K100,K_50;
/* Объявляет K_T1 — данные K_T1; K_T2 — данные K_T2. */
float K_T1,K_T2;
/* Выполняет миллисекундный такт датчиков, таймеров связи, регистратора и защиты нагрузки. */
interrupt void cpu_timer1_isr_SENS(void);
/********************************************************************/
/* Расчет модула тока из показаний двух фаз */
/********************************************************************/
/* Расчет модула тока из показаний двух фаз */
/********************************************************************/
/* Начинает функцию im_calc; назначение модуля — обработка датчиков, вычисление величин и миллисекундный такт системы. */
float im_calc(float ia,float ib)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет isa — данные isa; isb — данные isb. */
float isa,isb;
/* Записывает isa значением - 1.5 * (ia + ib); данные isa. */
isa = - 1.5 * (ia + ib);
/* Записывает isb значением COSPi6 * (ia - ib); данные isb. */
isb = COSPi6 * (ia - ib);
/* Завершает im_calc и возвращает (2*sqrt(isa*isa+isb*isb)/3). */
return (2*sqrt(isa*isa+isb*isb)/3);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию calc_sensor_koef; назначение модуля — обработка датчиков, вычисление величин и миллисекундный такт системы. */
void calc_sensor_koef()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет i — данные i. */
int i;
/* Объявляет K — данные K. */
float K;
/* Проверяет if(TermoRS); последующий оператор выполняется только при истинном условии. */
if(TermoRS)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
K100 = 129.0/(K150_D - K100_D);
/* Записывает K100 значением 129.0/(K150_D - K100_D); данные K100. */
K100 = 129.0/(K150_D - K100_D);
/* Записывает K_50 значением 261.8/(K150_D - K100_D); данные K_50. */
K_50 = 261.8/(K150_D - K100_D);
K_T1 = 129.0/(K150_1 - K100_1);
K_T2 = 129.0/(K150_2 - K100_2);
/* Записывает K_T1 значением 129.0/(K150_1 - K100_1); данные K_T1. */
K_T1 = 129.0/(K150_1 - K100_1);
/* Записывает K_T2 значением 129.0/(K150_2 - K100_2); данные K_T2. */
K_T2 = 129.0/(K150_2 - K100_2);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(TermoAD); последующий оператор выполняется только при истинном условии. */
if(TermoAD)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает K_T1 значением 100.0/(K400_1 - K300_1); данные K_T1. */
K_T1 = 100.0/(K400_1 - K300_1);
/* Записывает K_T2 значением 100.0/(K400_2 - K300_2); данные K_T2. */
K_T2 = 100.0/(K400_2 - K300_2);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
// if(Kurrent)
/* Цикл for(i=0;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<4;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает K значением Caliber[i]; данные K. */
K = Caliber[i];
/* Проверяет if(sens_type[i]==CURRENT) K/=1000.0; последующий оператор выполняется только при истинном условии. */
if(sens_type[i]==CURRENT) K/=1000.0;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else K/=10000.0;
/* Записывает powK[i] значением K; данные powK. */
powK[i] = K;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/* Выполняет миллисекундный такт датчиков, таймеров связи, регистратора и защиты нагрузки. */
interrupt void cpu_timer1_isr_SENS(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет . */
static unsigned int
count_blink=0, count_bright=0, count_mode,
/* Записывает count_blink значением 0, count_bright=0, count_mode,; число blink. */
count_blink=0, count_bright=0, count_mode,
/* Продолжает список аргументов, полей или выражение blink_over, blink_alarm, work_lamp, heat_lamp, power_lamp;; порядок элементов сохраняется. */
blink_over, blink_alarm, work_lamp, heat_lamp, power_lamp;
/* Объявляет preTest — данные preTest. */
static int preTest;
/* Объявляет TST — данные TST. */
int TST;
#define err_lamp work_lamp // это дла шкапа,
#define alm_lamp heat_lamp // чтоб было понатнее
/* Задаёт err_lamp = work_lamp; данные err_lamp. */
#define err_lamp work_lamp // это дла шкапа,
/* Задаёт alm_lamp = heat_lamp; данные alm_lamp. */
#define alm_lamp heat_lamp // чтоб было понатнее
/* Разрешение записи в защищённые регистры периферии. */
EALLOW;
/* Изменяет счётчик в выражении CpuTimer1.InterruptCount++; на один для следующего шага. */
CpuTimer1.InterruptCount++;
/* Условие компиляции RS232_USE_FIFO: выбранный блок включается в текущий вариант прошивки. */
#if RS232_USE_FIFO
/* Вызывает RS_FifoTick1ms. Уменьшает защитную паузу RX FIFO по миллисекундному такту. */
RS_FifoTick1ms();
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Устанавливает биты IER значением M_INT13; регистр разрешения прерываний ядра C28x. */
IER |= M_INT13; // Set "global" priority
/* Оставляет биты маски IER значением MINT13; регистр разрешения прерываний ядра C28x. */
IER &= MINT13; // Set "global" priority
/* Разрешение маскируемых прерываний ядра. */
EINT;
/* Закрытие доступа к защищённым регистрам периферии. */
EDIS; // This is needed to disable write to EALLOW protected registers
/* Проверяет if(!cReset) ServiceDog(); последующий оператор выполняется только при истинном условии. */
if(!cReset) ServiceDog();
/* Проверяет if(++CanPowse >= CANPOWSE); последующий оператор выполняется только при истинном условии. */
if(++CanPowse >= CANPOWSE)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает CanPowse значением 0; CAN Powse. */
CanPowse = 0;
/* Записывает CanGO значением 1; CAN GO. */
CanGO = 1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает TST значением cTestLamp|bTestLamp; данные TST. */
TST = cTestLamp|bTestLamp;
/* Проверяет if(!sig.bit.Error|TST) toggle_READY(); последующий оператор выполняется только при истинном условии. */
if(!sig.bit.Error|TST) toggle_READY();
else clear_READY();
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else clear_READY();
/* Проверяет if(Desk==dsk_LOAD); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_LOAD)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Вызывает Load_runner. В такте Timer1 проверяет команды, напряжение и давность CAN; управляет STOP, повторным пуском и током ЦАП. */
Load_runner();
/* База времени 1 мс; снимок содержит результат текущего шага ЦАП. */
/* База времени 1 мс; снимок содержит результат текущего шага ЦАП. */
/* Вызывает ump_log_tick. Продвигает время регистратора в Timer1 и снимает записи с заданным периодом. */
ump_log_tick();
/* Завершает cpu_timer1_isr_SENS без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(++count_bright == maximum_bright); последующий оператор выполняется только при истинном условии. */
if(++count_bright == maximum_bright)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает count_bright значением 0 ; число bright. */
count_bright = 0 ;
if( ((Desk==dsk_SHKF) && power_lamp) ||
/* Проверяет if( ((Desk==dsk_SHKF) и power_lamp) или; последующий оператор выполняется только при истинном условии. */
if( ((Desk==dsk_SHKF) && power_lamp) ||
/* Продолжает список аргументов, полей или выражение ((Desk==dsk_COMM) && heat_lamp) ) set_RES_OUT_1();; порядок элементов сохраняется. */
((Desk==dsk_COMM) && heat_lamp) ) set_RES_OUT_1();
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else clear_RES_OUT_1();
if(work_lamp) set_LED_OUT_1(); // Она же err_lamp дла шкапа
/* Проверяет if(work_lamp) set_LED_OUT_1(); последующий оператор выполняется только при истинном условии. */
if(work_lamp) set_LED_OUT_1(); // Она же err_lamp дла шкапа
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else clear_LED_OUT_1();
if(heat_lamp) set_LED_OUT_2(); // Она же alm_lamp дла шкапа
/* Проверяет if(heat_lamp) set_LED_OUT_2(); последующий оператор выполняется только при истинном условии. */
if(heat_lamp) set_LED_OUT_2(); // Она же alm_lamp дла шкапа
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else clear_LED_OUT_2();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(!TST); последующий оператор выполняется только при истинном условии. */
if(!TST)
/* Проверяет if(count_bright == Brightness); последующий оператор выполняется только при истинном условии. */
if(count_bright == Brightness)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Сбрасывает аппаратный сигнал через clear_LED_OUT_1();. */
clear_LED_OUT_1();
/* Сбрасывает аппаратный сигнал через clear_LED_OUT_2();. */
clear_LED_OUT_2();
/* Сбрасывает аппаратный сигнал через clear_RES_OUT_1();. */
clear_RES_OUT_1();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
if(TST & !preTest)
/* Проверяет if(TST & !preTest); последующий оператор выполняется только при истинном условии. */
if(TST & !preTest)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
count_blink = BLINK_TIME;
/* Записывает count_blink значением BLINK_TIME; число blink. */
count_blink = BLINK_TIME;
/* Записывает count_mode значением 0; число режим. */
count_mode = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает preTest значением TST; данные preTest. */
preTest = TST;
/* Проверяет if(++count_blink >= BLINK_TIME); последующий оператор выполняется только при истинном условии. */
if(++count_blink >= BLINK_TIME)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает count_blink значением 0; число blink. */
count_blink=0;
/* Изменяет счётчик в выражении count_mode++; на один для следующего шага. */
count_mode++;
/* Записывает blink_over значением (count_mode & 1)?1:0; данные blink_over. */
blink_over = (count_mode & 1)?1:0;
/* Записывает blink_alarm значением (count_mode & 7)?1:0; данные blink_alarm. */
blink_alarm = (count_mode & 7)?1:0;
/* Проверяет if(TST); последующий оператор выполняется только при истинном условии. */
if(TST)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает heat_lamp значением blink_over; данные heat_lamp. */
heat_lamp = blink_over;
/* Записывает work_lamp значением blink_over; данные work_lamp. */
work_lamp = blink_over;
/* Записывает power_lamp значением blink_over; данные power_lamp. */
power_lamp= blink_over;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(Mode==adr_SHKF); последующий оператор выполняется только при истинном условии. */
if(Mode==adr_SHKF)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает power_lamp значением 1; данные power_lamp. */
power_lamp= 1;
/* Проверяет if(sig.bit.Alarm); последующий оператор выполняется только при истинном условии. */
if(sig.bit.Alarm){// power_lamp= blink_alarm;
/* Записывает alm_lamp значением blink_over; }; данные alm_lamp. */
alm_lamp = blink_over; }
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else alm_lamp = 0;
/* Проверяет if(sig.bit.Error); последующий оператор выполняется только при истинном условии. */
if(sig.bit.Error){ power_lamp= blink_over;
/* Записывает err_lamp значением blink_over; }; данные err_lamp. */
err_lamp = blink_over; }
else err_lamp = 0;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else err_lamp = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// if(sig.bit.Error) work_lamp = blink_over;
// else if(sig.bit.Alarm) work_lamp = blink_alarm;
// else
// else
/* Записывает work_lamp значением 1; данные work_lamp. */
work_lamp = 1;
/* Проверяет if(bSecretBt|cSecretBt) work_lamp = blink_alarm; последующий оператор выполняется только при истинном условии. */
if(bSecretBt|cSecretBt) work_lamp = blink_alarm;
/* Проверяет if(sig.bit.OverHeat) heat_lamp = 1; последующий оператор выполняется только при истинном условии. */
if(sig.bit.OverHeat) heat_lamp = 1;
/* Проверяет else if(sig.bit.SubHeat) heat_lamp = blink_over; последующий оператор выполняется только при истинном условии. */
else if(sig.bit.SubHeat) heat_lamp = blink_over;
/* Проверяет else if(sig.bit.OutHeat) heat_lamp = !blink_alarm; последующий оператор выполняется только при истинном условии. */
else if(sig.bit.OutHeat) heat_lamp = !blink_alarm;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else heat_lamp = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} } } }
/* Начинает функцию Init_sensors; назначение модуля — обработка датчиков, вычисление величин и миллисекундный такт системы. */
void Init_sensors()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет i — данные i. */
int i;
/* Записывает TPL_CANS значением tpl_cans = cal_addr = 0; данные TPL_CANS. */
TPL_CANS = tpl_cans = cal_addr = 0;
/* Вызывает switch с аргументами (Mode) в текущей последовательности операций. */
switch(Mode)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Ветвь выбора для adr_TRN1; выполняется при совпадении селектора switch. */
case adr_TRN1:
case adr_TRN2:
/* Ветвь выбора для adr_TRN2; выполняется при совпадении селектора switch. */
case adr_TRN2:
/* Записывает TPL_CANS значением TPL_TRN; tpl_cans = TPL_TRN*2; cal_addr = tpl_cans; break; данные TPL_CANS. */
TPL_CANS = TPL_TRN; tpl_cans = TPL_TRN*2; cal_addr = tpl_cans; break;
/* Ветвь выбора для adr_POW1; выполняется при совпадении селектора switch. */
case adr_POW1:
case adr_POW2:
/* Ветвь выбора для adr_POW2; выполняется при совпадении селектора switch. */
case adr_POW2:
/* Записывает TPL_CANS значением TPL_POW; tpl_cans = TPL_POW*2; cal_addr = tpl_cans; break; данные TPL_CANS. */
TPL_CANS = TPL_POW; tpl_cans = TPL_POW*2; cal_addr = tpl_cans; break;
case adr_ENG1:
/* Ветвь выбора для adr_ENG1; выполняется при совпадении селектора switch. */
case adr_ENG1:
/* Записывает TPL_CANS значением TPL_ENG; tpl_cans = TPL_ENG; cal_addr = tpl_cans; break; данные TPL_CANS. */
TPL_CANS = TPL_ENG; tpl_cans = TPL_ENG; cal_addr = tpl_cans; break;
/* Ветвь выбора для adr_SHKF; выполняется при совпадении селектора switch. */
case adr_SHKF: tpl_cans = TPL_SHK; cal_addr = tpl_cans-2; break;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает pow_addr значением tpl_cans + Owen; данные pow_addr. */
pow_addr = tpl_cans + Owen;
/* Цикл for(i=0;i<24;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<24;i++)
{
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает sens_type[i] значением 0; данные sens_type. */
sens_type[i]=0;
/* Записывает sens_pair[i] значением i; данные sens_pair. */
sens_pair[i]=i;
/* Записывает adc_filter[i] значением def_FILTERBAT; АЦП filter. */
adc_filter[i] = def_FILTERBAT;
/* Записывает out_filter[i] значением def_FILTERBAT; данные out_filter. */
out_filter[i] = def_FILTERBAT;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(TermoSW); последующий оператор выполняется только при истинном условии. */
if(TermoSW)
/* Цикл for(i=0;i<tpl_cans;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<tpl_cans;i++)
{
if(TermoRS) sens_type[i] = TERMO_RS;
if(TermoAD) sens_type[i] = TERMO_AD;
}
for(i=0;i<Owen;i++)
{
sens_type[tpl_cans+i] = TRM_OBEH;
}
if(Kurrent)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(TermoRS) sens_type[i] = TERMO_RS; последующий оператор выполняется только при истинном условии. */
if(TermoRS) sens_type[i] = TERMO_RS;
/* Проверяет if(TermoAD) sens_type[i] = TERMO_AD; последующий оператор выполняется только при истинном условии. */
if(TermoAD) sens_type[i] = TERMO_AD;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Цикл for(i=0;i<Owen;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<Owen;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает sens_type[tpl_cans+i] значением TRM_OBEH; данные sens_type. */
sens_type[tpl_cans+i] = TRM_OBEH;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(Kurrent); последующий оператор выполняется только при истинном условии. */
if(Kurrent)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает Curr_Edge значением 200; данные Curr_Edge. */
Curr_Edge = 200;
/* Цикл for(i=0;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<4;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает sens_type[pow_addr+i] значением VOLTAGE; данные sens_type. */
sens_type[pow_addr+i]=VOLTAGE;
/* Записывает sens_pair[pow_addr+i] значением pow_addr+(i^1); данные sens_pair. */
sens_pair[pow_addr+i]=pow_addr+(i^1);
/* Записывает zer_count[i] значением Zero_lev[i]; zer число. */
zer_count[i] = Zero_lev[i];
/* Записывает zer_filter[i] значением def_FILTERBAT; данные zer_filter. */
zer_filter[i] = def_FILTERBAT;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/* Проверяет if(Desk==dsk_LOAD); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_LOAD)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает Curr_Edge значением 300; данные Curr_Edge. */
Curr_Edge = 300;
/* Записывает sens_type[2] значением ; данные sens_type. */
sens_type[2]=
/* Записывает sens_type[3] значением CURRENT; данные sens_type. */
sens_type[3]=CURRENT;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(Mode==adr_SHKF); последующий оператор выполняется только при истинном условии. */
if(Mode==adr_SHKF)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает sens_type[0] значением POWER_380; sens_pair[0]=1; данные sens_type. */
sens_type[0] = POWER_380; sens_pair[0]=1;
/* Записывает sens_type[1] значением POWER_38O; sens_pair[1]=0; данные sens_type. */
sens_type[1] = POWER_38O; sens_pair[1]=0;
/* Записывает sens_type[2] значением POWER_31; sens_pair[2]=3; данные sens_type. */
sens_type[2] = POWER_31; sens_pair[2]=3;
/* Записывает sens_type[3] значением POWER_31; sens_pair[3]=2; данные sens_type. */
sens_type[3] = POWER_31; sens_pair[3]=2;
/* Записывает sens_type[4] значением POWER_31; sens_pair[4]=5; данные sens_type. */
sens_type[4] = POWER_31; sens_pair[4]=5;
/* Записывает sens_type[5] значением POWER_31; sens_pair[5]=4; данные sens_type. */
sens_type[5] = POWER_31; sens_pair[5]=4;
/* Записывает sens_type[6] значением POWER_24; данные sens_type. */
sens_type[6] = POWER_24;
/* Записывает sens_type[7] значением POWER_27; данные sens_type. */
sens_type[7] = POWER_27;
/* Записывает sens_type[8] значением POWER_24; данные sens_type. */
sens_type[8] = POWER_24;
/* Записывает sens_type[9] значением POWER_15; данные sens_type. */
sens_type[9] = POWER_15;
/* Записывает sens_type[10] значением POWER_24; данные sens_type. */
sens_type[10] = POWER_24;
/* Записывает sens_type[11] значением POWER_24; данные sens_type. */
sens_type[11] = POWER_24;
/* Записывает sens_type[12] значением POWER_24; данные sens_type. */
sens_type[12] = POWER_24;
/* Записывает sens_type[13] значением TERMO_AD; данные sens_type. */
sens_type[13] = TERMO_AD;
/* Записывает sens_type[14] значением TERMO_AD; данные sens_type. */
sens_type[14] = TERMO_AD;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает DigErr.all значением 0; представление регистра целым словом без разбиения на битовые поля. */
DigErr.all=0;
/* Записывает time_1_5sec значением (3 * ADC_FREQ) / 2; данные time_1_5sec. */
time_1_5sec = (3 * ADC_FREQ) / 2;
/* Записывает time_5msec значением (5 * ADC_FREQ) / 1000; данные time_5msec. */
time_5msec = (5 * ADC_FREQ) / 1000;
/* Записывает time_3sec значением (3 * ADC_FREQ); данные time_3sec. */
time_3sec = (3 * ADC_FREQ);
/* Записывает time_5sec значением (5 * ADC_FREQ); данные time_5sec. */
time_5sec = (5 * ADC_FREQ);
/* Записывает okay.all значением 0; представление регистра целым словом без разбиения на битовые поля. */
okay.all=0;
/* Записывает okay.bit.Tear значением 1; данные Tear. */
okay.bit.Tear=1;
/* Записывает okay.bit.Bypas значением 1; данные Bypas. */
okay.bit.Bypas=1;
/* Записывает okay.bit.Ignor значением 1; данные Ignor. */
okay.bit.Ignor=1;
/* Записывает okay.bit.Imit значением 1; данные Imit. */
okay.bit.Imit=1;
for(i=0;i<6; i++)
/* Цикл for(i=0;i<6; i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<6; i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает err_count[i] значением 0; err число. */
err_count[i] = 0;
/* Записывает lev_count[i] значением 0; lev число. */
lev_count[i] = 0;
/* Записывает lev_quadr[i] значением 0; данные lev_quadr. */
lev_quadr[i] = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Цикл for(i=0;i<28;i++) sens_count[i] = 0;; задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<28;i++) sens_count[i] = 0;
for(i=0;i<32;i++) din_count[i] = 0;
/* Цикл for(i=0;i<32;i++) din_count[i] = 0;; задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<32;i++) din_count[i] = 0;
/* Цикл for(i=0;i<8; i++) ext_temp[i] = ext_diag[i] = 0;; задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<8; i++) ext_temp[i] = ext_diag[i] = 0;
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию Init_sensors_more; назначение модуля — обработка датчиков, вычисление величин и миллисекундный такт системы. */
void Init_sensors_more()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет i — данные i. */
int i;
for(i=0;i<24;i++)
/* Цикл for(i=0;i<24;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<24;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Оставляет биты маски modbus[i] значением NOER; массив технологических регистров; слово int на C28x занимает 16 бит. */
modbus[i] &= NOER;
/* Записывает sens_data[i] значением 0; sens данные. */
sens_data[i]=0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Цикл for(i=0;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<4;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает zer_count[i] значением Zero_lev[i]; zer число. */
zer_count[i] = Zero_lev[i];
/* Проверяет if(Desk==dsk_LOAD); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_LOAD)
/* Проверяет if(sens_type[i]==VOLTAGE); последующий оператор выполняется только при истинном условии. */
if(sens_type[i]==VOLTAGE)
{
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(i&1) sens_data[i]=560; последующий оператор выполняется только при истинном условии. */
if(i&1) sens_data[i]=560;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else sens_data[i]=390;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/* Проверяет if(Desk==dsk_COMM); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_COMM)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает Modbus[pow_addr+0].bit.bitE значением 1; бит E. */
Modbus[pow_addr+0].bit.bitE = 1; // Ignore
/* Записывает Modbus[pow_addr+1].bit.bitE значением 1; бит E. */
Modbus[pow_addr+1].bit.bitE = 1; // Ignore
/* Записывает Modbus[pow_addr+2].bit.bitE значением 1; бит E. */
Modbus[pow_addr+2].bit.bitE = 1; // Ignore
/* Записывает Modbus[pow_addr+3].bit.bitE значением 1; бит E. */
Modbus[pow_addr+3].bit.bitE = 1; // Ignore
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(Desk==dsk_LOAD); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_LOAD)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает Modbus[0].bit.bitE значением 1; бит E. */
Modbus[0].bit.bitE = 1; // Ignore
/* Записывает Modbus[1].bit.bitE значением 1; бит E. */
Modbus[1].bit.bitE = 1; // Ignore
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Вызывает calc_sensor_koef с аргументами () в текущей последовательности операций. */
calc_sensor_koef();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию Init_packMask; назначение модуля — обработка датчиков, вычисление величин и миллисекундный такт системы. */
void Init_packMask()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет i — данные i; j — данные j; can — CAN. Начальное значение задаётся справа от знака равенства. */
int i,j,can=0;
/* Записывает can значением pow_addr; CAN. */
can = pow_addr;
/* Проверяет if(Kurrent) can += 4; последующий оператор выполняется только при истинном условии. */
if(Kurrent) can += 4;
/* Цикл for(i=0;i<2;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<2;i++)
/* Цикл for(j=0;j<8;j++) ; задаёт начальное значение, условие продолжения и шаг перебора. */
for(j=0;j<8;j++) { Maska[i][j]=0; }
/* Вызывает switch с аргументами (Desk) в текущей последовательности операций. */
switch(Desk)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
case dsk_EPLT:
Maska[m_SLOW][0]|= 0x000F; // Полученное
Maska[m_SLOW][6]|= 0x01FC; // Яркость ламп и одиночество
/* Ветвь выбора для dsk_EPLT; выполняется при совпадении селектора switch. */
case dsk_EPLT:
/* Устанавливает биты Maska[m_SLOW][0] значением 0x000F; данные Maska. */
Maska[m_SLOW][0]|= 0x000F; // Полученное
/* Устанавливает биты Maska[m_SLOW][6] значением 0x01FC; данные Maska. */
Maska[m_SLOW][6]|= 0x01FC; // Яркость ламп и одиночество
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Обрабатывает значения селектора, для которых нет отдельной ветви case. */
default:
/* Цикл for(i=0;i<can;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<can;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
Maska[m_FAST][ i /16]|=(1<<( i %16)); // Диагностика
Maska[m_FAST][(i+24)/16]|=(1<<((i+24)%16)); // Показаниа
/* Устанавливает биты Maska[m_FAST][ i /16] значением (1<<( i %16)); данные Maska. */
Maska[m_FAST][ i /16]|=(1<<( i %16)); // Диагностика
/* Устанавливает биты Maska[m_FAST][(i+24)/16] значением (1<<((i+24)%16)); данные Maska. */
Maska[m_FAST][(i+24)/16]|=(1<<((i+24)%16)); // Показаниа
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Цикл for(i=0;i<3; i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<3; i++)
Maska[m_SLOW][i+3] = Maska[m_FAST][i]; // Уставки
/* Записывает Maska[m_SLOW][i+3] значением Maska[m_FAST][i]; данные Maska. */
Maska[m_SLOW][i+3] = Maska[m_FAST][i]; // Уставки
if(Desk==dsk_BKSD) Maska[m_SLOW][7]|= 0x0300; // Калибровка термодатчиков
/* Проверяет if(Desk==dsk_BKSD) Maska[m_SLOW][7]|= 0x0300; последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_BKSD) Maska[m_SLOW][7]|= 0x0300; // Калибровка термодатчиков
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
Maska[m_SLOW][7]|= 0x0F00; // Калибровка термодатчиков
if(Kurrent)
{ Maska[m_SLOW][7]|= 0x000F; // Ноль датчиков напражениа
Maska[m_SLOW][7]|= 0x00F0; // Калибровка датчиков напражениа
Maska[m_FAST][6]|= 0x3F00; // Фазные значениа
/* Устанавливает биты Maska[m_SLOW][7] значением 0x0F00; данные Maska. */
Maska[m_SLOW][7]|= 0x0F00; // Калибровка термодатчиков
/* Проверяет if(Kurrent); последующий оператор выполняется только при истинном условии. */
if(Kurrent)
/* Устанавливает биты Maska[m_SLOW][7] значением 0x000F; данные Maska. */
{ Maska[m_SLOW][7]|= 0x000F; // Ноль датчиков напражениа
/* Устанавливает биты Maska[m_SLOW][7] значением 0x00F0; данные Maska. */
Maska[m_SLOW][7]|= 0x00F0; // Калибровка датчиков напражениа
/* Устанавливает биты Maska[m_FAST][6] значением 0x3F00; данные Maska. */
Maska[m_FAST][6]|= 0x3F00; // Фазные значениа
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
if(Owen) Maska[m_FAST][6]|= 0x0008; // Период опроса OWEN
/* Проверяет if(Owen) Maska[m_FAST][6]|= 0x0008; последующий оператор выполняется только при истинном условии. */
if(Owen) Maska[m_FAST][6]|= 0x0008; // Период опроса OWEN
/* Проверяет if(Desk==dsk_LOAD); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_LOAD)
{ Maska[m_SLOW][7]|= 0x0030; // Калибровка ЦАП
Maska[m_SLOW][5]|= 0x0003; // Начало и конец зарада
Maska[m_FAST][7]|= 0xF000; /* Protection status 0x7C + attempts 0x7D. */ // Дублировать команды
Maska[m_FAST][1]|= 0x3000; // Управлающий ток СИФУ
/* Устанавливает биты Maska[m_SLOW][7] значением 0x0030; данные Maska. */
{ Maska[m_SLOW][7]|= 0x0030; // Калибровка ЦАП
/* Устанавливает биты Maska[m_SLOW][5] значением 0x0003; данные Maska. */
Maska[m_SLOW][5]|= 0x0003; // Начало и конец зарада
Maska[m_FAST][7]|= 0xF000; /* Protection status 0x7C + attempts 0x7D. */ // Дублировать команды /* Устанавливает биты Maska[m_FAST][7] значением 0xF000; данные Maska. */
/* Устанавливает биты Maska[m_FAST][1] значением 0x3000; данные Maska. */
Maska[m_FAST][1]|= 0x3000; // Управлающий ток СИФУ
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
Maska[m_FAST][1]|= 0x0001; // Дискретные входы
Maska[m_SLOW][6]|= 0x0007; // Яркость ламп, и периоды посылок
Maska[m_SLOW][7]|= 0xE000; // Адрес, команды, и чтоб не вылазило
/* Устанавливает биты Maska[m_FAST][1] значением 0x0001; данные Maska. */
Maska[m_FAST][1]|= 0x0001; // Дискретные входы
/* Устанавливает биты Maska[m_SLOW][6] значением 0x0007; данные Maska. */
Maska[m_SLOW][6]|= 0x0007; // Яркость ламп, и периоды посылок
/* Устанавливает биты Maska[m_SLOW][7] значением 0xE000; данные Maska. */
Maska[m_SLOW][7]|= 0xE000; // Адрес, команды, и чтоб не вылазило
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию er_anal; назначение модуля — обработка датчиков, вычисление величин и миллисекундный такт системы. */
int er_anal(int term, unsigned int * count, long edge, int pre)
{
if (term)
{
if((*count)>=edge) return 1;
(*count)++; return pre;
}
if( (*count) == 0 ) return 0;
(*count)--; return pre;
}
void reset_errs(int sens, ERROR err)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if (term); последующий оператор выполняется только при истинном условии. */
if (term)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if((*count)>=edge) return 1; последующий оператор выполняется только при истинном условии. */
if((*count)>=edge) return 1;
/* Изменяет счётчик в выражении (*count)++; return pre; на один для следующего шага. */
(*count)++; return pre;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if( (*count) == 0 ) return 0; последующий оператор выполняется только при истинном условии. */
if( (*count) == 0 ) return 0;
/* Изменяет счётчик в выражении (*count)--; return pre; на один для следующего шага. */
(*count)--; return pre;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию reset_errs; назначение модуля — обработка датчиков, вычисление величин и миллисекундный такт системы. */
void reset_errs(int sens, ERROR err)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет set — установка. */
ERROR set;
/* Записывает set.all значением (sens_error[sens].all & NOER) | err.all; представление регистра целым словом без разбиения на битовые поля. */
set.all = (sens_error[sens].all & NOER) | err.all;
/* Устанавливает биты chk.bit.Error значением set.bit.Stop; ошибка. */
chk.bit.Error|= set.bit.Stop;
/* Записывает set.bit.Ready значением !set.bit.Stop; данные Ready. */
set.bit.Ready = !set.bit.Stop;
/* Записывает sens_error[sens] значением set; sens ошибка. */
sens_error[sens] = set;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию Current_count; назначение модуля — обработка датчиков, вычисление величин и миллисекундный такт системы. */
void Current_count(int chan)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет Numb — данные Numb; Zer — данные Zer; Current — данные Current; Level — данные Level. */
float Numb,Zer,Current,Level;
/* Объявляет aCurrent — данные aCurrent; Amplitude — данные Amplitude. */
static float aCurrent,Amplitude;
/* Объявляет ignor — данные ignor; sens — данные sens; pair — данные pair; ist — данные ist; thrd — данные thrd. */
int ignor, sens, pair, ist, thrd, fazz, feed;
/* Объявляет error — ошибка. */
ERROR error;
/* Проверяет if(Desk == dsk_LOAD); последующий оператор выполняется только при истинном условии. */
if(Desk == dsk_LOAD)
/* Проверяет if(!chan); последующий оператор выполняется только при истинном условии. */
if(!chan)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает sig.all значением chk.all; представление регистра целым словом без разбиения на битовые поля. */
sig.all = chk.all;
/* Записывает chk.all значением 0; представление регистра целым словом без разбиения на битовые поля. */
chk.all = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает sens значением pow_addr + chan; данные sens. */
sens = pow_addr + chan;
/* Записывает pair значением sens_pair[chan]; данные pair. */
pair = sens_pair[chan];
/* Записывает ist значением !(chan & 1); данные ist. */
ist = !(chan & 1);
/* Записывает feed значением (chan >>1); данные feed. */
feed = (chan >>1);
/* Записывает fazz значением feed*3; данные fazz. */
fazz = feed*3;
/* Записывает thrd значением feed+4; данные thrd. */
thrd = feed+4;
/* Проверяет if(sens_error[sens].bit.Bypas); последующий оператор выполняется только при истинном условии. */
if(sens_error[sens].bit.Bypas)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
sens_error[sens].all = 0;
/* Записывает sens_error[sens].all значением 0; представление регистра целым словом без разбиения на битовые поля. */
sens_error[sens].all = 0;
/* Записывает sens_error[sens].bit.Bypas значением 1; данные Bypas. */
sens_error[sens].bit.Bypas = 1;
/* Записывает sens_data[sens] значением 0; sens данные. */
sens_data[sens] = 0;
/* Завершает Current_count без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает Numb значением adc_table_lem[chan]; данные Numb. */
Numb = adc_table_lem[chan];
/* Записывает modbus[0x64+chan] значением Numb; массив технологических регистров; слово int на C28x занимает 16 бит. */
modbus[0x64+chan] = Numb;
// Средний (он же нулевой) уровень показаний АЦП
// Средний (он же нулевой) уровень показаний АЦП
/* Увеличивает zer_count[chan] значением (Numb-zer_count[chan])/(5.0 * ADC_FREQ); zer число. */
zer_count[chan] += (Numb-zer_count[chan])/(5.0 * ADC_FREQ);
/* Записывает Zer значением (int)(filterbat(&zer_filter[chan],zer_count[chan])); данные Zer. */
Zer = (int)(filterbat(&zer_filter[chan],zer_count[chan]));
/* Проверяет if(WAKE < (WAKE_TIME /2)) Zero_lev[chan] = Zer; последующий оператор выполняется только при истинном условии. */
if(WAKE < (WAKE_TIME /2)) Zero_lev[chan] = Zer;
/*
Test_mem_limit(12);
@@ -491,41 +874,65 @@ Log_to_mem((int)adc_table_lem[chan]);
Log_to_mem((int)zer_count[chan]);
Log_to_mem((int)Zero_lev[chan]);
*/
// Мгновенное значение фазы
// Мгновенное значение фазы
/* Записывает Current значением (Numb - Zero_lev[chan]) * powK[chan]; данные Current. */
Current = (Numb - Zero_lev[chan]) * powK[chan];
// Действующее (среднеквадратичное) значение фазы
// Действующее (среднеквадратичное) значение фазы
/* Увеличивает lev_quadr[chan] значением ((Current*Current)-lev_quadr[chan])/(1.0 * ADC_FREQ); данные lev_quadr. */
lev_quadr[chan] += ((Current*Current)-lev_quadr[chan])/(1.0 * ADC_FREQ);
/* Записывает lev_count[chan] значением sqrt(lev_quadr[chan]); lev число. */
lev_count[chan] = sqrt(lev_quadr[chan]);
// Запомним
if(ist)
// Запомним
/* Проверяет if(ist); последующий оператор выполняется только при истинном условии. */
if(ist)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(Desk==dsk_COMM) aCurrent =-Current; последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_COMM) aCurrent =-Current;
else aCurrent = Current; // Запомнили мгновенное значение - дла амплитуды
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else aCurrent = Current; // Запомнили мгновенное значение - дла амплитуды
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
else
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// Вычисление амплитуды
// Вычисление амплитуды
/* Записывает Amplitude значением filterbat(&out_filter[sens], im_calc(Current,aCurrent)); данные Amplitude. */
Amplitude = filterbat(&out_filter[sens], im_calc(Current,aCurrent));
/* Проверяет if(sens_type[sens]==VOLTAGE); последующий оператор выполняется только при истинном условии. */
if(sens_type[sens]==VOLTAGE)
/* Проверяет if(Amplitude<20) Amplitude = 0; последующий оператор выполняется только при истинном условии. */
if(Amplitude<20) Amplitude = 0;
/* Проверяет if(sens_type[sens]==CURRENT); последующий оператор выполняется только при истинном условии. */
if(sens_type[sens]==CURRENT)
/* Проверяет if(Amplitude<75) Amplitude = 0; последующий оператор выполняется только при истинном условии. */
if(Amplitude<75) Amplitude = 0;
/* Записывает Level значением Amplitude / RADIX2; данные Level. */
Level = Amplitude / RADIX2;
/* Проверяет if(!WAKE); последующий оператор выполняется только при истинном условии. */
if(!WAKE)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает sens_data[sens ] значением Amplitude; sens данные. */
sens_data[sens ] = Amplitude;
/* Записывает sens_data[sens-1] значением Level; sens данные. */
sens_data[sens-1] = Level;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
// Действующее (среднеквадратичное) значение третьей фазы
// Действующее (среднеквадратичное) значение третьей фазы
/* Записывает Numb значением -Current-aCurrent; данные Numb. */
Numb =-Current-aCurrent;
/* Увеличивает lev_quadr[thrd] значением (Numb*Numb-lev_quadr[thrd])/(1.0 * ADC_FREQ); данные lev_quadr. */
lev_quadr[thrd] += (Numb*Numb-lev_quadr[thrd])/(1.0 * ADC_FREQ);
/* Записывает lev_count[thrd] значением sqrt(lev_quadr[thrd]); lev число. */
lev_count[thrd] = sqrt(lev_quadr[thrd]);
/*
if(!no_write)
@@ -544,57 +951,99 @@ Log_to_mem(Amplitude);
Log_to_mem(Level);
}
*/
/* Записывает modbus[0x68+fazz ] значением lev_count[pair]; массив технологических регистров; слово int на C28x занимает 16 бит. */
modbus[0x68+fazz ] = lev_count[pair];
/* Записывает modbus[0x68+fazz+1] значением lev_count[chan]; массив технологических регистров; слово int на C28x занимает 16 бит. */
modbus[0x68+fazz+1] = lev_count[chan];
/* Записывает modbus[0x68+fazz+2] значением lev_count[thrd]; массив технологических регистров; слово int на C28x занимает 16 бит. */
modbus[0x68+fazz+2] = lev_count[thrd];
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
// Это максимальное
// Это максимальное
/* Записывает Numb значением lev_count[chan]; данные Numb. */
Numb = lev_count[chan];
/* Проверяет if(Numb<lev_count[pair]) Numb = lev_count[pair]; последующий оператор выполняется только при истинном условии. */
if(Numb<lev_count[pair]) Numb = lev_count[pair];
/* Проверяет if(Numb<lev_count[thrd]) Numb = lev_count[thrd]; последующий оператор выполняется только при истинном условии. */
if(Numb<lev_count[thrd]) Numb = lev_count[thrd];
// Зашиты!
// Зашиты!
/* Записывает error.all значением 0; представление регистра целым словом без разбиения на битовые поля. */
error.all = 0;
/* Проверяет if(WAKE) goto fin; последующий оператор выполняется только при истинном условии. */
if(WAKE) goto fin;
/* Записывает ignor значением sens_error[sens].bit.Ignor; данные ignor. */
ignor = sens_error[sens].bit.Ignor;
/* Проверяет if(er_anal( ((Numb-lev_count[chan])/Numb > 0.3) и (Numb>Curr_Edge),; последующий оператор выполняется только при истинном условии. */
if(er_anal( ((Numb-lev_count[chan])/Numb > 0.3) && (Numb>Curr_Edge),
/* Продолжает список аргументов, полей или выражение &err_count[chan],time_3sec,0)); порядок элементов сохраняется. */
&err_count[chan],time_3sec,0))
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает error.bit.Wry значением 1; данные Wry. */
error.bit.Wry = 1;
/* Записывает error.bit.Stop значением !ignor; данные Stop. */
error.bit.Stop = !ignor;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(er_anal( ((Numb-lev_count[thrd])/Numb > 0.3) и (Numb>Curr_Edge),; последующий оператор выполняется только при истинном условии. */
if(er_anal( ((Numb-lev_count[thrd])/Numb > 0.3) && (Numb>Curr_Edge),
/* Продолжает список аргументов, полей или выражение &err_count[thrd],time_3sec,0)); порядок элементов сохраняется. */
&err_count[thrd],time_3sec,0))
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает error.bit.Wry значением 1; данные Wry. */
error.bit.Wry = 1;
/* Записывает error.bit.Stop значением !ignor; данные Stop. */
error.bit.Stop = !ignor;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(Desk == dsk_LOAD); последующий оператор выполняется только при истинном условии. */
if(Desk == dsk_LOAD)
/* Проверяет if(!ist); последующий оператор выполняется только при истинном условии. */
if(!ist)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(Level > sens_hi_edge[sens]); последующий оператор выполняется только при истинном условии. */
if(Level > sens_hi_edge[sens])
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает error.bit.Hyper значением 1; данные Hyper. */
error.bit.Hyper = 1;
/* Записывает error.bit.Stop значением !ignor; данные Stop. */
error.bit.Stop = !ignor;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(sens_type[sens]==VOLTAGE); последующий оператор выполняется только при истинном условии. */
if(sens_type[sens]==VOLTAGE)
if(er_anal( (Level < sens_lo_edge[sens]),
/* Проверяет if(er_anal( (Level < sens_lo_edge[sens]),; последующий оператор выполняется только при истинном условии. */
if(er_anal( (Level < sens_lo_edge[sens]),
/* Продолжает список аргументов, полей или выражение &low_count[feed],time_3sec,0)); порядок элементов сохраняется. */
&low_count[feed],time_3sec,0))
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает error.bit.Out значением 1; данные Out. */
error.bit.Out = 1;
/* Записывает error.bit.Stop значением !ignor; данные Stop. */
error.bit.Stop = !ignor;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(sens_type[sens]==CURRENT); последующий оператор выполняется только при истинном условии. */
if(sens_type[sens]==CURRENT)
/* Проверяет if(Level > sens_lo_edge[sens]); последующий оператор выполняется только при истинном условии. */
if(Level > sens_lo_edge[sens])
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает error.bit.Over значением 1; данные Over. */
error.bit.Over = 1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/*
if((chan==1)||(chan==3))
@@ -616,233 +1065,409 @@ Log_to_mem(error.all);
Log_to_mem(WAKE);
}
*/
/* Метка fin для перехода внутри функции. */
fin:
/* Вызывает reset_errs с аргументами (sens,error) в текущей последовательности операций. */
reset_errs(sens,error);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию Temper_count; назначение модуля — обработка датчиков, вычисление величин и миллисекундный такт системы. */
void Temper_count(int chan, int own)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет Numb — данные Numb. */
float Numb;
/* Объявляет Temper — данные Temper. */
static int Temper;
/* Объявляет i — данные i; j — данные j; kun — данные kun. */
int i,j, kun;
/* Объявляет s — данные s. */
long s;
/* Объявляет error — ошибка. */
ERROR error;
/* Объявляет ovn — данные ovn. */
int ovn;
/* Проверяет if(!chan); последующий оператор выполняется только при истинном условии. */
if(!chan)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает sig.all значением chk.all; представление регистра целым словом без разбиения на битовые поля. */
sig.all = chk.all;
/* Записывает chk.all значением 0; представление регистра целым словом без разбиения на битовые поля. */
chk.all = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(sens_error[chan].bit.Bypas); последующий оператор выполняется только при истинном условии. */
if(sens_error[chan].bit.Bypas)
/* Проверяет if(chan<tpl_cans); последующий оператор выполняется только при истинном условии. */
if(chan<tpl_cans)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
sens_error[chan].all = 0;
/* Записывает sens_error[chan].all значением 0; представление регистра целым словом без разбиения на битовые поля. */
sens_error[chan].all = 0;
/* Записывает sens_error[chan].bit.Bypas значением 1; данные Bypas. */
sens_error[chan].bit.Bypas = 1;
/* Записывает sens_data[chan] значением 0; sens данные. */
sens_data[chan] = 0;
/* Завершает Temper_count без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает Numb значением ADC_table[chan]; данные Numb. */
Numb = ADC_table[chan];
/* Проверяет if(cRawMeat); последующий оператор выполняется только при истинном условии. */
if(cRawMeat)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает sens_data[chan] значением Numb; sens данные. */
sens_data[chan] = Numb;
/* Завершает Temper_count без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(sens_error[chan].bit.Imit); последующий оператор выполняется только при истинном условии. */
if(sens_error[chan].bit.Imit)
/* Проверяет if(chan<tpl_cans); последующий оператор выполняется только при истинном условии. */
if(chan<tpl_cans)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает j значением 0;s=0; данные j. */
j=0;s=0;
/* Цикл for(i=0;i<start_data;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<start_data;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if( sens_type[i]==sens_type[chan]); последующий оператор выполняется только при истинном условии. */
if( sens_type[i]==sens_type[chan])
/* Проверяет if(!(sens_error[i].all & okay.all)); последующий оператор выполняется только при истинном условии. */
if(!(sens_error[i].all & okay.all))
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Увеличивает s значением ADC_table[i]; данные s. */
s+=ADC_table[i];
/* Изменяет счётчик в выражении j++; на один для следующего шага. */
j++;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/* Проверяет if(j) s/=j; последующий оператор выполняется только при истинном условии. */
if(j) s/=j;
/* Записывает Numb значением s; данные Numb. */
Numb = s;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает kun значением chan - cal_addr; данные kun. */
kun = chan - cal_addr;
/* Проверяет if(own); последующий оператор выполняется только при истинном условии. */
if(own)
/* Проверяет if(sens_type[chan]==TRM_OBEH); последующий оператор выполняется только при истинном условии. */
if(sens_type[chan]==TRM_OBEH)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает ovn значением chan-tpl_cans; данные ovn. */
ovn = chan-tpl_cans;
/* Записывает Numb значением 0.1 * ext_temp[ovn]; данные Numb. */
Numb= 0.1 * ext_temp[ovn];
/* Проверяет if(ext_diag[ovn]); последующий оператор выполняется только при истинном условии. */
if(ext_diag[ovn])
/* Записывает Numb значением -100; данные Numb. */
Numb = -100;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(!own); последующий оператор выполняется только при истинном условии. */
if(!own)
/* Проверяет if(TermoAD); последующий оператор выполняется только при истинном условии. */
if(TermoAD)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(cTermoCal|bTermoCal); последующий оператор выполняется только при истинном условии. */
if(cTermoCal|bTermoCal)
/* Проверяет if(!WAKE); последующий оператор выполняется только при истинном условии. */
if(!WAKE)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(Desk==dsk_SHKF); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_SHKF)
/* Проверяет if(Numb>2200) kun|=2; последующий оператор выполняется только при истинном условии. */
if(Numb>2200) kun|=2;
/* Проверяет if(kun>=0); последующий оператор выполняется только при истинном условии. */
if(kun>=0)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает TCaliber[kun] значением Numb; данные TCaliber. */
TCaliber[kun] = Numb;
/* Вызывает calc_sensor_koef с аргументами () в текущей последовательности операций. */
calc_sensor_koef();
/* Завершает Temper_count без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/* Проверяет if(chan>=tpl_cans) return; последующий оператор выполняется только при истинном условии. */
if(chan>=tpl_cans) return;
// Kun именно чтоб скомпенсировать нечетность
// Kun именно чтоб скомпенсировать нечетность
/* Проверяет if(kun&1) Numb = (Numb-K300_2)*K_T2+ZERO; последующий оператор выполняется только при истинном условии. */
if(kun&1) Numb = (Numb-K300_2)*K_T2+ZERO;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else Numb = (Numb-K300_1)*K_T1+ZERO;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(TermoRS); последующий оператор выполняется только при истинном условии. */
if(TermoRS)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(kun>=0); последующий оператор выполняется только при истинном условии. */
if(kun>=0)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(WAKE) out_filter[chan] = adc_filter[chan]; последующий оператор выполняется только при истинном условии. */
if(WAKE) out_filter[chan] = adc_filter[chan];
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// Калибровку отфильтруем вторым слоем
// Калибровку отфильтруем вторым слоем
/* Записывает Numb значением filterbat(&out_filter[chan],Numb); данные Numb. */
Numb = filterbat(&out_filter[chan],Numb);
/* Записывает TCaliber[kun] значением Numb; данные TCaliber. */
TCaliber[kun] = Numb;
/* Вызывает calc_sensor_koef с аргументами () в текущей последовательности операций. */
calc_sensor_koef();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Завершает Temper_count без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(Desk==dsk_BKSD); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_BKSD)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает sens_data[chan+8] значением ADC_table[chan]; sens данные. */
sens_data[chan+8] = ADC_table[chan];
/* Проверяет if(chan<6) Numb = (Numb-K100_D)*K100; последующий оператор выполняется только при истинном условии. */
if(chan<6) Numb = (Numb-K100_D)*K100;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else Numb = (Numb-K100_D)*K_50;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(chan&1) Numb = (Numb-K100_2)*K_T2; последующий оператор выполняется только при истинном условии. */
if(chan&1) Numb = (Numb-K100_2)*K_T2;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else Numb = (Numb-K100_1)*K_T1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/* Проверяет if(Numb < -20) Numb = -20; последующий оператор выполняется только при истинном условии. */
if(Numb < -20) Numb = -20;
/* Проверяет if(Numb > 200) Numb = 200; последующий оператор выполняется только при истинном условии. */
if(Numb > 200) Numb = 200;
/* Проверяет if(bSecretBt|cSecretBt) Numb = 40.0; последующий оператор выполняется только при истинном условии. */
if(bSecretBt|cSecretBt) Numb = 40.0;
/* Записывает sens_data[chan] значением Numb*10; sens данные. */
sens_data[chan] = Numb*10;
/* Записывает Temper значением Numb; данные Temper. */
Temper = Numb;
/* Записывает error.all значением 0; представление регистра целым словом без разбиения на битовые поля. */
error.all = 0;
/* Проверяет if(WAKE или sens_error[chan].bit.Ignor) goto fin; последующий оператор выполняется только при истинном условии. */
if(WAKE || sens_error[chan].bit.Ignor) goto fin;
// Обрыв или неисправность
// Обрыв или неисправность
/* Проверяет if(Temper<=-20 или Temper>=200); последующий оператор выполняется только при истинном условии. */
if(Temper<=-20 || Temper>=200)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает error.bit.Tear значением 1; данные Tear. */
error.bit.Tear = 1;
/* Записывает chk.bit.OutHeat значением 1; данные OutHeat. */
chk.bit.OutHeat = 1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
// Перегрев
// Перегрев
/* Проверяет if(((Temper>sens_hi_edge[chan]-Cooling) и (sens_error[chan].bit.Hyper)) или; последующий оператор выполняется только при истинном условии. */
if(((Temper>sens_hi_edge[chan]-Cooling) && (sens_error[chan].bit.Hyper)) ||
/* Продолжает список аргументов, полей или выражение (Temper>sens_hi_edge[chan]) ); порядок элементов сохраняется. */
(Temper>sens_hi_edge[chan]) )
{
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает error.bit.Hyper значением 1; данные Hyper. */
error.bit.Hyper = 1;
/* Записывает error.bit.Stop значением 1; данные Stop. */
error.bit.Stop = 1;
/* Записывает chk.bit.OverHeat значением 1; данные OverHeat. */
chk.bit.OverHeat= 1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
// Предупреждение по температуре
// Предупреждение по температуре
/* Проверяет if(Temper>sens_lo_edge[chan]); последующий оператор выполняется только при истинном условии. */
if(Temper>sens_lo_edge[chan])
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает error.bit.Over значением 1; данные Over. */
error.bit.Over = 1;
/* Записывает chk.bit.SubHeat значением 1; данные SubHeat. */
chk.bit.SubHeat = 1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Метка fin для перехода внутри функции. */
fin:
/* Вызывает reset_errs с аргументами (chan,error) в текущей последовательности операций. */
reset_errs(chan,error);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию Power_count; назначение модуля — обработка датчиков, вычисление величин и миллисекундный такт системы. */
void Power_count(int chan)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет Numb — данные Numb. */
float Numb;
/* Объявляет Power — данные Power; bitt — данные bitt. */
int Power,bitt;
/* Объявляет error — ошибка. */
ERROR error;
/* Проверяет if(!chan); последующий оператор выполняется только при истинном условии. */
if(!chan)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает sig.all значением chk.all; представление регистра целым словом без разбиения на битовые поля. */
sig.all = chk.all;
/* Записывает chk.all значением 0; представление регистра целым словом без разбиения на битовые поля. */
chk.all = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(sens_error[chan].bit.Bypas); последующий оператор выполняется только при истинном условии. */
if(sens_error[chan].bit.Bypas)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
sens_error[chan].all = 0;
/* Записывает sens_error[chan].all значением 0; представление регистра целым словом без разбиения на битовые поля. */
sens_error[chan].all = 0;
/* Записывает sens_error[chan].bit.Bypas значением 1; данные Bypas. */
sens_error[chan].bit.Bypas = 1;
/* Записывает sens_data[chan] значением 0; sens данные. */
sens_data[chan] = 0;
/* Завершает Power_count без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает Numb значением ADC_table[chan]; данные Numb. */
Numb = ADC_table[chan];
/* Проверяет if(cRawMeat); последующий оператор выполняется только при истинном условии. */
if(cRawMeat)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает sens_data[chan] значением Numb; sens данные. */
sens_data[chan] = Numb;
/* Завершает Power_count без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает Power значением Numb * powK[sens_type[chan]]; данные Power. */
Power = Numb * powK[sens_type[chan]];
/* Записывает sens_data[chan] значением Power; sens данные. */
sens_data[chan] = Power;
/* Записывает error.all значением 0; представление регистра целым словом без разбиения на битовые поля. */
error.all = 0;
/* Проверяет if(WAKE или sens_error[chan].bit.Ignor) goto fin; последующий оператор выполняется только при истинном условии. */
if(WAKE || sens_error[chan].bit.Ignor) goto fin;
// Дискретные каналы
// Дискретные каналы
/* Записывает bitt значением chan*2; данные bitt. */
bitt = chan*2;
/* Проверяет if(chan!=7); последующий оператор выполняется только при истинном условии. */
if(chan!=7)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает error.bit.Discr1 значением er_anal(((DigErr.all>>bitt)&1), &din_count[bitt], 1000, 0); bitt++; данные Discr1. */
error.bit.Discr1 = er_anal(((DigErr.all>>bitt)&1), &din_count[bitt], 1000, 0); bitt++;
/* Записывает error.bit.Discr2 значением er_anal(((DigErr.all>>bitt)&1), &din_count[bitt], 1000, 0); bitt++; данные Discr2. */
error.bit.Discr2 = er_anal(((DigErr.all>>bitt)&1), &din_count[bitt], 1000, 0); bitt++;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(chan==6); последующий оператор выполняется только при истинном условии. */
if(chan==6)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает error.bit.Discr3 значением er_anal(((DigErr.all>>bitt)&1), &din_count[bitt], 1000, 0); bitt++; данные Discr3. */
error.bit.Discr3 = er_anal(((DigErr.all>>bitt)&1), &din_count[bitt], 1000, 0); bitt++;
/* Записывает error.bit.Discr4 значением er_anal(((DigErr.all>>bitt)&1), &din_count[bitt], 1000, 0); bitt++; данные Discr4. */
error.bit.Discr4 = er_anal(((DigErr.all>>bitt)&1), &din_count[bitt], 1000, 0); bitt++;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает error.bit.Contr значением error.bit.Discr1 | error.bit.Discr2 | error.bit.Discr3 | error.bit.Discr4; данные Contr. */
error.bit.Contr = error.bit.Discr1 | error.bit.Discr2 | error.bit.Discr3 | error.bit.Discr4;
// Пониженное напражение
// Пониженное напражение
/* Проверяет if(Power <sens_lo_edge[chan]); последующий оператор выполняется только при истинном условии. */
if(Power <sens_lo_edge[chan])
{
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает error.bit.Out значением 1; данные Out. */
error.bit.Out = 1;
/* Проверяет if(sens_error[sens_pair[chan]].bit.Out); последующий оператор выполняется только при истинном условии. */
if(sens_error[sens_pair[chan]].bit.Out)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает error.bit.Stop значением 1; данные Stop. */
error.bit.Stop = 1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
// Повышенное напражение
// Повышенное напражение
/* if(Power > sens_hi_edge[chan])
{
{
error.bit.Hyper = 1;
error.bit.Stop = 1;
}
*/
if(error.all)
/* Проверяет if(error.all); последующий оператор выполняется только при истинном условии. */
if(error.all)
/* Записывает chk.bit.Alarm значением 1; данные Alarm. */
chk.bit.Alarm = 1;
/* Метка fin для перехода внутри функции. */
fin:
/* Вызывает reset_errs с аргументами (chan,error) в текущей последовательности операций. */
reset_errs(chan,error);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
+334 -45
View File
@@ -1,391 +1,680 @@
/* Обработка Modbus, заводские параметры и сохранение настроек. Русские пояснения сохранены в UTF-8. */
/* Подключает "eeprom_config.h": выбор профиля физически установленной EEPROM при сборке. */
#include "eeprom_config.h"
/* Подключает "include/balsam167_eeprom_block.h": настройки и интерфейс balsam167_eeprom_block. */
#include "include/balsam167_eeprom_block.h"
/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
/* Подключает "package.h": адреса устройств, типы плат и псевдонимы технологических регистров. */
#include "package.h"
/* Подключает "RS485.h": приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
#include "RS485.h"
/* Подключает "crc16.h": таблицы и функции вычисления контрольных сумм CRC. */
#include "crc16.h"
/* Подключает "cntrl_adr.h": собственный и универсальный адрес устройства. */
#include "cntrl_adr.h"
#include "bios_dsp.h"
/* Подключает "bios_dsp.h": коды и объявления команд последовательного загрузчика. */
#include "bios_dsp.h"
/* Подключает "message.h": обработка Modbus, заводские параметры и сохранение настроек. */
#include "message.h"
/* Подключает "filter_bat2.h": накопительный фильтр измерительных каналов. */
#include "filter_bat2.h"
/* Подключает "measure.h": обработка датчиков, вычисление величин и миллисекундный такт системы. */
#include "measure.h"
/* Подключает "ADC.h": настройка АЦП, обработка преобразований и первичная фильтрация измерений. */
#include "ADC.h"
/* Подключает "peripher.h": перемычки режима платы, дискретные входы и выходы. */
#include "peripher.h"
/* Подключает "ecan.h": штатный eCAN и отдельный служебный обмен УМП/GAS. */
#include "ecan.h"
/* Подключает "pulto.h": обмен и индикация пульта. */
#include "pulto.h"
/* Подключает "spise2p.h": драйвер SPI EEPROM, адресация, страницы и автомат завершения операций. */
#include "spise2p.h"
/* Подключает "caliber.h": заводские калибровочные значения датчиков. */
#include "caliber.h"
/* Подключает "log_to_mem.h": двухбанковый регистратор событий нагрузки во внешней RAM. */
#include "log_to_mem.h"
/* Подключает "DAC.h": выход ЦАП и автомат защиты нагрузки с проверкой напряжения и свежести CAN. */
#include "DAC.h"
/* Подключает "ump_tms28335.h": настройки и интерфейс ump_tms28335. */
#include "ump_tms28335.h"
/* Подключает "gas167.h": дополнительная карта GAS 167/v1 только для новой EEPROM M95M02. */
#include "gas167.h"
/* Подключает "include/balsam167_eeprom_layout.h": настройки и интерфейс balsam167_eeprom_layout. */
#include "include/balsam167_eeprom_layout.h"
/* Условие компиляции (ANSWER_LEN + 1) != BALSAM167_EEPROM_PARAM_WORDS: выбранный блок включается в текущий вариант прошивки. */
#if (ANSWER_LEN + 1) != BALSAM167_EEPROM_PARAM_WORDS
/* Останавливает сборку при недопустимой конфигурации: EEPROM_parameter_reservation_must_match_ANSWER_LEN. */
#error EEPROM_parameter_reservation_must_match_ANSWER_LEN
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Объявляет modbus — массив технологических регистров; слово int на C28x занимает 16 бит. */
int modbus[ANSWER_LEN+1];
/* Объявляет param — данные param. */
unsigned int param[ANSWER_LEN+1];
/* Заполняет регистры заводскими значениями; тайм-аут CAN нагрузки по умолчанию равен 600 мс. */
void Default_params()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет i — данные i; def — данные def. */
unsigned int i,def;
/* Объявляет shkf_lo_edge — данные shkf_lo_edge. Начальное значение задаётся справа от знака равенства. */
int shkf_lo_edge[] = {300, // 380
/* Элемент постоянной таблицы 300,; порядок значений совпадает с порядком индексов потребителя. */
300, // 38O
/* Элемент постоянной таблицы 0,; порядок значений совпадает с порядком индексов потребителя. */
0, // 0
/* Элемент постоянной таблицы 0,; порядок значений совпадает с порядком индексов потребителя. */
0, // 0
15, // 31
/* Элемент постоянной таблицы 15,; порядок значений совпадает с порядком индексов потребителя. */
15, // 31
/* Элемент постоянной таблицы 22,; порядок значений совпадает с порядком индексов потребителя. */
22, // 27
/* Элемент постоянной таблицы 20,; порядок значений совпадает с порядком индексов потребителя. */
20, // 24
/* Элемент постоянной таблицы 10,; порядок значений совпадает с порядком индексов потребителя. */
10, // 15
/* Элемент постоянной таблицы 60};; порядок значений совпадает с порядком индексов потребителя. */
60}; // AD
/* Объявляет bright — данные bright. Начальное значение задаётся справа от знака равенства. */
int bright[] = {10,8,6,8,6,8};
/* Цикл for(i=0;i<ANSWER_LEN;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<ANSWER_LEN;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
Modbus[i].all = 0;
/* Записывает Modbus[i].all значением 0; представление регистра целым словом без разбиения на битовые поля. */
Modbus[i].all = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает LastMode значением Mode; последний режим платы, технологический регистр 126. */
LastMode = Mode;
/* Проверяет if(Desk == dsk_EPLT); последующий оператор выполняется только при истинном условии. */
if(Desk == dsk_EPLT)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
Cancount[m_FAST] = 2; // пауза между посылками CAN
/* Записывает Cancount[m_FAST] значением 2; данные Cancount. */
Cancount[m_FAST] = 2; // пауза между посылками CAN
/* Цикл for(i=0;i<6;i++) Bright[i] = bright[i];; задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<6;i++) Bright[i] = bright[i];
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
Cancount[m_FAST] = 10; // пауза между посылками CAN
/* Записывает Cancount[m_FAST] значением 10; данные Cancount. */
Cancount[m_FAST] = 10; // пауза между посылками CAN
/* Записывает Brightness значением 8; данные Brightness. */
Brightness = 8;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
Cancount[m_SLOW] = 101; // пауза между посылками CAN
/* Записывает Cancount[m_SLOW] значением 101; данные Cancount. */
Cancount[m_SLOW] = 101; // пауза между посылками CAN
if(Owen) Owncount = 20; // пауза между опросами OWEN
/* Проверяет if(Owen) Owncount = 20; последующий оператор выполняется только при истинном условии. */
if(Owen) Owncount = 20; // пауза между опросами OWEN
/* Проверяет if(Kalibro); последующий оператор выполняется только при истинном условии. */
if(Kalibro)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
#ifdef CALIB_RS
/* Включает следующий блок только при определённом символе CALIB_RS. */
#ifdef CALIB_RS
/* Записывает def значением Mode-1; данные def. */
def = Mode-1;
/* Проверяет if(Mode>adr_PULT) def--; последующий оператор выполняется только при истинном условии. */
if(Mode>adr_PULT) def--;
/* Выбирает альтернативный блок текущего условия компиляции. */
#else
/* Записывает def значением Mode-3; данные def. */
def = Mode-3;
/* Проверяет if(Mode==adr_SHKF) def=4; последующий оператор выполняется только при истинном условии. */
if(Mode==adr_SHKF) def=4;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Цикл for(i=0;i<8;i++) Caliber[i] = def_cal[def][i];; задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<8;i++) Caliber[i] = def_cal[def][i];
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(Desk == dsk_COMM); последующий оператор выполняется только при истинном условии. */
if(Desk == dsk_COMM)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Цикл for(i=0;i<TPL_POW*2+Owen;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<TPL_POW*2+Owen;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
sens_hi_edge[i] = 70;
/* Записывает sens_hi_edge[i] значением 70; данные sens_hi_edge. */
sens_hi_edge[i] = 70;
/* Записывает sens_lo_edge[i] значением 60; данные sens_lo_edge. */
sens_lo_edge[i] = 60;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/* Проверяет if(Desk==dsk_BKSD); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_BKSD)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Цикл for(i=0;i<6;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<6;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
sens_hi_edge[i] = 170;
/* Записывает sens_hi_edge[i] значением 170; данные sens_hi_edge. */
sens_hi_edge[i] = 170;
/* Записывает sens_lo_edge[i] значением 150; данные sens_lo_edge. */
sens_lo_edge[i] = 150;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Цикл for(i=6;i<8;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=6;i<8;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
sens_hi_edge[i] = 115;
/* Записывает sens_hi_edge[i] значением 115; данные sens_hi_edge. */
sens_hi_edge[i] = 115;
/* Записывает sens_lo_edge[i] значением 105; данные sens_lo_edge. */
sens_lo_edge[i] = 105;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/* Проверяет if(Desk==dsk_BKST); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_BKST)
/* Цикл for(i=0;i<TPL_TRN*2;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<TPL_TRN*2;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
sens_hi_edge[i] = 70;
/* Записывает sens_hi_edge[i] значением 70; данные sens_hi_edge. */
sens_hi_edge[i] = 70;
/* Записывает sens_lo_edge[i] значением 60; данные sens_lo_edge. */
sens_lo_edge[i] = 60;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(Mode==adr_SHKF); последующий оператор выполняется только при истинном условии. */
if(Mode==adr_SHKF)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Цикл for(i=0;i<15;i++) sens_lo_edge[i] = shkf_lo_edge[sens_type[i]];; задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<15;i++) sens_lo_edge[i] = shkf_lo_edge[sens_type[i]];
/* Записывает sens_hi_edge[13] значением 70; данные sens_hi_edge. */
sens_hi_edge[13] = 70;
/* Записывает sens_hi_edge[14] значением 70; данные sens_hi_edge. */
sens_hi_edge[14] = 70;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(Desk==dsk_LOAD); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_LOAD)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает sens_hi_edge[0] значением 420; данные sens_hi_edge. */
sens_hi_edge[0] = 420;
/* Записывает sens_hi_edge[1] значением 420; данные sens_hi_edge. */
sens_hi_edge[1] = 420;
/* Записывает sens_hi_edge[2] значением 900; данные sens_hi_edge. */
sens_hi_edge[2] = 900;
/* Записывает sens_hi_edge[3] значением 900; данные sens_hi_edge. */
sens_hi_edge[3] = 900;
/* Записывает sens_lo_edge[0] значением 300; данные sens_lo_edge. */
sens_lo_edge[0] = 300;
/* Записывает sens_lo_edge[1] значением 300; данные sens_lo_edge. */
sens_lo_edge[1] = 300;
/* Записывает sens_lo_edge[2] значением 800; данные sens_lo_edge. */
sens_lo_edge[2] = 800;
/* Записывает sens_lo_edge[3] значением 800; данные sens_lo_edge. */
sens_lo_edge[3] = 800;
/* Записывает DAC_20 значением Caliber[6]; ЦАП 20. */
DAC_20 = Caliber[6];
/* Записывает DAC_04 значением Caliber[7]; ЦАП 04. */
DAC_04 = Caliber[7];
// Пришло врема!
DAC_go = 6; // начало зарада
LOAD_CAN_TIMEOUT = 2000; /* ms without fresh ZPT: freeze ramp. */
DAC_stop= 16; // конец зарада
// Пришло врема!
/* Записывает DAC_go значением 6; начальный ток нагрузки в мА, технологический регистр 0x50. */
DAC_go = 6; // начало зарада
LOAD_CAN_TIMEOUT = 2000; /* ms without fresh ZPT: freeze ramp. */ /* Записывает LOAD_CAN_TIMEOUT значением 2000; сохраняемый тайм-аут свежести напряжения CAN в миллисекундах, регистр 0x52. */
/* Записывает DAC_stop значением 16; конечный ток нагрузки в мА, технологический регистр 0x51. */
DAC_stop= 16; // конец зарада
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(Kurrent); последующий оператор выполняется только при истинном условии. */
if(Kurrent)
/* Цикл for(i=0;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<4;i++)
/* Записывает Zero_lev[i] значением 0x800; данные Zero_lev. */
Zero_lev[i] = 0x800;
/* Инициализирует модуль вызовом Init_sensors_more(); перед его дальнейшим использованием. */
Init_sensors_more();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Читает сохранённые регистры из области параметров EEPROM и применяет настройки платы. */
void Load_params()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет i — данные i; crc — данные crc. */
unsigned int i,crc;
/* Вызывает Seeprom_read. Читает EEPROM порциями; адрес задаётся словами C28x, размер переводится в число передаваемых слов. */
Seeprom_read(BALSAM167_EEPROM_PARAMS_START_WORD, param, (ANSWER_LEN+1)*2);
/* Записывает crc значением get_crc16(param,ANSWER_LEN); данные crc. */
crc = get_crc16(param,ANSWER_LEN);
if( (crc==param[ANSWER_LEN]) &&
(crc !=0xFFFF) &&
/* Проверяет if( (crc==param[ANSWER_LEN]) и; последующий оператор выполняется только при истинном условии. */
if( (crc==param[ANSWER_LEN]) &&
/* Продолжает список аргументов, полей или выражение (crc !=0xFFFF) &&; порядок элементов сохраняется. */
(crc !=0xFFFF) &&
/* Продолжает список аргументов, полей или выражение (Mode == param[126]) ); порядок элементов сохраняется. */
(Mode == param[126]) )
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Цикл for(i=0;i<ANSWER_LEN;i++) modbus[i] = param[i];; задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<ANSWER_LEN;i++) modbus[i] = param[i];
/* Записывает Commands значением 0; слово команд, технологический регистр 127. */
Commands=0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Вызывает Default_params. Заполняет регистры заводскими значениями; тайм-аут CAN нагрузки по умолчанию равен 600 мс. */
Default_params();
/* Записывает Commands значением 0; слово команд, технологический регистр 127. */
Commands=0;
/* Вызывает Save_params. Сохраняет технологические регистры в область параметров, отделённую от загрузочного образа EEPROM. */
Save_params();
/* Проверяет if(TermoSW); последующий оператор выполняется только при истинном условии. */
if(TermoSW)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает cTermoCal значением 1; данные cTermoCal. */
cTermoCal =1;
/* Записывает Caliber_time значением 0xFFFF; данные Caliber_time. */
Caliber_time = 0xFFFF;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} } }
/* Сохраняет технологические регистры в область параметров, отделённую от загрузочного образа EEPROM. */
void Save_params()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет i — данные i; dif — данные dif. Начальное значение задаётся справа от знака равенства. */
unsigned int i,dif=0;
/* Цикл for(i=0;i<ANSWER_LEN;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0;i<ANSWER_LEN;i++)
/* Проверяет if(param[i] != modbus[i]); последующий оператор выполняется только при истинном условии. */
if(param[i] != modbus[i])
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает param[i] значением modbus[i]; данные param. */
param[i] = modbus[i];
/* Записывает dif значением 1; данные dif. */
dif=1;
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(dif); последующий оператор выполняется только при истинном условии. */
if(dif)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает param[ANSWER_LEN] значением get_crc16(param,ANSWER_LEN); данные param. */
param[ANSWER_LEN] = get_crc16(param,ANSWER_LEN);
/* Вызывает Seeprom_write. Пишет EEPROM с разделением по физическим страницам; область параметров не пересекает образ прошивки. */
Seeprom_write(BALSAM167_EEPROM_PARAMS_START_WORD,param,(ANSWER_LEN+1)*2);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/***************************************************************/
/***************************************************************/
/* Передача данных по протоколу ModBus - команда 3
Чтение ачеек данных */
/* Передача данных по протоколу ModBus - команда 3
Чтение ачеек данных */
/***************************************************************/
/***************************************************************/
/* Формирует ответ Modbus с установленным старшим битом функции и кодом исключения. */
static void modbus_exception(RS_DATA *rs_arr, unsigned int function, unsigned int error)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет crc — данные crc. */
unsigned int crc;
/* Записывает rs_arr->buffer[0] значением CNTRL_ADDR; rs arr буфер. */
rs_arr->buffer[0] = CNTRL_ADDR;
/* Записывает rs_arr->buffer[1] значением function | 0x80; rs arr буфер. */
rs_arr->buffer[1] = function | 0x80;
/* Записывает rs_arr->buffer[2] значением error; rs arr буфер. */
rs_arr->buffer[2] = error;
/* Записывает crc значением get_crc_16(0xFFFF, rs_arr->buffer, 3); данные crc. */
crc = get_crc_16(0xFFFF, rs_arr->buffer, 3);
/* Записывает rs_arr->buffer[3] значением LOBYTE(crc); rs_arr->buffer[4] = HIBYTE(crc); rs arr буфер. */
rs_arr->buffer[3] = LOBYTE(crc); rs_arr->buffer[4] = HIBYTE(crc);
/* Записывает rs_arr->flag_TIMEOUT_to_Send значением true; rs arr флаг TIMEOUT to Send. */
rs_arr->flag_TIMEOUT_to_Send = true;
/* Вызывает RS_Send. Передаёт массив слов через SCI в выбранном режиме упаковки. */
RS_Send(rs_arr, rs_arr->buffer, 5);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* UART parser has already validated CRC and accepted the device address. */
/* Выбирает GAS либо существующее адресное пространство УМП и снимает согласованный ответ под краткой блокировкой IRQ. */
static int receive_ump(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет address — адрес; value — данные value; saved — данные saved; length — длина; count — число. */
unsigned int address, value, saved, length, count, error;
/* Main-loop only; encoded into the UART buffer before the next request.
* Keep the 124-word snapshot off the shared interrupt stack. */
/* Объявляет words — слова. */
static uint16_t words[UMP_MAX_WORDS];
/* Записывает address значением (rs_arr->RS_Header[2] << 8) | rs_arr->RS_Header[3]; адрес. */
address = (rs_arr->RS_Header[2] << 8) | rs_arr->RS_Header[3];
/* Проверяет if (address < UMP_BASE) return 0; последующий оператор выполняется только при истинном условии. */
if (address < UMP_BASE) return 0;
/* Записывает value значением (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5]; данные value. */
value = (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5];
/* SPI driver advances in Timer2 ISR: NEVER mask interrupts here.
* Reuse the existing snapshot buffer; the main loop owns this transaction.
* The shared validator rejects writes, wraparound and out-of-device reads. */
/* Проверяет if (address >= 0x1300U и address < 0x1308U); последующий оператор выполняется только при истинном условии. */
if (address >= 0x1300U && address < 0x1308U) {
/* Записывает count значением Load_protection_prepare(rs_arr->RS_Header[1], address, value, words, &error); число. */
count = Load_protection_prepare(rs_arr->RS_Header[1], address, value, words, &error);
/* Проверяет else if (address >= BALSAM167_EEPROM_RTU_BASE); последующий оператор выполняется только при истинном условии. */
} else if (address >= BALSAM167_EEPROM_RTU_BASE) {
/* Записывает error значением 2; ошибка. */
error = 2;
/* Условие компиляции EEPROM_M95M02: выбранный блок включается в текущий вариант прошивки. */
#if EEPROM_M95M02
/* Exception 3 prevents old AT-profile clients from falling back to
* legacy PEEK after a profile mismatch. No SPI transaction is issued. */
/* Проверяет if (!(value & BALSAM167_EEPROM_M95_MARKER)) error = 3; последующий оператор выполняется только при истинном условии. */
if (!(value & BALSAM167_EEPROM_M95_MARKER)) error = 3;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Записывает count значением 0; число. */
count = 0;
/* Проверяет if (balsam167_eeprom_block_valid(rs_arr->RS_Header[1], address, value)); последующий оператор выполняется только при истинном условии. */
if (balsam167_eeprom_block_valid(rs_arr->RS_Header[1], address, value)) {
/* Условие компиляции EEPROM_M95M02: выбранный блок включается в текущий вариант прошивки. */
#if EEPROM_M95M02
/* Записывает count значением value & 255U; число. */
count = value & 255U;
/* Вызывает Seeprom_read. Читает EEPROM порциями; адрес задаётся словами C28x, размер переводится в число передаваемых слов. */
Seeprom_read(balsam167_eeprom_block_word(address, value), words, count * 2);
/* Выбирает альтернативный блок текущего условия компиляции. */
#else
/* Записывает count значением value; число. */
count = value;
/* Вызывает Seeprom_read. Читает EEPROM порциями; адрес задаётся словами C28x, размер переводится в число передаваемых слов. */
Seeprom_read(address - BALSAM167_EEPROM_RTU_BASE, words, count * 2);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Записывает error значением 0; ошибка. */
error = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
} else {
/* Записывает saved значением __disable_interrupts(); данные saved. */
saved = __disable_interrupts();
/* Условие компиляции EEPROM_M95M02: выбранный блок включается в текущий вариант прошивки. */
#if EEPROM_M95M02
/* Проверяет if (gas167_contains(address)); последующий оператор выполняется только при истинном условии. */
if (gas167_contains(address))
/* Записывает count значением gas167_prepare(rs_arr->RS_Header[1], address, value, 0, words, &error); число. */
count = gas167_prepare(rs_arr->RS_Header[1], address, value, 0, words, &error);
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Записывает count значением ump_tms28335_capture(rs_arr->RS_Header[1], address, value, words, &error); число. */
count = ump_tms28335_capture(rs_arr->RS_Header[1], address, value, words, &error);
/* Вызывает __restore_interrupts с аргументами (saved) в текущей последовательности операций. */
__restore_interrupts(saved);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает length значением ump_rtu_encode(CNTRL_ADDR, rs_arr->RS_Header[1], error,; длина. */
length = ump_rtu_encode(CNTRL_ADDR, rs_arr->RS_Header[1], error,
/* Продолжает список аргументов, полей или выражение words, count, rs_arr->buffer, MAX_SEND_LENGTH);; порядок элементов сохраняется. */
words, count, rs_arr->buffer, MAX_SEND_LENGTH);
/* Проверяет if (length); последующий оператор выполняется только при истинном условии. */
if (length) {
/* Записывает rs_arr->flag_TIMEOUT_to_Send значением true; rs arr флаг TIMEOUT to Send. */
rs_arr->flag_TIMEOUT_to_Send = true;
/* Вызывает RS_Send. Передаёт массив слов через SCI в выбранном режиме упаковки. */
RS_Send(rs_arr, rs_arr->buffer, length);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Завершает receive_ump и возвращает 1. */
return 1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Обслуживает чтение регистров FC03 с проверкой адреса, длины и формированием ответа RTU. */
void ReceiveCommandModbus3(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет crc — данные crc; Address_MB — адрес MB; Length_MB — длина MB; i — данные i; value — данные value. */
unsigned int crc, Address_MB, Length_MB, i, value;
/* Проверяет if (receive_ump(rs_arr)) return; последующий оператор выполняется только при истинном условии. */
if (receive_ump(rs_arr)) return;
// получили начальный адрес чтениа
// получили начальный адрес чтениа
/* Записывает Address_MB значением (rs_arr->RS_Header[2] << 8) | rs_arr->RS_Header[3]; адрес MB. */
Address_MB = (rs_arr->RS_Header[2] << 8) | rs_arr->RS_Header[3];
// получили количество слов данных
// получили количество слов данных
/* Записывает Length_MB значением (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5]; длина MB. */
Length_MB = (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5];
/* Проверяет if (!Length_MB или Length_MB > 125 или; последующий оператор выполняется только при истинном условии. */
if (!Length_MB || Length_MB > 125 ||
/* Продолжает список аргументов, полей или выражение !(Address_MB < ANSWER_LEN && Length_MB <= ANSWER_LEN-Address_MB)) {; порядок элементов сохраняется. */
!(Address_MB < ANSWER_LEN && Length_MB <= ANSWER_LEN-Address_MB)) {
/* Вызывает modbus_exception. Формирует ответ Modbus с установленным старшим битом функции и кодом исключения. */
modbus_exception(rs_arr, CMD_MODBUS_3, 2); return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/////////////////////////////////////////////////
// Отсылка
/* Посчитали контрольную сумму перед самой посылкой */
// Отсылка
/* Посчитали контрольную сумму перед самой посылкой */
/* Записывает rs_arr->buffer[0] значением CNTRL_ADDR; rs arr буфер. */
rs_arr->buffer[0] = CNTRL_ADDR;
/* Записывает rs_arr->buffer[1] значением CMD_MODBUS_3; rs arr буфер. */
rs_arr->buffer[1] = CMD_MODBUS_3;
/* Записывает rs_arr->buffer[2] значением Length_MB*2; rs arr буфер. */
rs_arr->buffer[2] = Length_MB*2;
/* Защищаем целостность одного снимка/блока; передача UART идёт уже
* с разрешёнными прерываниями и не задерживает измерение/управление. */
/* Защищаем целостность одного снимка/блока; передача UART идёт уже
* с разрешёнными прерываниями и не задерживает измерение/управление. */
/* Цикл for (i=0;i<Length_MB;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for (i=0;i<Length_MB;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает value значением modbus[Address_MB+i]; данные value. */
value = modbus[Address_MB+i];
/* Записывает rs_arr->buffer[3+i*2] значением (value >> 8) & 0xFF; rs arr буфер. */
rs_arr->buffer[3+i*2] = (value >> 8) & 0xFF;
/* Записывает rs_arr->buffer[3+i*2+1] значением value & 0xFF; rs arr буфер. */
rs_arr->buffer[3+i*2+1] = value & 0xFF;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает crc значением 0xffff; данные crc. */
crc = 0xffff;
/* Записывает crc значением get_crc_16(crc, rs_arr->buffer, Length_MB*2+3); данные crc. */
crc = get_crc_16(crc, rs_arr->buffer, Length_MB*2+3);
/* Записывает rs_arr->buffer[Length_MB*2+3] значением LOBYTE(crc); rs arr буфер. */
rs_arr->buffer[Length_MB*2+3] = LOBYTE(crc);
/* Записывает rs_arr->buffer[Length_MB*2+4] значением HIBYTE(crc); rs arr буфер. */
rs_arr->buffer[Length_MB*2+4] = HIBYTE(crc);
rs_arr->buffer[Length_MB*2+5] = 0;
rs_arr->buffer[Length_MB*2+6] = 0;
rs_arr->buffer[Length_MB*2+7] = 0;
rs_arr->buffer[Length_MB*2+8] = 0;
/* Записывает rs_arr->buffer[Length_MB*2+5] значением 0; rs arr буфер. */
rs_arr->buffer[Length_MB*2+5] = 0;
/* Записывает rs_arr->buffer[Length_MB*2+6] значением 0; rs arr буфер. */
rs_arr->buffer[Length_MB*2+6] = 0;
/* Записывает rs_arr->buffer[Length_MB*2+7] значением 0; rs arr буфер. */
rs_arr->buffer[Length_MB*2+7] = 0;
/* Записывает rs_arr->buffer[Length_MB*2+8] значением 0; rs arr буфер. */
rs_arr->buffer[Length_MB*2+8] = 0;
/* Записывает rs_arr->flag_TIMEOUT_to_Send значением true; rs arr флаг TIMEOUT to Send. */
rs_arr->flag_TIMEOUT_to_Send=true;
/* Расширение логгера отвечает точным кадром Modbus без хвостовых
* нулей: они иначе попали бы в начало ответа следующего блока GUI.
* Исторический формат технологических регистров оставлен прежним. */
/* Расширение логгера отвечает точным кадром Modbus без хвостовых
* нулей: они иначе попали бы в начало ответа следующего блока GUI.
* Исторический формат технологических регистров оставлен прежним. */
/* Вызывает RS_Send. Передаёт массив слов через SCI в выбранном режиме упаковки. */
RS_Send(rs_arr, rs_arr->buffer, Length_MB*2+8);
/* Завершает ReceiveCommandModbus3 без возвращаемого значения. */
return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Обслуживает одиночную запись FC06, проверяя доступность регистра и допустимость значения. */
void ReceiveCommandModbus6(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет Address_MB — адрес MB; Data_MB — данные MB; i — данные i. */
unsigned int Address_MB, Data_MB, i;
/* Проверяет if (receive_ump(rs_arr)) return; последующий оператор выполняется только при истинном условии. */
if (receive_ump(rs_arr)) return;
/////////////////////////////////////////////////
// Отсылка
/* Отправлаем назад то же самое */
// Отсылка
/* Отправлаем назад то же самое */
/* Цикл for (i=0;i<8;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for (i=0;i<8;i++)
/* Записывает rs_arr->buffer[i] значением rs_arr->RS_Header[i]; rs arr буфер. */
rs_arr->buffer[i] = rs_arr->RS_Header[i];
// получили начальный адрес записи
// получили начальный адрес записи
/* Записывает Address_MB значением (rs_arr->RS_Header[2] << 8) | rs_arr->RS_Header[3]; адрес MB. */
Address_MB = (rs_arr->RS_Header[2] << 8) | rs_arr->RS_Header[3];
// получили слово данных
// получили слово данных
/* Записывает Data_MB значением (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5]; данные MB. */
Data_MB = (rs_arr->RS_Header[4] << 8) | rs_arr->RS_Header[5];
/* Проверяет if (Desk == dsk_LOAD и (Address_MB == 0x7CU или Address_MB == 0x7DU)); последующий оператор выполняется только при истинном условии. */
if (Desk == dsk_LOAD && (Address_MB == 0x7CU || Address_MB == 0x7DU)) {
/* Вызывает modbus_exception. Формирует ответ Modbus с установленным старшим битом функции и кодом исключения. */
modbus_exception(rs_arr, CMD_MODBUS_6, 2); return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if (Desk == dsk_LOAD и Address_MB == 0x52U и; последующий оператор выполняется только при истинном условии. */
if (Desk == dsk_LOAD && Address_MB == 0x52U &&
/* Продолжает список аргументов, полей или выражение (Data_MB == 0U || Data_MB > 60000U)) {; порядок элементов сохраняется. */
(Data_MB == 0U || Data_MB > 60000U)) {
/* Вызывает modbus_exception. Формирует ответ Modbus с установленным старшим битом функции и кодом исключения. */
modbus_exception(rs_arr, CMD_MODBUS_6, 3); return;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if (Address_MB < ANSWER_LEN); последующий оператор выполняется только при истинном условии. */
if (Address_MB < ANSWER_LEN) {
/* Записывает Modbus[Address_MB].all значением Data_MB; представление регистра целым словом без разбиения на битовые поля. */
Modbus[Address_MB].all = Data_MB;
/* Проверяет if (Address_MB == 127) ump_log_rs(); последующий оператор выполняется только при истинном условии. */
if (Address_MB == 127) ump_log_rs();
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
} else { modbus_exception(rs_arr, CMD_MODBUS_6, 2); return; }
/* Записывает rs_arr->flag_TIMEOUT_to_Send значением true; rs arr флаг TIMEOUT to Send. */
rs_arr->flag_TIMEOUT_to_Send=true;
/* Вызывает RS_Send. Передаёт массив слов через SCI в выбранном режиме упаковки. */
RS_Send(rs_arr, rs_arr->buffer, 10);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию SendCommandModbus4; назначение модуля — обработка Modbus, заводские параметры и сохранение настроек. */
void SendCommandModbus4(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет crc — данные crc. */
unsigned int crc;
/////////////////////////////////////////////////
// Отсылка
// Отсылка
/* Записывает rs_arr->buffer[0] значением 16; rs arr буфер. */
rs_arr->buffer[0] = 16;
/* Записывает rs_arr->buffer[1] значением 4; rs arr буфер. */
rs_arr->buffer[1] = 4;
/* Записывает rs_arr->buffer[2] значением 0; rs arr буфер. */
rs_arr->buffer[2] = 0;
/* Записывает rs_arr->buffer[3] значением 0; rs arr буфер. */
rs_arr->buffer[3] = 0;
/* Записывает rs_arr->buffer[4] значением 0; rs arr буфер. */
rs_arr->buffer[4] = 0;
/* Записывает rs_arr->buffer[5] значением 48; rs arr буфер. */
rs_arr->buffer[5] = 48;
/* Записывает crc значением 0xffff; данные crc. */
crc = 0xffff;
/* Записывает crc значением get_crc_16(crc, rs_arr->buffer, 6); данные crc. */
crc = get_crc_16(crc, rs_arr->buffer, 6);
/* Записывает rs_arr->buffer[6] значением LOBYTE(crc); rs arr буфер. */
rs_arr->buffer[6] = LOBYTE(crc);
/* Записывает rs_arr->buffer[7] значением HIBYTE(crc); rs arr буфер. */
rs_arr->buffer[7] = HIBYTE(crc);
//rs_arr->buffer[8] = 0;
//rs_arr->buffer[9] = 0;
//rs_arr->buffer[10] = 0;
/* Записывает rs_arr->flag_TIMEOUT_to_Send значением true; rs arr флаг TIMEOUT to Send. */
rs_arr->flag_TIMEOUT_to_Send=true;
/* Вызывает RS_Send. Передаёт массив слов через SCI в выбранном режиме упаковки. */
RS_Send(rs_arr, rs_arr->buffer, 8);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию ReceiveAnswerModbus4; назначение модуля — обработка Modbus, заводские параметры и сохранение настроек. */
void ReceiveAnswerModbus4(RS_DATA *rs_arr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет i — данные i. */
unsigned int i;
/////////////////////////////////////////////////
// Отсылка
// Отсылка
/* Цикл for (i=0;i<8;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for (i=0;i<8;i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает ext_temp[i] значением ( rs_arr->RS_Header[5+i*12] << 8) +; данные ext_temp. */
ext_temp[i] = ( rs_arr->RS_Header[5+i*12] << 8) +
/* Продолжает список аргументов, полей или выражение rs_arr->RS_Header[6+i*12];; порядок элементов сохраняется. */
rs_arr->RS_Header[6+i*12];
/* Записывает ext_diag[i] значением ( rs_arr->RS_Header[7+i*12] |; данные ext_diag. */
ext_diag[i] = ( rs_arr->RS_Header[7+i*12] |
/* Продолжает список аргументов, полей или выражение rs_arr->RS_Header[8+i*12] ) != 0;; порядок элементов сохраняется. */
rs_arr->RS_Header[8+i*12] ) != 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
+263 -35
View File
@@ -1,291 +1,519 @@
/* Перемычки режима платы, дискретные входы и выходы. Русские пояснения сохранены в UTF-8. */
/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */
#include "DSP2833x_Device.h" // DSP281x Headerfile Include File
/* Подключает "filter_bat2.h": накопительный фильтр измерительных каналов. */
#include "filter_bat2.h"
/* Подключает "measure.h": обработка датчиков, вычисление величин и миллисекундный такт системы. */
#include "measure.h"
/* Подключает "RS485.h": приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
#include "RS485.h"
/* Подключает "message.h": обработка Modbus, заводские параметры и сохранение настроек. */
#include "message.h"
/* Подключает "package.h": адреса устройств, типы плат и псевдонимы технологических регистров. */
#include "package.h"
/* Подключает "pulto.h": обмен и индикация пульта. */
#include "pulto.h"
/* Подключает "peripher.h": перемычки режима платы, дискретные входы и выходы. */
#include "peripher.h"
/* Подключает "GPIO_table.h": таблица назначения GPIO и макросы аппаратных сигналов платы. */
#include "GPIO_table.h"
/* Объявляет Mode — рабочий адрес или режим платы, выбранный перемычками; Desk — аппаратно определённый тип платы; TermoAD — данные TermoAD; TermoRS — данные TermoRS; TermoSW — данные TermoSW. Начальное значение задаётся справа от знака равенства. */
int Mode,Desk,TermoAD=0,TermoRS=0,TermoSW=0,Kurrent=0,Kalibro=0,Owen=0;
/* Объявляет INcount0 — данные INcount0; INcount1 — данные INcount1. Начальное значение задаётся справа от знака равенства. */
unsigned int INcount0=0,INcount1=0;
/* Продолжает список аргументов, полей или выражение LONGE DigErr;; порядок элементов сохраняется. */
LONGE DigErr;
/* Объявляет MUX_GPIO32 — выбор функции вывода 32; MUX_GPIO48 — выбор функции вывода 48; DIR_GPIO32 — данные DIR_GPIO32; DIR_GPIO48 — данные DIR_GPIO48. */
int MUX_GPIO32,MUX_GPIO48,DIR_GPIO32,DIR_GPIO48;
/* Начинает функцию setup_leds_line; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
void setup_leds_line()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает MUX_GPIO32 значением GpioCtrlRegs.GPBMUX1.bit.GPIO32; выбор функции вывода 32. */
MUX_GPIO32 = GpioCtrlRegs.GPBMUX1.bit.GPIO32;
/* Записывает MUX_GPIO48 значением GpioCtrlRegs.GPBMUX2.bit.GPIO48; выбор функции вывода 48. */
MUX_GPIO48 = GpioCtrlRegs.GPBMUX2.bit.GPIO48;
/* Записывает DIR_GPIO32 значением GpioCtrlRegs.GPBDIR.bit.GPIO32; данные DIR_GPIO32. */
DIR_GPIO32 = GpioCtrlRegs.GPBDIR.bit.GPIO32;
/* Записывает DIR_GPIO48 значением GpioCtrlRegs.GPBDIR.bit.GPIO48; данные DIR_GPIO48. */
DIR_GPIO48 = GpioCtrlRegs.GPBDIR.bit.GPIO48;
/* Разрешение записи в защищённые регистры периферии. */
EALLOW;
/* Записывает GpioCtrlRegs.GPBMUX1.bit.GPIO32 значением 0; аппаратная линия ввода/вывода GPIO32. */
GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0;
/* Записывает GpioCtrlRegs.GPBMUX2.bit.GPIO48 значением 0; аппаратная линия ввода/вывода GPIO48. */
GpioCtrlRegs.GPBMUX2.bit.GPIO48 = 0;
/* Записывает GpioCtrlRegs.GPBDIR.bit.GPIO32 значением 1; аппаратная линия ввода/вывода GPIO32. */
GpioCtrlRegs.GPBDIR.bit.GPIO32 = 1;
/* Записывает GpioCtrlRegs.GPBDIR.bit.GPIO48 значением 1; аппаратная линия ввода/вывода GPIO48. */
GpioCtrlRegs.GPBDIR.bit.GPIO48 = 1;
/* Закрытие доступа к защищённым регистрам периферии. */
EDIS;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию unsetup_leds_line; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
void unsetup_leds_line()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Разрешение записи в защищённые регистры периферии. */
EALLOW;
/* Записывает GpioCtrlRegs.GPBMUX1.bit.GPIO32 значением MUX_GPIO32; аппаратная линия ввода/вывода GPIO32. */
GpioCtrlRegs.GPBMUX1.bit.GPIO32 = MUX_GPIO32;
/* Записывает GpioCtrlRegs.GPBMUX2.bit.GPIO48 значением MUX_GPIO48; аппаратная линия ввода/вывода GPIO48. */
GpioCtrlRegs.GPBMUX2.bit.GPIO48 = MUX_GPIO48;
/* Записывает GpioCtrlRegs.GPBDIR.bit.GPIO32 значением DIR_GPIO32; аппаратная линия ввода/вывода GPIO32. */
GpioCtrlRegs.GPBDIR.bit.GPIO32 = DIR_GPIO32;
/* Записывает GpioCtrlRegs.GPBDIR.bit.GPIO48 значением DIR_GPIO48; аппаратная линия ввода/вывода GPIO48. */
GpioCtrlRegs.GPBDIR.bit.GPIO48 = DIR_GPIO48;
/* Закрытие доступа к защищённым регистрам периферии. */
EDIS;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Определяет адрес и тип платы по аппаратным перемычкам и задаёт рабочий режим. */
void get_Mode()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Разрешение записи в защищённые регистры периферии. */
EALLOW;
GpioCtrlRegs.GPAMUX1.all &= 0xFF000000; // 00—11
GpioCtrlRegs.GPAMUX2.all &= 0xFF00003F; // 19—27
GpioCtrlRegs.GPBMUX1.all &= 0xFFFFFFC0; // 32—34
GpioCtrlRegs.GPBMUX2.all &= 0x000FF000; // 48—53, 58—63
/* Оставляет биты маски GpioCtrlRegs.GPAMUX1.all значением 0xFF000000; представление регистра целым словом без разбиения на битовые поля. */
GpioCtrlRegs.GPAMUX1.all &= 0xFF000000; // 00—11
/* Оставляет биты маски GpioCtrlRegs.GPAMUX2.all значением 0xFF00003F; представление регистра целым словом без разбиения на битовые поля. */
GpioCtrlRegs.GPAMUX2.all &= 0xFF00003F; // 19—27
/* Оставляет биты маски GpioCtrlRegs.GPBMUX1.all значением 0xFFFFFFC0; представление регистра целым словом без разбиения на битовые поля. */
GpioCtrlRegs.GPBMUX1.all &= 0xFFFFFFC0; // 32—34
/* Оставляет биты маски GpioCtrlRegs.GPBMUX2.all значением 0x000FF000; представление регистра целым словом без разбиения на битовые поля. */
GpioCtrlRegs.GPBMUX2.all &= 0x000FF000; // 48—53, 58—63
/* Записывает GpioCtrlRegs.GPADIR.bit.GPIO20 значением 0; аппаратная линия ввода/вывода GPIO20. */
GpioCtrlRegs.GPADIR.bit.GPIO20 = 0;
/* Записывает GpioCtrlRegs.GPADIR.bit.GPIO21 значением 0; аппаратная линия ввода/вывода GPIO21. */
GpioCtrlRegs.GPADIR.bit.GPIO21 = 0;
/* Записывает GpioCtrlRegs.GPADIR.bit.GPIO22 значением 0; аппаратная линия ввода/вывода GPIO22. */
GpioCtrlRegs.GPADIR.bit.GPIO22 = 0;
/* Записывает GpioCtrlRegs.GPBDIR.bit.GPIO51 значением 0; аппаратная линия ввода/вывода GPIO51. */
GpioCtrlRegs.GPBDIR.bit.GPIO51 = 0;
EDIS;
/* Закрытие доступа к защищённым регистрам периферии. */
EDIS;
/* Записывает Mode значением 1; рабочий адрес или режим платы, выбранный перемычками. */
Mode = 1;
/* Увеличивает Mode значением 1 * !GpioDataRegs.GPADAT.bit.GPIO21; рабочий адрес или режим платы, выбранный перемычками. */
Mode += 1 * !GpioDataRegs.GPADAT.bit.GPIO21;
/* Увеличивает Mode значением 2 * !GpioDataRegs.GPADAT.bit.GPIO20; рабочий адрес или режим платы, выбранный перемычками. */
Mode += 2 * !GpioDataRegs.GPADAT.bit.GPIO20;
/* Увеличивает Mode значением 4 * !GpioDataRegs.GPADAT.bit.GPIO22; рабочий адрес или режим платы, выбранный перемычками. */
Mode += 4 * !GpioDataRegs.GPADAT.bit.GPIO22;
/* Увеличивает Mode значением 8 * !GpioDataRegs.GPBDAT.bit.GPIO51; рабочий адрес или режим платы, выбранный перемычками. */
Mode += 8 * !GpioDataRegs.GPBDAT.bit.GPIO51;
/* Проверяет if( (Mode==adr_POW1) или (Mode==adr_POW2)) Desk = dsk_COMM; последующий оператор выполняется только при истинном условии. */
if( (Mode==adr_POW1)||(Mode==adr_POW2)) Desk = dsk_COMM;
/* Проверяет if( (Mode==adr_TRN1) или (Mode==adr_TRN2)) Desk = dsk_BKST; последующий оператор выполняется только при истинном условии. */
if( (Mode==adr_TRN1)||(Mode==adr_TRN2)) Desk = dsk_BKST;
/* Проверяет if( (Mode==adr_LOA1) или (Mode==adr_LOA2)) Desk = dsk_LOAD; последующий оператор выполняется только при истинном условии. */
if( (Mode==adr_LOA1)||(Mode==adr_LOA2)) Desk = dsk_LOAD;
/* Проверяет if (Mode==adr_ENG1) Desk = dsk_BKSD; последующий оператор выполняется только при истинном условии. */
if (Mode==adr_ENG1) Desk = dsk_BKSD;
/* Проверяет if (Mode==adr_PULT) Desk = dsk_EPLT; последующий оператор выполняется только при истинном условии. */
if (Mode==adr_PULT) Desk = dsk_EPLT;
/* Проверяет if (Mode==adr_SHKF) Desk = dsk_SHKF; последующий оператор выполняется только при истинном условии. */
if (Mode==adr_SHKF) Desk = dsk_SHKF;
/* Проверяет if( (Desk==dsk_COMM) или (Desk==dsk_LOAD)) Kurrent = 1; последующий оператор выполняется только при истинном условии. */
if( (Desk==dsk_COMM)||(Desk==dsk_LOAD)) Kurrent = 1;
/* Проверяет if( (Desk==dsk_BKSD) или (Desk==dsk_BKST)) TermoRS = 1; последующий оператор выполняется только при истинном условии. */
if( (Desk==dsk_BKSD)||(Desk==dsk_BKST)) TermoRS = 1;
/* Проверяет if( (Desk==dsk_COMM) или (Desk==dsk_SHKF)) TermoAD = 1; последующий оператор выполняется только при истинном условии. */
if( (Desk==dsk_COMM)||(Desk==dsk_SHKF)) TermoAD = 1;
/* Проверяет if( (Desk==dsk_COMM) или (Desk==dsk_BKST)) TermoSW = 2; последующий оператор выполняется только при истинном условии. */
if( (Desk==dsk_COMM)||(Desk==dsk_BKST)) TermoSW = 2;
/* Проверяет if (Desk==dsk_BKSD) TermoSW = 1; последующий оператор выполняется только при истинном условии. */
if (Desk==dsk_BKSD) TermoSW = 1;
#ifdef CALIB_RS
/* Включает следующий блок только при определённом символе CALIB_RS. */
#ifdef CALIB_RS
/* Проверяет if (Desk!=dsk_EPLT) Kalibro = 1; последующий оператор выполняется только при истинном условии. */
if (Desk!=dsk_EPLT) Kalibro = 1;
#else
/* Выбирает альтернативный блок текущего условия компиляции. */
#else
/* Проверяет if( (Desk==dsk_COMM) или (Desk==dsk_SHKF) или; последующий оператор выполняется только при истинном условии. */
if( (Desk==dsk_COMM)||(Desk==dsk_SHKF)||
/* Записывает Kalibro значением 1; данные Kalibro. */
(Desk==dsk_LOAD) ) Kalibro = 1;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Включает следующий блок только при определённом символе OWEN. */
#ifdef OWEN
/* Проверяет if (Desk==dsk_COMM) Owen = OWEN_DT; последующий оператор выполняется только при истинном условии. */
if (Desk==dsk_COMM) Owen = OWEN_DT;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Сбрасывает аппаратный сигнал через clear_LED_OUT_1();. */
clear_LED_OUT_1();
/* Сбрасывает аппаратный сигнал через clear_LED_OUT_2();. */
clear_LED_OUT_2();
/* Сбрасывает аппаратный сигнал через clear_RES_OUT_1();. */
clear_RES_OUT_1();
/* Сбрасывает аппаратный сигнал через clear_RES_OUT_2();. */
clear_RES_OUT_2();
/* Разрешение записи в защищённые регистры периферии. */
EALLOW;
/* Вызывает switch с аргументами (Desk) в текущей последовательности операций. */
switch(Desk)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Ветвь выбора для dsk_COMM; выполняется при совпадении селектора switch. */
case dsk_COMM: GpioCtrlRegs.GPADIR.all = COMM_GPADIR;
/* Записывает GpioCtrlRegs.GPBDIR.all значением COMM_GPBDIR; break; представление регистра целым словом без разбиения на битовые поля. */
GpioCtrlRegs.GPBDIR.all = COMM_GPBDIR; break;
/* Ветвь выбора для dsk_BKSD; выполняется при совпадении селектора switch. */
case dsk_BKSD: GpioCtrlRegs.GPADIR.all = BKSD_GPADIR;
/* Записывает GpioCtrlRegs.GPBDIR.all значением BKSD_GPBDIR; break; представление регистра целым словом без разбиения на битовые поля. */
GpioCtrlRegs.GPBDIR.all = BKSD_GPBDIR; break;
/* Ветвь выбора для dsk_BKST; выполняется при совпадении селектора switch. */
case dsk_BKST: GpioCtrlRegs.GPADIR.all = BKST_GPADIR;
/* Записывает GpioCtrlRegs.GPBDIR.all значением BKST_GPBDIR; break; представление регистра целым словом без разбиения на битовые поля. */
GpioCtrlRegs.GPBDIR.all = BKST_GPBDIR; break;
/* Ветвь выбора для dsk_EPLT; выполняется при совпадении селектора switch. */
case dsk_EPLT: GpioCtrlRegs.GPADIR.all = PLT2_GPADIR;
/* Записывает GpioCtrlRegs.GPBDIR.all значением PLT2_GPBDIR; break; представление регистра целым словом без разбиения на битовые поля. */
GpioCtrlRegs.GPBDIR.all = PLT2_GPBDIR; break;
/* Ветвь выбора для dsk_LOAD; выполняется при совпадении селектора switch. */
case dsk_LOAD: GpioCtrlRegs.GPADIR.all = LOAD_GPADIR;
GpioCtrlRegs.GPBDIR.all = LOAD_GPBDIR;
/* Записывает GpioCtrlRegs.GPBDIR.all значением LOAD_GPBDIR; представление регистра целым словом без разбиения на битовые поля. */
GpioCtrlRegs.GPBDIR.all = LOAD_GPBDIR;
/* Записывает GpioDataRegs.GPASET.bit.GPIO3 значением 1; break; аппаратная линия ввода/вывода GPIO3. */
GpioDataRegs.GPASET.bit.GPIO3=1; break;
/* Ветвь выбора для dsk_SHKF; выполняется при совпадении селектора switch. */
case dsk_SHKF: GpioCtrlRegs.GPADIR.all = SHKF_GPADIR;
/* Записывает GpioCtrlRegs.GPBDIR.all значением SHKF_GPBDIR; break; представление регистра целым словом без разбиения на битовые поля. */
GpioCtrlRegs.GPBDIR.all = SHKF_GPBDIR; break;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрытие доступа к защищённым регистрам периферии. */
EDIS;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию select_tpl_255; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
void select_tpl_255(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(Desk==dsk_BKSD); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_BKSD)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Задаёт BKSD_A_tpl_255 = ((1L<<11) + (1L<<9) + (1L<<7) + (1L<<3)); данные BKSD_A_tpl_255. */
#define BKSD_A_tpl_255 ((1L<<11) + (1L<<9) + (1L<<7) + (1L<<3))
/* Записывает GpioDataRegs.GPACLEAR.all значением BKSD_A_tpl_255; представление регистра целым словом без разбиения на битовые поля. */
GpioDataRegs.GPACLEAR.all = BKSD_A_tpl_255;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(Desk==dsk_COMM); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_COMM)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Задаёт COMM_A_tpl_255 = ((1L<<27) + (1L<<24) + (1L<<25)); данные COMM_A_tpl_255. */
#define COMM_A_tpl_255 ((1L<<27) + (1L<<24) + (1L<<25))
/* Задаёт COMM_B_tpl_255 = ((1L<<(49-32)) + (1L<<(52-32))); данные COMM_B_tpl_255. */
#define COMM_B_tpl_255 ((1L<<(49-32)) + (1L<<(52-32)))
/* Записывает GpioDataRegs.GPASET.all значением COMM_A_tpl_255; представление регистра целым словом без разбиения на битовые поля. */
GpioDataRegs.GPASET.all = COMM_A_tpl_255;
/* Записывает GpioDataRegs.GPBSET.all значением COMM_B_tpl_255; представление регистра целым словом без разбиения на битовые поля. */
GpioDataRegs.GPBSET.all = COMM_B_tpl_255;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(Desk==dsk_BKST); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_BKST)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Задаёт BKST_A_tpl_zero = ((1L<<11) + (1L<<9) + (1L<<7) + (1L<<3) + (1L<<1) + (1L<<8) + (1L<<6) + (1L<<0) + (1L<<27) + (1L<<24)); данные BKST_A_tpl_zero. */
#define BKST_A_tpl_zero ((1L<<11) + (1L<<9) + (1L<<7) + (1L<<3) + (1L<<1) + (1L<<8) + (1L<<6) + (1L<<0) + (1L<<27) + (1L<<24))
/* Задаёт BKST_B_tpl_zero = ((1L<<(53-32)) + (1L<<(50-32))); данные BKST_B_tpl_zero. */
#define BKST_B_tpl_zero ((1L<<(53-32)) + (1L<<(50-32)))
/* Записывает GpioDataRegs.GPASET.all значением BKST_A_tpl_zero; представление регистра целым словом без разбиения на битовые поля. */
GpioDataRegs.GPASET.all = BKST_A_tpl_zero;
/* Записывает GpioDataRegs.GPBSET.all значением BKST_B_tpl_zero; представление регистра целым словом без разбиения на битовые поля. */
GpioDataRegs.GPBSET.all = BKST_B_tpl_zero;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/* Начинает функцию select_tpl_canal; назначение модуля — перемычки режима платы, дискретные входы и выходы. */
void select_tpl_canal(int n_tpl)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет GPIO_A_tpl_set — аппаратная линия ввода/вывода GPIO_A_tpl_set. Начальное значение задаётся справа от знака равенства. */
unsigned long GPIO_A_tpl_set = 0;
/* Объявляет GPIO_B_tpl_set — аппаратная линия ввода/вывода GPIO_B_tpl_set. Начальное значение задаётся справа от знака равенства. */
unsigned long GPIO_B_tpl_set = 0;
/* Проверяет if(Desk==dsk_BKSD); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_BKSD)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(!(n_tpl&0x01)) GPIO_A_tpl_set|=(1L<<11); последующий оператор выполняется только при истинном условии. */
if(!(n_tpl&0x01)) GPIO_A_tpl_set|=(1L<<11);
/* Проверяет if(!(n_tpl&0x02)) GPIO_A_tpl_set|=(1L<<9); последующий оператор выполняется только при истинном условии. */
if(!(n_tpl&0x02)) GPIO_A_tpl_set|=(1L<<9);
/* Проверяет if(!(n_tpl&0x04)) GPIO_A_tpl_set|=(1L<<7); последующий оператор выполняется только при истинном условии. */
if(!(n_tpl&0x04)) GPIO_A_tpl_set|=(1L<<7);
/* Проверяет if(!(n_tpl&0x08)) GPIO_A_tpl_set|=(1L<<3); последующий оператор выполняется только при истинном условии. */
if(!(n_tpl&0x08)) GPIO_A_tpl_set|=(1L<<3);
/* Записывает GpioDataRegs.GPASET.all значением GPIO_A_tpl_set; представление регистра целым словом без разбиения на битовые поля. */
GpioDataRegs.GPASET.all = GPIO_A_tpl_set;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(Desk==dsk_BKST); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_BKST)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(n_tpl==0) GpioDataRegs.GPACLEAR.bit.GPIO11=1; последующий оператор выполняется только при истинном условии. */
if(n_tpl==0) GpioDataRegs.GPACLEAR.bit.GPIO11=1;
/* Проверяет if(n_tpl==1) GpioDataRegs.GPACLEAR.bit.GPIO9=1; последующий оператор выполняется только при истинном условии. */
if(n_tpl==1) GpioDataRegs.GPACLEAR.bit.GPIO9=1;
/* Проверяет if(n_tpl==2) GpioDataRegs.GPACLEAR.bit.GPIO7=1; последующий оператор выполняется только при истинном условии. */
if(n_tpl==2) GpioDataRegs.GPACLEAR.bit.GPIO7=1;
/* Проверяет if(n_tpl==3) GpioDataRegs.GPACLEAR.bit.GPIO3=1; последующий оператор выполняется только при истинном условии. */
if(n_tpl==3) GpioDataRegs.GPACLEAR.bit.GPIO3=1;
/* Проверяет if(n_tpl==4) GpioDataRegs.GPACLEAR.bit.GPIO1=1; последующий оператор выполняется только при истинном условии. */
if(n_tpl==4) GpioDataRegs.GPACLEAR.bit.GPIO1=1;
/* Проверяет if(n_tpl==5) GpioDataRegs.GPACLEAR.bit.GPIO8=1; последующий оператор выполняется только при истинном условии. */
if(n_tpl==5) GpioDataRegs.GPACLEAR.bit.GPIO8=1;
/* Проверяет if(n_tpl==6) GpioDataRegs.GPACLEAR.bit.GPIO6=1; последующий оператор выполняется только при истинном условии. */
if(n_tpl==6) GpioDataRegs.GPACLEAR.bit.GPIO6=1;
/* Проверяет if(n_tpl==7) GpioDataRegs.GPACLEAR.bit.GPIO0=1; последующий оператор выполняется только при истинном условии. */
if(n_tpl==7) GpioDataRegs.GPACLEAR.bit.GPIO0=1;
/* Проверяет if(n_tpl==8) GpioDataRegs.GPACLEAR.bit.GPIO27=1; последующий оператор выполняется только при истинном условии. */
if(n_tpl==8) GpioDataRegs.GPACLEAR.bit.GPIO27=1;
/* Проверяет if(n_tpl==9) GpioDataRegs.GPACLEAR.bit.GPIO24=1; последующий оператор выполняется только при истинном условии. */
if(n_tpl==9) GpioDataRegs.GPACLEAR.bit.GPIO24=1;
/* Проверяет if(n_tpl==10) GpioDataRegs.GPBCLEAR.bit.GPIO53=1; последующий оператор выполняется только при истинном условии. */
if(n_tpl==10) GpioDataRegs.GPBCLEAR.bit.GPIO53=1;
/* Проверяет if(n_tpl==11) GpioDataRegs.GPBCLEAR.bit.GPIO50=1; последующий оператор выполняется только при истинном условии. */
if(n_tpl==11) GpioDataRegs.GPBCLEAR.bit.GPIO50=1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(Desk==dsk_COMM); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_COMM)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(!(n_tpl&0x01)) GPIO_A_tpl_set|=(1L<<27); последующий оператор выполняется только при истинном условии. */
if(!(n_tpl&0x01)) GPIO_A_tpl_set|=(1L<<27);
/* Проверяет if(!(n_tpl&0x02)) GPIO_A_tpl_set|=(1L<<24); последующий оператор выполняется только при истинном условии. */
if(!(n_tpl&0x02)) GPIO_A_tpl_set|=(1L<<24);
/* Проверяет if(!(n_tpl&0x04)) GPIO_A_tpl_set|=(1L<<25); последующий оператор выполняется только при истинном условии. */
if(!(n_tpl&0x04)) GPIO_A_tpl_set|=(1L<<25);
/* Проверяет if(!(n_tpl&0x08)) GPIO_B_tpl_set|=(1L<<(49-32)); последующий оператор выполняется только при истинном условии. */
if(!(n_tpl&0x08)) GPIO_B_tpl_set|=(1L<<(49-32));
/* Проверяет if(!(n_tpl&0x10)) GPIO_B_tpl_set|=(1L<<(52-32)); последующий оператор выполняется только при истинном условии. */
if(!(n_tpl&0x10)) GPIO_B_tpl_set|=(1L<<(52-32));
/* Записывает GpioDataRegs.GPACLEAR.all значением GPIO_A_tpl_set; представление регистра целым словом без разбиения на битовые поля. */
GpioDataRegs.GPACLEAR.all = GPIO_A_tpl_set;
/* Записывает GpioDataRegs.GPBCLEAR.all значением GPIO_B_tpl_set; представление регистра целым словом без разбиения на битовые поля. */
GpioDataRegs.GPBCLEAR.all = GPIO_B_tpl_set;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/* Считывает кнопки, обновляет флаги команд и учитывает текущий тип платы. */
void get_Buttons()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет butt — данные butt. Начальное значение задаётся справа от знака равенства. */
unsigned long butt =0;
/* Объявляет fluf — данные fluf. Начальное значение задаётся справа от знака равенства. */
unsigned long fluf =0;
/* Проверяет if(Desk==dsk_BKSD); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_BKSD)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает bTestLamp значением !GpioDataRegs.GPBDAT.bit.GPIO50; данные bTestLamp. */
bTestLamp = !GpioDataRegs.GPBDAT.bit.GPIO50;
/* Записывает bSecretBt значением !GpioDataRegs.GPBDAT.bit.GPIO49; данные bSecretBt. */
bSecretBt = !GpioDataRegs.GPBDAT.bit.GPIO49;
/* Записывает InputRep0 значением bTestLamp; вход Rep 0. */
InputRep0 = bTestLamp;
/* Записывает InputRep1 значением bSecretBt; вход Rep 1. */
InputRep1 = bSecretBt;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO0) butt +=0x0001; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO0) butt +=0x0001;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO2) butt +=0x0002; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO2) butt +=0x0002;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO10)butt +=0x0004; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO10)butt +=0x0004;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO4) butt +=0x0008; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO4) butt +=0x0008;
/* Записывает Inputs.all значением butt; представление регистра целым словом без разбиения на битовые поля. */
Inputs.all = butt;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Íè÷åãî òàêîãî â äåéñòâèòåëüíîñòè íåò
/* Ничего такого в действительности нет
if(Desk==dsk_BKST)
{ bSecretBt = !GpioDataRegs.GPBDAT.bit.GPIO63;
InputRep1 = bSecretBt;
return;
} */
/* Проверяет if(Desk==dsk_COMM); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_COMM)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает bSecretBt значением !GpioDataRegs.GPBDAT.bit.GPIO53; данные bSecretBt. */
bSecretBt = !GpioDataRegs.GPBDAT.bit.GPIO53;
/* Записывает bTermoCal значением er_anal(!GpioDataRegs.GPBDAT.bit.GPIO50, &INcount0, 0xFFFF, 0); данные bTermoCal. */
bTermoCal = er_anal(!GpioDataRegs.GPBDAT.bit.GPIO50, &INcount0, 0xFFFF, 0);
/* Записывает InputRep1 значением bSecretBt; вход Rep 1. */
InputRep1 = bSecretBt;
/* Записывает InputRep2 значением bTermoCal; вход Rep 2. */
InputRep2 = bTermoCal;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(Desk==dsk_EPLT); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_EPLT)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает bTestLamp значением er_anal(GpioDataRegs.GPADAT.bit.GPIO26, &INcount0, 1000, 0); данные bTestLamp. */
bTestLamp = er_anal(GpioDataRegs.GPADAT.bit.GPIO26, &INcount0, 1000, 0);
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO27) butt +=0x0001; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO27) butt +=0x0001;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO24) butt +=0x0002; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO24) butt +=0x0002;
/* Проверяет if(GpioDataRegs.GPBDAT.bit.GPIO53) butt +=0x0004; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPBDAT.bit.GPIO53) butt +=0x0004;
/* Проверяет if(GpioDataRegs.GPBDAT.bit.GPIO50) butt +=0x0008; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPBDAT.bit.GPIO50) butt +=0x0008;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO26) butt +=0x0010; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO26) butt +=0x0010;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO23) butt +=0x0020; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO23) butt +=0x0020;
/* Проверяет if(GpioDataRegs.GPBDAT.bit.GPIO52) butt +=0x0040; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPBDAT.bit.GPIO52) butt +=0x0040;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO4 ) butt +=0x0080; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO4 ) butt +=0x0080;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO25) butt +=0x0100; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO25) butt +=0x0100;
/* Проверяет if(GpioDataRegs.GPBDAT.bit.GPIO49) butt +=0x0200; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPBDAT.bit.GPIO49) butt +=0x0200;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO11) butt +=0x0400; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO11) butt +=0x0400;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO5 ) butt +=0x0800; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO5 ) butt +=0x0800;
/* Проверяет if(GpioDataRegs.GPBDAT.bit.GPIO48) butt +=0x1000; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPBDAT.bit.GPIO48) butt +=0x1000;
if(GpioDataRegs.GPADAT.bit.GPIO10) butt +=0x2000; // Ñåêğåòíûé âõîä
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO10) butt +=0x2000; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO10) butt +=0x2000; // Секретный вход
/* Записывает Inputs.all значением butt; представление регистра целым словом без разбиения на битовые поля. */
Inputs.all = butt;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(Desk==dsk_LOAD); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_LOAD)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(!GpioDataRegs.GPADAT.bit.GPIO6) butt +=0x0001; последующий оператор выполняется только при истинном условии. */
if(!GpioDataRegs.GPADAT.bit.GPIO6) butt +=0x0001; // OMEGA
/* Проверяет if(!GpioDataRegs.GPADAT.bit.GPIO8) butt +=0x0002; последующий оператор выполняется только при истинном условии. */
if(!GpioDataRegs.GPADAT.bit.GPIO8) butt +=0x0002; // Start_1
/* Проверяет if(!GpioDataRegs.GPADAT.bit.GPIO11) butt +=0x0004; последующий оператор выполняется только при истинном условии. */
if(!GpioDataRegs.GPADAT.bit.GPIO11) butt +=0x0004; // Res_in
/* Записывает Inputs.all значением butt; представление регистра целым словом без разбиения на битовые поля. */
Inputs.all = butt;
}
if(Desk==dsk_SHKF)
{
if(GpioDataRegs.GPBDAT.bit.GPIO53) fluf += 0x0000010; else butt += 0x0001;
if(GpioDataRegs.GPBDAT.bit.GPIO52) fluf += 0x0000040; else butt += 0x0002;
if(GpioDataRegs.GPADAT.bit.GPIO2) fluf += 0x0001000; else butt += 0x0004;
if(GpioDataRegs.GPADAT.bit.GPIO4) fluf += 0x0002000; else butt += 0x0008;
if(GpioDataRegs.GPADAT.bit.GPIO6) fluf += 0x0004000; else butt += 0x0010;
if(GpioDataRegs.GPADAT.bit.GPIO0) fluf += 0x0008000; else butt += 0x0020;
if(GpioDataRegs.GPADAT.bit.GPIO8) fluf += 0x0010000; else butt += 0x0040;
if(GpioDataRegs.GPADAT.bit.GPIO10) fluf += 0x0020000; else butt += 0x0080;
if(GpioDataRegs.GPADAT.bit.GPIO3) fluf += 0x0040000; else butt += 0x0100;
if(GpioDataRegs.GPADAT.bit.GPIO5) fluf += 0x0080000; else butt += 0x0200;
if(GpioDataRegs.GPADAT.bit.GPIO7) fluf += 0x0100000; else butt += 0x0400;
if(GpioDataRegs.GPADAT.bit.GPIO1) fluf += 0x0200000; else butt += 0x0800;
if(GpioDataRegs.GPADAT.bit.GPIO11) fluf += 0x0400000; else butt += 0x1000;
if(GpioDataRegs.GPADAT.bit.GPIO9) fluf += 0x0800000; else butt += 0x2000;
DigErr.all = fluf;
Inputs.all = butt;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(Desk==dsk_SHKF); последующий оператор выполняется только при истинном условии. */
if(Desk==dsk_SHKF)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(GpioDataRegs.GPBDAT.bit.GPIO53) fluf += 0x0000010; else butt += 0x0001; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPBDAT.bit.GPIO53) fluf += 0x0000010; else butt += 0x0001;
/* Проверяет if(GpioDataRegs.GPBDAT.bit.GPIO52) fluf += 0x0000040; else butt += 0x0002; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPBDAT.bit.GPIO52) fluf += 0x0000040; else butt += 0x0002;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO2) fluf += 0x0001000; else butt += 0x0004; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO2) fluf += 0x0001000; else butt += 0x0004;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO4) fluf += 0x0002000; else butt += 0x0008; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO4) fluf += 0x0002000; else butt += 0x0008;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO6) fluf += 0x0004000; else butt += 0x0010; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO6) fluf += 0x0004000; else butt += 0x0010;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO0) fluf += 0x0008000; else butt += 0x0020; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO0) fluf += 0x0008000; else butt += 0x0020;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO8) fluf += 0x0010000; else butt += 0x0040; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO8) fluf += 0x0010000; else butt += 0x0040;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO10) fluf += 0x0020000; else butt += 0x0080; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO10) fluf += 0x0020000; else butt += 0x0080;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO3) fluf += 0x0040000; else butt += 0x0100; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO3) fluf += 0x0040000; else butt += 0x0100;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO5) fluf += 0x0080000; else butt += 0x0200; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO5) fluf += 0x0080000; else butt += 0x0200;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO7) fluf += 0x0100000; else butt += 0x0400; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO7) fluf += 0x0100000; else butt += 0x0400;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO1) fluf += 0x0200000; else butt += 0x0800; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO1) fluf += 0x0200000; else butt += 0x0800;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO11) fluf += 0x0400000; else butt += 0x1000; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO11) fluf += 0x0400000; else butt += 0x1000;
/* Проверяет if(GpioDataRegs.GPADAT.bit.GPIO9) fluf += 0x0800000; else butt += 0x2000; последующий оператор выполняется только при истинном условии. */
if(GpioDataRegs.GPADAT.bit.GPIO9) fluf += 0x0800000; else butt += 0x2000;
/* Записывает DigErr.all значением fluf; представление регистра целым словом без разбиения на битовые поля. */
DigErr.all = fluf;
/* Записывает Inputs.all значением butt; представление регистра целым словом без разбиения на битовые поля. */
Inputs.all = butt;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает butt значением 1 * !GpioDataRegs.GPADAT.bit.GPIO21; данные butt. */
butt = 1 * !GpioDataRegs.GPADAT.bit.GPIO21;
/* Увеличивает butt значением 2 * !GpioDataRegs.GPADAT.bit.GPIO20; данные butt. */
butt += 2 * !GpioDataRegs.GPADAT.bit.GPIO20;
/* Увеличивает butt значением 4 * !GpioDataRegs.GPADAT.bit.GPIO22; данные butt. */
butt += 4 * !GpioDataRegs.GPADAT.bit.GPIO22;
/* Увеличивает butt значением 8 * !GpioDataRegs.GPBDAT.bit.GPIO51; данные butt. */
butt += 8 * !GpioDataRegs.GPBDAT.bit.GPIO51;
/* Записывает Jumpers значением butt; данные Jumpers. */
Jumpers = butt;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
+93 -4
View File
@@ -1,107 +1,196 @@
/* Обмен и индикация пульта. Русские пояснения сохранены в UTF-8. */
/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_SWPrioritizedIsrLevels.h"
/* Подключает "DSP2833x_SWPrioritizedIsrLevels.h": поставляемое TI описание SWPrioritizedIsrLevels для семейства C2833x. */
#include "DSP2833x_SWPrioritizedIsrLevels.h"
/* Подключает "RS485.h": приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
#include "RS485.h"
/* Подключает "message.h": обработка Modbus, заводские параметры и сохранение настроек. */
#include "message.h"
/* Подключает "filter_bat2.h": накопительный фильтр измерительных каналов. */
#include "filter_bat2.h"
/* Подключает "measure.h": обработка датчиков, вычисление величин и миллисекундный такт системы. */
#include "measure.h"
/* Подключает "package.h": адреса устройств, типы плат и псевдонимы технологических регистров. */
#include "package.h"
/* Подключает "pulto.h": обмен и индикация пульта. */
#include "pulto.h"
/* Подключает "kanal.h": последовательный вывод данных канала индикации. */
#include "kanal.h"
/* Подключает "peripher.h": перемычки режима платы, дискретные входы и выходы. */
#include "peripher.h"
/* Объявляет isMask — is маска. */
unsigned long isMask;
/* Объявляет isNumb — данные isNumb. */
int isNumb;
/* Объявляет quaLamp — данные quaLamp. Начальное значение задаётся справа от знака равенства. */
int quaLamp = 6;
/* Объявляет Lonely — данные Lonely. Начальное значение задаётся справа от знака равенства. */
unsigned long Lonely=0;
/* Начинает функцию what_is; назначение модуля — обмен и индикация пульта. */
void what_is()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет count_blink — число blink. */
static unsigned int count_blink;
/* Объявляет numb — данные numb. Начальное значение задаётся справа от знака равенства. */
static int numb=0;
/* Проверяет if(++count_blink >= BLINK_TIME); последующий оператор выполняется только при истинном условии. */
if(++count_blink >= BLINK_TIME)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает count_blink значением 0; число blink. */
count_blink=0;
/* Записывает numb значением 0; данные numb. */
numb++; if(numb==10) numb=0;
/* Записывает isNumb значением numb*1000 + numb*100 + numb*10 +numb; данные isNumb. */
isNumb = numb*1000 + numb*100 + numb*10 +numb;
/* Проверяет if(isMask) isMask = 0; последующий оператор выполняется только при истинном условии. */
if(isMask) isMask = 0;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else isMask = 0xFFFFFFFF;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
/* Обслуживает периодический обмен и индикацию пульта вместо измерительной платы. */
interrupt void cpu_timer1_isr_PULT(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет cownt — данные cownt; count_bright — число bright. Начальное значение задаётся справа от знака равенства. */
static int cownt=0,count_bright;
/* Объявляет light — данные light; i — данные i. Начальное значение задаётся справа от знака равенства. */
unsigned int light=0, i;
/* Объявляет Alone — данные Alone; READY_FREQ — частота основного такта Timer1 в герцах. Хранит указатель на данные. Начальное значение задаётся справа от знака равенства. */
unsigned int Alone = 20*READY_FREQ;
/* Разрешение записи в защищённые регистры периферии. */
EALLOW;
/* Изменяет счётчик в выражении CpuTimer1.InterruptCount++; на один для следующего шага. */
CpuTimer1.InterruptCount++;
/* Устанавливает биты IER значением MINT13; регистр разрешения прерываний ядра C28x. */
IER |= MINT13; // Set "global" priority
/* Разрешение маскируемых прерываний ядра. */
EINT;
/* Закрытие доступа к защищённым регистрам периферии. */
EDIS; // This is needed to disable write to EALLOW protected registers
/* Проверяет if(!cReset) ServiceDog(); последующий оператор выполняется только при истинном условии. */
if(!cReset) ServiceDog();
/* Проверяет if(++CanPowse >= CANPOWSE); последующий оператор выполняется только при истинном условии. */
if(++CanPowse >= CANPOWSE)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает CanPowse значением 0; CAN Powse. */
CanPowse = 0;
/* Записывает CanGO значением 1; CAN GO. */
CanGO = 1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
toggle_ONLINE(); // ñòðîá äëà ÏËÈÑ
toggle_RES_OUT_1(); // òèïà ýòî ãîòîâíîñòü
toggle_RES_OUT_2(); // íà âñàêèé
/* Переключает аппаратный сигнал через toggle_ONLINE();. */
toggle_ONLINE(); // строб дла ПЛИС
/* Переключает аппаратный сигнал через toggle_RES_OUT_1();. */
toggle_RES_OUT_1(); // типа это готовность
/* Переключает аппаратный сигнал через toggle_RES_OUT_2();. */
toggle_RES_OUT_2(); // на всакий
/* Проверяет if(++Lonely > Alone) Lonely = Alone; последующий оператор выполняется только при истинном условии. */
if(++Lonely > Alone) Lonely = Alone;
/* Проверяет if(++count_bright >= maximum_bright) count_bright = 0; последующий оператор выполняется только при истинном условии. */
if(++count_bright >= maximum_bright) count_bright = 0 ;
/* Цикл for(i=0; i<quaLamp; i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for(i=0; i<quaLamp; i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(count_bright < Bright[i]) light+=(1<<i); последующий оператор выполняется только при истинном условии. */
if(count_bright < Bright[i]) light+=(1<<i);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(++cownt>2) cownt=0; последующий оператор выполняется только при истинном условии. */
if(++cownt>2) cownt=0;
/* Проверяет if(cTestLamp|bTestLamp); последующий оператор выполняется только при истинном условии. */
if(cTestLamp|bTestLamp)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Вызывает what_is с аргументами () в текущей последовательности операций. */
what_is();
/* Проверяет if(cownt == 0) kanal_Send(0,isNumb,4); последующий оператор выполняется только при истинном условии. */
if(cownt == 0) kanal_Send(0,isNumb,4);
/* Проверяет if(cownt == 1) kanal_Send(1,isNumb,4); последующий оператор выполняется только при истинном условии. */
if(cownt == 1) kanal_Send(1,isNumb,4);
/* Вызывает kanal_Send с аргументами (2,isMask,0) в текущей последовательности операций. */
kanal_Send(2,isMask,0);
/* Проверяет if(cownt == 2) kanal_Send(3,isMask,0); последующий оператор выполняется только при истинном условии. */
if(cownt == 2) kanal_Send(3,isMask,0);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Проверяет if(cLiteFire); последующий оператор выполняется только при истинном условии. */
if(cLiteFire)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(cownt == 0) kanal_Send(0,8888,1); последующий оператор выполняется только при истинном условии. */
if(cownt == 0) kanal_Send(0,8888,1);
/* Проверяет if(cownt == 1) kanal_Send(1,8888,1); последующий оператор выполняется только при истинном условии. */
if(cownt == 1) kanal_Send(1,8888,1);
/* Вызывает kanal_Send с аргументами (2,0xFFFF & light,0) в текущей последовательности операций. */
kanal_Send(2,0xFFFF & light,0);
/* Проверяет if(cownt == 2) kanal_Send(3,0xFFFF,0); последующий оператор выполняется только при истинном условии. */
if(cownt == 2) kanal_Send(3,0xFFFF,0);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Проверяет if((Lonely >= Alone)); последующий оператор выполняется только при истинном условии. */
if((Lonely >= Alone))
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(cownt == 0) kanal_Send(0,0,0); последующий оператор выполняется только при истинном условии. */
if(cownt == 0) kanal_Send(0,0,0);
/* Проверяет if(cownt == 1) kanal_Send(1,0,0); последующий оператор выполняется только при истинном условии. */
if(cownt == 1) kanal_Send(1,0,0);
/* Вызывает kanal_Send с аргументами (2,0,0) в текущей последовательности операций. */
kanal_Send(2,0,0);
/* Проверяет if(cownt == 2) kanal_Send(3,0,0); последующий оператор выполняется только при истинном условии. */
if(cownt == 2) kanal_Send(3,0,0);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Условие компиляции OBOROT == STRAIGHT: выбранный блок включается в текущий вариант прошивки. */
#if OBOROT == STRAIGHT
/* Проверяет if(cownt == 0) kanal_Send(0,modbus[0],1); последующий оператор выполняется только при истинном условии. */
if(cownt == 0) kanal_Send(0,modbus[0],1);
/* Проверяет if(cownt == 1) kanal_Send(1,modbus[1],1); последующий оператор выполняется только при истинном условии. */
if(cownt == 1) kanal_Send(1,modbus[1],1);
/* Выбирает альтернативный блок текущего условия компиляции. */
#else
/* Проверяет if(cownt == 0) kanal_Send(0,modbus[1],1); последующий оператор выполняется только при истинном условии. */
if(cownt == 0) kanal_Send(0,modbus[1],1);
/* Проверяет if(cownt == 1) kanal_Send(1,modbus[0],1); последующий оператор выполняется только при истинном условии. */
if(cownt == 1) kanal_Send(1,modbus[0],1);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Вызывает kanal_Send с аргументами (2,modbus[2] & light,0) в текущей последовательности операций. */
kanal_Send(2,modbus[2] & light,0);
/* Проверяет if(cownt == 2) kanal_Send(3,modbus[3],0); последующий оператор выполняется только при истинном условии. */
if(cownt == 2) kanal_Send(3,modbus[3],0);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }
+5
View File
@@ -1,7 +1,12 @@
/* Подключение общей реализации УМП и паспорта прошивки из соседнего репозитория. Русские пояснения сохранены в UTF-8. */
/* Build the canonical sources directly; do not copy their implementations. */
/* Подключает "../firmware-info/src/firmware_info_static.c": настройки и интерфейс firmware_info_static. */
#include "../firmware-info/src/firmware_info_static.c"
/* Bind only this PM35 application's identity. The shared transport still owns
* range checks, read-only access, CRC and CAN fragment packing. */
/* Задаёт UMP_FIRMWARE_INFO_READ = firmware_info_static_read; UMP FIRMWARE INFO чтение. */
#define UMP_FIRMWARE_INFO_READ firmware_info_static_read
/* Подключает "src/ump_protocol.c": настройки и интерфейс ump_protocol. */
#include "src/ump_protocol.c"
/* Подключает "ports/tms320f28335/ump_tms28335.c": настройки и интерфейс ump_tms28335. */
#include "ports/tms320f28335/ump_tms28335.c"
+435 -134
View File
@@ -1,480 +1,781 @@
/* Драйвер SPI EEPROM, адресация, страницы и автомат завершения операций. Русские пояснения сохранены в UTF-8. */
/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
/* Подключает "spise2p.h": драйвер SPI EEPROM, адресация, страницы и автомат завершения операций. */
#include "spise2p.h"
/* Instance the SPI bus serial EEPROM driver */
static SPISE2P_DRV se2p=SPISE2P_DRV_DEFAULTS;
/* Instance the SPI bus serial EEPROM driver */
/* Объявляет se2p — данные se2p; SPISE2P_DRV_DEFAULTS — данные SPISE2P_DRV_DEFAULTS. Начальное значение задаётся справа от знака равенства. */
static SPISE2P_DRV se2p=SPISE2P_DRV_DEFAULTS;
/* Instance serial EEPROm data transfer structure */
/* Продолжает список аргументов, полей или выражение static SE2P_DATA writeData, readData;; порядок элементов сохраняется. */
static SE2P_DATA writeData, readData;
// Prototype statements for functions found within this file.
/* Объявляет интерфейс функции PRD_TICK; реализация вызывается через этот прототип. */
interrupt void PRD_TICK(void);
/* Продвигает SPI EEPROM по Timer2 и подтверждает прерывание таймера. */
interrupt void cpu_timer2_isr(void);
/* Объявляет ccc — данные ccc. Начальное значение задаётся справа от знака равенства. */
int ccc=0;
/********************************************************************/
/******* SPI bus Serial EEPROM driver Initialization routine ********/
/******* SPI bus Serial EEPROM driver Initialization routine ********/
/********************************************************************/
/* Пишет EEPROM с разделением по физическим страницам; область параметров не пересекает образ прошивки. */
void Seeprom_write( SE2P_SIZE adres,
/* Объявляет buf — данные buf. */
unsigned int buf[],
/* Объявляет size). */
SE2P_SIZE size)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет len — данные len. */
unsigned int len;
/* Условие компиляции EEPROM_M95M02: выбранный блок включается в текущий вариант прошивки. */
#if EEPROM_M95M02
/* Bound physical accesses before byte-to-word rounding. Legacy 32-KiB
* callers retain their compact driver; EXTEND is checked independently. */
/* Проверяет if (adres >= PROM_LEN или !size или size > (PROM_LEN-adres)*2) return; последующий оператор выполняется только при истинном условии. */
if (adres >= PROM_LEN || !size || size > (PROM_LEN-adres)*2) return;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Записывает CpuTimer2.InterruptCount значением 0; прерывание число. */
CpuTimer2.InterruptCount=0;
/* Записывает CpuTimer2Regs.TCR.all значением 0x4020; представление регистра целым словом без разбиения на битовые поля. */
CpuTimer2Regs.TCR.all = 0x4020; // Use write-only instruction to set TSS bit = 0
/* Повторяет или ожидает, пока выполняется while(!spiSe2pFree(&se2p));. */
while(!spiSe2pFree(&se2p));
/* Записывает size значением (size / WORD_LEN) + (size % WORD_LEN); размер. */
size = (size / WORD_LEN) + (size % WORD_LEN);
/* Повторяет или ожидает, пока выполняется while(size). */
while(size)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает len значением PAGE_LEN - (adres % PAGE_LEN); данные len. */
len = PAGE_LEN - (adres % PAGE_LEN);
/* Проверяет if(len > size) len=size; последующий оператор выполняется только при истинном условии. */
if(len > size) len=size;
/* Записывает writeData.dataPtr значением buf; данные Ptr. */
writeData.dataPtr = buf;
/* Записывает writeData.nrData значением len; nr данные. */
writeData.nrData = len;
/* Записывает writeData.se2pAddr значением adres * WORD_LEN; данные se2pAddr. */
writeData.se2pAddr = adres * WORD_LEN;
/* Вызывает spiSe2pWrite. Ставит задание записи в SPI-драйвер с учётом состояния занятости EEPROM. */
spiSe2pWrite(&se2p, &writeData);
/* Повторяет или ожидает, пока выполняется while(!spiSe2pFree(&se2p));. */
while(!spiSe2pFree(&se2p));
/* Увеличивает buf значением len; данные buf. */
buf += len;
/* Увеличивает adres значением len; данные adres. */
adres += len;
/* Уменьшает size значением len; размер. */
size -= len;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает CpuTimer2Regs.TCR.all значением 0x4010; представление регистра целым словом без разбиения на битовые поля. */
CpuTimer2Regs.TCR.all = 0x4010; // Use write-only instruction to set TSS bit = 1
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Читает EEPROM порциями; адрес задаётся словами C28x, размер переводится в число передаваемых слов. */
void Seeprom_read( SE2P_SIZE adres,
/* Объявляет buf — данные buf. */
unsigned int buf[],
/* Объявляет size). */
SE2P_SIZE size)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет len — данные len. */
unsigned int len;
/* Условие компиляции EEPROM_M95M02: выбранный блок включается в текущий вариант прошивки. */
#if EEPROM_M95M02
/* Bound physical accesses before byte-to-word rounding. Legacy 32-KiB
* callers retain their compact driver; EXTEND is checked independently. */
/* Проверяет if (adres >= PROM_LEN или !size или size > (PROM_LEN-adres)*2) return; последующий оператор выполняется только при истинном условии. */
if (adres >= PROM_LEN || !size || size > (PROM_LEN-adres)*2) return;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Записывает CpuTimer2.InterruptCount значением 0; прерывание число. */
CpuTimer2.InterruptCount=0;
/* Записывает CpuTimer2Regs.TCR.all значением 0x4020; представление регистра целым словом без разбиения на битовые поля. */
CpuTimer2Regs.TCR.all = 0x4020; // Use write-only instruction to set TSS bit = 0
/* Повторяет или ожидает, пока выполняется while(!spiSe2pFree(&se2p));. */
while(!spiSe2pFree(&se2p));
/* Записывает size значением (size / WORD_LEN) + (size % WORD_LEN); размер. */
size = (size / WORD_LEN) + (size % WORD_LEN);
/* Повторяет или ожидает, пока выполняется while(size). */
while(size)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает len значением PAGE_LEN - (adres % PAGE_LEN); данные len. */
len = PAGE_LEN - (adres % PAGE_LEN);
/* Проверяет if(len > size) len=size; последующий оператор выполняется только при истинном условии. */
if(len > size) len=size;
/* Записывает readData.dataPtr значением buf; данные Ptr. */
readData.dataPtr = buf;
/* Записывает readData.nrData значением len; nr данные. */
readData.nrData = len;
/* Записывает readData.se2pAddr значением adres * WORD_LEN; данные se2pAddr. */
readData.se2pAddr = adres * WORD_LEN;
/* Вызывает spiSe2pRead. Ставит задание чтения в SPI-драйвер с указателем буфера, длиной и физическим адресом. */
spiSe2pRead(&se2p, &readData);
/* Повторяет или ожидает, пока выполняется while(!spiSe2pFree(&se2p));. */
while(!spiSe2pFree(&se2p));
/* Увеличивает buf значением len; данные buf. */
buf += len;
/* Увеличивает adres значением len; данные adres. */
adres += len;
/* Уменьшает size значением len; размер. */
size -= len;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Записывает CpuTimer2Regs.TCR.all значением 0x4010; представление регистра целым словом без разбиения на битовые поля. */
CpuTimer2Regs.TCR.all = 0x4010; // Use write-only instruction to set TSS bit = 1
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию InitSeeprom; назначение модуля — драйвер SPI EEPROM, адресация, страницы и автомат завершения операций. */
void InitSeeprom()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
se2p.init(&se2p);
/* Продолжает список аргументов, полей или выражение se2p.init(&se2p);; порядок элементов сохраняется. */
se2p.init(&se2p);
/* Разрешение записи в защищённые регистры периферии. */
EALLOW; // This is needed to write to EALLOW protected registers
/* Записывает PieVectTable.TINT2 значением &cpu_timer2_isr; данные TINT2. */
PieVectTable.TINT2 = &cpu_timer2_isr;
/* Закрытие доступа к защищённым регистрам периферии. */
EDIS; // This is needed to disable write to EALLOW protected registers
/* Инициализирует модуль вызовом InitCpuTimers(); перед его дальнейшим использованием. */
InitCpuTimers(); // For this example, only initialize the Cpu Timers
/* Вызывает ConfigCpuTimer с аргументами (&CpuTimer2, (SYSCLKOUT/1000000), 100) в текущей последовательности операций. */
ConfigCpuTimer(&CpuTimer2, (SYSCLKOUT/1000000), 100);
/* Устанавливает биты IER значением M_INT14; регистр разрешения прерываний ядра C28x. */
IER |= M_INT14;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию SPISE2P_DRV_init; назначение модуля — драйвер SPI EEPROM, адресация, страницы и автомат завершения операций. */
void SPISE2P_DRV_init(SPISE2P_DRV *eeprom)
{
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Configure SPI-A pins using GPIO regs*/
// This specifies which of the possible GPIO pins will be SPI functional pins.
// Comment out other unwanted lines.
/* Разрешение записи в защищённые регистры периферии. */
EALLOW;
/* Записывает GpioCtrlRegs.GPAMUX2.bit.GPIO16 значением 1; аппаратная линия ввода/вывода GPIO16. */
GpioCtrlRegs.GPAMUX2.bit.GPIO16 = 1; // Configure GPIO16 as SPISIMOA
/* Записывает GpioCtrlRegs.GPAMUX2.bit.GPIO17 значением 1; аппаратная линия ввода/вывода GPIO17. */
GpioCtrlRegs.GPAMUX2.bit.GPIO17 = 1; // Configure GPIO17 as SPISOMIA
/* Записывает GpioCtrlRegs.GPAMUX2.bit.GPIO18 значением 1; аппаратная линия ввода/вывода GPIO18. */
GpioCtrlRegs.GPAMUX2.bit.GPIO18 = 1; // Configure GPIO18 as SPICLKA
/* Записывает GpioCtrlRegs.GPAMUX2.bit.GPIO19 значением 0; аппаратная линия ввода/вывода GPIO19. */
GpioCtrlRegs.GPAMUX2.bit.GPIO19 = 0; // General purpose I/O 19 (default) (I/O)
/* Записывает GpioCtrlRegs.GPADIR.bit.GPIO19 значением 1; аппаратная линия ввода/вывода GPIO19. */
GpioCtrlRegs.GPADIR.bit.GPIO19 = 1; // Configures the GPIO pin as an output
/* Записывает GpioDataRegs.GPADAT.bit.GPIO19 значением 0; аппаратная линия ввода/вывода GPIO19. */
GpioDataRegs.GPADAT.bit.GPIO19 = 0;
/* Закрытие доступа к защищённым регистрам периферии. */
EDIS;
/* Configure the SPI: 8-bit, Rising edge with delay */
/* Записывает SpiaRegs.SPICCR.all значением 0x0007; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all=0x0007;
/* Записывает SpiaRegs.SPICTL.all значением 0x001F; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICTL.all=0x001F;
/* Записывает SpiaRegs.SPISTS.all значением 0x00; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPISTS.all=0x00;
/* Записывает SpiaRegs.SPIBRR значением CLKMULT * 6 + 1; данные SPIBRR. */
SpiaRegs.SPIBRR = CLKMULT * 6 + 1;
/* Записывает SpiaRegs.SPIFFTX.all значением 0x8000; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPIFFTX.all=0x8000;
/* Записывает SpiaRegs.SPIFFRX.all значением 0x0000; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPIFFRX.all=0x0000;
/* Записывает SpiaRegs.SPIFFCT.all значением 0x00; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPIFFCT.all=0x00;
/* Записывает SpiaRegs.SPIPRI.all значением 0x0010; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPIPRI.all=0x0010;
/* Disable Chip Select of Serial EEPROM */
/* Записывает eeprom->csr значением 0; данные eeprom->csr. */
eeprom->csr=0;
/* Записывает eeprom->msgPtr значением 0; данные eeprom->msgPtr. */
eeprom->msgPtr=0;
/* Записывает SpiaRegs.SPICCR.bit.SPISWRESET значением 1; данные SPISWRESET. */
SpiaRegs.SPICCR.bit.SPISWRESET=1; // Enable SCI
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию SPISE2P_DRV_csset; назначение модуля — драйвер SPI EEPROM, адресация, страницы и автомат завершения операций. */
void SPISE2P_DRV_csset()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает GpioDataRegs.GPADAT.bit.GPIO19 значением 1; аппаратная линия ввода/вывода GPIO19. */
GpioDataRegs.GPADAT.bit.GPIO19 = 1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Начинает функцию SPISE2P_DRV_csclr; назначение модуля — драйвер SPI EEPROM, адресация, страницы и автомат завершения операций. */
void SPISE2P_DRV_csclr()
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает GpioDataRegs.GPADAT.bit.GPIO19 значением 0; аппаратная линия ввода/вывода GPIO19. */
GpioDataRegs.GPADAT.bit.GPIO19 = 0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет завершение текущего задания SPI EEPROM перед постановкой следующего. */
unsigned int spiSe2pFree(SPISE2P_DRV *se2p)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Проверяет if(se2p->csr&0x3) return(0); последующий оператор выполняется только при истинном условии. */
if(se2p->csr&0x3) return(0);
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else return(1);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Ставит задание записи в SPI-драйвер с учётом состояния занятости EEPROM. */
void spiSe2pWrite(SPISE2P_DRV *se2p, SE2P_DATA *msgPtr)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает se2p->msgPtr значением msgPtr; данные se2p->msgPtr. */
se2p->msgPtr=msgPtr;
/* Устанавливает биты se2p->csr значением 0x1; данные se2p->csr. */
se2p->csr|=0x1;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Ставит задание чтения в SPI-драйвер с указателем буфера, длиной и физическим адресом. */
void spiSe2pRead(SPISE2P_DRV *se2p, SE2P_DATA *msgPtr)
{
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Записывает se2p->msgPtr значением msgPtr; данные se2p->msgPtr. */
se2p->msgPtr=msgPtr;
/* Устанавливает биты se2p->csr значением 0x2; данные se2p->csr. */
se2p->csr|=0x2;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/********************************************************************/
/******* SPI bus Serial EEPROM driver Tick function *****************/
/******* SPI bus Serial EEPROM driver Tick function *****************/
/********************************************************************/
/* Продвигает SPI EEPROM по Timer2 и подтверждает прерывание таймера. */
interrupt void cpu_timer2_isr(void)
/* Продолжает список аргументов, полей или выражение { EALLOW;; порядок элементов сохраняется. */
{ EALLOW;
/* Изменяет счётчик в выражении CpuTimer2.InterruptCount++; на один для следующего шага. */
CpuTimer2.InterruptCount++;
se2p.tick(&se2p);
/* Продолжает список аргументов, полей или выражение se2p.tick(&se2p);; порядок элементов сохраняется. */
se2p.tick(&se2p);
// The CPU acknowledges the interrupt.
/* Закрытие доступа к защищённым регистрам периферии. */
EDIS;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Продвигает неблокирующий автомат SPI EEPROM: команда, адрес, данные и ожидание завершения записи. */
void SPISE2P_DRV_tick(SPISE2P_DRV *eeprom)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет step — данные step. Начальное значение задаётся справа от знака равенства. */
static unsigned int step=0;
/* Объявляет dataCount — данные число. Начальное значение задаётся справа от знака равенства. */
static unsigned int dataCount=0;
/* Объявляет dummy — данные dummy. volatile требует фактического чтения или записи при каждом доступе. Начальное значение задаётся справа от знака равенства. */
static volatile unsigned int dummy=0;
/* Вызывает switch с аргументами (step) в текущей последовательности операций. */
switch(step)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
case 0:
/* If write request is SET, then trigger the Write operation
/* Ветвь выбора для 0; выполняется при совпадении селектора switch. */
case 0:
/* If write request is SET, then trigger the Write operation
If read request is SET, then trigger the Read operation
If Read request is also not SET, then continue to poll */
/* Проверяет if(eeprom->csr&SPISE2P_WRRQ); последующий оператор выполняется только при истинном условии. */
if(eeprom->csr&SPISE2P_WRRQ)
/* Записывает step значением 1; данные step. */
{ step=1;
eeprom->csr|=SPISE2P_WRIP; /* Set Write in progress*/
eeprom->csr|=SPISE2P_WRIP; /* Set Write in progress*/ /* Устанавливает биты eeprom->csr значением SPISE2P_WRIP; данные eeprom->csr. */
/* Продолжает список аргументов, полей или выражение eeprom->csclr();; порядок элементов сохраняется. */
eeprom->csclr();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Проверяет if(eeprom->csr&SPISE2P_RDRQ); последующий оператор выполняется только при истинном условии. */
if(eeprom->csr&SPISE2P_RDRQ)
/* Записывает step значением 13; данные step. */
{ step=13;
eeprom->csr|=SPISE2P_RDIP; /* Set Read in progress */
eeprom->csr|=SPISE2P_RDIP; /* Set Read in progress */ /* Устанавливает биты eeprom->csr значением SPISE2P_RDIP; данные eeprom->csr. */
/* Продолжает список аргументов, полей или выражение eeprom->csclr();; порядок элементов сохраняется. */
eeprom->csclr();
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 1; выполняется при совпадении селектора switch. */
case 1:
/************************************************************
/************************************************************
*********** SPI bus EEPROM Write Starts from here ***********
*************************************************************
Prier to any attempt to write data to SPI serial EEPROM
Prier to any attempt to write data to SPI serial EEPROM
Write Enable Latch must be set by issuing the WREN command */
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR8BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all=SPISE2P_TFR8BIT;
/* Записывает SpiaRegs.SPITXBUF значением SPISE2P_WREN_CMD; данные SPITXBUF. */
SpiaRegs.SPITXBUF=SPISE2P_WREN_CMD;
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1;
/* Записывает SpiaRegs.SPISTS.bit.BUFFULL_FLAG значением 1; BUFFULL флаг. */
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1;
/* Записывает step значением 2; данные step. */
step=2;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
case 2:
/* Wait for VSPI State machine to send the WREN command and
/* Ветвь выбора для 2; выполняется при совпадении селектора switch. */
case 2:
/* Wait for VSPI State machine to send the WREN command and
serial EEPROM Chip Select must be brought to HIGH to set
the WREN latch */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */
{
dummy=SpiaRegs.SPIRXBUF; /* Reset SPI INT FLAG */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */ /* Проверяет if(SpiaRegs.SPISTS.bit.INT_FLAG); последующий оператор выполняется только при истинном условии. */
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
dummy=SpiaRegs.SPIRXBUF; /* Reset SPI INT FLAG */ /* Записывает dummy значением SpiaRegs.SPIRXBUF; данные dummy. */
/* Продолжает список аргументов, полей или выражение eeprom->csset();; порядок элементов сохраняется. */
eeprom->csset();
/* Записывает step значением 3; данные step. */
step=3;
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
case 3:
/* Assert CS of Serial EEPROM and send WRITE command */
/* Ветвь выбора для 3; выполняется при совпадении селектора switch. */
case 3:
/* Assert CS of Serial EEPROM and send WRITE command */
eeprom->csclr();
/* Продолжает список аргументов, полей или выражение eeprom->csclr();; порядок элементов сохраняется. */
eeprom->csclr();
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR8BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all=SPISE2P_TFR8BIT;
/* Записывает SpiaRegs.SPITXBUF значением SPISE2P_WRITE_CMD; данные SPITXBUF. */
SpiaRegs.SPITXBUF=SPISE2P_WRITE_CMD;
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1;
/* Записывает SpiaRegs.SPISTS.bit.BUFFULL_FLAG значением 1; BUFFULL флаг. */
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1;
/* Записывает step значением 4; данные step. */
step=4;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
case 4:
/* Wait for VSPI State machine to send the WRITE command */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */
{ dummy=SpiaRegs.SPIRXBUF; /* Reset SPI INT FLAG */
/* Ветвь выбора для 4; выполняется при совпадении селектора switch. */
case 4:
/* Wait for VSPI State machine to send the WRITE command */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */ /* Проверяет if(SpiaRegs.SPISTS.bit.INT_FLAG); последующий оператор выполняется только при истинном условии. */
{ dummy=SpiaRegs.SPIRXBUF; /* Reset SPI INT FLAG */ /* Записывает dummy значением SpiaRegs.SPIRXBUF; данные dummy. */
/* Записывает step значением 5; данные step. */
step=5;
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
case 5:
/* Ветвь выбора для 5; выполняется при совпадении селектора switch. */
case 5:
/* Send Address */
/* Условие компиляции EEPROM_M95M02: выбранный блок включается в текущий вариант прошивки. */
#if EEPROM_M95M02
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR8BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all=SPISE2P_TFR8BIT;
/* Записывает SpiaRegs.SPITXBUF значением (unsigned int)(eeprom->msgPtr->se2pAddr >> 16) << 8; данные SPITXBUF. */
SpiaRegs.SPITXBUF=(unsigned int)(eeprom->msgPtr->se2pAddr >> 16) << 8;
/* Записывает step значением 20; данные step. */
step=20;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 20; выполняется при совпадении селектора switch. */
case 20:
/* Проверяет if (!SpiaRegs.SPISTS.bit.INT_FLAG) break; последующий оператор выполняется только при истинном условии. */
if (!SpiaRegs.SPISTS.bit.INT_FLAG) break;
/* Записывает dummy значением SpiaRegs.SPIRXBUF; данные dummy. */
dummy=SpiaRegs.SPIRXBUF;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции (SPISE2P_ADDR_WIDTH==SIXTEEN_BIT): выбранный блок включается в текущий вариант прошивки. */
#if(SPISE2P_ADDR_WIDTH==SIXTEEN_BIT)
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR16BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all= SPISE2P_TFR16BIT;
SpiaRegs.SPITXBUF=eeprom->msgPtr->se2pAddr;
/* Записывает SpiaRegs.SPITXBUF значением eeprom->msgPtr->se2pAddr; данные SPITXBUF. */
SpiaRegs.SPITXBUF=eeprom->msgPtr->se2pAddr;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции (SPISE2P_ADDR_WIDTH==EIGHT_BIT): выбранный блок включается в текущий вариант прошивки. */
#if(SPISE2P_ADDR_WIDTH==EIGHT_BIT)
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR8BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all= SPISE2P_TFR8BIT;
/* Записывает SpiaRegs.SPITXBUF значением eeprom->msgPtr->se2pAddr<<8; данные SPITXBUF. */
SpiaRegs.SPITXBUF=eeprom->msgPtr->se2pAddr<<8;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1; /* Set TXBUF FULL FLAG */
step=6;
break;
case 6:
/* Wait for VSPI State machine to send the Address */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */
{ dummy=SpiaRegs.SPIRXBUF; /* Reset SPI INT FLAG */
step=7;
}
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1; /* Set TXBUF FULL FLAG */ /* Записывает SpiaRegs.SPISTS.bit.BUFFULL_FLAG значением 1; BUFFULL флаг. */
/* Записывает step значением 6; данные step. */
step=6;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
case 7:
/* Ветвь выбора для 6; выполняется при совпадении селектора switch. */
case 6:
/* Wait for VSPI State machine to send the Address */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */ /* Проверяет if(SpiaRegs.SPISTS.bit.INT_FLAG); последующий оператор выполняется только при истинном условии. */
{ dummy=SpiaRegs.SPIRXBUF; /* Reset SPI INT FLAG */ /* Записывает dummy значением SpiaRegs.SPIRXBUF; данные dummy. */
/* Записывает step значением 7; данные step. */
step=7;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 7; выполняется при совпадении селектора switch. */
case 7:
/* Send Data */
/* Условие компиляции (SPISE2P_DATA_WIDTH==SIXTEEN_BIT): выбранный блок включается в текущий вариант прошивки. */
#if(SPISE2P_DATA_WIDTH==SIXTEEN_BIT)
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR16BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all=SPISE2P_TFR16BIT;
/* Записывает SpiaRegs.SPITXBUF значением *(eeprom->msgPtr->dataPtr+dataCount); данные SPITXBUF. */
SpiaRegs.SPITXBUF=*(eeprom->msgPtr->dataPtr+dataCount);
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции (SPISE2P_DATA_WIDTH==EIGHT_BIT): выбранный блок включается в текущий вариант прошивки. */
#if(SPISE2P_DATA_WIDTH==EIGHT_BIT)
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR8BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all=SPISE2P_TFR8BIT;
SpiaRegs.SPITXBUF=*(eeprom->msgPtr->dataPtr+dataCount)<<8;
/* Записывает SpiaRegs.SPITXBUF значением *(eeprom->msgPtr->dataPtr+dataCount)<<8; данные SPITXBUF. */
SpiaRegs.SPITXBUF=*(eeprom->msgPtr->dataPtr+dataCount)<<8;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Изменяет счётчик в выражении dataCount++; на один для следующего шага. */
dataCount++;
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1; /* Set TXBUF FULL FLAG */
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1; /* Set TXBUF FULL FLAG */ /* Записывает SpiaRegs.SPISTS.bit.BUFFULL_FLAG значением 1; BUFFULL флаг. */
/* Записывает step значением 8; данные step. */
step=8;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
case 8:
/* Ветвь выбора для 8; выполняется при совпадении селектора switch. */
case 8:
/* Wait for VSPI State machine to send the Data.
If all the data are sent, then set the CS pin to HIGH
If all the data are sent, then set the CS pin to HIGH
to program or write the data in EEPROM array */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */
{ dummy=SpiaRegs.SPIRXBUF; /* Reset SPI INT FLAG */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */ /* Проверяет if(SpiaRegs.SPISTS.bit.INT_FLAG); последующий оператор выполняется только при истинном условии. */
{ dummy=SpiaRegs.SPIRXBUF; /* Reset SPI INT FLAG */ /* Записывает dummy значением SpiaRegs.SPIRXBUF; данные dummy. */
/* Проверяет if (dataCount==eeprom->msgPtr->nrData); последующий оператор выполняется только при истинном условии. */
if (dataCount==eeprom->msgPtr->nrData)
/* Продолжает список аргументов, полей или выражение { eeprom->csset();; порядок элементов сохраняется. */
{ eeprom->csset();
/* Записывает step значением 9;}; данные step. */
step=9;}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
step=7; /* Write next data */
step=7; /* Write next data */ /* Записывает step значением 7; данные step. */
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
case 9:
/* Read the EEPROM status register to check whether the
/* Ветвь выбора для 9; выполняется при совпадении селектора switch. */
case 9:
/* Read the EEPROM status register to check whether the
data sent are indeed programmed to the EEPROM array.
Hence, send RDSR command to EEPROM to read status reg. */
/* Продолжает список аргументов, полей или выражение eeprom->csclr();; порядок элементов сохраняется. */
eeprom->csclr();
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR8BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all=SPISE2P_TFR8BIT;
/* Записывает SpiaRegs.SPITXBUF значением SPISE2P_RDSR_CMD; данные SPITXBUF. */
SpiaRegs.SPITXBUF=SPISE2P_RDSR_CMD;
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1; /* Set TXBUF FULL FLAG */
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1; /* Set TXBUF FULL FLAG */ /* Записывает SpiaRegs.SPISTS.bit.BUFFULL_FLAG значением 1; BUFFULL флаг. */
/* Записывает step значением 10; данные step. */
step=10;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
case 10:
/* Ветвь выбора для 10; выполняется при совпадении селектора switch. */
case 10:
/* Wait for VSPI State machine to send RDSR command */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */
{ dummy=SpiaRegs.SPIRXBUF; /* Reset SPI INT FLAG */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */ /* Проверяет if(SpiaRegs.SPISTS.bit.INT_FLAG); последующий оператор выполняется только при истинном условии. */
{ dummy=SpiaRegs.SPIRXBUF; /* Reset SPI INT FLAG */ /* Записывает dummy значением SpiaRegs.SPIRXBUF; данные dummy. */
/* Записывает step значением 11; данные step. */
step=11;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
break;
case 11:
/* Send dummy Data to read Status reg. */
SpiaRegs.SPITXBUF=SPISE2P_DUMMY_DATA;
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1; /* Set TXBUF FULL FLAG */
step=12;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
case 12:
/* Ветвь выбора для 11; выполняется при совпадении селектора switch. */
case 11:
/* Send dummy Data to read Status reg. */
/* Записывает SpiaRegs.SPITXBUF значением SPISE2P_DUMMY_DATA; данные SPITXBUF. */
SpiaRegs.SPITXBUF=SPISE2P_DUMMY_DATA;
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1; /* Set TXBUF FULL FLAG */ /* Записывает SpiaRegs.SPISTS.bit.BUFFULL_FLAG значением 1; BUFFULL флаг. */
/* Записывает step значением 12; данные step. */
step=12;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 12; выполняется при совпадении селектора switch. */
case 12:
/* Wait for VSPI State machine to clock out status reg.
Check, whether the data are written to the EEPROM array,
If written, then reset the WRIP(write in progress) and
If written, then reset the WRIP(write in progress) and
WRRQ(Write request bit) and go back to STATE0 */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */
{ eeprom->csset();
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */ /* Проверяет if(SpiaRegs.SPISTS.bit.INT_FLAG); последующий оператор выполняется только при истинном условии. */
/* Продолжает список аргументов, полей или выражение { eeprom->csset();; порядок элементов сохраняется. */
{ eeprom->csset();
/* Проверяет if (SpiaRegs.SPIRXBUF & SPISE2P_BUSY_MASK ); последующий оператор выполняется только при истинном условии. */
if (SpiaRegs.SPIRXBUF & SPISE2P_BUSY_MASK )
/* Записывает step значением 9; данные step. */
step=9;
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Оставляет биты маски eeprom->csr значением (~SPISE2P_WRIP); данные eeprom->csr. */
{ eeprom->csr&=(~SPISE2P_WRIP);
/* Оставляет биты маски eeprom->csr значением (~SPISE2P_WRRQ); данные eeprom->csr. */
eeprom->csr&=(~SPISE2P_WRRQ);
/* Записывает step значением 0; данные step. */
step=0;
/* Записывает dataCount значением 0; данные число. */
dataCount=0;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
case 13:
/************************************************************
/* Ветвь выбора для 13; выполняется при совпадении селектора switch. */
case 13:
/************************************************************
*********** SPI bus EEPROM Read Starts from here ***********
*************************************************************
Send READ Command to SPI bus serail EEPROM */
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR8BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all=SPISE2P_TFR8BIT;
/* Записывает SpiaRegs.SPITXBUF значением SPISE2P_READ_CMD; данные SPITXBUF. */
SpiaRegs.SPITXBUF=SPISE2P_READ_CMD;
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1; /* Set TXBUF FULL FLAG */
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1; /* Set TXBUF FULL FLAG */ /* Записывает SpiaRegs.SPISTS.bit.BUFFULL_FLAG значением 1; BUFFULL флаг. */
/* Записывает step значением 14; данные step. */
step=14;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
case 14:
/* Wait for VSPI State machine to send READ command */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */
{ dummy=SpiaRegs.SPIRXBUF; /* Reset SPI INT FLAG */
/* Ветвь выбора для 14; выполняется при совпадении селектора switch. */
case 14:
/* Wait for VSPI State machine to send READ command */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */ /* Проверяет if(SpiaRegs.SPISTS.bit.INT_FLAG); последующий оператор выполняется только при истинном условии. */
{ dummy=SpiaRegs.SPIRXBUF; /* Reset SPI INT FLAG */ /* Записывает dummy значением SpiaRegs.SPIRXBUF; данные dummy. */
/* Записывает step значением 15; данные step. */
step=15;
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
case 15:
/* Ветвь выбора для 15; выполняется при совпадении селектора switch. */
case 15:
/* Send Address */
/* Условие компиляции EEPROM_M95M02: выбранный блок включается в текущий вариант прошивки. */
#if EEPROM_M95M02
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR8BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all=SPISE2P_TFR8BIT;
/* Записывает SpiaRegs.SPITXBUF значением (unsigned int)(eeprom->msgPtr->se2pAddr >> 16) << 8; данные SPITXBUF. */
SpiaRegs.SPITXBUF=(unsigned int)(eeprom->msgPtr->se2pAddr >> 16) << 8;
/* Записывает step значением 21; данные step. */
step=21;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 21; выполняется при совпадении селектора switch. */
case 21:
/* Проверяет if (!SpiaRegs.SPISTS.bit.INT_FLAG) break; последующий оператор выполняется только при истинном условии. */
if (!SpiaRegs.SPISTS.bit.INT_FLAG) break;
/* Записывает dummy значением SpiaRegs.SPIRXBUF; данные dummy. */
dummy=SpiaRegs.SPIRXBUF;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции (SPISE2P_ADDR_WIDTH==SIXTEEN_BIT): выбранный блок включается в текущий вариант прошивки. */
#if(SPISE2P_ADDR_WIDTH==SIXTEEN_BIT)
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR16BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all= SPISE2P_TFR16BIT;
SpiaRegs.SPITXBUF=eeprom->msgPtr->se2pAddr;
/* Записывает SpiaRegs.SPITXBUF значением eeprom->msgPtr->se2pAddr; данные SPITXBUF. */
SpiaRegs.SPITXBUF=eeprom->msgPtr->se2pAddr;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Условие компиляции (SPISE2P_ADDR_WIDTH==EIGHT_BIT): выбранный блок включается в текущий вариант прошивки. */
#if(SPISE2P_ADDR_WIDTH==EIGHT_BIT)
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR8BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all= SPISE2P_TFR8BIT;
/* Записывает SpiaRegs.SPITXBUF значением eeprom->msgPtr->se2pAddr<<8; данные SPITXBUF. */
SpiaRegs.SPITXBUF=eeprom->msgPtr->se2pAddr<<8;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1; /* Set TXBUF FULL FLAG */
step=16;
break;
case 16:
/* Wait for VSPI State machine to send Address */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */
{ dummy=SpiaRegs.SPIRXBUF; /* Reset SPI INT FLAG */
step=17;
}
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1; /* Set TXBUF FULL FLAG */ /* Записывает SpiaRegs.SPISTS.bit.BUFFULL_FLAG значением 1; BUFFULL флаг. */
/* Записывает step значением 16; данные step. */
step=16;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
case 17:
/* Ветвь выбора для 16; выполняется при совпадении селектора switch. */
case 16:
/* Wait for VSPI State machine to send Address */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */ /* Проверяет if(SpiaRegs.SPISTS.bit.INT_FLAG); последующий оператор выполняется только при истинном условии. */
{ dummy=SpiaRegs.SPIRXBUF; /* Reset SPI INT FLAG */ /* Записывает dummy значением SpiaRegs.SPIRXBUF; данные dummy. */
/* Записывает step значением 17; данные step. */
step=17;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 17; выполняется при совпадении селектора switch. */
case 17:
/* Send Dummy value to clock out data from serial EEPROM */
/* Условие компиляции (SPISE2P_DATA_WIDTH==SIXTEEN_BIT): выбранный блок включается в текущий вариант прошивки. */
#if(SPISE2P_DATA_WIDTH==SIXTEEN_BIT)
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR16BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all= SPISE2P_TFR16BIT;
/* Записывает SpiaRegs.SPITXBUF значением SPISE2P_DUMMY_DATA; данные SPITXBUF. */
SpiaRegs.SPITXBUF=SPISE2P_DUMMY_DATA;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
#if(SPISE2P_DATA_WIDTH==EIGHT_BIT)
/* Условие компиляции (SPISE2P_DATA_WIDTH==EIGHT_BIT): выбранный блок включается в текущий вариант прошивки. */
#if(SPISE2P_DATA_WIDTH==EIGHT_BIT)
/* Записывает SpiaRegs.SPICCR.all значением SPISE2P_TFR8BIT; представление регистра целым словом без разбиения на битовые поля. */
SpiaRegs.SPICCR.all= SPISE2P_TFR8BIT;
/* Записывает SpiaRegs.SPITXBUF значением SPISE2P_DUMMY_DATA<<8; данные SPITXBUF. */
SpiaRegs.SPITXBUF=SPISE2P_DUMMY_DATA<<8;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1; /* Set TXBUF FULL FLAG */
SpiaRegs.SPISTS.bit.BUFFULL_FLAG=1; /* Set TXBUF FULL FLAG */ /* Записывает SpiaRegs.SPISTS.bit.BUFFULL_FLAG значением 1; BUFFULL флаг. */
/* Записывает step значением 18; данные step. */
step=18;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
case 18:
/* Ветвь выбора для 18; выполняется при совпадении селектора switch. */
case 18:
/* Wait for VSPI State machine to clk out data from EEPROM */
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */
{
if(SpiaRegs.SPISTS.bit.INT_FLAG) /* Check SPI INT FLAG */ /* Проверяет if(SpiaRegs.SPISTS.bit.INT_FLAG); последующий оператор выполняется только при истинном условии. */
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Условие компиляции (SPISE2P_DATA_WIDTH==SIXTEEN_BIT): выбранный блок включается в текущий вариант прошивки. */
#if(SPISE2P_DATA_WIDTH==SIXTEEN_BIT)
*(eeprom->msgPtr->dataPtr+dataCount)=SpiaRegs.SPIRXBUF;
/* Продолжает список аргументов, полей или выражение *(eeprom->msgPtr->dataPtr+dataCount)=SpiaRegs.SPIRXBUF;; порядок элементов сохраняется. */
*(eeprom->msgPtr->dataPtr+dataCount)=SpiaRegs.SPIRXBUF;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
#if(SPISE2P_DATA_WIDTH==EIGHT_BIT)
/* Условие компиляции (SPISE2P_DATA_WIDTH==EIGHT_BIT): выбранный блок включается в текущий вариант прошивки. */
#if(SPISE2P_DATA_WIDTH==EIGHT_BIT)
/* Продолжает список аргументов, полей или выражение *(eeprom->msgPtr->dataPtr+dataCount)=SpiaRegs.SPIRXBUF&0xFF;; порядок элементов сохраняется. */
*(eeprom->msgPtr->dataPtr+dataCount)=SpiaRegs.SPIRXBUF&0xFF;
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
#endif
/* Изменяет счётчик в выражении dataCount++; на один для следующего шага. */
dataCount++;
/* Записывает step значением 19; данные step. */
step=19;
}
break;
case 19:
/* If all the data are read, terminate the read operation by
rising the CS. Then reset the RDIP (Read in progress) bit
and reset the RDRQ(Read request) bit and go back to STATE0 */
if (dataCount==eeprom->msgPtr->nrData)
{ eeprom->csset();
step=0;
dataCount=0;
eeprom->csr&=(~SPISE2P_RDIP);
eeprom->csr&=(~SPISE2P_RDRQ);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
else
step=17;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Ветвь выбора для 19; выполняется при совпадении селектора switch. */
case 19:
/* If all the data are read, terminate the read operation by
rising the CS. Then reset the RDIP (Read in progress) bit
and reset the RDRQ(Read request) bit and go back to STATE0 */
/* Проверяет if (dataCount==eeprom->msgPtr->nrData); последующий оператор выполняется только при истинном условии. */
if (dataCount==eeprom->msgPtr->nrData)
/* Продолжает список аргументов, полей или выражение { eeprom->csset();; порядок элементов сохраняется. */
{ eeprom->csset();
/* Записывает step значением 0; данные step. */
step=0;
/* Записывает dataCount значением 0; данные число. */
dataCount=0;
/* Оставляет биты маски eeprom->csr значением (~SPISE2P_RDIP); данные eeprom->csr. */
eeprom->csr&=(~SPISE2P_RDIP);
/* Оставляет биты маски eeprom->csr значением (~SPISE2P_RDRQ); данные eeprom->csr. */
eeprom->csr&=(~SPISE2P_RDRQ);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
else
/* Записывает step значением 17; данные step. */
step=17;
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
break;
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
+32
View File
@@ -1,3 +1,5 @@
/* Настройка внешней памяти и служебные задержки. Русские пояснения сохранены в UTF-8. */
/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */
#include "DSP2833x_Device.h" // DSP281x Headerfile Include File
// Configure the timing paramaters for Zone 7.
@@ -5,64 +7,94 @@
// This function should not be executed from XINTF
// Adjust the timing based on the data manual and
// external device requirements.
/* Настраивает временные параметры внешней шины XINTF Zone7 для RAM регистратора. */
void init_zone7(void)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
// Make sure the XINTF clock is enabled
/* Записывает SysCtrlRegs.PCLKCR3.bit.XINTFENCLK значением 1; данные XINTFENCLK. */
SysCtrlRegs.PCLKCR3.bit.XINTFENCLK = 1;
// Configure the GPIO for XINTF with a 16-bit data bus
// This function is in DSP2833x_Xintf.c
/* Инициализирует модуль вызовом InitXintf16Gpio(); перед его дальнейшим использованием. */
InitXintf16Gpio();
/* Разрешение записи в защищённые регистры периферии. */
EALLOW;
// All Zones---------------------------------
// Timing for all zones based on XTIMCLK = SYSCLKOUT
/* Записывает XintfRegs.XINTCNF2.bit.XTIMCLK значением 0; данные XTIMCLK. */
XintfRegs.XINTCNF2.bit.XTIMCLK = 0;
// Buffer up to 3 writes
/* Записывает XintfRegs.XINTCNF2.bit.WRBUFF значением 3; данные WRBUFF. */
XintfRegs.XINTCNF2.bit.WRBUFF = 3;
// XCLKOUT is enabled
/* Записывает XintfRegs.XINTCNF2.bit.CLKOFF значением 0; данные CLKOFF. */
XintfRegs.XINTCNF2.bit.CLKOFF = 0;
// XCLKOUT = XTIMCLK
/* Записывает XintfRegs.XINTCNF2.bit.CLKMODE значением 0; данные CLKMODE. */
XintfRegs.XINTCNF2.bit.CLKMODE = 0;
// Zone 7------------------------------------
// When using ready, ACTIVE must be 1 or greater
// Lead must always be 1 or greater
// Zone write timing
/* Записывает XintfRegs.XTIMING7.bit.XWRLEAD значением 1; данные XWRLEAD. */
XintfRegs.XTIMING7.bit.XWRLEAD = 1;
/* Записывает XintfRegs.XTIMING7.bit.XWRACTIVE значением 2; данные XWRACTIVE. */
XintfRegs.XTIMING7.bit.XWRACTIVE = 2;
/* Записывает XintfRegs.XTIMING7.bit.XWRTRAIL значением 1; данные XWRTRAIL. */
XintfRegs.XTIMING7.bit.XWRTRAIL = 1;
// Zone read timing
/* Записывает XintfRegs.XTIMING7.bit.XRDLEAD значением 1; данные XRDLEAD. */
XintfRegs.XTIMING7.bit.XRDLEAD = 1;
/* Записывает XintfRegs.XTIMING7.bit.XRDACTIVE значением 3; данные XRDACTIVE. */
XintfRegs.XTIMING7.bit.XRDACTIVE = 3;
/* Записывает XintfRegs.XTIMING7.bit.XRDTRAIL значением 0; данные XRDTRAIL. */
XintfRegs.XTIMING7.bit.XRDTRAIL = 0;
// don't double all Zone read/write lead/active/trail timing
/* Записывает XintfRegs.XTIMING7.bit.X2TIMING значением 0; данные X2TIMING. */
XintfRegs.XTIMING7.bit.X2TIMING = 0;
// Zone will not sample XREADY signal
/* Записывает XintfRegs.XTIMING7.bit.USEREADY значением 0; данные USEREADY. */
XintfRegs.XTIMING7.bit.USEREADY = 0;
/* Записывает XintfRegs.XTIMING7.bit.READYMODE значением 0; данные READYMODE. */
XintfRegs.XTIMING7.bit.READYMODE = 0;
// 1,1 = x16 data bus
// 0,1 = x32 data bus
// other values are reserved
/* Записывает XintfRegs.XTIMING7.bit.XSIZE значением 3; данные XSIZE. */
XintfRegs.XTIMING7.bit.XSIZE = 3;
/* Закрытие доступа к защищённым регистрам периферии. */
EDIS;
//Force a pipeline flush to ensure that the write to
//the last register configured occurs before returning.
/* Вызывает asm с аргументами (" RPT #7 || NOP") в текущей последовательности операций. */
asm(" RPT #7 || NOP");
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
}
/* Формирует задержку в микросекундах через калиброванную функцию DSP28x_usDelay. */
void pause_us(unsigned long t)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Объявляет i — данные i. */
unsigned long i;
/* Записывает t значением t >> 1; данные t. */
t = t >> 1;
/* Цикл for (i = 0; i < t; i++); задаёт начальное значение, условие продолжения и шаг перебора. */
for (i = 0; i < t; i++)
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
{
/* Вызывает DSP28x_usDelay с аргументами (CLKMULT*8L) в текущей последовательности операций. */
DSP28x_usDelay(CLKMULT*8L);
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
} }