Temporizador com CI CD4060 e cristal 32768

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Temporizador com CI CD4060 e cristal 32768

Mensagempor __JEREK__ » 22 Out 2006 01:17

oi galera

estou tentando fazer um temorizador com o 16F628A, mas mesmo com o Timer1 não tem muita precisão pensei em usar um clock externo na interrupção do pino B0 para incrementar uma variável, procurando pelo velho forum achei posts sobre o CI CD4060 e o cristal de 32768Hz.

peguei o datasheet dele só que ainda não entendi como ele funciona, fiz esse esquema no proteus:

Imagem

alguem poderia me dar uma dica de como consigo um clock com ele??

desde já agradeço a todos pela ajuda!!!
__JEREK__
Byte
 
Mensagens: 216
Registrado em: 11 Out 2006 17:53
Localização: BA

Mensagempor __JEREK__ » 22 Out 2006 14:59

Fiz esse programa de teste com o Timer1 para cronometrar o tempo mas não teve um resultado muito bom

Código: Selecionar todos

#include <16F628a.h>
#use delay(clock=4000000)

#define use_portb_lcd TRUE
#include <lcd.c>          // drives do CCS para lcd

#fuses NOMCLR,INTRC_IO,NOWDT,PUT,NOLVP

int dseg=0;
int seg=0;
int minut=0;
int hora=0;

// timer 1
// responsavel pela contagem de 1 segundo exato
#int_timer1
void trata_t1 ()
{
   // reinicia o timer 0 em 131 mais a contagem que já passou
   set_timer1(53036+get_timer1());

      dseg++;

      if(dseg==10)   // a cada 10 décimos de segundo incrementa segundo
      {
         seg++;
         dseg=0;

         if(seg==60)   // a cada 60 segundos incrementa minuto
         {
            minut++;
            seg=0;

            if(minut==60)   // a cada 60 minutos incrementa hora
            {
               minut=0;
               hora++;
            }
         }
      }
      // escreve na 2° linha do LCD
      printf(lcd_putc,"\n%02u:%02u:%02u:%02u    ",hora,minut,seg,dseg);
}

void main ()
{
   lcd_init();

   printf(lcd_putc,"Relogio");      // Escreve na 1° linha do LCD

   // configurações timer1 - inicio
   setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 );
   set_timer1(53036);   // 53036 = 10Hz
   enable_interrupts (global);
   enable_interrupts (int_timer1);

   While(true)
      {
         //...nádegas a declarar
      }
}



liguei ele junto com um cronômetro digital que eu tenho, e no final de 13 horas teve a seguinte diferença:


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

Diferença: atrazo de 7 minutos e 13 segundos

obs.: utilizei o oscilador de 4MHz interno do PIC16F628.
__JEREK__
Byte
 
Mensagens: 216
Registrado em: 11 Out 2006 17:53
Localização: BA

Mensagempor Maurício » 22 Out 2006 16:06

fala, jerek !!!

usar osciladores internos pra trabalhos de precisão de tempo, eu acho que não é o mais recomendável.
estes osciladores na maioria das vezes são baseados em redes RC, e devido a tolerância do capacitor e a temperatura do chip, a frequência varia muito.
não existe no PIC um trimmer, ou um ajuste fino interno da frequência do oscilador ?? verifique isso.
pra tempos precisos, melhor trabalhar com cristal externo.

fuiz !!

[]'s

RETI.
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor eletroinf » 22 Out 2006 18:30

Pois é, pra gerar clock com precisão o oscilador interno fica devendo. Mas, tu pode utilizar o clock interno para rodar o programa e conectar o cristal de 32.768 no timer 1 do pic, pra obter a base de tempo. Olha no datasheet do pic, na seção do timer1. O 4060 é um contador binário, divide o clock por números de base 2...

Ricardo
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Mensagempor __JEREK__ » 22 Out 2006 21:05

Fala Maurício, tudo legal??

olha, já ouvi falar em "calibração do oscilador interno" mas não sei realmente como fazer isso, foi bom vc ter lembrado, vou pesquisar isso!!!
Mas realmente para trabalhar com tempo devo usar clock externo como vc mencionou!!


eletroinf, valeu pela dica, no datasheet do 16F628A fala alguma coisa sobre timer 1 ligado a um oscilador externo mesmo!

encontrei isso na página 51 do datasheet do PIC16F628A pelo que eu entendi (meu inglês é muito fraco)

Original
Código: Selecionar todos
7.1 Timer1 Operation in Timer Mode

Timer mode is selected by clearing the TMR1CS (T1CON<1>) bit.

