Fórum

Temporizador com pi...
 
Notifications
Clear all

Temporizador com pic12f675

9 Posts
2 Users
0 Likes
1,264 Leituras
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

Olá Claudio, tudo bem espero que sim, pode me socorrer novamente? rs
Preciso de um temporizador de 1 minuto, que tenha as seguintes características:

quando em repouso, duas saídas do 12f675 (GP0 e GP1) ficam nível alto, logo serão ligados dois leds em respectivas saídas, assim que for pressionado o sensor na GP5 , desligue as saídas dos leds (GP0 E GP1) e acione a saída GP3, se o sensor estiver pressionado, fique ativa a saída GP3 sem contar tempo, assim que for liberado o sensor GP5 começa a contar o tempo de 1 minuto e desliga a saída GP3 e liga as saídas GP0 e GP1, e se por acaso for pressionado mesmo que momentaneamente o temporizador ser reiniciado. Não sei de fiz me entender, pode me dar essa ajuda?


   
Quote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

Olá Claudio, até tentei fazer o código mas só temporiza um única vez e fica travado, não sei onde esta o erro, se puder dar uma luz ficarei muito grato!

segue o código abaixo:

#include <main.h>

#byte tmr0 = 0x01

//bits
#bit int_tmr0_on = 0x0b.5 //flag on/off de interrupçao do timer 0
//variáveis globais
int8 cnt, segundos;
unsigned int1 flag1=0;
//=============================================================================
// ROTINA DE INTERRUPÇÃO DO TIMER 0 (CADA 8MS)
//=============================================================================

#int_timer0
void interrupt()
{
TMR0 = get_timer0()+131; //carrega TMR0 com o valor
if(++cnt>=125){ //8ms * 125 = 1s
cnt=0;

if(--segundos==0xff){
segundos=5;

}
if(segundos==0) {
Output_low(RELE);//desliga o rele de saída
Output_high(LED1);
Output_high(LED2);
disable_interrupts(int_timer0);//para a contagem

}
}
}

void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64|RTCC_8_BIT); //16,3 ms overflow

TMR0 = 131; //Carrega TMR0 com o valor
segundos=5;
enable_interrupts(global);//ativa chave de interrupções

output_high(led1);
output_high(led2);
output_low(rele);

while(TRUE)
{

if(input(S1)==0 && flag1==0){
flag1=1;
if(segundos>0){

Output_low(LED1);
Output_low(LED2);
Output_high(RELE);
enable_interrupts(int_timer0);
}
else{
disable_interrupts(int_timer0);
}
}

}

if(input(S1)==1)flag1=0;

}


   
ReplyQuote
(@clarios)
Reputable Member Admin
Joined: 12 anos ago
Posts: 357
 

Olá Sergiotronic!

Parece que você está carregando o valor do contador de segundos somente no início do programa, mas nunca dentro do loop while(true) .

Por favor, tente mudar o código colocando junto a recarga do contador de segundos:

 

Ao invés de:

if(segundos==0) {
Output_low(RELE);//desliga o rele de saída
Output_high(LED1);
Output_high(LED2);
disable_interrupts(int_timer0);//para a contagem

}

 

coloque :

i

if(segundos==0) {
Output_low(RELE);//desliga o rele de saída
Output_high(LED1);
Output_high(LED2);segundos=5; //<---------------------------------recarga
disable_interrupts(int_timer0);//para a contagem

}

 

Se segundos=0 não entrará a interrupção que levaria a mudança do valor do contador de segundos para 5 mas ficando sempre em zero.

Podemos ver isto no seu código nesta porção aqui:

if(segundos>0){// para satisfazer segundos tem que ser maior que 0 para habilitar interrupção.

Output_low(LED1);
Output_low(LED2);
Output_high(RELE);
enable_interrupts(int_timer0);
}

 

Tente isto por favor.

 

 


   
ReplyQuote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

Olá! Claudio!! deu certo! só mais uma ajuda, rsr como faço para o contador ficar congelado quando pressionado o sensor1, por exemplo, só contar depois que for aberto o sensor? Pode me dar essa grande ajuda? Desde Já muito obrigado!!!


   
ReplyQuote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

Para eu me expressar melhor, quando o S1 for pressionado, Led1 e Led2 apagam e ativa o relé de saida, só que que sem contar o tempo indeterminadamente, somente contar o tempo desligar o relé e ligar novamente os LED1 e LED2 depois do sensor aberto, e teria como quando o mesmo que o contador estiver ativo quando fosse  ligado S1 o contador zerasse e voltaria a contar somente com s1 aberto?


   
ReplyQuote
(@clarios)
Reputable Member Admin
Joined: 12 anos ago
Posts: 357
 

Poderia tentar fazer recarga também nos segundos quando s1 for 1.

Talvez na porção de código abaixo:

if(input(S1)==1)flag1=0;

 

Trocar por:

if(input(S1)==1){flag1=0;segundos=5;}

 

A interrupção continua ligada mas enquanto s1 =1 ocorrerá recarga de segundos e nunca

chega a zero, exceto se s1 voltar a ser 0.


   
ReplyQuote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

Bom dia Claudio, testei sua alteração mas quando pressionado e solto S1, fica ligado o relé, e se ficar pressionado ai ele conta to tempo, fiz essa alteração abaixo, parece que deu certo! se puder dar uma olhada se tem algum erro fico muito grato!!!

if(input(S1)==0 && flag1==0)
{
flag1=1;
if(input(S1)==0 && flag1==1){// acrescentei aqui essa nova função IF
Output_low(LED1);
Output_low(LED2);
Output_high(RELE);
disable_interrupts(int_timer0);segundos=5; // coloquei a carga novamente aqui!
}
if(segundos>0){
Output_low(LED1);
Output_low(LED2);
Output_high(RELE);
enable_interrupts(int_timer0);
}
else{
disable_interrupts(int_timer0);
output_high(led1);
output_high(led2);
output_low(rele);

}
}
flag1=0;// retirei a função if de S1 ( olhar o primeiro código)
delay_ms(1);
}

}


   
ReplyQuote
(@clarios)
Reputable Member Admin
Joined: 12 anos ago
Posts: 357
 

Parece ok. Se estiver  funcionando da forma que deseja está aprovado ! Parabéns!


   
ReplyQuote
(@sergioluiz)
Estimable Member
Joined: 11 anos ago
Posts: 88
Topic starter  

Bom dia Claudio, parece estar tudo ok! rsr muito obrigado pela ajuda!! com mais tempo vou tentar melhorar ele, com sua ajuda claro! rsrs

Feliz Páscoa pra você e família!!!

 


   
ReplyQuote
Back To Top