arkadas lar herkeze selam ben üniversite öğrencisiyim ben köyümün camisine vakitleri gösteren pano yapmak istiyorum bu konula ilgi yardımcı olabilirmisiniz. netten arastırma yapıyorum devre şemasını bulamıyorum. yardımlarınızı bekliyorum cok teşşekkür ederim şimdiden
vakit derken ,saat dimi ?
Bu saatler elle mi girilecek? Aslında internetten alabilse güzel olurdu ama nasıl yapılır hiç bir fikrim yok.
:idea: Gerçi internetten almaya gerek yok. Bu değerler her yıl aynı günlerde aynı oluyor sanırım. Bir tablo ile her gün olması gereken vakit saatleri belirlenip gösterilebilir.
Kardes bu urun hazır olarak satılıyor ,calısma mantıgı bildigim kadarıyla il plaka kodu girilerek yapılıyor, siz sadece saati ayarlıyorsunuz o bulundugunuz bolgeye gore vakitleri hesaplayıp ilgili displaylere atıyor sabah su ,oglen su vs gibi kolay gelsin
Bu konu daha önce tartışıldı ama elle tutulur bir şeyler çıkmadı.
http://picproje.org/index.php/topic,11050&highlight=ezan+vakti+hesablama
elektroniğe güven olmaz kardeşim; siz en iyisi bir adet "saatli maarif takvimi" alın, sonra bunun ilgili sayfasını (o güne ait) projeksiyon cihazıyla duvara yansıtın. olmaz mı?
Alıntı yapılan: "timpati"elektroniğe güven olmaz kardeşim; .....
bahsettiğiniz o saatli maarifi elektronik ile hesaplayıp basıyolar
aradığın şeyin ismi tam olarak vakitmatik diye geçiyor...piyasadaki ismi bu şekilde...aradığın şey veya aynısını yapmaya çalıştığın şey ise aşağıdaki gibi birşey...
http://img440.imageshack.us/my.php?image=7704buyuknx5.jpg
bizim buralarda çok nadir karşılaştığım eski mühendis abilerimden biri bir aralar bu işe el atmayı düşünüyordu akibeti ne oldu bilmiyorum ama iç yapısını incelemiş biri olduğundan bana da biraz bahsetmişti içinde bir adet 16f84 register + display sürücüler varmışş...onun yalancısıyım....tabi içindeki micro işlemci modelden modele değişir ama mantık bana kalırsa aynıdır....benimde tek merak ettiğim şey hesap kitap işini nasıl yapıyorlar...oda büyük ihtimal bu yeryüzünde var olduğu kabul edile enlem boylamlar arasındaki zaman farkından yola çıkılarak yapılmıştır gibime geliyor.....
bunun yerine çin malı ezan okuyan saatler var o tarz bişeylerden alıp çıkışları değerlendirebilirsen daha pratik olur bence....kolay gelsin
arkadslar yorumlarınız için cok teşşekkür ederim dediğiniz clışmalara bakıcam ama ben ticaret olarak değill sadece köyümün kendi camime yapıcam ben bu vakit nazmazlarını göstern panonun devre semesını arastırıyorum arkadslar tekra şimdiden tesekkür ederim
Camide yoksa, 1 takvim al koy 3-4 YTL.
aksi halde sana çok pahalıya malolacak ve yapamayacaksın. cebinden 200-500YTL harcarsın. elinde bir yığın çöp kalacak.
bir de cemaat seni makaraya sarabilir. hala yapamadın mı derler. illa elektronik birşey yapmak gerekliyse, kanarya zili, yanıp sönen led, picli yürüyen ışık yapabilirsin. bu devre yeni başlayan biri için uygun değil. yeni başladığınızı bilmiyorum tahmin ediyorum.
devre şamasını bulsanız ne olacak? hex kodunu da bulacak mısınız?
köyün muhtarına da bir bilgisayar yapmak istiyorum. şeması varmıydı acaba ?
tamam arkadaslar tesekkürler yardım istemeseydim keşke sizden diğer arkadslarıma lafım yok benim laf kime gitti o biliyo
sen başkalarının lafına aldırma. Ben de kayanyazı yapmaya karar verdiğimde ne pic biliyordum, ne elektronik, baskı devre çizim programlarının kullanmasınıda bilmiyorum, baskı devre çıkartmasını da. Yaklaşık 1 sene sonra pc den gönderdiğim yazılar kayan yazıda akmaya başladı. İstediğim özellikte birdevreyi yapmıştım. Tabiki devre yapmanın bir masrafı oluyor. ilk seferinde başarılı sonuc almayınca merak etme o çöp olmaz, senin için iyi bir tecrübe olur. vaktim var, sabırlıyım dersen msn listene beni ekle. beraber yavaş yavaş bir devre yaparız.
Alıntı yapılan: "files"Camide yoksa, 1 takvim al koy 3-4 YTL.
köyün muhtarına da bir bilgisayar yapmak istiyorum. şeması varmıydı acaba ?
ipin ucunu biraz fazla kaçırmışsın bence
Bencede oyle ,arkadasımızı bu işlerden sogutmanın bir anlamı yok hepimiz bu işlere boyle başlamadıkmı
söylendiği gibi, konu daha önce enine-boyuna tartışılmış bu sitede. @nova'nın internette şema aradığını hesaba katarsak, şöyle bir orta yol bulabiliriz. aşağıdaki resimde görülene (daha önceki tartışmada verilmiş) benzer bir pano yapılır ve değerler günlük olarak girilir. bunun için öyle karmaşık bir devre yapısına gerek yok, sadece göstergeler olacak ve hergün veriler tazelenecek (güvenilir kaynaklardan). arkadaşın bilgisi ve/veya sitenin bu konudaki çalışmaları ilerleyince de daha profesyonel (otomatik ve doğru) bir cihaza dönüştürülür.
(http://i80.photobucket.com/albums/j165/timpati/grnt13hm8.jpg)
(http://img523.imageshack.us/img523/9038/vaktiq3.th.gif) (http://img523.imageshack.us/my.php?image=vaktiq3.gif)(http://img523.imageshack.us/images/thpix.gif) (http://g.imageshack.us/thpix.php)
Arkadaşlar;
Daha önce bende vakitmatik konusunda bir şeyler yapmıştım basitte olsa.timpati arkadaşımız verilerin günlük girileceğinden bahsetmiş.Ben bunu biraz daha ileriye götürerek maxsimum 6ay,8 günlük 5 vakit ezan vakitlerinine ait veriyi 877 nin hafızası alıyor.Sonuç olarak 6ay,8 günlük veri bir seferde 877 ye yüklenirse bahsi geçen zaman içerisinde ezan vakitleri ekranda görüntülenmiş oluyor.Aslında ikinci bir 877 kullanarak 1 yıllık veri saklanabilir.Fakat pratik bir yöntem değil bence. 5 yıllık veriyi sığdırdığımızı düşünsek bile 5 yıl sonra ne olacak bilgileri kim güncelliyecek.İşte takıldığımız ve çözüm bulunamıyan konu burası.Harici eprom kullanılarak daha fazla bilgide saklanabilir ama bunun bir formülü olması gerek ama nedir bilmiyorum.Ben bu devrenin gerçek anlamda uygulamadım.Çünkü belli bir maliyeti var.6 ay için yapılır bulmadım fakat yapacak arkadaşlara yada bu iş üzerinde çalışacak arkadaşlara yardımcı olur düşüncesiyle buraya koydum.Proğramın açık kodları ve isis dosyalarıda var.Yazdığım proğram daha kısa da yazılabilir.Bu işte çok iyi arkadaşlarımızda var hepimizin bildiği gibi.Neyse uğraşacak arkadaşlara yardımcı olabilmek dileğiyle.
http://www.dosya.tc/VAK_TMAT_K.rar.html
nette bunun onlarca örneği var, birileri yapıp satıyor. 6 ay gibi uzun bir araştırma döneminde vereceğiniz emek ve zamanın maliyetini hesaplarsanız satın almanın daha ekonomik olduğu ortaya çıkar. nedir sorun, gurur meselesi mi? ticari bir ürün ortaya çıkarmak istediğinizi sanmıyorum çünkü benzerleriyle rekabet edemezsiniz. ayrıca beni, yazmanın gerdiği ikinci bir konu ise "ne gerek var?" sorusu. çünkü bu hassas bir konu ve nasıl derler: "vebali büyük".
yanlış iş yapmamak gerek. sonra köy yerindeki insanlar bunu görecek de ne olacak? zaten kendi işlerinden bunalmış insanlar dini konuları imama havale etmişken bu tabelayı görüp, imamı bir kenara mı atacak? diyelim, hata oldu, bu durumda imam zan altına girmez mi? elektroniğe güven olmaz dememin nedeni bu. beslemede sorun olur, datalar karışır, bir şekilde hatalı bir durum mutlaka ortaya çıkacaktır ve bunun sorumluluğunu imama yüklerler sana değil.
Sorunsuz çalışan böyle sistemin kodları, şeması ortada dolaşmaz bu bir gerçek.
@files, peki buna ne dersin?
http://www.elektrotekno.com/about38387.html&highlight=vakitmatik
6 aylık demiş. geliştirilebilir. Yukarıda arkadaşın verdiği proje ile aynı
Arkadaşlar power ile power19 ayni kişi zaten
hazır almak isteyenler için bir örnek:
(http://www.grupelektronik.com/images/urunler/csaatisbuyuk.JPG)
(http://www.grupelektronik.com/images/urunler/membran.JPG)
@POWER , paylaştığın .rar dosyası bulunamadı uyarısı veriyor, tekrar paylaşabilir misin ?
dosyayı tekrar yükledim arkadaşlar.877 ye 6 aylık veri sığıyor.fakat 18f452 ye 1 yıllık ezan vakitleri sığıyormuş bilginiz olsun.
http://www.dosya.tc/server7/wntnxc/VAKITMATIK.rar.html (http://www.dosya.tc/server7/wntnxc/VAKITMATIK.rar.html)
sabit veri yukleyerek bu is olmaz o isin hesabi var su an hesabin adi aklma gelmiyor.bulundugun yerin kordinatlarini girip hesaplama yapman gerekir.ama bu konuda en buyuk sikinti iyi bir rtc.zaninda boyle bir calismam olmustu eger bulursam kodu verebilirim.
evet sabit veri yükleyerek olmaz tabiki ama o zaman bu kadarını yapabilmiştim.bunun hesabını yapıpda paylaşan çıkmadı henüz.inşallah sizden bekliyoruz.
bakiyim hocam hayli uzun sure once once yapmistim.eskileri bir karistirmam gerekiyor.bulursam atarim.hesaplamanin adini hatirladim julian tarihi
Ben işin astronomik verilere dayanan matematiksel formullerini oluşturdum gibi fakat, bazı aylarda sapmalar var sanırım bir kaç ayar daha yapmam gerekecek, biter bitmez paylaşacağım.
@POWER hocam, devreniz için teşekkür ederim, sizin 6 aylık veriyi aktardığınız yazılım mevcut mu ? 74hc595 ve real time clock ayarlamaları vs. yazılımınızdan kullanabilirsem, vakit hesaplama kısmına daha çok odaklanıp tamamlayabilirim diye düşünüyorum. Böylece hem işlemciye yük bindirmeden sadece ezan hesaplama formullerine dayalı fonksiyon ile güzel bir proje tamamlayabiliriz. Bu yazılım kısmını da paylaşabilir misiniz .
Julian day enlem boylam vs. kullanarak güneşin doğuşu öğle güneşin batışı hesapladım. Şuan sıkıntı olan YATSI ile İKİNDİ ve bazı aylarda sapmalar yaşıyorum, ama 2 senelik uğraş sonucunda astronomiyi çözdüm neredeyse, bahsettiğim sorunları yakında çözünce sizlerle paylaşağım.
Arkadaşlar bu iş için astrolojik olarak hesaplamak yetmiyor. Diyanet'in vermiş olduğu zamanlar yıl içersinde ( 0 ile 8 dk arasında) zamanlamalar değişiyor.
bu nedenle benim önerim şudur;
şubat ayı 29 çeken yıl takviminde bulunacak olan vakitleri kayıt edersiniz (eeprom içine) bu yılın takvimi uygundur.şubat 29 çekiyor.
kayıt işlemi bittikten sonra ikinci bir kayıt işlemimiz daha olacak, bu kayıt ise örnek verelim ana verilerimiz Ankara ili merkezine göre yazılmış olsun.
Erzurum ili için sadece Ankara ile Erzurum arasındaki zaman farkı kayıt edilecek ve tarihe göre Ankara kayıtı üzerinde diğer il zaman farkını ilave ederek ilgili il zamanını da bulmuş oluruz diye düşünüyorum.
Ayrıca konu iki ayrı sayfada takip ediliyor sanırım konuyu birleştirmek mi gerekir.. Acaba..
@Voltajcı6 aylık veriyi aktarmak için proğram yok.bu verileri el ile tek tek yazmıştım.zaten ordaki saatler gerçekten ezan vakitlerini göstermiyor.bir kaç gün için takvimdem el ile girdim daha sonra bunları diğer günlere copy-paste yaptım.diğer başlıkla bu başlık bencede birleştirilmeli.kolay gelsin
Alıntı yapılan: POWER - 26 Mart 2016, 14:14:29
@Voltajcı
6 aylık veriyi aktarmak için proğram yok.bu verileri el ile tek tek yazmıştım.zaten ordaki saatler gerçekten ezan vakitlerini göstermiyor.bir kaç gün için takvimdem el ile girdim daha sonra bunları diğer günlere copy-paste yaptım.diğer başlıkla bu başlık bencede birleştirilmeli.kolay gelsin
@POWER Aslında demek istediğim, upload ettiğiniz dosyanın içerisinde bulunan proteus çalışmasına ait hex dosyası var fakat yazılımı bulamadım ? O yazılımı açıp içerisine kendi yazdığım astronomik hesaplamalar içeren matematiksel formulleri ekleyeceğim, bölyece 6 aylık veri ile kısıtlı kalmayacağız.
edit : Hocam picbasic ile mi yazdınız ? Assembly ile mi ?
Bu vakitler nasıl hesaplanır bilgim yok açıkçası. Ancak benim bir önerim olabilir.
Eğer size gün doğumu ve gün batımı saatlerini hesaplamak yetiyorsa (yani bu saatlere dayanarak diğer saatler hesaplanabiliyorsa) bunu aşağıya yazacağım parametreleri girip hesaplatabileceğiniz bir yöntem var.
Enlem,
Boylam,
Gün,
Ay,
Yıl,
Saat,
Dakika,
Saniye.
Belki son üç parametre sizin için gerekmiyordur ancak benim bahsettiğim yöntem bu 8 parametre ile o anki Zenit ve Azimut açılarını, Gün Doğumu anını, Gün Batımı anını ve güneşlenme süresini hesaplayabiliyor. İşin güzel tarafı ise yukarıdaki bilginin tamamını tek bir sensörden (GPS) alabiliyorsunuz. Geriye bu veriyi işlemek kalıyor.
Bu yöntemi kullanarak bahsettiğim değerleri hesaplayan matlab kodunu yazmıştım ancak bu bir projede kullanılacak ve paylaşmam mümkün değil. Eğer anlattıklarım işinizi görüyorsa kaynak önerebilirim.
İyi çalışmalar, teşekkürler.
Alıntı yapılan: Cemre. - 26 Mart 2016, 14:44:52
Bu vakitler nasıl hesaplanır bilgim yok açıkçası. Ancak benim bir önerim olabilir.
Eğer size gün doğumu ve gün batımı saatlerini hesaplamak yetiyorsa (yani bu saatlere dayanarak diğer saatler hesaplanabiliyorsa) bunu aşağıya yazacağım parametreleri girip hesaplatabileceğiniz bir yöntem var.
Enlem,
Boylam,
Gün,
Ay,
Yıl,
Saat,
Dakika,
Saniye.
Belki son üç parametre sizin için gerekmiyordur ancak benim bahsettiğim yöntem bu 8 parametre ile o anki Zenit ve Azimut açılarını, Gün Doğumu anını, Gün Batımı anını ve güneşlenme süresini hesaplayabiliyor. İşin güzel tarafı ise yukarıdaki bilginin tamamını tek bir sensörden (GPS) alabiliyorsunuz. Geriye bu veriyi işlemek kalıyor.
Bu yöntemi kullanarak bahsettiğim değerleri hesaplayan matlab kodunu yazmıştım ancak bu bir projede kullanılacak ve paylaşmam mümkün değil. Eğer anlattıklarım işinizi görüyorsa kaynak önerebilirim.
İyi çalışmalar, teşekkürler.
@POWER hocamın paylaştığı örnek Isis çalışmasının CCS C veya Micro C kodları olsa, proje bitti gibi aslında. Siz de kaynak önerebilirseniz var olan bilgilerle yeni bilgileri yoğururuz daha doğru verilere ulaşabiliriz belki. Şimdi iş ezan vakti olunca hata hatta hata payı bile olmamalı. Umarım, güzel bir çalışma ortaya çıkacaktır.
Teşekkürler
@Cemre.
@Voltajcıindirdiğin klasörün içinde pbp uzantılı dosya açık kodları içeren dosya.tekrar indir bence.ben denemek için şimdi tekrar indirdim istediğin dosya mevcut.
@POWER hocam dediğiniz .pbp uzantılı dosyayı açtım önceden hiç pic basic pro kullanmadığım için uzantısını da görememişim kusura bakmayınız, teşekkür ederim. Fakat, ben şimdi pic basic pro öğrenene kadar yine 2-3 ay geçecek, picproje.org da yıllardır tamamlanmaya çalışan vakitmatik projesi uzamaya devam edecek, eğer vaktiniz el verirse bir ekip çalışması ile bu işi tamamlasak, kodlarınızı varsa bilginiz MicroC veya CCS C ile yazar mısınız, elimde ki kodlarla birleştirerek delikli pertinaksta hazırda beklettiğim devrede denemeler yaparak ideal bir vakitmatik oluşturacağıma inanıyorum. Ayrıca sd kart modül kullanarak 5 vakite ait farklı makamlarda ki ezanları da her vakitte okutmak ek olarak ezan duası eklemeyi istiyorum bunlar bitince, 3 adet buton ile kişinin hem saat ayarlaması yapabilmesini hemde dışarıdan şehir plaka numarası girerek Türkiye'nin her yerinde kullanılmasını sağlayabilirim. En son yapılacak olan düşüncem de cihaza cisim algılama sensörü eklemek, böylece kişi vakitmatiğin önünden her geçtiğinde kısa bir hadis veya güzel bir kelam seslendirmek.
void lcd_init();
void send_cmd(unsigned char komut);
void send_char(unsigned char bilgi);
void busy();
#DEFINE E _RC7
#DEFINE RS _RC5
#DEFINE RW _RC6
#DEFINE LCD_DATA PORTB
#DEFINE LCD_DATA_TRIS TRISB
#DEFINE _MESGUL _RB7
#DEFINE DISP_ON 0x0C
#DEFINE DISP_ON_C 0x0E
#DEFINE DISP_ON_B 0x0F
#DEFINE DISP_OFF 0x08
#DEFINE CLR_DISP 0x01
#DEFINE ENTRY_INC 0x06
#DEFINE ENTRY_INC_S 0x07
#DEFINE ENTRY_DEC 0x04
#DEFINE ENTRY_DEC_S 0x05
#DEFINE DD_RAM_ADDR 0x80
#DEFINE DD_RAM_UL 0x80
//-----------------------------------------------------------------------------
void lcd_init(){
unsigned char a = 3;
LCD_DATA_TRIS = 0;
delay_ms(50);
while(a > 0){
LCD_DATA = 0X38;
E = 1;
delay_us(20);
E = 0;
delay_ms (5);
a--;
}
send_cmd(DISP_ON);
send_cmd(CLR_DISP);
send_cmd(DISP_OFF);
send_cmd(DISP_ON);
send_cmd(ENTRY_INC);
}
//
//-----------------------------------------------------------------------------
void send_cmd(unsigned char komut){
// LCD_DATA_TRIS = 0;
busy();
RW = 0;
LCD_DATA = komut;
E = 1;
delay_us(5);
E = 0;
delay_us(5);
}
//----------------------------------------------------------------------------
void send_char(unsigned char bilgi){
// LCD_DATA_TRIS = 0;
busy();
RS = 1;
RW = 0;
LCD_DATA = bilgi;
delay_us(1);
E = 1;
delay_us(1);
E = 0;
delay_us(1);
}
//-----------------------------------------------------------------------------
void busy()
{
RS=0;
delay_us(4);
RW=1;
delay_us(4);
E = 1;
LCD_DATA_TRIS = 0B11111111;
delay_us(5);
#asm
bak:
bsf RW
nop
nop
nop
nop
nop
nop
nop
nop
bsf E
nop
nop
nop
nop
nop
nop
nop
nop
bcf E
nop
nop
nop
nop
nop
nop
nop
nop
btfss _mesgul
goto bak
#endasm
LCD_DATA_TRIS = 0;
E = 0;
RW = 0;
}
/*
LCD_TRIS_PORT = 0xFF; // Set port to all input
LCD_RW = 1; // Tell LCD we want to read
delay_uS (1);
delay_uS (1);
retval = LCD_DATA_PORT;
LCD_E = 0;
LCD_TRIS_PORT = 0x00;
*/
bu is icin oncelikle iyi bir rtc secmeniz lazim.kordinatlar icin birde cps modul eklerseniz tadindan yenmez.uzun zaman once bir calismam olmustu eskileri karistirdim.sadece buşabildiklerimi paylasiyorum.kod ccs de yazilmistir burdaki namaz.c julian takvimine gore hesaplamalari yapiyor.4x20 lcd kullanarak yapmistim isteyen istedigi gibi.ister lcd,ister7 segment lcd kulanir.
mesaj birleştirme:: 27 Mart 2016, 09:19:26
#include <main.h>
#include <d18io.h>
#include "D:\NAMAZC\LCD.H"
#include "PCF8583.h"
#include "namaz.h"
#define satir1 0x80
#define satir2 0xC0
#define satir3 0x94
#define satir4 0xD4
///////////////////////////////////////////////////////////////////////////////
#define cikis 0xff
#define giris 0
///////////////////////////////////////////////////////////////////////////////
int8 tus_bilgi, ezan = 7;
int8 menu;
int8 alt_menu;
int8 i;
date_time_t dt;
int8 saatBuff, dakikaBuff, tarihGunBuff,tarihAyBuff, tarihYilBuff;
boolean menuSet=0;
boolean _flash = 0, _goster = 0;
int16 gecikme = 500,goster = 3000;
zaman alarmOn, alarmOff;
///////////////////////////////////////////////////////////////////////////////
boolean tus_izin = 0;
const char yaz[19][29] = {
{" DATE SET "},
{" TIME SET "},
{" ENLEM SET "},
{" BOYLAM SET "},
{" IMSAK SET "},
{" GUNES SET "},
{" OGLE SET "},
{" IKINDI SET "},
{" AKSAM SET "},
{" YATSI SET "},
{" GENEL SET "},
{" IMSAK TEMKIN SET "},
{" GUNES TEMKIN SET "},
{" OGLE TEMKIN SET "},
{" IKINDI TEMKIN SET "},
{" AKSAM TEMKIN SET "},
{" YATSI TEMKIN SET "},
{" YAZ SAATI SET "},
{" KONTRAST SET "},
};
///////////////////////////////////////////////////////////////////////////////
int8 m_ust[19][3] = {
{31,12,99}, //Tarih
{24,59,59}, //Saat
{99,99,'S'}, //Enlem 41,02
{99,99,'S'}, //boylam 28,97
{60,60,'S'}, //imsak role
{60,60,'S'}, //gunes role
{60,60,'S'}, //ogle role
{60,60,'S'}, //ikindi role
{60,60,'S'}, //aksam role
{60,60,'S'}, //yatsi role
{60,60,'S'}, //global role
{15,30,'S'}, //temkin imsak
{15,30,'S'}, //temkin gunes
{15,30,'S'}, //ogle
{15,'S','S'}, // ikindi 14
{15,30,'S'}, //temkin aksam
{15,30,'S'}, //yatsı
{1,'S','S'}, // yaz saati
{99,'S','S'}, //kontrast
};
signed int8 m_alt[19][3] = {
{0,0,0}, //Tarih
{0,0,0}, //Saat
{0,0,'S'}, //Enlem 41,02
{0,0,'S'}, //boylam 28,97
{0,0,'S'}, //imsak role
{0,0,'S'}, //gunes role
{0,0,'S'}, //ogle role
{0,0,'S'}, //ikindi role
{0,0,'S'}, //aksam role
{0,0,'S'}, //yatsi role
{0,0,'S'}, //global role
{-15,0,'S'}, //temkin imsak
{-15,0,'S'}, //temkin gunes
{-15,0,'S'}, //ogle
{-15,'S','S'}, // ikindi
{-15,0,'S'}, //temkin aksam
{-15,0,'S'}, //yatsı
{0,'S','S'}, // yaz saati
{0,'S','S'}, //kontrast
};
////////////////////////////////////////////////////////////////////////////////
signed int8 m_table[19][4] = {
{30,11,11,3}, //Tarih 0
{12,15,00,3}, //Saat 1
{25,23,'S',2}, //Enlem 41,02 2
{28,97,'S',2}, //boylam 28,97 3
{15,15,'S',2}, //imsak role 4
{15,15,'S',2}, //gunes role 5
{15,15,'S',2}, //ogle role 6
{15,15,'S',2}, //ikindi role 7
{15,15,'S',2}, //aksam role 8
{15,15,'S',2}, //yatsi role 9
{15,15,'S',2}, //global role 10
{0,'S','S',1}, //temkin imsak 11
{0,'S','S',1}, // gunes 12
{0,'S','S',1}, //temkin ogle 13
{0,'S','S',1}, // ikindi 14
{0,'S','S',1}, //temkin aksam 15
{0,'S','S',1}, //yatsı 16
{0,'S','S',1}, // yaz saati 17
{80,'S','S',1}, //kontrast 18
};
////////////////////////////////////////////////////////////////////////////////
void ee_reflesh() {
int8 a = 2;
disable_interrupts(GLOBAL);
while(a < 19){
set_pwm1_duty(30);
m_table[a][0] = read_eeprom(a*2);
m_table[a][1] = read_eeprom(a*2+1);
a++;
}
}
void ezanVaktiYaz(char ezan)
{
char aa[11];
zaman ezanSaati, onEzanRole, offEzanRole;
switch (ezan)
{
case 0 : aa = "IMSAK :";
ezanSaati = imsak;
onEzanRole = onImsak;
offEzanRole = offImsak;
break;
case 1 : aa = "GUNES :";
ezanSaati = gunes;
onEzanRole = onGunes;
offEzanRole = offGunes;
break;
case 2 : aa = "OGLE :";
ezanSaati = ogle;
onEzanRole = onOgle;
offEzanRole = offOgle;
break;
case 3 : aa = "IKINDI :";//10 karakter
ezanSaati = ikindi;
onEzanRole = onIkindi;
offEzanRole = offIkindi;
break;
case 4 : aa = "AKSAM :";
ezanSaati = aksam;
onEzanRole = onAksam;
offEzanRole = offAksam;
break;
case 5 : aa = "YATSI :";
ezanSaati = yatsi;
onEzanRole = onYatsi;
offEzanRole = offYatsi;
}
send_cmd(satir1);
printf(send_char,"%s %02i:%02i ", aa, ezanSaati.saat,ezanSaati.dakika);
send_cmd(satir2);
printf(send_char,"--------------------");
send_cmd(satir3);
printf(send_char,"ON TIME : %02i:%02i ",onEzanRole.saat,onEzanRole.dakika);
send_cmd(satir4);
printf(send_char,"OFF TIME : %02i:%02i ",offEzanRole.saat, offEzanRole.dakika);
}
boolean zamanKontrol(zaman zamanOff1, zaman zamanOff2)
{
boolean aralik = FALSE;
int16 anlikDakika = (int16)dt.hours * 60 + dt.minutes;
if (((int16)zamanOff1.saat * 60 + zamanOff1.dakika) < anlikDakika && anlikDakika < ((int16)zamanOff2.saat * 60 + zamanOff2.dakika)) aralik = TRUE;
return aralik;
}
////////////////////////////////////////////////////////////////////////////////
void ezanVaktiHesapla()
{
ee_reflesh();
set_pwm1_duty(0);
PCF8583_init();
PCF8583_read_datetime(&dt);
gun = dt.day;
ay = dt.month;
yil = dt.year + 2000;
userTemkin.imsak = m_table[11][0];
userTemkin.gunes = m_table[12][0];
userTemkin.ogle = m_table[13][0];
userTemkin.ikindi = m_table[14][0];
userTemkin.aksam = m_table[15][0];
userTemkin.yatsi = m_table[16][0];
enlem = 41.02;//((int16)m_table[2][0]*100 +m_table[2][1]) / 100.0;
boylam = 28.97;//((int16)m_table[3][0]*100 +m_table[3][1]) / 100.0;
yazSaati = m_table[17][0];
NamazVakti();
onImsak = setOnOff(imsak,-m_table[4][0]); //imsak on
offImsak = setOnOff(imsak,m_table[4][1]);//imsak off
onGunes = setOnOff(gunes,-m_table[5][0]); //Güneş on
offGunes = setOnOff(gunes,m_table[5][1]);//Güneş off
if (zamanKontrol(offImsak, offGunes)) ezan = 1;
onOgle = setOnOff(ogle,-m_table[6][0]); //Ogle on
offOgle = setOnOff(ogle,m_table[6][1]); //Ogle off
if (zamanKontrol(offGunes, offOgle)) ezan = 2;
onIkindi = setOnOff(ikindi,-m_table[7][0]); //ikindi on
offIkindi = setOnOff(ikindi,m_table[7][1]);//ikindi off
if (zamanKontrol(offOgle, offIkindi)) ezan = 3;
onAksam = setOnOff(aksam,-m_table[8][0]); //Aksam on
offAksam = setOnOff(aksam,m_table[8][1]); //Aksam off
if (zamanKontrol(offIkindi, offAksam)) ezan = 4;
onYatsi = setOnOff(yatsi,-m_table[9][0]); //yatsi on
offYatsi = setOnOff(yatsi,m_table[9][1]); //yatsi off
if (zamanKontrol(offAksam, offYatsi)) ezan = 5;
zaman gece;
gece.saat = 24; gece.dakika = 0;
if (zamanKontrol(offYatsi, gece)) ezan = 5;
}
void kontrolRTC()
{
boolean dursun = 0;
if (tarihGunBuff != m_table[0][0]) {dt.day = m_table[0][0]; dursun = 1;}
if (tarihAyBuff != m_table[0][1]) {dt.month = m_table[0][1]; dursun = 1;}
if (tarihYilBuff != m_table[0][2]) {dt.year = m_table[0][2]; dursun = 1;}
if (saatBuff != m_table[1][0]) {dt.hours = m_table[1][0]; dursun = 1;}
if (dakikaBuff != m_table[1][1]) {dt.minutes = m_table[1][1]; dursun = 1;}
dt.seconds = 0;
if (dursun) PCF8583_set_datetime(&dt);
}
///////////////////////////////////////////////////////////////////////////////
void ee_yaz() {
int8 a = 2;
disable_interrupts(GLOBAL);
set_pwm1_duty(30);
while(a < 19){
write_eeprom(a*2,m_table[a][0]);// m_table[a][0] = read_eeprom(a*2);
write_eeprom(a*2+1,m_table[a][1]); // m_table[a][1] = read_eeprom(a*2+1);
a++;
}
set_pwm1_duty(0);
enable_interrupts(GLOBAL);
}
///////////////////////////////////////////////////////////////////////////////
void tus_oku(){
delay_ms(5);
trisb = 0xff;
_RA0 = 0;
if(portb == 0xff){tus_izin = 1;};
if(tus_izin && portb != 0xff){tus_bilgi = portb; tus_izin = 0;}
_RA0 = 1;
trisb = 0;
}
void islem(){
tarihGunBuff = m_table[0][0] = dt.day;
tarihAyBuff = m_table[0][1] = dt.month;
tarihYilBuff = m_table[0][2] = dt.year;
saatBuff = m_table[1][0] = dt.hours;
dakikaBuff = m_table[1][1] = dt.minutes;
send_cmd(CLR_DISP);
while(menuSet){
tus_oku();
if(tus_bilgi == 223)
{
if(menu < 18){
ee_yaz();
if (menu == 0 || menu == 1) {kontrolRTC();}
menu++;
alt_menu = 0;
}
}//menu yukarı
if(tus_bilgi == 239){if(menu > 0){ee_yaz();if (menu == 0 || menu == 1) {kontrolRTC();} menu--; alt_menu = 0;}}// menu asagı
if(tus_bilgi == 251){if(alt_menu < m_table[menu][3]){ alt_menu ++; if(alt_menu == m_table[menu][3]){alt_menu = 0;} }}//altmenu artır azalt
if(tus_bilgi == 191){if(m_table[menu][alt_menu] < m_ust[menu][alt_menu]){ m_table[menu][alt_menu] ++; }}//degısken artır
if(tus_bilgi == 127){if(m_table[menu][alt_menu] > m_alt[menu][alt_menu]){ m_table[menu][alt_menu]--; }}//degısken azalt
send_cmd(0X80); for(i=0; yaz[menu][i] != '\0';i++) send_char(yaz[menu][i]);
send_cmd(0XC0); printf(send_char,"--------------------");
if (menu >= 4 && menu <= 10)
{
send_cmd(0X94);
if(m_table[menu][3]==2 ) printf(send_char," ON:-%02i OFF:%02i", m_table[menu][0], m_table[menu][1]);
send_cmd(0XD4);
if(_flash){
if(alt_menu == 0){ printf(send_char," -- ");}
if(alt_menu == 1){ printf(send_char," -- ");}
}
else{printf(send_char," ");}
}
else
{
send_cmd(0X94 );
if(m_table[menu][3]==3 ) printf(send_char," %02i.%02i.%02i", m_table[menu][0], m_table[menu][1],m_table[menu][2]);
if(m_table[menu][3]==2 ) {printf(send_char," %02i.%02i ", m_table[menu][0], m_table[menu][1]);}
if(m_table[menu][3]==1 ){
if (menu >= 11 && menu <= 16){
if(m_table[menu][0] < 0){
printf(send_char," %i ", m_table[menu][0]);
}else{ printf(send_char," %02i ", m_table[menu][0]);
}
} else{ printf(send_char," %02i ", m_table[menu][0]);}}
send_cmd(0XD4 +2 );
if(_flash == true){
if(alt_menu == 0){
if(menu > 10 )printf(send_char," -- ");
else printf(send_char," -- ");
}
if(alt_menu == 1){ printf(send_char," -- ");}
if(alt_menu == 2){ printf(send_char," -- ");}
}else{ printf(send_char," ");}
}
if (tus_bilgi == 247) menuSet = FALSE;
tus_bilgi = 0;
}
ee_yaz();
menu = 0;
ezanVaktiHesapla();
send_cmd(CLR_DISP);
}
///////////////////////////////////////////////////////////////////////////////MAİN
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16|RTCC_8_bit); //2.0 ms overflow
setup_timer_2(T2_DIV_BY_16,124,1); //1.0 ms overflow, 1.0 ms interrupt
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);
set_pwm1_duty(0);
set_pwm2_duty(30);
setup_comparator(NC_NC_NC_NC);
enable_interrupts(INT_RTCC);
disable_interrupts(GLOBAL);
TRISB = 0;
PORTB = 0;
TRISC = 0;
PORTC = 0;
TRISA = 0;
delay_ms(100);
lcd_init();
delay_ms(100);
send_cmd(CLR_DISP);
port_b_pullups(0b11111111);
menu = 0;
alt_menu = 0;
/*
signed int8 m_table[19][4] = {
{30,11,11,3}, //Tarih 0
{12,15,00,3}, //Saat 1
{25,23,'S',2}, //Enlem 41,02 2
{28,97,'S',2}, //boylam 28,97 3
{15,15,'S',2}, //imsak role 4
{15,15,'S',2}, //gunes role 5
{15,15,'S',2}, //ogle role 6
{15,15,'S',2}, //ikindi role 7
{15,15,'S',2}, //aksam role 8
{15,15,'S',2}, //yatsi role 9
{15,15,'S',2}, //global role 10
{-17,'S','S',1}, //temkin imsak 11
{0,'S','S',1}, // gunes 12
{0,'S','S',1}, //temkin ogle 13
{0,'S','S',1}, // ikindi 14
{0,'S','S',1}, //temkin aksam 15
{0,'S','S',1}, //yatsı 16
{0,'S','S',1}, // yaz saati 17
{80,'S','S',1}, //kontrast 18
};*/
if(read_eeprom(254) != 13 ){
for (i = 0 ; i < 254 ;i++){write_eeprom(i,0);}
write_eeprom(254,13);
}
ee_reflesh();
set_pwm1_duty(0);
ezanVaktiHesapla();
PCF8583_init();
for(;;){
tus_oku();
if (tus_bilgi == 251) {tus_bilgi = 0 ; menuSet=TRUE;}
if (menuSet) islem();
PCF8583_read_datetime(&dt);
delay_ms(100);
if (_goster){
ezanVaktiYaz(ezan);
}
else
{
send_cmd(0x80);
printf(send_char," %02i/%02i/%02i",dt.day,dt.month,dt.year);
printf(send_char," %02i:%02i:%02i",dt.hours, dt.minutes,dt.seconds);
set_pwm2_duty(30);
send_cmd(0xC0);
printf(send_char," IM:%02i:%02i GU:%02i:%02i", imsak.saat, imsak.dakika, gunes.saat, gunes.dakika);
send_cmd(0x94);
printf(send_char," OG:%02i:%02i IK:%02i:%02i", ogle.saat, ogle.dakika, ikindi.saat, ikindi.dakika);
send_cmd(0xD4);
printf(send_char," AK:%02i:%02i YA:%02i:%02i", aksam.saat, aksam.dakika, yatsi.saat, yatsi.dakika);
}
}
}
/////////////////////////////////////////////////////////////////////////////
#int_RTCC
void RTCC_isr(void)
{
if(gecikme){gecikme--;}else {gecikme = 200; _flash = ! _flash;}
if(goster){goster--;}else {goster = 3000; _goster = !_goster;}
}
anaprogram
mesaj birleştirme:: 27 Mart 2016, 09:19:59
#include <18F2520.h>
#FUSES NOWDT, WDT128, INTRC_IO, NOFCMEN, NOIESO, NOPUT, NOBROWNOUT, BORV20, NOPBADEN, NOLPT1OSC, NOMCLR, STVREN, NOLVP, NOXINST, NODEBUG, NOPROTECT, NOCPB, NOCPD, NOWRT, NOWRTC, NOWRTB, NOWRTD, NOEBTR, NOEBTRB
#use delay(clock=8000000,RESTART_WDT)
#use i2c(Master,Fast,sda=PIN_C4,scl=PIN_C3)
mesaj birleştirme:: 27 Mart 2016, 09:20:44
#include <math.h>
#define piB2 1.570796326 // pi / 2
#define RAD 0.017453293 // RADYAN M_PI/180
#define DER 57.295779513 // DERECE 180/M_PI
typedef struct {
signed int8 saat,dakika;
} zaman;
typedef struct{
signed int8 imsak;
signed int8 gunes;
signed int8 ogle;
signed int8 ikindi;
signed int8 aksam;
signed int8 yatsi;
} sTemkin;
zaman imsak, gunes, ogle, ikindi, aksam, yatsi;
zaman onImsak, onGunes, onOgle, onIkindi, onAksam, onYatsi;
zaman offImsak, offGunes, offOgle, offIkindi, offAksam, offYatsi;
sTemkin temkin, userTemkin;
void NamazVakti(void);
void namazVaktiHesapla();
void temkinAyarla();
float32 JulianTarihi();
zaman setOnOff(zaman saat_dk, signed int sure);
float32 bTam(float32 tm);
float32 cot(float32 tm);
float32 myCos(float32 tm);
float32 acot(float32 tm);
float32 enlem;
float32 boylam;
signed int8 yazSaati;
signed int8 saat;
signed int8 dakika;
int16 yil, ttemp;
int8 ay;
int8 gun;
zaman setOnOff(zaman ezanSaati, signed int8 sure)
{
zaman donus;
int16 toplamDakika;
toplamDakika = (int16)ezanSaati.saat * 60 + ezanSaati.dakika + sure;
donus.saat = toplamDakika / 60;
donus.dakika = toplamDakika % 60;
return donus;
}
void temkinAyarla() {
temkin.imsak = -2 + userTemkin.imsak;
temkin.gunes = -7 + userTemkin.gunes;
temkin.ogle = 6 + userTemkin.ogle;
temkin.ikindi = 5 + userTemkin.ikindi;
temkin.aksam = 8 + userTemkin.aksam;
temkin.yatsi = 3 + userTemkin.yatsi;
}
void NamazVakti(void){
temkinAyarla();
namazVaktiHesapla();
}
/*float32 mutlakDeger(float32 sayi)
{
if (sayi >= 0)
return sayi;
else
return -sayi;
}*/
float32 bTam(float32 tm) {
if (tm >= 0)
return tm - ((int32)(tm / 360) * 360);
else
return 360 - abs(tm) + ((int32)(abs(tm) / 360) * 360);
}
float32 cot(float32 tm) {
return cos(tm) / sin(tm);
}
float32 myCos(float32 tm) {
return acos(tm) * DER;
}
float32 acot(float32 tm) {
return piB2 - atan(tm);
}
void saatDuzelt(){
if (dakika >= 60)
{
dakika = dakika - 60;
saat = saat + 1;
}
if (dakika < 0)
{
dakika = dakika + 60;
saat = saat - 1;
}
}
float32 JulianTarihi() {
int16 artikYil;//yıl - 1900
int16 sigs = gun;
int8 i;
char ayGunu[]={31,28,31,30,31,30,31,31,30,31,30,31};
artikYil = yil-1900;// Yıl 2011 ise, tm_tarih->tm_year komutu (2011-1900) 111 sonucunu verir. Yani yil = 111 olur.
if (artikYil % 4 == 0) ayGunu[1] = 29;//Şubat ayı
for (i = 0; i <= ay - 2; i++) sigs += ayGunu[i];
ttemp = sigs;
float32 jdn = (365*artikYil)+((int8)((artikYil-1)/4))+sigs;// miladi 00.01.1900 = 31 Aralık 1899 julian 2415020
return jdn + 0.5;
}
void namazVaktiHesapla() {
float32 ikindi_acisi;
float32 tmpY = 0;
float32 T = 0;
int8 _ulkesaati = 2 + yazSaati;
float32 vgunes = 0;
float32 vyatsi = 0;
float32 vaksam = 0;
float32 vimsak = 0;
float32 vogle = 0;
float32 vikindi = 0;
float32 ogleNamazi = 0;
float32 L0 = 0;
float32 M0 = 0;
float32 e = 0;
float32 Ct = 0;
float32 L = 0;
float32 M = 0;
float32 eps = 0;
float32 delta = 0;
float32 RA = 0;
float32 ET = 0;
float32 gOgle = 0;
float32 sR = 0;
float32 powT2 = 0;
float32 aci;
T = JulianTarihi() / 36525;// Bir yuzyıl 36525 gündür. (365 * 100) + (100 / 4) = 36525
powT2 = pow(T, 2);
L0 = 279.69668 + 36000.76892 * T + 0.0003025 * powT2;
L0 = bTam(L0);
M0 = 358.47583 + 35999.04975 * T - 0.00015 * powT2 - 0.0000033 * powT2*T;
M0 = bTam(M0);
e = 0.01675104 - 0.0000418 * T - 0.000000126 * powT2;
Ct = (1.91946 - (0.004789 * T) - (0.000014 * powT2)) * sin(RAD*M0) + (0.020094 - (0.0001 * T)) * sin(RAD*2 * M0) + (0.000293 * sin(RAD*3 * M0));
L = L0 + Ct;
aci = RAD * bTam(259.18 - 1934.142 * T);
L = L - 0.000015708 * sin(aci);
M = M0 + Ct;
eps = 23.452294 - 0.0130125 * T - 0.00000165 * powT2 + 0.000000503 * powT2 * T;
delta = DER * asin(sin(RAD*eps) * sin(RAD*L));
delta = bTam(delta);
RA = DER * atan(cos(RAD*eps) * tan(RAD*L));
RA = bTam(RA);
tmpY = pow(tan(RAD*eps / 2), 2);
ET = tmpY * sin(RAD*2 * L0) - 2 * e * sin(RAD*M0) + 4 * e * tmpY * sin(RAD*M0) * cos(RAD*2 * L0) - (1 / 2) * tmpY * tmpY * sin(RAD*4 * L0) - (5 / 4) * e * e * sin(RAD*2 * M0);
ET = -(ET / RAD) / 15;
gOgle = 12 + ET;
vogle = gOgle - ((boylam / 15) - _ulkesaati); //Zeval Vakti
ogleNamazi = vogle;
//********************* öğle **********************
saat = (int8) (ogleNamazi);
dakika = (int8) ((ogleNamazi - saat) * 60);
dakika = dakika + temkin.ogle + 2;
saatduzelt();
ogle.saat = saat;
ogle.dakika = dakika;
sR = 90 -(enlem - delta);
float32 sin_deltaXenlem = sin(RAD*delta) * sin(RAD*enlem);
float32 cos_deltaXenlem = cos(RAD*delta) * cos(RAD*enlem);
//************ imsak **********************************
vimsak = vogle - myCos((-0.3090170026 - sin_deltaXenlem) / (cos_deltaXenlem)) / 15;//-0.309017002593046
saat = (int8) (vimsak);
dakika = (int8) ((vimsak - saat) * 60);
dakika = dakika + temkin.imsak;
saatduzelt();
imsak.saat = saat;
imsak.dakika = dakika;
//************ güneş **********************************
vgunes = vogle - myCos((-0.017452234123174 - sin_deltaXenlem) / (cos_deltaXenlem)) / 15;
saat = (int8) (vgunes);
dakika = (int8) ((vgunes - saat) * 60);
dakika = dakika + temkin.gunes;
saatDuzelt();
gunes.saat = saat;
gunes.dakika = dakika;
//************ ikindi **********************************
ikindi_acisi = acot(cot(RAD*sR) + 1);
vikindi = vogle + myCos((sin(ikindi_acisi) - sin_deltaXenlem) / (cos_deltaXenlem)) / 15;
saat = (int8) (vikindi);
dakika = (int8) ((vikindi - saat) * 60);
dakika = dakika + temkin.ikindi;
saatDuzelt();
ikindi.saat = saat;
ikindi.dakika = dakika;
//************ aksam **********************************
vaksam = vogle + myCos((-0.017452234123174 - sin_deltaXenlem) / (cos_deltaXenlem)) / 15;
saat = (int8) (vaksam);
dakika = (int8) ((vaksam - saat) * 60);
dakika = dakika + temkin.aksam;
saatDuzelt();
aksam.saat = saat;
aksam.dakika = dakika;
//************ yatsı **********************************
// vyatsi = vogle + myCos((sin(RAD*(-17)) - sin_deltaXenlem) / (cos_deltaXenlem)) / 15;
vyatsi = vogle + myCos((-0.29237155 - sin_deltaXenlem) / (cos_deltaXenlem)) / 15;
saat = (int8) (vyatsi);
dakika = (int8) ((vyatsi - saat) * 60);
dakika = dakika + temkin.yatsi;
saatDuzelt();
yatsi.saat = saat;
yatsi.dakika = dakika;
}
@POWER julian tarihi hesaplama
mesaj birleştirme:: 27 Mart 2016, 09:21:20
#ifndef PCF8583_SDA
#define PCF8583_SDA PIN_C4
#define PCF8583_SCL PIN_C3
#endif
#use i2c(master, sda=PCF8583_SDA, scl=PCF8583_SCL)
#ifndef PCF8583_WRITE_ADDRESS
#define PCF8583_WRITE_ADDRESS 0xA0
#define PCF8583_READ_ADDRESS 0xA1
#endif
// Register addresses
#define PCF8583_CTRL_STATUS_REG 0x00
#define PCF8583_100S_REG 0x01
#define PCF8583_SECONDS_REG 0x02
#define PCF8583_MINUTES_REG 0x03
#define PCF8583_HOURS_REG 0x04
#define PCF8583_DATE_REG 0x05
#define PCF8583_MONTHS_REG 0x06
#define PCF8583_TIMER_REG 0x07
#define PCF8583_ALARM_CONTROL_REG 0x08
#define PCF8583_ALARM_100S_REG 0x09
#define PCF8583_ALARM_SECS_REG 0x0A
#define PCF8583_ALARM_MINS_REG 0x0B
#define PCF8583_ALARM_HOURS_REG 0x0C
#define PCF8583_ALARM_DATE_REG 0x0D
#define PCF8583_ALARM_MONTHS_REG 0x0E
#define PCF8583_ALARM_TIMER_REG 0x0F
// Use the first NVRAM address for the year byte.
#define PCF8583_YEAR_REG 0x10
// Commands for the Control/Status register.
#define PCF8583_START_COUNTING 0x00
#define PCF8583_STOP_COUNTING 0x80
/*char const weekday_names[7][10] =
{
{"Sunday"},
{"Monday"},
{"Tuesday"},
{"Wednesday"},
{"Thursday"},
{"Friday"},
{"Saturday"}
}; */
// This structure defines the user's date and time data.
// The values are stored as unsigned integers. The user
// should declare a structure of this type in the application
// program. Then the address of the structure should be
// passed to the PCF8583 read/write functions in this
// driver, whenever you want to talk to the chip.
typedef struct
{
int8 seconds; // 0 to 59
int8 minutes; // 0 to 59
int8 hours; // 0 to 23 (24-hour time)
int8 day; // 1 to 31
int8 month; // 1 to 12
int8 year; // 00 to 99
int8 weekday; // 0 = Sunday, 1 = Monday, etc.
}date_time_t;
//----------------------------------------------
void PCF8583_write_byte(int8 address, int8 data)
{
disable_interrupts(GLOBAL);
i2c_start();
i2c_write(PCF8583_WRITE_ADDRESS);
i2c_write(address);
i2c_write(data);
i2c_stop();
enable_interrupts(GLOBAL);
}
//----------------------------------------------
int8 PCF8583_read_byte(int8 address)
{
int8 retval;
disable_interrupts(GLOBAL);
i2c_start();
i2c_write(PCF8583_WRITE_ADDRESS);
i2c_write(address);
i2c_start();
i2c_write(PCF8583_READ_ADDRESS);
retval = i2c_read(0);
i2c_stop();
enable_interrupts(GLOBAL);
return(retval);
}
void PCF8583_init(void)
{
PCF8583_write_byte(PCF8583_CTRL_STATUS_REG,
PCF8583_START_COUNTING);
}
//----------------------------------------------
// This function converts an 8 bit binary value
// to an 8 bit BCD value.
// The input range must be from 0 to 99.
int8 bin2bcd(int8 value)
{
char retval;
retval = 0;
for(;;)
{
// Get the tens digit by doing multiple subtraction
// of 10 from the binary value.
if(value >= 10)
{
value -= 10;
retval += 0x10;
}
else // Get the ones digit by adding the remainder.
{
retval += value;
break;
}
}
return(retval);
}
//----------------------------------------------
// This function converts an 8 bit BCD value to
// an 8 bit binary value.
// The input range must be from 00 to 99.
char bcd2bin(char bcd_value)
{
char temp;
temp = bcd_value;
// Shifting the upper digit right by 1 is
// the same as multiplying it by 8.
temp >>= 1;
// Isolate the bits for the upper digit.
temp &= 0x78;
// Now return: (Tens * 8) + (Tens * 2) + Ones
return(temp + (temp >> 2) + (bcd_value & 0x0f));
}
//----------------------------------------------
void PCF8583_set_datetime(date_time_t *dt)
{
int8 bcd_sec;
int8 bcd_min;
int8 bcd_hrs;
int8 bcd_day;
int8 bcd_mon;
// Convert the input date/time into BCD values
// that are formatted for the PCF8583 registers.
bcd_sec = bin2bcd(dt->seconds);
bcd_min = bin2bcd(dt->minutes);
bcd_hrs = bin2bcd(dt->hours);
bcd_day = bin2bcd(dt->day) | (dt->year << 6);
bcd_mon = bin2bcd(dt->month) | (dt->weekday << 5);
// Stop the RTC from counting, before we write to
// the date and time registers.
PCF8583_write_byte(PCF8583_CTRL_STATUS_REG,
PCF8583_STOP_COUNTING);
// Write to the date and time registers. Disable interrupts
// so they can't disrupt the i2c operations.
disable_interrupts(GLOBAL);
i2c_start();
i2c_write(PCF8583_WRITE_ADDRESS);
i2c_write(PCF8583_100S_REG); // Start at 100's reg.
i2c_write(0x00); // Set 100's reg = 0
i2c_write(bcd_sec);
i2c_write(bcd_min);
i2c_write(bcd_hrs);
i2c_write(bcd_day);
i2c_write(bcd_mon);
i2c_stop();
enable_interrupts(GLOBAL);
// Write the year byte to the first NVRAM location.
// Leave it in binary format.
PCF8583_write_byte(PCF8583_YEAR_REG, dt->year);
// Now allow the PCF8583 to start counting again.
PCF8583_write_byte(PCF8583_CTRL_STATUS_REG,
PCF8583_START_COUNTING);
}
//----------------------------------------------
// Read the Date and Time from the hardware registers
// in the PCF8583. We don't have to disable counting
// during read operations, because according to the data
// sheet, if any of the lower registers (1 to 7) is read,
// all of them are loaded into "capture" registers.
// All further reading within that cycle is done from
// those registers.
void PCF8583_read_datetime(date_time_t *dt)
{
int8 year_bits;
int8 year;
int8 bcd_sec;
int8 bcd_min;
int8 bcd_hrs;
int8 bcd_day;
int8 bcd_mon;
// Disable interrupts so the i2c process is not disrupted.
disable_interrupts(GLOBAL);
// Read the date/time registers inside the PCF8583.
i2c_start();
i2c_write(PCF8583_WRITE_ADDRESS);
i2c_write(PCF8583_SECONDS_REG); // Start at seconds reg.
i2c_start();
i2c_write(PCF8583_READ_ADDRESS);
bcd_sec = i2c_read();
bcd_min = i2c_read();
bcd_hrs = i2c_read();
bcd_day = i2c_read();
bcd_mon = i2c_read(0);
i2c_stop();
enable_interrupts(GLOBAL);
// Convert the date/time values from BCD to
// unsigned 8-bit integers. Unpack the bits
// in the PCF8583 registers where required.
dt->seconds = bcd2bin(bcd_sec);
dt->minutes = bcd2bin(bcd_min);
dt->hours = bcd2bin(bcd_hrs & 0x3F);
dt->day = bcd2bin(bcd_day & 0x3F);
dt->month = bcd2bin(bcd_mon & 0x1F);
dt->weekday = bcd_mon >> 5;
year_bits = bcd_day >> 6;
// Read the year byte from NVRAM.
// This is an added feature of this driver.
year = PCF8583_read_byte(PCF8583_YEAR_REG);
// Check if the two "year bits" were incremented by
// the PCF8583. If so, increment the 8-bit year
// byte (read from NVRAM) by the same amount.
while(year_bits != (year & 3))
year++;
dt->year = year;
// Now update the year byte in the NVRAM
// inside the PCF8583.
PCF8583_write_byte(PCF8583_YEAR_REG, year);
}
mesaj birleştirme:: 27 Mart 2016, 09:23:37
bulundugunuz yerin kordinatlarini girdiginizde namaz vaktini hesaplayabilirsiniz yanliz rtc icin iyi bir kristal secerseniz zaman kaymalari minimum olur.
@Voltajcımalesef pbp dan başka dil bilmiyorum,bu dildede seviyem çok yüksek değil malesef ama bu proje için elimden gelenleri yaparım.
http://www.instesre.org/ArduinoUnoSolarCalculations.pdf (http://www.instesre.org/ArduinoUnoSolarCalculations.pdf)
Koordinat verisini önce eeprom a kayıt edip, ilgili formüllerede eepromdan mi çekilmeli? Elektrik gittiğinde dahi, tekrar çalışınca kişi koordinat sehir plaka vs. Girmemis olur, bunu bu sekilde yapsam olur mu yoksa farkli bir öneriniz var mi ?
Alıntı yapılan: Voltajcı - 28 Mart 2016, 09:21:47
Koordinat verisini önce eeprom a kayıt edip, ilgili formüllerede eepromdan mi çekilmeli? Elektrik gittiğinde dahi, tekrar çalışınca kişi koordinat sehir plaka vs. Girmemis olur, bunu bu sekilde yapsam olur mu yoksa farkli bir öneriniz var mi ?
Farklı şehirler için kullanılabilir olsun diyorsanız bu şekilde olması mantıklı. Değişmeyecekse const olarak tanımlayın gitsin.
koordimat verilerini eeproma girmek yerine module bir cps ekleyebilirsiniz.ben sadece bulundugu konumu menuden manuel girip eeproma kaydetmistim.
2nci el 100 TL ye hdmi girişli bir monitör ve 100TL lik hdmi çıkışlı bir tablet alın. Vakitleri yükleyin ömür boyu kullanın :)
@dursuncemal maliyeti en aza indirgemek için uğraşıyorum, haliyle gps modül şimdilik olmasa daha iyi :)
@cemre teşekkürler, saati ayarladiktan sonra zaten ds1307 kendi içinde devam ettiriyor kendisindeki pil ile, onu eepproma atmaya gerek yok o zaman, sadece son ayarlı koordinat kalsa yeter...
@kayatech piyasada herşey var zaten, aselsan tai otokar baykar bunlarin gerisini atmak lazım herkes hazır almali herşeyi sizin mantığa göre :)
Hazır almak ile alakası yok. Çözüm odaklı konuşuyoruz hocam. En ucuz çözüm bence bu.
Her şeyi de biz yapmaya kalkar isek durum şu; Hiçbir şeyi yapamıyoruz.
Bu ticari bir ürün olsaydı yine aynı şekilde çözüm odaklı işi bitirir , arge için gerekli parayı kazanırken sonuç odaklı çalışmalara devam ederdim. Sizin söyleminize göre tamamını üretmek için vakit ve nakit harcamak gerekir.
Bence vaktin değerini bilin...
Her şeyi satın alabiliyorsunuz ve hatta herşeyi üretebiliyorsunuz ama zamanı satın alamıyorsunuz.
Gün gelince ne demek istediğimi daha net anlarsınız.
malesef soz konusu maliyet oldugu zaman is cok zor bunun icin ticari amacli tasarladiginiz her ne olursa olsun onemli olan var olana farkli birseyler katmak o zaman isin rengi degisiyor.
Alıntı yapılan: dursuncemal - 29 Mart 2016, 12:31:29
malesef soz konusu maliyet oldugu zaman is cok zor bunun icin ticari amacli tasarladiginiz her ne olursa olsun onemli olan var olana farkli birseyler katmak o zaman isin rengi degisiyor.
aslında haklısınız. GPS modül 10-12 lira civarı Aliexpress de, gps eklenebilir.