In this mode, the input clock to the timer is FOSC/4.

The synchronize control bit T1SYNC (T1CON<2>) has no effect since the internal clock is always in sync.


Tradução
Código: Selecionar todos
7.1 Timer1 Operation in Timer Mode

O Timer Mode é conseguido pela configuração do registrador TMR1CS em 0x00.

Neste modo a entrada de CLOCK para o timer1 é o FOSC dividido por 4.

O bit de controle de sincronismo T1SYNC (T1CON<2>) não tem efeito desde que o clock interno esteja sempre em siscronismo.


Original
Código: Selecionar todos
7.2 Timer1 Operation in Synchronized Counter Mode

Counter mode is selected by setting bit TMR1CS. In this mode the TMR1 register pair value increments on every rising edge of clock input on pin RB7/T1OSI when bit T1OSCEN is set or pin RB6/T1OSO/T1CKI when bit T1OSCEN is cleared.

If T1SYNC is cleared, then the external clock input is synchronized with internal phase clocks.

The synchronization is done after the prescaler stage. The prescaler stage is an asynchronous ripple-counter.

In this configuration, during SLEEP mode, the TMR1 register pair value will not increment even if the external clock is present, since the synchronization circuit is shut off.

The prescaler however will continue to increment.


Tradução
Código: Selecionar todos
7.2 Timer1 Operation in Synchronized Counter Mode

O modo counter é selecionado pela configuração do bit TMR1CS. Neste modo o TMR1 o valor é incrementado na subida da borda do clock de entrada nos pinos RB7/T1OSI quando  o bit T1OSCEN está configurado como 0x00.

Se T1SYNC está configurado como 0x00, então a entrada do clock externo é sincronizado com “internal phase clocks” (não sei o que isso significa).

A sincronização é feita depois do estágio do prescaler. O estágio do prescaler é contador de rippler asincrono.

Nesta configuração, durante o modo SLEEP, o “pair value” do registrador do TMR1 não incrementa se o clock externo esta sempre presente, desde que o circuito de sincronização esteja desligado.

Entretanto o prescaler vai continuar incrementar.


Original
Código: Selecionar todos
7.2.1 EXTERNAL CLOCK INPUT TIMING FOR SYNCHRONIZED COUNTER MODE

When an external clock input is used for Timer1 in synchronized Counter mode, it must meet certain requirements. The external clock requirement is due to internal phase clock (Tosc) synchronization.
Also, there is a delay in the actual incrementing of the TMR1 register pair value after synchronization.

When the prescaler is 1:1, the external clock input is
the same as the prescaler output.

The synchronization of T1CKI with the internal phase clocks is accomplished by sampling the prescaler output on the Q2 and
Q4 cycles of the internal phase clocks.

Therefore, it is necessary for T1CKI to be high for at least 2Tosc (and a small RC delay of 20 ns) and low for at least 2Tosc (and a small RC delay of 20 ns). Refer to the appropriate
electrical specifications, parameters 45, 46, and 47.

When a prescaler other than 1:1 is used, the external clock input is divided by the asynchronous ripplecounter type prescaler so that the prescaler output is symmetrical. In order for the external clock to meet the sampling requirement, the ripple-counter must be taken into account.

Therefore, it is necessary for T1CKI to have a period of at least 4Tosc (and a small RC delay of 40 ns) divided by the prescaler value. The only requirement on T1CKI high and low time is that they do not violate the minimum pulse width requirements of 10 ns). Refer to the appropriate electrical specifications, parameters 45, 46, and 47.


Tradução
Código: Selecionar todos
7.2.1 EXTERNAL CLOCK INPUT TIMING FOR SYNCHRONIZED COUNTER MODE

Quando a entrada de um clock externo é usado para o Timer1 em modo “synchronized Counter mode”, isso deve ter certos requerimentos. O requerimento do clock externo é a sincronização é devido a sincronização do “internal phase clock (Tosc)”.
Também existe um atraso (delay) na atual incrementação do registrador do “TMR1 register pair value” depois do sincronismo.

Quando o prescaler é 1:1, a entrada do clock externo é a mesma saída do prescaler.

A sincronização do T1CKI com o “internal phase clock” é realizado pela amostra da saída do prescaler nos ciclos Q2 e Q4 do “internal phase clock”.

Consequentemente, isto é necessário para o T1CKI ser elevado no mínimo 2 Tosc (e um pequeno atraso de RC de 20ns) e baixar no mínimo 2 Tosc (e um pequeno atraso de RC de 20ns). Consulte os parâmetros 45,46 e 47 para as devidas especificações elétricas.

