DS 1302 geri kalıyor neden acaba!

Başlatan lakot, 27 Aralık 2007, 18:32:46

lakot

bu aşağıda verilen kodlar bu forumda bulunan klasik PBP ds1302 kullanma komutları fakat bu komutlar geri kalıyor...neden olabilir acaba! ds1302 okuyor gidip yazıyor arada hiç bir işlem yapmıyor.proteus devre şemasında pic in iç frekansı ve ds1302 frekansından kaynaklanabilirmi? bu komutlarda gecikme yapması için bir sebep bulamadım...yardımcı olabilecek olan bi bakıversin ikidakikaya :) kısacası ben bu komutlara hiç ellemedim aynen hexe çevirdim ve donanımını proteusda kurdum.pc saati ile karşılaştırıyorum fakat bir dakika yaklaşık 10 saniye geri kalıyor?


' LCD clock program using Dallas1202/1302 RTC

       Include "MODEDEFS.BAS"  ' Include Shiftin/out modes

Define  LCD_DREG        PORTD   ' Define LCD connections
Define  LCD_DBIT        4
Define  LCD_RSREG       PORTE
Define  LCD_RSBIT       0
Define  LCD_EREG        PORTE
Define  LCD_EBIT        1

' Alias pins
RST     var     PORTA.2
IO      var     PORTC.1
SCLK    var     PORTC.3

' Allocate variables
rtcyear var     byte
rtcday  var     byte
rtcmonth var    byte
rtcdate var     byte
rtchr   var     byte
rtcmin  var     byte
rtcsec  var     byte
rtccontrol var  byte


       Low RST         ' Reset RTC
       Low SCLK

       ADCON1 = 7      ' PORTA and E digital
       Low PORTE.2     ' LCD R/W low = write
       Pause 100       ' Wait for LCD to startup

       ' Set initial time to 8:00:00AM 07/16/99
       rtcyear = $99
       rtcday = $06
       rtcmonth = $07
       rtcdate = $16
       rtchr = $08
       rtcmin = 0
       rtcsec = 0
       Gosub settime   ' Set the time

       Goto mainloop   ' Skip subroutines


' Subroutine to write time to RTC
settime:
       RST = 1         ' Ready for transfer

       ' Enable write
       Shiftout IO, SCLK, LSBFIRST, [$8e, 0]

       RST = 0         ' Reset RTC

       RST = 1         ' Ready for transfer

       ' Write all 8 RTC registers in burst mode
       Shiftout IO, SCLK, LSBFIRST, [$be, rtcsec, rtcmin, rtchr, rtcdate, rtcmonth, rtcday, rtcyear, 0]

       RST = 0         ' Reset RTC
       Return

' Subroutine to read time from RTC
gettime:
       RST = 1         ' Ready for transfer

       Shiftout IO, SCLK, LSBFIRST, [$bf]      ' Read all 8 RTC registers in burst mode
       Shiftin IO, SCLK, LSBPRE, [rtcsec, rtcmin, rtchr, rtcdate, rtcmonth, rtcday, rtcyear, rtccontrol]

       RST = 0         ' Reset RTC
       Return

' Main program loop - in this case, it only updates the LCD with the time
mainloop:
       Gosub gettime   ' Read the time from the RTC

       ' Display time on LCD
       Lcdout $fe, 1, hex2 rtcmonth, "/", hex2 rtcdate, "/" , hex2 rtcyear,_
       "  ", hex2 rtchr, ":", hex2 rtcmin, ":", hex2 rtcsec

       Pause 300       ' Do it about 3 times a second

       Goto mainloop   ' Do it forever

       End

XX_CİHAN_XX

basic ten anlamam dolayısıyla yazılımına birşey diyemiyorum ancak donanımın ile ilgili bir kaç tavsiye verebilirim.
Öncelikle kullandığın kristalin gerçek değerinde olup olmadığına dikkat 32.768 yerine bazen 3.27 lik kristal verilebiliyor.
Bir diğer hususta kristalin ds1302 ye olan uzaklığı.Bunu mümkün olduğunca yakın tutman gerekir.Yani kristalin entegrenin ayağının dibinde bulunması gerekiyor.
Son olarakta sağlıklı bir besleme olmaması ve ds1302 ile kristalinin yakınlarında ısı yayabilecek bir güçtransistörü yada benzeri bir malzemenin bulunmasıda saat palslerinde bozulmaya neden olabilir.
Bu arada ds1302 yi pilsiz çalıştırma ve pilinde pdf te belirtilen değerde bir voltaja sahip olmasına dikkat et.
Kolay gelsin.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.