diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..769f60d --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Windows cmd.exe должен получать BAT с CRLF: русские комментарии в UTF-8 при одних LF могут нарушать разбор строк команд. +*.bat text eol=crlf diff --git a/Bin/UKSSTMS320F28335.hex b/Bin/UKSSTMS320F28335.hex index 8fe74ee..8718dc2 100644 Binary files a/Bin/UKSSTMS320F28335.hex and b/Bin/UKSSTMS320F28335.hex differ diff --git a/Bin/UKSSTMS320F28335.map b/Bin/UKSSTMS320F28335.map index 623dbad..e36d19b 100644 --- a/Bin/UKSSTMS320F28335.map +++ b/Bin/UKSSTMS320F28335.map @@ -2,7 +2,7 @@ TMS320C2000 Hex Converter v22.6.0 ******************************************************************************** -INPUT FILE NAME: +INPUT FILE NAME: OUTPUT FORMAT: Intel PHYSICAL MEMORY PARAMETERS @@ -12,18 +12,18 @@ PHYSICAL MEMORY PARAMETERS BOOT LOADER PARAMETERS Table Type: SERIAL PORT (SCI 8 bit Mode) - Entry Point: 0x0000b581 + Entry Point: 0x0000b7bc OUTPUT TRANSLATION MAP -------------------------------------------------------------------------------- 00000000..ffffffff Page=0 Memory Width=8 ROM Width=8 -------------------------------------------------------------------------------- - OUTPUT FILES: K:\git_project\Balsam_167_periph\UKSSTMS320F28335\Debug\.identity-release-cem4nfa7\.firmware-hb6330et\UKSSTMS320F28335.hex [b0..b7] + OUTPUT FILES: K:\git_project\28335_periph\UKSSTMS320F28335\Debug\.identity-release-018w5cqu\.firmware-7iwzourf\UKSSTMS320F28335.hex [b0..b7] - CONTENTS: 00000000..00007627 BOOT TABLE - .cinit : dest=0000b72f size=0x267 width=00000002 - .text : dest=00008000 size=0x372f width=00000002 + CONTENTS: 00000000..00007aa3 BOOT TABLE + .cinit : dest=0000b969 size=0x26b width=00000002 + .text : dest=00008000 size=0x3969 width=00000002 .econst : dest=0000c000 size=0x11e width=00000002 .switch : dest=0000c11e size=0x48 width=00000002 diff --git a/Bin/UKSSTMS320F28335.out b/Bin/UKSSTMS320F28335.out index 8a41f06..34972cd 100644 Binary files a/Bin/UKSSTMS320F28335.out and b/Bin/UKSSTMS320F28335.out differ diff --git a/Source/Internal/ADC.c b/Source/Internal/ADC.c index 753f799..a46ab7e 100644 --- a/Source/Internal/ADC.c +++ b/Source/Internal/ADC.c @@ -1,8 +1,8 @@ -/* Íàñòðîéêà ÀÖÏ è îáðàáîòêà àíàëîãîâûõ âûáîðîê. adc_isr îáíîâëÿåò - * adc_table_lem[0..3] èç ADCRESULT2..5 >> 4 è âûçûâàåò ðàñ÷¸ò èçìåðåíèé. - * READY â 166 ÿâëÿåòñÿ ñ÷¸ò÷èêîì äî íóëÿ, íå ôëàãîì ãîòîâíîñòè. - * WAKE çàäà¸ò îòäåëüíîå âðåìÿ óñòàíîâëåíèÿ èçìåðèòåëüíûõ öåïåé. - * Íå äîáàâëÿòü îæèäàíèÿ EEPROM/UART â îáðàáîò÷èê âûáîðîê. +/* Настройка АЦП и обработка аналоговых выборок. adc_isr обновляет + * adc_table_lem[0..3] из ADCRESULT2..5 >> 4 и вызывает расчёт измерений. + * READY в 166 является счётчиком до нуля, не флагом готовности. + * WAKE задаёт отдельное время установления измерительных цепей. + * Не добавлять ожидания EEPROM/UART в обработчик выборок. */ #include "DSP2833x_Device.h" // DSP281x Headerfile Include File #include "DSP2833x_Examples.h" // DSP281x Examples Include File @@ -21,7 +21,7 @@ #include "peripher.h" Uint16 adc_table_lem[4]; -Uint16 adc_table_tpl[28]; // Ïîòîìó ÷òî +4 êàëèáð +Uint16 adc_table_tpl[28]; // Потому что +4 калибр unsigned long COUNT_WAIT_ONE_CANAL; @@ -63,12 +63,12 @@ void setup_adc() { 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; // температура (которой нет) + 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 } if(Desk==dsk_BKST) @@ -82,7 +82,7 @@ void setup_adc() if(Desk==dsk_COMM) { AdcRegs.ADCMAXCONV.bit.MAX_CONV1 = 0x0006; // Setup 2 conv's on SEQ1 - AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x5; // ñíà÷àëà òîæå áóäóò òåìïåðàòóðû + AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x5; // сначала тоже будут температуры AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x4; // Setup ADCINA2 as 2nd SEQ1 conv. AdcRegs.ADCCHSELSEQ1.bit.CONV02 = 0x7; // Setup ADCINA2 as 2nd SEQ1 conv. AdcRegs.ADCCHSELSEQ1.bit.CONV03 = 0x2; // Setup ADCINA2 as 2nd SEQ1 conv. @@ -100,23 +100,23 @@ void setup_adc() if(Desk==dsk_SHKF) { 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; // 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.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; // 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.ADCCHSELSEQ4.bit.CONV13 = 0xF;//0xF; // ÄҰ 1 - AdcRegs.ADCCHSELSEQ4.bit.CONV14 = 0xD;//0xD; // ÄҰ 2 + AdcRegs.ADCCHSELSEQ4.bit.CONV13 = 0xF;//0xF; // ДТ° 1 + AdcRegs.ADCCHSELSEQ4.bit.CONV14 = 0xD;//0xD; // ДТ° 2 AdcRegs.ADCCHSELSEQ4.bit.CONV15 = 0x9;//0x9; } @@ -206,7 +206,7 @@ interrupt void adc_isr(void) { if (++cownt_cans>=tpl_cans) cownt_cans=0; -// Èìåííî çäåñü íåò äûð +// Именно здесь нет дыр // if(sens_type[cownt_cans]) { i++; @@ -244,7 +244,7 @@ interrupt void adc_isr(void) if(TermoAD) { 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; // потому что 300 и 400 наоборот } select_tpl_canal(code_tpl_canal); diff --git a/Source/Internal/DAC.c b/Source/Internal/DAC.c index 5a67284..f333ced 100644 --- a/Source/Internal/DAC.c +++ b/Source/Internal/DAC.c @@ -1,9 +1,9 @@ -/* ÖÀÏ íàãðóçêè è àïïàðàòíàÿ îá¸ðòêà èìïóëüñîâ ÑÈÔÓ. Load_runner - * âûçûâàåòñÿ òàéìåðîì 1 êÃö, ðàñ÷¸ò ÖÀÏ äåëèòñÿ äî DAC_FREQ. - * Ôîðìóëà 166 çàäà¸ò ôèêñèðîâàííûé ðàçãîí 6..16 ìÀ. DAC_min/max - * ïåðåâîäÿò ïîëîæåíèå â êîä, cCalibrDac âûáèðàåò ðó÷íîé êîä. - * WAKEpowse îòíîñèòñÿ ê ÖÀÏ, íå ÿâëÿåòñÿ ðàçðåøåíèåì äèñêðåòà çàïóñêà. - * Àâòîìàò ÑÈÔÓ ïîäêëþ÷¸í â êîíöå ôàéëà ÷åðåç ump_control_impl.h. +/* ЦАП нагрузки и аппаратная обёртка импульсов СИФУ. Load_runner + * вызывается таймером 1 кГц, расчёт ЦАП делится до DAC_FREQ. + * Формула 166 задаёт фиксированный разгон 6..16 мА. DAC_min/max + * переводят положение в код, cCalibrDac выбирает ручной код. + * WAKEpowse относится к ЦАП, не является разрешением дискрета запуска. + * Автомат СИФУ подключён в конце файла через ump_control_impl.h. */ #include "DSP2833x_Device.h" // DSP281x Headerfile Include File #include "DSP2833x_SWPrioritizedIsrLevels.h" @@ -29,8 +29,8 @@ unsigned long WAKEpowse; volatile unsigned long IMPowse; unsigned int period_dac, time_dac; -/* Èíèöèàëèçàöèÿ, íå îáðàáîòêà êàæäîãî START. 601 îòñ÷¸ò ïðè 200 Ãö - * äàþò îêîëî 3 ñåêóíä äî ðàáî÷åãî ðàñ÷¸òà ÖÀÏ ïîñëå âêëþ÷åíèÿ. +/* Инициализация, не обработка каждого START. 601 отсчёт при 200 Гц + * дают около 3 секунд до рабочего расчёта ЦАП после включения. */ void Setup_DAC_time(void) { @@ -76,9 +76,9 @@ void Init_DAC(void) dSEND(0x9002|0x0000); toggle_RES_OUT_1(); } -/* vrot/maxx — äîëÿ äèàïàçîíà ìåæäó êîäàìè 4 è 20 ìÀ. Ìàñêà 0xFFF - * ñîõðàíÿåò 12 áèò, íî íå ÿâëÿåòñÿ íàñûùåíèåì. modbus[0x1C] ñîäåðæèò - * ðàñ÷¸òíîå çàäàíèå, íå èçìåðåííûé òîê íà âûõîäíûõ êëåììàõ. +/* vrot/maxx — доля диапазона между кодами 4 и 20 мА. Маска 0xFFF + * сохраняет 12 бит, но не является насыщением. modbus[0x1C] содержит + * расчётное задание, не измеренный ток на выходных клеммах. */ void Anal_output(long vrot, long maxx) { @@ -87,7 +87,7 @@ void Anal_output(long vrot, long maxx) out = DAC_min() + vrot * DAC_max() / maxx - vrot * DAC_min() / maxx ; - x=0;// !x; òùåòíî áûòèå + x=0;// !x; тщетно бытие if(cCalibrDac) out=DAC_cal(); @@ -116,9 +116,9 @@ Log_to_mem(modbus[0x1D]); } -/* Ïîñëå ïîëîâèíû time_dac ñ÷¸ò÷èê ðàñò¸ò äâàæäû çà âûçîâ. Ïîýòîìó - * LOAD_TIME=30 äà¸ò ïðèìåðíî 22.5 ñ äî êîíöà ðàçãîíà ïðè 200 Ãö. - * Ñóùåñòâóþùèé ïðîôèëü 166 èñïðàâëåíèå èìïóëüñà ÑÈÔÓ íå ìåíÿåò. +/* После половины time_dac счётчик растёт дважды за вызов. Поэтому + * LOAD_TIME=30 даёт примерно 22.5 с до конца разгона при 200 Гц. + * Существующий профиль 166 исправление импульса СИФУ не меняет. */ void Load_runner() { @@ -126,7 +126,7 @@ void Load_runner() float sinus=0; int kod; - /* IMPowse îáíîâëÿåòñÿ UMP_pulse_tick(), à íå àëãîðèòìîì ÖÀÏ. */ + /* IMPowse обновляется UMP_pulse_tick(), а не алгоритмом ЦАП. */ if(++count_dac >= period_dac) { count_dac=0; diff --git a/Source/Internal/Include/ADC.h b/Source/Internal/Include/ADC.h index 9d9ba53..5f76b40 100644 --- a/Source/Internal/Include/ADC.h +++ b/Source/Internal/Include/ADC.h @@ -1,5 +1,5 @@ -/* Òàáëèöû âûáîðîê îáíîâëÿåò ADC ISR. Ñîãëàñîâàííûé ñíèìîê íåñêîëüêèõ - * êàíàëîâ òðåáóåò çàùèòû êîïèðîâàíèÿ, îäíîãî óêàçàòåëÿ íåäîñòàòî÷íî. +/* Таблицы выборок обновляет ADC ISR. Согласованный снимок нескольких + * каналов требует защиты копирования, одного указателя недостаточно. */ diff --git a/Source/Internal/Include/DAC.h b/Source/Internal/Include/DAC.h index 7c960a1..a168adf 100644 --- a/Source/Internal/Include/DAC.h +++ b/Source/Internal/Include/DAC.h @@ -1,17 +1,17 @@ -/* Èíòåðôåéñ ÖÀÏ è ÑÈÔÓ. Âõîäÿùèå êîìàíäû — UMP_commands_write, - * îêîí÷àíèå èìïóëüñà — UMP_pulse_tick. IMPowse òîëüêî äëÿ äèàãíîñòèêè. +/* Интерфейс ЦАП и СИФУ. Входящие команды — UMP_commands_write, + * окончание импульса — UMP_pulse_tick. IMPowse только для диагностики. */ void Load_runner(void); void Anal_output(long vrot, long maxx); void Init_DAC(void); void Setup_DAC_time(void); -/* Ñ÷¸ò÷èê ïóñêîâîãî èìïóëüñà è âûäåðæêè èíèöèàëèçàöèè äîñòóïíû ëîããåðó. */ +/* Счётчик пускового импульса и выдержки инициализации доступны логгеру. */ extern volatile unsigned long IMPowse; extern unsigned long WAKEpowse; extern unsigned int period_dac, time_dac; -/* Âñå îïåðàöèè áåçîïàñíû äëÿ âûçîâà èç main è îáðàáîò÷èêîâ IRQ. */ +/* Все операции безопасны для вызова из main и обработчиков IRQ. */ void UMP_pulse_init(void); void UMP_commands_write(unsigned int commands); void UMP_pulse_tick(void); diff --git a/Source/Internal/Include/GPIO_table.h b/Source/Internal/Include/GPIO_table.h index 6a40e7d..9edf76b 100644 --- a/Source/Internal/Include/GPIO_table.h +++ b/Source/Internal/Include/GPIO_table.h @@ -1,5 +1,5 @@ -/* Íàïðàâëåíèÿ GPIO äëÿ àïïàðàòíûõ èñïîëíåíèé. Åäèíèöà îçíà÷àåò - * âûõîä; àêòèâíóþ ïîëÿðíîñòü çàäàþò peripher.h è ñõåìà ïëàòû. +/* Направления GPIO для аппаратных исполнений. Единица означает + * выход; активную полярность задают peripher.h и схема платы. */ #define COMM_gpio00_dir 0L #define COMM_gpio01_dir 0L @@ -14,7 +14,7 @@ #define COMM_gpio10_dir 0L #define COMM_gpio11_dir 0L -#define COMM_gpio19_dir 1L // 63 — SPI +#define COMM_gpio19_dir 1L // 63 — SPI #define COMM_gpio20_dir 0L // 64 2:9B mode 2 #define COMM_gpio21_dir 0L // 65 2:9A mode 4 #define COMM_gpio22_dir 0L // 66 2:12C mode 1 @@ -26,7 +26,7 @@ #define COMM_gpio32_dir 1L // 74 2:10B DIOD green #define COMM_gpio33_dir 0L -#define COMM_gpio34_dir 1L // 142 — SCI +#define COMM_gpio34_dir 1L // 142 — SCI #define COMM_gpio48_dir 1L // 88 2:14C DIOD red #define COMM_gpio49_dir 1L // 89 2:14B select @@ -57,7 +57,7 @@ #define BKSD_gpio10_dir 0L // 19 2:6C oil #define BKSD_gpio11_dir 1L // 20 2:3C select -#define BKSD_gpio19_dir 1L // 63 — SPI +#define BKSD_gpio19_dir 1L // 63 — SPI #define BKSD_gpio20_dir 0L // 64 2:9B mode 2 #define BKSD_gpio21_dir 0L // 65 2:9A mode 4 #define BKSD_gpio22_dir 0L // 66 2:12C mode 1 @@ -69,7 +69,7 @@ #define BKSD_gpio32_dir 1L // 74 2:10B DIOD green #define BKSD_gpio33_dir 0L -#define BKSD_gpio34_dir 1L // 142 — SCI +#define BKSD_gpio34_dir 1L // 142 — SCI #define BKSD_gpio48_dir 1L // 88 2:14C DIOD red #define BKSD_gpio49_dir 0L // 89 2:14B input 2 @@ -100,7 +100,7 @@ #define BKST_gpio10_dir 0L #define BKST_gpio11_dir 1L // 20 2:3C select -#define BKST_gpio19_dir 1L // 63 — SPI +#define BKST_gpio19_dir 1L // 63 — SPI #define BKST_gpio20_dir 0L // 64 2:9B mode 2 #define BKST_gpio21_dir 0L // 65 2:9A mode 4 #define BKST_gpio22_dir 0L // 66 2:12C mode 1 @@ -112,7 +112,7 @@ #define BKST_gpio32_dir 1L // 74 2:10B DIOD green #define BKST_gpio33_dir 0L -#define BKST_gpio34_dir 1L // 142 — SCI +#define BKST_gpio34_dir 1L // 142 — SCI #define BKST_gpio48_dir 1L // 88 2:14C DIOD red #define BKST_gpio49_dir 0L @@ -143,7 +143,7 @@ #define PULT_gpio10_dir 0L #define PULT_gpio11_dir 0L -#define PULT_gpio19_dir 1L // 63 — SPI +#define PULT_gpio19_dir 1L // 63 — SPI #define PULT_gpio20_dir 0L // 64 2:9B mode 2 #define PULT_gpio21_dir 0L // 65 2:9A mode 4 #define PULT_gpio22_dir 0L // 66 2:12C mode 1 @@ -155,7 +155,7 @@ #define PULT_gpio32_dir 1L // 74 2:10B DIOD green #define PULT_gpio33_dir 0L -#define PULT_gpio34_dir 1L // 142 — SCI +#define PULT_gpio34_dir 1L // 142 — SCI #define PULT_gpio48_dir 1L // 88 2:14C DIOD red #define PULT_gpio49_dir 0L // 89 2:14B button @@ -186,7 +186,7 @@ #define PLT2_gpio10_dir 0L #define PLT2_gpio11_dir 0L -#define PLT2_gpio19_dir 1L // 63 × SPI +#define PLT2_gpio19_dir 1L // 63 Ч SPI #define PLT2_gpio20_dir 0L // 64 2:9B mode 2 #define PLT2_gpio21_dir 0L // 65 2:9A mode 4 #define PLT2_gpio22_dir 0L // 66 2:12C mode 1 @@ -198,7 +198,7 @@ #define PLT2_gpio32_dir 1L // 74 2:10B DIOD green #define PLT2_gpio33_dir 0L // 75 2:10C button -#define PLT2_gpio34_dir 1L // 142 × SCI +#define PLT2_gpio34_dir 1L // 142 Ч SCI #define PLT2_gpio48_dir 0L // 88 2:14C button #define PLT2_gpio49_dir 0L // 89 2:14B button @@ -229,7 +229,7 @@ #define SHKF_gpio10_dir 0L // 19 2:6C input #define SHKF_gpio11_dir 0L // 20 2:3C input -#define SHKF_gpio19_dir 1L // 63 — SPI +#define SHKF_gpio19_dir 1L // 63 — SPI #define SHKF_gpio20_dir 0L // 64 2:9B mode 2 #define SHKF_gpio21_dir 0L // 65 2:9A mode 4 #define SHKF_gpio22_dir 0L // 66 2:12C mode 1 @@ -241,7 +241,7 @@ #define SHKF_gpio32_dir 0L // 74 2:10B input #define SHKF_gpio33_dir 0L // 75 2:10C input -#define SHKF_gpio34_dir 1L // 142 — SCI +#define SHKF_gpio34_dir 1L // 142 — SCI #define SHKF_gpio48_dir 1L // 88 2:14C DIOD red #define SHKF_gpio49_dir 0L // 89 2:14B input @@ -272,7 +272,7 @@ #define LOAD_gpio10_dir 0L #define LOAD_gpio11_dir 0L // 20 2:3C res_in 0 -#define LOAD_gpio19_dir 1L // 63 — SPI +#define LOAD_gpio19_dir 1L // 63 — SPI #define LOAD_gpio20_dir 0L // 64 2:9B mode 2 #define LOAD_gpio21_dir 0L // 65 2:9A mode 4 #define LOAD_gpio22_dir 0L // 66 2:12C mode 1 @@ -284,7 +284,7 @@ #define LOAD_gpio32_dir 1L // 74 2:10B DIOD green #define LOAD_gpio33_dir 0L -#define LOAD_gpio34_dir 1L // 142 — SCI +#define LOAD_gpio34_dir 1L // 142 — SCI #define LOAD_gpio48_dir 1L // 88 2:14C DIOD red #define LOAD_gpio49_dir 0L diff --git a/Source/Internal/Include/RS485.h b/Source/Internal/Include/RS485.h index 3cb18d4..64eef34 100644 --- a/Source/Internal/Include/RS485.h +++ b/Source/Internal/Include/RS485.h @@ -1,5 +1,5 @@ -/* Áóôåðû UART ðàçäåëÿþòñÿ ISR è main. main îáðàáàòûâàåò - * çàêîí÷åííûé RS_Header. Ðàçìåðû ñâåðÿòü ñ 16-áèòíîé ABI DSP. +/* Буферы UART разделяются ISR и main. main обрабатывает + * законченный RS_Header. Размеры сверять с 16-битной ABI DSP. */ #ifndef _RS485 #define _RS485 @@ -32,30 +32,30 @@ typedef struct { volatile struct SCI_REGS *SciRegs; - unsigned int commnumber; // Íîìåð ïîðòà - unsigned long RS_Length; // Äëèíà ïàêåòà + unsigned int commnumber; // Номер порта + unsigned long RS_Length; // Длина пакета - unsigned int *pRS_RecvPtr; // Áóôåð ïðèåìà - unsigned int *pRS_SendPtr; // Áóôåð ïîñûëêè + unsigned int *pRS_RecvPtr; // Буфер приема + unsigned int *pRS_SendPtr; // Буфер посылки 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 + 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 - unsigned int addr_answer; // àäðåñ êóäà îòâå÷àòü â ðåæèìå âåäóùåãî - unsigned int addr_recive; // àäðåñ ïî êîòîðîìó íàñ çàïðîñèëè - unsigned int flag_LEADING; // Ôëàã ðåæèìà êîíòðîëëåðà (ïî óìîë÷àíèþ âåäîìûé) + 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; // Ôëàã óñïåøíîñòè ïðèåìà áëîêà + unsigned long RS_SLength; // Длина пакета дла посылки + unsigned long RS_SendLen; // Количество байт уже передали + char RS_SendBlockMode; // Режим передачи + char RS_Flag9bit; // дла RS485???????? + int BS_LoadOK; // Флаг успешности приема блока int RS_FlagBegin; int RS_HeaderCnt; int RS_FlagSkiping; @@ -67,39 +67,39 @@ typedef struct extern RS_DATA rs_a,rs_b; extern unsigned int - RS_Len[70]; /* Äåéñòâèòåëüíàà äëèíà êîìàíäû (îòëàäî÷íîé) + 1 */ + RS_Len[70]; /* Действительнаа длина команды (отладочной) + 1 */ interrupt void RSA_RX_Handler(void); interrupt void RSA_TX_Handler(void); interrupt void RSB_RX_Handler(void); interrupt void RSB_TX_Handler(void); -/* èíèöèëèçàöèà ïåðåìåííûõ rs_a,rs_b*/ +/* иницилизациа переменных rs_a,rs_b*/ void create_uart_vars(char size_cmd15); -/** Ïîâòîðíàà èíèöèàëèçàöèà ïîñëåäîâàòåëüíîãî ïîðòà, èñïîëüçóåòñà ïîñëå ïîäâèñà */ -/** Íàñòðîéêà ðåæèìà ïðèåìà/ïåðåäà÷è */ +/** Повторнаа инициализациа последовательного порта, используетса после подвиса */ +/** Настройка режима приема/передачи */ 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 */ 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 */ 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 - скорость линии в бодах */ void RS_SetLineMode(RS_DATA *rs_arr, int bit, char parity, int stop); void RS_SetLineSpeed(RS_DATA *rs_arr, unsigned long speed); @@ -107,17 +107,17 @@ void RS_SetLineSpeed(RS_DATA *rs_arr, unsigned long speed); // Transmit a character from the SCI' #define SCI_send(x,y) x->SciRegs->SCITXBUF=(unsigned char)(y) -// Îæèäàíèå çàâåðøåíèà ïåðåäà÷è UART +// Ожидание завершениа передачи UART // wait for TRDY =1 for empty state #define RS_Wait4OK(x) while(!(x->SciRegs->SCICTL2.bit.TXEMPTY)) -/** Ïåðåêëþ÷åíèå ëèíèè íà ïðèåì */ +/** Переключение линии на прием */ #define RS_Line_to_receive(x) if(x->commnumber==COM_2) GpioDataRegs.GPBDAT.bit.GPIO34 = 1; -/** Ïåðåêëþ÷åíèå ëèíèè íà ïåðåäà÷ó */ +/** Переключение линии на передачу */ #define RS_Line_to_send(x) if(x->commnumber==COM_2) GpioDataRegs.GPBDAT.bit.GPIO34 = 0; -/** Ðàçðåøåíèå ïðåðûâàíèé ïî ïîëó÷åíèþ ñèìâîëà è îøèáêàì îò UART */ +/** Разрешение прерываний по получению символа и ошибкам от UART */ #define enableUARTInt(x) x->SciRegs->SCICTL2.all=2 #define enableUARTIntW(x) x->SciRegs->SCICTL2.all=1 diff --git a/Source/Internal/Include/bios_dsp.h b/Source/Internal/Include/bios_dsp.h index 71c3c3b..38e44e8 100644 --- a/Source/Internal/Include/bios_dsp.h +++ b/Source/Internal/Include/bios_dsp.h @@ -1,5 +1,5 @@ -/* Êîäû CMD_* ÿâëÿþòñÿ ÷àñòüþ ôîðìàòà îáìåíà ñ ÏÊ. Íîâûå êîìàíäû - * äîáàâëÿþòñÿ áåç ïåðåíóìåðàöèè ñóùåñòâóþùèõ çíà÷åíèé. +/* Коды CMD_* являются частью формата обмена с ПК. Новые команды + * добавляются без перенумерации существующих значений. */ #ifndef _BIOS_DSP #define _BIOS_DSP @@ -36,67 +36,67 @@ enum { CMD_VECTOR=61, CMD_IMPULSE, - /* ñòàíäàðòíûå êîìàíäû */ + /* стандартные команды */ CMD_STD=65, CMD_STD_ANS }; enum {false=0, true}; -/** Âîçâðàùàåò íîìåð êîììàíäû, åñëè åñòü èëè -1 åñëè òðàíçàêöèé íå áûëî */ +/** Возвращает номер комманды, если есть или -1 если транзакций не было */ int get_command(RS_DATA *rs_arr); -/** Ñòàíäàðòíûé îòâåò, áåç ïàðàìåòðîâ */ +/** Стандартный ответ, без параметров */ void Answer(RS_DATA *rs_arr,int n); -/* íà÷àëüíûå óñòàíîâêè (íå ðàáîòàåò)*/ +/* начальные установки (не работает)*/ void init(RS_DATA *rs_arr); -/**@name Êîììàíäû -* Êîììàíäû, âûçûâàåìûå ÷åðåç ïîñëåäîâàòåëüíûé êàíàë*/ +/**@name Комманды +* Комманды, вызываемые через последовательный канал*/ //@{ -/** Èíèöèèðîâàòü çàãðóçêó áëîêà. - Íàñòðàèâàåò ïðèåì áëîêà äàííûõ */ +/** Инициировать загрузку блока. + Настраивает прием блока данных */ void initload(RS_DATA *rs_arr); -/** Çàãðóçêà áëîêà. - Âûçûâàåòñà ïîñëå çàãðóçêè áëîêà ÷åðåç RS */ +/** Загрузка блока. + Вызываетса после загрузки блока через RS */ void load(RS_DATA *rs_arr); -/** Âûïîëíèòü ïðîãðàììó â ôîðìàòå Serial Boot. - @precondition Äîëæíà áûòü ïðîèçâåäåíà çàãðóçêà áëîêà - Àäðåñ ïðîãðàììû áåðåòñà èç çàãîëîâêà è - ñðàâíèâàåòñà ñ ïåðåìåííîé RecvPtr, çàïîëíàåìîé â ô-öèè load +/** Выполнить программу в формате Serial Boot. + @precondition Должна быть произведена загрузка блока + Адрес программы беретса из заголовка и + сравниваетса с переменной RecvPtr, заполнаемой в ф-ции load @see load */ void run (RS_DATA *rs_arr); -/** Ïðî÷èòàòü à÷åéêó ïàìàòè */ +/** Прочитать ачейку памати */ void peek(RS_DATA *rs_arr); -/** Çàïèñàòü â à÷åéêó ïàìàòè */ +/** Записать в ачейку памати */ void poke(RS_DATA *rs_arr); -/** Ïåðåäàòü áëîê ïàìàòè */ +/** Передать блок памати */ void upload(RS_DATA *rs_arr); -/** Ïðîøèòü XILINX. - @precondition Äîëæíà áûòü ïðîèçâåäåíà çàãðóçêà áëîêà - Àäðåñ è äëèíà ïðîøèâêè áåðåòñà èç çàãîëîâêà è - ñðàâíèâàåòñà ñ ïåðåìåííûìè RecvPtr è Length, çàïîëíàåìûìè â ô-öèè load, - òàê æå ñìîòðèò ìàãè÷åñêîå ñëîâî â íà÷àëå ïðîøèâêè +/** Прошить XILINX. + @precondition Должна быть произведена загрузка блока + Адрес и длина прошивки беретса из заголовка и + сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load, + так же смотрит магическое слово в начале прошивки @see load */ void xflash(RS_DATA *rs_arr); -/** Ïðîøèòü TMS. - @precondition Äîëæíà áûòü ïðîèçâåäåíà çàãðóçêà áëîêà - Àäðåñ è äëèíà ïðîøèâêè áåðåòñà èç çàãîëîâêà è - ñðàâíèâàåòñà ñ ïåðåìåííûìè RecvPtr è Length, çàïîëíàåìûìè â ô-öèè load +/** Прошить TMS. + @precondition Должна быть произведена загрузка блока + Адрес и длина прошивки беретса из заголовка и + сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load @see load */ void tflash(RS_DATA *rs_arr); -/* ðàñøèðåííûå êîìàíäû äëà áèîñà */ +/* расширенные команды дла биоса */ void extendbios(RS_DATA *rs_arr); diff --git a/Source/Internal/Include/caliber.h b/Source/Internal/Include/caliber.h index 4e7ed21..f3f4823 100644 --- a/Source/Internal/Include/caliber.h +++ b/Source/Internal/Include/caliber.h @@ -1,48 +1,48 @@ -/* Çàâîäñêèå êàëèáðîâêè ïî âåðñèè BALSAM è òèïó ïëàòû. Çäåñü - * îïðåäåëÿþòñÿ ìàññèâû, à íå òîëüêî extern; íå äóáëèðîâàòü ïîäêëþ÷åíèå. +/* Заводские калибровки по версии BALSAM и типу платы. Здесь + * определяются массивы, а не только extern; не дублировать подключение. */ #if BALSAM == 166 //------------------------------------------------------------- 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, // Борт 0 + 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, // Борт 0 + 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 }; #endif //--------------------------------------------------------------------- #if BALSAM == 165 //------------------------------------------------------------- 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, // Борт 0 + 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, // Борт 0 + 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 }; #endif //--------------------------------------------------------------------- #if BALSAM == 164 //------------------------------------------------------------- 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, // Борт 0 + 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, // Борт 0 + 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 }; #endif //--------------------------------------------------------------------- @@ -51,15 +51,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 //--------------------------------------------------------------------- */ diff --git a/Source/Internal/Include/cntrl_adr.h b/Source/Internal/Include/cntrl_adr.h index af5fb23..cdab031 100644 --- a/Source/Internal/Include/cntrl_adr.h +++ b/Source/Internal/Include/cntrl_adr.h @@ -1,5 +1,5 @@ -/* Ñîáñòâåííûé, îáùèé è ñïåöèàëüíûå àäðåñà ïîñëåäîâàòåëüíîãî îáìåíà. - * main çàäà¸ò àäðåñà ÷åðåç set_cntrl_addr äî íà÷àëà îáìåíà. +/* Собственный, общий и специальные адреса последовательного обмена. + * main задаёт адреса через set_cntrl_addr до начала обмена. */ #ifndef _CNTRL_ADR #define _CNTRL_ADR @@ -8,22 +8,22 @@ extern "C" { #endif -/** àäðåñ êîíòðîëëåðà äëà ïîñûëêè âñåì ÀÈÍàì */ +/** адрес контроллера дла посылки всем АИНам */ extern int ADDR_FOR_ALL; -/** àäðåñ êîíòðîëëåðà äëà ïîñûëêè îòâåòà */ +/** адрес контроллера дла посылки ответа */ extern const int ADDR_ANSWER; -/** àäðåñà òåðìèíàëà äëà ïîñûëêè îòâåòà */ +/** адреса терминала дла посылки ответа */ extern const int ADDR_TERMINAL; -/* Àäðåñ êîíòðîëëåðà */ +/* Адрес контроллера */ extern int CNTRL_ADDR; -/* Óíèâåðñàëüíûé àäðåñ êîíòðîëëåðà */ +/* Универсальный адрес контроллера */ extern const int CNTRL_ADDR_UNIVERSAL; -/** Óñòàíîâêà àäðåñà êîíòðîëëåðà äëà ïðîøèâêè */ +/** Установка адреса контроллера дла прошивки */ void set_cntrl_addr (int cntrl_addr,int cntrl_addr_for_all); diff --git a/Source/Internal/Include/crc16.h b/Source/Internal/Include/crc16.h index 8885beb..b06e4a1 100644 --- a/Source/Internal/Include/crc16.h +++ b/Source/Internal/Include/crc16.h @@ -1,5 +1,5 @@ -/* Èíòåðôåéñû CRC. Ðàçëè÷àòü áóôåð êàäðà è ìàññèâ ñëîâ EEPROM; - * ðåçóëüòàò çàâèñèò îò ïîðÿäêà îáðàáîòêè áàéòîâ. +/* Интерфейсы CRC. Различать буфер кадра и массив слов EEPROM; + * результат зависит от порядка обработки байтов. */ typedef unsigned short WORD; typedef unsigned char byte; diff --git a/Source/Internal/Include/filter_bat2.h b/Source/Internal/Include/filter_bat2.h index 50f6879..c58a892 100644 --- a/Source/Internal/Include/filter_bat2.h +++ b/Source/Internal/Include/filter_bat2.h @@ -1,5 +1,5 @@ -/* Êîýôôèöèåíòû è èçìåíÿåìàÿ èñòîðèÿ ôèëüòðà. Êàæäûé íåçàâèñèìûé - * êàíàë äîëæåí èìåòü îòäåëüíûé ýêçåìïëÿð FILTERBAT. +/* Коэффициенты и изменяемая история фильтра. Каждый независимый + * канал должен иметь отдельный экземпляр FILTERBAT. */ #ifndef _FILTER_BAT2 #define _FILTER_BAT2 diff --git a/Source/Internal/Include/kanal.h b/Source/Internal/Include/kanal.h index 94917d8..807e2de 100644 --- a/Source/Internal/Include/kanal.h +++ b/Source/Internal/Include/kanal.h @@ -1,4 +1,4 @@ -/* Èíòåðôåéñ êàíàëà èíäèêàöèè. Îí íå ôîðìèðóåò START_DPTB - * è íå äîëæåí èñïîëüçîâàòüñÿ âìåñòî ôóíêöèé óïðàâëåíèÿ íàãðóçêîé. +/* Интерфейс канала индикации. Он не формирует START_DPTB + * и не должен использоваться вместо функций управления нагрузкой. */ void kanal_Send(int adr, long dat, int dot); diff --git a/Source/Internal/Include/measure.h b/Source/Internal/Include/measure.h index f81b792..89a5647 100644 --- a/Source/Internal/Include/measure.h +++ b/Source/Internal/Include/measure.h @@ -1,5 +1,5 @@ -/* ×àñòîòû è ñîñòîÿíèÿ èçìåðåíèé. READY â 166 — ñ÷¸ò÷èê äî íóëÿ. - * READY_FREQ çàäà¸ò òàéìåð ÑÈÔÓ, DAC_FREQ — ðàñ÷¸ò ÖÀÏ. +/* Частоты и состояния измерений. READY в 166 — счётчик до нуля. + * READY_FREQ задаёт таймер СИФУ, DAC_FREQ — расчёт ЦАП. */ #ifndef _MEASURE #define _MEASURE @@ -65,14 +65,14 @@ typedef union #define NOER 0xE000//C #define EROR 0x01FF -#define READY_FREQ (500.0 * 2)// Ãö -#define BLINK_FREQ 2 // Ãö +#define READY_FREQ (500.0 * 2)// Гц +#define BLINK_FREQ 2 // Гц #define BLINK_TIME (READY_FREQ / BLINK_FREQ) #define CANPOWSE 20 -#define ADC_FREQ 3750 //3885.0//777//2000//20000 //777 //3885 // Ãö (777*5) -#define DAC_FREQ 200//5 // Ãö +#define ADC_FREQ 3750 //3885.0//777//2000//20000 //777 //3885 // Гц (777*5) +#define DAC_FREQ 200//5 // Гц #define LOAD_TIME 30//15 // sec @@ -87,23 +87,23 @@ extern unsigned int Caliber_time; #define ZERO 27 -#define Cooling 5 // (°Ñ) Ãèñòåðåçèñ ïî ñíàòèþ ïåðåãðåâà +#define Cooling 5 // (°С) Гистерезис по снатию перегрева #define COSPi6 0.86602540378443864676372317075294 #define RADIX2 1.4142135623730950488016887242097 -#define POWER_380 0 // ïèòàíèå 380 -#define POWER_38O 1 // ïèòàíèå 380 +#define POWER_380 0 // питание 380В +#define POWER_38O 1 // питание 380В -#define CURRENT 2 // òîê -#define VOLTAGE 3 // íàïðàæåíèå +#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 POWER_31 4 // питание 31В +#define POWER_27 5 // питание 24В +#define POWER_24 6 // питание 24В +#define POWER_15 7 // питание 15В +#define TERMO_AD 8 // термодатчик мелкосхема extern int TPL_CANS,tpl_cans; diff --git a/Source/Internal/Include/message.h b/Source/Internal/Include/message.h index 2ddb361..da1f013 100644 --- a/Source/Internal/Include/message.h +++ b/Source/Internal/Include/message.h @@ -1,5 +1,5 @@ -/* Òåõíîëîãè÷åñêèå ðåãèñòðû è Modbus. ANSWER_LEN îãðàíè÷èâàåò - * ìàññèâ modbus; àäðåñîì ëîããåðà 0x1000 èíäåêñèðîâàòü åãî íåëüçÿ. +/* Технологические регистры и Modbus. ANSWER_LEN ограничивает + * массив modbus; адресом логгера 0x1000 индексировать его нельзя. */ #ifndef MESSAGE_H #define MESSAGE_H @@ -14,8 +14,8 @@ typedef unsigned char CHAR; typedef struct { - unsigned char Address; // Àäðåñ êîíòðîëëåðà - unsigned char Number; // Íîìåð êîìàíäû + unsigned char Address; // Адрес контроллера + unsigned char Number; // Номер команды BAITE byte0; BAITE byte1; diff --git a/Source/Internal/Include/package.h b/Source/Internal/Include/package.h index 8bfcb9f..9703875 100644 --- a/Source/Internal/Include/package.h +++ b/Source/Internal/Include/package.h @@ -11,7 +11,7 @@ #define REVERSE 1 /* Выбирает исполнение 166: соответствующие калибровки и обратный порядок индикаторов задаются условными блоками ниже. */ -#define BALSAM 166 +#define BALSAM 165 #if BALSAM == 166 #define OBOROT REVERSE diff --git a/Source/Internal/Include/peripher.h b/Source/Internal/Include/peripher.h index b482fd8..771694e 100644 --- a/Source/Internal/Include/peripher.h +++ b/Source/Internal/Include/peripher.h @@ -1,6 +1,6 @@ -/* Ôèçè÷åñêèå GPIO ñ ó÷¸òîì ðåæèìà è ïîëÿðíîñòè. set îçíà÷àåò - * àêòèâèðîâàòü ôóíêöèþ, íå âñåãäà âûñòàâèòü 1. START/STOP íàãðóçêè - * àêòèâíû åäèíèöåé, RES_OUT_2 íóë¸ì. Äèñêðåòàìè âëàäååò àâòîìàò ÑÈÔÓ. +/* Физические GPIO с учётом режима и полярности. set означает + * активировать функцию, не всегда выставить 1. START/STOP нагрузки + * активны единицей, RES_OUT_2 нулём. Дискретами владеет автомат СИФУ. */ #include "DSP2833x_Device.h" // DSP281x Headerfile Include File diff --git a/Source/Internal/Include/pulto.h b/Source/Internal/Include/pulto.h index f3f1bb9..b384b14 100644 --- a/Source/Internal/Include/pulto.h +++ b/Source/Internal/Include/pulto.h @@ -1,5 +1,5 @@ -/* Ñîñòîÿíèÿ ïóëüòà dsk_EPLT. Îáðàáîò÷èê òàéìåðà íàãðóçêè - * îïðåäåë¸í îòäåëüíî â measure.c. +/* Состояния пульта dsk_EPLT. Обработчик таймера нагрузки + * определён отдельно в measure.c. */ //void what_is(void); diff --git a/Source/Internal/Include/spise2p.h b/Source/Internal/Include/spise2p.h index 0f84d10..85a996d 100644 --- a/Source/Internal/Include/spise2p.h +++ b/Source/Internal/Include/spise2p.h @@ -1,11 +1,11 @@ -/* Àâòîìàò SPI EEPROM ïðîäâèãàåò òàéìåð 2. Ñèíõðîííîå îæèäàíèå - * òðåáóåò ðàçðåø¸ííûõ IRQ. PAGE_LEN/WORD_LEN çàäàþò àäðåñàöèþ ñòðàíèö. +/* Автомат SPI EEPROM продвигает таймер 2. Синхронное ожидание + * требует разрешённых IRQ. PAGE_LEN/WORD_LEN задают адресацию страниц. */ #ifndef __SPISE2P_H__ #define __SPISE2P_H__ -// ¨ìêîñòü ïàìàòè â áàéòàõ +// Ёмкость памати в байтах #define SEEPROM_LEN 0x10000 #define NULL 0 @@ -97,25 +97,25 @@ void spiSe2pRead(SPISE2P_DRV *se2p, SE2P_DATA *data); #define WORD_LEN 1 #endif -/* Óñòàíîâêà äðàéâåðà ñåðèàëüíîé EEPROM. ** -** Èíèöèàëèçàöèà SPI è ïðî÷. Òàêæå íàñòðîéêà òàéìåðà. ** -** Äðàéâåð ðàáîòàåò íà ïðåðûâàíèàõ îò òàéìåðà 2! */ +/* Установка драйвера сериальной EEPROM. ** +** Инициализациа SPI и проч. Также настройка таймера. ** +** Драйвер работает на прерываниах от таймера 2! */ 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 - длина блока в байтах. По-любому в байтах! */ void Seeprom_write(unsigned int adres, unsigned int buf[], unsigned int 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 - длина блока в байтах. По-любому в байтах! */ void Seeprom_read(unsigned int adres, unsigned int buf[], unsigned int size); #endif diff --git a/Source/Internal/Include/tools.h b/Source/Internal/Include/tools.h index bdb03f9..3087bc9 100644 --- a/Source/Internal/Include/tools.h +++ b/Source/Internal/Include/tools.h @@ -1,5 +1,5 @@ -/* Èíèöèàëèçàöèÿ ïàìÿòè è çàäåðæêè. pause_us íå èñïîëüçîâàòü - * äëÿ äëèòåëüíîñòè äèñêðåòîâ; èõ îòñ÷èòûâàåò àïïàðàòíûé òàéìåð. +/* Инициализация памяти и задержки. pause_us не использовать + * для длительности дискретов; их отсчитывает аппаратный таймер. */ #ifndef TOOLS_H #define TOOLS_H diff --git a/Source/Internal/Include/ump_control_impl.h b/Source/Internal/Include/ump_control_impl.h index de544fe..d837910 100644 --- a/Source/Internal/Include/ump_control_impl.h +++ b/Source/Internal/Include/ump_control_impl.h @@ -1,18 +1,18 @@ -/* Ïîäêëþ÷àåòñÿ òîëüêî èç DAC.c; â host-òåñòå — ñ ïîäìåíîé GPIO/IRQ. */ +/* Подключается только из DAC.c; в host-тесте — с подменой GPIO/IRQ. */ #ifndef UMP_CONTROL_IMPL_H #define UMP_CONTROL_IMPL_H -/* Àïïàðàòíàÿ îá¸ðòêà àâòîìàòà. Õðàíèì å¸ â ñóùåñòâóþùåì DAC.c, ÷òîáû - * ñòàðûé ïðîåêò CCS è íîâûé CCS12 ñîáèðàëè îäèíàêîâûé íàáîð èñõîäíèêîâ. - * Âñå âõîäû íèæå ñîõðàíÿþò ïðåæíþþ ìàñêó IRQ; íåëüçÿ ïðîñòî äåëàòü EINT - * ïðè âûõîäå, ïîñêîëüêó âûçîâ âîçìîæåí èç óæå çàùèù¸ííîãî îáðàáîò÷èêà. */ +/* Аппаратная обёртка автомата. Храним её в существующем DAC.c, чтобы + * старый проект CCS и новый CCS12 собирали одинаковый набор исходников. + * Все входы ниже сохраняют прежнюю маску IRQ; нельзя просто делать EINT + * при выходе, поскольку вызов возможен из уже защищённого обработчика. */ static volatile UMP_PULSE_STATE ump_pulse; static volatile unsigned int ump_pulse_enabled; static void UMP_apply_outputs(unsigned int previous_output, unsigned int previous_relay) { if (previous_output != ump_pulse.output) { - /* Ñíà÷àëà ñíèìàåì ñòàðûé ñèãíàë, çàòåì âûñòàâëÿåì íîâûé. - * Ïðîìåæóòî÷íîå ñîñòîÿíèå — îáà âûêëþ÷åíû, à íå îáà âêëþ÷åíû. */ + /* Сначала снимаем старый сигнал, затем выставляем новый. + * Промежуточное состояние — оба выключены, а не оба включены. */ clear_START_DPTB(); clear_STOP_DPTB(); if (ump_pulse.output == UMP_PULSE_START) set_START_DPTB(); @@ -22,8 +22,8 @@ static void UMP_apply_outputs(unsigned int previous_output, unsigned int previou if (ump_pulse.relay) set_RES_OUT_2(); else clear_RES_OUT_2(); } - /* Ñòàðîå èìÿ îñòàâëåíî äëÿ ïðîòîêîëà ëîããåðà. Ýòî òåïåðü îòðàæåíèå - * òàéìåðà àâòîìàòà, à íå ïåðåìåííàÿ, êîòîðóþ îäíîâðåìåííî ïðàâèò main. */ + /* Старое имя оставлено для протокола логгера. Это теперь отражение + * таймера автомата, а не переменная, которую одновременно правит main. */ IMPowse = ump_pulse.remaining; } @@ -34,8 +34,8 @@ void UMP_pulse_init(void) ump_pulse_init(&ump_pulse, Commands); clear_START_DPTB(); clear_STOP_DPTB(); clear_RES_OUT_2(); IMPowse = 0; - /* Ðàçðåøàåì îáðàáîòêó òîëüêî ïîñëå çàãðóçêè ïàðàìåòðîâ è íàñòðîéêè - * ÖÀÏ. Êîìàíäû äî ýòîé òî÷êè íå èñïîëíÿþòñÿ çàäíèì ÷èñëîì. */ + /* Разрешаем обработку только после загрузки параметров и настройки + * ЦАП. Команды до этой точки не исполняются задним числом. */ ump_pulse_enabled = 1; } __restore_interrupts(saved); @@ -47,9 +47,9 @@ void UMP_commands_write(unsigned int commands) unsigned int output = ump_pulse.output, relay = ump_pulse.relay; Commands = commands; if (Desk == dsk_LOAD && ump_pulse_enabled) { - /* Âûïîëíÿåì ôðîíò â ìîìåíò ïðèíÿòèÿ ñëîâà. Íåò î÷åðåäè, êîòîðóþ - * main äîëæåí îïðîñèòü ïîñëå äëèòåëüíîãî îáðàùåíèÿ ê EEPROM. - * Çäåñü òîëüêî íåñêîëüêî îïåðàöèé ñ ïàìÿòüþ/GPIO, áåç îæèäàíèé. */ + /* Выполняем фронт в момент принятия слова. Нет очереди, которую + * main должен опросить после длительного обращения к EEPROM. + * Здесь только несколько операций с памятью/GPIO, без ожиданий. */ ump_pulse_accept(&ump_pulse, commands, (unsigned int)READY_FREQ); UMP_apply_outputs(output, relay); } @@ -70,11 +70,11 @@ void UMP_pulse_tick(void) void UMP_reset_parameter_commands(void) { unsigned int saved = __disable_interrupts(); - /* EEPROM ñîäåðæèò ïàðàìåòðû, íî íå ÿâëÿåòñÿ èñòî÷íèêîì êîìàíä ïóñêà. - * Ñîõðàíÿåì ïîñëåäíèå ïðèíÿòûå START/STOP è èñòîðèþ ôðîíòîâ àâòîìàòà. - * Íåëüçÿ îáíóëèòü èõ ïðè Load/Default: òàéìåð ÖÀÏ ÷èòàåò òîò æå óðîâåíü, - * à ñëåäóþùèé ïîâòîð ïàêåòà ñ åäèíèöåé íå äîëæåí ñòàòü ëîæíûì ôðîíòîì. - * Äðóãèå ðåæèìû ïëàòû ñîõðàíÿþò ïðåæíåå ïîâåäåíèå ïîëíîãî ñáðîñà. */ + /* EEPROM содержит параметры, но не является источником команд пуска. + * Сохраняем последние принятые START/STOP и историю фронтов автомата. + * Нельзя обнулить их при Load/Default: таймер ЦАП читает тот же уровень, + * а следующий повтор пакета с единицей не должен стать ложным фронтом. + * Другие режимы платы сохраняют прежнее поведение полного сброса. */ if (Desk == dsk_LOAD) Commands &= UMP_START_MASK | UMP_STOP_MASK; else Commands = 0; __restore_interrupts(saved); diff --git a/Source/Internal/Include/ump_pulse.h b/Source/Internal/Include/ump_pulse.h index 408446f..0599fe5 100644 --- a/Source/Internal/Include/ump_pulse.h +++ b/Source/Internal/Include/ump_pulse.h @@ -1,8 +1,8 @@ -/* Óïðàâëåíèå èìïóëüñàìè ÑÈÔÓ. ×èñòûé àâòîìàò áåç äîñòóïà ê GPIO. - * Îäèí è òîò æå êîä èñïîëüçóåòñÿ ïðîøèâêîé è host-òåñòîì. - * ÂÀÆÍÎ: âûçûâàþùàÿ ñòîðîíà ñåðèàëèçóåò init/accept/tick çàïðåòîì IRQ. - * volatile îáåñïå÷èâàåò îáðàùåíèÿ ê îáùåìó ñîñòîÿíèþ, íî íå çàìåíÿåò - * êðèòè÷åñêóþ ñåêöèþ: îáíîâëåíèå íåñêîëüêèõ ïîëåé íå ÿâëÿåòñÿ àòîìàðíûì. +/* Управление импульсами СИФУ. Чистый автомат без доступа к GPIO. + * Один и тот же код используется прошивкой и host-тестом. + * ВАЖНО: вызывающая сторона сериализует init/accept/tick запретом IRQ. + * volatile обеспечивает обращения к общему состоянию, но не заменяет + * критическую секцию: обновление нескольких полей не является атомарным. */ #ifndef UMP_PULSE_H #define UMP_PULSE_H @@ -21,10 +21,10 @@ typedef struct { static void ump_pulse_init(volatile UMP_PULSE_STATE *s, unsigned int commands) { - /* Óæå àêòèâíàÿ êîìàíäà ïðè îêîí÷àíèè çàãðóçêè íå ÿâëÿåòñÿ íîâûì ïóñêîì. - * Ñíèìàåì ôèçè÷åñêèå âûõîäû îòäåëüíî â àïïàðàòíîé îá¸ðòêå. - * Åñëè íà÷àëüíîå ñëîâî íóëåâîå, ïåðâàÿ ñâåæàÿ åäèíèöà áóäåò ïðèíÿòà: - * áîëüøå íå íóæåí ñëó÷àéíûé ïðîõîä main, óñïåâøèé ïðî÷èòàòü íîëü. */ + /* Уже активная команда при окончании загрузки не является новым пуском. + * Снимаем физические выходы отдельно в аппаратной обёртке. + * Если начальное слово нулевое, первая свежая единица будет принята: + * больше не нужен случайный проход main, успевший прочитать ноль. */ s->previous = commands; s->remaining = 0; s->output = UMP_PULSE_NONE; @@ -35,23 +35,23 @@ static void ump_pulse_accept(volatile UMP_PULSE_STATE *s, unsigned int commands, unsigned int ticks) { unsigned int rising = commands & ~s->previous; - /* Èñòîðèÿ îòíîñèòñÿ ê êàæäîìó ïðèíÿòîìó ñëîâó CAN/RS, à íå ê ðåäêèì - * ñíèìêàì main. Ïîýòîìó äàæå 1->0->1 ìåæäó ïðîõîäàìè main çàìå÷àåòñÿ. - * Ïîâòîðíûå ïàêåòû ñ óäåðæèâàåìîé åäèíèöåé íå ïðîäëåâàþò èìïóëüñ. */ + /* История относится к каждому принятому слову CAN/RS, а не к редким + * снимкам main. Поэтому даже 1->0->1 между проходами main замечается. + * Повторные пакеты с удерживаемой единицей не продлевают импульс. */ s->previous = commands; if (commands & UMP_STOP_MASK) { - /* STOP èìååò ïðèîðèòåò äàæå ïðè îäíîâðåìåííîì ôðîíòå START. - * Åãî óäåðæàíèå çàïðåùàåò íîâûé START. Çàïðåù¸ííûé ïóñê íå ñòàâèì - * â î÷åðåäü: ñíÿòèå STOP íå äîëæíî íåîæèäàííî çàïóñêàòü ÑÈÔÓ. */ + /* STOP имеет приоритет даже при одновременном фронте START. + * Его удержание запрещает новый START. Запрещённый пуск не ставим + * в очередь: снятие STOP не должно неожиданно запускать СИФУ. */ if (rising & UMP_STOP_MASK) { s->output = UMP_PULSE_STOP; s->remaining = ticks; s->relay = 0; } } else if (rising & UMP_START_MASK) { - /* Íîâûé START ïîñëå ñíÿòèÿ êîìàíäû STOP ïåðåêëþ÷àåò âûõîäû. - * Íîâûé ôðîíò âî âðåìÿ START ïðîäëåâàåò ñóùåñòâóþùèé èìïóëüñ, - * êàê ðàíüøå; îòäåëüíûé ýëåêòðè÷åñêèé ôðîíò çäåñü íå îáåùàåòñÿ. */ + /* Новый START после снятия команды STOP переключает выходы. + * Новый фронт во время START продлевает существующий импульс, + * как раньше; отдельный электрический фронт здесь не обещается. */ s->output = UMP_PULSE_START; s->remaining = ticks; s->relay = 1; @@ -60,9 +60,9 @@ static void ump_pulse_accept(volatile UMP_PULSE_STATE *s, static void ump_pulse_tick(volatile UMP_PULSE_STATE *s) { - /* Åäèíñòâåííûé âëàäåëåö îòñ÷¸òà — òàéìåð 1 êÃö. main íå ó÷àñòâóåò - * â çàâåðøåíèè èìïóëüñà, ïîýòîìó EEPROM íå ðàñòÿãèâàåò åãî. - * RES_OUT_2 ñîõðàíÿåò ïîñëåäíåå ñîñòîÿíèå ïîñëå êîíöà èìïóëüñà. */ + /* Единственный владелец отсчёта — таймер 1 кГц. main не участвует + * в завершении импульса, поэтому EEPROM не растягивает его. + * RES_OUT_2 сохраняет последнее состояние после конца импульса. */ if (s->remaining && --s->remaining == 0) s->output = UMP_PULSE_NONE; } diff --git a/Source/Internal/RS485.c b/Source/Internal/RS485.c index b91e8ac..aa868f0 100644 --- a/Source/Internal/RS485.c +++ b/Source/Internal/RS485.c @@ -1,8 +1,8 @@ -/* Íèçêîóðîâíåâûé UART äâóõ ïîðòîâ. RX ISR ñîáèðàåò RS_Header, - * TX ISR ïðîäîëæàåò ïåðåäà÷ó. RS_DataReady ïåðåäà¸ò ãîòîâûé êàäð - * â main äëÿ ïðîâåðêè CRC; ïðè¸ì áàéòîâ åù¸ íå îçíà÷àåò èñïîëíåíèÿ. - * RS_Send ñîäåðæèò îæèäàíèÿ UART è íå îòíîñèòñÿ ê áûñòðîìó ïóòè ÑÈÔÓ. - * Ðàçìåðû áóôåðîâ íóæíî ïîíèìàòü ñ ó÷¸òîì 16-áèòíîé ABI C2000. +/* Низкоуровневый UART двух портов. RX ISR собирает RS_Header, + * TX ISR продолжает передачу. RS_DataReady передаёт готовый кадр + * в main для проверки CRC; приём байтов ещё не означает исполнения. + * RS_Send содержит ожидания UART и не относится к быстрому пути СИФУ. + * Размеры буферов нужно понимать с учётом 16-битной ABI C2000. */ //#include "big_dsp_module.h" @@ -28,7 +28,7 @@ static char size_cmd15=1; void RS_RX_Handler(RS_DATA *rs_arr); void RS_TX_Handler(RS_DATA *rs_arr); -/** Îáðàáîò÷èê ïðåðûâàíèé UART - ïðèíàòî */ +/** Обработчик прерываний UART - принато */ interrupt void RSA_RX_Handler(void) { // Set interrupt priority: @@ -101,7 +101,7 @@ interrupt void RSB_TX_Handler(void) PieCtrlRegs.PIEIER9.all = TempPIEIER; } -/** Îáðàáîò÷èê ïðåðûâàíèé UART - ïðèíàòî */ +/** Обработчик прерываний UART - принато */ void RS_RX_Handler(RS_DATA *rs_arr) { char Rc; @@ -109,16 +109,16 @@ void RS_RX_Handler(RS_DATA *rs_arr) // led1_on(); - for(;;) // 'goto' ýòî íå îïåðàòîð àçûêà Ñ + for(;;) // 'goto' это не оператор азыка С { if(!rs_arr->SciRegs->SCIRXST.bit.RXRDY) // Receiver ready flag { PieCtrlRegs.PIEACK.bit.ACK9 |= 1; rs_arr->SciRegs->SCIFFRX.bit.RXFFINTCLR=1; // Clear INT flag - return; // êñòàòè ýòî åäèíñòâåííûé âûõîä èç ïðåðûâàíèà + return; // кстати это единственный выход из прерываниа } - Rc = rs_arr->SciRegs->SCIRXBUF.bit.RXDT; // ×èòàåì ñèìâîë â ëþáîì ñëó÷àå + Rc = rs_arr->SciRegs->SCIRXBUF.bit.RXDT; // Читаем символ в любом случае if(rs_arr->SciRegs->SCIRXST.bit.RXERROR) // Receiver error flag { @@ -128,110 +128,110 @@ void RS_RX_Handler(RS_DATA *rs_arr) 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) // дла RS485???????? { - // Èíèöèàëèçèðóåì ïåðåìåííûå è ôëàãè - rs_arr->RS_FlagBegin = true; // Æäåì çàãîëîâîê + // Инициализируем переменные и флаги + rs_arr->RS_FlagBegin = true; // Ждем заголовок rs_arr->RS_RecvLen = 0; rs_arr->RS_FlagSkiping = false; rs_arr->RS_HeaderCnt = 0; rs_arr->RS_Cmd = 0; } - 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 (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) || ((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->RS_Header[rs_arr->RS_HeaderCnt++] = Rc; // Первый байт + RS_SetBitMode(rs_arr,8); // перестроились в 8-бит режим } else { - rs_arr->RS_FlagSkiping = true; // Íå íàøåìó êîíòðîëëåðó - rs_arr->RS_FlagBegin = false; // îñòàëèñü â 9-áèò ðåæèìå + rs_arr->RS_FlagSkiping = true; // Не нашему контроллеру + rs_arr->RS_FlagBegin = false; // остались в 9-бит режиме // led1_off(); } } else { - rs_arr->RS_Header[rs_arr->RS_HeaderCnt++] = Rc; // Âòîðîé áàéò è ò.ä. + 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) { RS_Len[CMD_MODBUS_16] = (10+Rc); } - // åñëè âòîðîé áàéò - ýòî êîìàíäà + // если второй байт - это команда if (rs_arr->RS_HeaderCnt == 2) { 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) || ((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); // Получили все перестроились в 9-бит дла RS485? + rs_arr->RS_HeaderCnt = 0; // Потому что команда не та rs_arr->RS_FlagBegin = true; rs_arr->RS_FlagSkiping = false; rs_arr->RS_Cmd=0; // led1_off(); continue; } - if (rs_arr->RS_Cmd == CMD_LOAD) // Äëà ýòîé êîìàíäû çàãîëîâîê î÷åíü êîðîòêèé - rs_arr->RS_FlagBegin = false;// äàëüøå èäóò äàííûå + if (rs_arr->RS_Cmd == CMD_LOAD) // Дла этой команды заголовок очень короткий + rs_arr->RS_FlagBegin = false;// дальше идут данные } if( (rs_arr->RS_HeaderCnt >= RS_Len[rs_arr->RS_Cmd]) || (rs_arr->RS_HeaderCnt >= sizeof(rs_arr->RS_Header))) - { // Ïîëó÷èëè çàãîëîâîê - RS_SetBitMode(rs_arr,9); // Ïîëó÷èëè âñå ïåðåñòðîèëèñü â 9-áèò äëà RS485? + { // Получили заголовок + RS_SetBitMode(rs_arr,9); // Получили все перестроились в 9-бит дла RS485? rs_arr->RS_FlagBegin = false; rs_arr->RS_FlagSkiping = true; rs_arr->RS_DataReady = true; rs_arr->RS_Cmd=0; // led1_off(); } } } - else // Ïîòîê äàííûõ + else // Поток данных { 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; // Íà ïðîãðàììó íàäåéñà, à ñàì íå ïëîøàé + 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_PrevCmd != CMD_INITLOAD) continue; // Мы здесь оказались по какой-то чудовищной ошибке - if(rs_arr->RS_DataReady) // Åñëè äàííûå â îñíîâíîì öèêëå íå çàáðàíû, - { // òî ïðîïóñêàåì ñëåäóþùóþ ïîñûëêó - rs_arr->RS_FlagSkiping = true; // Èãíîðèðóåì äî ñëåäóþùåãî çàãîëîâêà + if(rs_arr->RS_DataReady) // Если данные в основном цикле не забраны, + { // то пропускаем следующую посылку + rs_arr->RS_FlagSkiping = true; // Игнорируем до следующего заголовка // led1_off(); continue; } RS_BytePtr = rs_arr->RS_RecvLen++ % 2; - if(RS_BytePtr) *rs_arr->pRS_RecvPtr++ |= Rc; // Ïîëó÷èëè ñëîâî + if(RS_BytePtr) *rs_arr->pRS_RecvPtr++ |= Rc; // Получили слово 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) // Конец посылки { 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); // Получили все данные перестроились в 9-бит дла RS485? + rs_arr->RS_FlagSkiping = true; // Игнорируем до следующего заголовка + rs_arr->RS_DataReady = true; // Флаг в основной цикл - данные получены // led1_off(); } } } } -/** Îáðàáîò÷èê ïðåðûâàíèé UART - ïîñëàíî */ +/** Обработчик прерываний UART - послано */ void RS_TX_Handler(RS_DATA *rs_arr) { char RS_BytePtr; @@ -241,19 +241,19 @@ void RS_TX_Handler(RS_DATA *rs_arr) { if(++rs_arr->RS_SendLen >= rs_arr->RS_SLength) { - enableUARTInt(rs_arr); /* Çàïðåùàåì ïðåðûâàíèà ïî ïåðåäà÷å */ + enableUARTInt(rs_arr); /* Запрещаем прерываниа по передаче */ } SCI_send(rs_arr,*(rs_arr->pRS_SendPtr++)); if(rs_arr->RS_SendLen >= rs_arr->RS_SLength) { 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++){} /* Пауза дла PC */ - RS_SetBitMode(rs_arr,9); /* Ïåðåäàëè âñå ïåðåñòðîèëèñü â 9-áèò äëà RS485?*/ - RS_Line_to_receive(rs_arr); /* ðåæèì ïðèåìà RS485 */ + RS_SetBitMode(rs_arr,9); /* Передали все перестроились в 9-бит дла RS485?*/ + RS_Line_to_receive(rs_arr); /* режим приема RS485 */ - rs_arr->flag_TIMEOUT_to_Send=false; /* ñáðîñèëè ôëàã îæèäàíèà òàéìàóòà */ + rs_arr->flag_TIMEOUT_to_Send=false; /* сбросили флаг ожиданиа таймаута */ } } else /* BM_PACKED */ @@ -262,7 +262,7 @@ void RS_TX_Handler(RS_DATA *rs_arr) RS_BytePtr = (rs_arr->RS_SendLen++) % 2; if(rs_arr->RS_SendLen >= rs_arr->RS_SLength) { - enableUARTInt(rs_arr); /* Çàïðåùàåì ïðåðûâàíèà ïî ïåðåäà÷å */ + enableUARTInt(rs_arr); /* Запрещаем прерываниа по передаче */ } if(RS_BytePtr) SCI_send(rs_arr, LOBYTE( *(rs_arr->pRS_SendPtr++) )); else SCI_send(rs_arr, HIBYTE( *rs_arr->pRS_SendPtr )); @@ -270,9 +270,9 @@ void RS_TX_Handler(RS_DATA *rs_arr) if(rs_arr->RS_SendLen >= rs_arr->RS_SLength) { 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 */ } } @@ -281,7 +281,7 @@ void RS_TX_Handler(RS_DATA *rs_arr) // rs_arr->SciRegs->SCIFFTX.bit.TXINTCLR=1; // Clear INT flag } -/** Èíèöèàëèçàöèà ìàññèâà äëèí êîìàíä */ +/** Инициализациа массива длин команд */ void setup_arr_cmd_length() { int i; @@ -307,89 +307,89 @@ void setup_arr_cmd_length() RS_Len[CMD_EXTEND] = 18; } -/** Íàñòðîéêà ðåæèìà ïðèåìà/ïåðåäà÷è */ +/** Настройка режима приема/передачи */ void RS_SetBitMode(RS_DATA *rs_arr,int n) { if(n == 8) { - RS_SetLineMode(rs_arr,8,'N',1); /* ðåæèì ëèíèè */ + RS_SetLineMode(rs_arr,8,'N',1); /* режим линии */ rs_arr->RS_Flag9bit=0; } if(n == 9) { - RS_SetLineMode(rs_arr,8,'N',1); /* ðåæèì ëèíèè */ + RS_SetLineMode(rs_arr,8,'N',1); /* режим линии */ rs_arr->RS_Flag9bit=1; } } -/** Ïîñûëêà áëîêà áàéòîâ. - Ïîñûëàåò ìàññèâà 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 */ -/* Ïåðåäà÷ó ïðîäîëæàåò TX ISR. Çäåñü åñòü ñòàðûå ïðîãðàììíûå ïàóçû - * è îæèäàíèÿ UART: íå âûçûâàòü èç CAN ISR èëè ñåêöèè àâòîìàòà ÑÈÔÓ. +/* Передачу продолжает TX ISR. Здесь есть старые программные паузы + * и ожидания UART: не вызывать из CAN ISR или секции автомата СИФУ. */ int RS_Send(RS_DATA *rs_arr,unsigned int *pBuf,unsigned long len) { unsigned int i; - for (i=0; i <= 30000; i++){} /* Ïàóçà äëà PC */ + for (i=0; i <= 30000; i++){} /* Пауза дла PC */ - RS_Line_to_send(rs_arr); /* ðåæèì ïåðåäà÷è RS485 */ + RS_Line_to_send(rs_arr); /* режим передачи RS485 */ - for (i=0; i <= 10000; i++){} /* Ïàóçà äëà PC */ + for (i=0; i <= 10000; i++){} /* Пауза дла PC */ - rs_arr->RS_SLength = len; /* Íàñòðàèâàåì ïåðåìåííûå */ + rs_arr->RS_SLength = len; /* Настраиваем переменные */ rs_arr->pRS_SendPtr = pBuf + 1; rs_arr->RS_SendBlockMode = BM_CHAR32; - RS_Wait4OK(rs_arr); /* Äîæèäàåìñà óõîäà */ - RS_SetBitMode(rs_arr,8); /* Îñòàëüíûå â 8-áèò ðåæèìå */ + RS_Wait4OK(rs_arr); /* Дожидаемса ухода */ + RS_SetBitMode(rs_arr,8); /* Остальные в 8-бит режиме */ - rs_arr->RS_SendLen = 1; /* Äâà áàéòà óæå ïåðåäàëè */ + rs_arr->RS_SendLen = 1; /* Два байта уже передали */ if(len > 1) { - enableUARTIntW(rs_arr); /* Ðàçðåøàåì ïðåðûâàíèà ïî ïåðåäà÷å */ - SCI_send(rs_arr, *pBuf); // Ïåðåäàåì âòîðîé áàéò ïî ïðåðûâàíèþ + enableUARTIntW(rs_arr); /* Разрешаем прерываниа по передаче */ + SCI_send(rs_arr, *pBuf); // Передаем второй байт по прерыванию } 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); // Передаем второй байт по прерыванию + 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 */ } return 0; } -// Ïîñûëêà áëîêà óïàêîâàííûõ áàéòîâ +// Посылка блока упакованных байтов int RS_BSend(RS_DATA *rs_arr,unsigned int *pBuf, unsigned long len) { - RS_Line_to_send(rs_arr); // ðåæèì ïåðåäà÷è RS485 + RS_Line_to_send(rs_arr); // режим передачи RS485 - rs_arr->RS_SLength = len; // Íàñòðàèâàåì ïåðåìåííûå + rs_arr->RS_SLength = len; // Настраиваем переменные rs_arr->pRS_SendPtr = pBuf; rs_arr->RS_SendBlockMode = BM_PACKED; - RS_Wait4OK(rs_arr); // Îæèäàåì î÷èñòêè è óõîäà ïîñëåäíåãî áàéòà - RS_SetBitMode(rs_arr,8); /* Îñòàëüíûå â 8-áèò ðåæèìå */ + RS_Wait4OK(rs_arr); // Ожидаем очистки и ухода последнего байта + RS_SetBitMode(rs_arr,8); /* Остальные в 8-бит режиме */ - rs_arr->RS_SendLen = 1; // Îäèí áàéò óæå ïåðåäàëè + rs_arr->RS_SendLen = 1; // Один байт уже передали - enableUARTIntW(rs_arr); /* Ðàçðåøàåì ïðåðûâàíèà ïî ïåðåäà÷å */ + enableUARTIntW(rs_arr); /* Разрешаем прерываниа по передаче */ - SCI_send(rs_arr,HIBYTE(*pBuf));// Ïåðåäàåì ïåðâûé áàéò + SCI_send(rs_arr,HIBYTE(*pBuf));// Передаем первый байт return 0; } -/** Óñòàíàâëèâàåò ñêîðîñòü îáìåíà. - @param speed ñêîðîñòü RS â áîä */ -/** Óñòàíàâëèâàåò ñêîðîñòü îáìåíà. - @param speed ñêîðîñòü RS â áîä */ +/** Устанавливает скорость обмена. + @param speed скорость RS в бод */ +/** Устанавливает скорость обмена. + @param speed скорость RS в бод */ void RS_SetLineSpeed(RS_DATA *rs_arr,unsigned long speed) { long SciBaud; @@ -403,7 +403,7 @@ void RS_SetLineSpeed(RS_DATA *rs_arr,unsigned long speed) } -/** Èíèöèàëèçàöèà ïîñëåäîâàòåëüíîãî ïîðòà */ +/** Инициализациа последовательного порта */ void create_uart_vars(char size_cmd15_set) { size_cmd15=size_cmd15_set; @@ -413,7 +413,7 @@ void create_uart_vars(char size_cmd15_set) -/** Èíèöèàëèçàöèà ïîñëåäîâàòåëüíîãî ïîðòà */ +/** Инициализациа последовательного порта */ void setup_uart(char commnumber, unsigned long speed_baud) { @@ -478,14 +478,14 @@ void setup_uart(char commnumber, unsigned long speed_baud) SciRegs->SCICTL1.bit.RXENA=1; SciRegs->SCIFFTX.bit.SCIFFENA=0; // fifo off - SciRegs->SCIFFRX.bit.RXFFIL=1; // Äëèíà íàèìåíüøåé êîìàíäû + SciRegs->SCIFFRX.bit.RXFFIL=1; // Длина наименьшей команды 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_Line_to_receive(rs_arr); // режим приема RS485 + enableUARTInt(rs_arr); // разрешение прерываний UART RS_SetBitMode(rs_arr,9); - rs_arr->RS_PrevCmd = 0; // íå áûëî íèêàêèõ êîìàíä + rs_arr->RS_PrevCmd = 0; // не было никаких команд rs_arr->flag_TIMEOUT_to_Send = 0; rs_arr->flag_LEADING = 0; @@ -493,10 +493,10 @@ void setup_uart(char commnumber, unsigned long speed_baud) 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 количество стоповых бит */ void RS_SetLineMode(RS_DATA *rs_arr, int bit, char parity, int stop) { volatile struct SCI_REGS *SciRegs; @@ -539,7 +539,7 @@ void clear_timer_rs_live(RS_DATA *rs_arr) rs_arr->time_wait_rs_out=0; } -/* ïðîâåðêà íà æèâó÷åñòü RS */ +/* проверка на живучесть RS */ void test_rs_live(RS_DATA *rs_arr) { /* if (rs_arr->time_wait_rs_out < RS_TIME_OUT) @@ -547,6 +547,6 @@ void test_rs_live(RS_DATA *rs_arr) 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); }*/ } diff --git a/Source/Internal/bios.c b/Source/Internal/bios.c index f16d6ad..717a620 100644 --- a/Source/Internal/bios.c +++ b/Source/Internal/bios.c @@ -1,8 +1,8 @@ -/* Ñëóæåáíûå êîìàíäû äîñòóïà ê ïàìÿòè è çàãðóçêè. get_command - * ïðîâåðÿåò çàâåðø¸ííûé RS-êàäð è CRC ïåðåä äèñïåò÷åðèçàöèåé â main. - * Ïðîèçâîëüíàÿ çàïèñü ïàìÿòè ñåðâèñíîé êîìàíäîé íå ïðîõîäèò - * àâòîìàò ôðîíòîâ ÑÈÔÓ. Ôîðìàò CMD_* ñîãëàñîâàí ñ çàãðóç÷èêîì ÏÊ; - * íåëüçÿ ïåðåíóìåðîâûâàòü êîìàíäû ïðè ðàñøèðåíèè ïðîòîêîëà. +/* Служебные команды доступа к памяти и загрузки. get_command + * проверяет завершённый RS-кадр и CRC перед диспетчеризацией в main. + * Произвольная запись памяти сервисной командой не проходит + * автомат фронтов СИФУ. Формат CMD_* согласован с загрузчиком ПК; + * нельзя перенумеровывать команды при расширении протокола. */ #include "DSP2833x_Device.h" // DSP2833x Headerfile Include File #include "RS485.h" @@ -14,14 +14,14 @@ //#include "spartan_tools.h" //#include "big_dsp_module.h" -int flag_DEBUG = false; /* Ôëàã îòëàäî÷íîãî ðåæèìà */ +int flag_DEBUG = false; /* Флаг отладочного режима */ //static unsigned int *RecvPtr; -//static int BS_LoadOK = false; /** Ôëàã óñïåøíîñòè ïðèåìà áëîêà */ +//static int BS_LoadOK = false; /** Флаг успешности приема блока */ /**********************************************************/ -/* Ïðîòîòèïû ôóíêöèé, èñïîëüçóåìûõ è îïðåäåëåííûõ â ôàéëå */ +/* Прототипы функций, используемых и определенных в файле */ /**********************************************************/ //static int _getbyte(int *addr, int offs); @@ -36,60 +36,60 @@ void write_memory(unsigned long addr, unsigned int data) } -/** Âîçâðàùàåò íîìåð êîììàíäû, åñëè åñòü èëè -1 åñëè òðàíçàêöèé íå áûëî */ +/** Возвращает номер комманды, если есть или -1 если транзакций не было */ int get_command(RS_DATA *rs_arr) { int cmd; unsigned int crc, rcrc; - if(rs_arr->RS_DataReady) // Äàííûå ïî RS ïðèøëè + if(rs_arr->RS_DataReady) // Данные по RS пришли { rs_arr->RS_DataReady = false; - cmd = rs_arr->RS_Header[1]; // Ïðî÷èòàëè íîìåð êîìàíäû + cmd = rs_arr->RS_Header[1]; // Прочитали номер команды - // Ïðîâåðàåì äëèíó êîìàíäû äëà ñ÷èòûâàíèà CRC + // Провераем длину команды дла считываниа CRC if((RS_Len[cmd]<3) || (RS_Len[cmd]>MAX_RECEIVE_LENGTH)) { - RS_Line_to_receive(rs_arr); // ðåæèì ïðèåìà RS485 + RS_Line_to_receive(rs_arr); // режим приема RS485 RS_SetBitMode(rs_arr,9); return -1; } - if(cmd == CMD_LOAD) // Åñëè êîìàíäà çàãðóçêè + if(cmd == CMD_LOAD) // Если команда загрузки { rs_arr->RS_PrevCmd = cmd; - return cmd; // Íåò ïðîâåðêè crc + return cmd; // Нет проверки crc } - else // Âñå îñòàëüíûå êîìàíäû + else // Все остальные команды { - // Ñ÷èòûâàåì crc èç ïîñûëêè + // Считываем crc из посылки crc = (rs_arr->RS_Header[RS_Len[cmd]-1] << 8) | (rs_arr->RS_Header[RS_Len[cmd]-2]) ; } - // Ðàññ÷èòûâàåì crc èç ïîñûëêè + // Рассчитываем crc из посылки rcrc = 0xffff; rcrc = get_crc_16( rcrc, rs_arr->RS_Header, (RS_Len[cmd]-2) ); - if(crc == rcrc) // Ïðîâåðàåì crc + if(crc == rcrc) // Провераем crc { rs_arr->RS_PrevCmd = cmd; return cmd; } else { - RS_Line_to_receive(rs_arr); // ðåæèì ïðèåìà RS485 + RS_Line_to_receive(rs_arr); // режим приема RS485 RS_SetBitMode(rs_arr,9); } } return -1; } -/** Ñòàíäàðòíûé îòâåò, áåç ïàðàìåòðîâ */ +/** Стандартный ответ, без параметров */ void Answer(RS_DATA *rs_arr,int n) { int crc; - flag_DEBUG = true; // Ôëàã îòëàäî÷íîãî ðåæèìà + flag_DEBUG = true; // Флаг отладочного режима rs_arr->buffer[0] = rs_arr->addr_recive; //CNTRL_ADDR; rs_arr->buffer[1] = n; @@ -105,7 +105,7 @@ void Answer(RS_DATA *rs_arr,int n) RS_Send(rs_arr,rs_arr->buffer, 6); } -/* Âíóòðåííàà ô-öèà */ +/* Внутреннаа ф-циа */ static char _getbyte(unsigned int *addr, int32 offs) { unsigned int *address; @@ -118,7 +118,7 @@ static char _getbyte(unsigned int *addr, int32 offs) } -/* íà÷àëüíûå óñòàíîâêè (íå ðàáîòàåò)*/ +/* начальные установки (не работает)*/ void init(RS_DATA *rs_arr) { /* @@ -141,13 +141,13 @@ void init(RS_DATA *rs_arr) */ } -/**@name Êîììàíäû -* Êîììàíäû, âûçûâàåìûå ÷åðåç ïîñëåäîâàòåëüíûé êàíàë +/**@name Комманды +* Комманды, вызываемые через последовательный канал */ //@{ -/** Èíèöèèðîâàòü çàãðóçêó áëîêà. - Íàñòðàèâàåò ïðèåì áëîêà äàííûõ */ +/** Инициировать загрузку блока. + Настраивает прием блока данных */ void initload(RS_DATA *rs_arr) { unsigned long Address; @@ -171,8 +171,8 @@ void initload(RS_DATA *rs_arr) Answer(rs_arr,CMD_INITLOAD); } -/** Çàãðóçêà áëîêà. - Âûçûâàåòñà ïîñëå çàãðóçêè áëîêà ÷åðåç RS */ +/** Загрузка блока. + Вызываетса после загрузки блока через RS */ void load(RS_DATA *rs_arr) { unsigned int rcrc, crc; @@ -197,27 +197,27 @@ void load(RS_DATA *rs_arr) else { rs_arr->BS_LoadOK = false; - RS_Line_to_receive(rs_arr); // ðåæèì ïðèåìà RS485 + RS_Line_to_receive(rs_arr); // режим приема RS485 RS_SetBitMode(rs_arr,9); } } -/** Âûïîëíèòü ïðîãðàììó â ôîðìàòå Serial Boot. - @precondition Äîëæíà áûòü ïðîèçâåäåíà çàãðóçêà áëîêà - Àäðåñ ïðîãðàììû áåðåòñà èç çàãîëîâêà è - ñðàâíèâàåòñà ñ ïåðåìåííîé RecvPtr, çàïîëíàåìîé â ô-öèè load +/** Выполнить программу в формате Serial Boot. + @precondition Должна быть произведена загрузка блока + Адрес программы беретса из заголовка и + сравниваетса с переменной RecvPtr, заполнаемой в ф-ции load @see load */ void run (RS_DATA *rs_arr) { return; } -/** Ïðî÷èòàòü à÷åéêó ïàìàòè */ +/** Прочитать ачейку памати */ void peek(RS_DATA *rs_arr) { unsigned long Address; unsigned int Data, crc; - flag_DEBUG = true; // Ôëàã îòëàäî÷íîãî ðåæèìà + flag_DEBUG = true; // Флаг отладочного режима Address = rs_arr->RS_Header[5] & 0xFF; Address = (Address<<8) | (rs_arr->RS_Header[4] & 0xFF); @@ -250,7 +250,7 @@ void peek(RS_DATA *rs_arr) } -/** Çàïèñàòü â à÷åéêó ïàìàòè */ +/** Записать в ачейку памати */ void poke(RS_DATA *rs_arr) { unsigned long Address; @@ -272,12 +272,12 @@ void poke(RS_DATA *rs_arr) Answer(rs_arr,CMD_POKE); } -/** Ïåðåäàòü áëîê ïàìàòè */ +/** Передать блок памати */ void upload(RS_DATA *rs_arr) { int32 Address, Length, crc; - no_write = 1; // Ôëàã îòëàäî÷íîãî ðåæèìà + no_write = 1; // Флаг отладочного режима // stopp=1; Address = rs_arr->RS_Header[5] & 0xFF; @@ -297,10 +297,10 @@ void upload(RS_DATA *rs_arr) crc = get_crc_16( crc, rs_arr->buffer, 2); crc = get_crc_16b( crc, (unsigned int *)Address, Length); - RS_Send(rs_arr,rs_arr->buffer, 1); // <=2 áàéò ïî ôëàãó + 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(rs_arr,rs_arr->buffer, 1); // <=2 байт по флагу RS_Wait4OK(rs_arr); RS_BSend(rs_arr,(unsigned int*)Address, Length); @@ -314,21 +314,21 @@ void upload(RS_DATA *rs_arr) } -/** Ïðîøèòü XILINX. - @precondition Äîëæíà áûòü ïðîèçâåäåíà çàãðóçêà áëîêà - Àäðåñ è äëèíà ïðîøèâêè áåðåòñà èç çàãîëîâêà è - ñðàâíèâàåòñà ñ ïåðåìåííûìè RecvPtr è Length, çàïîëíàåìûìè â ô-öèè load, - òàê æå ñìîòðèò ìàãè÷åñêîå ñëîâî â íà÷àëå ïðîøèâêè +/** Прошить XILINX. + @precondition Должна быть произведена загрузка блока + Адрес и длина прошивки беретса из заголовка и + сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load, + так же смотрит магическое слово в начале прошивки @see load */ void xflash(RS_DATA *rs_arr) { return; } -/** Ïðîøèòü TMS. - @precondition Äîëæíà áûòü ïðîèçâåäåíà çàãðóçêà áëîêà - Àäðåñ è äëèíà ïðîøèâêè áåðåòñà èç çàãîëîâêà è - ñðàâíèâàåòñà ñ ïåðåìåííûìè RecvPtr è Length, çàïîëíàåìûìè â ô-öèè load +/** Прошить TMS. + @precondition Должна быть произведена загрузка блока + Адрес и длина прошивки беретса из заголовка и + сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load @see load */ void tflash(RS_DATA *rs_arr) { @@ -337,7 +337,7 @@ void tflash(RS_DATA *rs_arr) /* 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; } @@ -362,7 +362,7 @@ void tflash(RS_DATA *rs_arr) 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; } @@ -374,10 +374,10 @@ void tflash(RS_DATA *rs_arr) return; } -/** Ïðîøèòü TMS. - @precondition Äîëæíà áûòü ïðîèçâåäåíà çàãðóçêà áëîêà - Àäðåñ è äëèíà ïðîøèâêè áåðåòñà èç çàãîëîâêà è - ñðàâíèâàåòñà ñ ïåðåìåííûìè RecvPtr è Length, çàïîëíàåìûìè â ô-öèè load +/** Прошить TMS. + @precondition Должна быть произведена загрузка блока + Адрес и длина прошивки беретса из заголовка и + сравниваетса с переменными RecvPtr и Length, заполнаемыми в ф-ции load @see load */ void extendbios(RS_DATA *rs_arr) { @@ -403,10 +403,10 @@ void extendbios(RS_DATA *rs_arr) switch ( code ) { - // Ïðîøèâàåì EPROM Èç RAM + // Прошиваем EPROM Из RAM case 4: Seeprom_write(Address1,(unsigned int*)Address2,Length); break; - // ×èòàåì èç EPROM â RAM + // Читаем из EPROM в RAM case 5: Seeprom_read(Address1,(unsigned int*)Address2,Length); break; diff --git a/Source/Internal/cntrl_adr.c b/Source/Internal/cntrl_adr.c index 1328ae0..f9dd627 100644 --- a/Source/Internal/cntrl_adr.c +++ b/Source/Internal/cntrl_adr.c @@ -1,7 +1,7 @@ -/* Àäðåñàöèÿ ïîñëåäîâàòåëüíîãî ïðîòîêîëà. set_cntrl_addr çàäà¸ò - * ñîáñòâåííûé è îáùèé àäðåñ. CAN ID âû÷èñëÿåòñÿ îòäåëüíî èç Mode. - * Îáùèé RS-àäðåñ íå çàìåíÿåò ñîáñòâåííûé âî âñåõ îòâåòàõ: äëÿ - * ëîããåðà SetGUI èñïîëüçîâàòü ñîáñòâåííûé àäðåñ ïëàòû (îáû÷íî 5/6). +/* Адресация последовательного протокола. set_cntrl_addr задаёт + * собственный и общий адрес. CAN ID вычисляется отдельно из Mode. + * Общий RS-адрес не заменяет собственный во всех ответах: для + * логгера SetGUI использовать собственный адрес платы (обычно 5/6). */ #include "cntrl_adr.h" @@ -11,25 +11,25 @@ #define ADDR_UNIVERSAL_DEF 10 -/** Óñòàíîâêà àäðåñà êîíòðîëëåðà äëà ïîñûëêè âñåì ÀÈÍàì */ +/** Установка адреса контроллера дла посылки всем АИНам */ int ADDR_FOR_ALL = ADDR_FOR_ALL_DEF; -/** Óñòàíîâêà àäðåñà êîíòðîëëåðà äëà ïîñûëêè îòâåòà */ +/** Установка адреса контроллера дла посылки ответа */ const int ADDR_ANSWER = ADDR_ANSWER_DEF; -/** Óñòàíîâêà àäðåñà òåðìèíàëà äëà ïîñûëêè îòâåòà */ +/** Установка адреса терминала дла посылки ответа */ const int ADDR_TERMINAL = ADDR_TERMINAL_DEF; -/* Óíèâåðñàëüíûé àäðåñ êîíòðîëëåðà */ +/* Универсальный адрес контроллера */ const int CNTRL_ADDR_UNIVERSAL=ADDR_UNIVERSAL_DEF; -/* Àäðåñ êîíòðîëëåðà */ +/* Адрес контроллера */ int CNTRL_ADDR=1; int cntr_addr_c; int cntr_addr_c_all; -/** Óñòàíîâêà àäðåñà êîíòðîëëåðà äëà ïðîøèâêè */ +/** Установка адреса контроллера дла прошивки */ void set_cntrl_addr (int cntrl_addr,int cntrl_addr_for_all) { CNTRL_ADDR = cntrl_addr; diff --git a/Source/Internal/crc16.c b/Source/Internal/crc16.c index 0e32263..0b7e077 100644 --- a/Source/Internal/crc16.c +++ b/Source/Internal/crc16.c @@ -1,8 +1,8 @@ -/* CRC êàäðîâ îáìåíà è ïàðàìåòðîâ EEPROM. get_crc_16 ðàáîòàåò - * ñ ïðåäñòàâëåíèåì áóôåðà ïðîòîêîëà, get_crc16 îáðàáàòûâàåò îáà - * áàéòà êàæäîãî ñëîâà ïàðàìåòðîâ. Ïîðÿäîê áàéòîâ ñóùåñòâåíåí. - * Íåëüçÿ çàìåíÿòü ýòè ôóíêöèè ðåàëèçàöèåé äëÿ ÏÊ áåç ïðîâåðêè - * ïðåäñòàâëåíèÿ äàííûõ è îñîáåííîñòåé 16-áèòíîé ABI C2000. +/* CRC кадров обмена и параметров EEPROM. get_crc_16 работает + * с представлением буфера протокола, get_crc16 обрабатывает оба + * байта каждого слова параметров. Порядок байтов существенен. + * Нельзя заменять эти функции реализацией для ПК без проверки + * представления данных и особенностей 16-битной ABI C2000. */ #include "crc16.h" #define MAKE_TABS 0 /* Builds tables below */ diff --git a/Source/Internal/filter_bat2.c b/Source/Internal/filter_bat2.c index b462f22..9d54ecd 100644 --- a/Source/Internal/filter_bat2.c +++ b/Source/Internal/filter_bat2.c @@ -1,7 +1,7 @@ -/* Ðåêóðñèâíûé ôèëüòð. FILTERBAT õðàíèò êîýôôèöèåíòû è èñòîðèþ - * äâóõ âõîäîâ/âûõîäîâ; êàæäûé âûçîâ èçìåíÿåò ïåðåäàííûé ýêçåìïëÿð. - * Íåçàâèñèìûì êàíàëàì íóæíû îòäåëüíûå ñîñòîÿíèÿ. Ñèíõðîíèçàöèè - * çäåñü íåò: ñìåíó êîýôôèöèåíòîâ ñîãëàñîâûâàåò âûçûâàþùèé êîä. +/* Рекурсивный фильтр. FILTERBAT хранит коэффициенты и историю + * двух входов/выходов; каждый вызов изменяет переданный экземпляр. + * Независимым каналам нужны отдельные состояния. Синхронизации + * здесь нет: смену коэффициентов согласовывает вызывающий код. */ #include "filter_bat2.h" diff --git a/Source/Internal/kanal.c b/Source/Internal/kanal.c index b45382c..90b0db6 100644 --- a/Source/Internal/kanal.c +++ b/Source/Internal/kanal.c @@ -1,7 +1,7 @@ -/* Ïðîãðàììíûé êàíàë èíäèêàöèè. digits/readr çàäàþò ñèìâîëû è âûáîð - * ýëåìåíòîâ, DCLK/DOUT è kanal_Send ôîðìèðóþò ïîñëåäîâàòåëüíîñòü GPIO. - * Ýòî äðóãîé èíòåðôåéñ, ÷åì dCLK/dCS â DAC.c. Ïîõîæèå èìåíà íå - * îçíà÷àþò îáùèé ÖÀÏ èëè îáùèé âûõîä çàïóñêà íàãðóçêè. +/* Программный канал индикации. digits/readr задают символы и выбор + * элементов, DCLK/DOUT и kanal_Send формируют последовательность GPIO. + * Это другой интерфейс, чем dCLK/dCS в DAC.c. Похожие имена не + * означают общий ЦАП или общий выход запуска нагрузки. */ #include "DSP2833x_Device.h" // DSP281x Headerfile Include File #include "DSP2833x_SWPrioritizedIsrLevels.h" @@ -88,7 +88,7 @@ void kanal_Send(int adr, long dat, int dot) long Word,data,aliq_part,dg[4]; int i,j,bit,byt,addr,sgn=0,punkt=0,aliq_len=0,full_len, isdot=0; - if(adr>1) // Ëàìïî÷êè + if(adr>1) // Лампочки { Word =dat; } @@ -139,7 +139,7 @@ void kanal_Send(int adr, long dat, int dot) for(i=3;i>0;i--) { if((dg[i]==0)&&(i!=dot)) - dg[i]=0xF; // Ýòî çíà÷èò ïóñòî + dg[i]=0xF; // Это значит пусто else break; } @@ -148,7 +148,7 @@ void kanal_Send(int adr, long dat, int dot) { if( (dg[i]==0xF)||(i==3)) { - dg[i]=0xA; // Ýòî çíà÷èò ìèíóñ + dg[i]=0xA; // Это значит минус break; } } diff --git a/Source/Internal/measure.c b/Source/Internal/measure.c index 4909173..96a2ad6 100644 --- a/Source/Internal/measure.c +++ b/Source/Internal/measure.c @@ -1,8 +1,8 @@ -/* Èçìåðåíèÿ, äèàãíîñòèêà è ïåðèîäè÷åñêîå îáñëóæèâàíèå. ADC ISR - * ïîñòàâëÿåò âûáîðêè; òàéìåð 1 îáñëóæèâàåò èíäèêàöèþ è òåëåìåòðèþ. - * Äëÿ dsk_LOAD îí ñíà÷àëà çàâåðøàåò èìïóëüñ ÑÈÔÓ, çàòåì âûçûâàåò - * ðàñ÷¸ò ÖÀÏ è ñíèìîê ëîããåðà. ×àñòîòû íàõîäÿòñÿ â measure.h; - * ïðè èõ èçìåíåíèè òðåáóåòñÿ ïåðåñ÷èòàòü çàâèñèìûå èíòåðâàëû. +/* Измерения, диагностика и периодическое обслуживание. ADC ISR + * поставляет выборки; таймер 1 обслуживает индикацию и телеметрию. + * Для dsk_LOAD он сначала завершает импульс СИФУ, затем вызывает + * расчёт ЦАП и снимок логгера. Частоты находятся в measure.h; + * при их изменении требуется пересчитать зависимые интервалы. */ #include "DSP2833x_Device.h" // DSP2833x Headerfile Include File #include "DSP2833x_SWPrioritizedIsrLevels.h" @@ -20,13 +20,13 @@ #include "message.h" #include "log_to_mem.h" -#include // Ýòî ÷òîáû ìåðèòü àìïëèòóäó! sqrt áåç ýòîãî áóäåò êðèâ!!! +#include // Это чтобы мерить амплитуду! sqrt без этого будет крив!!! unsigned int CanPowse=CANPOWSE,CanGO=0; unsigned int Maska[2][8]; -int TPL_CANS=0; // Êîëè÷åñòâî òåìïåðàòóðíûõ êàíàëîâ +int TPL_CANS=0; // Количество температурных каналов int tpl_cans=0; int cal_addr=0; @@ -53,23 +53,23 @@ int Curr_Edge; float powK[] = { - 0.127, // ïèòàíèå 380 - 0.127, // ïèòàíèå 380 + 0.127, // питание 380В + 0.127, // питание 380В - 1.000, // òîê - 1.000, // íàïðàæåíèå + 1.000, // ток + 1.000, // напражение - 0.0076, // ïèòàíèå 31 - 0.0076, // ïèòàíèå 24 - 0.0076, // ïèòàíèå 24 - 0.0076, // ïèòàíèå 15 - 1.0000, // òåðìîäàò÷èê ìåëêîñõåìà + 0.0076, // питание 31В + 0.0076, // питание 24В + 0.0076, // питание 24В + 0.0076, // питание 15В + 1.0000, // термодатчик мелкосхема }; 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 íàïðàæ +FILTERBAT adc_filter[20+4]; // макс.TPL*2 + 4 калибр +FILTERBAT out_filter[20+4]; // макс.TPL*2 + 4 напраж +FILTERBAT zer_filter[4]; // 4 напраж long sens_count[24+4]; @@ -79,7 +79,7 @@ float K_T1,K_T2; interrupt void cpu_timer1_isr_SENS(void); /********************************************************************/ -/* Ðàñ÷åò ìîäóëà òîêà èç ïîêàçàíèé äâóõ ôàç */ +/* Расчет модула тока из показаний двух фаз */ /********************************************************************/ float im_calc(float ia,float ib) { @@ -115,8 +115,8 @@ interrupt void cpu_timer1_isr_SENS(void) int TST; -#define err_lamp work_lamp // ýòî äëà øêàïà, -#define alm_lamp heat_lamp // ÷òîá áûëî ïîíàòíåå +#define err_lamp work_lamp // это дла шкапа, +#define alm_lamp heat_lamp // чтоб было понатнее EALLOW; CpuTimer1.InterruptCount++; @@ -140,10 +140,10 @@ interrupt void cpu_timer1_isr_SENS(void) if(Desk==dsk_LOAD) { - /* Ñíÿòü èñò¸êøèé èìïóëüñ äî ðàñ÷¸òà ÖÀÏ, íåçàâèñèìî îò main. */ + /* Снять истёкший импульс до расчёта ЦАП, независимо от main. */ UMP_pulse_tick(); Load_runner(); - /* Áàçà âðåìåíè 1 ìñ; ñíèìîê ñîäåðæèò ðåçóëüòàò òåêóùåãî øàãà ÖÀÏ. */ + /* База времени 1 мс; снимок содержит результат текущего шага ЦАП. */ ump_log_tick(); return; } @@ -156,9 +156,9 @@ interrupt void cpu_timer1_isr_SENS(void) ((Desk==dsk_COMM) && heat_lamp) ) set_RES_OUT_1(); else clear_RES_OUT_1(); - if(work_lamp) set_LED_OUT_1(); // Îíà æå err_lamp äëà øêàïà + if(work_lamp) set_LED_OUT_1(); // Она же err_lamp дла шкапа else clear_LED_OUT_1(); - if(heat_lamp) set_LED_OUT_2(); // Îíà æå alm_lamp äëà øêàïà + if(heat_lamp) set_LED_OUT_2(); // Она же alm_lamp дла шкапа else clear_LED_OUT_2(); } @@ -360,37 +360,37 @@ void Init_packMask() switch(Desk) { case dsk_EPLT: - Maska[m_SLOW][0]|= 0x000F; // Ïîëó÷åííîå - Maska[m_SLOW][6]|= 0x01FC; // ßðêîñòü ëàìï è îäèíî÷åñòâî + Maska[m_FAST][0]|= 0x000F; // Включает R0–R3 в быструю обратную связь VPU для ПМ67; четыре младших бита маски исключают ожидание медленного обхода параметров. + Maska[m_SLOW][6]|= 0x01FC; // Яркость ламп и одиночество break; default: for(i=0;itpl_cans) return; -// Kun èìåííî ÷òîá ñêîìïåíñèðîâàòü íå÷åòíîñòü +// Kun именно чтоб скомпенсировать нечетность if(kun&1) Numb = (Numb-K300_2)*K_T2+ZERO; else Numb = (Numb-K300_1)*K_T1+ZERO; } @@ -706,7 +706,7 @@ sens_data[chan+8] = adc_table_tpl[chan]; error.all = 0; no_ignor = !sens_error[chan].bit.Ignor; -// Îáðûâ èëè íåèñïðàâíîñòü +// Обрыв или неисправность if(Temper==-20 || Temper==200) { error.bit.Tear = 1; @@ -714,7 +714,7 @@ sens_data[chan+8] = adc_table_tpl[chan]; } else -// Ïåðåãðåâ +// Перегрев if(((Temper>sens_hi_edge[chan]-Cooling) && (sens_error[chan].bit.Hyper)) || (Temper>sens_hi_edge[chan]) ) { @@ -724,7 +724,7 @@ sens_data[chan+8] = adc_table_tpl[chan]; } else -// Ïðåäóïðåæäåíèå ïî òåìïåðàòóðå +// Предупреждение по температуре if(Temper>sens_lo_edge[chan]) { error.bit.Over = 1; @@ -796,7 +796,7 @@ void Power_count(int chan) error.bit.Stop = 1; } } -/* Ïîâûøåííîå íàïðàæåíèå +/* Повышенное напражение if(Power > sens_hi_edge[chan]) { error.bit.Hyper = 1; diff --git a/Source/Internal/message.c b/Source/Internal/message.c index 6629111..1b18f61 100644 --- a/Source/Internal/message.c +++ b/Source/Internal/message.c @@ -65,7 +65,7 @@ void Default_params() } else { - Cancount[m_FAST] = 10; // пауза между посылками CAN + Cancount[m_FAST] = 12; // пауза между посылками CAN Brightness = 8; } diff --git a/Source/Internal/peripher.c b/Source/Internal/peripher.c index ecda79c..d99e024 100644 --- a/Source/Internal/peripher.c +++ b/Source/Internal/peripher.c @@ -205,15 +205,14 @@ void get_Buttons() if(Desk==dsk_EPLT) { - /* Фильтрует TESTLAMP на GPIO26 накопителем INcount0 с порогом 1000 опросов главного цикла; прежний bTestLamp удерживает режим теста при кратких провалах входа до подтверждения нового состояния фильтром. */ - bTestLamp = er_anal(GpioDataRegs.GPADAT.bit.GPIO26, &INcount0, 1000, bTestLamp); + /* Таймер пульта включает местный тест после непрерывного удержания TESTLAMP в течение 2 с; число проходов main не влияет на задержку. */ if(GpioDataRegs.GPADAT.bit.GPIO27) butt +=0x0001; if(GpioDataRegs.GPADAT.bit.GPIO24) butt +=0x0002; if(GpioDataRegs.GPBDAT.bit.GPIO53) butt +=0x0004; if(GpioDataRegs.GPBDAT.bit.GPIO50) butt +=0x0008; - if(GpioDataRegs.GPADAT.bit.GPIO26) butt +=0x0010; + if(GpioDataRegs.GPADAT.bit.GPIO26) butt +=0x0010; // Передаёт исходное состояние TESTLAMP в бите 4 слова Inputs (0x10), по которому основной контроллер вызывает сброс ошибок при коротком нажатии. if(GpioDataRegs.GPADAT.bit.GPIO23) butt +=0x0020; if(GpioDataRegs.GPBDAT.bit.GPIO52) butt +=0x0040; if(GpioDataRegs.GPADAT.bit.GPIO4 ) butt +=0x0080; diff --git a/Source/Internal/pulto.c b/Source/Internal/pulto.c index 2f2ee91..2d3b79e 100644 --- a/Source/Internal/pulto.c +++ b/Source/Internal/pulto.c @@ -1,7 +1,7 @@ -/* Ëîãèêà ïóëüòà è èíäèêàöèè. cpu_timer1_isr_PULT âûáèðàåòñÿ - * òîëüêî äëÿ dsk_EPLT; äëÿ íàãðóçêè ðàáîòàåò îáðàáîò÷èê èç measure.c. - * Lonely îòíîñèòñÿ ê àêòèâíîñòè îáìåíà, íå ê çàäåðæêå ïóñêà ÑÈÔÓ. - * Íå ñìåøèâàòü ôóíêöèè äâóõ ðåæèìîâ ïðè èçìåíåíèè îáùåãî òàéìåðà. +/* Логика пульта и индикации. cpu_timer1_isr_PULT выбирается + * только для dsk_EPLT; для нагрузки работает обработчик из measure.c. + * Lonely относится к активности обмена, не к задержке пуска СИФУ. + * Не смешивать функции двух режимов при изменении общего таймера. */ #include "DSP2833x_Device.h" // DSP2833x Headerfile Include File #include "DSP2833x_SWPrioritizedIsrLevels.h" @@ -43,6 +43,7 @@ interrupt void cpu_timer1_isr_PULT(void) static int cownt=0,count_bright; unsigned int light=0, i; unsigned int Alone = 20*READY_FREQ; + static unsigned int test_lamp_hold_ticks = 0; // Считает длительность непрерывного нажатия GPIO26 в тиках READY_FREQ; насыщение на пороге исключает переполнение при долгом удержании. EALLOW; CpuTimer1.InterruptCount++; @@ -60,8 +61,8 @@ interrupt void cpu_timer1_isr_PULT(void) toggle_ONLINE(); - toggle_RES_OUT_1(); // òèïà ýòî ãîòîâíîñòü - toggle_RES_OUT_2(); // íà âñàêèé + toggle_RES_OUT_1(); // Формирует на резервном выходе 1 меандр с частотой READY_FREQ/2 (500 Гц) для контроля работы таймера пульта. + toggle_RES_OUT_2(); // Дублирует переключения таймера на резервном выходе 2 с частотой READY_FREQ/2 (500 Гц) для контроля активности пульта. if(++Lonely > Alone) Lonely = Alone; @@ -74,6 +75,14 @@ interrupt void cpu_timer1_isr_PULT(void) if(++cownt>2) cownt=0; + if(GpioDataRegs.GPADAT.bit.GPIO26) // Единица GPIO26 означает нажатие TESTLAMP, как и бит 4 Inputs; таймер измеряет удержание независимо от загрузки main. + { // Накапливает время текущего нажатия перед включением местного теста ламп. + if(test_lamp_hold_ticks < 2U * (unsigned int)READY_FREQ) // Две секунды при частоте READY_FREQ Гц соответствуют 2000 тикам текущего таймера 1000 Гц. + test_lamp_hold_ticks++; // Добавляет один период таймера (1 мс); после достижения порога счётчик сохраняет значение до отпускания. + } // Завершает обработку удерживаемой кнопки. + else test_lamp_hold_ticks = 0; // При отпускании обнуляет время, чтобы отдельные короткие нажатия не складывались в длинное. + bTestLamp = (test_lamp_hold_ticks >= 2U * (unsigned int)READY_FREQ); // Включает местный тест после 2 с удержания и выключает при отпускании; короткое нажатие остаётся сигналом сброса для основного контроллера. + if(cTestLamp|bTestLamp) { what_is(); diff --git a/Source/Internal/spise2p.c b/Source/Internal/spise2p.c index 8020cda..8c9f370 100644 --- a/Source/Internal/spise2p.c +++ b/Source/Internal/spise2p.c @@ -1,8 +1,8 @@ -/* SPI EEPROM. Seeprom_read/write ðàçáèâàþò çàïðîñ íà ñòðàíèöû - * è ñèíõðîííî æäóò spiSe2pFree. SPI-àâòîìàò ïðîäâèãàåò òàéìåð 2 - * êàæäûå 100 ìêñ. Ïðè çàïðåòå ýòîãî IRQ îæèäàíèå íå çàâåðøèòñÿ. - * Òàéì-àóò â ñòàðîì äðàéâåðå îòñóòñòâóåò. Äèñêðåòû ÑÈÔÓ òåïåðü - * íå çàâèñÿò îò òîãî, çàâåðøèëîñü ëè ýòî îæèäàíèå â main. +/* SPI EEPROM. Seeprom_read/write разбивают запрос на страницы + * и синхронно ждут spiSe2pFree. SPI-автомат продвигает таймер 2 + * каждые 100 мкс. При запрете этого IRQ ожидание не завершится. + * Тайм-аут в старом драйвере отсутствует. Дискреты СИФУ теперь + * не зависят от того, завершилось ли это ожидание в main. */ #include "DSP2833x_Device.h" // DSP2833x Headerfile Include File @@ -25,8 +25,8 @@ int ccc=0; /******* SPI bus Serial EEPROM driver Initialization routine ********/ /********************************************************************/ -/* Áëîêèðóåò main äî çàâåðøåíèÿ ñòðàíèö. Çàïðåò IRQ îñòàíîâèò - * SPI-àâòîìàò. CAN è òàéìåð ÑÈÔÓ äîëæíû ïðåðûâàòü ýòî îæèäàíèå. +/* Блокирует main до завершения страниц. Запрет IRQ остановит + * SPI-автомат. CAN и таймер СИФУ должны прерывать это ожидание. */ void Seeprom_write( unsigned int adres, unsigned int buf[], @@ -59,8 +59,8 @@ void Seeprom_write( unsigned int adres, CpuTimer2Regs.TCR.all = 0x4010; // Use write-only instruction to set TSS bit = 1 } -/* ×òåíèå òàêæå ñèíõðîííîå äëÿ main, òàéì-àóò íå ðåàëèçîâàí. - * Ïðè çàâèñàíèè ïðîâåðèòü step/SPI è ðàáîòó òàéìåðà 2. +/* Чтение также синхронное для main, тайм-аут не реализован. + * При зависании проверить step/SPI и работу таймера 2. */ void Seeprom_read( unsigned int adres, unsigned int buf[], diff --git a/Source/Internal/tools.c b/Source/Internal/tools.c index 71f9ac6..97e1cfb 100644 --- a/Source/Internal/tools.c +++ b/Source/Internal/tools.c @@ -1,7 +1,7 @@ -/* Âíåøíÿÿ ïàìÿòü è ïðîãðàììíûå çàäåðæêè. init_zone7 ãîòîâèò XINTF - * äî ïåðâîãî îáðàùåíèÿ ê .logg; âðåìåíà øèíû çàâèñÿò îò ÷àñòîòû DSP - * è àïïàðàòíîé ïàìÿòè. pause_us çàíèìàåò CPU öèêëîì è èñïîëüçóåòñÿ - * ïðè èíèöèàëèçàöèè. Äëèòåëüíîñòü ÑÈÔÓ äîëæíà çàäàâàòüñÿ òàéìåðîì. +/* Внешняя память и программные задержки. init_zone7 готовит XINTF + * до первого обращения к .logg; времена шины зависят от частоты DSP + * и аппаратной памяти. pause_us занимает CPU циклом и используется + * при инициализации. Длительность СИФУ должна задаваться таймером. */ #include "DSP2833x_Device.h" // DSP281x Headerfile Include File diff --git a/UKSSTMS320F28335/.ccsproject b/UKSSTMS320F28335/.ccsproject index c77a86f..e499556 100644 --- a/UKSSTMS320F28335/.ccsproject +++ b/UKSSTMS320F28335/.ccsproject @@ -2,6 +2,4 @@ - - diff --git a/UKSSTMS320F28335/.cproject b/UKSSTMS320F28335/.cproject index 9229534..e06ac12 100644 --- a/UKSSTMS320F28335/.cproject +++ b/UKSSTMS320F28335/.cproject @@ -13,8 +13,7 @@ - - + - - +