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

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

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

Mensagempor 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!!!!
jandom
Byte
 
Mensagens: 132
Registrado em: 03 Nov 2006 20:40

Mensagempor Jorge_Francisco » 31 Dez 2009 10:34

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
Avatar do usuário
Jorge_Francisco
Dword
 
Mensagens: 1009
Registrado em: 12 Out 2006 09:53
Localização: Rio de Janeiro

Mensagempor andre_luis » 31 Dez 2009 10:46

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.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Andre_Cruz » 31 Dez 2009 11:12

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
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor fabim » 31 Dez 2009 11:19

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
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor andre_luis » 31 Dez 2009 11:25

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.


+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor Andre_Cruz » 31 Dez 2009 11:32

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 !!!
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor andre_luis » 31 Dez 2009 11:35

Exatamente,

Todos passamos pelo mesmo erro.

+++
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Mensagempor jandom » 31 Dez 2009 12:31

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!
jandom
Byte
 
Mensagens: 132
Registrado em: 03 Nov 2006 20:40

Mensagempor Djalma Toledo Rodrigues » 02 Jan 2010 19:31

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
Editado pela última vez por Djalma Toledo Rodrigues em 02 Jan 2010 19:51, em um total de 1 vez.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Djalma Toledo Rodrigues » 02 Jan 2010 19:40

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
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor Andre_Cruz » 04 Jan 2010 06:47

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 ?
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor jandom » 04 Jan 2010 15:38

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.
jandom
Byte
 
Mensagens: 132
Registrado em: 03 Nov 2006 20:40


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x