//=================================================================================== BYTE ReadBlockNotSelect() { BYTE b; selREAD_DATA; RW_R=tREAD; WaitMS(1); CLOCK_CLK(); b=DATA_0_3_R; WaitMS(1); RW_R=tWRITE; selWRITE_DATA; return b; }
void CLOCK_CLK(void) { RCLK=0; RCLK=1; WaitMS(1); RCLK=0; }
//=================================================================================== void WriteBlockNotSelect(BYTE data) { selWRITE_DATA; DATA_0_3_W(data); RW_R=tWRITE; WaitMS(1); CLOCK_CLK(); Rvv.Timer=0; while(Rvv.Timer<TIME_5MS)clrwdt; }
//=================================================================================== //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ void DriverRVV() { BYTE flag, i, j, ret; //DWORD k; //__DI(); //Rvv.Error&=~7; //Комплектность Rvv.Error=RIN; //============================================================================ if(Rvv.EnableChange != Rvv.NewEnableChange) // разрешено переключить реле { //===================================== // Сначала проверяем необходимо ли что то записывать flag = 0; for(i=0;i<COUNT_BLOCK; i++) { for(j=0;j<2; j++) { if(Rvv.Block[i].New[j] != Rvv.Block[i].Old[j]) flag = 1; } } //if(Rvv.SelectBlockNew!=Rvv.SelectBlockOld) // flag = 1; //--------------------------------------- // Переходим к записи данных при необходимости if(flag == 1) { //Rvv.SelectBlockOld = Rvv.SelectBlockNew; UN_SELEKT_BL(); // Снимаем выбор со всех блоков WaitMS(10); //------------------------------------------- // Запись нужно начинать с блока ДН for(i=COUNT_BLOCK; i>0; i--) { for(j=0;j<2; j++) { //---------------------------------------------- //Выставляем Select для блока при неообходимости //ret = (Rvv.SelectBlockOld>>(2*(i-1)+j))&1; //if(ret == 1) // Rvv.Block[i-1].Select[j] = SELECT_BLOCK; //if(ret == 0) // Rvv.Block[i-1].Select[j] = UNSELECT_BLOCK; //---------------------------------------------- if(Rvv.Block[i-1].New[j] != Rvv.Block[i-1].Old[j]) { Rvv.Block[i-1].Old[j] = Rvv.Block[i-1].New[j]; //==================================================== // Выставляем выбор для конкретной половины блока если необходимо записать новые данные if(j==0) SetSel0Path_WithoutMark(i-1,SELECT_BLOCK); if(j==1) SetSel1Path_WithoutMark(i-1,SELECT_BLOCK); WaitMS(5); // Записываем данные WriteBlockNotSelect(Rvv.Block[i-1].Old[j]); // Проверяем чтением записаныые данные ret = ReadBlockNotSelect(); Rvv.Block[i-1].Read[j]=ret; // 0 бит неисправность первой половины блока; 1 - второй if(ret !=Rvv.Block[i-1].Old[j]) Rvv.Block[i-1].Error |= 1<<j; else Rvv.Block[i-1].Error &= ~(1<<j); WaitMS(5); // Снимаем выбор if(j==0) SetSel0Path_WithoutMark(i-1,UNSELECT_BLOCK); if(j==1) SetSel1Path_WithoutMark(i-1,UNSELECT_BLOCK); WaitMS(10); } } } //SET_ALL_SELEKT_STATUS(); // Ставим выбор всем блокам которым он был выставлен или которым нужно выставить } //===================================== Rvv.EnableChange = Rvv.NewEnableChange; // Сбрасываем флаг } //__EI(); //----------------------------------------------------------- // Читаем подключённые блоки и сверяем с тем что записали // вслучае несовпадения зажигаем неисправность /* for(i=0; i<COUNT_BLOCK; i++) { for(j=0;j<2; j++) { if(Rvv.Block[i].Select[j] == SELECT_BLOCK) { // Проверяем чтением записаныые данные ret = ReadBlockNotSelect(); // 0 бит неисправность первой половины блока; 1 - второй if(ret !=Rvv.Block[i-1].Old[j]) Rvv.Block[i].Error |= 1<<j; else Rvv.Block[i].Error &= ~(1<<j); // Снимаем выбор } } }*/ //============================================================================ }
/* ================ idThread::WaitSec ================ */ void idThread::WaitSec( float time ) { WaitMS( SEC2MS( time ) ); }