T

DS1302 ile saat devresi

Başlatan tux1983, 17 Mayıs 2012, 18:24:33

tux1983

877A ve ds1302 ile saat devresi yaptım. butonlardan saat dakika gün ay yıl vs. vs. değişip kaydedebiliyorum (ETE hocamın sayesinde :P ) ISISte denemesini yapıyorum. kaydettikten sonra okuttugumda saat dakika gun ay yıl gibi bilgilerin 3 basamaklı olugunu görüyorum.

örneğin 30 sayısını siteden edindiğim kodları kullanarak dec ten hex e çeviriyorum. 1E olması gerek (E=14). bunu ds1302ye yazdırıyorum. tekrar okudugumda bana 114 olarak veriyor.

ete


tux1983

Hocam tekrar teşekkür ederim kodlarda hata yapıyormuşum düzelttim :)

veli dayı

Alıntı yapılan: ete - 17 Mayıs 2012, 22:44:37
Bana kalırsa aşağıdaki linki iyice oku.

http://etepic.com/index.php?topic=458.0

Ete


hocam dediğiniz linki incledim.tam anlamadığım için biraz gözüm korktu .başka bir sitede şu program kodlarını bulmuştum.

INCLUDE "MODEDEFS.BAS"

'*****GİRİŞ VE ÇIKIŞLAR*****
TRISA=0                     'PORTA TAMAMI ÇIKIŞ
TRISB=0                     'PORTB TAMAMI ÇIKIŞ
OPTION_REG.7=0              'PULL UP DİRENÇLERİNİN HEPSİ İPTAL

'*****LCD_DEFINE TANIMLAMALARI*****
DEFINE LCD_DREG      PORTB  'LCD DATA BACAKLARI PORTB'YE BAĞLI
DEFINE LCD_DBIT      4      'LCD DATA BACAKLARI PORTB.4'DEN BAŞLIYOR
DEFINE LCD_EREG      PORTB  'LCD ENABLE BACAĞI PORTB'YE BAĞLI
DEFINE LCD_EBIT      3      'LCD ENABLE PİNİ PORTB.3 BAĞLI
DEFINE LCD_RSREG     PORTB  'LCD RS PİNİ PORTB'YE BAĞLI
DEFINE LCD_RSBIT     2      'LCD RS PİNİ PORTB.2 BAĞLI
DEFINE LCD_BITS      4      'LCD 4 BİT HEBERLEŞME YAPIYOR
DEFINE LCD_LINES     2      'LCD 2*16

'*****RTC DS1302  TANIMLAMALARI*****
RESET VAR PORTA.0
SCLK VAR PORTA.1
IO VAR PORTA.2

'*****RTC DS1302 DEĞİŞKENLERİ*****
GUN     VAR BYTE
AY      VAR BYTE
YIL     VAR BYTE
TARIH   VAR BYTE
SAAT    VAR BYTE
DAKIKA  VAR BYTE
SANIYE  VAR BYTE
KONTROL VAR BYTE

BASLA:
'RESET VE CLOCK PİNLERİ SIFIRLADIK
LOW RESET
LOW SCLK
gun=$11
ay=$03
YIL=$07
TARIH=$23
SAAT=$23
DAKIKA=$59
SANIYE=$55
GOSUB SETTIME
GOTO ANA_DONGU

ANA_DONGU:
GOSUB GETTIME
LCDOUT $FE,1,"SAAT  "
LCDOUT HEX2 SAAT,":",HEX2 DAKIKA,":",HEX2 SANIYE
LCDOUT $FE,$C0,"TARIH "
LCDOUT HEX2 GUN,"/",HEX2 AY,"/",HEX2 YIL
PAUSE 250
GOTO ANA_DONGU

