Ynt: Pic ile RTC Oluyor.

Başlatan Muhittin22, 05 Mayıs 2013, 15:20:08

Muhittin22

Çok gerekli olduğu durumlarda Pic ile gerçek zaman saati yapılabilir. Ben kullandığım için paylaşmak istedim.
Öncelikle bunun için Pic'in donanım taimer ini kullandım. Taimer in gerçek zamana uymayan peryodunu kesme içerisinde mikro saniye cinsinden geciktirerek gerçek saniye ile senkronize ettim. Çok keskin sonuç aldım. Kendi kodlarınız için ISIS'da 1hz puls üretici ve osiloskop ile deneyerek senkronlamanız kafi oluyor.
Osiloskop'u 1 mikrosaniyeye kadar düşürmenizi tavsiye edrim.
Aşağıdaki kodu kendi devremde kullanıyorum.
Sadece RTC kısmını koydum. Gerisi size kalmış.
Aşağıdaki kodda kesme içerisindeki
      TMR1L =0
      TMR1H =0
satırından sonra pir port high low yaparak kolayca  osiloskop ile takip edebilirsiniz.
Kesme içerisine
      TMR1L =0
      TMR1H =0
satırından önce başka kod eklemeyiniz.
Kolay gelsin.
Örnek Kod:
Device 16F876
Xtal = 20
@CONFIG_REQ
@__config HS_OSC & WDT_OFF & PWRTE_ON & LVP_Off

All_Digital = true
PortB_Pullups = off

TRISA = %00111111
TRISB = %00000001 
TRISC = %10000011

PORTA=0
PORTB=0
PORTC=0
DelayMS 10


Dim Saniye        As Word'
Dim Dakika        As Word
Dim Saat          As Word
Dim ZAMAN1        As Word
Saat = 0
Saniye= 0
Dakika = 0
ZAMAN1 = 0

Symbol RBIF = INTCON.0   ' Bu bit PORTB değişiklik oluşmuş bir Interrupt varsa "1" olur
Symbol INTF = INTCON.1   ' Bu bit RB0 kesmesinden dolayı oluşmuş bir Interrupt varsa "1" olur
Symbol T0IF = INTCON.2   ' TMR0 sayıcısı zaman aşımı bayrağı
Symbol RBIE = INTCON.3   ' PORTB (4, 5, 6, 7) deki değişiklik kesmesini aktif yapma bayrağı
Symbol INTE = INTCON.4   ' RB0 Harici kesmeyi aktif yapma bayrağı
Symbol T0IE = INTCON.5   ' TMR0 sayıcı kesmesini aktif yapma bayrağı
Symbol PEIE = INTCON.6   ' Arabirim kesme aktif yapma bayrağı.
Symbol GIE  = INTCON.7   ' Tüm kesme işlemlerini etkin/iptal etme bayrağı
clrwdt
Symbol TMR1IE = PIE1.0   ' TMR1 sayıcısının Kesme Yetki Biti
Symbol TMR1IF = PIR1.0   ' TMR1 sayıcısının "Kesme Oluştu" bayrağı

Symbol TMR1ON = T1CON.0     ' Timer1 ON
Symbol TMR1CS = T1CON.1     ' Timer1 Clock Source Select
Symbol NOT_T1SYNC = T1CON.2 ' Timer1 External Clock Input Synchronization Control
Symbol T1OSCEN = T1CON.3    ' Timer1 Oscillator Enable Control
Symbol T1CKPS0 = T1CON.4    ' Timer1 Input Clock Prescale Select bits
Symbol T1CKPS1 = T1CON.5    ' Timer1 Input Clock Prescale Select bits


On_Hardware_Interrupt GoTo kesme
GIE = 0    ' Turn off global interrupts
TMR1IE = 1 ' TMR1 sayıcısının Kesme Yetki Biti
TMR1IF = 0 ' TMR1 sayıcısının "Kesme Oluştu" bayrağı
INTE = 0   ' RB0 Harici kesmeyi aktif yapma bayrağı
INTF = 0   ' Bu bit RB0 kesmesinden dolayı oluşmuş bir Interrupt varsa "1" olur
PEIE = 1   ' Arabirim kesme aktif yapma bayrağı.
TMR1ON = 1 ' Timer1 ON
GIE = 1    ' Enable global interrupts
T1CKPS0 =0 'TMR1 ZAMANLAMA SET
T1CKPS1 =0

GoTo BASLA

kesme:
Context Save
    GIE = 0 
      Inc ZAMAN1
      TMR1IF = 0
      If ZAMAN1=76 Then
      DelayUS 3845
      nop
      TMR1L =0
      TMR1H =0
      ZAMAN1 =0
      Inc Saniye
      If Saniye > 59 Then Inc Dakika :Saniye = 0
      If Dakika > 59 Then Inc Saat   :Dakika = 0
      If Saat   > 23 Then Saat = 0
      GoSub Islem
      EndIf

    GIE = 1
Context Restore


BASLA:

GoTo BASLA



Islem:

Return
End

mesaj birleştirme:: 05 Mayıs 2013, 15:51:46

Çok faydalandığım Picproje Forumuna emeği geçenlere teşekkür ediyorum.
Çok sık giremiyorum. Bu nedenle mesaj atan arkadaşların taleblerini görmekte çok geç kalıyorum özür dilerim.

mehmet

RTC olması için kesme içinde genel kesmeleri durdurmamanız
gerekli. Ayrıca kesme içindeki delay ve şart fonksiyonları da olmamalı.
Sadece bir bayrak yada basit bir sayıcı yapmak ve bunu ana döngü
içerisinde kontrol etmek ve sırıflamak gereklidir.
Sonuç olarak kesme içinden çok çabuk çıkılması gerekmektedir...
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr