ds1302 string hex karmaşası

Başlatan canbulut, 30 Mart 2012, 01:34:39

canbulut

s.a arkadaslar,
bir saat projem var, verileri hex2 deger olarak al, 2x16 displayde hex2 deger olarak göster dediğimde ne yazıyorsam o çıkıyor sorun yok çalışıyor...fakat verileri string olarak aldığımda 2x16 displayde gösterimde yanlışlık oluyor.bunu nasıl giderebilirim?

ibrsel

DS den okuduğunuz bilgi BCD formatındadır. Bu bilgiyi DEC e çevirip ondan sonra LCD de göstermeniz gerekir.Sitede ETE hocamızın bunun ile ilgili açıklaması ve örneği olacaktı.Site içerisinde arama yaptırır isen ulaşabilirsin..İyi çalışmalar..

canbulut

Alıntı yapılan: ibrsel - 30 Mart 2012, 08:42:46
DS den okuduğunuz bilgi BCD formatındadır. Bu bilgiyi DEC e çevirip ondan sonra LCD de göstermeniz gerekir.Sitede ETE hocamızın bunun ile ilgili açıklaması ve örneği olacaktı.Site içerisinde arama yaptırır isen ulaşabilirsin..İyi çalışmalar..

hocam ben hex formatında bilgiyi alıp hex formatında gösteriyorum bcd'yle rakam uyumumu var.ondanmı sorun olmuyor.benim bu çevrimlere çalışmam gerek biraz.string olarak aldığım veriyi dec olarak gösterecekmi?

ibrsel

DS den dakika bilgisini 24 olarak okudun diyelim..Aslında okuduğun değer aşağıdaki gibi..Bu sayı üzerinde işlem yapabilmen için bu BCD formatındaki değeri DEC e çevirmen gerek..LCD de de bunun DEC değerini göstermen gerek..




canbulut

hocam mesela saniyeyi 24 yazdırmak istiyorum veri bilgisayardan string olarak ayrı değişkenlerde 2 ve 4 olarak alıyorum.bunu hem ds1302'ye yazıp hemde lcd'de göstermem gerekiyor.söylediğiniz aynı şey değil sanırım.https://www.picproje.org/index.php/topic,8209.msg79458/topicseen.html#msg79458bağlantıdaki çevrimi uygulayım dedim ama yapamadım:(
ilginiz için teşekkür ederim.

arm-beginner

//=================================
// Bin2BCD
//=================================
uint8_t Bin2BCD(uint8_t dat)
{
  return ((dat / 10) << 4) | (dat % 10);
}

//=================================
// BCD2Bin
//=================================
uint8_t BCD2Bin(uint8_t dat)
{
  return (dat >> 4) * 10 + (dat & 0xF);
}


canbulut

kardeş sen heralde c'de yazmışsında pic basic lazım...ve bcdto bilmemnemi lazım onuda bilmiyorum....string aldığım veriden gelen ascii karekterleri ds1302nin anlıcağı aynı degerlere çevirmem gerekli..ascii olarak aldığım 24 sayısını ds1302e aynen anlıcağı dilde 24 olarak gönderip görüntülemem gerek.

ibrsel

