Files
Balsam_167/Source/Internal/main.c
Andrey 13f1a2c5fd Добавить heartbeat и передачу CAN по изменению и таймеру
Для всех Mode передавать пакеты при обновлении данных и повторять каждый через 1300 мс от последнего CAN ACK. Отдельно отправлять heartbeat раз в секунду. Сохранить маски рассылки, отключение потоков нулевым периодом и неблокирующее восстановление после ошибок TX.

Проверены границы периодов, все Mode, занятый mailbox, отмена без CANAA, отсутствие ACK, переполнение Timer1, первый снимок и справедливость потоков. Изменённые модули ecan.c и main.c скомпилированы компилятором TI C2000.
2026-10-16 23:17:00 +03:00

184 lines
4.6 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, обмена,
* параметров и ЦАП 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; /* Счётчики остались для прежних операций main; выбор CAN-пакетов перенесён в независимый сервис. */
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();
CAN_telemetry_service(); /* Обслуживает heartbeat 1 Гц, изменения масок данных и индивидуальные повторы 1,3 с без ожидания CAN ACK. */
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;
} } } } }