Files
Balsam_167/Source/Internal/peripher.c
Andrey b25e026dec Перенести исправления строба индикации из 167
Перенести настройки таймингов из 13e5bfe373
и относящуюся к индикации часть 04a9d989fb.
Сохранить текущую последовательность DATA/CLOCK ветки 167, удерживать
TESTLAMP при кратких провалах входа и исключить повторный вход Timer1.

Адаптировать тесты TESTLAMP к типу накопителя и кодировкам проекта 166.
Сохранить изменённые исходники и русские комментарии в UTF-8.

Проверка: поведенческие и мутационные тесты TESTLAMP, полная сборка
27 модулей TI C2000 21.12.0.STS и линковка, образ SCI8 30174 байта,
компиляция канала индикации с общей оптимизацией -O3.
2026-10-13 19:18:10 +03:00

272 lines
9.8 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* Выбор типа платы, направления GPIO и чтение входов. get_Mode
* читает аппаратный адрес и выбирает Desk. Один вывод в разных
* режимах может иметь разное назначение. Для нагрузки START=GPIO62,
* STOP=GPIO58, RES_OUT_2=GPIO3 (активный ноль). Направления заданы
* в GPIO_table.h; изменение распиновки требует сверки со схемой.
*/
#include "DSP2833x_Device.h" // DSP281x Headerfile Include File
#include "filter_bat2.h"
#include "measure.h"
#include "RS485.h"
#include "message.h"
#include "package.h"
#include "pulto.h"
#include "peripher.h"
#include "GPIO_table.h"
int Mode,Desk,TermoAD=0,TermoRS=0,TermoSW=0,Kurrent=0,Kalibro=0;
long INcount0=0,INcount1=0;
LONGE DigErr;
int MUX_GPIO32,MUX_GPIO48,DIR_GPIO32,DIR_GPIO48;
void setup_leds_line()
{
MUX_GPIO32 = GpioCtrlRegs.GPBMUX1.bit.GPIO32;
MUX_GPIO48 = GpioCtrlRegs.GPBMUX2.bit.GPIO48;
DIR_GPIO32 = GpioCtrlRegs.GPBDIR.bit.GPIO32;
DIR_GPIO48 = GpioCtrlRegs.GPBDIR.bit.GPIO48;
EALLOW;
GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0;
GpioCtrlRegs.GPBMUX2.bit.GPIO48 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO32 = 1;
GpioCtrlRegs.GPBDIR.bit.GPIO48 = 1;
EDIS;
}
void unsetup_leds_line()
{
EALLOW;
GpioCtrlRegs.GPBMUX1.bit.GPIO32 = MUX_GPIO32;
GpioCtrlRegs.GPBMUX2.bit.GPIO48 = MUX_GPIO48;
GpioCtrlRegs.GPBDIR.bit.GPIO32 = DIR_GPIO32;
GpioCtrlRegs.GPBDIR.bit.GPIO48 = DIR_GPIO48;
EDIS;
}
void get_Mode()
{
EALLOW;
GpioCtrlRegs.GPAMUX1.all &= 0xFF000000; // Обнуляет двухбитовые поля MUX для GPIO0–11 по карте регистров TMS320F28335, выбирая обычный GPIO и сохраняя назначение GPIO12–15.
GpioCtrlRegs.GPAMUX2.all &= 0xFF00003F; // Выбирает обычный GPIO для выводов 19–27: маска сохраняет поля GPIO16–18 и GPIO28–31 в двухбитовой таблице MUX.
GpioCtrlRegs.GPBMUX1.all &= 0xFFFFFFC0; // Обнуляет младшие шесть битов MUX, переводя GPIO32–34 в режим обычных входов или выходов без изменения остальных выводов банка.
GpioCtrlRegs.GPBMUX2.all &= 0x000FF000; // Сохраняет поля GPIO54–57 и переводит GPIO48–53 и GPIO58–63 в обычный GPIO согласно двухбитовой раскладке GPBMUX2.
GpioCtrlRegs.GPADIR.bit.GPIO20 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO21 = 0;
GpioCtrlRegs.GPADIR.bit.GPIO22 = 0;
GpioCtrlRegs.GPBDIR.bit.GPIO51 = 0;
EDIS;
Mode = 1;
Mode += 1 * !GpioDataRegs.GPADAT.bit.GPIO21;
Mode += 2 * !GpioDataRegs.GPADAT.bit.GPIO20;
Mode += 4 * !GpioDataRegs.GPADAT.bit.GPIO22;
Mode += 8 * !GpioDataRegs.GPBDAT.bit.GPIO51;
if( (Mode==adr_POW1)||(Mode==adr_POW2)) Desk = dsk_COMM;
if( (Mode==adr_TRN1)||(Mode==adr_TRN2)) Desk = dsk_BKST;
if( (Mode==adr_LOA1)||(Mode==adr_LOA2)) Desk = dsk_LOAD;
if (Mode==adr_ENG1) Desk = dsk_BKSD;
if (Mode==adr_PLT3) Desk = dsk_EPLT;
if (Mode==adr_SHKF) Desk = dsk_SHKF;
if( (Desk==dsk_COMM)||(Desk==dsk_SHKF)||
(Desk==dsk_LOAD) ) Kalibro = 1;
if( (Desk==dsk_COMM)||(Desk==dsk_LOAD)) Kurrent = 1;
if( (Desk==dsk_BKSD)||(Desk==dsk_BKST)) TermoRS = 1;
if( (Desk==dsk_COMM)||(Desk==dsk_SHKF)) TermoAD = 1;
if( (Desk==dsk_COMM)||(Desk==dsk_BKST)) TermoSW = 2;
if (Desk==dsk_BKSD) TermoSW = 1;
clear_LED_OUT_1();
clear_LED_OUT_2();
clear_RES_OUT_1();
clear_RES_OUT_2();
EALLOW;
switch(Desk)
{
case dsk_COMM: GpioCtrlRegs.GPADIR.all = COMM_GPADIR;
GpioCtrlRegs.GPBDIR.all = COMM_GPBDIR; break;
case dsk_BKSD: GpioCtrlRegs.GPADIR.all = BKSD_GPADIR;
GpioCtrlRegs.GPBDIR.all = BKSD_GPBDIR; break;
case dsk_BKST: GpioCtrlRegs.GPADIR.all = BKST_GPADIR;
GpioCtrlRegs.GPBDIR.all = BKST_GPBDIR; break;
case dsk_EPLT: GpioCtrlRegs.GPADIR.all = PLT2_GPADIR;
GpioCtrlRegs.GPBDIR.all = PLT2_GPBDIR; break;
case dsk_LOAD: GpioCtrlRegs.GPADIR.all = LOAD_GPADIR;
GpioCtrlRegs.GPBDIR.all = LOAD_GPBDIR;
GpioDataRegs.GPASET.bit.GPIO3=1; break;
case dsk_SHKF: GpioCtrlRegs.GPADIR.all = SHKF_GPADIR;
GpioCtrlRegs.GPBDIR.all = SHKF_GPBDIR; break;
}
EDIS;
}
void select_tpl_canal(int n_tpl)
{
if(Desk==dsk_BKSD)
{
#define BKSD_A_tpl_zero ((1L<<11) + (1L<<9) + (1L<<7) + (1L<<3))
GpioDataRegs.GPASET.all = BKSD_A_tpl_zero;
if(n_tpl&0x01) GpioDataRegs.GPACLEAR.bit.GPIO11=1;
if(n_tpl&0x02) GpioDataRegs.GPACLEAR.bit.GPIO9=1;
if(n_tpl&0x04) GpioDataRegs.GPACLEAR.bit.GPIO7=1;
if(n_tpl&0x08) GpioDataRegs.GPACLEAR.bit.GPIO3=1;
}
if(Desk==dsk_BKST)
{
#define BKST_A_tpl_zero ((1L<<11) + (1L<<9) + (1L<<7) + (1L<<3) + (1L<<1) + (1L<<8) + (1L<<6) + (1L<<0) + (1L<<27) + (1L<<24))
#define BKST_B_tpl_zero ((1L<<(53-32)) + (1L<<(50-32)))
GpioDataRegs.GPASET.all = BKST_A_tpl_zero;
GpioDataRegs.GPBSET.all = BKST_B_tpl_zero;
if(n_tpl==0) GpioDataRegs.GPACLEAR.bit.GPIO11=1;
if(n_tpl==1) GpioDataRegs.GPACLEAR.bit.GPIO9=1;
if(n_tpl==2) GpioDataRegs.GPACLEAR.bit.GPIO7=1;
if(n_tpl==3) GpioDataRegs.GPACLEAR.bit.GPIO3=1;
if(n_tpl==4) GpioDataRegs.GPACLEAR.bit.GPIO1=1;
if(n_tpl==5) GpioDataRegs.GPACLEAR.bit.GPIO8=1;
if(n_tpl==6) GpioDataRegs.GPACLEAR.bit.GPIO6=1;
if(n_tpl==7) GpioDataRegs.GPACLEAR.bit.GPIO0=1;
if(n_tpl==8) GpioDataRegs.GPACLEAR.bit.GPIO27=1;
if(n_tpl==9) GpioDataRegs.GPACLEAR.bit.GPIO24=1;
if(n_tpl==10) GpioDataRegs.GPBCLEAR.bit.GPIO53=1;
if(n_tpl==11) GpioDataRegs.GPBCLEAR.bit.GPIO50=1;
}
if(Desk==dsk_COMM)
{
#define COMM_A_tpl_zero ((1L<<27) + (1L<<24) + (1L<<25))
#define COMM_B_tpl_zero ((1L<<(49-32)) + (1L<<(52-32)))
GpioDataRegs.GPACLEAR.all = COMM_A_tpl_zero;
GpioDataRegs.GPBCLEAR.all = COMM_B_tpl_zero;
if(n_tpl&0x01) GpioDataRegs.GPASET.bit.GPIO27=1;
if(n_tpl&0x02) GpioDataRegs.GPASET.bit.GPIO24=1;
if(n_tpl&0x04) GpioDataRegs.GPASET.bit.GPIO25=1;
if(n_tpl&0x08) GpioDataRegs.GPBSET.bit.GPIO49=1;
if(n_tpl&0x10) GpioDataRegs.GPBSET.bit.GPIO52=1;
} }
void get_Buttons()
{
unsigned long butt =0;
unsigned long fluf =0;
if(Desk==dsk_BKSD)
{
bTestLamp = !GpioDataRegs.GPBDAT.bit.GPIO50;
bSecretBt = !GpioDataRegs.GPBDAT.bit.GPIO49;
InputRep0 = bTestLamp;
InputRep1 = bSecretBt;
if(GpioDataRegs.GPADAT.bit.GPIO0) butt +=0x0001;
if(GpioDataRegs.GPADAT.bit.GPIO2) butt +=0x0002;
if(GpioDataRegs.GPADAT.bit.GPIO10)butt +=0x0004;
if(GpioDataRegs.GPADAT.bit.GPIO4) butt +=0x0008;
Inputs.all = butt;
}
/* Ничего такого в действительности нет
if(Desk==dsk_BKST)
{ bSecretBt = !GpioDataRegs.GPBDAT.bit.GPIO63;
InputRep1 = bSecretBt;
return;
} */
if(Desk==dsk_COMM)
{
bSecretBt = !GpioDataRegs.GPBDAT.bit.GPIO53;
bTermoCal = er_anal(!GpioDataRegs.GPBDAT.bit.GPIO50, &INcount0, 500000, 0);
InputRep1 = bSecretBt;
InputRep2 = bTermoCal;
}
if(Desk==dsk_EPLT)
{
/* Сохраняет TESTLAMP до достижения порога фильтра: 1000 означает число опросов главного цикла, а bTestLamp удерживает прежний режим при кратком провале GPIO26, чтобы рабочие маски не прерывали тест индикации. */
bTestLamp = er_anal(GpioDataRegs.GPADAT.bit.GPIO26, &INcount0, 1000, bTestLamp);
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.GPIO23) butt +=0x0020;
if(GpioDataRegs.GPBDAT.bit.GPIO52) butt +=0x0040;
if(GpioDataRegs.GPADAT.bit.GPIO4 ) butt +=0x0080;
if(GpioDataRegs.GPADAT.bit.GPIO25) butt +=0x0100;
if(GpioDataRegs.GPBDAT.bit.GPIO49) butt +=0x0200;
if(GpioDataRegs.GPADAT.bit.GPIO11) butt +=0x0400;
if(GpioDataRegs.GPADAT.bit.GPIO5 ) butt +=0x0800;
if(GpioDataRegs.GPBDAT.bit.GPIO48) butt +=0x1000;
if(GpioDataRegs.GPADAT.bit.GPIO10) butt +=0x2000; // Публикует активный секретный вход GPIO10 в бите 13 слова Inputs; маска 0x2000 задаёт назначенную ему позицию протокола.
Inputs.all = butt;
}
if(Desk==dsk_LOAD)
{
if(!GpioDataRegs.GPADAT.bit.GPIO6) butt +=0x0001; // OMEGA
if(!GpioDataRegs.GPADAT.bit.GPIO8) butt +=0x0002; // Start_1
if(!GpioDataRegs.GPADAT.bit.GPIO11) butt +=0x0004; // Res_in
Inputs.all = butt;
}
if(Desk==dsk_SHKF)
{
if(GpioDataRegs.GPBDAT.bit.GPIO53) fluf += 0x0000010; else butt += 0x0001;
if(GpioDataRegs.GPBDAT.bit.GPIO52) fluf += 0x0000040; else butt += 0x0002;
if(GpioDataRegs.GPADAT.bit.GPIO2) fluf += 0x0001000; else butt += 0x0004;
if(GpioDataRegs.GPADAT.bit.GPIO4) fluf += 0x0002000; else butt += 0x0008;
if(GpioDataRegs.GPADAT.bit.GPIO6) fluf += 0x0004000; else butt += 0x0010;
if(GpioDataRegs.GPADAT.bit.GPIO0) fluf += 0x0008000; else butt += 0x0020;
if(GpioDataRegs.GPADAT.bit.GPIO8) fluf += 0x0010000; else butt += 0x0040;
if(GpioDataRegs.GPADAT.bit.GPIO10) fluf += 0x0020000; else butt += 0x0080;
if(GpioDataRegs.GPADAT.bit.GPIO3) fluf += 0x0040000; else butt += 0x0100;
if(GpioDataRegs.GPADAT.bit.GPIO5) fluf += 0x0080000; else butt += 0x0200;
if(GpioDataRegs.GPADAT.bit.GPIO7) fluf += 0x0100000; else butt += 0x0400;
if(GpioDataRegs.GPADAT.bit.GPIO1) fluf += 0x0200000; else butt += 0x0800;
if(GpioDataRegs.GPADAT.bit.GPIO11) fluf += 0x0400000; else butt += 0x1000;
if(GpioDataRegs.GPADAT.bit.GPIO9) fluf += 0x0800000; else butt += 0x2000;
DigErr.all = fluf;
Inputs.all = butt;
}
butt = 1 * !GpioDataRegs.GPADAT.bit.GPIO21;
butt += 2 * !GpioDataRegs.GPADAT.bit.GPIO20;
butt += 4 * !GpioDataRegs.GPADAT.bit.GPIO22;
butt += 8 * !GpioDataRegs.GPBDAT.bit.GPIO51;
Jumpers = butt;
}