pcf8583'de shiftin ve shiftout kullanımı

Başlatan clusmy, 30 Nisan 2005, 13:29:03

clusmy

Pcf8583 entegresinden bilgi alırken ve bilgi yollarken  shiftin ve shiftout komutlarını kullanmak istiyorum.Fakat nasıl kullanacağımı bir türlü çıkaramadım.Eğer bilen varsa,lütfen yardım.....

pcf8583 ile ilgili 2 tane sorunum var.Birincisi günleri sayarken ayları karıştırıyor. 31 çeken aylarda ay 30 çekiyormuş gibi davranıyor,30 çeken aylarda ise 31 çekiyormuş gibi davranıyor. Ayrıca başa döndüğünde 01 değil 00'dan saymaya başlıyor(ayın ilk günü bir olur dimi???).İkinci sorum ise alarmı nasıl ayarlayabileceğim konusunda yol gösterirseniz çok sevinirim.Programı aşağıda veriyorum.Şimdiden çok teşekkürler....

define lcd_dreg portd 
define lcd_dbit 4 
define lcd_rsreg portd 
define lcd_rsbit 1 
define lcd_ereg portd 
define lcd_ebit 0 

sda var portb.0 
scl var portb.1 
control con %10100001 
sec var byte 
minu var byte 
hour var byte 
adress var byte 
data_ var byte 
day var byte 
mon var byte 
year var byte 
'----------------Saat Ayarla------------------ 
saat_ayarla: 

adress = $2 
data_ =$55'saniye 
gosub write_data 
adress = $3 
data_ = $59 'dakika 
gosub write_data 
adress = $4 
data_ = $23 'saat 
gosub write_data 
adress = $5 
data_ = $30'gün 
gosub write_data 
adress = $6 
data_ = $03 'weekdays month sanırım 
gosub write_data 
adress = $7 
data_ = $07 'month 
gosub write_data 
adress = $9 
data_ = $99 
gosub write_data 
adress = $0 
data_ = $0d 
gosub write_data 
adress = $0 
data_ = $0e 
gosub write_data 

alarm_ayarla: 
adress = $09 
data_ = $15 
gosub write_data 
adress = $80 
data_ = $0A 
gosub write_data 
adress = $80 
data_ = $0B 
gosub write_data 
adress = $80 
data_ = $0C 
gosub write_data 


start: 
adress = $2 
gosub read_data 
sec = data_ 
adress = $3 
gosub read_data 
minu = data_ 
adress = 4 
gosub read_data 
HOUR= (data_ & %00001111)+(((DATA_ & %00110000)>>4)*10) 
adress = 5 
gosub read_data 
day = (data_ & $0f)+(((DATA_ & $30)>>4)*10) 
year = ((DATA_ & $c0)>>6) 
adress = 6 
gosub read_data 
mon = ((data_ & $10)>> 4)*10 + (data_ & %00001111) 




lcdout $fe,$8f-15,"Zaman"," ",dec2 hour,":",hex2 minu,":",hex2 sec 
lcdout $fe,$c0,dec2 day,":",dec2 mon,":",dec2 year 
goto start 

write_data: 
gosub starti2c 
i2cwrite sda,scl,control,adress,[data_] 
pause 2 
gosub stopi2c 
return 

read_data: 
gosub starti2c 
i2cread sda,scl,control,adress,[data_] 
pause 2 
gosub stopi2c 
return 

StartI2C: 
HIGH SDA 
HIGH SCL 
LOW SDA 
LOW SCL 
RETURN 

StopI2C: 
LOW SDA 
HIGH SCL 
HIGH SDA 
RETURN

ete

Bu komutları kullanmak için Özel bir nedeninizmi var ?.
Çünki PCF8583 I2C komutu ile haberleşmektedir.
    I2CREAD SDA,SCL,%10100001,2,
    I2CREAD SDA,SCL,%10100001,3,[M]    
    I2CREAD SDA,SCL,%10100001,4,[H]
    I2CREAD SDA,SCL,%10100001,5,[D]
    I2CREAD SDA,SCL,%10100001,6,[mN]
    I2CREAD SDA,SCL,%10100001,5,[Y]
şeklinde kullanılır.

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

clusmy

