T

32768khz harici osilatörü nasıl kullanıcam???

Başlatan tersoll, 19 Haziran 2014, 15:31:50

tersoll

#include <16f628a.h>
#FUSES NOWDT
#FUSES INTRC_IO
#FUSES NOBROWNOUT
#FUSES NOLVP

#use delay(int=4000000)

#use fast_io(a)
#use fast_io(b)


unsigned int i=0,z=0;

#int_timer1 // timer0 kesmesi
void timer1_kesme()
{
set_timer1(55543);
i++;
if(i==100)
{
output_toggle(pin_b0);
i=0;z++;
if(z==10)
{
output_toggle(pin_b1);
z=0;
  }
}
  clear_interrupt(int_timer1);
  }
 
 
  void main()
 
  {
  set_tris_a(0x00);
  set_tris_b(0x00);
  output_a(0x00);
  output_b(0x00);
 
 
  setup_ccp1(CCP_OFF);
  setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
  set_timer1(55543);
  enable_interrupts(INT_TIMER1);
  enable_interrupts(GLOBAL);
 
  while(1)
{
output_high(pin_b7);
}
}

32768khz lik osilatörü timer1 ile nasıl kullanıcam kodu nedir

ete

Her işlmecide TMR1 için harici OSC bacakları vardır. Mesela 16F628 de PORTB.6 ve PORTB.7 pinleri açıklamasında ,
- PORTB.6 = T1OS0/T1CK1
- PORTB.7 = T1OS1
şeklinde bilgiler görülmektedir. Buradan da anlaşılacağı üzere belirtilenpinler kristal bağlama pinleridir.
Öncelikle 32768 Hz lik kristal bu pinlere bağlanacaktır.

Data sheetler bu bilgileri okumak içindir. Neden aklınıza gelmiyor bir türlü anlamıyorum. TMR1 kısmına bakarsanız her şey orada yazıyor. Sadece yazmıyor üstelik gözle de görülüyor. İlla lisan bilmekde gerekmiyor.

Her neyse oradaki açıklamalara bakarsan kristal bacaklarına 33pf kondansatör bağlaman gerekiyor bu değer yaklşaık 32Khz lik osc için geçerli.
Ayarlama işlemi için T1CON registeri kullanılacak.
Bit 7-6 = 0 sıfır verilecek.
Bit 5-4 = %11 verilecek bu 1/1 bölme oranı yakalamak için gereklidir.
Bit 3   = 1 verilecek.  T1OSCEN biti olup osilatör enable etmekiçin bu bit 1 yapılmalıdır.
Bit 2  = 0 external clk input senkron etme
Bit 1  = 1 , TMR1CS  , TMR1 CLK kaynak seçme biti , harici pinden giriş almak için bu bit 1 yapılmalıdır.
Bit 0  = 1 , TMR1ON yani sayac enable biti 1 yapılacaktır.

Hepsi bu kadar bu aşamadan sonra sayac 32768 hz olarak saymaya başlayacaktır.
Bundan sonrasını nasıl kullanacaksın onuda sen düşüneceksin. Sayac bağımsız olarak 1 sn de 32768 sayacak şekilde çalışacaktır. Bu sayı 65536 nın tam yarısıdır. O halde sayacı 32768 den başlatırsan TMR1=0 olduğunda kesme oluşturur ve kesme oluşturğu anda 1 sn geçmiş olur. Bunu kullanarak saat sinyalleri elde edersin.

Gerisi buna bağlı olarak dakika ve saat sayaclarını çalıştırmaya kalıyor.

Güzelim RTC ler bu işi otomatik yapıp sana sunarken dene böyle yollara başvuruyorsun onuda anlamış değilim.
Başındanberi açtığın konuyu izliyorum. C dilinde çalıştığın için elimden fazla bir şey gelmiyor. Ancak sorunu az çok biliyorum.
Mucit'in de dediği gibi aslında sorun İsis in problemi sebebide şu. RTC saat sinyallerini kendi içinde oluşturuyor. Normal şartlarda sn registeri her 1 sn de bir değişir. Ama çoğu programcılar programlarını öyle döngüye sokuyorlarki RTC yi okuduktan bir kaç milisaniye sonr ayeniden okuma yapıyorlar amaç tabiiki 1 sn ye geçmişmi bakmak için. Bu sistem İsis'in kafasını karıştırıyor. Belkide RTC nin kafası karışıyordur. Çünki simulasyonda sistem bir yandan RTC nin zaman registerlerini oluşturuyor bir yandan da senin programı çalıştırıyor. Hepsine aynı anda yetmek için yeterli hızı var ancak yinede zaman çakışması olduğunu düşünüyorum. Sorunu gidermek için programda iki saat okuma (RTC okuma) komutu arasında en azından 100 ms lik bir gecikme koyulması yeterli olmaktadır. Bunu koyarsanız hatta tercihen daha fazla bir gecikme koyarsanız sorun ortadan kalkmaktadır.
Tabiiki burada C derleyicisinin RTC okuma kütüphanelerinede değinmek gerkiyor. Hata belkide oradadır. Ama sanmıyorum.
Bana kalırsa yeterli gecikmeyi koyup öyle dene ve mümkünse gerçek devrede denemeye çalış.

Ete

Powered by EzPortal