Фронты START/STOP обрабатываются при принятии командного слова CAN/RS, а окончание импульса обслуживается таймером. STOP имеет приоритет, перекрытие выходов исключено, сохранена защита от самопуска при включении. Загрузка параметров больше не подменяет живые команды нагрузки. Добавлены подробные русские комментарии во все собственные C-модули и основные заголовки, описание поведения и host-тест автомата. Обновлены файлы прошивки. Полная сборка TI 22.6.1.LTS и тесты пройдены; проверка на физической плате не выполнялась.
208 lines
4.2 KiB
C
208 lines
4.2 KiB
C
/* Èíèöèàëèçàöèÿ è ôîíîâûé öèêë ïëàòû. Ïîñëå íàñòðîéêè GPIO, îáìåíà,
|
|
* ïàðàìåòðîâ è ÖÀÏ UMP_pulse_init ðàçðåøàåò ñâåæèå êîìàíäû ÑÈÔÓ.
|
|
* Â main îñòàþòñÿ òåëåìåòðèÿ, EEPROM è ðàçáîð ãîòîâûõ RS-ïàêåòîâ.
|
|
* CAN-ïóñê è îêîí÷àíèå èìïóëüñà ðàáîòàþò â IRQ, íå îæèäàÿ main.
|
|
* RS-êîìàíäà åù¸ äîëæíà ïðîéòè ïðîâåðêó CRC â get_command èç main.
|
|
*/
|
|
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
|
|
|
|
#include "cntrl_adr.h"
|
|
#include "RS485.h"
|
|
#include "BIOS_DSP.h"
|
|
#include "Message.h"
|
|
#include "filter_bat2.h"
|
|
#include "measure.h"
|
|
#include "package.h"
|
|
|
|
#include "spise2p.h"
|
|
|
|
#include "tools.h"
|
|
#include "peripher.h"
|
|
#include "ADC.h"
|
|
#include "DAC.h"
|
|
|
|
#include "ecan.h"
|
|
#include "kanal.h"
|
|
#include "pulto.h"
|
|
#include "log_to_mem.h"
|
|
|
|
#include "measure.h"
|
|
extern void DSP28x_usDelay(Uint32 Count);
|
|
|
|
void timer_Init()
|
|
{
|
|
EALLOW; // This is needed to write to EALLOW protected registers
|
|
if(Desk==dsk_EPLT) PieVectTable.XINT13 = &cpu_timer1_isr_PULT;
|
|
else PieVectTable.XINT13 = &cpu_timer1_isr_SENS;
|
|
EDIS; // This is needed to disable write to EALLOW protected registers
|
|
|
|
ConfigCpuTimer(&CpuTimer1, SYSCLKOUT/1000000, 1000000/READY_FREQ);
|
|
CpuTimer1Regs.TCR.all = 0x4020; // Use write-only instruction to set TSS bit = 0
|
|
IER |= M_INT13;
|
|
}
|
|
|
|
void main()
|
|
{
|
|
int i,j,mask;
|
|
static unsigned int cancount[2], cancell[2];
|
|
RS_DATA * rs;
|
|
int presbyt=0;
|
|
|
|
InitSysCtrl();
|
|
|
|
// Disable CPU interrupts and clear all CPU interrupt flags:
|
|
DINT;
|
|
|
|
InitPieCtrl();
|
|
|
|
IER = 0x0000;
|
|
IFR = 0x0000;
|
|
|
|
InitPieVectTable();
|
|
init_zone7();
|
|
|
|
get_Mode();
|
|
InitCan(0,Mode);
|
|
|
|
create_uart_vars(sizeof(CMD_TO_TMS));
|
|
setup_uart(COM_1,115200);
|
|
setup_uart(COM_2,115200);
|
|
InitSeeprom();
|
|
|
|
setup_leds_line();
|
|
led1_on();
|
|
led2_off();
|
|
for (i=0;i<10;i++)
|
|
{
|
|
pause_us(50000);
|
|
led2_toggle();
|
|
led1_toggle();
|
|
}
|
|
led1_off();
|
|
led2_off();
|
|
unsetup_leds_line();
|
|
|
|
clear_mem();
|
|
set_cntrl_addr(Mode,16);
|
|
timer_Init();
|
|
EnableInterrupts();
|
|
|
|
if(Desk!=dsk_EPLT)
|
|
{
|
|
setup_adc();
|
|
Init_sensors();
|
|
}
|
|
Init_packMask();
|
|
|
|
Load_params();
|
|
Init_sensors_more();
|
|
|
|
if(Desk==dsk_LOAD)
|
|
Setup_DAC_time();
|
|
|
|
/* Çàâåðøåíà íà÷àëüíàÿ íàñòðîéêà: òîëüêî òåïåðü ðàçðåøàåì äèñêðåòû. */
|
|
UMP_pulse_init();
|
|
LastMode = Mode;
|
|
|
|
EALLOW;
|
|
SysCtrlRegs.WDCR= 0x2F;
|
|
EDIS;
|
|
|
|
while(1)
|
|
{
|
|
/* ×òåíèå ëîããåðà ïî CAN íå áëîêèðóåò öèêë óïðàâëåíèÿ. */
|
|
UMP_CAN_service();
|
|
if(CanGO)
|
|
{
|
|
CanGO=0;
|
|
for(i=0;i<2;i++)
|
|
if(Cancount[i])
|
|
if(++cancount[i] >= Cancount[i])
|
|
{
|
|
cancount[i] = 0;
|
|
while(1)
|
|
{
|
|
if(cancell[i] >= 0x80) cancell[i]=0;
|
|
mask = Maska[i][cancell[i]/16] >> (cancell[i]%16);
|
|
if(!mask) cancell[i] = (cancell[i] + 0x10) & 0xFFF0;
|
|
else
|
|
{
|
|
while(!(mask & 1))
|
|
{
|
|
cancell[i]++; mask >>= 1;
|
|
}
|
|
break;
|
|
} }
|
|
CAN_send(0,modbus,cancell[i]);
|
|
cancell[i]+=3;
|
|
} }
|
|
|
|
if(cDefParam)
|
|
{
|
|
cDefParam=0;
|
|
Default_params();
|
|
}
|
|
|
|
if(cSaveParam)
|
|
{
|
|
cSaveParam=0;
|
|
Save_params();
|
|
}
|
|
|
|
if(cLoadParam)
|
|
{
|
|
cLoadParam=0;
|
|
Load_params();
|
|
}
|
|
|
|
if(cKoefCalc)
|
|
{
|
|
cKoefCalc=0;
|
|
calc_sensor_koef();
|
|
}
|
|
|
|
get_Buttons();
|
|
|
|
if(Desk==dsk_COMM)
|
|
{
|
|
if(!bTermoCal & presbyt) cSaveParam=1;
|
|
presbyt = bTermoCal;
|
|
}
|
|
|
|
/* START/STOP èñïîëíÿþòñÿ ïðè ïðè¸ìå CAN/RS, ñíèìàþòñÿ òàéìåðîì.
|
|
* Çäåñü áîëüøå íåò îïðîñà óðîâíÿ: main ìîæåò îæèäàòü EEPROM. */
|
|
|
|
/* Ñíèìîê ïîñëå îáíîâëåíèÿ âõîäîâ è ôîðìèðîâàíèÿ ïóñêîâûõ âûõîäîâ. */
|
|
ump_log_io();
|
|
|
|
for(i=0;i<2;i++)
|
|
{
|
|
if(i) rs = &rs_a;
|
|
else rs = &rs_b;
|
|
|
|
j = get_command(rs);
|
|
|
|
if(j!=-1)
|
|
{
|
|
Lonely=0;
|
|
led2_toggle();
|
|
switch(j)
|
|
{
|
|
case CMD_INIT: init(rs); break; // íà÷àëüíûå óñòàíîâêè
|
|
case CMD_INITLOAD: initload(rs); break; // íàñòðîéêà çàãðóçêè
|
|
case CMD_RUN: run(rs); break; // çàãðóçèòü áëîê
|
|
case CMD_LOAD: load(rs); break; // çàãðóçèòü áëîê
|
|
case CMD_PEEK: peek(rs); break; // ïðî÷èòàòü à÷åéêó ïàìàòè
|
|
case CMD_POKE: poke(rs); break; // çàïèñàòü â à÷åéêó ïàìàòè
|
|
case CMD_UPLOAD: upload(rs); break; // ïåðåäàòü áëîê ïàìàòè
|
|
case CMD_EXTEND: extendbios(rs); break; // ðàñøèðåííûå êîìàíäû äëà áèîñà
|
|
|
|
case CMD_TFLASH: tflash(rs); break; // ïðîøèòü TMS
|
|
|
|
case CMD_MODBUS_3: ReceiveCommandModbus3(rs); break;
|
|
case CMD_MODBUS_6: ReceiveCommandModbus6(rs); break;
|
|
|
|
default: break;
|
|
} } } } }
|
|
|