proton ile lcd'de saat-tarih-ısı bir problem var?

Başlatan AKP, 03 Eylül 2009, 15:11:01

AKP

herkese selamun aleyküm,

arkadaşlar internette aşağıda gördüğünüz devreden aradım bulamayınca kolları sıvadım ve proton ile bişeyler yaptım fakat bir problem var.

1. problem -> Saniye atlayarak sayıyor.
2. problem -> saat ve tarih ayarı yapamıyorum.

proteus dosyası kodları veriyorum inşallah yardımlarınız sayesinde çözeceğim kendinize iyi bakın.

 proteus dosyası



Device=16F877A
XTAL=4
Include "MODEDEFS.BAS"
On Interrupt GoTo Kesme
OPTION_REG=%0000000
INTCON=%10010000
CMCON=7
OPTION_REG.7=1
ADCON1=7
'***********Port Ayarları***********
TRISA=0
TRISB=0
TRISC=255
TRISD=0

PORTA=0
PORTB=0
PORTC=0
PORTD=0 
'***********LCD Tanımlamaları***********
Declare LCD_TYPE 0
Declare LCD_DTPIN PORTB.4
Declare LCD_ENPIN PORTB.1
Declare LCD_RSPIN PORTB.0
Declare LCD_INTERFACE 4
Declare LCD_LINES 4
'***********Saat İçin Gerekli Port Tanımlamaları***********
Symbol RTC_RST = PORTD.0
Symbol RTC_DTA = PORTD.2
Symbol RTC_CLK = PORTD.1
'***********Özel Karakter Tanımlamaları
Print $FE,$40, 6, 9, 9, 6, 0, 0, 0, 0 'Derece İşareti
Print $FE,1
'***********RTC DS1302 DEĞİŞKENLERİ***********
Dim SN As Byte
Dim DAK As Byte
Dim SAAT As Byte
Dim GUN As Byte
Dim AY As Byte
Dim YIL As Byte
Dim MEM As Byte
Dim SAYI As Byte
Dim DAY As Byte
Dim ONLAR As Byte
Dim BIRLER As Byte
'***********Değişken Tanımlamaları***********
Dim Ayar_D As Bit
Dim Sayac As Byte
Dim B_Say As Byte
'***********Sensör Tanımlamaları***********
Symbol DQ = PORTA.0
Dim Temp As Word    
Dim CA As Byte      
Dim CPerD As Byte    
Dim ISARET As Byte
Dim OKU As Byte 
Symbol AR = "+" 
Symbol EK = "-" 
Symbol SIF = " "
'***********Buton Tanımlamaları***********
Symbol Buton1 = PORTC.0
Symbol Buton2 = PORTC.1
Symbol Buton3 = PORTC.2
'***********LCD yi Kullanıma Hazır Hale Getir***********
;Low PORTB.2
;Print $FE,1
'***********Değişken Değerleri***********
Ayar_D=0
Sayac=0
B_Say=0
'***********Program Başlangıcı***********
Basla:
    If Ayar_D=0 Then
        GoSub ZAMAN_OKU
        GoSub SENSOROKU
        Print $FE,1,"SAAT  : ",DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN
        Print $FE,$C0,"TARIH : ",DEC2 GUN,"/",DEC2 AY,"/20",DEC2 YIL,"  "
        Print $FE,$94,"ISI   : ",ISARET, Dec (Temp>>1), ".", Dec (Temp.0 * 5),0,"C"
        ;DelayMS 500
    Else
        Select Case Sayac 'Cursor Ayarı
            Case 1
                Print $FE,$0E
                Print $FE,$80
            Case 2
                Print $FE,$0E
                Print $FE,$83
            Case 3
                Print $FE,$0E
                Print $FE,$86
            Case 4
                Print $FE,$0E
                Print $FE,$C0
            Case 5
                Print $FE,$0E
                Print $FE,$C3
            Case 6
                Print $FE,$0E
                Print $FE,$C6
            Case 7
                Print $FE,$0E
                Print $FE,$CC
        End Select

        GoSub Buton_Oku
        Print  DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN
        Print $FE,$C0,DEC2 GUN,"/",DEC2 AY,"/20",DEC2 YIL,"  "

    EndIf

GoTo Basla
'***********Sensör Oku***********
SENSOROKU: 

For OKU=0 To 10
DelayMS 5
OWrite DQ, 1, [$CC, $44]    
Repeat 
DelayMS 5      
ORead DQ, 4, [CA]      
Until CA <> 0    
OWrite DQ, 1, [$CC, $BE]  
ORead DQ, 2,[Temp.LowByte,Temp.HighByte, CA, CA, CA, CA, CA, CPerD] 
If Temp=0 Then ISARET = SIF 
If Temp>0 Then ISARET = AR 
If Temp>500 Then 
Temp=65536-Temp 
ISARET = EK 
EndIf
Next OKU
'***********Buton Oku***********
Buton_Oku:

    Select Case Sayac
        Case 1
            If Buton3=0 Then SAAT=saat+1
            If Buton2=0 Then SAAT=saat-1
            DelayMS 200
            If SAAT>23 Then SAAT=0
        Case 2
            If Buton3=0 Then DAK=dak+1
            If Buton2=0 Then DAK=dak-1
            DelayMS 200
            If DAK>59 Then DAK=0
        Case 3
            If Buton3=0 Then SN=sn+1
            If Buton2=0 Then SN=sn-1
            DelayMS 200
            If SN>59 Then SN=0
        Case 4
            If Buton3=0 Then GUN=gun+1
            If Buton2=0 Then GUN=gun-1
            DelayMS 200
            If GUN>31 Then GUN=1
        Case 5
            If Buton3=0 Then AY=ay+1
            If Buton2=0 Then AY=ay-1
            DelayMS 200
            If AY>12 Then AY=1
        Case 6
            If Buton3=0 Then YIL=YIL+1
            If Buton2=0 Then YIL=YIL-1
            DelayMS 200
            If YIL>99 Then YIL=1
        Case 7
            If Buton3=0 Then DAY=day+1
            If Buton2=0 Then DAY=day-1
            DelayMS 200
            If DAY>7 Then DAY=1
    End Select

    GoSub Ayar
Return
'***********Saat Ayarı***********
Ayar:
    If Sayac=7 Then
        Print $FE,$0C
        Print $FE,1
        DelayMS 50
        Print $FE,1
        Sayac=0
        Ayar_D=0
        GoSub ZAMAN_YAZ
    EndIf
Return
'***********Zaman Oku***********
ZAMAN_OKU:

         High RTC_RST
         SHOut RTC_DTA, RTC_CLK, 0, [$BF]
         SHIn RTC_DTA, RTC_CLK, 1, [SN, DAK, SAAT,GUN , AY, DAY, YIL, MEM]
         Low RTC_RST
         MEM=SN:GoSub CEVIR:SN=SAYI
         MEM=DAK:GoSub CEVIR:DAK=SAYI
         MEM=SAAT:GoSub CEVIR:SAAT=SAYI
         MEM=GUN:GoSub CEVIR:GUN=SAYI
         MEM=AY:GoSub CEVIR:AY=SAYI
         MEM=YIL:GoSub CEVIR:YIL=SAYI
         MEM=DAY:GoSub CEVIR:DAY=SAYI

         Return
'***********Zaman Yaz***********
ZAMAN_YAZ:
    MEM=SN:GoSub TERSCEVIR:SN=SAYI
    MEM=DAK:GoSub TERSCEVIR:DAK=SAYI
    MEM=SAAT:GoSub TERSCEVIR:SAAT=SAYI
    MEM=GUN:GoSub TERSCEVIR:GUN=SAYI
    MEM=AY:GoSub TERSCEVIR:AY=SAYI
    MEM=YIL:GoSub TERSCEVIR:YIL=SAYI

    High  RTC_RST
    SHOut RTC_DTA, RTC_CLK, 0, [$8E, 0]
    Low RTC_RST : DelayMS 1
    High RTC_RST
    SHOut  RTC_DTA, RTC_CLK, 0, [$BE, SN, DAK, SAAT,GUN , AY, DAY, YIL, 0]  'YAZ
    Low RTC_RST
    DelayMS 10
Return
'***********Çevir***********
CEVIR:
    ONLAR=MEM & %01110000
    ONLAR=ONLAR>>4
    BIRLER=MEM & %00001111
    SAYI=ONLAR*10+BIRLER
Return
'***********Ters Çevir***********
TERSCEVIR:
    ONLAR=MEM Dig 1
    ONLAR=ONLAR<<4
    BIRLER=MEM Dig 0
    SAYI=ONLAR+BIRLER
Return
'***********Kesme***********
Return
Disable
Kesme:
    If Ayar_D=0 Then
    Print $FE,1
    EndIf
    DelayMS 10
    Ayar_D=1
    Sayac=Sayac+1
    INTCON.1=0
Resume
Enable
End

ilker_32

Sensör okuma kısmındaki for döngüsü işi berbat ediyor ve ekran tazeleme süresini iyi ayarlaman gerek. Böylece düzelebilir denemen gerek.

drmp

bende böyle bir devrede ayar yapamamıştım sonra öğrendimki ds1302-ds1307 proteusta ayar yaptırmıyor

OG

DS1307 için kullandığım kod, problem yok,
''' Cihaz ilk enerjilendiğinde DS1307 için başlama değerleri

I2COUT SDA, SCL, $D0 , $00 , [ 0 ]   ' Clock Halt (CH) Ataması (Saatin çalışması için gerekli)
DelayMS 100

I2COUT SDA, SCL, $D0 , $07 , [ $90 ] '' $07 ye 90H yazacaksın.SQW/OUT =1Hz'de çalışacaktır, şart değil 
DelayMS 100


''''' Başlangıç değerleri
SANIYE = $45     ' sn 45 den başlayacak
DAKIKA = $59     ' dk 59
SAAT = $23       ' saat 23
GUNADI = $06     ' 6 = CUMA
GUN = $28        ' ayın kaçıncı günü 28
AY = $02         ' hangi ay şubat
YIL = $09        ' hangi yıl 2009


ds1307_yaz:
    I2COUT SDA, SCL, $D0 , $00 , [ SANIYE, DAKIKA, SAAT, GUNADI, GUN, AY, YIL ]
    DelayMS 200



'''' Değerleri okumak için de alttaki komut
ds1307_oku:
    I2Cin SDA, SCL, $D0 , $00, [ SANIYE, DAKIKA, SAAT, GUNADI, GUN, AY, YIL ]
    
'''' Okunan değerleri ekrana vermeden önce BCD dönüşümünü yap
hane_coz:
    S1 = SANIYE // 16   ' saniye/16 böl ve kalanı S1 e yerleştir.
    S2 = SANIYE - S1
    S2 = S2 // 15
    
    D1 = DAKIKA // 16
    D2 = DAKIKA - D1
    D2 = D2 // 15
    
    SA1 = SAAT // 16
    SA2 = SAAT - SA1
    SA2 = SA2 // 15
    
    G1 = GUN // 16
    G2 = GUN - G1
    G2 = G2 // 15
    
    A1 = AY // 16
    A2 = AY - A1
    A2 = A2 // 15                                       
    
    Y1 = YIL // 16
    Y2 = YIL - Y1
    Y2 = Y2 // 15 
    
    
Print At 1 , 1 , #SA2,#SA1,":",#D2,#D1,":",#S2,#S1," "
Print At 2 , 1 ,#G2,#G1,".",#A2,#A1,".",#Y2,#Y1

''' Gün adı ilavesi
If GUNADI = 1 Then Print At 1 , 10 , " PAZAR  "
If GUNADI = 2 Then Print At 1 , 10 , " PZRTESI"
If GUNADI = 3 Then Print At 1 , 10 , " SALI   "
If GUNADI = 4 Then Print At 1 , 10 , " CRSAMBA"
If GUNADI = 5 Then Print At 1 , 10 , " PRSEMBE"
If GUNADI = 6 Then Print At 1 , 10 , " CUMA   "
If GUNADI = 7 Then Print At 1 , 10 , " CMRTESI"
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

uardal

OG hocam ellerin dert görmesin çok güzel bir örnek olmuş bir süredir araştırıyordum, isiste güzel çalıştı sanırım normaldede çalışacaktır.