DS1302 yi bir türlü başlatamadım

Başlatan yuppi, 03 Kasım 2009, 15:50:59

yuppi

Aşşagıdaki kodda şöyle bir problemim var.
Saati ve tarihi ayarlıyorum.Ama saat çalışmıyor.4 gündür aynı yerde duruyor.(hafıza pili takılı.).Kodlarında ayar kısmı harici bana ait değil onlarıda formdan aldım.Kafama takılan start bitinimi gönderemiyorum.Yoksa kodlar doğru donanımdamı bir problem var.
ilgilene arkadaşlara şimdiden teşekkürler.


Device = 18F4520
Declare Xtal=20
DelayMS 50 
     		
TRISC =  %00000011
TRISB =  %11111111
TRISD.0= %0
TRISA =  %00101111
LATA   =%00000000
LATB   = %00000000 
LATC   = %00000000
LATD   = %00000000
LATE   = %0000 

Declare LCD_DTPin PORTD.4
Declare LCD_ENPin PORTD.3
Declare LCD_RSPin PORTD.2
Declare LCD_RWPin PORTD.1
Declare LCD_Interface 4
Declare LCD_Lines 4
Declare LCD_Type 0
LCD_DTPort    = PORTD

    Symbol  SEC   =PORTB.6 
    Symbol  YUKARI=PORTB.7 
    Symbol  ASAGI =PORTB.5 
    Symbol  Ds_scl=PORTE.0
    Symbol  Ds_sda=PORTE.1
    Symbol  Ds_rst=PORTE.2
    Dim mem As Byte
    Dim sayi As Byte
    Dim e As Byte
    Dim d As Byte
    Dim eski_saniye As Byte
    Dim saniye As Byte
    Dim dakika As Byte
Dim cont As Byte
Dim SAAT As Byte
Dim GUN As Byte
Dim AY As Byte
Dim YIL As Byte
Dim DAY As Byte
Dim ONLAR As Byte
Dim BIRLER As Byte 
'***********Ana program**************
Tarih_bas:
Cls    
While SEC=1
DelayMS 150
GoSub Tarih_oku
GoSub Tarih_baski
Print  $FE,$91,"Ayar icin SEC"
Wend
'*****************************************
'**************Ayar KISMI*****************
Cls
DelayMS 150
While SEC=1
GoSub Tarih_baski
If YUKARI=1 Then YIL=yil+1
DelayMS 100
If YIL=100 Then YIL=00
If ASAGI=1 Then YIL=yil-1
If YIL=255 Then YIL=99
Wend
DelayMS 150
While SEC=1
GoSub Tarih_baski
If AY=0 Then AY=12
If YUKARI=1 Then AY=ay+1
DelayMS 50
If ASAGI=1 Then AY=ay-1
If AY=13 Then AY=01
Wend
DelayMS 150
While SEC=1
GoSub Tarih_baski
gun_max=30
If AY=1 Or AY=3 Or AY=5 Or AY=7 Or AY=8 Or AY=10 Or AY=12 Then gun_max=31
If YUKARI=1 Then GUN=gun+1
If GUN=(gun_max+1) Then GUN=01
DelayMS 50
If ASAGI=1 Then GUN=gun-1
If GUN=0 Then GUN=gun_max
Wend
DelayMS 250
While SEC=1
GoSub Tarih_baski
If YUKARI=1 Then dakika=dakika+1
If dakika=60 Then dakika=00
DelayMS 50
If ASAGI=1 Then dakika=dakika-1
If dakika=255 Then dakika=59
Wend
DelayMS 150
While SEC=1
GoSub Tarih_baski
If YUKARI=1 Then SAAT=SAAT+1
If SAAT=24 Then SAAT=00
DelayMS 50
If ASAGI=1 Then SAAT=SAAT-1
If SAAT=255 Then SAAT=23
Wend
DelayMS 150
'******************************************************
'***********Tarih bilgisinin ds1302 ye yazıldığı kısım***********
    mem=saniye:GoSub TERSCEVIR:saniye=sayi
    mem=dakika:GoSub TERSCEVIR:dakika=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 Ds_rst
        SHOut Ds_sda, Ds_scl, lsbfirst, [$8E,0]
    Low Ds_rst : DelayMS 1
    High Ds_rst
    SHOut  Ds_sda, Ds_scl,lsbfirst, [$BE,saniye,dakika,SAAT,GUN,AY,DAY,YIL,0]  'YAZ
        Low Ds_rst
        DelayMS 1
GoTo Tarih_bas
'**************************************************
'**************LCD CIKIS KISMI*********************
Tarih_baski:
Print  At 1,4, Dec2 GUN,":",Dec2 AY,":","20",Dec2 YIL
Print  At 2,5, Dec2 SAAT,":",Dec2 dakika,":",Dec2 saniye
Print  $fe,$d0 ,"--",Hex2 cont,"--" 
Return
'****************************************************
'***************DS1302  okundugu bolum**************** 
Tarih_oku:
		High Ds_rst                                            
        SHOut Ds_sda, Ds_scl,lsbfirst, [$BF]
		SHIn Ds_sda, Ds_scl, lsbpre, [saniye,dakika,SAAT,GUN,AY,DAY,YIL,cont]
		Low Ds_rst
         mem=saniye:GoSub CEVIR:saniye=sayi
         mem=dakika:GoSub CEVIR:dakika=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
'******************************************
'******************BCD cevrimleri*************
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



code tag kullanın ,
şimdilik ben editledim ,
maxiboost..

Maxim

Optimiser_Level = 6

bu satırı kaldırın şimdilik ,her zaman çalışacak diye bir kural yok onun

ete

DS1302 de SN registerinin 7 .ci biti  "Clock_Halt" yani "saat stop" bitidir.
Bu bit 0 (sıfır) olur ise saat çalışmaya başlar. Bu bit 1 olursa DS1302 nin osliatörü durur ve saat de çalışmaz.
Bu bitin ilk çalışmada ne olacağı tanımlanmamıştır. Bir de olabilir Sıfır da olabilir. Bu nedenle DS1302 ile saat yapılıp ilk defa çalıştırıldığı zaman ilk yapılacak iş bir kere Saniye  değeris sıfırlanıp Ds1302 ye yazılmalıdır.
Böylece saat her konumda çalışır.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

yuppi

Peki hocam hata nerede.Normalde saniyeyi yazarken ch da 0 laması gerekmiyormu?

ete

Programın en başına daha hiç bir işe başlamadan ;
SN=0 deyip onu DS1302 ye yazdır bakalım sonra ne olduğuna bak.
Zira yazdığın program çok karışık. Direk bir yazma kısmını net çıkartamadım. Sanki önce DS1302 den okunup sonra onu geri yazıyorsun gibi bir durum var . Böyle olunca okunan yazılan da hep CH biti 1 kalabilir.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

yuppi

En baştan bütün değerleri 0 girerek yazdırdım.Sonuç değişmedi.Yazma kısmındaki saniyenin ters çevriminide iptal ettim.sonuç yine aynı.Osiloskopla ds1302 nin kristal baçaklarında osilayonda var frekansı tam tutmasada.Saat geri yada ileri gitsin şu an içn problem değil.
Hocam programın mantığı da şu.
Ekrana yazdırma işini sürekli yaptırmamak için yazım işini bir etikette topladım.Sistem ilk açıldığında ds1302 den bilgieri okuyor düzenliyor ve geri gelip tekrar ekran çıkış etiketine dallanıyor.(Tarih_Baskı) Biz Sec tuşuna basıncaya kadar sistem bu döngüde devam ediyor.Okuyor ekrana yazıyor.Sec tuşuna basıldığı an sırayla yıl,ay,gün,dakika ve saat ayarlanıyor ve en son dakika ayarından sonra tekrar tarih basa gidiyor.

yuppi

Hatayı buldum.DS1302 entegresi arızalı çıktı.Entegreyi değiştirdim ve herşey normal çalışıyor.