Quando o prescaler diferente de 1:1 é usado, a entrada do clock externo é dividido pelo contador de rippler assíncrono tipo prescaler assim a saída do prescaler é simétrica. Para que o clock externo encontre o requerimento de amostra,  o contador de rippler deve levar em

Conseqüentemente, isto é necessário para T1CKI tenha um período de pelo menos 4 Tosc (e um pequeno atraso de RC de 20ns) dividido pelo valor de prescaler. O único requerimento no T1CKI no tempo HIGH e LOW é eles não devem violar a largura de pulso mínimo de 10ns. Consulte os parâmetros 45,46 e 47 para as devidas especificações elétricas.


pelo que eu entendi, dá para ligar um cristal de, por exemplo, 32768MHz nos pinos B6 e B7. Usar esse cristal para controlar o timer1 e incrementar uma variável e usar outro cristal ou o oscilador interno para rodar o programa, será que é isso??

só não sei ainda como configurar isso ainda, mas vamos adiante!!
Editado pela última vez por __JEREK__ em 22 Out 2006 21:26, em um total de 2 vezes.
__JEREK__
Byte
 
Mensagens: 216
Registrado em: 11 Out 2006 17:53
Localização: BA

Mensagempor __JEREK__ » 22 Out 2006 21:13

sobre o proteus, eu descobri que é necessário colocar o valor "dentro" das configurações do CD4060 para ele começar a atuar:

entrando nas configurações e colocando o valor do cristal ( o valor usado foi 2621440Hz, parece ter um sincronismo melhor que o 32MHz
http://img190.imageshack.us/img190/9550/image3tt8.jpg
image3tt8.jpg


circuito funcionando sem cristal
http://img190.imageshack.us/img190/796/image2pz6.jpg
image2pz6.jpg


comparando com osciloscópio virtual
Imagem
Você não está autorizado a ver ou baixar esse anexo.
__JEREK__
Byte
 
Mensagens: 216
Registrado em: 11 Out 2006 17:53
Localização: BA

Mensagempor eletroinf » 22 Out 2006 21:47

A parte interessante do datasheet pro caso é

7.4 Timer1 Oscillator
A crystal oscillator circuit is built in between pins T1OS
(input) and T1OSO (amplifier output). It is enabled b
setting control bit T1OSCEN (T1CON<3>). It w
continue to run during Sleep. It is primarily intended fo
a 32.768 kHz watch crystal. Table 7-1 shows th
capacitor selection for the Timer1 oscillator.
The user must provide a software time delay to ensur
proper oscillator start-up.
TABLE 7-1: CAPACITOR SELECTION FOR
THE TIMER1 OSCILLATOR
Freq C1 C2
32.768 kHz 15 pF 15 pF
These values are for design guidance only.
Consult AN826 (DS00826) for further information
on Crystal/Capacitor Selection.


Onde diz que o cristal é conectado entre os pinos RB6 e RB7. O cristal recomendado é 32.768 kHz e ainda são recomendados capacitores de 15pF. O bit T1OSCEN (T1CON<3>) é responsável pela habilitação do oscilador, que funciona mesmo que o PIC vá durmir um sono... :wink:
A partir desse oscilador dá pra tirar a base de tempo pra um relógio, por exemplo, configurando o Timer pra gerar uma interrupção a cada 32768 incrementos dá 1 segundo bem certinho com o cristal citado.
Veja a pág. 53 do datasheet do 16f628a, item 7.4

Ricardo
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Mensagempor juarezbazzo » 22 Out 2006 23:48

Olá , não se stresse (é assim que se escreve? ), faça como o circuito que mostraste, pois eu uso a muito tempo, não precisa ficar simulando, no meu caso, a inda sou fraco nos "micro", por isso uso o mais facil.
100+; um abraço Juarez Bazzo
juarezbazzo
 

Mensagempor __JEREK__ » 23 Out 2006 00:36

oi Ricardo, fiz o seguinte programa

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

#fuses NOMCLR,INTRC_IO,NOWDT,PUT,NOLVP

#int_timer1
void timer1()
{
 output_high(PIN_B0);
}

void main()
{
output_low(PIN_B0);

setup_timer_1(T1_EXTERNAL | T1_DIV_BY_1 | T1_CLK_OUT);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);

while(true);
}


eu acho que deveria ter funcionado (me corrija se eu estiver errado) mais ainda não funcionou. Talvez porque as pessas que tenho a mão não são adequadas (usei um cristal de 14.30244KHz e capacitores 103 = 10pf). Achei que irian funcionar... mas o programa esta certo, não é??

