Harici Osilatör Kullanarak Sayıcı kullanma??

Başlatan davul42, 06 Mayıs 2011, 16:19:13

davul42

Arkadaşlar harici osilatörün palsini sayıcımda kullanacağım ama aklıma takılan yerler var acaba yardım edermisiniiz...???

Device=16F876
Xtal=4
ALL_DIGITAL = True
Config XT_OSC,WDT_ON,PWRTE_OFF     Watch Dog Timer Açtım???


INTCON         = %10100000       'TMR0 sayaccından dolayı kesme var
OPTION_REG = %01100101        'T0CKI pinin Clk girişi yaptım,??
                                                   'Bölme işleminin WDT yapıcağından o pini 1 yaptım?
                                                   'T0CKI pin için yükselen kenar yaptım.yani lojik 0 dan 1 e.?
                                                   'bölme oranını 4 mhz için 1/64(110 WDT için) yaptım??
sayıcı ve kesme yazmaçlarını böylelikle ayarladım sanırsam doğru???

Peki Dışarıdan alacağım Osilatörü 22pf kondansatörler ile pulldown edicem clk girişi olarak herhangi bir osilatör bacağınımı PİC in T0Ckı pinine bağlıcam??


ferit06

PIC 16f876 da Timer 1 den harici saymayı  RC0/T1OSO/T1CKI girişinden yapmanız gerekir. Datashees in TIMER1 ile ilgil 57-60 sayfalarını inceleyin.

Tagli

Ne yapmak istediğini anlayamadım. Daha açık anlatırsan sevinirim.

WDT'yi kullanıyor musun programında? Kullanmıyorsan kapat, çünkü yapmaya çalıştığın şeyle doğrudan bir ilgisi olduğunu sanmıyorum.

TMR0'a dışarıdan osilatör bağlayamazsın, sadece tek girişten pulse uygulayarak buna bağlı artımını sağlayabilirsin.
Gökçe Tağlıoğlu

davul42

Yapmak istediğim harici olarak kullanacağım osilatörü sayıcı olarak kullanmak.... :)

Tagli

Timer 1'i dışarıdan saat kristali bağlayarak çalıştırabilirsin. Ama bu işlem pek pals saymak olmaz. Her ne kadar benzer gibi gözükseler de, pals saymak başka bir iş (mesela encoder okurken falan bunu yaparsın), harici kristal ile timer çalıştırmak başka bir iş. Senin istediğin hangisi?
Gökçe Tağlıoğlu

davul42

Hııı anladım..Datasheettede inceliyorum Timer1 registerini...Benim istediğim dışarıdan bir osilatör kullanarak saatimin sayıcısında kullanmak(pic in kendi osilatöründen bağımsız olarak)..Watch Dog Timer elimdeki dökümanlardan anladığım kadarı ile harici osilatörü sayıcı olarak kullanacağım zaman kullanacağım bir komut diye anladım???

Döküman;
OPTION REGISTER
Option Register da, eğer INTCON üzerinden TMR0 taşma ($FF den $00 e geçerken) Interrupt ı aktif (T0IE) edilmişse bu TMR0 sayıcısı için gerekli olan saat sinyalinin (clock) kaça bölünmesi gerektiğini belirten üç adet bit vardır. Bahse konu olan Option Registerin yapısı ve bit lerin neler olduğu aşağıda açıklanmıştır.



RBPU: bu bit portb de bulunan dâhili PullUp dirençlerini aktif eder.

INTEDG: Aktif edilen Interrupt ın (INTE, RBIE) oluşmasını sağlayacak sinyalin düşen kenar ya da yükselen kenar seçimi yapar.

T0CS: TMR0 için saat sinyali (Clk) girişinin seçimini yapar

1 = T0CKI pin
0 = PIC için kullanılan Osilatör Kullanılır

T0SE: Eğer T0CKI seçildiyse saat sinyalinin Hangi kenarda sayma işlemi gerçekleşeceğinin seçimini yapar.

1= T0CKI pin düşen kenar
0 = T0CKI pin Yükselen kenar

PSA: Bölme işleminin hangi sayıcı içi olacağını belirtir.

1 = WDT
0 = Timer0



Tagli

Yani PIC ile dijital saat yapmaya mı çalışıyorsun?

Timer 0 ve Timer 1 harici clock sinyali ile çalışabilir. Öte yandan, sadece Timer 1 harici kristal ile çalışabilir. Öncelikle hangisini kullanacağına karar vermelisin. Sonra diğer ayarladı düşünürsün.

WDT'ın yapmak istediğin şeyle bir ilgisi yok. Bunun kapalı olduğundan emin ol. İlgili ayar config bitlerinden yapılır. Yani WDT_OFF olacak.
Gökçe Tağlıoğlu

davul42

#7
evet dijital saat bunun içinde saatin clk sinyalini dahili osilatörden değilde dışardan bağlayacağım bir osilatörden almak istiyorum yada dışardan bir osilatör kullanarak bunu gerçekleştirmek istiyorum...

Harici Kristal Osilatörü kullanacağım için Timer1 sayıcısını kullanıcağım...WDT yi kapattım....Timer1 Registerini Dtasehhetinden inceledim...ve buna göre bir örnek yaptım ama sonuç alamadım ??

Device = 16F876
Config WDT_OFF

ALL_DIGITAL = True
Declare LCD_TYPE 0
Declare LCD_DTPIN PORTC.4   
Declare LCD_ENPIN PORTC.3   
Declare LCD_RSPIN PORTC.2   
Declare LCD_INTERFACE 4     
Declare LCD_LINES 2

Dim say As Byte
Dim saniye As Byte

INTCON     = %11000000     
T1CON      = %00011111       
PIE1         = %00000001

Basla:
Print At 1,1,DEC2 say
Print At 2,1,DEC2 saniye
GoTo Basla

Disable 
KESME:
say=say+1
If say=61 Then
say=0
saniye=saniye+1 
EndIf


GoTo KESME

 Resume


T1oso ve t1os1 kristali bağladım..
ve 100 Khz yaptım Kondansatörler 15pf mı olacak?



Tagli

Kapasitör değerinin çok önemli olduğunu sanmıyorum. Ama tabi mutlaka kapasitör bulunmalı...

T1OSCEN bitini 0 bırakmışsın. Bunun 1 olması gerekiyor. Ayrıca, T1SYNC bitini 1 yaparak da asenkron çalışmaya ayarla. Bu son bit o kadar da önemli olmayabilir gerçi. Zaten senkronize çalışmasının ne anlama geldiğini anlayamadım bir türlü (daha önce bu konu hakkında forumda bir başlık açmış ancak tatmin edici bir cevap alamamıştım). Şu şekilde dene:

T1CON = %00011111

Bu arada, Timer 1'in çalışıp çalışmadığını nasıl gözlemliyorsun? Kesme kodunu göremedim. Ayrıca Timer 1'i okuyan bir bölüm de yok gibi kodunda.
Gökçe Tağlıoğlu

davul42

çalışıp çalışmadığını osilatörün frekansını değiştirerek kontrol ediyorum...(ya çok artırarak yada çok azaltarak)
Kesmeyi ekledim şimdi...
ama kesmeyi eklerken aklıma takılan sorular var??
Tmr0 bitiyle bir işimiz olacakmı yoksa sadece kesmeyimi aktif edeceğiz??

Tagli

Değiştirdiğin osilatör Timer1 osilatörü ise bunu program çalışmasında görmezsin. PIC yine kendi ana osilatörü üzerinden çalışır. Timer 1 ise ikincil osilatör üzerinden çalışır.

Kesmeleri kullanabilmek için 3 biti 1 yapman gerekiyor. Timer1 kesme izin biti, peripheral kesme izin biti ve genel kesme izin biti. Yani; TMR1IE, PEIE ve GIE bitleri. Ayrıca, kesme kodunu da uygun şekilde yazmalısın.

Senin yukarıda verdiğin program kesme kullanamadan kendi işleyişi ile bir değişkeni sürekli arttırıp ekrana basıyor. Bununla Timer 1 çalışmasını gözlemleyemezsin. Bu şekilde yazdığın bir kod sana PIC'in ana kodunun çalışması hakkında fikir verebilir ancak.

Timer 0 ile bir işin yok, ya da ben öyle anladım.
Gökçe Tağlıoğlu

davul42

#11
INTCON     = %11000000   
T1CON      = %00011111       
PIE1         = %00000001

bu kayıtçıları ekledim...yanii
intcon kayıtçısından genel kesme biiti olan                           ıntcon.7 biti (GIE)
intcon kayıtçısından peribheral biti olan                                ıntcon.6 biti (PEIE)
pie1   kayıtçısında bulunan Timer1 sayıcısını aktif etme biti   PIE1.0   biti (TMR1IE) (Datashete göre yazdım)

Tmr0 ile ililşkim yok.. sayıcımı belirledim oda Timer1... demek istediğim Tmr0 sayıcısını kullanmak için Intcon kayıtçısındaki  Tmr0 bitini  aktif etmek gerekiyordu... ozaman Timer1 sayıcısını nerden aktif edicez anlamında sormuştum ama sanırsam onuda PIE1 kayıtçısından 0nci biti 1 yaparak herhalde???

Tagli

Evet, bu şekilde doğru. Ama TMR0IE de 0 olmalı. Varsayılan değeri 0'dır zaten, ayrıca bir ayar yapman gerekmiyor.

Daha önce de belirttiğim gibi, kesme kodunu da yazman gerekiyor. Kesmeyi açmak tek başına bir işe yaramaz. Saniye değişkeninin arttırılması ile ilgili kodunu kesme bölümünün içine taşıman gerekiyor.
Gökçe Tağlıoğlu

davul42

#13
Zaten Timer0 sanırsam İntcon.5 bitini 0 yaparak devredışı bıraktık...Yukarda verdiğim kodu tekrar değiştirerek yaptım ama saymıyor yine :(....Osilatör girişlerine bakıyorum veri giriş çıkışı yok...

Tagli

Devrenin fotoğrafını veya şemasını, ve de denediğin kodun tamamını bir ekle. Şu durumda yorum yapmak çok zor. Varsayımlar üzerine düşünmek zorunda kalıyorum.
Gökçe Tağlıoğlu