Prescaler

Başlatan cyberlight, 26 Aralık 2002, 21:56:25

cyberlight

Merhaba
Benim prescaler la ilgili olarak

anlamadığım bir  nokta var.
Yardımcı olursanız sevinirim.
Aşağıdaki kısım  bir saat programından alınmıştır.



OPTION_REG = $55        ' TMR0 konfigurasyonunu ayarla ve PORTB pullup'larını etkinleştir.
       

INTCON = $a0            ' TMR0 interrupt'ını etkinleştir.
       On Interrupt Goto tickint  ' Interrupt oluşursa TickInt

altprogramına git
---------------------------------------------------------------------------------------
' Her Timer kesmesini işleyecek

Interrupt rutini
       disable         ' Interrupt lar devre dışı
TickInt: Tick = Tick + 1      ' Saniye parçacıklarını

say
       If Tick < 61 Then tiCik       ' 61 * 16,384ms = 1sn

' Bir saniye geçti zamanı

güncelle
---------------------------------------------------------------------------------------
Option register 55h ile yüklenmiş.Buna

göre prescaler TMR0 a set edilmiş ve
oranı 1/64 olarak belirlenmiş.
Bu da 15.625 ms ye denk geliyor.Fakat programda her

bir saniye parçacığı 16.384 olarak alınmış.
Bu nasıl oluyor anlamadım.Yada olayı mı yanlış algıladım?
Programın

tamamını görmek isterseniz mesajıma eklerim.

baba

programı tam gönderir misin?
ÖĞRENDİKÇE    CAHİLLİĞİM       ARTIYOR.

baba

yardımcı olmak için yani.bu programı bir zamanlar

incelemiştim ama şimdi aramayayım nerede.
ÖĞRENDİKÇE    CAHİLLİĞİM       ARTIYOR.

cyberlight

Define  LCD_DREG        PORTD  
Define  

LCD_DBIT        4
Define  LCD_RSREG       PORTE
Define  LCD_RSBIT       0
Define  LCD_EREG        

PORTE
Define  LCD_EBIT        1

' Değişkenler yerleştiriliyor.
Saat      var     byte    
dSaat     var    

byte    ' Display de görünecek saat değişkeni
Dakika    var     byte    
Saniye    var     byte    
tick      var     byte    '

Saniye parçacıkları
Guncelle  var     byte    ' LCD güncellenme durumu
i         var     byte    ' Döngü

değişkeni

       ADCON1 = 7      ' PORTA ve E dijital
       Low PORTE.2     ' LCD'yi yazma moduna

geçir
       Pause 100       ' LCD 'nin açılması için bekle

       Saat   = 0        ' Başlangıç zamanı olarak

00:00:00'ı ayarla
       Dakika = 0
       Saniye = 0
       tick   = 0

       Guncelle = 1      ' Güncelleme

aktif

' TMR0 'ı her 16,384 milisaniyede kesecek şekilde kur.
       OPTION_REG = $55        ' TMR0

konfigurasyonunu ayarla ve PORTB pullup'larını etkinleştir.
       INTCON = $a0            ' TMR0 interrupt'ını

etkinleştir.
       On Interrupt Goto tickint  ' Interrupt oluşursa TickInt altprogramına git


' Ana Program

Döngüsü
ANADONGU:
       PORTB = 0       ' PORTB pinlerini düğmeleri okumak için LOW konumuna al
   

  TRISB = $f0     ' PORTB 'nin düğmelere bağlı pinlerini giriş diğerlerini çıkışa ayarla

       ' Zamanı ayarlamak

için bir düğmeye basılmışmı?
       If PORTB.7 = 0 Then Dakikayi_Azalt
       If PORTB.6 = 0 Then Dakikayi_Artir '

Son 2 düğme dakika ayarı için
       If PORTB.5 = 0 Then Saati_Azalt
       If PORTB.4 = 0 Then Saati_Artir    ' İlk 2

düğme saat ayarı için

       ' Ekran güncellenecek mi?
Kontrol:  If Guncelle = 1 Then
               Lcdout $fe, 1  

' Ekranı sil

               ' Zamanı tt:dd:ss formatında göster t-saat,d-sakika,s-saniye
               dSaat = Saat    '

Saati 0-12 aralığına getir
               If (Saat // 12) = 0 Then
                       dSaat = dSaat + 12
               

Endif

               ' AM mi PM mi kontrol et
               If Saat < 12 Then
       Lcdout dec2 dSaat, ":",

dec2 Dakika, ":", dec2 Saniye, " AM"
               Else
                       Lcdout dec2 (dSaat - 12), ":", dec2

Dakika, ":", dec2 Saniye, " PM"
               Endif

               Guncelle = 0      ' Ekran güncellendi
       

Endif

       Goto ANADONGU   ' Sonsuz döngü sağla


' Dakikayı Artır
Dakikayi_Artir: Dakika

= Dakika + 1
       If Dakika >= 60 Then
               Dakika = 0
       Endif
       Goto debounce

'

Saati Artır
Saati_Artir:  Saat = Saat + 1
       If Saat >= 24 Then
               Saat = 0
       Endif
       

Goto debounce

' Dakikayı Azalt
Dakikayi_Azalt: Dakika = Dakika - 1
       If Dakika >= 60 Then
     

        Dakika = 59
       Endif
       Goto debounce

' Saati Azalt
Saati_Azalt:  Saat = Saat - 1
       If

Saat >= 24 Then
               Saat = 23
       Endif

' 250ms bekle
debounce: For i = 1 to 25
       

Pause 10        ' 10ms bekle (Hiçbir interrupt'ın  kaybolmaması için)
       Next i

       Guncelle = 1      ' Ekran

güncellenmesi aktif

       Goto Kontrol


' Her Timer kesmesini işleyecek Interrupt rutini
       

disable         ' Interrupt lar devre dışı
TickInt: Tick = Tick + 1      ' Saniye parçacıklarını say
       If Tick < 61 Then

tiCik       ' 61 * 16,384ms = 1sn

' Bir saniye geçti zamanı güncelle
       Tick = 0
       Saniye = Saniye +

1
       If Saniye >= 60 Then
               Saniye = 0
               Dakika = Dakika + 1
               If Dakika >=

60 Then
                       Dakika = 0
                       Saat = Saat + 1
                       If Saat >= 24 Then
         

                     Saat = 0
                       Endif
               Endif
       Endif

       Guncelle = 1    ' Ekran

güncellenmesi aktif

tiCik: INTCON.2 = 0    ' Timer Interrupt bayrağını sıfırla
       Resume

       End

Pros_PektuS

kesme gecikmesi hesaplanırken bir komut çevrim süresi

(4MHZ için 1us) ile senin belirlediğin oran(1/64 için 64) ve 256 sayısının çarpımı ile bulunur.
yani bu

durumda
1*64*256=16384us=16,384ms eder.
256 nereden geliyo dersen;
TMR0 sayıcısı h'00' dan h'FF'

değerine kadar toplam 256 defa sayar. sayımdaki her bir artmayı sağlayan senin prescaler değerindir. bu değer 64 ise 64 saykılda 1

artma olur. 256'ya ulaşma için 64*256=16384 saykıl sayılır her bir işlem bir komut işleme süresinde çalışacağından (1us)

16384*1=16384us eder.

kolay gelsin
Soz soylemek icin once duymak, dinlemek gerek. Sen de soze, dinlemek yolundan gir.                                                          Hz. MEVLANA

XNHCX

8)  Tebrikler ve teşekkürler

 Pros_PektuS.
                 Doğru  

söyledin.

*Çevrim süresi PIC,in  saat  osilatörünün periyoduna bağlıdır ve  4  katına eşittir.4MHZ lik  bir osilatör

kullanıldığında periyot 0.25  mikrosaniye , çevrim  süreside 1 mikrosaniye  olacaktır.Eğer  TMR0 'ı ölçeklemessek, her

256 mikrosaniyede bir süre aşımı  gerçekleşecektir.
*TMR0'ı 2,8,16,32,64,128  ve

256 ile ölçeklemek  mümkündür.Bu durumda örneğin
TMR0'ı  256 ile ölçeklersek, 256*256=65,536 mikrosaniyede süre

aşımı  gerçekleşecektir.

**Dostum cyberlight,
Gönderdiğin saat.bas dosyasında  OPTION_REG = $55  ile  TMR0

zamanlayıcısı 16.384  milisaniyede süre aşımına ayarlanmıştır.
OPTION_REG = $55 ' TMR0 konfigurasyonunu ayarla ve

PORTB pullup'larını etkinleştir.
INTCON = $a0 ' TMR0 interrupt'ını etkinleştir.

**Prescaler TMR0 a set

edildiği ve oranı 1/64 olarak belirlendiği için ,
Pros_PektuS de dediği  

gibi.

1*64*256=16384us=16,384ms

eder

XNHCX

baba

arkadaşlar açıklamalarınız çok güzel.ben de bu programın

tamamlama hatasını gidermek için birşey düşündüm.örneğin programda

64*256 usec = 16,384
61(tick)*16,384=

999,424
1,000,000-999,924 = 576 usec tamamlanmıyor.
görüldüğü gibi saniyedeki bu eksiklik
dakikada
60*576

usec=34,560 usec
saatte
60*34,560 usec = 2,073,600 usec geri kalır
bu da
günde
24(saat) *2,073,600 usec

=49,766,400 saniye eder.kısacası günde yaklaşık 1 dakika geri kalma hatası verir.
bunu gidermek için önerim
tick'i 62 ye

kurmak ve tmr0 ı saniyede bir kez 255-247 = 9 a kurmak
9 * 64 = 576
576+999,424 = 1,000,000 usec = 1 saniye (osc

tam 4 MHz ise)
bu nasıl olacak programda şöyle

olabilir.

'***********************************************

' Her Timer kesmesini işleyecek Interrupt rutini


disable ' Interrupt lar devre dışı
TickInt: Tick = Tick + 1 ' Saniye parçacıklarını say
'***** dikkat tick 62

*****************************
If Tick < 62 Then tiCik ' 61 * 16,384ms = 999.424

usec
'                                                                       ' ve 64 * 9 = 576
'           '    ve tmr0 255=> 00 ta taşma

yapıyorsa bize gerekli olan 576
'           '    64 kere 9 = 576
'           '    255 -9 = 247 kurarsak bu iş olur.
'        

  '    (bu arada açılıştaki ilk saniye önemsiz.)
 
'***** ekleme burada *********************

tmr0 = 247      '

bu saniyede bir kez olacak

'********************************
' Bir saniye geçti zamanı güncelle
Tick = 0


....
....
....
....
'************************************************************

cyberlight deneme

sonucunu yazarsın sanırım

yanlışım varsa düzeltin lütfen.
ÖĞRENDİKÇE    CAHİLLİĞİM       ARTIYOR.

cyberlight

Arkadaşlar zaman ayırıp cevap yazdığınız için hepinize

teşekkürler.
Çok iyi açıklamışsınız.
baba ya :
deneme yapınca sonucunu yazarım tabi

PicProje

Arkadaşlar bu tür yardımlaşma ve dialogları görünce bu

siteyi iyiki kurmuşum diyorum yaw  :D
İzindeyiz Ulu önder Mustafa Kemal ATATÜRK

baba

Ellerine sağlık PicProje ve emek veren diğer arkadaşların da

eline sağlık..
ÖĞRENDİKÇE    CAHİLLİĞİM       ARTIYOR.

mhk

Arkadaşlar aslında dedikleriniz doğru ama. Bence kristal frekansını 2 nin katları şeklinde seçerseniz sorun ortadan kalkar. Örneğin Kristali 4 Mhz. yerine 3.2768 Mhz. seçerseniz prescaler ve diğer hesaplamalardaki kolaylıkları göreceksiniz.Gerçi işlemci hızı biraz düşecek ama çoğu uygulamalr için yeterli bence. Benim yaptığım uygulamada haftada 3-4 saniye hata oluyor buda kabul edilebilir bir sınır olsa gerek , zira bilgisayarların saatleri bile günde 2-3 saniye hata yapıyor. Kendinize çok iyi bakın.
"Ya olduğun gibi görün, Ya da göründüğün gibi ol..." Mevlana

Erol YILMAZ

Merhaba;
Benim cok merak ettigim bir konu var. Gunluk 1-2 veya 3 sn lik hatalari nasil tespit ettiginiz. Yaptiginiz saat ile karsilastirma yaptiginiz saatin hangisinin daha dogru oldugu bence cokta iyi bilinen birsey değil. Mesela Casio F-91W saatlerin kendi aralarinda bile 24 saat icerisinde 1 sn'ye yakin kayma oluyor. Bir de bildiginiz gibi ekonomik sartlarda en hatasiz calisan saatlerdendir kol saatleri. Cunku gun boyunca karsilastiklari sicaklik farklari direkt nsan vucuduna bagli oldugundan cok azdir. Mesela yazilim olarak tam 1 sn'yi elde ettiniz diyelim kristal tam frekansini tama ne kadar yakin verecek?...

mhk

Sevgili erol yaptığım karşılaştırma ve ölçmeler bir günlük değil. En az 1 senelik çalışmanını ürünüdür. Hassas zamanlama ile nerdeyse 1 yıldır uğraşıyorum. Ayrıca casio saat kullanıyorum. Güven meselesine gelince Birçok tv kanalında saatleri görmüşssündür onlarla benim saatin arasında fark yok sanırım bu yeterli.
"Ya olduğun gibi görün, Ya da göründüğün gibi ol..." Mevlana

Erol YILMAZ

Merhaba;
Casio saatler ile karsilastirma yapiyorum diyorsun. Cok guzel. Ben de sana diyorum ki iki aynı model Casio saat arasinda bile senin dediginden daha fazla hata oluyor. Televizyonlarin saatlerinin haftalik 3-4 sn bazinda tam olarak dogru oldugunu nasl garanti altina aliyorsun. Kullandigin frekans osilatoru nasil bir sey? Dallas'in hazir osilator devreleri var. ppm seviyeleri cok dusuk. fiyatlari da 10 $ dan basliyor diye duymustum. Oyle birsey mi kullaniyorsun. Aksi taktirde bulabailecegin en iyi kristal 20 ppm seviyesinde. Yani gunde 1.5 sn'yi garanti eder. Yaptigim 5 adet 24 V saat akuye bagli olarak yaklasik 2 senedir calisiyor. Aaralarindaki saniye farklarini gormek cok kolay oluyor.

mhk

Sevgili Erol. Yazdıklarında haklısın , lakin benim burda anlatmak istediğim hatayı minimum seviyeye indirmektir. Elbette hata olacaktır, önemli olan bu hatayı kabul edeilebilir seviyelere çekebilmektir. Şu anda yaklaşık 1 senedir çalışan programlanabilir okul saati projesinde bu hata kabul edilebilir seviyede olmuştur. Eğer benim saatim yanlış yapıyorsa tv ve diğer güvenilir saatlerin yaptığı yanlışın bir önemi kalmaz diye düşünüyorum. Çünkü herkes bu saatlere göre işlem yapıyor. Şunu anlatmaya çalışıyorum. Ben hatayı bulurken sistemi 1 gün kesintisiz çalıştırırım. Hesaplanan değer ile oluşan değer arasındaki farkı hesaplar bunu programda gidermeye çalışırım. Elbette teoride hesaplanan uygulamada başarılı olamaz. En kötü ihitmalle eğer saatim günde 1 saniye ileri gidiyorsa  onu gün içinde 1 saniye bekletirim yine sistem normal olarak çalışır. Hata elbette olacaktır. Ama bırak o kadar da olsun :) Hassas zamanlar ve iyi çalışmalar :)
"Ya olduğun gibi görün, Ya da göründüğün gibi ol..." Mevlana