ds 1302 saat kaydetme problemi

Başlatan anıleroglu, 28 Nisan 2012, 03:07:36

anıleroglu

Merhaba üstadlar;
yaklaşık 1,5 hafta oldu oldu başlayalı ve bi noktaya getirebilbim çok şükür projeyi...ancak sonlara doğru bir problem çıktı ne yazıkki devre üzerindeki saat enerji kesilip tekrar devreye alındığında set değerine geri dönüyo ve yolunda gitmiyo çalışma :(((

saat rutinini proton uygulamalarındaki örneği kullanarak değiştirdim ve kendi rutinimi ekledim çok fazla tecrübem yok ve çakılıp kaldım :(

devrenin çalışma prensibi şu kısaca...

İki adet butonumuz var (1 ve 2 olsun)

hangi butonun bağlı olduğu port 0 olur ise lcd ve seri porttan hangi butonun hangi saat dilimlerinde aktif olduğunu bilmek

buraya kadar herşey yolunda gitti ve sadece saat problemi mevcut.Mevcut saate eklenmesi gereken nokta sadece ''butonlar'' rutinidir.. elinde çalışırlığı test edilmiş bir saati bulunan arkadaslarım üstadlarım ''butonlar'' rutinini paylaşacakları rutine  nasıl entegre edebileceğim konusunda da bu acemiye yardımcı olur umarımm ...Programı ve şemayı paylaşıyorum konu ile ilgili yardımlarınızı bekliyorum....


         
                                             
      Device = 16F877
        XTAL =20
       
        ALL_DIGITAL = TRUE
      LCD_DTPIN = PORTB.4   
      LCD_RSPIN = PORTB.3
      LCD_ENPIN = PORTB.0
      LCD_INTERFACE = 4               ' 4-bit Interface
      LCD_LINES = 4                   ' 4-Line LCD
      HSERIAL_BAUD 9600               
 
        Cls
        DelayMS 500
        TRISD =%11111111
        TRISE =%00000000
       
      Dim GRUP1 As Word
      Dim RTCCMD      As Byte
      
      Dim TEMP      As Byte
      Dim TEMP1       As Byte
      Dim TIMEDATA[6]   As Byte
      Dim OLDSECONDS    As Byte
      Dim SECONDS    As timedata#0
      Dim MINUTES    As timedata#1
      Dim HOURS      As timedata#2
      Dim DATE      As timedata#3
      Dim MONTH      As timedata#4
      Dim YEAR      As timedata#5

'Define registers
      Symbol SECREG   = %00000
      Symbol MINREG   = %00001
      Symbol HRSREG   = %00010
      Symbol DATEREG   = %00011
      Symbol MONREG   = %00100
      Symbol YRREG   = %00110
      Symbol CTRLREG = %00111
      Symbol BRSTREG = %11111
       
        Symbol CLK       = PORTA.0
      Symbol DTA      = PORTA.1
      Symbol RST      = PORTB.6
      
' Time setup data held in eeprom memory
PRST    EData $00,$00,$00,$19,$04,$12

      ALL_DIGITAL = True
      Cls
       
' Clear Write Protect bit in control register of DS1302
      TEMP = $10
      RTCCMD = CTRLREG
      GoSub DS1302_WRITE

' Pre-set the time registers using a data table stored in eeprom memory
      For TEMP1 = 0 To 5
         TEMP = ERead PRST + TEMP1
         RTCCMD = TEMP1
         GoSub DS1302_WRITE
      Next

      TEMP = $80
      RTCCMD = CTRLREG
      GoSub DS1302_READ

'Only Displays on the LCD if the seconds have changed
      While 1 = 1
         GoSub DS1302_READ
         If OLDSECONDS <> SECONDS Then
            Print At 3,1, "TIME ", HEX2 HOURS,":",HEX2 MINUTES,":",HEX2 SECONDS
            Print At 4,1, "DATE ", HEX2 DATE,"/",HEX2 MONTH,"/",HEX2 YEAR 
         EndIf
            GoSub Butonlar
      Wend

'-----------------------------------------------------------------------------------
' Write to DS1302 RTC
DS1302_WRITE:      
      High RST
      SHOut DTA, CLK, lsbfirst, [%0\1,RTCCMD\5,%10\2,TEMP\8]
      Low RST
      Return
'-----------------------------------------------------------------------------------
' Read from the DS1302
DS1302_READ:
      High RST
      SHOut DTA, CLK, lsbfirst, [%111111\6,%10\2]
      OLDSECONDS = SECONDS
      SHIn DTA, CLK, lsbpre, [SECONDS,MINUTES,HOURS,DATE,MONTH,YEAR,YEAR]
      Low RST
      Return
'-----------------------------------------------------------------------------------      
'Anahtar pozisyon degisikligi      
Butonlar:
        If PORTD.0 = 0 Then GRUP1 = 1: HSerOut ["GRUP1 :",Dec GRUP1,32,13,10,32,HEX2 HOURS,32,HEX2 MINUTES,32,HEX2 SECONDS,32,HEX2 DATE,32,HEX2 MONTH,32,HEX2 YEAR,32]:DelayMS 100:Print At 1,1,"GRUP1 :",Dec GRUP1:PORTE.0 = 0:PORTE.1 = 1
        If PORTD.1 = 0 Then GRUP1 = 2: HSerOut ["GRUP1 :",Dec GRUP1,32,13,10,32,HEX2 HOURS,32,HEX2 MINUTES,32,HEX2 SECONDS,32,HEX2 DATE,32,HEX2 MONTH,32,HEX2 YEAR,32]:DelayMS 100:Print At 1,1,"GRUP1 :",Dec GRUP1:PORTE.0 = 1:PORTE.1 = 0
        Return

http://s9.postimg.cc/catk2g227/anahtar.png

burak ozturk

hocam enerji kesilmesi durumunda ds1302 nin saati saymaya devam etmeye devam etmesini istiyor isen cr2032 pil baglamalısın pil artısı 8 e , arzı ise yine 4 nolu pine gelmeli.tabi program başındaki set degerini silmeli açılışta rtc yi okumalısın.

kod konusunda proton bilmedigimden sana nasıl olması gerektigini anlatayım.butonla ayar rutinine atlayacaksın sonra direk olarak,saniyeyi arttıran azaltan rutine gireceksin.tabi bu esnada buton arkını onlemek için her butona basıldıgında ya while wend yada kesme kullanmıyor isen kısa bir pause kullanmalısın.daha sonra seni ayar rutinine sokan dugmeye bastıgında dakika ve saate gecerek aynı işlemleri yapmalı, saatte ayar tusuna basıldıgında ise saati rtc ye yazıp çıkmalısın.

böyle yazınca farkettim ki gozune uzun gibi gelebilir ama başladıgında gerisinin gelebilecegini düşünüyorum.tabiki bu benim genel kullandıgım yontem kendinize uygun ayarlama rutini yazabilir yada farklı yontemleri olan arkadaslarda olabilir.kolay gelsin.
happy coding.