Ir ao conteúdo

Dúvidas no comando Timer0


charlesfrances

Posts recomendados

Postado

Timer0!

ELE disse que era para usar um contador para contar quanto tempo aperto um botão!!

e não um temporizador..

então fica assim Setup_Counters(RTCC_INTERNAL | RTCC_DIV_256);

só estou com duvida neste codigo #use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1, bits = 8)

eu sei que é no inicio da programação timer0 mais esse rs232(baud=9600 etc... não quer dizer que seria via rs232 naõ né????

queria saber a sua funcionalidade explicação :huh::D

mais pra que que coloca rs232 se a saida não vai ser por ela ou vai??

foi o unico programa que achei na net

e se não foce pelo rs232 como ficaria ?

alguem explica ai pois não estou bem certo!!!! não!!

#include	<16F628A.h>

#FUSES NOWDT, RC, PUT, NOPROTECT, BROWNOUT, NOMCLR, NOLVP, NOCPD
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8)

#use delay(clock=4000000)

ai vai void main()
{

prescaler bla bla bla...!

Postado

cara a função rs232 só se voce for comunicar o pic com outro. no seu caso voce so quer cronometrar o tempo, certo?

pode retirar ela dai. a nao sei que voce queira contar o tempo em um pic e enviar este tempo via rs232 para outro hardware.

nao sei se voce quer a explicação de como fazer o contador ou do protocolo rs232

Postado

esta a usar o CCS correto?

o timer 1 é um contador de 8 bists. ( de 0 a 255 )

quando ocorre um estouro ( quando passa pro 256) ele gera uma interrupçao.

ele pode ser externo ou interno.

para ler o valor = get_timer0()

ex: x = get_timer0() // x vai recereber o valor do timer0

para gravar um valor no timer = set_timer0 (valor)

ex set_timer0 ( 200) // como o timer ja vai começar em 200 ele so vai contar até 55 e vai aver uma interrupção.

voce quer contar o tempo que um botao fica pressionado?

explique melhor o que queres.

se voce queres apenas ligar o timer qando apertar um botão basta fazer assim

 
if (pin_a0 == 0)
{ enable_interrupts (int_timerX) } // o X é o timer que tu queres

obs: nao fiz o debouncing mas é so colocar ali.

Postado

è quase é assim Quanto tempo eu levo para apertar um botão hehehe

agora saquei, voce pode fazer via timer mesmo como o irmão falo no outro topico ou pode usar o modo captura.

poderia escrever um codigo aqui pra ti, mas to sem tempo, baia ai esta apostila e estude ela

PROGRAMANDO MICROCONTROLADORES PIC

ele vai te dar uma otimo ponto de partida, falando sobre os timers, o modo pwm

CCP, rs232 entre outros.

na pag 119 tem um exemplo da captira da largura de um pulso no pino rb3, da pra dar uma estudada e adequar a sua necessidade

Postado

valeu então pronto , cheguei no limite do meu KI kkkkk:D

vou dar uma olhada ajudei no que sei e no que pude espero que este site ajude...

pois o professor é fera é um curso completo pena que é em espanhol mais pode ajudar...

Postado

aqui é merli2 você é meu mestre kkkkkkkkkkk

a maioria das duvidas v me ajudou tenho que destacalo existem pessoas que mal agradecidas querem que vocês ou qualquer outro resolvam tudo e nao é bem assm

ninguem é obrigado a ajudar ninguem!! valeu pelas ajudas anteriores...

algum dia vou conseguir entender RF ,eu sei que é difícil mas vou conseguir!!

consegui os arquivos sobre os timer0 com arh vou tentar fazer o codigo

Postado

ai consegui se excluir a rs232 o codigo funciona??? ja que eu não quero via rs232!!

só pra contar quanto tempo demoro pra apertar um botão o tempo no pic mesmo!!

com certeza ainda tenho muito que aprender kkkkk:eek:

è agora sem brincadeira estou precisando realmente de uma ajuda.

-----------------------------------------------------

Postado

ta mas no caso ai esse rs232 ele usou pra poder enviar os dados pro pc.

ja no seu caso como voce queria ver quanto tempo ficou com o botao pressionado?

LCD, display 7 seg. ???

voce vai precisar de uma interface ai, no caso do codigo os valores sao mostrados no pc.

a parte que faz o que tu queres mesmo seria esta aqui

While( true ){
capturou = 0; //zera flag de captura
interrupcao= 0; //zera flag de interrupção
set_timer1(0); //zera o timer1 , incremento a cada 1us.
while( ! capturou ); //executa enquanto não capturou
tempo = ccp_1;

a variavel tempo ira conter o valor do (tempo do botao) em uSegundos

desprezei a parte do compilador.

o problema é que voce ta querendo dar um paço maior que a perna, no caso ai ele usou a opção do CCP de captura.

leia sobre isto na apostila que te falei e voce vai entender, mas antes de chegar ai voce tem que saber pelo menos como os times funcionam

Postado

não se lembra era assim quanto tempo leva para apertar o botão

quando você disse assim

usando um led como saida ta bom sei lcd (quanto tempo leva para apertar o botão)

ai quando aperta captura o tempo...

Citação:

agora saquei, voce pode fazer via timer mesmo como o irmão falo no outro topico ou pode usar o modo captura.

poderia escrever um codigo aqui pra ti, mas to sem tempo, baia ai esta apostila e estude ela

PROGRAMANDO MICROCONTROLADORES PIC

ele vai te dar uma otimo ponto de partida, falando sobre os timers, o modo pwm

CCP, rs232 entre outros.

na pag 119 tem um exemplo da captira da largura de um pulso no pino rb3, da pra dar uma estudada e adequar a sua necessidad

Última edição por arh : Ontem às 23:42 H

Cara eu sou alegre palhaço e tudo mais eu ja estou endoidando com tudo isso!!!

:angry::bravo::aranha:

acho que devo excluir o rs232

naõ precisa é so isso

:mad::eek::muro::zoio::bravo::naonao: contagem de pulsos no pino CCP1.:naonao:

Postado

charlesfrances

pegue a apostila que te dei, esqueça por enquanto o que tu quer, e apenas leia ela desde o começo, quando voce chegar na parte do CCP voce ja vai tar fazendo este programa que tu querer brincando.

pois a base do pic ta nos timers e voce ainda nao sabe lidar com eles, então estude.

relaxa e comesse a ler a apostila, aposto que até semana que vem se voce seguir tudo direitinho voce vai tar beleza nesse programa

Postado

vamos continuar!!

entendi o seguinte e se eu não quiser usar um LCD ,não por que nao saiba

é logico aqui no forum tem bastante assunto para pesquisar rsrsr

mais tem uma coisa que esta me martelando na caixola como principiante,

nesta imagem

o timer0 conta de 0 a 255 que é 16000 (us) e 65.535 KHz pulsos maximo ?

por exemplo e a constante 4 pode ser mudada se for xt 4MHz/4=1MHz?????

mudada para 8 9 10 16 567 1000 e bla bla bla??? uns dizem que o timer0 é de 8bits e 16bits sei la e agora ????:devil::bravo::natal::stupid:

SIMPLESMENTE!! EU DO NOT UNDERSTAND !!!

preview_html_23d4e445.jpg

Postado

KKKKKKK tá fogo ein meu amigo ???

Na imensa maioria dos Pics e Avrs, TIMER0 e TIMER2 são de 8 bits !!! Apenas o TIMER1 é de 16 bits.

A tal da constante 4 não pode ser mudada.... é que tudo nesses Pics funciona dividindo a frequência do oscilador por 4 , e dessa conta é que resulta o clock real do Pic; é porisso que os AVR's são bem superiores em desempenho. Um simples Atmega4 ainda é cerca de 80% mais rápido que um Pic da família PIC18F..... porque que voce acha que os Arduínos usam AVR's ????

O tempo de latência é apenas o tempo que demora para o Timer gerar uma interrupção, só isso.

E repare que na figura, as contagens do Timer0 estão na parte de cima e sempre vão de 0 a 255 e voltam a zero ! Confirmando que é 8 bits.

voce está confundindo um pouco as coisas..... pense sempre assim, vou te dar um exemplo que é para o Timer0 :

1 - Existe um tal de PRESCALER, que é um divisor , que pega a frequência do clock e divide ela, para diminuir a frequência que será aplicada ao Timer0.

2 - O timer0 conta essa frequência do clock do microcontrolador já dividida pelo PRESCALER, sempre de 0 até 255 pulsos de clock ( 256 vezes pois é um timer de 8 bits). E ao final dessa contagem, ele gera uma interrupção, isto é, se não definirmos uma contagem inicial, teremos uma interrupção a cada 256 contagens do Timer0.

3 - Sempre podemos definir um número inicial para a contagem, ou seja, ela não precisa sempre começar no 0 !!! Podemos definir um número inicial, de 0 a 255, entendeu ? Assim, em vez de termos de esperar 256 pulsos de clock para ter uma interrupção, podemos, por exemplo, esperar apenas 4 se assim o quisermos ! Por exemplo, se definirmos a contagem inicial como 252, teremos uma interrupção para cada 4 contagens do Timer0 .

Veja se melhorou um pouco....

Paulo

Postado

Com absoluta certeza! sim agora entende ,então escolhemos de 0 a 10 100 155, ate 255

pois contando com o 0 a 255 da 256...possibilidades

existe um calculo especifico como converter isso

tipo

o timer0 conta de 0 a 255 que é 16000 (us) dos (us) estou falando!!

então para cada possibilidade existe o tempo (us) é isso ??

Programei no CCS em C.

Minha ideia é contruir um Tacômetro.. o apartelho que lê RPM. Se o circuito estiver correto.. fica fácil dae p frente só que eu queria tira esse LCD e usar LEDS nas portas alguem pode me ajudar??

O circuito:

queria usar leds em vez de LCD!! ajuda ai pessoal quem sabe,pois isso vai servi pra todo mundo, bom é ter o codigo ja feito não é???

pois só quero tirar o lcd e colocar os leds!! entendeu???

#include <16f876.h>
#fuses XT,NOWDT
#use delay(clock=4000000)
#include <lcd.c>
#byte PIR1=0x0C

int1 nuevopulso=0; //Entra outro pulso
int16 TFB=0,TFS=0,TF=0; //Tiempo flancos
float AP=0.0; //Valor final del ancho de pulso
int1 cambio=0; //Cambio de flanco de disparo

#int_ccp1
void ccp1_int(){ //Función interrupción
if(cambio==0){ //Flanco de subida
TFS=CCP_1; //Carga del valor del registro CCPR1 en flanco subida
setup_ccp1(CCP_CAPTURE_FE); //Configuración modo Captura en flanco de bajada
cambio=1; //Control de cambio de flanco
} else { //Flanco de Bajada
TFB=CCP_1; //Carga del valor del registro CCPR1 en flanco bajada
setup_ccp1(CCP_CAPTURE_RE); //Configuración modo Captura en flanco de subida
cambio=0; //Control de cambio de flanco

if(nuevopulso==0){ //Fin de pulso...
nuevopulso=1; //pulso a medir
}
}
}

void main() {

lcd_init();
setup_timer_1(T1_INTERNAL); //Configuración TMR1
setup_ccp1(CCP_CAPTURE_RE); //Configuración modo Captura en flanco de subida
cambio = 0; //Control de cambio a 0

enable_interrupts(int_ccp1); //Habilitación interrupción modulo CCP
enable_interrupts(global); //Habilitación interrupción global

do {
if(nuevopulso==1){ //¿Pulso nuevo?
TF=(TFB-TFS); //Ancho de pulso.
AP = TF*1.0; //Ancho de pulso en microsegundos (a 4MHz:1us)
printf(lcd_putc,"\nPulso = %6.1fuS ", AP);
nuevopulso=0; //Pulso ya medido, espera nuevo
}
} while (TRUE);
}

Postado

primeiro transforme o timer 0 em segundos (quanto tempo demora para estorar o contador timer 0? 256 corresponde a quanto tempo??

que valor posso usar no timer 0 quando inicia lo para dar uma contagem exata?

http://eng-serve.com/pic/pic_timer.html

e use a interrupcao do timer0 quando ele estoura

ai calcule quantos estouros sao necessarios para dar 1 segundo

dai pra minutos e horas e fácil

ai você sabe quanto tempo o botao foi apertado

mais em c deve ser mais fácil ainda...

Com absoluta certeza! sim agora entende ,então escolhemos de 0 a 10 100 155, ate 255

pois contando com o 0 a 255 da 256...possibilidades

existe um calculo especifico como converter isso

tipo

o timer0 conta de 0 a 255 que é 16000 (us) dos (us) estou falando!!

então para cada possibilidade existe o tempo (us) é isso ??

Programei no CCS em C.

Minha ideia é contruir um Tacômetro.. o apartelho que lê RPM. Se o circuito estiver correto.. fica fácil dae p frente só que eu queria tira esse LCD e usar LEDS nas portas alguem pode me ajudar??

O circuito:

queria usar leds em vez de LCD!! ajuda ai pessoal quem sabe,pois isso vai servi pra todo mundo, bom é ter o codigo ja feito não é???

pois só quero tirar o lcd e colocar os leds!! entendeu???

#include <16f876.h>

#fuses XT,NOWDT

#use delay(clock=4000000)

#include <lcd.c>

#byte PIR1=0x0C

int1 nuevopulso=0; //Entra outro pulso

int16 TFB=0,TFS=0,TF=0; //Tiempo flancos

float AP=0.0; //Valor final del ancho de pulso

int1 cambio=0; //Cambio de flanco de disparo

#int_ccp1

void ccp1_int(){ //Función interrupción

if(cambio==0){ //Flanco de subida

TFS=CCP_1; //Carga del valor del registro CCPR1 en flanco subida

setup_ccp1(CCP_CAPTURE_FE); //Configuración modo Captura en flanco de bajada

cambio=1; //Control de cambio de flanco

} else { //Flanco de Bajada

TFB=CCP_1; //Carga del valor del registro CCPR1 en flanco bajada

setup_ccp1(CCP_CAPTURE_RE); //Configuración modo Captura en flanco de subida

cambio=0; //Control de cambio de flanco

if(nuevopulso==0){ //Fin de pulso...

nuevopulso=1; //pulso a medir

}

}

}

void main() {

lcd_init();

setup_timer_1(T1_INTERNAL); //Configuración TMR1

setup_ccp1(CCP_CAPTURE_RE); //Configuración modo Captura en flanco de subida

cambio = 0; //Control de cambio a 0

enable_interrupts(int_ccp1); //Habilitación interrupción modulo CCP

enable_interrupts(global); //Habilitación interrupción global

do {

if(nuevopulso==1){ //¿Pulso nuevo?

TF=(TFB-TFS); //Ancho de pulso.

AP = TF*1.0; //Ancho de pulso en microsegundos (a 4MHz:1us)

printf(lcd_putc,"\nPulso = %6.1fuS ", AP);

nuevopulso=0; //Pulso ya medido, espera nuevo

}

} while (TRUE);

}

http://eng-serve.com/pic/pic_timer.html

Postado

sou principiante mais modifica esse codigo pra mim em vez de LCD coloca leds so´como exemplo Obrigado!!

então tiro o lcd e coloco os pinos de saida em leds, é por que ainda não estou muito fmiliarizado com CCP1 e mudança de codigo

se é que vocês me entende queria só ver a mudança e pegar a manha sem o lcd VaLEU , por favor galera sou apenas um parceiro a mais!!:mellow:

Postado

Vou estudar o codigo e me dedicar , Obrigado de coração ,sei que é um incomodo

ficar pedindo é porcausa do tempo pessoal , Muito obrigado mesmo!! aphawk Valeu!!

depois de dominar isto pesquisar sobre os AVRs ja que dizem que eles são tão precisos ,mais acredito que a fama dos PICs não caira

a tecnologia esta sempre melhorando!!

patoassado espere eu tenho algo que consegui e isto e do interesse de todos!!

O circuito:

queria usar leds em vez de LCD!! ajuda ai pessoal quem sabe,pois isso vai servi pra todo mundo, bom é ter o codigo ja feito não é???

pois só quero tirar o lcd e colocar os leds!! entendeu???

não é o tempo que ele fica apertado e sim quantos apertos em um segundo!! la no topico Ai para um principiante fica difícil entender tempo de latência!!! entendeu?

  • 2 semanas depois...
Postado

Desculpe a demora pessoal ,pois recebi uma advertencia:( e com razão...

Agora eu comprei um windows 8 e fui baixar o proteus e ccs c compiler ,

mais quando fiz o codigo e compilei tudo certinho para o desktop sem erros e não vi o aquivo .hex , e ai apareceu 2 arquivos somente com a letra C Object files escolhi um dos dois e encontrei e vi o nome no proteus .hex... mais no desktop tava com o nome C Object file não entendi ?

e não funcionou direito no proteus mesmo assim o 16f84 ficou piscando, mais não era como eu queria, sera que o windows 8 não é bom!!

o que esta errado onde devo baixar sem ser o atual pois me acostumei com o anterior....:confused:

olha o codigo que coloquei no 16f84 alguem compila ai e me diz o que esta errado ,por que não funcionou do jeito que programei

era para acender e apagar tipo estou funcionando e depois ,se o botão b4 naõ estiver pressionado pisca em meio segundo,se aperto b4 o led pisca mais rápido

mais estou usando windows 8 e não sei o que esta errado

#include <16f84a.h>

#use delay(clock=4000000)
#fuses XT,NOWDT,WDT,PUT,PROTECT
unsigned int16 parametro, p1, p2, contador;

#INT_TIMER0
void trata_timer0(void)
{
//consegui!!!
}

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!