#7
Öncelikle DS ye yazacağın değeri aşağıdaki formüle uyarlayarak BCD ye çevir ve DS ye o formatta yaz.Basic kodu aşağıdaki gibi olacak
Alıntı Yap
convert_BCD:
    A=(sn  //10) : B=(sn /10) : C=B*16 : sn = C+A

Eğer DS den okuduğun değeri LCD de görmek istiyor isen Bu sefer DS den okunan BCD formatındaki değeri aşağıdaki formül ile DEC e çevir.Basic kodu aşağıdaki gibi olacak.

Alıntı Yap
Convert_DEC:
    B =((sn>>4)  & $0F)*10+(sn & $0F):sn =B

Ben yalnızca saniye (sn) için dönüşümleri verdim.Aynı formül ile sen dakika,saat,ay,yıl,ve gün için de dönüşümleri yapmalısın.Unutma..


canbulut

hocam yazdığınızı hemen incleyeceğim ayrıntılı..fakat bir sorum olacak.iki adet ascii olarak aldığım sayıyı mesela 2 ve 4 böylece ds'ye 24 yazdırmam mümkün olurmu.

ibrsel

#9
İki adet sayıyı okutabiliyorsan; 2 ve 4 ..Bunları 24 olarak DS ye yazmak istiyor isen yapacağın iş şu;

sn=(2*10) + 4 bu işlemin sonucu 24 eder.Yani sn değişkenin değeri 24 oldu atrık. Buraya kadar sorun yok..Şimdi bu sonucu DS ye yazmaya gelelim.. Saniye bilgisinin değeri olan 24 ü DS ye yazmak için BCD ye dönüştürmelisin;aşağıdaki gibi

Alıntı Yap
A=(sn  //10) : B=(sn /10) : C=B*16 : sn = C+A
Buradaki "A","B", ve "C" senin programının başında belirlediğin byte büyüklüğünde bir değişken olmalı. "sn" değişkenide senin saniye değerini tutan byte büyüklüğünde bir değişkenin.
Yukarıdaki işlemin sonucunda sen 24 saniye değerini BCD formatına dönüştürmüş olursun.Artık I2C haberleşmesi ile bunu DS ye yazabilirsin..
Umarım anlatabilmişimdir...

canbulut

işte burda bahsettiğimiz 2 ve 4 iki adet ascii ama saniye=2*10+4 aslında burdaki 2 ve 4 başka bir sayı değilmi aslında?gelen sayılar dec değil.oraya dikkatinizi çekmek isterim tekrar.

canbulut

Alıntı yapılan: ibrsel - 30 Mart 2012, 18:48:40
Artık I2C haberleşmesi ile bunu DS ye yazabilirsin..
Umarım anlatabilmişimdir...
ben shift ile aktarıyorum ama problem olmaz sanırım

ete

DS1302 ve DS1307 hafızasında SAAT - DAK- SN formatı aşağıdaki şekildedir.
Saniye registeri ile anlatayım diğerleride benzerdir.
En büyük saniye değeri 59 dur. Bu sayı  Saniye registerinde 59 yani % 00111011  şeklinde değil   ilk 4 biti 9 değerini verecek şekilde ve sondaki 4 bit de 5 değerini verecek şekilde kayıt edilir. Yani %0101 1001 şeklinde kayıt edilir. Bu sayının desimal karşılığı  89 sayısıdır.  Bunu hex karşılığı ise 59 dur.  Kısaca Saniye değeri 59 ama okunurken 89 olarak okunur ve bunu hex karşılığını yazdırdığın zaman yine 59 sayısını görürsün.
Saniye değerini normal desimal şekle çevirebilmek için,
- Önce birler basamağını ilk 4 bitden alırız   Birler=SN & %00001111 (örneğimize göre Birler=9 olur)
- Sonra onlar basamağını sondaki 4 bitden alırız. Onlar= SN & %01110000,  Onlar=%01010000 şeklinde bir sayı elde ederiz. Bunun 5 olarak okunabilmesi için 4 bit sağa kaydırmamız gerekecektir. Onlar=Onlar>>4 . Bu şekilde Onlar=%00000101  desimal 5 olarak elde edilmiş olur.
GerçekSN=Onlar*10+Birler şeklinde elde edebilirsin.

Dakika ve Saat değerleride benzer şekilde desimale çevrilebilir.
Tabiiki desimal şekilde ayarlanan saat değerlerini registerlere kayıt ederken BCD formatına çevirmen gerekecektir.
Yani bu sefer elimizde diyelimki SN=45 değeri olsun bunu kayıt formatına çevirmek için;
Birler=SN Dig 0
Onlar=(SN Dig 1)<<4
SN_KAYIT=Onlar+Birler   
Umarım anlaşılmıştır.
Ete

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

ibrsel

Öz olarak aynı şeyleri anlatmışız ama ETE hocam yine sade ve anlaşılır dilini kullanmış..Teşekkürler ETE hocam..Umarım arkadaşımız anlamıştır...İyi çalışmalar..

ibrsel

Alıntı Yap
işte burda bahsettiğimiz 2 ve 4 iki adet ascii ama saniye=2*10+4 aslında burdaki 2 ve 4 başka bir sayı değilmi aslında?gelen sayılar dec değil.oraya dikkatinizi çekmek isterim tekrar.

Eğer sayın DEC değil ise bunu DEC e çevirmelisin Protonda bu işi hazır yapan bir komut var.(VAL Komutu)
Eğer PBP ile yazıyor isen bunu küçük bir alt program ile kendinde yapabilirsin.
Okuduğun değer string değişkenimizde A olsun.

if A="0" then A=0
if A="1" then A=1

şeklinde komut dizilimi ile stringi DEC e çevir..