por jandom » 30 Dez 2009 21:39
senhores, preciso de ajuda para resolver um problemao:
na rotina abaixo, preciso implementar que a mesma rode 3 vezes, meca a leitura AD 3 vezes, tire a media, e meca o tempo entre o acionamento de 2 entradas, o fim da rotina pelo tempo ta funcionando, so nao sei como medir o tempo gasto se ja estou usando um timer!!!??
INT AUTOMATICO()
{
Boolean flag_erro_SP1A=0;
boolean flag_erro_SP1B=0;
boolean flag_erro_SP2A=0;
boolean flag_erro_SP2B=0;
boolean flag_AMD=0;
boolean flag_AMS=0;
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( PRI_LINE +0 );
printf ( LCD_PutChar, "**MODO AUTOMATICO** ");
delay_ms(500);
// configura o timer 1 para clock interno e prescaler dividindo por 8
setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 );
// inicia o timer 1 em 3036
set_timer1(3036);
// desabilita interrupções
disable_interrupts (global );
disable_interrupts (int_timer1);
OUTPUT_LOW(RY1);
OUTPUT_LOW(RY2);
OUTPUT_LOW(RY3);
OUTPUT_LOW(RY4);
OUTPUT_LOW(RY5);
LCD_SetPosition ( PRI_LINE +0 );
printf ( LCD_PutChar, "AGUARDANDO ACIONADOR ");
LCD_SetPosition ( SEC_LINE +0 );
printf ( LCD_PutChar, "PRESSIONE <TESTE> ");
//AUARDA BOTAO START---------------------------------------------------
WHILE(TRUE)
{
IF(INPUT(INICIA))BREAK;
}
//---------------------------------------------------------------------
//CHECA SE TEM APARELHO------------------------------------------------
WHILE(TRUE)
{
//CHECA SE EMERGENCIA PRESSIONADA
//-------------------------------------------------------------------
IF(INPUT(EMERG))
{
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( PRI_LINE +0 );
printf ( LCD_PutChar, "EMERGENCIA ACIONADA ");
LCD_SetPosition ( SEC_LINE +0 );
printf ( LCD_PutChar, "DESTRAVE EMERGENCIA! ");
OUTPUT_LOW(RY1);
WHILE(TRUE)
{
IF(!INPUT(EMERG))BREAK;
}
}
//-------------------------------------------------------------------
//CHECA SE TEM ACIONADOR NA BASE
IF(!INPUT(APA_PRES))
{
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( PRI_LINE +0 );
printf ( LCD_PutChar, " COLOQUE APARELHO! ");
}
IF(INPUT(APA_PRES))
{
BREAK;
}
//---------------------------------------------------------------------
}
//---------------------------------------------------------------------
WHILE(TRUE)
{
//CHECA SE ALIMENTACAO ESTA NA POSICAO
IF(!INPUT(POS_ALIM))
{
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( PRI_LINE +0 );
printf ( LCD_PutChar, " ALIMENTACAO ERRADA! ");
LCD_SetPosition ( SEC_LINE +0 );
printf ( LCD_PutChar, "COLOQUE CERTO! ");
DELAY_MS(300);
}
IF(INPUT(POS_ALIM))
{
BREAK;
}
//-------------------------------------------------------------------
}
//---------------------------------------------------------------------
//CHECA SE CARGA EM POSICAO
WHILE(TRUE)
{
IF(!INPUT(LIM_SUB))
{
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( PRI_LINE +0 );
printf ( LCD_PutChar, "CARGA FORA POSICAO ");
LCD_SetPosition ( SEC_LINE +0 );
printf ( LCD_PutChar, "PRESSIONE <TESTE>! ");
}
LCD_SetPosition ( SEC_LINE +0 );
printf ( LCD_PutChar, "PRESSIONE <TESTE>! ");
IF(INPUT(INICIA))
{
BREAK;
}
}
//---------------------------------------------------------------------
Delay_ms(1000);
//---------------------------------------------------------------------
//ACIONA SAIDA CILINDRO
OUTPUT_HIGH(RY2);
//---------------------------------------------------------------------
//MOVE ATE POSICAO DE ENCAIXE
Delay_ms(1000);
//DO{
WHILE(TRUE)
{
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( QUA_LINE +0 );
printf ( LCD_PutChar, "POSICIONANDO.... ");
OUTPUT_HIGH(RY5);
IF(INPUT(LIM_ECG) || (INPUT(EMERG)))BREAK;
IF(INPUT(EMERG))
{
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( PRI_LINE +0 );
printf ( LCD_PutChar, " FORA DE POSICAO! ");
LCD_SetPosition ( SEC_LINE +0 );
printf ( LCD_PutChar, " SENSOR FORA!!!! ");
BREAK;
OUTPUT_LOW(RY5);
OUTPUT_LOW(RY1);
}
}
//---------------------------------------------------------------------
IF(INPUT(EMERG))
{
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( PRI_LINE +0 );
printf ( LCD_PutChar, " FORA DE POSICAO! ");
LCD_SetPosition ( SEC_LINE +0 );
printf ( LCD_PutChar, " SENSOR FORA!!!! ");
}
//---------------------------------------------------------------------
//ENCONTRA LIMITE 1
//IF(INPUT(LIM_ECG))
//{
DELAY_MS(200);
OUTPUT_LOW(RY5);
//}
//---------------------------------------------------------------------
delay_ms(1000);
//IF((!INPUT(EMERG)) && (INPUT(POS_ALIM)) && (INPUT(LIM_DES)) && (INPUT(LIM_ECG)))
while(true)
{
IF((!INPUT(EMERG)) && (INPUT(SEG_SLD)) && (INPUT(LIM_SUB)))
{
DELAY_MS(1000);
OUTPUT_HIGH(RY1);//LIBERA A CARGA
break;
}
}
//---------------------------------------------------------------------
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( PRI_LINE +0 );
printf ( LCD_PutChar, " OBRIGADO! ");
LCD_SetPosition ( SEC_LINE +0 );
printf ( LCD_PutChar, " AGUARDE TESTES! ");
delay_ms(1000);
//---------------------------------------------------------------------
//MEDE CORRENTE DESCIDA
//---------------------------------------------------------------------
sp_tempo = 2; // efetua a conversão A/D
tempo=0;
enable_interrupts (global );
enable_interrupts (int_timer1);
do
{
SP1_A=6500.00;
SP1_B=600.00;
LCD_SetPosition ( PRI_LINE +0 );
printf ( LCD_PutChar, "MEDINDO COR. DESCIDA ");
OUTPUT_HIGH(RY4);
delay_ms(200);
//-------------------------------------------------------------------
//TEMPO LEITURA CORRENTE
sp_tempo_L = 1;
tempo=0;
enable_interrupts (global );
enable_interrupts (int_timer1);
DO
{
adc_init();
CUR1 = read_analog(1);
CUR1=CUR1/10;//7.9
LCD_SetPosition ( SEC_LINE +0 );
printf ( LCD_PutChar, "CORR. :%3.2f mA ",CUR1);
IF(INPUT(LIM_DES))BREAK;
IF(INPUT(EMERG))BREAK;
}while(tempo<sp_tempo_l);
IF(INPUT(LIM_DES))BREAK;//limite abaixo
IF(INPUT(EMERG))BREAK;
}while(tempo<sp_tempo);
DELAY_MS(100);
output_HIGH(RY3);
DELAY_MS(300);
output_LOW(RY3);
output_low(RY4);
DELAY_MS(100);
//--------------------------------------------------------------------
IF(!INPUT(EMERG))
{
delay_ms(2000);
}
//--------------------------------------------------------------------
//MEDE CORRENTE SUBIDA
//--------------------------------------------------------------------
sp_tempo = 5; // efetua a conversão A/D
tempo=0;
enable_interrupts (global );
enable_interrupts (int_timer1);
do
{
SP2_A=7500.00;
SP2_B=600.00;
LCD_SetPosition ( PRI_LINE +0 );
printf ( LCD_PutChar, "MEDINDO COR. SUBIDA ");
OUTPUT_HIGH(RY5);
delay_ms(200);
//-----------------------------------------------------------------
//TEMPO LEITURA CORRENTE
sp_tempo_L = 1;
tempo=0;
enable_interrupts (global );
enable_interrupts (int_timer1);
DO
{
adc_init();
CUR2 = read_analog(1);
//CUR2 = CUR2/22;
CUR2=CUR2/9.9;
LCD_SetPosition ( SEC_LINE +0 );
printf ( LCD_PutChar, "CORR. :%3.2f mA ",CUR2);
IF(INPUT(LIM_SUB))BREAK;
IF(INPUT(EMERG))BREAK;
}while(tempo<sp_tempo_L);
IF(INPUT(LIM_SUB))BREAK;
IF(INPUT(EMERG))BREAK;
}while(tempo<sp_tempo);
DELAY_MS(100);
output_HIGH(RY3);
DELAY_MS(500);
output_LOW(RY3);
output_low(RY5);
DELAY_MS(100);
// FIM TESTES--------------------------------------------------------
IF(!INPUT(EMERG)) //SE EMERGENCIA ESTIVER OK!
{
//-------------------------------------------------------------------COMPARACOES SET_POINTS
LCD_SetPosition ( PRI_LINE +0 );
printf ( LCD_PutChar, "CORR. DES:%3.2f mA ",CUR1);
LCD_SetPosition ( SEC_LINE +0 );
printf ( LCD_PutChar, "CORR. SUB:%3.2f mA ",CUR2);
delay_ms(2000);
//-------------------------------------------------------------------
//------------------------------------------------------------------
LCD_PutCmd ( CLEAR_DISP );
IF((FLAG_ERRO_SP1A==1) || (FLAG_ERRO_SP1B==1) || (FLAG_ERRO_SP2B==1) || (FLAG_ERRO_SP2A==1))
{
OUTPUT_HIGH(LED_RPV);
LCD_SetPosition ( PRI_LINE +0 );
printf ( LCD_PutChar, "ACIONADOR REPROVADO! ");
LCD_SetPosition ( SEC_LINE +0 );
//printf ( LCD_PutChar, "*PRESSIONE <TESTE>* ");
CUR1=CUR1/1000;
CUR2=CUR2/1000;
printf ( LCD_PutChar, "SUB:%2.2fA DEC:%2.2FA ",CUR2,CUR1);
WHILE(TRUE)
{
IF(INPUT(INICIA)) BREAK;
}
OUTPUT_LOW(LED_RPV);
}
//-------------------------------------------------------------------
LCD_PutCmd ( CLEAR_DISP );
IF((FLAG_ERRO_SP1A==0) && (FLAG_ERRO_SP1B==0) && (FLAG_ERRO_SP2B==0) && (FLAG_ERRO_SP2A==0))
{
OUTPUT_HIGH(LED_APV);
LCD_SetPosition ( PRI_LINE +0 );
printf ( LCD_PutChar, "ACIONADOR APROVADO! ");
LCD_SetPosition ( SEC_LINE +0 );
//printf ( LCD_PutChar, "*PRESSIONE <TESTE>* ");
CUR1=CUR1/1000;
CUR2=CUR2/1000;
printf ( LCD_PutChar, "SUB:%2.2fA DEC:%2.2FA ",CUR2,CUR1);
WHILE(TRUE)
{
IF(INPUT(INICIA)) BREAK;
}
OUTPUT_LOW(LED_APV);
}
//RETIRA CILINDRO---------------------------------------------------
//DELAY_MS(200);
//OUTPUT_LOW(RY1);
OUTPUT_LOW(LED_APV);
OUTPUT_LOW(LED_RPV);
}
//-------------------------------------------------------------------
IF(!INPUT(EMERG))
{
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( TER_LINE +0 );
printf ( LCD_PutChar, "LIBERA A CARGA! ");
WHILE(TRUE)
{
IF((INPUT(LIM_SUB)) && (INPUT(LIM_ECG)))
{
OUTPUT_LOW(RY1);
BREAK;
}
}
DELAY_MS(1000);
//------------------------------------------------------------------
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( TER_LINE +0 );
printf ( LCD_PutChar, "POSICIONA EMBALAGEM ");
//------------------------------------------------------------------
IF(!INPUT(EMERG))
{
WHILE(TRUE)
{
OUTPUT_HIGH(RY4);
IF(INPUT(LIM_EMB))
{
//DELAY_MS(50);
//IF(!INPUT(LIM_EMB))
//{
DELAY_MS(650);
OUTPUT_LOW(RY4);
BREAK;
//}
}
}
}
//------------------------------------------------------------------
DELAY_MS(200);
OUTPUT_LOW(RY2);
//-------------------------------------------------------------------
WHILE(TRUE)
{
IF(!INPUT(EMERG))BREAK;
IF(INPUT(EMERG))
{
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( PRI_LINE +0 );
printf ( LCD_PutChar, "*EMERGENCIA ACIONADA ");
LCD_SetPosition ( SEC_LINE +0 );
printf ( LCD_PutChar, "DESTRAVE PARA INICIO ");
OUTPUT_LOW(RY1);
WHILE(TRUE)
{
IF(!INPUT(EMERG))BREAK;
}
BREAK;
}
}
LCD_PutCmd ( CLEAR_DISP );
WHILE(TRUE)
{
IF(!INPUT(APA_PRES))BREAK;
IF(INPUT(APA_PRES))
{
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( PRI_LINE +0 );
printf ( LCD_PutChar, "**RETIRE ACIONADOR** ");
LCD_SetPosition ( SEC_LINE +0 );
printf ( LCD_PutChar, "DA BASE PARA INICIAR ");
WHILE(TRUE)
{
IF(!INPUT(APA_PRES))BREAK;
}
BREAK;
}
}
BREAK;
}
}
grato pela ajuda e ideias!!!!