Обновить сборку прошивки 166, TESTLAMP и кодировку исходников

Перенести настройки выпуска в JSON, добавить переносимый сценарий сборки и проверки BIN. Обновить конфигурации CCS, исходники в UTF-8, обработку TESTLAMP, образы прошивки и регрессионные проверки.
This commit is contained in:
2026-10-17 14:36:59 +03:00
parent 13f1a2c5fd
commit 31f92e89d9
56 changed files with 1493 additions and 776 deletions
+30 -30
View File
@@ -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);
+16 -16
View File
@@ -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;
+2 -2
View File
@@ -1,5 +1,5 @@
/* Таблицы выборок обновляет ADC ISR. Согласованный снимок нескольких
* каналов требует защиты копирования, одного указателя недостаточно.
/* Таблицы выборок обновляет ADC ISR. Согласованный снимок нескольких
* каналов требует защиты копирования, одного указателя недостаточно.
*/
+4 -4
View File
@@ -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);
+16 -16
View File
@@ -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
+40 -40
View File
@@ -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
+29 -29
View File
@@ -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);
+30 -30
View File
@@ -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 //---------------------------------------------------------------------
*/
+8 -8
View File
@@ -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);
+2 -2
View File
@@ -1,5 +1,5 @@
/* Интерфейсы CRC. Различать буфер кадра и массив слов EEPROM;
* результат зависит от порядка обработки байтов.
/* Интерфейсы CRC. Различать буфер кадра и массив слов EEPROM;
* результат зависит от порядка обработки байтов.
*/
typedef unsigned short WORD;
typedef unsigned char byte;
+2 -2
View File
@@ -1,5 +1,5 @@
/* Коэффициенты и изменяемая история фильтра. Каждый независимый
* канал должен иметь отдельный экземпляр FILTERBAT.
/* Коэффициенты и изменяемая история фильтра. Каждый независимый
* канал должен иметь отдельный экземпляр FILTERBAT.
*/
#ifndef _FILTER_BAT2
#define _FILTER_BAT2
+2 -2
View File
@@ -1,4 +1,4 @@
/* Интерфейс канала индикации. Он не формирует START_DPTB
* и не должен использоваться вместо функций управления нагрузкой.
/* Интерфейс канала индикации. Он не формирует START_DPTB
* и не должен использоваться вместо функций управления нагрузкой.
*/
void kanal_Send(int adr, long dat, int dot);
+16 -16
View File
@@ -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;
+4 -4
View File
@@ -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;
+1 -1
View File
@@ -11,7 +11,7 @@
#define REVERSE 1
/* Выбирает исполнение 166: соответствующие калибровки и обратный порядок индикаторов задаются условными блоками ниже. */
#define BALSAM 166
#define BALSAM 165
#if BALSAM == 166
#define OBOROT REVERSE
+3 -3
View File
@@ -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
+2 -2
View File
@@ -1,5 +1,5 @@
/* Состояния пульта dsk_EPLT. Обработчик таймера нагрузки
* определён отдельно в measure.c.
/* Состояния пульта dsk_EPLT. Обработчик таймера нагрузки
* определён отдельно в measure.c.
*/
//void what_is(void);
+18 -18
View File
@@ -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
+2 -2
View File
@@ -1,5 +1,5 @@
/* Инициализация памяти и задержки. pause_us не использовать
* для длительности дискретов; их отсчитывает аппаратный таймер.
/* Инициализация памяти и задержки. pause_us не использовать
* для длительности дискретов; их отсчитывает аппаратный таймер.
*/
#ifndef TOOLS_H
#define TOOLS_H
+19 -19
View File
@@ -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);
+21 -21
View File
@@ -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;
}
+105 -105
View File
@@ -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);
}*/ }
+59 -59
View File
@@ -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;
+10 -10
View File
@@ -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;
+5 -5
View File
@@ -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 */
+4 -4
View File
@@ -1,7 +1,7 @@
/* Рекурсивный фильтр. FILTERBAT хранит коэффициенты и историю
* двух входов/выходов; каждый вызов изменяет переданный экземпляр.
* Независимым каналам нужны отдельные состояния. Синхронизации
* здесь нет: смену коэффициентов согласовывает вызывающий код.
/* Рекурсивный фильтр. FILTERBAT хранит коэффициенты и историю
* двух входов/выходов; каждый вызов изменяет переданный экземпляр.
* Независимым каналам нужны отдельные состояния. Синхронизации
* здесь нет: смену коэффициентов согласовывает вызывающий код.
*/
#include "filter_bat2.h"
+7 -7
View File
@@ -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;
} }
+56 -56
View File
@@ -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 <math.h> // Это чтобы мерить амплитуду! sqrt без этого будет крив!!!
#include <math.h> // Это чтобы мерить амплитуду! 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;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[m_FAST][(i+24)/16]|=(1<<((i+24)%16)); // Показаниа
}
for(i=0;i<3; i++)
Maska[m_SLOW][i+3] = Maska[m_FAST][i]; // Уставки
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; // Калибровка термодатчиков
else
Maska[m_SLOW][7]|= 0x0F00; // Калибровка термодатчиков
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]|= 0x000F; // Ноль датчиков напражениа
Maska[m_SLOW][7]|= 0x00F0; // Калибровка датчиков напражениа
Maska[m_FAST][6]|= 0x3F00; // Фазные значениа
}
if(Desk==dsk_LOAD)
{ Maska[m_SLOW][7]|= 0x0030; // Калибровка ЦАП
Maska[m_FAST][7]|= 0xE000; // Дублировать команды
Maska[m_FAST][1]|= 0x3000; // Управлающий ток СИФУ
{ Maska[m_SLOW][7]|= 0x0030; // Калибровка ЦАП
Maska[m_FAST][7]|= 0xE000; // Дублировать команды
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[m_SLOW][6]|= 0x0007; // Яркость ламп и периоды посылок
Maska[m_SLOW][7]|= 0xE000; // Адрес, команды, и чтоб не вылазило
}
int er_anal(int term, long * count, long edge, int pre)
@@ -449,26 +449,26 @@ void Current_count(int chan)
modbus[0x64+chan] = Numb;
// Средний (он же нулевой) уровень показаний АЦП
// Средний (он же нулевой) уровень показаний АЦП
zer_count[chan] += (Numb-zer_count[chan])/(5.0 * ADC_FREQ);
Zero_lev[chan] = (int)(filterbat(&zer_filter[chan],zer_count[chan]));
// Мгновенное значение фазы
// Мгновенное значение фазы
Current = (Numb - Zero_lev[chan]) * powK[chan];
// Действующее (среднеквадратичное) значение фазы
// Действующее (среднеквадратичное) значение фазы
lev_quadr[chan] += ((Current*Current)-lev_quadr[chan])/(1.0 * ADC_FREQ);
lev_count[chan] = sqrt(lev_quadr[chan]);
// Запомним
// Запомним
if(ist)
{
if(Desk==dsk_COMM) aCurrent =-Current;
else aCurrent = Current; // Запомнили мгновенное значение - дла амплитуды
else aCurrent = Current; // Запомнили мгновенное значение - дла амплитуды
}
else
{
// Вычисление амплитуды
// Вычисление амплитуды
Amplitude = filterbat(&out_filter[sens], im_calc(Current,aCurrent));
if(sens_type[chan]==VOLTAGE)
@@ -485,7 +485,7 @@ modbus[0x64+chan] = Numb;
sens_data[sens-1] = Level;
}
// Действующее (среднеквадратичное) значение третьей фазы
// Действующее (среднеквадратичное) значение третьей фазы
Numb =-Current-aCurrent;
lev_quadr[thrd] += (Numb*Numb-lev_quadr[thrd])/(1.0 * ADC_FREQ);
lev_count[thrd] = sqrt(lev_quadr[thrd]);
@@ -511,12 +511,12 @@ modbus[0x68+fazz+1] = lev_count[chan];
modbus[0x68+fazz+2] = lev_count[thrd];
}
// Это максимальное
// Это максимальное
Numb = lev_count[chan];
if(Numb<lev_count[pair]) Numb = lev_count[pair];
if(Numb<lev_count[thrd]) Numb = lev_count[thrd];
// Зашиты!
// Зашиты!
error.all = 0;
no_ignor = !sens_error[chan].bit.Ignor;
@@ -659,7 +659,7 @@ void Temper_count(int chan)
if(chan>tpl_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;
+1 -1
View File
@@ -65,7 +65,7 @@ void Default_params()
}
else
{
Cancount[m_FAST] = 10; // пауза между посылками CAN
Cancount[m_FAST] = 12; // пауза между посылками CAN
Brightness = 8;
}
+2 -3
View File
@@ -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;
+15 -6
View File
@@ -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();
+9 -9
View File
@@ -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[],
+4 -4
View File
@@ -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