SETTIME:
RESET=1         'OKUMA İŞLEMİNİ BAŞLAT
SHIFTOUT IO,SCLK,LSBFIRST,[$8e,0]
RESET=0         'RESETİ SIFIRLA
RESET=1
SHIFTOUT IO,SCLK,LSBFIRST,[$BE,SANIYE,DAKIKA,SAAT,TARIH,AY,GUN,YIL,0]
RESET=0         'RESETİ SIFIRLA
RETURN

GETTIME:
RESET=1
SHIFTOUT IO,SCLK,LSBFIRST,[$BF]
SHIFTIN IO,SCLK,LSBPRE,[SANIYE,DAKIKA,SAAT,TARIH,AY,GUN,YIL,KONTROL]
RESET=0
RETURN
END


hani siz bitleri kaydır komutu kullanıyordunuz ya
SHIFTOUT IO,SCLK,LSBFIRST,[$BF]
SHIFTIN IO,SCLK,LSBPRE,[SANIYE,DAKIKA,SAAT,TARIH,AY,GUN,YIL,KONTROL]   
  komutları bunun başka bir şeklimi
anlarsam belki kafamdaki soruyu çözerim diye düşündüm ama ben yine de asıl derdimi söyleyeyim.
  pic basicle yazılan saat örneğinde ıf porta.0 then    pause 100   sn=sn+1 endıf diyerek saniyeyi artırabiliyordum.
fakat rtc uygulamasında ben bu ayarlama komutlarını nasıl yazarım.


öyle şablon olarak kullanılabilecek benim gibi programlama tabanı pek iyi olmayanlar için kodlardan.
yokmudur. onun üzerinde değişiklikler yaparak belki de çözeriz.
yada başka bir tavsiyeniz

ete

#4
Benim anlattıklarım içinde burada yer alan sistemde mevcut. RTC nin zaman değerlerini tutma şekli onları HEX formatında göstermeye uygun düşüyor. Ama sayılarla oynamak için mutlaka desimal karşılıklarınıda bulup ona göre işlem yapmanız gerekir.

Kısa ve son bir açıklama daha yapacağım. Saniye değeri 35 ise bunun binary karşılığı %00100011 şeklindedir.
Ama RTC den 35 olarak saniye değeri okuduğunuzda bu size %00110101 şeklinde gelir yada okunur. Bu desimal olarak 53 sayısına tekabül eder. 53 sayısını hex olarak yazdırırsanız $35 dir. İşte senin verdiğin programda bu gösterim şekli kullanılıyor. Bende diyorumki mademki sayı okunurken 53 olarak okunuyor bunu önce desimala çevirmek lazım gelir. En soldaki 4 biti alırsın %0011 ve 4 bit sağa kaydırırsın Olur sana 3 rakamı. Bunu 10 ile çarparsın olur sana 30 rakamı.
En sağdaki 4 biti alır bunu 30 rakamına eklersen ( %00000101 yani 5 rakamını) saniye değeri olur sana 35 işte bu kadar.
Yeniden o açıklamaları okuyun. Çok detaylı yazdım anlaşılması gerekir.

Ete

tux1983

#5
Hocam kendi yazdıgım kodların cevirme kısmını buraya yazayım ISISte çalışıyor ama burada sizin kontrolünüzden geçsin eger dogruysa faydalanmak isteyen diger arkadaslarda kullansın.

buradaki değişkenler ;

HEXA = Onlar basamağı (BYTE olarak tanımlı)
HEXB = Birler basamağı (BYTE olarak tanımlı)
Y_DAK = Yeni DAKikanın kısaltması DS1302ye yollanacak ham DECİMAL veri (BYTE olarak tanımlı)
SAYIHEX = Y_DAK sayısının HEX olarak çevrilmiş ve DS1302ye gönderilmeye hazır hali (BYTE olarak tanımlı)

hexe_cevir:  ' DEC2HEX Subroutini

hexa=Y_DAK dig 1
hexa=hexa<<4
hexb=y_dak dig 0
sayiHEX=HEXb+HEXa

RETURN


ete

