Temporizador com CI CD4060 e cristal 32768

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Mensagempor __JEREK__ » 25 Out 2006 18:38

bom, pelo menos achei o cristal de 32.768Khz (se estiver errado, me corrijam). tirei de um relógio do paraguay (relógio de pulso - bendita sucata huahuahua).

Imagem

é esse cilindro prateado do lado esquerdo, pesquisando no google image, vi que a aparencia era essa, apesar que a inscrição do lado não me dizer muita coisa (kd50a).

corrigi o programa como eletroinf me falou, agora ele esta assim:

Código: Selecionar todos
#include <16F628a.h>
#use delay(clock=4000000)

#fuses NOMCLR,INTRC_IO,NOWDT,PUT,NOLVP

short int led=0;

#int_timer1
void timer1()
{
   led = !led;

   output_bit(pin_b3,led);
}

void main()
{
   setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1 | T1_CLK_OUT);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(GLOBAL);

   while(true);
}


só que ele esta acendendo o led e passa 2 segundos e apagando o led e passa 2 segundos, agora como posso usar isso para calibrar o meu relógio, penso que devo fazer uma contagem e zerar a cada interupção do timer1 ou seja a cada 2 segundos...

vamos adiante...
__JEREK__
Byte
 
Mensagens: 216
Registrado em: 11 Out 2006 17:53
Localização: BA

Mensagempor eletroinf » 25 Out 2006 18:50

Barboleto tchê! Tu tem aí algum livro de PIC? Pelo jeito tá no mato sem cachorro...
O timer gera a interrupção quando a contagem passar de 65535 para 65536, considerando o prescale 1:1; Se teu cristal é de 32.768 configura pra dividir por 32.768 pra gerar uma interrupção a cada segundo; pra isso o timer tem que ser iniciado com 65536-32768 = 32768. Só que quando o timer transborda, no momento da interrupção, ele reinicia do zero!! então na interrupção tu tem que carregar este valor nele denovo, ou seja, recomeça a contagem dos 32768 e não do zero! Sugiro os livros do Fábio, tá tudo explicado em bom Português. Claro, pra uma contagem precisa tu tem que considerar a latência da interrupção na hora de recarregar o timer, se for em asm fica fácil simular no MPLAB pra acertar o valor de recarga...
Espero ter ajudado.
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Mensagempor guest2003 » 25 Out 2006 19:09

