Files
Balsam_167/Source/Internal/Include/ump_control_impl.h
andrey eb2ff79932 Устранена зависимость дискретов СИФУ от основного цикла в 166
Фронты START/STOP обрабатываются при принятии командного слова CAN/RS,
а окончание импульса обслуживается таймером. STOP имеет приоритет,
перекрытие выходов исключено, сохранена защита от самопуска при включении.
Загрузка параметров больше не подменяет живые команды нагрузки.

Добавлены подробные русские комментарии во все собственные C-модули
и основные заголовки, описание поведения и host-тест автомата.
Обновлены файлы прошивки. Полная сборка TI 22.6.1.LTS и тесты пройдены;
проверка на физической плате не выполнялась.
2026-09-23 01:28:11 +03:00

84 lines
3.2 KiB
C

/* Ïîäêëþ÷àåòñÿ òîëüêî èç DAC.c; â host-òåñòå — ñ ïîäìåíîé GPIO/IRQ. */
#ifndef UMP_CONTROL_IMPL_H
#define UMP_CONTROL_IMPL_H
/* Àïïàðàòíàÿ îá¸ðòêà àâòîìàòà. Õðàíèì å¸ â ñóùåñòâóþùåì DAC.c, ÷òîáû
* ñòàðûé ïðîåêò CCS è íîâûé CCS12 ñîáèðàëè îäèíàêîâûé íàáîð èñõîäíèêîâ.
* Âñå âõîäû íèæå ñîõðàíÿþò ïðåæíþþ ìàñêó IRQ; íåëüçÿ ïðîñòî äåëàòü EINT
* ïðè âûõîäå, ïîñêîëüêó âûçîâ âîçìîæåí èç óæå çàùèù¸ííîãî îáðàáîò÷èêà. */
static volatile UMP_PULSE_STATE ump_pulse;
static volatile unsigned int ump_pulse_enabled;
static void UMP_apply_outputs(unsigned int previous_output, unsigned int previous_relay)
{
if (previous_output != ump_pulse.output) {
/* Ñíà÷àëà ñíèìàåì ñòàðûé ñèãíàë, çàòåì âûñòàâëÿåì íîâûé.
* Ïðîìåæóòî÷íîå ñîñòîÿíèå — îáà âûêëþ÷åíû, à íå îáà âêëþ÷åíû. */
clear_START_DPTB();
clear_STOP_DPTB();
if (ump_pulse.output == UMP_PULSE_START) set_START_DPTB();
if (ump_pulse.output == UMP_PULSE_STOP) set_STOP_DPTB();
}
if (previous_relay != ump_pulse.relay) {
if (ump_pulse.relay) set_RES_OUT_2();
else clear_RES_OUT_2();
}
/* Ñòàðîå èìÿ îñòàâëåíî äëÿ ïðîòîêîëà ëîããåðà. Ýòî òåïåðü îòðàæåíèå
* òàéìåðà àâòîìàòà, à íå ïåðåìåííàÿ, êîòîðóþ îäíîâðåìåííî ïðàâèò main. */
IMPowse = ump_pulse.remaining;
}
void UMP_pulse_init(void)
{
unsigned int saved = __disable_interrupts();
if (Desk == dsk_LOAD) {
ump_pulse_init(&ump_pulse, Commands);
clear_START_DPTB(); clear_STOP_DPTB(); clear_RES_OUT_2();
IMPowse = 0;
/* Ðàçðåøàåì îáðàáîòêó òîëüêî ïîñëå çàãðóçêè ïàðàìåòðîâ è íàñòðîéêè
* ÖÀÏ. Êîìàíäû äî ýòîé òî÷êè íå èñïîëíÿþòñÿ çàäíèì ÷èñëîì. */
ump_pulse_enabled = 1;
}
__restore_interrupts(saved);
}
void UMP_commands_write(unsigned int commands)
{
unsigned int saved = __disable_interrupts();
unsigned int output = ump_pulse.output, relay = ump_pulse.relay;
Commands = commands;
if (Desk == dsk_LOAD && ump_pulse_enabled) {
/* Âûïîëíÿåì ôðîíò â ìîìåíò ïðèíÿòèÿ ñëîâà. Íåò î÷åðåäè, êîòîðóþ
* main äîëæåí îïðîñèòü ïîñëå äëèòåëüíîãî îáðàùåíèÿ ê EEPROM.
* Çäåñü òîëüêî íåñêîëüêî îïåðàöèé ñ ïàìÿòüþ/GPIO, áåç îæèäàíèé. */
ump_pulse_accept(&ump_pulse, commands, (unsigned int)READY_FREQ);
UMP_apply_outputs(output, relay);
}
__restore_interrupts(saved);
}
void UMP_pulse_tick(void)
{
unsigned int saved = __disable_interrupts();
unsigned int output = ump_pulse.output, relay = ump_pulse.relay;
if (Desk == dsk_LOAD && ump_pulse_enabled) {
ump_pulse_tick(&ump_pulse);
UMP_apply_outputs(output, relay);
}
__restore_interrupts(saved);
}
void UMP_reset_parameter_commands(void)
{
unsigned int saved = __disable_interrupts();
/* EEPROM ñîäåðæèò ïàðàìåòðû, íî íå ÿâëÿåòñÿ èñòî÷íèêîì êîìàíä ïóñêà.
* Ñîõðàíÿåì ïîñëåäíèå ïðèíÿòûå START/STOP è èñòîðèþ ôðîíòîâ àâòîìàòà.
* Íåëüçÿ îáíóëèòü èõ ïðè Load/Default: òàéìåð ÖÀÏ ÷èòàåò òîò æå óðîâåíü,
* à ñëåäóþùèé ïîâòîð ïàêåòà ñ åäèíèöåé íå äîëæåí ñòàòü ëîæíûì ôðîíòîì.
* Äðóãèå ðåæèìû ïëàòû ñîõðàíÿþò ïðåæíåå ïîâåäåíèå ïîëíîãî ñáðîñà. */
if (Desk == dsk_LOAD) Commands &= UMP_START_MASK | UMP_STOP_MASK;
else Commands = 0;
__restore_interrupts(saved);
}
#endif