DS1307 zaman ayar sorunu

Başlatan Maxim, 27 Mayıs 2011, 09:32:25

Maxim

daha önce hiç kullanmadım, şimdi ds1307 ile saat yapıyorum ve saati ayarlarken bu özelliği kullanmam lazım

yani lcd ekranda 14:25 yazacak mesela, önce 1 yanıp sönecek, değeri değiştirince, 4 yanıp sönecek, sonra 2 sonra 5

komutuda belli
'$FE, $0C cursor off
'$FE, $0F cursor on

*daha doğrusu sayının altında çizgi çıkıyor olması lazım, blink olmuyor galiba .

bunu nasıl yaparım bilen varmıdır ?

Tagli

Ekrandaki karakter yanıp sönmüyor. Ama sanırım siyah bir karenin (aslında 5x7 dikdörtgen) karakter üzerinde yanıp sönmesini sağlamak mümkündü. Yani iki çeşit cursor seçeneği var: Birincisi sürekli yanık kalan alttaki çizgi, diğeri de yanıp sönen dikdörtgen. İstenirse cursor tümüyle de kapatılabiliyor.

Proton bilmiyorum, ama yanıp sönen kare için gönderilmesi gereken komut "0F" olmalı sanırım. "0E" ise yanıp sönmeyen cursor'ü açıyor olmalı. Yanılıyor olabilirim. En iyisi denemek. Gönderilmesi gereken komut binary olarak 000011CB formatında. C:Cursor, B:Blink. Ama kombinasyonlarının nasıl sonuç verdiğini hatırlamıyorum.
Gökçe Tağlıoğlu

Maxim

hırrrrr tırlattım

vazgeçtim blink olayından (olmadı diye değil aklıma başka fikir geldi)

zaman ayrı sırasında saati - dakikayı komple değiştirerek ayarlamak istedim
DS1307 RTC kullanıyorum

mesela saat 13, bunu 18 yapıcam

işte burada bcd ve decimal çevrimi beni deli etti
rtc ye saati $18 olarak göndermem lazım

saat bilgisi 13 ve ben onu arttırarak 18 yapıyorum, sonra bcd ye çeviriiyorum sonra ds1307 ye yazdırıyorum .... burada işler karışıyor

biraz daha uğraşayım en iyisi.

başlığıda değişiyorum o zaman
lcd cursor blink --> DS1307 zaman ayar sorunu oldu

subram

hazır konu açılmışken sorayım hep aklımdaydı; bu RTC entegrelerinde Yaz saati uygulaması için ne yapmak gerekiyor-bişey yapılabilir mi yada? yada zaten yaz saati uygulaması kendi içinde mevcut mu?
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

POWER

yaz saaiti uygulaması kendi içinde mevcut.yaz saati uygulamasına geçilecek tarih ve saatleri  belli olduğu için iki satır komutla halledilir.
TB6BKG

subram

yaz saati uygulamasını nasıl aktif ederiz peki. yani hangi kodu göndermek gerekiyor bunun için.
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

ete

Maxim,

Ekranda değer değiştirmenin iki hatta 3 yolu var. Bunlar sırası ile;
1. Bir değişkene atadığın değerini  tuşa bastıkça artırmak ve bunu ekrana yazdırmak. Bu yöntemde herhangi bir görsel efekt olmaz. Buna örnek vermeyeceğim.

2. Ekranda değiştireceğin karekterin altına çizgi kursorü koyarsın 100-120 ms bekler sonra kursorü kaldırırsın. Bir yandanda tuşa bağlı değer artırmayı yaparsın. Bu şekilde yalnızca kursör yanıp söner ama aynı zmaanda değerde değişir. Bu yöntemin avantajı nerede yada hangi hanede çalıştığını kursörden izeleye bilirsin. Bu işlemin adımları şöyledir;
- Önce kursorün yerleşeceği adresi LCD ye vermen gerekiyor. Diyelimki ilk sırada 6. cı karakter altına koyacağız. LCDOUT $fe,$85. Bu komut kursörü 6.cı karektere getirir.
- Sonra kursörü açacağız ve yaklaşık 120 ms gecikme vereceğiz.   LCDOUT $FE,$0E:pause 120
- Sonra kursorü kapatacağız ve yine bir gecikme vereceğiz.  LCDOUT $FE,$0C:Pause 120
- Daha sonra tuş taraması yapıp artır yada eksilt tuşların abasılmış mı kontrol edeceğiz.
- Sonra yeni değeri ekrana yazdıracağız,   LCDOUT #DEGER