yazdığım kodlar içi teşekkür ederim.Benim sana birkaç sorum daha olacak.Bu kodları kullanırken i2cstart ve i2cstop komutlarını kullanmak gerekiyormu.Gerekiyorsa nasıl kullanılacağı konusunda yardım edebilirsen sevinirim.Diğer sorumda bu entegreye belirli bir zamanı kaydetmek isterken hangi adresleri kullanacağız.Mesela dakika ile ilgili bilgi okurken $4 yazıyoruz ama dakikaya şu anki zamanı yazmak istersek hangi adresi kullanacağız.Şimdiden teşekkürler

ete

@clusmy,

PCF8583'ü adresleri olan bir eprom gibi düşün. Tabiiki sayıcı özelliği olan bir eprom. Bu epromda ;
-saniye 2 nolu adreste
- Dakika 3 nolu adreste
- Saat 4 nolu adreste
- Gün 5 nolu adreste
- Ay 6 nolu adreste
- Yıl , 8 bitlik gün bilgisinin 6. ve 7. bitlerinde tutulmakta
- Haftanın günü ise yine 8 bitlik ay bilgisinin 5-6- ve 7. bitlerinde tutulmaktadır.
Yıl bilgisi 2 bit ile ifade edildiğinden 0-3 arası rakamlar bilgi olarak tutulabilmektedir. Sen bunu ayrı bir değişkenle toplayarak gerçek yılı bulmalısın. Örneğin YILEKLE=2005 olsun ve sen PCF8583'e yıl bilgisi olarak 0 yaz. Oradan okunanı YILEKLE ile topla gerçek yılı bul. Otomatikman 2006 da senin Yıl bilgin 1 olacak ve 2005+1=2006 olacaktır.
2009 yılına geçilirken sen YILEKLE değerini 2009 yapacak ve YIL bilgisinide tekrar 0 olarak vereceksin.

Gelelim Günün tarihi ve saati nasıl yazılacak.  Bu alet bir eeprom olduğuna göre Aynı adreslere önce mevcut değerleri
I2CWRITE SDA,SCK,160,2,[SN,DAK,SAAT,%xx(YIL)xxxxxx(GUN),%xxx(Haft-Günü)xxxxx(AY)]  komutu ile yazacaksın.
Bu komutu verdiğin andan itibaren 8583 saniyesi çalışmaya başlayıp saati düzgün bir şekilde devam ettirecektir.

Gelelim okuma işine
Tek bir komutla tamamını okuyabilirsin. Şöyle;
I2CRead SDA,SCK,%10100001,2,[SN,DAK,SAAT,GUN,AY]
YIL=GUN>>6 + YILEKLE
HAFTANIN GUNU=AY >>5

Buraya kadar bütün zaman bilgilerini almış oldun. Ayrıca I2C start - Stop şeklinde bir şey kullanman gerekmiyor. Kullanırsan okuma yapamazssın.

Aynı konu için iki ayrı başlık açmışsın. Aynı yerden devam edebilirdi.
Bu cevap diğer sorundada cevap oluyor. Sonuçları diğer arkadaşlarınında bir şeyler öğrenebilmesi için devamlı yayınlamalısın. Bunlar önemli.!

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

clusmy

teşekkür ederim cevabın için.Sonunda entegreyi çalıştırmayı başardım ama 2 tane sorunum kaldı.Birincisi günleri sayarken 31 çeken ayları saymıyor,30'dan sonra direk olarak başa dönüyor hemde başa döndüğünde 01 değil 00'dan saymaya başlıyor(ayın ilk günü bir olur dimi???).İkinci sorum ise alarmı nasıl ayarlayabileceğim konusunda yol gösterirseniz çok sevinirim.Şimdiden teşekkürler....

ete

@clusmy,

Şimdiye kadar verdiğim bilgileri datasheet'den okuyarak sana vermiştim. Bu entegreyi ben henüz çalıştırmadım. Ancak nasıl çalışacağına dair önceden bir iki karalamam olmuş idi. Dediğin sorunların neden ortaya çıktığını anlamadım. Bunun bir yolu mutlaka olmalı. Bu aşamadan sonra biraz tecrübelere bakmamız gerekecek.
Aksi gibi bir seyehate çıkıyorum bugün ve 1 hafta yerimde olmayacağım. Sorununu ancak gelince inceleyebilirim. Şimdilik idare et sonra bir çaresine bakarız. Belkide data sheet de bir açıklama vardır. Yinede inceleyeceğim.

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

