Página 1 de 1

CONTADOR+TEMPO GASTO+FIM MEDICAO POR TEMPO...PERDENDO CABELO

MensagemEnviado: 30 Dez 2009 21:39
por jandom
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!!!!

MensagemEnviado: 31 Dez 2009 10:34
por Jorge_Francisco
Tem um bom também...esqueci o nome agora.:lol:

Na boa, faça identação, use o recurso "Code" na postagem. E coloque apenas o trecho que realmente está em dúvida, ninguém irá ver um código tão grande.

Jorge

MensagemEnviado: 31 Dez 2009 10:46
por andre_luis
jandom,

Voce não mencionou se precisa medir esse tempo fisicamente ( osciloscópio ) ou na simulação.

Se for fisicamente, voce já fez algo parecido, que foi utilizar as saidas do uC para isso, mas se for no ambiente de compilação, precisa indicar qual IDE está usando.

+++

MensagemEnviado: 31 Dez 2009 11:12
por Andre_Cruz
jandom,

Não sei a medição do tempo entre o acionamento de duas saídas ?? E não duas entradas como disse, ou eu não entedi direito, nem esquerdo rsrsrs

Você diz que ja esta usando um timer, você não pode configurar outro timer ??

Por exemplo gerar uma interupção a cada 100uS, quando você aciona a saída A você liga esse timer, cada vez que estourar e gerar a interupção você incrementa uma variavel, quando você acionar a saída B você desliga o timer e pega o valor da variavel.

Código: Selecionar todos

//Defina a variavel que armazenara o periodo do acionamento das duas //saídas como global, assim você tem acesso em qualquer parte do //programa

//Define variavel

//Configura timer 0 para estourar a cada 100uS

//Rotina de interupção

if (TMR0IF) {
 //Reconfigura o timer0
 //Limpa flag da int de timer0

 variavel++;
}

//Código principal

//Código

//Acionou a saída A
//Liga timer0
//Limpa variavel que armazena o periodo
//Desliga saída A ou não não sei a lógica de sua aplicação

//Código

//Acionou a saída B
//Desliga timer0
//Desliga saída B ou não não sei a lógica de sua aplicação

//Segue o programa



Ou

Como você ja esta usando um timer, vamos supor que você esta gerando uma interupção acada 1 mS, quando você acionar a saída A você marca um flag, e dentro da interupção você testa se este flag esta marcado, se sim você incrementa uma variavel, quando você acionar a saída B você desmarca esse flag e o valor da variavel será o tempo gasto entre o acionamento das duas saídas.

Código: Selecionar todos
//Defina a variavel que armazenara o periodo do acionamento das duas //saídas como global, assim você tem acesso em qualquer parte do //programa

//Define variavel

//Rotina de interupção

if (Interupção) {
 //Reconfigura o timer
 //Limpa flag da int de timer
 
 if (flag) {
  variavel++;
 }
}

//Código principal

//Código

//Acionou a saída A
//Marca flag
//Limpa variavel que armazena o periodo
//Desliga saída A ou não não sei a lógica de sua aplicação

//Código

//Acionou a saída B
//Desmarca flag
//Desliga saída B ou não não sei a lógica de sua aplicação

//Segue o programa



Espero ter ajudado.

Abraço

MensagemEnviado: 31 Dez 2009 11:19
por fabim
povão chato..
Sempre que alguem pergunta, o pessoal pede pra colocar o source.
o cara com maior das boas vontades, expinica o probrema, coloca o source inteirim.
e os caras, com zuação..

Ticonta viu...
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk

MensagemEnviado: 31 Dez 2009 11:25
por andre_luis
Andre_Cruz escreveu:...Você diz que ja esta usando um timer, você não pode configurar outro timer ??...


Andre_cruz : O problema, é que ele colocou tudo dentro da rotina de interrupção. Mesmo que usasse outro timer, a outra interrupção não seria executada. O compilador desabilita outras interrupções qunado trata da atual.

Além disso, pra piorar, se o PIC que ele estiver usando for da família 16F pra baixo, só terá mesmo um vetor de interrupção disponível.

Enfim, tem de mudar alguns conceitos, ou explicar exatamente do que preciza.


+++

MensagemEnviado: 31 Dez 2009 11:32
por Andre_Cruz
Não seria melhor dentro da interupção, apenas setar flags ? E fora testar esses flags e tratar cada um ?

Ja tive problemas fazendo tudo dentro da interupção, e tive que marcar os flags dentro da interupção, e fora dela tratar cada um.

Principalmente quando a frequência de estouro do timer é alta.

Abraço, feliz ano novo a todos !!!

MensagemEnviado: 31 Dez 2009 11:35
por andre_luis
Exatamente,

Todos passamos pelo mesmo erro.

+++

MensagemEnviado: 31 Dez 2009 12:31
por jandom
gente! obrigado pela ajuda!
Mas o que preciso é o seguinte:
- preciso testar um acionador de vidro elétrico de carro
- tenho dois sensores: limite subida(lim_sub) e limite de descida(lim_des)
- coloco o acionador no lugar, checo se emergencia esta pressionada, se esta com carga (8kg) e etc...
- ao pressionar inicia, o motor ira descer com a carga ate achar o sensor lim_des (meço tempo de descida e corrente) idem para a subida. Caso os sensores não atuemo tempo desliga o motor, para não sobrecarrega-lo.
- entao preciso medir o tempo de descida (momento de pressionar o botao inicia até sensor lim_des, tenho uma pausa para a reversão do motor, na saida do sensor lim_des até o lim_sub meço o tempo de subida e corrente!
- não sei como fazer para usar dois timers, pois tenho tempo de segurança e mediçao de tempo de descida e subida!
- estou usando o CCS e pic 18f452!

Grato! e Feliz 2010 a todos!

MensagemEnviado: 02 Jan 2010 19:31
por Djalma Toledo Rodrigues
jandom escreveu: ... não sei como fazer para usar dois timers, pois tenho tempo de segurança e mediçao de tempo de descida e subida! ...


Uma Pessoa, um operador, com um Cronómetro, um único Cronómetro fique bem claro,
como faria ?

DJ

MensagemEnviado: 02 Jan 2010 19:40
por Djalma Toledo Rodrigues
A propósito :

http://www.online-stopwatch.com/portuguese/

Ver também Contador de Bomba-Relógio ( Programar o tempo com Cronómetro
Descrescente, 10 segundos é o suficiente para se afastar do PC . rsrs )

DJ

MensagemEnviado: 04 Jan 2010 06:47
por Andre_Cruz
jandom,

O botão da emergência deverá ficar pressionado para que o sistema continue em funcionamento ? Ou ele será acionado somente em caso de emergência mesmo paralizando tudo ?
Qual a precisão que precisa da medida do periodo entre a descida e a subida e vice versa ?

MensagemEnviado: 04 Jan 2010 15:38
por jandom
Andre, obrigado pela ajuda!
O botão de emergencia tem dois contatos um NA e outro NF, NF no motor e NA para a placa indicando emergencia pressionada.