não leu meu reply ? :(
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

Mensagempor __JEREK__ » 26 Out 2006 21:21

guest2003 escreveu:não leu meu reply ? :(


Que isso Guest, claro que eu li meu amigo, na verdade estou tentando colocar em prática!!! O que vc disse é que a diferença deveria ser e apenas 0,8% segundo o especificado pelo fabricante mas o programa mas esse programa do 2° post meu esta dando uma diferença de 15%, me corrija se eu estiver errado.

(hora:minut:seg)
cronômetro digital= 13:53:13
Meu temporizador= 13:46:00

(retirei a figura, estava errada...)


Como maurício falou isso se deve aos fatores como temperatura, tolerância, redes RC...

Estou querendo usar esse mesmo programa com XT externo como você falou mas não tenho aqui crital de 4MHz para colcar o bicho pra funcionar... estou tentando comprar de Sampa (aliás, foi por isso que eu fiz aquele post sobre cidade pequena lá no boteco!!! http://asm51.eng.br/phpBB/viewtopic.php?t=319)

MAS, nem tudo esta perdido, pelo menos fiz funcionar o esquema com oscilador externo ligado ao timer1 com cristal de relógio de pulso do paraguai!!! ficou blz!!!! a precisão é de atrazo de 1 segundo a cada 8 horas (em relação a um cronômetro marca Technos).

o programa que eu usei foi esse:

Código: Selecionar todos
#include <16F628a.h>               // Início do programa
#use delay(clock=4000000)
#fuses NOMCLR,INTRC_IO,NOWDT,PUT,NOLVP
#include "funcao_LCD.h"               // Configurações para o display LCD, pode ser qualquer biblioteca

// Variáveis usadas na contagem
short int led=0;
int dseg=0;
int seg=0;
int minut=0;
int hora=0;

#int_timer1
void timer1()
{
   led = !led;                               // inverte o estado do led

//   set_timer1(32768+get_timer1());      // 32768 = 1Hz
   set_timer1(32768);            // 32768 = 1Hz
   output_bit(pin_A0,led);            // Acende e apaga o led (não faz diferença na contagem)

      seg++;
      dseg=0;

      if(seg==60)               // Quando a variável seg chegar em 60 incrementa minut e zera seg
      {
         minut++;
         seg=0;

         if(minut==60)         // Quando a variável minut chegar a 60 incrementa hora e zera minut
         {
            minut=0;
            hora++;
         }
      }

   envia_byte_lcd(0,0xc0);          // Desloca o cursor para a segunda linha do LCD
   printf(escreve_lcd,"%02u:%02u:%02u",hora,minut,seg);
}

void main()
{
   inicializa_lcd();               // Faz a inicialização do LCD

   printf(escreve_lcd,"Relogio XT32.768");   // Escreve na 1° linha
   envia_byte_lcd(0,0xc0);          // Desloca o cursor para a segunda linha do LCD
   printf(escreve_lcd,"%02u:%02u:%02u",hora,minut,seg);

                        // T1_EXTERNAL = Clock externo assíncrono
                        // T1_DIV_BY_1  = prescaler do timer 1 divido por 1
                        // T1_CLK_OUT  =  ativa saída externa do clock
   setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1 | T1_CLK_OUT);

   enable_interrupts(INT_TIMER1);      // habilita interrupção pelo timer1
   enable_interrupts(GLOBAL);         // habilita as interrupções globais

   set_timer1(32768);            // inicia a contagem do timer1 em 32768 = 1Hz

   while(1);                  // Mantêm o programa vivo...
}                        // Fim do programa...


Esquema de ligação:
Imagem

Queria ter uma máquina fotográfica nessas horas, quem sabe um dia...

acho que não deveria ter nenhum atrazo mas vai saber se esse cristal do paraguai tem alguma precisão ou se os capacitores que coloquei (10pf) que não são os recomendados pelo fabricante (15pf recomendado) realmente façam diferença...

Ah, eletroinf, eu tenho o livro de Fábio PIC Programação em C mas essa parte do cristal externo no timer1 não vem falando, acho que preciso comprar mais literatura!!!!

valeu galera, muto obrigado pela ajuda de todos especialmente eletroinf!!!
Sem vocês eu tava perdido mesmo!!!
__JEREK__
Byte
 
Mensagens: 216
Registrado em: 11 Out 2006 17:53
Localização: BA

Mensagempor guest2003 » 26 Out 2006 23:17

__JEREK__ escreveu:
guest2003 escreveu:não leu meu reply ? :(


Que isso Guest, claro que eu li meu amigo, na verdade estou tentando colocar em prática!!! O que vc disse é que a diferença deveria ser e apenas 0,8% segundo o especificado pelo fabricante mas o programa mas esse programa do 2° post meu esta dando uma diferença de 15%, me corrija se eu estiver errado.

(hora:minut:seg)
cronômetro digital= 13:53:13
Meu temporizador= 13:46:00



Não disse que deveria ser 0,8%... disse que é 0,8%... :)
A diferença é de 0,8% mesmo... pelo que pude perceber você calculou 53/46 = 15% o que não esta correto...
Pelo que entendi pelos seus numeros isso foi acumulado ao longo de 13 horas e alguns minutos... ou seja:
(13*60+53)min /(13*60+46)min = 1,008 = 0,8%

veja que a diferença seria de 15% conforme vc pensou se houvesse ocorrido antes de 1 hora sequer..

tipo :
0:53:13
0:46:00

ai tudo bem... a dif é de 15% aproximadamente... agora para cada hora acumulada todo o calculo muda...

[]'s

PS: Resumindo tudo que disse... um relogio que erra 1 segundo pode ser magnifico ou uma porcaria... depende da janela :)
errar 1 segundo em 1 seculo é uma coisa... 1 segundo em 1 minuto é outra...

é isso.
http://www.sethi.com.br (Institucional)
http://www.sethi3d.com.br (Impressoras 3d)
http://www.sethi.com.br/blog (Blog Impressoras 3d)
Avatar do usuário
guest2003
Word
 
Mensagens: 746
Registrado em: 13 Out 2006 11:48
Localização: Campinas - SP

Mensagempor eletroinf » 27 Out 2006 12:18

Bueno, eu ainda insisto no que já disse antes: Falta corrigir o tempo de latência da interrupção, uma vez que há uma diferença de tempo entre o momento exato que ocorreu a interrupção e o momento em que tu atualiza o timer com set_timer1(32768); .
Acho que mexendo nisso dá pra diminuir esse erro.
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Mensagempor otavio luiz » 27 Out 2006 13:30

concordo com o eletroinf, voce não descontou o tempo gasto nas instruções dentro da int. por isso o atrazo.

set_timer1(32768+get_timer1()); // 32768 = 1Hz
set_timer1(32768);
esperimente diminuir esse valor de 1 em 1, uma vez que em C não da pra calcular o tempo que vai demorar
Lembre-se, zona de Fresnel não é nenhuma franquia de puteiro.
Avatar do usuário
otavio luiz
Byte
 
Mensagens: 257
Registrado em: 11 Out 2006 13:56
Localização: Barretos - SP, terra de Peão

Anterior

Voltar para PIC

Quem está online

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

x