Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ///////////////////////////////////////////////////////////////////
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
- // Проэкт. версия 3.0 Редакцыя Турок А.
- // В данной версии МСК МРТП4 и ИМВВ переведены в одно адресное
- // пространство. Проверка МСК осуществляется функцыей msk()
- // Мнемосхема переведена в систему координат Х У
- //
- // Версия 2.0 - в системе введено понятие событие
- // Версия 1.0 - в система изначальная, доставшаяся мне
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
- ///////////////////////////////////////////////////////////////////
- #include "Main.h"
- #define F_CPU 11059200UL
- //тик системы 1.48(148) ms
- //DefineProcess(TAnMeas, 50);
- typedef OS::process<OS::pr0, 150> TUART0;
- typedef OS::process<OS::pr1, 150> TUART1;
- typedef OS::process<OS::pr2, 150> TPeripheral;
- typedef OS::process<OS::pr3, 150> TTechnolog;
- //TAnMeas AnMeas(pr0);
- TUART0 UART0;
- TUART1 UART1;
- TPeripheral Peripheral;
- TTechnolog Technolog;
- #if !UART0_MASTER
- OS::TEventFlag efUART0;
- #endif
- //#if !UART1_MASTER
- OS::TEventFlag efUART1;
- //#endif
- uint8_t tech_fl;
- // Основной массив хранения 2-х строк экрана ЖКИ пульта
- char LCD_str[]= " ";
- //-----------------------------------------------------------------------------
- extern uint8_t message_arch_byte[];
- extern uint8_t message_arch_byte_cpy[];
- void my_init_portb (void) __attribute__ ((naked)) \
- __attribute__ ((section (".init1")));
- void
- my_init_portb (void)
- {
- PORTE = 1<<PE4;
- DDRE = 1<<PE4;
- PORTD|=((1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7));
- DDRD|=(1<<PD7)|(1<<PD6)|(1<<PD5)|(1<<PD4);
- }
- #include "Etaz.h"
- NET_BFPP_OUTPUT_STRUCT data_for_bfpp[NUM_OF_BFPP];
- NET_BFPP_INPUT_STRUCT data_from_bfpp[NUM_OF_BFPP];
- //щуа
- NET_OUTPUT_STRUCT data_for_slave;
- NET_INPUT_STRUCT data_from_slave;
- //щпз-т
- NET_IMVV_OUTPUT_STRUCT data_for_imvv, FORBFPP1_1;
- NET_IMVV_INPUT_STRUCT data_from_imvv, FROMBFPP1_1;
- //NET_BRIDJ_OUTPUT_STRUCT data_for_BRIDJ[NUM_OF_BRIDJ];
- //NET_BRIDJ_INPUT_STRUCT data_from_BRIDJ[NUM_OF_BRIDJ];
- LCD_OUTPUT_STRUCT lcd_data;
- LCD_INPUT_STRUCT key_data;
- void timer_init(void )
- {
- // Timer/Counter 1 initialization
- // Clock source: System Clock
- // Clock value: 7,200 kHz
- // Mode: CTC top=OCR1A
- // OC1A output: Discon.
- // OC1B output: Discon.
- // Noise Canceler: Off
- // Input Capture on Falling Edge
- // Timer1 Overflow Interrupt: Off
- // Input Capture Interrupt: Off
- // Compare A Match Interrupt: On
- // Compare B Match Interrupt: Off
- TCCR1A=0x00;
- TCCR1B=0x0D;
- TCNT1H=0x00;
- TCNT1L=0x00;
- ICR1H=0x00;
- ICR1L=0x00;
- OCR1AH=0x05;
- OCR1AL=0xA0;
- OCR1BH=0x00;
- OCR1BL=0x00;
- // Timer/Counter 1 Interrupt(s) initialization
- #if atmega128
- TIMSK|=(1<<OCIE1A);
- #endif
- #if atmega1281
- TIMSK1|=(1<<OCIE1A);
- #endif
- // Timer/Counter 2 initialization
- // Clock source: System Clock
- // Clock value: 7,200 kHz
- // Mode: Normal top=FFh
- // OC2 output: Disconnected
- //ASSR=0x00;
- //TCCR2A=0x00;
- //TCCR2B=0x07;
- //TCNT2=0x00;
- //OCR2A=0x00;
- //OCR2B=0x00;
- // Timer/Counter 2 Interrupt(s) initialization
- //TIMSK=0x01;
- }
- uint8_t mnemoXY[NUM_OF_LED_X][NUM_OF_LED_Y];
- int main()
- {
- PORTE = 1<<PE4;
- DDRE = 1<<PE4;
- PORTD|=((1<<PD4)|(1<<PD5)|(1<<PD6)|(1<<PD7));
- DDRD|=(1<<PD7)|(1<<PD6)|(1<<PD5)|(1<<PD4);
- uint8_t i,j;
- #if atmega128
- message_arch_byte[1]=MCUCSR;
- MCUCSR&=0x1f;
- #endif
- #if atmega1281
- message_arch_byte[1]=MCUSR;
- MCUSR&=0x1f;
- #endif
- message_arch_byte_cpy[1]=0xff;
- message_arch_byte[0]=1;
- message_arch_byte_cpy[0]=0xff;
- PORTA = 0xFF;
- DDRA = 0xFF;
- DDRB = 0x00;
- DDRC = 0x00;
- // DDRD = 0x00;
- DDRF = 0x00;
- PORTB = 0x00;
- PORTC = 0x00;
- // PORTD = 0x00;
- PORTF = 0x00;
- // DDRA=0xff;
- // PORTD=0xff;
- DDRC=(1<<PC0)/*|(1<<PC1)*/|(1<<PC2)|(1<<PC3);
- PORTC|=(1<<PC3);
- RAMPZ=0;
- KEY[0]=0x00;
- KEY[1]=0x00;
- // SET_IO (data_from_io[NUM_OF_IO-1],(0x40),'d',sizeof(NET_IO_INPUT_STRUCT))
- // SET_IO (data_for_io[NUM_OF_IO-1],(0x40),'d',sizeof(NET_IO_OUTPUT_STRUCT))
- for(i=0;i<(NUM_OF_BFPP);i++){SET_BFPP (data_for_bfpp[i],(0xB0+i),'d',sizeof(NET_BFPP_OUTPUT_STRUCT))}
- for(i=0;i<(NUM_OF_BFPP);i++){SET_BFPP (data_from_bfpp[i],(0xB0+i),'d',sizeof(NET_BFPP_INPUT_STRUCT))}
- lcd_data.head.size=sizeof(LCD_OUTPUT_STRUCT);
- lcd_data.head.adr=0x20;
- lcd_data.head.cmd='S';
- key_data.head.size=sizeof(LCD_INPUT_STRUCT);
- key_data.head.adr=0x20;
- key_data.head.cmd='d';
- data_for_slave.head.size=sizeof(NET_OUTPUT_STRUCT);
- data_for_slave.head.adr=0x50;
- data_for_slave.head.cmd='d';
- data_from_slave.head.size=sizeof(NET_INPUT_STRUCT);
- data_from_slave.head.adr=0x50;
- data_from_slave.head.cmd='d';
- SET_IMVV (data_from_imvv,(0x90),'d',sizeof(NET_IMVV_INPUT_STRUCT))
- SET_IMVV (data_for_imvv,(0x90),'d',sizeof(NET_IMVV_OUTPUT_STRUCT))
- SET_IMVV (FROMBFPP1_1,(0x91),'d',sizeof(NET_IMVV_INPUT_STRUCT))
- SET_IMVV (FORBFPP1_1,(0x91),'d',sizeof(NET_IMVV_OUTPUT_STRUCT))
- for(i=0;i<NUM_OF_BRIDJ;i++)
- {
- // SET_BRIDJ (data_from_BRIDJ[i],(0x50+i),'d',sizeof(NET_BRIDJ_INPUT_STRUCT))
- // SET_BRIDJ (data_for_BRIDJ[i],(i+0x50),'d',sizeof(NET_BRIDJ_OUTPUT_STRUCT))
- }
- for(i=0;i<NUM_OF_LED_X;i++)
- for(j=0;j<NUM_OF_LED_Y;j++)
- mnemoXY[i][j] = 0xff;
- low_init();
- Init_iic();
- uart_status1|=UART_TX_OK;
- uart_status0|=UART_TX_OK;
- check_iic_status();
- Work_init();
- Dev_init();
- Etaz_init();
- Menu_init();
- Pdz_init();
- init_knc();
- Message_init();
- timer_init();
- #if atmega128
- TCCR0 = (1 << CS01) | (1 << CS00);
- TIMSK |= (1 << TOIE0);
- #endif
- #if atmega1281
- TCCR0B = (1 << CS01) | (1 << CS00);
- TIMSK0 |= (1 << TOIE0);
- #endif
- OS::Run();
- }
- //-----------------------------------------------------------------------------
- //-----------------------------------------------------------------------------
- #include <avr/delay.h>
- uint8_t NetPackInfo[NUM_OF_BFPP+NUM_OF_SCAFE];
- uint8_t cur_bfpp_net_pack;
- uint8_t cur_address0;
- uint8_t cur_address1;
- namespace OS {
- template<> OS_PROCESS void TUART0::Exec()
- {
- // uint8_t cou_imvv=0;
- // uint8_t new_imvv_byte=0;
- // uint8_t i;
- UCSR0A=0x00;
- UCSR0B=(1<<RXCIE0)|(1<<RXEN0);
- UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);
- UBRR0H=0;
- UBRR0L=11;
- NetPackInfo[0]=12;
- //NetPackInfo[1]=12;
- //NetPackInfo[2]=12;
- //NetPackInfo[NUM_OF_BFPP+1]=12;
- cur_bfpp_net_pack=0;
- set_uart0_to_receive();
- for(;;)
- {
- if (uart_status0&UART_TX_OK)
- {
- #if !UART0_MASTER
- efUART0.Wait(200);
- #endif
- if(uart_status0&UART_RX_OK)
- {
- uart_status0&=~UART_RX_OK;
- NetPackInfo[cur_bfpp_net_pack]=0;
- switch(cur_bfpp_net_pack)
- {
- case 0: //приём данных от ИМВВ (щпз-т)
- memcpy((uint8_t*)&(data_from_imvv.imvv_in[0]),(uint8_t*)&rx_local_buffer0[3],
- sizeof(NET_IMVV_INPUT_STRUCT)-sizeof(HEAD_NET_STRUCT));
- break;
- case 1:
- break;
- case 2:
- break;
- default:
- memcpy((uint8_t*)&(data_from_bfpp[cur_bfpp_net_pack-NUM_OF_SCAFE].msk),
- (uint8_t*)&rx_local_buffer0[3],
- sizeof(NET_BFPP_INPUT_STRUCT)-sizeof(HEAD_NET_STRUCT));
- break;
- }
- }
- else{
- if (NetPackInfo[cur_bfpp_net_pack]<12);
- NetPackInfo[cur_bfpp_net_pack]++;
- }
- cur_bfpp_net_pack++;
- if(cur_bfpp_net_pack>=NUM_OF_BFPP+NUM_OF_SCAFE) cur_bfpp_net_pack=0; //>(NUM_OF_BFPP+1))
- switch(cur_bfpp_net_pack)
- {
- case 0: //передача данных в ИМВВ
- memcpy((uint8_t*)&tx_local_buffer0,(uint8_t*)&data_for_imvv,sizeof(NET_IMVV_OUTPUT_STRUCT));
- cur_address0=data_for_imvv.head.adr;
- break;
- case 1:
- break;
- case 2:
- break;
- default:
- memcpy((uint8_t*)&tx_local_buffer0,
- (uint8_t*)&data_for_bfpp[cur_bfpp_net_pack-NUM_OF_SCAFE],
- sizeof(NET_BFPP_OUTPUT_STRUCT));
- cur_address0=data_for_bfpp[cur_bfpp_net_pack-NUM_OF_SCAFE].head.adr;
- break;
- }
- uart_status0=0;
- uart_init0();
- set_uart0_to_receive();
- #if UART0_MASTER
- UCSR0B=(1<<TXEN0)|(1<<TXCIE0); //разрешение передатчика
- set_uart0_to_transmitt();
- _delay_us(100);
- UDR0='#';
- #else
- UCSR0B=(1<<RXEN0)|(1<<RXCIE0);
- #endif
- }
- else Transmitt_buffer_uart0();
- Sleep(50);//7//10.37ms//30
- }
- }
- }
- extern void set_uart1_transmitt();
- extern uint8_t tx_local_buffer1[MAX_LENGTH_TX_BUFFER1];
- extern uint8_t rx_local_buffer1[MAX_LENGTH_TX_BUFFER1];
- extern uint8_t mnemo_test_counter;
- extern uint8_t LCD_light;
- uint8_t mnemo_counter;
- extern uint8_t fire_floor;
- extern uint8_t stat_g;
- extern uint8_t fire_buz;
- #define UART1_NUM_PACK (NUM_OF_MNEMO + NUM_OF_IO + NUM_OF_BRIDJ + 1)*2
- namespace OS {
- template<> OS_PROCESS void TUART1::Exec()
- {
- static uint8_t i,j,k;
- UCSR1A=0x00;
- UCSR1B=(1<<RXCIE1)|(1<<RXEN1);
- UCSR1C=(1<<UCSZ11)|(1<<UCSZ10);
- UBRR1H=0;
- UBRR1L=11;
- set_uart1_to_receive();
- for(;;)
- {
- efUART1.Wait(20);//200
- if (uart_status1&UART_TX_OK)
- {
- if(uart_status1&UART_RX_OK)
- {
- uart_status1&=~UART_RX_OK;
- if(!(mnemo_counter & 1))//если числа четные считываем клаву,
- {
- memcpy((uint8_t*)&(key_data.key[0]),(uint8_t*)&rx_local_buffer1[3],
- sizeof(LCD_INPUT_STRUCT)-sizeof(HEAD_NET_STRUCT));
- }
- switch(mnemo_counter >> 1)
- {
- case NUM_OF_MNEMO + 0://ВИТ
- break;
- case NUM_OF_MNEMO + 1://Бридж 1
- //memcpy((uint8_t*)&(data_from_BRIDJ[0].BRIDJ_in),(uint8_t*)&rx_local_buffer1[3],
- //sizeof(NET_BRIDJ_INPUT_STRUCT)-sizeof(HEAD_NET_STRUCT));
- break;
- case NUM_OF_MNEMO + 2://Бридж 2
- //memcpy((uint8_t*)&(data_from_BRIDJ[1].BRIDJ_in),(uint8_t*)&rx_local_buffer1[3],
- //sizeof(NET_BRIDJ_INPUT_STRUCT)-sizeof(HEAD_NET_STRUCT));
- break;
- case NUM_OF_MNEMO + 3://Бридж 3
- //memcpy((uint8_t*)&(data_from_BRIDJ[2].BRIDJ_in),(uint8_t*)&rx_local_buffer1[3],
- //sizeof(NET_BRIDJ_INPUT_STRUCT)-sizeof(HEAD_NET_STRUCT));
- break;
- case NUM_OF_MNEMO + 4://Бридж 4
- //memcpy((uint8_t*)&(data_from_BRIDJ[3].BRIDJ_in),(uint8_t*)&rx_local_buffer1[3],
- //sizeof(NET_BRIDJ_INPUT_STRUCT)-sizeof(HEAD_NET_STRUCT));
- break;
- case NUM_OF_MNEMO + 5://Бридж 5
- //memcpy((uint8_t*)&(data_from_BRIDJ[4].BRIDJ_in),(uint8_t*)&rx_local_buffer1[3],
- //sizeof(NET_BRIDJ_INPUT_STRUCT)-sizeof(HEAD_NET_STRUCT));
- break;
- }
- }
- mnemo_counter++;
- if(mnemo_counter>((UART1_NUM_PACK))) mnemo_counter=0;
- if(mnemo_counter & 1)//нечетные числа
- {
- if((mnemo_counter >> 1) < NUM_OF_MNEMO)//(mnemo_counter / 2) < кол-во мнемосхем
- {
- if(mnemo_fl&MNEMO_WRK)
- {
- mnemo_test_work();
- mnemo_fl|=MN_TEST_on;
- }
- /* else if(mnemo_fl&MN_TEST_on)//окончательное обнуление светодиодов после теста
- {
- mnemo_fl&=~MN_TEST_on;
- for(i=0;i<NUM_OF_LED_X;i++)
- for(j=0;j<NUM_OF_LED_Y;j++)
- mnemoXY[i][j] = 0xff;
- }
- */ else
- {
- //////////////////////////////////////////////////////////////////////////////////////
- //~~~~~~~~~~здесь происходит таинство отправки светодиодов~~~~~~~~~~~~~~~~~~
- //~~~~~со всеми преобразованиями координат Х и У в координаты мнемосхемы~~~~
- //~~~~~~~~~~~Передавать не более, чем 4 мнемосхемы~~~~~~~~~~~~~~~~~~~~~~~~~~
- //////////////////////////////////////////////////////////////////////////////////////
- //~~~~~~~~~автоматически понимает положение мнемосхемы по NUM_OF_LED_X и NUM_OF_LED_Y
- //~~~~~~~~~~~~~~~~~~~~~~~~~~только совсем не доделанное~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //////////////////////////////////////////////////////////////////////////////////////
- uint8_t y,x,m_c;
- m_c = (mnemo_counter >> 1);
- y = 0;
- while(m_c > (NUM_OF_MNEMO_X -1))//вычисляем смещения координат для текущей мнемосхемы
- {
- m_c = m_c - NUM_OF_MNEMO_X;
- y++;
- }
- //if(m_c > NUM_OF_LED_X)
- if(NUM_OF_LED_MNEMO_X < NUM_OF_LED_MNEMO_Y)
- {
- x = m_c * 5; //смещение по мнемосхеме, в штуках светодиодов
- y = y * 16;//смещение по мнемосхеме, в штуках светодиодов
- for(uint8_t k=0; k<2; k++) //переход по половинкам мнемосхемы, разделенной, по 40 светодиодов
- for(i=0;i<5;i++)//по Х мнемосхемы
- for(j=0;j<8;j++)// по У мнемосхемы
- {
- tx_local_buffer1[4+(k*40)+((i*8)+j)] = mnemoXY[x + (4-i)] [k*8 + y + j];
- }
- }
- else //работает
- {
- for(k=0;k<2;k++)
- for(i=0;i<5;i++)
- for(j=0;j<8;j++)
- {
- tx_local_buffer1[4+((k*40)+i*8+j)] = mnemoXY [((mnemo_counter>>2) & 1)*16 + j + k*8][((mnemo_counter>>1) & 1)*5 + i];
- }
- }
- }
- cur_address1 = (mnemo_counter >>1) + 0x30;
- tx_local_buffer1[0] = 84;//размер пакета мнемосхемы
- tx_local_buffer1[1]=cur_address1;
- tx_local_buffer1[2]='d';
- tx_local_buffer1[3]=0;
- }
- else
- switch(mnemo_counter >> 1)
- {
- case NUM_OF_MNEMO:
- tx_local_buffer1[0]=6;
- tx_local_buffer1[1]=0x7F; //адреса
- tx_local_buffer1[2]='d'; //команда
- tx_local_buffer1[3]=fire_floor;//fire_g;
- tx_local_buffer1[4]=stat_g;//статус
- tx_local_buffer1[5]=fire_buz;//f2;
- cur_address1=0x7F;
- break;
- case NUM_OF_MNEMO + 1: //бридж 1
- //memcpy((uint8_t*)&tx_local_buffer1,(uint8_t*)&data_for_BRIDJ[0],sizeof(NET_BRIDJ_OUTPUT_STRUCT));
- //cur_address1=data_for_BRIDJ[0].head.adr;
- break;
- case NUM_OF_MNEMO + 2: //бридж 2
- //memcpy((uint8_t*)&tx_local_buffer1,(uint8_t*)&data_for_BRIDJ[1],sizeof(NET_BRIDJ_OUTPUT_STRUCT));
- //cur_address1=data_for_BRIDJ[1].head.adr;
- break;
- case NUM_OF_MNEMO + 3: //бридж 3
- //memcpy((uint8_t*)&tx_local_buffer1,(uint8_t*)&data_for_BRIDJ[2],sizeof(NET_BRIDJ_OUTPUT_STRUCT));
- //cur_address1=data_for_BRIDJ[2].head.adr;
- break;
- case NUM_OF_MNEMO + 4: //бридж 4
- //memcpy((uint8_t*)&tx_local_buffer1,(uint8_t*)&data_for_BRIDJ[3],sizeof(NET_BRIDJ_OUTPUT_STRUCT));
- //cur_address1=data_for_BRIDJ[3].head.adr;
- break;
- case NUM_OF_MNEMO + 5: //бридж 5
- //memcpy((uint8_t*)&tx_local_buffer1,(uint8_t*)&data_for_BRIDJ[4],sizeof(NET_BRIDJ_OUTPUT_STRUCT));
- //cur_address1=data_for_BRIDJ[4].head.adr;
- break;
- }
- }
- else
- {
- if(tech_fl&SOUND)
- {
- lcd_data.out_lcd[0]=10;
- lcd_data.out_lcd[1]=8;
- }
- else if(!LCD_light)
- {
- lcd_data.out_lcd[0]=0;
- lcd_data.out_lcd[1]=0;
- }
- else
- {
- lcd_data.out_lcd[0]=0;
- lcd_data.out_lcd[1]=8;
- }
- memcpy((uint8_t*)&lcd_data.out_lcd[2],(uint8_t*)&LCD_str[0],16);
- lcd_data.out_lcd[18]='\\';
- lcd_data.out_lcd[19]='n';
- memcpy((uint8_t*)&lcd_data.out_lcd[20],(uint8_t*)&LCD_str[16],16);
- memcpy((uint8_t*)&tx_local_buffer1,(uint8_t*)&lcd_data,sizeof(LCD_OUTPUT_STRUCT));
- cur_address1=0x20;
- }
- uart_status1=0;
- uart_init1();
- set_uart1_to_receive();
- #if UART1_MASTER
- UCSR1B=(1<<TXEN1)|(1<<TXCIE1); //разрешение передатчика
- set_uart1_to_transmitt();
- _delay_us(100);
- UDR1='#';
- #else
- UCSR1B=(1<<RXEN1)|(1<<RXCIE1);
- #endif
- }
- else Transmitt_buffer_uart1();
- //Sleep(50);
- // Sleep(25);//70//10.37ms//50!!!!!!!!!!!!!!!!!!!!!!НЕ ЗАБУДЬ, ЧТО НИ ТИКА НЕ ВЕРНУТЬ, НЕ ЗАБУДЬ!!!!!!!!!!
- }
- }
- }
- //-----------------------------------------------------------------------------
- extern void low_drv();
- extern uint8_t cur_msk_selector;
- extern uint8_t MT[2];
- namespace OS {
- template<> OS_PROCESS void TPeripheral::Exec()
- {
- cur_msk_selector=0;
- for(;;)
- {
- low_drv();
- Sleep(7);//10.37ms//7
- }
- }
- }
- //-----------------------------------------------------------------------------
- void inconv();void outconv();void outconv_io();
- uint8_t sec_tik;
- uint8_t lcd_drv_counter;
- uint8_t WaitWhenIronIsReady;
- namespace OS {
- template<> OS_PROCESS void TTechnolog::Exec()
- {
- /*
- check_iic_status();
- Work_init();
- Dev_init();
- Reg_init();
- Menu_init();
- Meas_init();
- Cond_init();
- Message_init();
- */
- WaitWhenIronIsReady=10;
- for(;;)
- {
- if(tech_fl&NO_IIC) tech_fl|=IIC_BUSY;
- else tech_fl&=~IIC_BUSY;
- // if(/*(!OS::GetTickCount())&&*/ (!(OS::GetTick200ms())) && (!(OS::GetTick1s()))) sec_tik=0;
- // else sec_tik=0xff;
- Menu_drv();
- outconv();
- if(!WaitWhenIronIsReady)
- {
- Pdz_drv();
- Etaz_drv();
- Work_drv();
- Dev_drv();
- Message_drv();
- all_ind();
- PORTE&=~(1<<PE4);
- // outconv_io();
- }
- else if(!sec_tik) WaitWhenIronIsReady--;
- // if(lcd_drv_counter) lcd_drv_counter--;
- // else lcd_drv_counter=5;
- // if(!lcd_drv_counter)
- skreensvr_drv();
- inconv();
- Sleep(27);//9//27
- }
- }
- }
- //-----------------------------------------------------------------------------
- OS_INTERRUPT void USART0_RX_vect()
- {
- OS::TISRW_SS ISRW;
- uint8_t ret_val;
- ret_val=Receive_buffer_uart0(cur_address0);
- switch(ret_val)
- {
- case 2:
- {
- UCSR0B=0;
- #if !UART0_MASTER
- efUART0.Signal();
- #endif
- break;
- }
- case 3:
- {
- uart_status0|=UART_RX_OK;
- uart_init0();
- #if !UART0_MASTER
- UCSR0B=(1<<TXEN0)|(1<<TXCIE0); //разрешение передатчика
- set_uart0_to_transmitt();
- UDR0='!';
- #endif
- break;
- }
- }
- }
- OS_INTERRUPT void USART0_TX_vect()
- {
- OS::TISRW_SS ISRW;
- Transmitt_buffer_uart0();
- #if !UART0_MASTER
- if(uart_status0&UART_TX_OK)
- {
- efUART0.Signal();
- }
- #endif
- }
- //-----------------------------------------------------------------------------
- OS_INTERRUPT void USART1_RX_vect()
- {
- OS::TISRW_SS ISRW;
- uint8_t ret_val;
- ret_val=Receive_buffer_uart1(cur_address1);
- switch(ret_val)
- {
- case 2:
- {
- UCSR1B=0;
- //#if !UART1_MASTER
- efUART1.Signal();
- //#endif
- break;
- }
- case 3:
- {
- uart_status1|=UART_RX_OK;
- uart_init1();
- efUART1.Signal();
- #if !UART1_MASTER
- UCSR1B=(1<<TXEN1)|(1<<TXCIE1); //разрешение передатчика
- set_uart1_to_transmitt();
- UDR1='!';
- #endif
- break;
- }
- }
- }
- void set_uart1_receive();
- OS_INTERRUPT void USART1_TX_vect()
- {
- OS::TISRW_SS ISRW;
- Transmitt_buffer_uart1();
- #if !UART1_MASTER
- if(uart_status1&UART_TX_OK)
- {
- efUART1.Signal();
- }
- #endif
- }
- /////////////////////////////////////////////////////////////////
- //~~~~~~~~~~~~~~~~~~~~~~~~~~МСК~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
- // Функцыя обработки МСК. Цель такой переделки -
- // выиграть 100 байт памяти, а еще это может дать возможность,
- // задавать контакт МСК уст-ва из меню
- // В функцыю передается номер контакта МСК
- // функцыя возвращает значение МСК.
- // Если возвращаемое значение 0xFF - ошибка, номер контакта
- // выходит за пределы МСК.
- // Тут же мск ИМВВ
- // Дописать мск для 3-го и 4-го мск ИМВВ
- // Нумерацыя МСК МРТП4 от 0 до 63. Нумерацыя МСК ИМВВ 100-163.
- //
- // V 1.0
- ////////////////////////////////////////////////////////////////
- uint8_t msk (uint8_t pin)
- {
- uint8_t result=0;
- if(pin < 100) // МСК МРТП4
- {
- if(!(pin >> 5)) ///первый МСК
- {
- if(MSK[3 - (pin >> 3)] & (1<<((pin & 7)))) result = 1;
- else result = 0;
- }
- else // 2-й МСК
- {
- pin = pin & 0x1f;
- if(MSK[7 - (pin >> 3)] & (1<<((pin & 7)))) result = 1;
- else result = 0;
- }
- }
- else // МСК ИМВВ
- {
- //конвертация МСК ИМВВ
- /////////////////////////////////////////////////
- //// МСК1 | МСК2
- //// imvv_in[4] [16,15,14,13|16,15,14,13]
- //// imvv_in[6] [12,11,10, 9|12,11,10, 9]
- //// imvv_in[8] [ 8, 7, 6, 5| 8, 7, 6, 5]
- //// imvv_in[10][ 4, 3, 2, 1| 4, 3, 2, 1]
- /////////////////////////////////////////////////
- if(pin<200){//первое имвв
- pin = pin - 100;
- switch(pin >> 4)
- {
- case 0: // 1-й МСК
- pin = pin & 0xF;
- if(data_from_imvv.imvv_in[10 - ((pin>>2)*2)] & (1<<((pin & 3)))) result = 1;
- else result = 0;
- break;
- case 1: // 2-й МСК
- pin = pin & 0xF;
- if(data_from_imvv.imvv_in[10 - ((pin>>2)*2)] & (1<<((pin & 3)+4))) result = 1;
- else result = 0;
- break;
- case 2: // 3-й МСК
- pin &= 0xF;
- //pin = (pin - 32) & 0xF;
- if(data_from_imvv.imvv_in[11 - ((pin>>2)*2)] & (1<<((pin & 3)))) result = 1;
- else result = 0;
- break;
- case 3: // 4-й МСК
- pin &= 0xF;
- //pin = (pin - 32) & 0xF;
- if(data_from_imvv.imvv_in[11 - ((pin>>2)*2)] & (1<<((pin & 3)+4))) result = 1;
- else result = 0;
- break;
- }
- }else{//второе имвв
- pin = pin - 200;
- switch(pin >> 4)
- {
- case 0: // 1-й МСК
- pin = pin & 0xF;
- if(FROMBFPP1_1.imvv_in[10 - ((pin>>2)*2)] & (1<<((pin & 3)))) result = 1;
- else result = 0;
- break;
- case 1: // 2-й МСК
- pin = pin & 0xF;
- if(FROMBFPP1_1.imvv_in[10 - ((pin>>2)*2)] & (1<<((pin & 3)+4))) result = 1;
- else result = 0;
- break;
- }
- }
- }
- return result;
- }
- extern uint8_t MSK[8],OS_MT[2],MT[2];
- uint8_t OS_FIELD[16],OUT_FIELD[16];//,OUT_FIELD_IO[8];
- uint8_t OUT_imvv[16*2], OS_imvv[16*2];//множим на колво имвв
- void outconv()
- {
- uint8_t i,j;
- /* for(i=0;i<8;i++)
- {
- for(j=0;j<8;j++)
- {
- MSK_FIELD[i*8+j]=MSK[i]&(1<<j);
- }
- }
- */ for(i=0;i<2;i++)
- {
- for(j=0;j<8;j++)
- {
- OS_FIELD[i*8+j]=OS_MT[i]&(1<<j);
- }
- }
- //конвертация ОС ИМВВ
- for(i=0;i<2;i++)//первое имвв
- {
- for(j=0;j<8;j++)
- {
- OS_imvv[i*8+j]=data_from_imvv.imvv_in[i+2]&(1<<j);
- }
- }
- for(i=0;i<2;i++)//второе имвв
- {
- for(j=0;j<8;j++)
- {
- OS_imvv[i*8+j+16]=FROMBFPP1_1.imvv_in[i+2]&(1<<j);
- }
- }
- /* for(i=0;i<4;i++)
- {
- for(j=0;j<8;j++)
- if(j<4)
- if(data_from_imvv[0].imvv_in[10-i*2]&(1<<j)) MSK_IMVV[0][i*4+j]=1;
- else MSK_IMVV[0][i*4+j]=0;
- else
- if(data_from_imvv[0].imvv_in[10-i*2]&(1<<j)) MSK_IMVV[1][i*4+(j-4)]=1;
- else MSK_IMVV[1][i*4+(j-4)]=0;
- }*/
- }
- void inconv()
- {
- uint8_t i,j;
- for(i=0;i<2;i++)
- {
- for(j=0;j<8;j++)
- {
- if(OUT_FIELD[i*8+j]) MT[i]|=(1<<j);
- else MT[i]&=~(1<<j);
- }
- }
- //конвертация выходов имвв
- for(i=0;i<2;i++)//первое имвв
- {
- for(j=0;j<8;j++)
- {
- if(OUT_imvv[i*8+j]) data_for_imvv.imvv_out[i+2]&=~(1<<j);
- else data_for_imvv.imvv_out[i+2]|=(1<<j);
- }
- }
- for(i=0;i<2;i++)//второе имвв
- {
- for(j=0;j<8;j++)
- {
- if(OUT_imvv[i*8+j+16]) FORBFPP1_1.imvv_out[i+2]&=~(1<<j);
- else FORBFPP1_1.imvv_out[i+2]|=(1<<j);
- }
- }
- }
- /*void outconv_io()
- {
- uint8_t i;
- for(i=0;i<8;i++)
- {
- if(OUT_FIELD_IO[i]) data_for_io[0].io_out&=~(1<<i);
- else data_for_io[0].io_out|=(1<<i);
- }
- } */
- OS_INTERRUPT void TIMER1_COMPA_vect()
- {
- OS::TISRW_SS ISRW;
- //set_sound();
- #if atmega128
- if(!sec_tik) {OCR1AH = 0x28;OCR1AL = 0xB0;sec_tik=0xff;}
- else{OCR1AH = 0x00;OCR1AL = 0xE0;sec_tik=0x00;}
- #endif
- #if atmega1281
- if(!sec_tik) {OCR1AH = 0x28;OCR1AL = 0xB0;sec_tik=0xff;}
- else{OCR1AH = 0x01;OCR1AL = 0xC0;sec_tik=0x00;}
- #endif
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement