Сохранить русские комментарии и настройки проекта в UTF-8
Добавить пояснения к исходникам, заголовкам TI, настройкам CCS и существующим проверкам. Зафиксировать правила кодировки, обзор модулей и аудит комментариев.
This commit is contained in:
+278
-33
@@ -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
File diff suppressed because one or more lines are too long
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
@@ -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 */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
|
||||
|
||||
@@ -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 */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
|
||||
@@ -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 //---------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
@@ -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 */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
|
||||
@@ -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 );
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -1 +1,3 @@
|
||||
/* Последовательный вывод данных канала индикации. Русские пояснения сохранены в UTF-8. */
|
||||
/* Объявляет интерфейс функции kanal_Send; реализация вызывается через этот прототип. */
|
||||
void kanal_Send(int adr, long dat, int dot);
|
||||
|
||||
@@ -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 */ /* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
/* Обмен и индикация пульта. Русские пояснения сохранены в UTF-8. */
|
||||
//void what_is(void);
|
||||
|
||||
/* Обслуживает периодический обмен и индикацию пульта вместо измерительной платы. */
|
||||
interrupt void cpu_timer1_isr_PULT(void);
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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);
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
} }
|
||||
|
||||
@@ -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
@@ -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;
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
} }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user