#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File #include "DSP2833x_SWPrioritizedIsrLevels.h" #include "filter_bat2.h" #include "package.h" #include "measure.h" #include "package.h" #include "peripher.h" #include "ADC.h" #include "RS485.h" #include "message.h" #include "log_to_mem.h" #include // Это чтобы мерить амплитуду! sqrt без этого будет крив!!! int TPL_CANS=0; // Количество температурных каналов int tpl_cans=0; int cal_addr=0; //int adcurr; FLAG chk,sig; int sens_type[SIZE]; int sens_pair[SIZE]; float Kt[2]; FILTERBAT def_FILTERBAT = DEF_FILTERBAT; FILTERBAT adc_filter[ADC_MAX]; float out_filter[DAT_MAX]; unsigned int CanPowse=CANPOWSE,CanGO=0; unsigned int Caliber_time=0; int GOOD[0x10]; int ZERO[0x10]; ERROR okay; void calc_sensor_koef() { if(TermoRS) { Kt[0] = 129.0/(K150_D - K100_D); } if(TermoAD) { Kt[0] = 100.0/(K400_1 - K300_1); Kt[1] = 100.0/(K400_2 - K300_2); } } interrupt void cpu_timer1_isr_SENS() { static unsigned int count_blink, count_bright, blink_over, blink_alarm, work_lamp, heat_lamp; int TST; 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; } TST = cTestLamp|bTestLamp; if(!sig.bit.Error|TST) toggle_READY(); else clear_READY(); if(++count_bright >= maximum_bright) { count_bright = 0 ; if(work_lamp) set_LED_OUT_1(); else clear_LED_OUT_1(); if(Desk!=dsk_SHKF) { if(heat_lamp) set_LED_OUT_2(); else clear_LED_OUT_2(); } } if(!(cTestLamp|bTestLamp)) if(count_bright == Brightness) { if(Desk!=dsk_SHKF) clear_LED_OUT_2(); clear_LED_OUT_1(); } if(++count_blink >= BLINK_TIME) { count_blink=0; blink_over = ++blink_over&1; blink_alarm = ++blink_alarm&7; if(TST) { #ifdef TST_BLINK heat_lamp = blink_over; work_lamp = blink_over; #else heat_lamp = 1; work_lamp = 1; #endif } else { if(sig.bit.Error) work_lamp = blink_over; else work_lamp = 1; if(bSecretBt|cSecretBt) work_lamp = blink_alarm; if(sig.bit.OverHeat) heat_lamp = 1; else if(sig.bit.SubHeat) heat_lamp = blink_over; else if(sig.bit.OutHeat) heat_lamp = !blink_alarm; else heat_lamp = 0; } } } void Init_sensors() { int i,cans; GOOD[TERMO_AD ]=40; GOOD[TERMO_RS ]=40; ZERO[TERMO_AD ]=27; ZERO[TERMO_RS ]=0; okay.all=0; okay.bit.Tear=1; okay.bit.Bypas=1; okay.bit.Ignor=1; okay.bit.Imit=1; for(i=0;i=edge) return 1; (*count)++; return pre; } if( (*count) == 0 ) return 0; (*count)--; return pre; } void reset_errs(int sens, ERROR err) { ERROR set; set = sens_error[sens]; if(!set.bit.Latch) set.all &= NOER; set.all |= err.all; chk.bit.Error|= set.bit.Stop; set.bit.Ready = !set.bit.Stop; sens_error[sens] = set; } void Temper_count(int chan) { float Numb,Temper,s; ERROR error; int i,j,kun; if(!chan) { sig.all = chk.all; chk.all = 0; } if(sens_error[chan].bit.Bypas) if(chan=0) { if(TermoRS|cTermoCal|bTermoCal) if(!WAKE) { TCaliber[kun] = Numb; calc_sensor_koef(); } return; } kun = chan&1 & !TermoRS; Temper = (Numb - TCaliber[kun])*Kt[kun]+ZERO[sens_type[chan]]; if(Temper < -10.0) Temper =-100.0; if(Temper > 200.0) Temper = 200.0; if(bSecretBt|cSecretBt) Temper = GOOD[sens_type[chan]]; sens_data[chan] = Temper*10; error.all = 0; if(!sens_error[chan].bit.Ignor) { // Обрыв или неисправность if(Temper<=-10 || Temper>=200) { error.bit.Tear = 1; chk.bit.OutHeat = 1; } else // Перегрев if(((Temper>sens_hi_edge[chan]-Cooling) && (sens_error[chan].bit.Hyper)) || (Temper>sens_hi_edge[chan]) ) { error.bit.Hyper = 1; error.bit.Stop = 1; chk.bit.OverHeat= 1; } else // Предупреждение по температуре if(Temper>sens_lo_edge[chan]) { error.bit.Over = 1; chk.bit.SubHeat = 1; } } if(!WAKE) reset_errs(chan,error); }