__inline__ static T_SYS_EVENT get_serial_command(VOID) { INT c; T_SERIAL_CMD* pt_cmd_tbl; T_SYS_EVENT t_sys_event = E_EVENT_IDLE; c = Usart_Read(); /* 1文字受信 */ if( c == -1 ) { return t_sys_event; } Usart_Write( c ); /* ホストへエコーバック */ Usart_PgmPuts( PSTR("\r\n") ); for( pt_cmd_tbl = gt_serial_event_tbl; pt_cmd_tbl->c != '\0'; pt_cmd_tbl++ ) { if( pt_cmd_tbl->c == c ) { t_sys_event = pt_cmd_tbl->t_sys_event; return t_sys_event; } } if( (fn_serial_cmd_hdl == NULL) || (fn_serial_cmd_hdl( c ) != 0) ) { Usart_PgmPuts( PSTR("command not found\n") ); } return t_sys_event; }
void interrupt(){ if(Usart_data_ready()){ car_letto=Usart_Read(); if(car_letto!=0x0D && car_letto!=0x0A && cursore_buffer<DIM_MASSIMA_BUFFER){ Usart_Write(car_letto); buffer[cursore_buffer]=car_letto; cursore_buffer++; } else if(strlen(buffer)>0){ buffer[cursore_buffer]='\0'; cursore_buffer=0; if(buffer[0]=='M' && strlen(buffer)==5){ char s_posizione[4]; char s_numero_servo[2]; int posizione; int numero_servo; s_numero_servo[0]=buffer[1]; s_numero_servo[1]='\0'; s_posizione[0]=buffer[2]; s_posizione[1]=buffer[3]; s_posizione[2]=buffer[4]; s_posizione[3]='\0'; if(isInteger(s_numero_servo) && isInteger(s_posizione)){ posizione=atoi(s_posizione); numero_servo=atoi(s_numero_servo); if(posizione<MIN_POS) posizione=MIN_POS; if(posizione>MAX_POS) posizione=MAX_POS; if(numero_servo<0) numero_servo=0; if(numero_servo>3) numero_servo=3; posizioni_servo[numero_servo]=posizione; } else{ Usart_Write_String(stringa_Nuova_Linea); Usart_Write_String(stringa_Sintassi_Errata); } Usart_Write_String(stringa_Nuova_Linea); Usart_Write_String(stringa_Posizione_Cambiata); printPrompt(); } else if((buffer[0]=='O' || buffer[0]=='o') && strlen(buffer)==2){ char s_numero_servo[2]; int numero_servo; s_numero_servo[0]=buffer[1]; s_numero_servo[1]='\0'; if(isInteger(s_numero_servo)){ numero_servo=atoi(s_numero_servo); if(buffer[0]=='O'){ //accensione servo switch(numero_servo){ case 0: ACCENSIONE_SERVO0=SI; break; case 1: ACCENSIONE_SERVO1=SI; break; case 2: ACCENSIONE_SERVO2=SI; break; case 3: ACCENSIONE_SERVO3=SI; break; default: Usart_Write_String(stringa_Sintassi_Errata); break; } } else if(buffer[0]=='o'){ //spegnimento il servo switch(numero_servo){ case 0: ACCENSIONE_SERVO0=NO; break; case 1: ACCENSIONE_SERVO1=NO; break; case 2: ACCENSIONE_SERVO2=NO; break; case 3: ACCENSIONE_SERVO3=NO; break; default: Usart_Write_String(stringa_Sintassi_Errata); break; } } Usart_Write_String(stringa_Nuova_Linea); Usart_Write_String(stringa_Stato_Cambiato); printPrompt(); } } else{ //comando sconosciuto Usart_Write_String(stringa_Nuova_Linea); Usart_Write_String(stringa_Comando_Sconosciuto); printPrompt(); } } else { //stringa vuota annulla cursore_buffer=0; } } //fine data_ready }//fine funzione
void main(){ CMCON=0x07; // compartor off all digital TRISA=0x00; PORTA=0x00; TRISB=0b01110000; // PORTB=0x06; ir_rx_indicator=1; delay_ms(500); ir_rx_indicator=0; delay_ms(500); ir_rx_indicator=1; delay_ms(500); ir_rx_indicator=0; OPTION_REG=0b00001000; //RBPU' INTEDG T0CS T0SE PSA PS2 PS1 PS0 T1CON=0b00000100; //— — T1CKPS1 T1CKPS0 T1OSCEN T1SYNC' TMR1CS TMR1ON //1:8 prescale ,no t1 osc. , no sync, inernal OSC/4 T1 off PIE1 =0b00000011; //EEIE CMIE RCIE TXIE — CCP1IE TMR2IE TMR1IE INTCON=0b11001000; //GGIE PEIE T0IE INTE RBIE T0IF INTF RBIF PR2=199; T2CON=0b01001101; //- TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0 while(1){ //loop FOR ever if(code[1]){ adress=code[0]; if(adress==r_address) nec=code[1]; code[1]=0; }else if(Usart_Data_Ready()){ nec=Usart_Read(); } if(nec){ //nec =code[1] the data from IR if(swap==1) room=0x10; if(swap==2) room=0x20; switch (nec){ case p1s: period=period1;room=0x00;break; case p2s: period=period2;room=0x00;break; case p3s: period=period3;room=0x00;break; case acl: period=0x00 ;room=0x00;break; } if(room==0x10 ){ //master room switch (nec){ case o_1: DEV1=1;on_off.f0=1;break; case o_2: DEV2=1;on_off.f1=1;break; case o_3: DEV3=1;on_off.f2=1;break; case o_4: DEV4=1;on_off.f3=1;break; case f_1: DEV1=0;on_off.f0=0;break; case f_2: DEV2=0;on_off.f1=0;break; case f_3: DEV3=0;on_off.f2=0;break; case f_4: DEV4=0;on_off.f3=0;break; case f_a: DEV1=0;DEV2=0;DEV3=0;DEV4=0; on_off=on_off&0XF0;break; case swp: if(swap)swap=0x00;else swap=0x02;break; case a1s: alarm0[0]=period;break; case a2s: alarm0[1]=period;break; case a3s: alarm0[2]=period;break; } }else if(room==0x20){ switch (nec){ case o_1: DEV5=1;on_off.f4=1;break; case o_2: DEV6=1;on_off.f5=1;break; case o_3: DEV7=1;on_off.f6=1;break; case o_4: DEV8=1;on_off.f7=1;break; case f_1: DEV5=0;on_off.f4=0;break; case f_2: DEV6=0;on_off.f5=0;break; case f_3: DEV7=0;on_off.f6=0;break; case f_4: DEV8=0;on_off.f7=0;break; case f_a: DEV5=0;DEV6=0;DEV7=0;DEV8=0; on_off=on_off&0x0F;break; case swp: if(swap)swap=0x00;else swap=0x01;break; case a1s: alarm1[0]=period;break; case a2s: alarm1[1]=period;break; case a3s: alarm1[2]=period;break; } } }//if nec=0x00; if(sec>=60){ sec-=60; for(ai=0;ai<alarms;ai++){ if(alarm0[ai]==0x01){ switch (ai){ case 0: DEV2=0;on_off.f1=0;break; case 1: DEV3=0;on_off.f2=0;break; case 2: DEV4=0;on_off.f3=0;break; } alarm0[ai]=0x00; } else if(alarm0[ai] >0x01) -- alarm0[ai]; } for(ai=0;ai<alarms;ai++){ if(alarm1[ai]==0x01){ switch (ai){ case 0: DEV6=0;on_off.f5=0;break; case 1: DEV7=0;on_off.f6=0;break; case 2: DEV8=0;on_off.f7=0;break; } alarm1[ai]=0x00; } else if(alarm1[ai] >0x01) -- alarm1[ai]; } } }//while }//main