HEX tabirini buralarda kullanman yanlış. Yaptığımız işin HEX e çevrilmesi ile alakası yok. Bir çok kişiyi yanlış yönlendirir bu tabir.
Sen yalnızca direk RTC den okunanı hex formatında (desimalde görmen gereken şekli ile) doğru olarak görebiliyorsun. Yoksa işlemin HEX e çevirme ile alakası yok.
Yazdıklarında doğru değil.

RTC den okunan değer %0010 0110 şeklinde olsun. Bu desimal olarak 38 sayısına eşittir (Hex olarak ise 26 dır)
Bu sayının 0010 kısmı (soldaki 4 bit)  bize okunan zaman biriminin onlar basamağını veriyor.
Bu sayının 0110 kısmı (sağdaki 4 bit) bize okunan zaman biriminin birler basamağını veriyor.
%0010 sayısı aslında şöyle duruyor %00100000 bu ise 32 (desimal sayısına eşdeğerdir. O halde bunu sağa çekmek lazım gelir.
SAYI=SAYI>>4 komutu ile bunu 4 bit sağa çekiyoruz ve sayı şu hale geliyor %00000010 buda 2 sayısına eşdeğerdir.
Bizim zaman biriminin onlar basmağında 2 sayısı olduğuna göre bu 20 sayısına eşdeğer olması gerekmezmi bu nedenle 2 sayısını birde 10 ile çarpıyoruz.

Diğeri zaten %00000110 sayısı olduğu ve bununda karşılığı 6 olduğu için ve bu sayının bir ler basamağını teşkil etmesi dolayısıyla 20 sayısına bunu ekliyoruz ve okudğuğumuz sayının 26 olduğunu anlıyoruz. Yani RTC den %00100110 şeklinde okunan diyelimki saniye değerinin desimal ve gerçek değeri 26 imiş diyoruz.
Bu çevirme işlemini bir kez daha yaparsak,
TEMP=(OKUNAN & %11110000) >>4
Temp=TEMP*10
SN=TEMP+(Okunan & %00001111)

Hepsi bu kadar. Artık bir daha bu konuyu açıklamak istemiyorum.  Öğrenin şunu lütfen.

Ete

veli dayı

Alıntı yapılan: ete - 19 Mayıs 2012, 07:44:20
Benim anlattıklarım içinde burada yer alan sistemde mevcut. RTC nin zaman değerlerini tutma şekli onları HEX formatında göstermeye uygun düşüyor. Ama sayılarla oynamak için mutlaka desimal karşılıklarınıda bulup ona göre işlem yapmanız gerekir.

Kısa ve son bir açıklama daha yapacağım. Saniye değeri 35 ise bunun binary karşılığı %00100011 şeklindedir.
Ama RTC den 35 olarak saniye değeri okuduğunuzda bu size %00110101 şeklinde gelir yada okunur. Bu desimal olarak 53 sayısına tekabül eder. 53 sayısını hex olarak yazdırırsanız $35 dir. İşte senin verdiğin programda bu gösterim şekli kullanılıyor. Bende diyorumki mademki sayı okunurken 53 olarak okunuyor bunu önce desimala çevirmek lazım gelir. En soldaki 4 biti alırsın %0011 ve 4 bit sağa kaydırırsın Olur sana 3 rakamı. Bunu 10 ile çarparsın olur sana 30 rakamı.
En sağdaki 4 biti alır bunu 30 rakamına eklersen ( %00000101 yani 5 rakamını) saniye değeri olur sana 35 işte bu kadar.
Yeniden o açıklamaları okuyun. Çok detaylı yazdım anlaşılması gerekir.

Ete


hocam teşekkür ederim.biraz geciktim ama her zaman bilgisayar başına geçme fırsatı bulamıyorumda mazur görün.
      kafamda bazı fikirler belirdi en kısa sürede deneyeceğim.kolay gelsin

Powered by EzPortal