Compare commits
3 Commits
pm35-uart-
...
167
| Author | SHA1 | Date | |
|---|---|---|---|
| 5398bcc575 | |||
| 9f39dd217d | |||
| 6bdc7a278b |
File diff suppressed because one or more lines are too long
Binary file not shown.
@@ -1,41 +0,0 @@
|
||||
{
|
||||
"schema": 1,
|
||||
"product": "Balsam-167-PM35",
|
||||
"target": "TMS320F28335",
|
||||
"version": [
|
||||
1,
|
||||
1,
|
||||
2
|
||||
],
|
||||
"build_id": "c6c9128+",
|
||||
"built_at_utc": "2026-10-09T13:10:25+00:00",
|
||||
"source": {
|
||||
"commit": "c6c91282387adc789a7ebbc6f7e763d02b549789",
|
||||
"dirty": true
|
||||
},
|
||||
"templates": {
|
||||
"commit": "86ece3ea907cc92db73390eaae7551dd01b54e2c",
|
||||
"dirty": true
|
||||
},
|
||||
"identity_contract": 1,
|
||||
"identity_register_count": 12,
|
||||
"eeprom": "M95M02",
|
||||
"eeprom_bytes": 262144,
|
||||
"firmware_limit_bytes": 261884,
|
||||
"gas": {
|
||||
"enabled": true,
|
||||
"version": 1,
|
||||
"profile": 167,
|
||||
"info_words": 8,
|
||||
"register_count": 128,
|
||||
"transports": [
|
||||
"modbus_rtu",
|
||||
"ump_service_can"
|
||||
],
|
||||
"info_base": 24320,
|
||||
"register_base": 20480
|
||||
},
|
||||
"file": "UKSSTMS320F28335_GAS_M95M02.bin",
|
||||
"size_bytes": 33174,
|
||||
"sha256": "a1c186e5f114ea2f77ac5f18a60424c79f53b1e3a49e0343ac9bd96979f0347e"
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
a1c186e5f114ea2f77ac5f18a60424c79f53b1e3a49e0343ac9bd96979f0347e UKSSTMS320F28335_GAS_M95M02.bin
|
||||
@@ -1,16 +0,0 @@
|
||||
[
|
||||
{
|
||||
"after_bytes": 32472,
|
||||
"profile": 0,
|
||||
"gas_added_bytes": 0,
|
||||
"binary_identical": true,
|
||||
"before_bytes": 32472
|
||||
},
|
||||
{
|
||||
"after_bytes": 33174,
|
||||
"profile": 1,
|
||||
"gas_added_bytes": 410,
|
||||
"binary_identical": false,
|
||||
"before_bytes": 32764
|
||||
}
|
||||
]
|
||||
@@ -1,358 +0,0 @@
|
||||
/* Последовательный вывод данных канала индикации. Русские пояснения сохранены в UTF-8. */
|
||||
/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */
|
||||
#include "DSP2833x_Device.h" // DSP281x Headerfile Include File
|
||||
/* Подключает "DSP2833x_SWPrioritizedIsrLevels.h": поставляемое TI описание SWPrioritizedIsrLevels для семейства C2833x. */
|
||||
#include "DSP2833x_SWPrioritizedIsrLevels.h"
|
||||
/* Подключает "filter_bat2.h": накопительный фильтр измерительных каналов. */
|
||||
#include "filter_bat2.h"
|
||||
/* Подключает "measure.h": обработка датчиков, вычисление величин и миллисекундный такт системы. */
|
||||
#include "measure.h"
|
||||
|
||||
/* Подключает "RS485.h": приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
|
||||
#include "RS485.h"
|
||||
/* Подключает "message.h": обработка Modbus, заводские параметры и сохранение настроек. */
|
||||
#include "message.h"
|
||||
/* Подключает "kanal.h": последовательный вывод данных канала индикации. */
|
||||
#include "kanal.h"
|
||||
/* Подключает "pulto.h": обмен и индикация пульта. */
|
||||
#include "pulto.h"
|
||||
/* Подключает "package.h": адреса устройств, типы плат и псевдонимы технологических регистров. */
|
||||
#include "package.h"
|
||||
/* Подключает "tools.h": настройка внешней памяти и служебные задержки. */
|
||||
#include "tools.h"
|
||||
|
||||
/* Подключает "peripher.h": перемычки режима платы, дискретные входы и выходы. */
|
||||
#include "peripher.h"
|
||||
|
||||
/* Объявляет digits — данные digits. Начальное значение задаётся справа от знака равенства. */
|
||||
int digits[16] = {63,6,91,79,102,109,125,7,127,111,64,0,0,0,121,0};
|
||||
/* Объявляет readr — данные readr. Начальное значение задаётся справа от знака равенства. */
|
||||
int readr[5] = {0x08,0x0C,0x10,0x00,0x04};
|
||||
|
||||
/* Ограничивает настройки таймингов компилятором TI C2000; модель на ПК не использует эти директивы. */
|
||||
#if defined(__TI_COMPILER_VERSION__)
|
||||
/* Сохраняет отдельный вызов переключения CLOCK: встраивание при -O3 сокращало удержание DATA после фронта. */
|
||||
#pragma FUNC_CANNOT_INLINE(DCLK)
|
||||
/* Возвращает генерацию DCLK как в образе от 06.10.2026: уровень 1 и приоритет скорости 3 сохраняют прежнюю последовательность инструкций GPIO. */
|
||||
#pragma FUNCTION_OPTIONS(DCLK, "--opt_level=1 --opt_for_speed=3")
|
||||
/* Сохраняет отдельный вызов переключения DATA, чтобы длительность импульсов не зависела от встраивания в передатчик. */
|
||||
#pragma FUNC_CANNOT_INLINE(DOUT)
|
||||
/* Возвращает генерацию DOUT с прежними параметрами -O1 и --opt_for_speed=3; значения взяты из старой конфигурации CCS. */
|
||||
#pragma FUNCTION_OPTIONS(DOUT, "--opt_level=1 --opt_for_speed=3")
|
||||
/* Не позволяет встроить разделитель пакетов в цикл передачи и изменить интервалы между переключениями линий. */
|
||||
#pragma FUNC_CANNOT_INLINE(RESET)
|
||||
/* Сохраняет прежнюю последовательность вызовов GPIO и задержек разделителя, используя настройки старого образа. */
|
||||
#pragma FUNCTION_OPTIONS(RESET, "--opt_level=1 --opt_for_speed=3")
|
||||
/* Сохраняет отдельный вызов передачи бита; протокол использует порядок и интервалы фронтов CLOCK и DATA. */
|
||||
#pragma FUNC_CANNOT_INLINE(SENDBIT)
|
||||
/* Возвращает передаче бита настройки старого образа -O1 и --opt_for_speed=3, оставляя остальной проект на -O3. */
|
||||
#pragma FUNCTION_OPTIONS(SENDBIT, "--opt_level=1 --opt_for_speed=3")
|
||||
/* Завершает блок настроек TI, не изменяя формат пакетов и существующие счётчики задержек. */
|
||||
#endif
|
||||
|
||||
/* Начинает функцию DCLK; назначение модуля — последовательный вывод данных канала индикации. */
|
||||
void DCLK(int x)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Проверяет if(x) GpioDataRegs.GPASET.bit.GPIO6=1; последующий оператор выполняется только при истинном условии. */
|
||||
if(x) GpioDataRegs.GPASET.bit.GPIO6=1;
|
||||
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
|
||||
else GpioDataRegs.GPACLEAR.bit.GPIO6=1;
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
/* Начинает функцию DOUT; назначение модуля — последовательный вывод данных канала индикации. */
|
||||
void DOUT(int x)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Проверяет if(x) GpioDataRegs.GPASET.bit.GPIO8=1; последующий оператор выполняется только при истинном условии. */
|
||||
if(x) GpioDataRegs.GPASET.bit.GPIO8=1;
|
||||
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
|
||||
else GpioDataRegs.GPACLEAR.bit.GPIO8=1;
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
/* Условие компиляции CLKMULT==1: выбранный блок включается в текущий вариант прошивки. */
|
||||
#if CLKMULT==1
|
||||
/* Задаёт POWS0 = 0L; данные POWS0. */
|
||||
#define POWS0 0L
|
||||
/* Задаёт POWS1 = 10L; данные POWS1. */
|
||||
#define POWS1 10L
|
||||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
#endif
|
||||
/* Условие компиляции CLKMULT==2: выбранный блок включается в текущий вариант прошивки. */
|
||||
#if CLKMULT==2
|
||||
/* Задаёт POWS0 = 0L; данные POWS0. */
|
||||
#define POWS0 0L
|
||||
/* Задаёт POWS1 = 30L; данные POWS1. */
|
||||
#define POWS1 30L
|
||||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
#endif
|
||||
/* Условие компиляции CLKMULT==3: выбранный блок включается в текущий вариант прошивки. */
|
||||
#if CLKMULT==3
|
||||
/* Задаёт POWS0 = 1L; данные POWS0. */
|
||||
#define POWS0 1L
|
||||
/* Задаёт POWS1 = 50L; данные POWS1. */
|
||||
#define POWS1 50L
|
||||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
#endif
|
||||
/* Условие компиляции CLKMULT==4: выбранный блок включается в текущий вариант прошивки. */
|
||||
#if CLKMULT==4
|
||||
/* Задаёт POWS0 = 2L; данные POWS0. */
|
||||
#define POWS0 2L
|
||||
/* Задаёт POWS1 = 60L; данные POWS1. */
|
||||
#define POWS1 60L
|
||||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
#endif
|
||||
/* Условие компиляции CLKMULT==5: выбранный блок включается в текущий вариант прошивки. */
|
||||
#if CLKMULT==5
|
||||
/* Задаёт POWS0 = 4L; данные POWS0. */
|
||||
#define POWS0 4L
|
||||
/* Задаёт POWS1 = 80L; данные POWS1. */
|
||||
#define POWS1 80L
|
||||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
#endif
|
||||
|
||||
/* Начинает функцию RESET; назначение модуля — последовательный вывод данных канала индикации. */
|
||||
void RESET()
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Вызывает DCLK с аргументами (0) в текущей последовательности операций. */
|
||||
DCLK(0);
|
||||
/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */
|
||||
#if POWS1>0
|
||||
/* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */
|
||||
DSP28x_usDelay(POWS1);
|
||||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
#endif
|
||||
/* Вызывает DOUT с аргументами (1) в текущей последовательности операций. */
|
||||
DOUT(1);
|
||||
/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */
|
||||
#if POWS1>0
|
||||
/* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */
|
||||
DSP28x_usDelay(POWS1);
|
||||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
#endif
|
||||
/* Вызывает DOUT с аргументами (0) в текущей последовательности операций. */
|
||||
DOUT(0);
|
||||
/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */
|
||||
#if POWS1>0
|
||||
/* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */
|
||||
DSP28x_usDelay(POWS1);
|
||||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
#endif
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
/* Начинает функцию SENDBIT; назначение модуля — последовательный вывод данных канала индикации. */
|
||||
void SENDBIT(int x)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Выставляет передаваемый бит DATA до подъёма CLOCK, сохраняя его на протяжении высокого уровня такта. */
|
||||
DOUT(x); DCLK(1);
|
||||
/* Условие компиляции POWS0>0: выбранный блок включается в текущий вариант прошивки. */
|
||||
#if POWS0>0
|
||||
/* Вызывает DSP28x_usDelay с аргументами (POWS0) в текущей последовательности операций. */
|
||||
DSP28x_usDelay(POWS0);
|
||||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
#endif
|
||||
/* Вариант A: задержка перед спадом CLOCK продлевает высокий уровень при действительном DATA; POWS0+1 — прежний счётчик циклов TI, не микросекунды. */
|
||||
DSP28x_usDelay(POWS0+1);
|
||||
/* Опускает CLOCK при ещё действительном DATA, чтобы сохранить передаваемый бит на отрицательном фронте такта. */
|
||||
DCLK(0);
|
||||
/* Сбрасывает DATA после спада CLOCK; в варианте A дополнительной задержки между спадом и сбросом нет. */
|
||||
DOUT(0);
|
||||
/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */
|
||||
#if POWS1>0
|
||||
/* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */
|
||||
DSP28x_usDelay(POWS1);
|
||||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
#endif
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
/* Начинает функцию kanal_Send; назначение модуля — последовательный вывод данных канала индикации. */
|
||||
void kanal_Send(int adr, long dat, int dot)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Объявляет Word — слово; data — данные; aliq_part — данные aliq_part; dg — данные dg. */
|
||||
long Word,data,aliq_part,dg[4];
|
||||
/* Объявляет i — данные i; j — данные j; bit — представление регистра отдельными битовыми полями; byt — данные byt; addr — данные addr. Начальное значение задаётся справа от знака равенства. */
|
||||
int i,j,bit,byt,addr,sgn=0,punkt=0,aliq_len=0,full_len, isdot=0;
|
||||
|
||||
/* Проверяет if(adr>1); последующий оператор выполняется только при истинном условии. */
|
||||
if(adr>1) // Лампочки
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Записывает Word значением dat; слово. */
|
||||
Word =dat;
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
|
||||
else
|
||||
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Проверяет if(dat<0) sgn=1; последующий оператор выполняется только при истинном условии. */
|
||||
if(dat<0) sgn=1;
|
||||
/* Записывает data значением labs(dat); данные. */
|
||||
data = labs(dat);
|
||||
|
||||
/* Проверяет if(dot>=0 и dot<4) isdot = 1; последующий оператор выполняется только при истинном условии. */
|
||||
if(dot>=0 && dot<4) isdot = 1;
|
||||
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
|
||||
else dot=0;
|
||||
|
||||
/* Записывает aliq_part значением data; данные aliq_part. */
|
||||
aliq_part = data;
|
||||
/* Цикл for(i=0;i<dot;i++) aliq_part/=10;; задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for(i=0;i<dot;i++) aliq_part/=10;
|
||||
|
||||
/* Записывает dat значением aliq_part; данные dat. */
|
||||
dat = aliq_part;
|
||||
/* Повторяет или ожидает, пока выполняется while(dat>0). */
|
||||
while(dat>0)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Делит dat значением 10; данные dat. */
|
||||
aliq_len++; dat/=10;
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
/* Записывает dat значением data; данные dat. */
|
||||
dat = data;
|
||||
|
||||
/* Записывает full_len значением aliq_len+sgn; данные full_len. */
|
||||
full_len = aliq_len+sgn;
|
||||
/* Проверяет if(full_len==0) full_len=1; последующий оператор выполняется только при истинном условии. */
|
||||
if(full_len==0) full_len=1;
|
||||
/* Увеличивает full_len значением dot; данные full_len. */
|
||||
full_len += dot;
|
||||
|
||||
/* Цикл for(i=0; i<(full_len-4);i++); задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for(i=0; i<(full_len-4);i++)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Начинает цикл с проверкой условия после тела: первый проход выполняется всегда. */
|
||||
dot--; dat/=10;
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
/* Проверяет if(dot<0) dot=0; последующий оператор выполняется только при истинном условии. */
|
||||
if(dot<0) dot=0;
|
||||
/* Записывает punkt значением 1<<dot; данные punkt. */
|
||||
punkt = 1<<dot;
|
||||
/* Проверяет if(punkt==1) punkt=0; последующий оператор выполняется только при истинном условии. */
|
||||
if(punkt==1) punkt=0;
|
||||
|
||||
/* Записывает dg[3] значением (dat)/1000; данные dg. */
|
||||
dg[3] = (dat)/1000;
|
||||
/* Записывает dg[2] значением (dat%1000)/100; данные dg. */
|
||||
dg[2] = (dat%1000)/100;
|
||||
/* Записывает dg[1] значением (dat%100)/10; данные dg. */
|
||||
dg[1] = (dat%100)/10;
|
||||
/* Записывает dg[0] значением (dat%10); данные dg. */
|
||||
dg[0] = (dat%10);
|
||||
|
||||
/* Проверяет if(dg[0]+dg[1]+dg[2]+dg[3]==0); последующий оператор выполняется только при истинном условии. */
|
||||
if(dg[0]+dg[1]+dg[2]+dg[3]==0)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Записывает punkt значением 0; dot=0; sgn=0; данные punkt. */
|
||||
punkt=0; dot=0; sgn=0;
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
/* Проверяет if(isdot); последующий оператор выполняется только при истинном условии. */
|
||||
if(isdot)
|
||||
/* Цикл for(i=3;i>0;i--); задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for(i=3;i>0;i--)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Проверяет if((dg[i]==0) и (i!=dot)); последующий оператор выполняется только при истинном условии. */
|
||||
if((dg[i]==0)&&(i!=dot))
|
||||
/* Записывает dg[i] значением 0xF; данные dg. */
|
||||
dg[i]=0xF; // Это значит пусто
|
||||
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
|
||||
else break;
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
/* Проверяет if(sgn); последующий оператор выполняется только при истинном условии. */
|
||||
if(sgn)
|
||||
/* Цикл for(i=1;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for(i=1;i<4;i++)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Проверяет if( (dg[i]==0xF) или (i==3)); последующий оператор выполняется только при истинном условии. */
|
||||
if( (dg[i]==0xF)||(i==3))
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Записывает dg[i] значением 0xA; данные dg. */
|
||||
dg[i]=0xA; // Это значит минус
|
||||
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
|
||||
break;
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
} }
|
||||
|
||||
/* Цикл for(i=0;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for(i=0;i<4;i++)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Записывает dg[i] значением digits[dg[i]]; данные dg. */
|
||||
dg[i] = digits[dg[i]];
|
||||
/* Проверяет if((punkt>>i)&1) dg[i]+= 128; последующий оператор выполняется только при истинном условии. */
|
||||
if((punkt>>i)&1) dg[i]+= 128;
|
||||
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
/* Записывает Word значением ((dg[0] ) & 0x000000FF) | ((dg[1]<<8 ) & 0x0000FF00) |; слово. */
|
||||
Word = ((dg[0] ) & 0x000000FF) | ((dg[1]<<8 ) & 0x0000FF00) |
|
||||
/* Продолжает список аргументов, полей или выражение ((dg[2]<<16) & 0x00FF0000) | ((dg[3]<<24) & 0xFF000000);; порядок элементов сохраняется. */
|
||||
((dg[2]<<16) & 0x00FF0000) | ((dg[3]<<24) & 0xFF000000);
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
/* Записывает addr значением readr[adr]; данные addr. */
|
||||
addr = readr[adr];
|
||||
|
||||
/* Цикл for (i=0;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for (i=0;i<4;i++)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Проверяет if(addr>0x10) break; последующий оператор выполняется только при истинном условии. */
|
||||
if(addr>0x10) break;
|
||||
|
||||
/* Цикл for (j=0;j<8;j++); задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for (j=0;j<8;j++)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Записывает bit значением Word & 1; Word >>= 1; представление регистра отдельными битовыми полями. */
|
||||
bit = Word & 1; Word >>= 1;
|
||||
/* Вызывает SENDBIT с аргументами (bit) в текущей последовательности операций. */
|
||||
SENDBIT(bit);
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
/* Записывает byt значением addr; данные byt. */
|
||||
byt = addr;
|
||||
/* Цикл for (j=0;j<6;j++); задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for (j=0;j<6;j++)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Записывает bit значением byt & 1; byt >>= 1; представление регистра отдельными битовыми полями. */
|
||||
bit = byt & 1; byt >>= 1;
|
||||
/* Вызывает SENDBIT с аргументами (bit) в текущей последовательности операций. */
|
||||
SENDBIT(bit);
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
/* Изменяет счётчик в выражении addr++; на один для следующего шага. */
|
||||
addr++;
|
||||
|
||||
/* Вызывает RESET с аргументами () в текущей последовательности операций. */
|
||||
RESET();
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
@@ -1,358 +0,0 @@
|
||||
/* Последовательный вывод данных канала индикации. Русские пояснения сохранены в UTF-8. */
|
||||
/* Подключает "DSP2833x_Device.h": поставляемое TI описание Device для семейства C2833x. */
|
||||
#include "DSP2833x_Device.h" // DSP281x Headerfile Include File
|
||||
/* Подключает "DSP2833x_SWPrioritizedIsrLevels.h": поставляемое TI описание SWPrioritizedIsrLevels для семейства C2833x. */
|
||||
#include "DSP2833x_SWPrioritizedIsrLevels.h"
|
||||
/* Подключает "filter_bat2.h": накопительный фильтр измерительных каналов. */
|
||||
#include "filter_bat2.h"
|
||||
/* Подключает "measure.h": обработка датчиков, вычисление величин и миллисекундный такт системы. */
|
||||
#include "measure.h"
|
||||
|
||||
/* Подключает "RS485.h": приём и передача SCI-A/SCI-B, упаковка команд и FIFO первого порта. */
|
||||
#include "RS485.h"
|
||||
/* Подключает "message.h": обработка Modbus, заводские параметры и сохранение настроек. */
|
||||
#include "message.h"
|
||||
/* Подключает "kanal.h": последовательный вывод данных канала индикации. */
|
||||
#include "kanal.h"
|
||||
/* Подключает "pulto.h": обмен и индикация пульта. */
|
||||
#include "pulto.h"
|
||||
/* Подключает "package.h": адреса устройств, типы плат и псевдонимы технологических регистров. */
|
||||
#include "package.h"
|
||||
/* Подключает "tools.h": настройка внешней памяти и служебные задержки. */
|
||||
#include "tools.h"
|
||||
|
||||
/* Подключает "peripher.h": перемычки режима платы, дискретные входы и выходы. */
|
||||
#include "peripher.h"
|
||||
|
||||
/* Объявляет digits — данные digits. Начальное значение задаётся справа от знака равенства. */
|
||||
int digits[16] = {63,6,91,79,102,109,125,7,127,111,64,0,0,0,121,0};
|
||||
/* Объявляет readr — данные readr. Начальное значение задаётся справа от знака равенства. */
|
||||
int readr[5] = {0x08,0x0C,0x10,0x00,0x04};
|
||||
|
||||
/* Ограничивает настройки таймингов компилятором TI C2000; модель на ПК не использует эти директивы. */
|
||||
#if defined(__TI_COMPILER_VERSION__)
|
||||
/* Сохраняет отдельный вызов переключения CLOCK: встраивание при -O3 сокращало удержание DATA после фронта. */
|
||||
#pragma FUNC_CANNOT_INLINE(DCLK)
|
||||
/* Возвращает генерацию DCLK как в образе от 06.10.2026: уровень 1 и приоритет скорости 3 сохраняют прежнюю последовательность инструкций GPIO. */
|
||||
#pragma FUNCTION_OPTIONS(DCLK, "--opt_level=1 --opt_for_speed=3")
|
||||
/* Сохраняет отдельный вызов переключения DATA, чтобы длительность импульсов не зависела от встраивания в передатчик. */
|
||||
#pragma FUNC_CANNOT_INLINE(DOUT)
|
||||
/* Возвращает генерацию DOUT с прежними параметрами -O1 и --opt_for_speed=3; значения взяты из старой конфигурации CCS. */
|
||||
#pragma FUNCTION_OPTIONS(DOUT, "--opt_level=1 --opt_for_speed=3")
|
||||
/* Не позволяет встроить разделитель пакетов в цикл передачи и изменить интервалы между переключениями линий. */
|
||||
#pragma FUNC_CANNOT_INLINE(RESET)
|
||||
/* Сохраняет прежнюю последовательность вызовов GPIO и задержек разделителя, используя настройки старого образа. */
|
||||
#pragma FUNCTION_OPTIONS(RESET, "--opt_level=1 --opt_for_speed=3")
|
||||
/* Сохраняет отдельный вызов передачи бита; протокол использует порядок и интервалы фронтов CLOCK и DATA. */
|
||||
#pragma FUNC_CANNOT_INLINE(SENDBIT)
|
||||
/* Возвращает передаче бита настройки старого образа -O1 и --opt_for_speed=3, оставляя остальной проект на -O3. */
|
||||
#pragma FUNCTION_OPTIONS(SENDBIT, "--opt_level=1 --opt_for_speed=3")
|
||||
/* Завершает блок настроек TI, не изменяя формат пакетов и существующие счётчики задержек. */
|
||||
#endif
|
||||
|
||||
/* Начинает функцию DCLK; назначение модуля — последовательный вывод данных канала индикации. */
|
||||
void DCLK(int x)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Проверяет if(x) GpioDataRegs.GPASET.bit.GPIO6=1; последующий оператор выполняется только при истинном условии. */
|
||||
if(x) GpioDataRegs.GPASET.bit.GPIO6=1;
|
||||
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
|
||||
else GpioDataRegs.GPACLEAR.bit.GPIO6=1;
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
/* Начинает функцию DOUT; назначение модуля — последовательный вывод данных канала индикации. */
|
||||
void DOUT(int x)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Проверяет if(x) GpioDataRegs.GPASET.bit.GPIO8=1; последующий оператор выполняется только при истинном условии. */
|
||||
if(x) GpioDataRegs.GPASET.bit.GPIO8=1;
|
||||
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
|
||||
else GpioDataRegs.GPACLEAR.bit.GPIO8=1;
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
/* Условие компиляции CLKMULT==1: выбранный блок включается в текущий вариант прошивки. */
|
||||
#if CLKMULT==1
|
||||
/* Задаёт POWS0 = 0L; данные POWS0. */
|
||||
#define POWS0 0L
|
||||
/* Задаёт POWS1 = 10L; данные POWS1. */
|
||||
#define POWS1 10L
|
||||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
#endif
|
||||
/* Условие компиляции CLKMULT==2: выбранный блок включается в текущий вариант прошивки. */
|
||||
#if CLKMULT==2
|
||||
/* Задаёт POWS0 = 0L; данные POWS0. */
|
||||
#define POWS0 0L
|
||||
/* Задаёт POWS1 = 30L; данные POWS1. */
|
||||
#define POWS1 30L
|
||||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
#endif
|
||||
/* Условие компиляции CLKMULT==3: выбранный блок включается в текущий вариант прошивки. */
|
||||
#if CLKMULT==3
|
||||
/* Задаёт POWS0 = 1L; данные POWS0. */
|
||||
#define POWS0 1L
|
||||
/* Задаёт POWS1 = 50L; данные POWS1. */
|
||||
#define POWS1 50L
|
||||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
#endif
|
||||
/* Условие компиляции CLKMULT==4: выбранный блок включается в текущий вариант прошивки. */
|
||||
#if CLKMULT==4
|
||||
/* Задаёт POWS0 = 2L; данные POWS0. */
|
||||
#define POWS0 2L
|
||||
/* Задаёт POWS1 = 60L; данные POWS1. */
|
||||
#define POWS1 60L
|
||||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
#endif
|
||||
/* Условие компиляции CLKMULT==5: выбранный блок включается в текущий вариант прошивки. */
|
||||
#if CLKMULT==5
|
||||
/* Задаёт POWS0 = 4L; данные POWS0. */
|
||||
#define POWS0 4L
|
||||
/* Задаёт POWS1 = 80L; данные POWS1. */
|
||||
#define POWS1 80L
|
||||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
#endif
|
||||
|
||||
/* Начинает функцию RESET; назначение модуля — последовательный вывод данных канала индикации. */
|
||||
void RESET()
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Вызывает DCLK с аргументами (0) в текущей последовательности операций. */
|
||||
DCLK(0);
|
||||
/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */
|
||||
#if POWS1>0
|
||||
/* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */
|
||||
DSP28x_usDelay(POWS1);
|
||||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
#endif
|
||||
/* Вызывает DOUT с аргументами (1) в текущей последовательности операций. */
|
||||
DOUT(1);
|
||||
/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */
|
||||
#if POWS1>0
|
||||
/* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */
|
||||
DSP28x_usDelay(POWS1);
|
||||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
#endif
|
||||
/* Вызывает DOUT с аргументами (0) в текущей последовательности операций. */
|
||||
DOUT(0);
|
||||
/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */
|
||||
#if POWS1>0
|
||||
/* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */
|
||||
DSP28x_usDelay(POWS1);
|
||||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
#endif
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
/* Начинает функцию SENDBIT; назначение модуля — последовательный вывод данных канала индикации. */
|
||||
void SENDBIT(int x)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Выставляет передаваемый бит DATA до подъёма CLOCK, сохраняя его на протяжении высокого уровня такта. */
|
||||
DOUT(x); DCLK(1);
|
||||
/* Условие компиляции POWS0>0: выбранный блок включается в текущий вариант прошивки. */
|
||||
#if POWS0>0
|
||||
/* Вызывает DSP28x_usDelay с аргументами (POWS0) в текущей последовательности операций. */
|
||||
DSP28x_usDelay(POWS0);
|
||||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
#endif
|
||||
/* Опускает CLOCK при ещё действительном DATA, чтобы сохранить передаваемый бит на отрицательном фронте такта. */
|
||||
DCLK(0);
|
||||
/* Вариант B: задержка между DCLK(0) и DOUT(0) удерживает DATA после спада CLOCK; POWS0+1 — прежний счётчик циклов TI, не микросекунды. */
|
||||
DSP28x_usDelay(POWS0+1);
|
||||
/* Сбрасывает DATA после завершения паузы удержания, возвращая линию к нулю перед следующим битом. */
|
||||
DOUT(0);
|
||||
/* Условие компиляции POWS1>0: выбранный блок включается в текущий вариант прошивки. */
|
||||
#if POWS1>0
|
||||
/* Вызывает DSP28x_usDelay с аргументами (POWS1) в текущей последовательности операций. */
|
||||
DSP28x_usDelay(POWS1);
|
||||
/* Закрывает условный блок препроцессора; дальнейшие строки относятся к внешнему уровню. */
|
||||
#endif
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
/* Начинает функцию kanal_Send; назначение модуля — последовательный вывод данных канала индикации. */
|
||||
void kanal_Send(int adr, long dat, int dot)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Объявляет Word — слово; data — данные; aliq_part — данные aliq_part; dg — данные dg. */
|
||||
long Word,data,aliq_part,dg[4];
|
||||
/* Объявляет i — данные i; j — данные j; bit — представление регистра отдельными битовыми полями; byt — данные byt; addr — данные addr. Начальное значение задаётся справа от знака равенства. */
|
||||
int i,j,bit,byt,addr,sgn=0,punkt=0,aliq_len=0,full_len, isdot=0;
|
||||
|
||||
/* Проверяет if(adr>1); последующий оператор выполняется только при истинном условии. */
|
||||
if(adr>1) // Лампочки
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Записывает Word значением dat; слово. */
|
||||
Word =dat;
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
|
||||
else
|
||||
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Проверяет if(dat<0) sgn=1; последующий оператор выполняется только при истинном условии. */
|
||||
if(dat<0) sgn=1;
|
||||
/* Записывает data значением labs(dat); данные. */
|
||||
data = labs(dat);
|
||||
|
||||
/* Проверяет if(dot>=0 и dot<4) isdot = 1; последующий оператор выполняется только при истинном условии. */
|
||||
if(dot>=0 && dot<4) isdot = 1;
|
||||
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
|
||||
else dot=0;
|
||||
|
||||
/* Записывает aliq_part значением data; данные aliq_part. */
|
||||
aliq_part = data;
|
||||
/* Цикл for(i=0;i<dot;i++) aliq_part/=10;; задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for(i=0;i<dot;i++) aliq_part/=10;
|
||||
|
||||
/* Записывает dat значением aliq_part; данные dat. */
|
||||
dat = aliq_part;
|
||||
/* Повторяет или ожидает, пока выполняется while(dat>0). */
|
||||
while(dat>0)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Делит dat значением 10; данные dat. */
|
||||
aliq_len++; dat/=10;
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
/* Записывает dat значением data; данные dat. */
|
||||
dat = data;
|
||||
|
||||
/* Записывает full_len значением aliq_len+sgn; данные full_len. */
|
||||
full_len = aliq_len+sgn;
|
||||
/* Проверяет if(full_len==0) full_len=1; последующий оператор выполняется только при истинном условии. */
|
||||
if(full_len==0) full_len=1;
|
||||
/* Увеличивает full_len значением dot; данные full_len. */
|
||||
full_len += dot;
|
||||
|
||||
/* Цикл for(i=0; i<(full_len-4);i++); задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for(i=0; i<(full_len-4);i++)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Начинает цикл с проверкой условия после тела: первый проход выполняется всегда. */
|
||||
dot--; dat/=10;
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
/* Проверяет if(dot<0) dot=0; последующий оператор выполняется только при истинном условии. */
|
||||
if(dot<0) dot=0;
|
||||
/* Записывает punkt значением 1<<dot; данные punkt. */
|
||||
punkt = 1<<dot;
|
||||
/* Проверяет if(punkt==1) punkt=0; последующий оператор выполняется только при истинном условии. */
|
||||
if(punkt==1) punkt=0;
|
||||
|
||||
/* Записывает dg[3] значением (dat)/1000; данные dg. */
|
||||
dg[3] = (dat)/1000;
|
||||
/* Записывает dg[2] значением (dat%1000)/100; данные dg. */
|
||||
dg[2] = (dat%1000)/100;
|
||||
/* Записывает dg[1] значением (dat%100)/10; данные dg. */
|
||||
dg[1] = (dat%100)/10;
|
||||
/* Записывает dg[0] значением (dat%10); данные dg. */
|
||||
dg[0] = (dat%10);
|
||||
|
||||
/* Проверяет if(dg[0]+dg[1]+dg[2]+dg[3]==0); последующий оператор выполняется только при истинном условии. */
|
||||
if(dg[0]+dg[1]+dg[2]+dg[3]==0)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Записывает punkt значением 0; dot=0; sgn=0; данные punkt. */
|
||||
punkt=0; dot=0; sgn=0;
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
/* Проверяет if(isdot); последующий оператор выполняется только при истинном условии. */
|
||||
if(isdot)
|
||||
/* Цикл for(i=3;i>0;i--); задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for(i=3;i>0;i--)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Проверяет if((dg[i]==0) и (i!=dot)); последующий оператор выполняется только при истинном условии. */
|
||||
if((dg[i]==0)&&(i!=dot))
|
||||
/* Записывает dg[i] значением 0xF; данные dg. */
|
||||
dg[i]=0xF; // Это значит пусто
|
||||
/* Выполняет альтернативу, если предыдущее условие if оказалось ложным. */
|
||||
else break;
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
/* Проверяет if(sgn); последующий оператор выполняется только при истинном условии. */
|
||||
if(sgn)
|
||||
/* Цикл for(i=1;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for(i=1;i<4;i++)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Проверяет if( (dg[i]==0xF) или (i==3)); последующий оператор выполняется только при истинном условии. */
|
||||
if( (dg[i]==0xF)||(i==3))
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Записывает dg[i] значением 0xA; данные dg. */
|
||||
dg[i]=0xA; // Это значит минус
|
||||
/* Прерывает ближайший цикл или ветвь switch и продолжает после него. */
|
||||
break;
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
} }
|
||||
|
||||
/* Цикл for(i=0;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for(i=0;i<4;i++)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Записывает dg[i] значением digits[dg[i]]; данные dg. */
|
||||
dg[i] = digits[dg[i]];
|
||||
/* Проверяет if((punkt>>i)&1) dg[i]+= 128; последующий оператор выполняется только при истинном условии. */
|
||||
if((punkt>>i)&1) dg[i]+= 128;
|
||||
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
/* Записывает Word значением ((dg[0] ) & 0x000000FF) | ((dg[1]<<8 ) & 0x0000FF00) |; слово. */
|
||||
Word = ((dg[0] ) & 0x000000FF) | ((dg[1]<<8 ) & 0x0000FF00) |
|
||||
/* Продолжает список аргументов, полей или выражение ((dg[2]<<16) & 0x00FF0000) | ((dg[3]<<24) & 0xFF000000);; порядок элементов сохраняется. */
|
||||
((dg[2]<<16) & 0x00FF0000) | ((dg[3]<<24) & 0xFF000000);
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
/* Записывает addr значением readr[adr]; данные addr. */
|
||||
addr = readr[adr];
|
||||
|
||||
/* Цикл for (i=0;i<4;i++); задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for (i=0;i<4;i++)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Проверяет if(addr>0x10) break; последующий оператор выполняется только при истинном условии. */
|
||||
if(addr>0x10) break;
|
||||
|
||||
/* Цикл for (j=0;j<8;j++); задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for (j=0;j<8;j++)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Записывает bit значением Word & 1; Word >>= 1; представление регистра отдельными битовыми полями. */
|
||||
bit = Word & 1; Word >>= 1;
|
||||
/* Вызывает SENDBIT с аргументами (bit) в текущей последовательности операций. */
|
||||
SENDBIT(bit);
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
|
||||
/* Записывает byt значением addr; данные byt. */
|
||||
byt = addr;
|
||||
/* Цикл for (j=0;j<6;j++); задаёт начальное значение, условие продолжения и шаг перебора. */
|
||||
for (j=0;j<6;j++)
|
||||
/* Открывает составной блок или описание полей; следующие строки принадлежат этому уровню вложенности. */
|
||||
{
|
||||
/* Записывает bit значением byt & 1; byt >>= 1; представление регистра отдельными битовыми полями. */
|
||||
bit = byt & 1; byt >>= 1;
|
||||
/* Вызывает SENDBIT с аргументами (bit) в текущей последовательности операций. */
|
||||
SENDBIT(bit);
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
/* Изменяет счётчик в выражении addr++; на один для следующего шага. */
|
||||
addr++;
|
||||
|
||||
/* Вызывает RESET с аргументами () в текущей последовательности операций. */
|
||||
RESET();
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
/* Закрывает текущий блок или список полей; следующие операторы относятся к внешнему уровню. */
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
Бальзам-167: два проверочных варианта задержки индикации
|
||||
Дата сборки: 12.10.2026.
|
||||
|
||||
A_delay_before_clock_fall
|
||||
BIN: UKSSTMS320F28335_A_delay_before_clock_fall_fa20ed0+.bin
|
||||
Дополнительная задержка стоит ПЕРЕД спадом CLOCK.
|
||||
Последовательность: DSP28x_usDelay(POWS0+1); DCLK(0); DOUT(0).
|
||||
Назначение: продлить высокий уровень CLOCK при действительном DATA.
|
||||
Размер: 32246 байт. Запас до области параметров AT25256B: 262 байта.
|
||||
SHA-256: C28337E35996AED330E22BC014EF9D15D06C9A1F5CFCCCE27EAD75FB1AC565F9
|
||||
|
||||
B_delay_after_clock_fall
|
||||
BIN: UKSSTMS320F28335_B_delay_after_clock_fall_fa20ed0+.bin
|
||||
Дополнительная задержка стоит ПОСЛЕ спада CLOCK, МЕЖДУ DCLK(0) и DOUT(0).
|
||||
Последовательность: DCLK(0); DSP28x_usDelay(POWS0+1); DOUT(0).
|
||||
Назначение: удержать DATA после спада CLOCK перед сбросом линии данных.
|
||||
Размер: 32248 байт. Запас до области параметров AT25256B: 260 байт.
|
||||
SHA-256: 1ABA3835FFA39649E9922E107B6DBAAA2605F7C4ED80631D583973EFC2DEC215
|
||||
|
||||
В каждом варианте только одна дополнительная задержка POWS0+1.
|
||||
В обоих вариантах DATA сохраняется до спада CLOCK и сбрасывается после него.
|
||||
Общие условные задержки POWS0 и POWS1 и разделитель RESET сохранены.
|
||||
При CLKMULT=2 значения POWS0+1=1 и POWS1=30 являются аргументами
|
||||
цикловой функции TI DSP28x_usDelay, а не длительностями в микросекундах.
|
||||
|
||||
Оба варианта полностью собраны TI C2000 22.6.0.LTS из текущего проекта.
|
||||
Базовый коммит: fa20ed085bdca15fec47c79b72f50525653e103d; сборки помечены dirty.
|
||||
Для каждого варианта при компиляции подставлен отдельный kanal.c,
|
||||
сохранённый рядом с его BIN. Основной Source/Internal/kanal.c при подготовке
|
||||
этой пары не изменялся. Общие параметры компиляции и прочие модули одинаковы;
|
||||
паспорта также содержат собственное время сборки каждого варианта.
|
||||
|
||||
Проверено: полный цикл компиляции и линковки, структура SCI8 и предел EEPROM,
|
||||
соответствие итогового BIN кандидату hex2000, расположение задержек в машинном
|
||||
коде SENDBIT, передача 0 и 1 на обоих фронтах в модели логических уровней,
|
||||
одинаковый код DCLK/DOUT между вариантами и прежний код разделителя RESET.
|
||||
Физические длительности сигналов и отсутствие строба требуют проверки на плате.
|
||||
File diff suppressed because one or more lines are too long
@@ -1,48 +0,0 @@
|
||||
Бальзам-167: проверочная прошивка с исправлением TESTLAMP
|
||||
Сборка: 13.10.2026, 11:00:35 (Москва, UTC+3).
|
||||
|
||||
Готовый образ:
|
||||
UKSSTMS320F28335_testlamp_fix_fa20ed0+.bin
|
||||
Размер: 32272 байта. Запас до параметров AT25256B: 236 байт.
|
||||
SHA-256: bfe4c3c9b55bb5022f38f254929f893e5eaab57ef3d3fa31771a6b6f97f877a4
|
||||
Паспорт: UKSSTMS320F28335_testlamp_fix_fa20ed0+.bin.manifest.json
|
||||
Архив этой сборки: fa20ed08+_2026-10-13_11-00-35_UTC+3.
|
||||
|
||||
Исправления:
|
||||
1. В get_Buttons для dsk_EPLT накопительный фильтр получает предыдущее
|
||||
значение bTestLamp вместо постоянного нуля. Раньше даже один низкий
|
||||
отсчёт GPIO26 при удержании кнопки сразу отключал тест, а следующий
|
||||
высокий отсчёт мог снова его включить. Это переключало пакеты ламп
|
||||
и семисегментных индикаторов между рабочим и тестовым режимами.
|
||||
Порог 1000 по-прежнему измеряется опросами главного цикла.
|
||||
2. cpu_timer1_isr_PULT ограничивает IER маской MINT13 и исключает собственный
|
||||
Timer1 (INT13). Прежнее IER |= MINT13 включало дополнительные источники
|
||||
вместо ограничения приоритетов и могло разрешить повторный вход Timer1.
|
||||
Вложенная передача больше не может перемешать DATA/CLK, счётчик каналов
|
||||
и фазу яркости. В машинном коде перед EINT проверено AND IER, #0x0139.
|
||||
|
||||
Штатная тестовая последовательность what_is сохранена: цифры меняются
|
||||
и тестовая маска ламп переключается каждые 500 тактов Timer1 (0,5 секунды).
|
||||
Это исправление относится к частому нерегулярному мерцанию поверх теста.
|
||||
Порядок уровней и задержек SENDBIT/RESET взят из текущего kanal.c проекта;
|
||||
для этой сборки он не изменялся. В образ вошли уже имевшиеся правки
|
||||
ecan.c, measure.c и kanal.c.
|
||||
|
||||
Проверено:
|
||||
- настоящие get_Buttons, er_anal, what_is и обработчик пульта в хостовой
|
||||
модели при O3; короткие провалы входа при удержании TESTLAMP;
|
||||
- тестовые пакеты ламп и цифр при уже включённой рабочей лампе;
|
||||
- отсутствие повторного входа ISR, отпускание и удалённая команда теста;
|
||||
- сохранение обычного PWM: шесть включённых тактов из десяти;
|
||||
- возвращение каждой старой ошибки отдельно вызывает провал теста;
|
||||
- полная компиляция и линковка TI C2000 22.6.0.LTS, O3, COFF, FPU32;
|
||||
- SCI8, четыре RAM-блока, границы AT25256B и совпадение BIN с кандидатом;
|
||||
- UTF-8 и русские пояснения к изменённому и добавленному коду.
|
||||
|
||||
Повторная проверка: python tests/testlamp/run_test.py
|
||||
Повторная сборка: python Bin/TestLampFix/rebuild.py
|
||||
|
||||
На физической плате эта прошивка пока не проверена. Для проверки повторить
|
||||
сценарий пользователя: включённые рабочие лампы, нажатие и удержание TESTLAMP,
|
||||
затем отпускание. Штатные изменения теста раз в 0,5 секунды сохраняются;
|
||||
быстрых переключений между тестовыми и рабочими показаниями быть не должно.
|
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -9,8 +9,8 @@
|
||||
|
||||
/* Условие компиляции BALSAM == 167: выбранный блок включается в текущий вариант прошивки. */
|
||||
#if BALSAM == 167
|
||||
/* Задаёт OBOROT = STRAIGHT; данные OBOROT. */
|
||||
#define OBOROT STRAIGHT
|
||||
/* Задаёт OBOROT = REVERSE для профиля 167; pulto.c сравнивает этот символ со STRAIGHT при выборе порядка отправки регистров 0 и 1 на индикаторы. */
|
||||
#define OBOROT REVERSE
|
||||
/* Определяет защитный символ или переключатель CALIB_RS для последующей компиляции. */
|
||||
#define CALIB_RS
|
||||
/* Определяет защитный символ или переключатель OWEN для последующей компиляции. */
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
******************************************************************************
|
||||
TMS320C2000 Linker PC v22.6.0
|
||||
******************************************************************************
|
||||
>> Linked Tue Oct 13 14:10:06 2026
|
||||
>> Linked Tue Oct 13 17:12:29 2026
|
||||
|
||||
OUTPUT FILE NAME: <K:/git_project/Balsam_167_periph/UKSSTMS320F28335/../bin/UKSSTMS320F28335.out>
|
||||
ENTRY POINT SYMBOL: "_c_int00" address: 0000a8d9
|
||||
|
||||
Reference in New Issue
Block a user