Página 1 de 1

setar variavel perante timer0

MensagemEnviado: 15 Dez 2008 07:51
por antonio
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

MensagemEnviado: 15 Dez 2008 17:12
por RobL
Tente explicar de forma mais simples e clara pois infelizmente não consegui entender.
Diga só o que quer fazer.

MensagemEnviado: 15 Dez 2008 19:37
por antonio
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

MensagemEnviado: 15 Dez 2008 21:53
por Djalma Toledo Rodrigues
Timer zero seta um Flag a cada segundo

Teu contador 0 a 5 incrementa se flag setado e da um clear (reseta) no flag .

MensagemEnviado: 15 Dez 2008 22:11
por RobL
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.

MensagemEnviado: 16 Dez 2008 05:30
por antonio
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;
}
}
}

MensagemEnviado: 16 Dez 2008 10:34
por msamsoniuk
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");
    }   
  }
}

MensagemEnviado: 16 Dez 2008 10:56
por Djalma Toledo Rodrigues
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.

MensagemEnviado: 16 Dez 2008 17:22
por antonio
Brigado amigos!

desculpem mas ainda ando voando de volta deste assunto

qualquer ajuda mais è bem-vinda
atè

MensagemEnviado: 17 Dez 2008 07:41
por Sergio38br
Bom dia antonio, em que parte vc diz estar "voando", na definições do timer0 ou no uso do flag?

[ ]'s
Sergio