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?
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;
}
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.
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!!!
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?
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.
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);
}
}
Parece ok. Se estiver funcionando da forma que deseja está aprovado ! Parabéns!
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!!!
Olá Claudio! tudo bem? espero que sim, gostaria de saber como faço para implementar nesse código, quando faltar 10 segundos para terminar a temporização ele piscar os leds até o termino da temporização?
Olá Claudio, boa tarde, tudo bem? Espero que sim, consegui resolver a alteração do programa!!!Ótima semana!!!