Ir ao conteúdo
  • Cadastre-se

Precisão do Timer0 ni pic12F629/675


pardalgms

Posts recomendados

Estou criando um timer com o pic12F629 e tudo funciona de acordo na simulação do proteus, o tempo na simulação fica preciso, mas no meu protótipo a temporização adianta em cerca de 2 minutos, ou seja, originalmente era pra carga desligar com 10 minutos, mas está desligando com um pouco mais de oito minutos, não está preciso. Se alguém tiver uma sugestão eu agradeço, abaixo o código fonte que estou utilizando e o desenho para simulação no proteus.

/****************************************************************************
* TIMER CICLICO *
****************************************************************************/

/****************************************************************************
* FUNCIONAMENTO *
*Este programa aciona 03 saídas e estas saídas são temporizadastendo como *
*base no timer0 que está configurado para estouros de 1 em 1 segundos. Ao *
*ser alimentado o timer começa a contar e o led "pisca" pisca intermitente- *
*mente, indicando que o timer está funcionando, após 09 minutos o buzzer *
*começa a tocar avisando que em 1 minuto o rele irá entrar e desligar a *
*carga acoplada ao rele, quando dá 10 minutos o buzzer desliga e o rele *
*liga, desligando assim a carga, após + 4 minutos (em 14 minutos) o rele *
*desliga e a carga volta novamenta a ser ligada e tudo recomeça novamente */

/*arquivo <teste timer2.h>
#include <12F629.h>

#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES NOMCLR //Master Clear pin used for I/O
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection

#use delay(int=4000000)*/

#include <teste timer2.h>

#use fast_io(A)

#define pisca PIN_A0
#define rele PIN_A1
#define buzzer PIN_A2

unsigned char conta=0;
unsigned char segundos=0;
unsigned char minutos=0;
int t_buz=0;

#INT_TIMER0
void trat_t0()
{
conta++;
if(conta>=125)
{
conta=0;
segundos++;
output_toggle(pisca);

if(t_buz)
output_toggle(buzzer);
}
Set_Timer0(131);
}

void main()
{
set_tris_a(0b00001000);
output_a(0x00);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_64|RTCC_8_bit);
setup_comparator(NC_NC);
set_timer0(131);
Enable_interrupts(global);
Enable_interrupts(int_timer0);
port_a_pullups(false);


while(true)
{
if (segundos>=10)
{
segundos=0;
minutos++;
}
if (minutos == 9)
t_buz=1;

if (minutos == 10)
{
t_buz=0;
output_low(buzzer);
output_high(rele);
}

if (minutos == 14)
{
output_low(rele);
minutos = 0;
t_buz = 0;
output_low(buzzer);
}
}
}

post-176294-1388496588895_thumb.jpg

Link para o comentário
Compartilhar em outros sites

Não sei programar em C, somente em Assembly.

O valor de calibração do oscilador interno que é escrito pelo fabricante no último endereço da memória de programa está sendo copiado pelo programa para o registrador OSCCAL?

Em Assembly se faz assim:

bsf STATUS, RP0 ;Bank 1
call 3FFh ;Get the cal value
movwf OSCCAL ;Calibrate
bcf STATUS, RP0 ;Bank 0

Se esse valor foi apagado do último endereço da memória de programa, aí só usando cristal.

Já tive esse mesmo problema quando estava desenvolvendo um relógio com o PIC16F628A que também tem um oscilador interno de 4 MHz, mas, que não precisa de carregar o valor de calibração no programa.

Só obtive precisão quando deixei de inicializar o Timer 0 com determinado valor a cada interrupção.

Apesar de não saber programar em C, acredito que, no seu programa, o Timer 0 está configurado com um prescaler de 64, sendo inicializado com o valor 131 a cada interrupção para que a cada 125 interrupções ele conte 1 segundo, já que 0,000001 x 64 x (256 - 131) x 125 = 1

Caso o oscilador interno esteja calibrado e mesmo assim esteja tendo essa imprecisão, faça um teste:

Exclua a instrução que inicia o Timer 0 com o valor 131 e altere para que a cada 61 interrupções ele conte 1 segundo, já que 0,000001 x 64 x 256 x 61 = 0,999424

Isso deve dar um erro de menos de 1 segundo a cada 10 minutos.

Link para o comentário
Compartilhar em outros sites

Mulder_Fox, tentei a sua dica, mas não deu certo, diminuiu o tempo, ele está agora com cerca de 40 segundos adiantado, melhorou, mas preciso que tenha maior precisão e não quero adicionar o cristal, pois preciso dos pinos livres, quero acrescentar mais algumas coisas a saídas que agora estão livres. Muito obrigado, vou continuar tentando ou quem sabe mudar de pic, tentar um 12f683.

Link para o comentário
Compartilhar em outros sites

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!