ete

@clusmy,

Konuyu tekrar inceledim. PCF 8583 şayet tarih doğru ise kendinden beklenilen gibi çalışıyor. En azından çalışması gerekiyor. Nasıl deresen. 30 çekmesi gereken ayları tarihlerinden biliyor. Yani ay numarasına göre o ayın 31 mi 28 mi 30 mu çekeceğini bilerek sayma işlemini ona göre yapıyor. Bu nedenle deneme yaparken tarihi tam girmeye çalış. Doğru çalıştığını göreceksin. Zaten data sheet ine bakarsan orada açıkça hangi aylarda kaç sayılacağı hangi sayıdak gangi değere atlanacağı ay-yıl olarak belirtilmiş.
Tekrar doğru tarihler vererek denemeni öneririm.

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

sezgin05

@ ETE
Ustam ben PCF uygulamasında şöyle bir sorunla karşılaştım.Okuma sorunum yok ama değerleri değiştirip tekrar PCF ya yazdırmak istediğimde saçmalıyor.Sebebi ise eeprom belleğinden okuduktan sonra ayrıştırma yapıyoruz.Yazarken de bu işlemin tersini yapmamız gerekiyor galiba aksi halde 10 değeri yerine A yazıyor.HEX>DEC değerlerinden dolayı olsa gerek.Yardımlarınıza teşekkürler ...

ete

@Sezgin,

Bu RTC lerin hepsinde olan bir bayt lık bilginin birden fazla amaçla kullanılması amacı ile geliştirilmiş paylaşım sistemidir. Dediğin gibi ayrıştırdığın şekilde yazarkende birleştirmen veya en azından değişecek kısmı belirleyip BYTE içine düzgün yerleştirmen gerekir. İstersen hatalı yeri bana gönder bir bakayım.

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

sezgin05

Ustalarım RTC geri kalıyorsa sorun nerededir?
RTC uygulamasını geliştirmek için bir adet PCF8583+16f84 lü bir led display saat devresi yaptım.Yukarıdaki kodları geliştirerek yaptım.Okuma sorun yok ama nedense saat-dakika 1 günde yaklaşık 40 dk.geri kalıyor. Xtalli değiştirdim ama PCF elimde tek olduğu için deneyemedim.Besleme ve kristalin şaselenmesi tamam...

Erol YILMAZ

Sase problemi vs olsa ileri gider. Parazit karışır diyelim.
Seninki 40 dk geri kalıyor.
Açıkçası o kristal 32768 Hz mi diye sorasım geliyor.

Şunun frekansını frekansmetreyle ölçermisin?

en fazla 32767 ve 32769   olmasına izin var :D

sezgin05

Kristal değeri doğru.Hatta eski anakrtlardan söktüğüm 32.768Hz leride denedim sonuç aynı.Aklıma PCF arızalı diye takılıyor..

demirkan1

Merhaba,
pcf nin 1 ila 8 pinleri arasında 22pf kullanmıyorsanız buna benzer sorunlar ile karşılaşabilirsiniz
kolaygelsin

sezgin05

Bingo!...1-8 arasına 18Pf.takmıştım ama arızalıymış.Şu anda senkron çalışıyor.Ama SET ile ilgili bir çelişki var.Yazdığım kod Simülasyonda normal gibi.Ama prototip devremde şöyle bir hata veriyor.Saati yada Dakikayı arttırdığım butona basınca sadece 1 ler basamağını maximum 9 a kadar arttırıyor.Ama otomatik olarak kendisi 9 dan 10 a geçiyor.Devre aşağıdaki linkte.
http://www.hemenpaylas.com/download/207835/RTC.rar.html

uludere72

slm ..

bende pfc ile bir test yapmaya caşlisitm ancak saat cok geri kalıyor ?
bir de saniye 99 a kadar sayıyor ?
1 dakikayı 2 dakıda geciyor ? acaba sebebi ne olabalir ..