Ir ao conteúdo

Qual a diferença entre:TIMER0,TIMER1,TIMER2,TIMER3,TIMER4?


avinicius

Posts recomendados

Postado
No datasheet do PIC teremos a informações,por exemplo,na página 47 do datasheet do 16F628,podemos ler que o registrador do TIMER é incrementado a cada Cilco de máquina,assim calculando corretamente podemos saber exatamente a temporização.

O TIMER é alterado a cada cilco de máquina independentemente de quantos forem, o tempo será calculado pelo ciclo.

Um PIC com 20MHZ tem um cilco de máquina de 200ns(0.2µs).

Depois com mais tempo estudo sobre o assunto. Mas do jeito que passei no início do tópico, a temporização é calculada como esperado. Não há atraso ou adiantamento do tempo.

EDIT:

Pois é. Lá no início do tópico eu disse:

"O TIMER1 irá correr a 5Mhz/8=625000hz

Temos a frequência, para ter o período, calculamos o inverso da mesma, sendo 1/625000.

Isso nos dá o valor de 1.6uS (micro-segundos)."

Como você mesmo disse, um PIC a 20Mhz tem ciclo de máquina de 0.2uS. Como o timer1 está com prescaler de 8. Temos 0.2us*8 = 1.6uS. Como esperado.

Onde está o erro no cálculo?

Falou

Postado
Onde está o erro no cálculo?

A frase que citei foi:

você usa um cristal de 20Mhz. Então o PIC trabalha internamente a 5Mhz.

Eu não expressei direito,erá para evitar o pensamento:

Mas não seria 2 us para cada linha por que com 8 mhz de frequência

passando pelo devisor interno que é 4 fica 2 mhz.

Como F=1/T, T=1/0.000002 s

T= 2 us

Mais uma observação:

Sabemos que o TIMER 1 é um contador de 16bits, ou seja, ele conta de 0 até 65536

Acho que é de 0 a 65535 pois 65536 usa 3 bytes(24 bits),me corrijam se eu estiver enganado.

PS:Mais uma :D

Se eu estou parecendo 'agressivo',não é essa a intenção :huh:

Postado

Mais uma observação:

Acho que é de 0 a 65535 pois 65536 usa 3 bytes(24 bits),me corrijam se eu estiver enganado.

PS:Mais uma :D

Se eu estou parecendo 'agressivo',não é essa a intenção :huh:

Você está correto, esse é um erro que venho arrumando quando os tópicos ainda estão abertos. Tecnicamente está errado o que eu disse dele contar de 0 a 65536 pois ultrapassa os 16bits.

É que na verdade seria mais fácil de explicar assim. No entanto, o correto seria dizer que ele vai contar de 0 a 65535 e retorna para o 0. Nesse retorno que ele estoura. Assim, completa os 65536 incrementos.

Acho que era preguiça de explicar direito na época.

É importante sim que quando alguém encontre um erro na explicação de um colega, que o mesmo fale. Até porque esse fórum é visitado por muitas pessoas. E não podemos ficar postando informações erradas ou a credibilidade vai para o buraco. :D

P.S: Corrigi lá no post original.

Falou

Postado

Nossa ... tá parecendo uma sessão do STF .... todos sabem o que significa, e ficamos horas e horas debatendo os "detalhes técnicos" kkkkk !

Se tivessem este cuidado nos nossos livros escolares, seria ótimo !!!!!

Acho que se quisermos montar uma escola para ensinar sobre microcontroladores, damos de mil a zero no que tem por aí .....

Paulo

  • 6 meses depois...
Postado

Boa noite amigos!

 

Estou com um problema, não consigo compilar um código com a função TIMER. E já tentei identificar meu erro de diversas formas mas não consigo. Eu estou tentando atualizar um dysplay de 7 segmentos usando o TIMER0. Seue abaixo o código . Agradeço a ajuda de todos!

 

o programa acusa um erro aqui ----   setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_1);

