setar variavel perante timer0

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

setar variavel perante timer0

Mensagempor antonio » 15 Dez 2008 07:51

Pessoal tudo bem!!

tentando fazer algo com os timer0 para treinamento não foi nada facil fazer o que quero fazer ,assim

eu tenho aseguinte rotina do TIMER0 que a cada segundo incrementa a variavel "X" atè aqui tudo bem
#INT_TIMER0
tmr_handler()
{
cont++;
if(cont==250)
{
x++;
cont=0;
}
set_timer0(130);
}
Agora o que quero fazer è,que numa função seja no MAIN ou outra função qualquer fazer incrementar uma outra variavel a cada incremento da variavel "X" da rotina TIMER0,

Ou seja...a variavel "X" a cada segundo vai incrementando ,agora eu tenho uma outra variavel "i" numa outra função que quero incrementar essa variavel e 5 segundos a contar do zero a um determinado momento com o TIMER0,independentemente do valor de "X" nesse momento, se eu fazer assim....i=X; a varialvel "X"vai retornar para "i"o valor de "X" nesse momento, e nao è isso que quero !

Mas sim... incrementar uma determinada variavel com o timer um determinado tempo a contar do zero, e depois desse tempo volta a novamente a zero ,e assim por adinate !

Isto è possivel fazer com o TIMER??

Desde jà agradeço
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Mensagempor RobL » 15 Dez 2008 17:12

Tente explicar de forma mais simples e clara pois infelizmente não consegui entender.
Diga só o que quer fazer.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor antonio » 15 Dez 2008 19:37

Amigo Robl tudo bem!!

Eu sei que esta um pouco complicado de entender ,mas eu vou tentar explicar um pouco mais claro!

É o segunte....eu quero incrementar uma variavel na função..main..em 5 segundos com o Timer0 e passado esses 5 segundo volta a zero, a qualquer momento do programa , e se necessario durante o programa começar novamente em zero e passados 5 segundo volta a zero isto no decorrer do programa com a funçào do TImer0 escrita no outro topico


Colega eu tentei mais uma vez explicar o que pertendo caso ainda não foi desta que eu expliquei direito por favor fala Ok!

Era bom que eu conseguir isto!

Um abração
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Mensagempor Djalma Toledo Rodrigues » 15 Dez 2008 21:53

Timer zero seta um Flag a cada segundo

Teu contador 0 a 5 incrementa se flag setado e da um clear (reseta) no flag .
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor RobL » 15 Dez 2008 22:11

Dá para fazer sim, se foi o que entendí em resumo é o que o Djalma postou.
O que poderá dificultar um pouco é a exatidão que vai querer.
Dependendo da frequencia de clock usada, primeiro vai ter que setar o TMR0 para um valor a fim de formar a base de tempo de preferência submultiplos de 1 segundo ou se seu clock + prescaler gerar diretamente 1 segundo.
Toda vez que iniciar terá que carregar o timer com zero e habilitar a interrupcao desse timer. Isto dará um erro de 2 ciclos que dá para compensar.
A cada estouro incrementar seu contador até 5, desabilitar a interrupção, limpar seu contador e fazer o que for nos 5 segundos.
Repetir tudo quando precisar contar 5 segundos novamente.

Outro Timer como o Timer1 dá para fazer isso mais fácil e parar e partir com um flag do timer.
RobL
Dword
 
Mensagens: 1546
Registrado em: 20 Fev 2007 17:56

Mensagempor antonio » 16 Dez 2008 05:30

Colegas mais uma vez brigrado pela força !!

Bem vou postar aqui o codigo para ver se podem ajudar a entender melhor o que quero !

Bem como contador de tempo quero usar o TIMER0 para me contar os 5 segundos ,certo !, depois é assim !

Quando o PIN_A0 for (0) (isto pode acontecer a qualquer momento do programa)salta a função MOSTRA ,e incrementar a variavel " i "a partir do ZERO atè 5 segundos com o TIMER0 liga PIN_ A2, mostra no LCD,zera variavel e volta ao FOR(;;)

O IMPORTANTE....è eu usar o TIMER0 para contar os 5 segundos na função MOSTRA(); ae zero a 5s

Os colegas falam em flags eu como não tenho grande pratico com os TIMERs nao estou vendo como fazer com os tais flags

mais uma vez brigado! espero que desta vez foi mais claro OK!



#include <16F628A.h>
#fuses XT,NOWDT,NOLVP,PUT,MCLR,NOBROWNOUT
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include<lcd.c>

void mostra ();

int x=0,i=0;
int cont=0;


#INT_TIMER0
tmr_handler()
{
cont++;
if(cont==250)
{
x++;
cont=0;
}
set_timer0(130);
}

void main(void)
{
setup_timer_0(RTCC_DIV_32|RTCC_INTERNAL);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);
lcd_init();

for(;;)
{
if(!input(PIN_A0)){
while(!input(PIN_A0));
mostra();
}

}

void mostra()

i=x; //ISTO AQUI NAO FUNCIONA :oops:
if(i<5){
output_high(PIN_A2);
printf(lcd_putc,"\n%d",i);
delay_ms(50);
i=0;
}
}
}
antonio
Byte
 
Mensagens: 209
Registrado em: 15 Out 2006 12:34

Mensagempor msamsoniuk » 16 Dez 2008 10:34

dah uma olhada neste cara, eh bem similar:

http://framework.sourceforge.net/hc908s ... ltimetro.c

eh um voltimetro/frequencimetor de 2 canais... bom, na funcao timer_overflow() eh uma interrupcao de 40Hz que decrementa um soft-timer de 1 segundo. a escolha de 40Hz foi arbitraria, enfim quando o soft-timer expira, ele incrementa um semaforo que indica que 1 segundo se passou e este semaforo eh testado em main().

no caso, para derivar um soft-timer de 5 segundos, seria relativamente simples:

Código: Selecionar todos
char timer5sec = 0;

if(second)
{
  second--;

  if(++timer5sec == 5)
  {
     timer5sec = 0;
     printf("timer 5 segundos expirou!\n");
  }
}


outra alternativa seria incrementar sempre a variavel de segundos e detectar a alteracao nela:

Código: Selecionar todos
int seconds_tmp;

while(1)
{
  if(seconds_tmp != seconds)
  {
     seconds_tmp = seconds;
    if(++timer5sec == 5)
    {
       timer5sec = 0;
       printf("timer 5 segundos expirou!\n");
    }   
  }
}
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor Djalma Toledo Rodrigues » 16 Dez 2008 10:56

antonio escreveu:Os colegas falam em flags eu como não tenho grande pratico com os TIMERs nao estou vendo como fazer com os tais flags

Flag (=Bandeira) é uma variável de um Bit, dito de outro modo o estado zero ou um de um determinado Bit sinaliza.
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor antonio » 16 Dez 2008 17:22

Brigado amigos!

desculpem mas ainda ando voando de volta deste assunto

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

Mensagempor Sergio38br » 17 Dez 2008 07:41

Bom dia antonio, em que parte vc diz estar "voando", na definições do timer0 ou no uso do flag?

[ ]'s
Sergio
Avatar do usuário
Sergio38br
Word
 
Mensagens: 759
Registrado em: 22 Nov 2007 13:39
Localização: São Paulo - SP


Voltar para PIC

Quem está online

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

x