Files
Balsam_167/Source/Internal/peripher.c

330 lines
11 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.
/**
* @file peripher.c
* @brief Определение типа платы и управление дискретной периферией.
*
* Читает конфигурационные входы, выбирает режим изделия, коммутирует каналы
* термопар и опрашивает кнопки. Временное переназначение LED-линий сохраняет
* исходные MUX/DIR и должно всегда завершаться unsetup_leds_line(). Таблицы GPIO
* зависят от варианта платы и описаны в 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"
/** @brief Распознанный адрес/режим и признаки установленной периферии платы. */
int Mode,Desk,TermoAD=0,TermoRS=0,TermoSW=0,Kurrent=0,Kalibro=0,Owen=0;
/** @brief Интегрирующие счётчики фильтрации дискретных входов. */
unsigned int INcount0=0,INcount1=0;
/** @brief Снимок диагностических битов дискретной периферии. */
LONGE DigErr;
int MUX_GPIO32,MUX_GPIO48,DIR_GPIO32,DIR_GPIO48;
/**
* @brief Временно переводит GPIO32/GPIO48 в режим обычных цифровых выходов.
* @post Предыдущие MUX/DIR сохранены для unsetup_leds_line().
*/
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;
}
/** @brief Восстанавливает MUX/DIR LED-линий, сохранённые setup_leds_line(). */
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;
}
/**
* @brief Считывает код исполнения платы и формирует её программную конфигурацию.
* @details По комбинации GPIO задаёт Mode/Desk, наличие температурных трактов,
* токовых входов, калибровки и внешнего OWEN. Затем применяет соответствующие
* таблицы направления, MUX и начальных уровней GPIO_table.h.
* @post Все inline-примитивы peripher.h можно безопасно использовать.
*/
void get_Mode()
{
EALLOW;
GpioCtrlRegs.GPAMUX1.all &= 0xFF000000; // 00—11
GpioCtrlRegs.GPAMUX2.all &= 0xFF00003F; // 19—27
GpioCtrlRegs.GPBMUX1.all &= 0xFFFFFFC0; // 32—34
GpioCtrlRegs.GPBMUX2.all &= 0x000FF000; // 48—53, 58—63
GpioCtrlRegs.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_PULT) Desk = dsk_EPLT;
if (Mode==adr_SHKF) Desk = dsk_SHKF;
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;
#ifdef CALIB_RS
if (Desk!=dsk_EPLT) Kalibro = 1;
#else
if( (Desk==dsk_COMM)||(Desk==dsk_SHKF)||
(Desk==dsk_LOAD) ) Kalibro = 1;
#endif
#ifdef OWEN
if (Desk==dsk_COMM) Owen = OWEN_DT;
#endif
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;
}
/**
* @brief Переводит адресные линии мультиплексора термопар в невыбранное состояние.
* @note Используется между каналами, чтобы снизить влияние переходных процессов.
*/
void select_tpl_255(void)
{
if(Desk==dsk_BKSD)
{
#define BKSD_A_tpl_255 ((1L<<11) + (1L<<9) + (1L<<7) + (1L<<3))
GpioDataRegs.GPACLEAR.all = BKSD_A_tpl_255;
}
if(Desk==dsk_COMM)
{
#define COMM_A_tpl_255 ((1L<<27) + (1L<<24) + (1L<<25))
#define COMM_B_tpl_255 ((1L<<(49-32)) + (1L<<(52-32)))
GpioDataRegs.GPASET.all = COMM_A_tpl_255;
GpioDataRegs.GPBSET.all = COMM_B_tpl_255;
}
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;
} }
/**
* @brief Выбирает один физический канал мультиплексора термопар.
* @param n_tpl Номер канала в логической нумерации измерительного модуля.
* @details Номер раскладывается на адресные GPIO с учётом разводки текущего Desk.
*/
void select_tpl_canal(int n_tpl)
{
unsigned long GPIO_A_tpl_set = 0;
unsigned long GPIO_B_tpl_set = 0;
if(Desk==dsk_BKSD)
{
if(!(n_tpl&0x01)) GPIO_A_tpl_set|=(1L<<11);
if(!(n_tpl&0x02)) GPIO_A_tpl_set|=(1L<<9);
if(!(n_tpl&0x04)) GPIO_A_tpl_set|=(1L<<7);
if(!(n_tpl&0x08)) GPIO_A_tpl_set|=(1L<<3);
GpioDataRegs.GPASET.all = GPIO_A_tpl_set;
}
if(Desk==dsk_BKST)
{
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)
{
if(!(n_tpl&0x01)) GPIO_A_tpl_set|=(1L<<27);
if(!(n_tpl&0x02)) GPIO_A_tpl_set|=(1L<<24);
if(!(n_tpl&0x04)) GPIO_A_tpl_set|=(1L<<25);
if(!(n_tpl&0x08)) GPIO_B_tpl_set|=(1L<<(49-32));
if(!(n_tpl&0x10)) GPIO_B_tpl_set|=(1L<<(52-32));
GpioDataRegs.GPACLEAR.all = GPIO_A_tpl_set;
GpioDataRegs.GPBCLEAR.all = GPIO_B_tpl_set;
} }
/**
* @brief Опрашивает кнопки и дискретные входы с программным антидребезгом.
* @details Счётчики INcount* требуют устойчивого уровня несколько циклов;
* подтверждённые состояния переносятся в команды и диагностические биты.
*/
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, 0xFFFF, 0);
InputRep1 = bSecretBt;
InputRep2 = bTermoCal;
}
if(Desk==dsk_EPLT)
{
bTestLamp = er_anal(GpioDataRegs.GPADAT.bit.GPIO26, &INcount0, 1000, 0);
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; // Секретный вход
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;
}