valeu pela ajuda!!
__JEREK__
Byte
 
Mensagens: 216
Registrado em: 11 Out 2006 17:53
Localização: BA

Mensagempor Maurício » 23 Out 2006 01:20

fala jerek !!
ei, hómi !! num é cristal de 32768MHz não, hein !!! é 32,768KHz !
se vc usar megahertz, vc vai ter o relógio mais rápido do mundo !! Imagem :D

e olha só, capacitores cerâmicos, são expressos em PICOFARADS.
esse capacitor seu aí, 103, significa 10+3 zeros, o que dá 10.000 PICOFARADS, ou, 10nF, ou 10KpF. um capacitor de 10pF, só tem escrito 10 nele, mais nada, blz ?? Imagem

[]'s e boa sorte.

RETI.
"Não leve a vida tão à sério, afinal, nenhum de nós sairá vivo, dela!"
Avatar do usuário
Maurício
Word
 
Mensagens: 678
Registrado em: 14 Out 2006 17:23
Localização: São Paulo - SP

Mensagempor __JEREK__ » 23 Out 2006 01:30

Oi marício, brigadão pelo toque, vc está sempre me ajudando!!!

Na verdade achei que estava certo (103 = 10pf) ainda bem que me alertou, acabei achando aqui esse capacitor de 10pf mesmo, só tem 10 escrito nele e quanto ao cristal vou corrigir tambem!!!

olá Juarez, brigado pela dica, na verdade foi atravez de seu post que comecei a tentar usar oscilador externo com o CD4060.

o post foi esse:
http://www.asm51.eng.br/forum/topic.asp?TOPIC_ID=3267

vou ver se acho para comprar esse CI CD4060 aqui aqui na minha cidade, valeu!!

muito obrigado pela ajuda de todos!!!
__JEREK__
Byte
 
Mensagens: 216
Registrado em: 11 Out 2006 17:53
Localização: BA

Mensagempor otavio luiz » 23 Out 2006 13:33

JEREK 10pF = 109 impresso no corpo do capacitor, se voce for utilzar fonte pode usar os 60hz da rede pra fazer isso, a maioria dos radios relogio utilizam.
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

Mensagempor __JEREK__ » 24 Out 2006 18:49

Oi Otávio blz?? eu acho que Maurício tambem está certo, 10pf fica escrito 10 no corpo dele, tipo esse exemplo da figura

Imagem

link para o site:
http://www.electronics123.com/s.nl/it.A/id.575/.f?sc=11&category=176

mais o 109 escrito no corpo está correto tambem?? Não seria 109 = 10 + 9 zeros??

Ah, obrigado pelo toque sobre a frequência da tomada (60Hz) mas em um ambiente com Nobreak, gerador, chão de fábrica mesmo, poderia usar esse tipo de referência sem medo de errar ou para temporizador teria que ser uma coisa mais precisa??

Valeu pela ajuda!!!
__JEREK__
Byte
 
Mensagens: 216
Registrado em: 11 Out 2006 17:53
Localização: BA

Mensagempor eletroinf » 24 Out 2006 22:06

Jerek,
Esse capacitor da foto é 10pF;

Sobre seu código postado acima, na interrupção tu não inverte o estado do pino B0. Pelo seu código, o pino B0 vai à 1 e lá fica... Eu ando meio destreinado no CCS (que tem cada mania!), mas teria que ser algo do tipo

cpp code
#int_timer1
void timer1()
{
if(input(PIN_B0)) output_low(PIN_B0); //Inverte o estado do pino
else output_high(PIN_B0);
}


pra inverter o estado do pino B0 a cada interrupção do Timer 1.
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 07:35

Como diria Jack Estripador... vamos por partes...

Seu relogio esta perfeito ! ... o erro foi de 0,8% e a precisão do oscilador interno é especificado no datasheet em 2%... ou seja, esta perfeitamente dentro do normal...

outra coisa, não adianta você tentar ajustar o OSCCAL, (calibração do oscilador interno) se não tiver uma referencia precisa... e mesmo após o ajuste isso não garante nada, pois com variação de temperatura por exemplo a freq vai mudar novamente... (dentro dos 2% :) )

Você pode simplesmente utilizar um cristal externo de 4Mhz ligado no PIC e utilizar seu mesmo programa, provavelmente ira funcionar como vc deseja.

[]'s

PS.: Lembre-se de mudar os fusiveis para XT ao invez de intRC
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

Próximo

Voltar para PIC

Quem está online

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

cron

x