/** * @file pulto.c * @brief Периодическое обслуживание пульта индикации. * * Обработчик Timer1 обновляет яркость, маску ламп, числовые каналы и признак * связи с ведущим устройством. Работа выполняется в прерывании, поэтому обмен * с общими переменными должен оставаться коротким; частоты мигания вычисляются * из READY_FREQ и изменятся при смене базовой частоты таймера. */ #include "DSP2833x_Device.h" // DSP2833x Headerfile Include File #include "DSP2833x_SWPrioritizedIsrLevels.h" #include "RS485.h" #include "message.h" #include "filter_bat2.h" #include "measure.h" #include "package.h" #include "pulto.h" #include "kanal.h" #include "peripher.h" /** @brief Маска мигающих сегментов и тестовое число режима самопроверки. */ unsigned long isMask; int isNumb; int quaLamp = 6; unsigned long Lonely=0; /** * @brief Выполняет шаг визуального теста всех цифр и сегментов. * @details Через BLINK_TIME изменяет цифру 0..9 и попеременно включает либо * гасит полную маску, позволяя заметить неисправный сегмент индикатора. */ void what_is() { static unsigned int count_blink; static int numb=0; if(++count_blink >= BLINK_TIME) { count_blink=0; numb++; if(numb==10) numb=0; isNumb = numb*1000 + numb*100 + numb*10 +numb; if(isMask) isMask = 0; else isMask = 0xFFFFFFFF; } } /** * @brief Периодический ISR управления панелью EPLT. * @details Поддерживает программный PWM яркости, отображает актуальные каналы, * управляет лампами и отслеживает тайм-аут связи через Lonely. Перед выходом * восстанавливает PIEIER и подтверждает источник Timer1. */ interrupt void cpu_timer1_isr_PULT(void) { static int cownt=0,count_bright; unsigned int light=0, i; unsigned int Alone = 20*READY_FREQ; EALLOW; CpuTimer1.InterruptCount++; IER |= MINT13; // Set "global" priority EINT; EDIS; // This is needed to disable write to EALLOW protected registers if(!cReset) ServiceDog(); if(++CanPowse >= CANPOWSE) { CanPowse = 0; CanGO = 1; } toggle_ONLINE(); // строб дла ПЛИС toggle_RES_OUT_1(); // типа это готовность toggle_RES_OUT_2(); // на всакий /* Насыщение предотвращает переполнение счётчика после длительной потери связи. */ if(++Lonely > Alone) Lonely = Alone; if(++count_bright >= maximum_bright) count_bright = 0 ; for(i=0; i2) cownt=0; if(cTestLamp|bTestLamp) { what_is(); if(cownt == 0) kanal_Send(0,isNumb,4); if(cownt == 1) kanal_Send(1,isNumb,4); kanal_Send(2,isMask,0); if(cownt == 2) kanal_Send(3,isMask,0); } else if(cLiteFire) { if(cownt == 0) kanal_Send(0,8888,1); if(cownt == 1) kanal_Send(1,8888,1); kanal_Send(2,0xFFFF & light,0); if(cownt == 2) kanal_Send(3,0xFFFF,0); } else if((Lonely >= Alone)) { if(cownt == 0) kanal_Send(0,0,0); if(cownt == 1) kanal_Send(1,0,0); kanal_Send(2,0,0); if(cownt == 2) kanal_Send(3,0,0); } else { #if OBOROT == STRAIGHT if(cownt == 0) kanal_Send(0,modbus[0],1); if(cownt == 1) kanal_Send(1,modbus[1],1); #else if(cownt == 0) kanal_Send(0,modbus[1],1); if(cownt == 1) kanal_Send(1,modbus[0],1); #endif kanal_Send(2,modbus[2] & light,0); if(cownt == 2) kanal_Send(3,modbus[3],0); } }