#include <16f628a.h>#FUSES NOWDT                    //No Watch Dog Timer#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT#FUSES PUT                      //Power Up Timer#FUSES PROTECT                  //Code protected from reads#FUSES NOBROWNOUT               //No brownout reset#FUSES NOMCLR                   //Master Clear pin used for I/O#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O#FUSES CPD                      //Data EEPROM Code Protected#use delay(clock=4000000)#define leda pin_b0           //LED A DO DISPLAY PINO 6 NO PIC#define ledb pin_b1           //LED B DO DISPLAY PINO 7 NO PIC             #define ledc pin_b2           //LED C DO DISPLAY PINO 8 NO PIC#define ledd pin_b3           //LED D DO DISPLAY PINO 9 NO PIC#define lede pin_b4           //LED E DO DISPLAY PINO 10 NO PIC#define ledf pin_b5           //LED F DO DISPLAY PINO 11 NO PIC#define ledg pin_b6           //LED G DO DISPLAY PINO 12 NO PIC#define ledp pin_b7           //LED G DO DISPLAY PINO 13 NO PIC#define terra1  pin_A6        //TERRA DISPLAY 1 PINO 15 NO PIC#define terra2  pin_A7        //TERRA DISPLAY 2 PINO 16 NO PIC#define terra3  pin_A3        //TERRA DISPLAY 3 PINO 02 NO PIC#define liga output_high      #define desliga output_low#define frame 10int preco = 0;void digito_100(){   desliga(leda);   liga(ledb);   liga(ledc);   desliga(ledd);   desliga(lede);   desliga(ledf);   desliga(ledg);      liga(ledp);    liga(terra1);   delay_ms (frame);   desliga(terra1);      liga(leda);   liga(ledb);   liga(ledc);   liga(ledd);   liga(lede);   liga(ledf);   desliga(ledg);   desliga(ledp);   liga(terra2);   delay_ms (frame);   desliga(terra2);      liga(leda);   liga(ledb);   liga(ledc);   liga(ledd);   liga(lede);   liga(ledf);   desliga(ledg);   desliga(ledp);   liga(terra3);   delay_ms (frame);   desliga(terra3);  }#int_TIMER0void  TIMER0_isr(void) {switch (preco)         {               case 1:              //CASO A VARIÁVEL PRECO ASSUMA VALOR 1            {               digito_100();     //CHAMA A FUNÇÃO DIGITO_100               break;            }                           set_timer0(0);}void main(){     desliga (terra1); //INICIA O PROGRAMA COM O PINO 15 TERRA DO DISPLAY 1 DESLIGADO   desliga (terra2); //INICIA O PROGRAMA COM O PINO 16 TERRA DO DISPLAY 2 DESLIGADO   desliga (terra3); //INICIA O PROGRAMA COM O PINO 02 TERRA DO DISPLAY 3 DESLIGADO   setup_timer_0 (RTCC_INTERNAL|RTCC_DIV_1);      enable_interrupts(INT_TIMER0);   enable_interrupts(GLOBAL);   //TODO: User Code      while(true)   {      if (input(pin_a0))      {      preco = 1;      do{}   while(input(pin_a0));      }        }}
Postado

@tehuan

 

Seu código está faltando uma chave }. Só isso. 

 

Recomendo o uso da correta indentação. Veja como aqui e aqui.

 

A sua versão do CCS acusou erro no timer0. A minha acusou erro de aninhamento.

 

Só consegui perceber o erro depois que indentei seu código.

 

Parte corrigida:

#int_TIMER0void  TIMER0_isr(void){   switch (preco)   {      case 1:              //CASO A VARIÁVEL PRECO ASSUMA VALOR 1      {         digito_100();     //CHAMA A FUNÇÃO DIGITO_100         break;      }   }        //FALTOU ESSA CHAVE!!!!!         set_timer0(0);   }
Postado

@aphawk

 

uhauhauhuhauh que isso paulo. Um código bem organizado fica bem mais fácil de ler. O erro na verdade foi do compilador CCS que não avisou da falta da chave.

 

Mas o local onde ele esqueceu realmente é de confundir o compilador. Não sei se em outros ocorreria o mesmo.

 

Falou

Postado

@tehuan,existe uma 'ajuda' do compilador para evitar estes erros de lógica.

De um clike com o mouse na primeira chave da sequencia e o compilador vai mostrar se ela esta terminada dentro da sequencia ou não.

 

aviso.gif

 

Nesta figura voce pode perceber que as chaves da mesma função estão em azul. :)

Postado

@MatheusLPS

 

Muito obrigado meu amigo, que errinho sem vergonha. Cara eu fiquei umas 2 horas procurando a falha e não achava, e o CCs nem pra me dar uma moral.... Valeu amigão!

 

@vtrx

 

Eu conheço essa função, mas fiquei meio cego quanto a isso. O CCS acusando erro na linha onde configura o TIMER tirou minha atenção. Mas muito obrigado pela força...

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!