3. Ekranda değerini değiştirdiğin karekteri bir ekrana koyar bir silersin. Böylece karekterin kendisi flash yapar ve bu arada da değer değiştirme işini yaparsın. Bu işlemin adımlarıda şöyledir.;
- Önce değeri değiştirilecek değişkenin mevcut değerini ekranda yerine koyarız ve 120 ms gecikme koyarız.  LCDOUT $fe,$85,dec3 SAYI:pause 120
- Sonra aynı karekteri yerinden siler ve yine 120 ms gecikme koyarız. LCDOUT $fe,$85,"   ":pause 120
- Sonra tuş taramasına bakarız.  (Sayı=sayı+1 veya Sayı=Sayı-1 durumu varmı?)
- Sonra başa döner yenilenen değeri tekrar flash şeklinde ekrana veririz.
DS1307 de zaman bilgileri farklı bir formatta tutuluyor. Bu nedenle gerekli çevirimleri yapmanız gerekiyor.
SN değerini esas alırsak. İlk 4 bit (0-3) saniye değerinin birler basamağını veriyor. Sonraki 3 bit ise (4-5-6) saniye değerinin onlar basamağını veriyor. Saniye değerimiz diyelimki 45 olsun. Bu değer DS1307 nin hafızasında şöyle yer almaktadır.
5 değeri = %0101  (4+1=5)
4 değeri = %100 şeklinde
İkisi birlikte; %=01000101  şeklinde yer alacaktır.
Şimdi diyelimki DS1307 den SN değeri olarak  %01000101 değerini okuduk. Bunun sayı karşılığı normalde 69 dur. Ama bunu program içinde SN değeri olarak kullanmak istersek;
Onlar=(SECOND & %01110000)>>4
Birler =(SECOND & %00001111)
SN=Onlar*10+Birler şeklinde çevirmemiz gerekir.
Bunu tek satırlık komutla yapmak istersen  SN =((SECOND>>4) & $0F)*10+(SECOND & $0F)  şeklinde bir komut kullanman gerekir.

Saati ayarlarken değeri değişmiş zaman birimlerininde benzer mantıkla DS1307 formatına çevirerek RTC ye yazmak gerekir.
Bunuda tek satırda şöyle hallederiz;   SECOND =(SN DIG 1)<<4+SN DIG 0 açıklaması ise onlar hanesini alıp 4 bit sola kayıdırır ve buna birler hanesini ekleriz. Böylece SN değeri RTC ye yazılacak formata gelmiş olur.

KOlay Gelsin
Ete



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

Maxim

ete hocam ilgine teşekkürler

şöyle yaptım ben
yanıp sönen cursordan vazgeçtim
2x16 lcd ekrana sol tarafta değişen bilgisi yazdım, aynen böyle

    ZAMAN AYARI
Saat?       13:25

dakikaya geçince

     ZAMAN AYARI
Dakika?     13:25

değer değiştikçe ekrandaki zaman değerleride artıyor haliyle.


koduda şöyle uyguladım
klasik I2c okuma ve yazma rutinlerimiz var. (forumda OG hocanın verdiği bir kodu kullandım)
butona basınca değeri önce decimale çevriyorum sonra 1 arttırıyorum, sonra tekrar binary yapıp rtc ye yazıyorum, ardından okuyorum

örnek "SAAT" değeri 13 olsun:

'BCD_to_Decimal:
saat_ = SAAT /16 *10
saat_ = SAAT // 16 + saat_

Inc saat_ 

If saat_ >23 Or saat_ <1 Then saat_=1

'Decimal_to_BCD:
SAAT = saat_ / 10 * 16
SAAT = saat_ // 10 | SAAT

rct ye yaz
rtc den oku ve başa dön

Aynı şey dakika içinde yapılıyor,
saniye ve tarih ayarı yapmıyorum, bana sadece saat lazımdı.


not: @subram, datasheete baktım, yaz saati uygulaması veya kodu ile ilgili bir bilgi göremedim.

Maxim

benim bir sorum daha var

bu ds1307 de okumalar veya yazmalar arasında ne kadar bekleme yapmak lazım ?

yazmada 200ms
okumada ise 100ms bekleme yapıyorum

az`mı acaba
bazen takılmalar yaşıyorum acaba ondan olabilirmi (proteus)

Tagli

Datasheet'te herhangi bir beklemeden bahsedilmemiş. Sadece karşıdan ACK gelmesini beklemek gerekiyor sanırım. Ve de I2C clock hızı azami 100 kHz olabiliyor.
Gökçe Tağlıoğlu

Maxim

evet ıc2 bus 100khz olarak ayarlı @tagli

protonda böyle bir tanımlama var
Declare I2C_Slow_Bus On