Uso do TIMER1 na função

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Uso do TIMER1 na função

Mensagempor antonio » 13 Jul 2014 16:39

Pessoal tudo bem!

Galera estou aqui voando no programinha ,onde pertendo fazer uso do TIMER1 dentro de uma função para que Conte 3 segundos e sai fora !

configurei o TIMER1 para que desborde a cada segundo , depois quero que na função "temp" quando solicitada o timer Conte 3 segundo e volta ao estado de espera ate que a função seja novamente solicitada, não sei o que o que estou a fazer errado que o programa não acende o led por 3 segundo!

Pessoal o que estou fazendo no programa que não roda a função "temp"

cpp code
#include <16F876A.H> 
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)

#use standard_io(B)
#use standard_io(A)
//#use standard_io(C)

#include <lcd.c>
#include <ds1307.c>

// Set an alarm time of 15:21:05 for testing.

int8 alarm_hrs = 15;
int8 alarm_min = 21;
int8 alarm_sec = 50;
int16 cont;
int con_3min=0;

int8 check_alarm(int8 hrs, int8 min, int8 sec);
void temp (void);

#int_TIMER1 //Interr. Timer1
void temp1s(void) //
{
set_timer1(3036); //62.500 * 8 (prescaler) = 0,5 seg
/* cont++;
if(cont == 2){ //0,5 seg x 10 son 5 segundos.
con_3min++;
cont = 0;
}*/
}

//============================
void main()
{
int8 sec;
int8 min;
int8 hrs;
int8 day;
int8 month;
int8 yr;
int8 dow;

setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); //configuraçao TMR1
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
set_timer1(3036);
lcd_init();
ds1307_init();

// Set date for -> 15 June 2005 Tuesday
// Set time for -> 15:20:55
ds1307_set_date_time(15,6,5,0,15,21,45);

while(1)
{
delay_ms(100);
ds1307_get_time(hrs,min,sec);
ds1307_get_date(day,month,yr,dow);

lcd_gotoxy(1,1);
printf(lcd_putc,"%02d:%02d:%02d",day,month,yr);

lcd_gotoxy(1,2);
printf(lcd_putc,"%02d:%02d:%02d",hrs,min,sec);

if(check_alarm(hrs, min, sec))
temp();

}
}

//=============================================

int8 check_alarm(int8 hrs, int8 min, int8 sec)
{
if((hrs == alarm_hrs) &&
(min == alarm_min) &&
(sec == alarm_sec))
return(TRUE);
else
return(FALSE);
}

void temp (void)
{
//set_timer1(3041); //62.500 * 8 (prescaler) = 0,5 seg
cont=0;
if(get_timer1()==0)
cont++;
if(cont == 2){ //0,5 seg x 10 son 5 segundos.
con_3min++;
cont = 0;}
if(con_3min == 180)
{
con_3min = 0;
output_high(pin_A1);
}

}
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Re: Uso do TIMER1 na função

Mensagempor andre_luis » 13 Jul 2014 17:00

Já que tá usando um display, pode o utilizar com o printf para debugar qual a variavel não tá incrementando, é a con_3min ou a cont ?

Aproveito pra perguntar, porque não utiliza o próprio pino 7 do DS1307 pra gerar os pulsos de 1s por hardware ?
Fica muito mais fácil de trabalhar...

Imagem



+++
"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

Re: Uso do TIMER1 na função

Mensagempor antonio » 13 Jul 2014 17:20

Ola Andre
Bem não estou bem ao certo o que estou fazendo errado e qual variavel não tá incrementando! fiz varios testes e não tenho ideia ,por isso postei aqui !

Não estou usando o pino 7 do DS1307 pra gerar os pulsos de 1s por hardware porque nao sei usar direito a biblioteca que tras o ccs !ou seja penso que tenho que mudificar a mesma e acho mais ruim do que fazer como fiz

Qualquer ajuda è bem-vinda
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Re: Uso do TIMER1 na função

Mensagempor andre_luis » 13 Jul 2014 17:53

O que já tá funcionando, o display tá mostrando alguma coisa ?



+++
"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

Re: Uso do TIMER1 na função

Mensagempor antonio » 14 Jul 2014 01:08

andre_teprom escreveu:O que já tá funcionando, o display tá mostrando alguma coisa ?



+++

Sim mostra a hora e data beleza ,mas nao faz a funcao
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Re: Uso do TIMER1 na função

Mensagempor andre_luis » 14 Jul 2014 12:24

Apenas como um teste, dentro do while(1), entre as linhas 62 e 66 do código acima, substitui a chamada do LCD pelos seguintes comandos, e diz o que tá aparecendo em cada linha do Display:

cpp code
lcd_gotoxy(1,1);   
printf(lcd_putc,"%02d:",con_3min );

lcd_gotoxy(1,2);
printf(lcd_putc,"%02d:",cont );



+++
"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

Re: Uso do TIMER1 na função

Mensagempor antonio » 14 Jul 2014 16:39

andre_teprom escreveu:Apenas como um teste, dentro do while(1), entre as linhas 62 e 66 do código acima, substitui a chamada do LCD pelos seguintes comandos, e diz o que tá aparecendo em cada linha do Display:

cpp code
lcd_gotoxy(1,1);   
printf(lcd_putc,"%02d:",con_3min );

lcd_gotoxy(1,2);
printf(lcd_putc,"%02d:",cont );



+++


Hoi Andre !

Andre fiz o teste, e no LCD mostra isto assim" 00: " o que eu relamente pertendo eh que quando a Hora escolhida em "Set an alarm time of 15:21:05 " condizer com a Hora real do "DS1307" se igualam salte a função temp, do qual a função tem por tarefa de ligar um Pino durante um certo tempo,volta ao estado desligado e sai da função , ate a Nova chamada !

Fis mais teste hojo mas Sem sucesso! não tenho ideia como resolver isto!

Desde jà agradeço

Código: Selecionar todos
 #include <16F876A.H>
 #fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
 #use delay(clock=4000000)

 #use standard_io(B)
 #use standard_io(A)
 //#use standard_io(C)
 
 #include <lcd.c>
 #include <ds1307.c>
1307
 // Set an alarm time of 15:21:05 for testing.
 
 int8 alarm_hrs = 15;
 int8 alarm_min = 21;
 int8 alarm_sec = 50;
int8 cont;
int con_3min=0;
 
 int8 check_alarm(int8 hrs, int8 min, int8 sec);
 void temp (void);
 


#int_TIMER1         //Interrupción Timer1
void temp1s(void)   //Función
{
   set_timer1(3041);         //62.500 * 8 (prescaler) = 0,5 seg
  /* cont++;
   if(cont == 2){ //0,5 seg x 10 son 5 segundos.
        con_3min++;
        cont = 0;
   }*/
}
 
 
 
 
 //============================
 void main()
 {
 int8 sec;
 int8 min;
 int8 hrs;
 int8 day;
 int8 month;
 int8 yr;
 int8 dow;
 
 
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);   //configuraçao TMR1
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
set_timer1(3041);   
 lcd_init();
 ds1307_init();
   
 // Set date for -> 15 June 2005 Tuesday
 // Set time for -> 15:20:55
 ds1307_set_date_time(15,6,5,0,15,21,45);
   


 while(1)
   { 
   delay_ms(100);
   ds1307_get_time(hrs,min,sec);
   ds1307_get_date(day,month,yr,dow);
 

    lcd_gotoxy(1,1);
   printf(lcd_putc,"%02d:",con_3min );       
   lcd_gotoxy(1,2);   
    printf(lcd_putc,"%02d:",cont ); 



    if(check_alarm(hrs, min, sec))
      temp();
     
   }
 }

 //=============================================

 int8 check_alarm(int8 hrs, int8 min, int8 sec)
 {
 if((hrs == alarm_hrs) &&
    (min == alarm_min) &&
    (sec == alarm_sec))
   return(TRUE);
 else
   return(FALSE);
 }
 
 void temp (void)
 {
  //set_timer1(3041);         //62.500 * 8 (prescaler) = 0,5 seg
  cont=0;
   if(get_timer1()==0)
   cont++;
   if(cont == 2){ //0,5 seg x 10 son 5 segundos.
        con_3min++;
        cont = 0;}
   if(con_3min == 180)
   {
      con_3min = 0;
      output_high(pin_A1);
   }
 
 }
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Re: Uso do TIMER1 na função

Mensagempor xultz » 14 Jul 2014 17:10

Na tua ISR o código continua comentado? Porque a variavel cont não é incrementada (ela está comentada) e a ISR não faz nada...
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: Uso do TIMER1 na função

Mensagempor antonio » 14 Jul 2014 17:36

xultz escreveu:Na tua ISR o código continua comentado? Porque a variavel cont não é incrementada (ela está comentada) e a ISR não faz nada...


Cara grato pelo apoio , se voce der uma olhada na funçõ "temp" a varialvel cont esta a ser incrementada , isto são testes que faço !

Agora funcionar nao funca ,nem com forte Reza! nõ sei o que faço de errado não!
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Re: Uso do TIMER1 na função

Mensagempor xultz » 14 Jul 2014 19:33

Você está testando o programa em um circuito, ou no Proteus?
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: Uso do TIMER1 na função

Mensagempor antonio » 15 Jul 2014 03:31

xultz escreveu:Você está testando o programa em um circuito, ou no Proteus?


cara em primeiro sim estava a usar o proteus ,mas depois montei circuito real , o resultado e o mesmo na função ou seja nao funciona
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Re: Uso do TIMER1 na função

Mensagempor xultz » 15 Jul 2014 08:26

Sobe teu projeto do Proteus prum Dropbox da vida, eu posso (tentar) experimentar ele.
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: Uso do TIMER1 na função

Mensagempor antonio » 15 Jul 2014 14:51

xultz escreveu:Sobe teu projeto do Proteus prum Dropbox da vida, eu posso (tentar) experimentar ele.


Espero que seja isto!
4rap2d.png

http://i57.tinypic.com/4rap2d.png
Você não está autorizado a ver ou baixar esse anexo.
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34


Voltar para PIC

Quem está online

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

x