- Gerekli malzemeler:
- RTC Modülü:
- DS3231 RTC'yi PIC Mikrodenetleyiciye Bağlama:
- RTC Modülü için PIC Programlama:
- PIC16F877a_DS3231.h başlık dosyasının kısa açıklaması:
- Simülasyon:
- LCD'de Saat ve Tarihi Göster:
Neredeyse tüm gömülü cihazlar gerçek dünya ile etkileşime girecek şekilde tasarlanmıştır. Dijital dünya ile gerçek dünya arasında iletişim kurmak için bir köprü görevi görürler. Bu süreci daha kolay ve verimli kılmak için dijital dünyanın bazen gerçek dünyanın saatini ve tarihini takip etmesi gerekir. Böylelikle dijital dünya, gerçek dünyada saatin / günün kaç olduğunu bilecek ve hatta gündüz ve gece arasında ayrım yapabilecektir. Ayrıca, belirli görevleri belirli bir zamanda veya tarihte gerçekleştirmek için bir zaman kaynağı görevi görebilir. Bu yüzden burada bir RTC modülünü PIC Mikroişlemci ile arayüzlendiriyoruz ve 16x2 LCD'de saat ve tarihi görüntülüyoruz. Bu proje aynı zamanda Dijital Saat olarak da kullanılabilir.
Gerekli malzemeler:
- Düzenlenmiş 5V Besleme
- PIC16F877A
- Kristal Osilatör 20Mhz
- Kapasitör 33pf - 2Nos
- 10K, 5.1K, 1K direnç
- DS3231 RTC modülü
- POT -10k
- LCD Modül 16 * 2
- Bağlantı telleri
RTC Modülü:
Bir mikro denetleyicinin gerçek dünyanın saatini veya tarihini izlemesinin en yaygın yolu bir RTC IC kullanmaktır. RTC terimi Gerçek Zamanlı Saat anlamına gelir; bu IC, gerçek dünya saatini ve tarihini takip eder ve bu bilgileri istenildiği zaman mikro denetleyici ile paylaşır. Burada kullandığımız RTC IC, en popüler ve doğru DS3231'dir. Bu IC, her yıl yalnızca birkaç saniye sürüklenir ve bu nedenle oldukça güvenilirdir. Bu eğitimin iyiliği için, çevrimiçi olarak veya yerel donanım mağazasından kolayca satın alınabilen DS3231 RTC modülünü kullanıyoruz. Modül, RTC modülüne her zaman güç sağlayan 3V madeni para hücresi ile birlikte gelir ve bu nedenle saat ve tarih ayarlandıktan sonra, madeni para hücresi canlı olduğu sürece güncellenecektir.
DS3231 modülü I2C protokolünün yardımıyla iletişim kurar, bu nedenle ne olduğunu ve PIC ile nasıl kullanıldığını bilmiyorsanız, devam etmeden önce I2C ile PIC eğitimini okuyun. Ayrıca bu eğitimde, RTC modülümüzle iletişim kurmak için kullanılabilecek bir başlık dosyası oluşturacağız ve aynı zamanda bir LCD ekranda saat ve tarihi görüntüleyerek aynı şeyi donanımda test edeceğiz, böylece LCD arayüzünü nasıl kullanacağımızı öğrenmek de önemlidir PIC mikro denetleyicili ekran. Bu öğreticide DS3231 için oluşturulan başlık dosyası daha sonra uygulamalarınıza uyacak şekilde kullanılabilir / değiştirilebilir.
Daha önce DS3231 RTC'yi Arduino ile aşağıdaki projelerde kullandık:
- Arduino kullanarak Otomatik Evcil Hayvan Besleyici
- Arduino Veri Kaydedici
DS3231 RTC'yi PIC Mikrodenetleyiciye Bağlama:
PIC Mikrodenetleyici tabanlı Dijital Saat için devre şeması aşağıda verilmiştir. Daha önce de belirtildiği gibi DS3231, I2C iletişimi yardımıyla çalışır, bu nedenle PIC'mizdeki I2C pinlerine bağlanması gereken bir Seri Saat (SCL) ve bir Seri Veri (SDA) pinine sahip olacaktır, bu pin 18 (SCL) ve pim 23 (SDA). Boştayken veriyolunu yüksek durumda tutmak için 4.7k değerinde bir yukarı çekme direnci kullanılır.
Mevcut tarih ve saati görüntülemek için Bağlantı Noktası D'deki pimlere bir LCD ekran da bağlanır. Tam devre şeması proteus üzerinde tasarlanmıştır ve aşağıda gösterilmiştir. Bu öğreticide daha sonra simüle etmek veya programlamak için aynısını kullanacağız.
Devre şemasını izleyin ve bağlantıları buna göre yapın, yukarıda gösterilen I2C kutusu I2C hata ayıklama için kullanılır, bu nedenle bunu bağlantılarımıza dahil etmeyeceğiz. Ayrıca, RTC modülüne, modül üzerindeki Vcc ve Ground pinleri kullanılarak + 5V'luk bir besleme ile güç sağlanması gerektiği gösterilmemiştir. Bağlantıyı yapmak için devre tahtamı kullandım ve gerekli bağlantıları yaptıktan sonra kurulumum aşağıdaki gibi görünüyordu.
PIC Microcontroller'da yeniyseniz, PIC Microcontroller ile Başlarken ile başlayın.
RTC Modülü için PIC Programlama:
Tüm program bu Dijital saatin burada ZIP dosyası indirilebilir. Program toplamda üç başlık dosyası içerir. Bunlar lcd.h LCD ekran, çalışmak için dosya PIC16F877a_I2C.h nihayet PIC ile I2C iletişimi ile çalışan ve için dosyanın PIC16F877a_DS3231.h RTC modülleri ile çalışmak için dosya. Üç başlık dosyasının tamamı bu program için gereklidir ve yukarıdaki ZIP dosyasında mevcuttur. Aşağıda, RTC modülünden saat ve tarihi okumak ve LCD ekranda görüntülemek için tüm bu başlık dosyalarını kullanan ana programı açıklayacağım. Bundan sonra RTC başlık dosyasında gerçekte ne olduğunu açıklayacağım. Her zaman olduğu gibi, programa yapılandırma bitlerini ayarlayarak ve saat frekansını 20MHz olarak ayarlayarak başlayın çünkü bu, donanımımızda kullandığımız şeydir.
#pragma config FOSC = HS // Osilatör Seçim bitleri (HS osilatörü) #pragma config WDTE = KAPALI // Watchdog Zamanlayıcı Etkin bit (WDT devre dışı) #pragma config PWRTE = AÇIK // Güç Zamanlayıcı Etkinleştirme biti (PWRT etkin) # pragma config BOREN = ON // Brown-out Reset Enable bit (BOR etkin) #pragma config LVP = OFF // Düşük Voltaj (Tek Kaynak) Devre İçi Seri Programlama Etkinleştirme biti (RB3 dijital G / Ç, HV açık MCLR, programlama için kullanılmalıdır) #pragma config CPD = OFF // Veri EEPROM Hafıza Kodu Koruma biti (Veri EEPROM kod koruması kapalı) #pragma config WRT = OFF // Flash Program Hafızası Yazmayı Etkinleştir bitleri (Yazma koruması kapalı; tüm program hafızası EECON kontrolü tarafından yazılabilir) #pragma config CP = OFF // Flash Programı Bellek Kodu Koruma biti (Kod koruması kapalı) #define _XTAL_FREQ 20000000
Bir sonraki adım , LCD pinlerini tanımlamak olacaktır, donanıma bakarsanız , LCD'nin pinlerini RD2'den RD7'ye PORT D'ye bağladığımızı fark edebilirsiniz, bu yüzden aşağıda gösterildiği gibi tanımlarız.
#define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7
Varsayılan olarak, RTC modülünü satın aldığınızda, içinde doğru saat ve tarih ayarlanmayacaktır, bu nedenle onu programımız aracılığıyla ayarlamamız gerekir. Bu nedenle, her veri için değişken tanımlıyoruz ve aşağıda gösterildiği gibi gerçek dünya saat ve tarihini besliyoruz. Programı yüklediğimde saatim ve tarihim 6-5-2018 saat 10: 55 idi, bu yüzden değişkenleri aşağıdaki gibi ayarladım. Gerçek uygulamanıza göre doğru saat ve tarihi ayarlayabilirsiniz.
/ * Tarih ve saatin o anki değerini aşağıda ayarlayın * / int sn = 00; int min = 55; int saat = 10; int tarih = 06; int ay = 05; int yıl = 18; / * Saat ve Tarih Ayarı * /
Daha sonra tartıştığımız tüm başlık dosyalarını ekliyoruz. Programı ZIP dosyasından indirip açtıysanız, sorun olmayacaktır, aksi takdirde tüm başlık dosyalarının kaynak dosyanıza veya proje dizininize eklendiğinden emin olun.
#Dahil etmek
PORT D'yi LCD'ye arabirim oluşturmak için çıkış pinleri olarak kullandığımızdan, bunları programımızda çıkış pinleri olarak ilan etmemiz ve LCD ekranı aşağıda gösterildiği gibi başlatmamız gerekiyor.
TRISD = 0x00; // LCD arabirimi için Bağlantı Noktası D pinlerini çıkış olarak yapın Lcd_Start (); // LCD modülünü başlat
RTC modülü I2C protokolünün yardımıyla iletişim kurar, bu nedenle PIC mikro denetleyicimizin I2C iletişimini etkinleştirmemiz gerekir. DS3231 modüllerimiz dahil çoğu cihazın I2C çalışma frekansı 100KHz'dir, bu nedenle I2C iletişimini aşağıda gösterildiği gibi 100KHz frekansla başlatırız.
I2C_Initialize (100); // I2C Master'ı 100KHz saat ile başlat
RTC modülüyle bir I2C iletişimi kurduğumuz anda yaptığımız ilk şey programımıza girdiğimiz geçerli saati ve tarihi ayarlamaktır. Bu, aşağıda gösterildiği gibi set_Time_Date işlevini çağırarak yapılabilir. Saat ve tarih ayarlandıktan sonra, modül otomatik olarak bunu takip edecek ve tıpkı bir dijital saat gibi artıracaktır.
Set_Time_Date (); // RTC modülünde saat ve tarihi ayarlayın
Programın başladığını belirtmek için, ekranda 2 saniye kalacak küçük bir giriş mesajı görüntüleyeceğiz. Bu mesaj, ekranda PIC – Devre Özetli RTC'yi gösterecektir. Aynı program aşağıda gösterilmiştir
Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("PIC ile RTC"); Lcd_Set_Cursor (2,1); Lcd_Print_String ("-Devre Özeti"); __delay_ms (1500);
Sonsuz while döngümüzün içinde mevcut saati ve tarihi okumalı ve ardından değerleri LCD ekranımızda görüntülemeliyiz. RTC modülünden Saat ve Tarihi okumak için, Update_Current_Time_Date işlevi aşağıda gösterildiği gibi kullanılabilir. Bu fonksiyon, RTC modülünden değeri okuyacak ve sn, min, saat, tarih, ay ve yıl değişkenlerini mevcut değerlerle güncelleyecektir. O zaman onları amacımız için kullanabiliriz.
Update_Current_Date_Time (); // RTC modülünden güncel tarih ve saati okuyun
Değişkenler tamsayı veri tipindedir, onları ayrı karakterlere dönüştürmeliyiz, böylece onları LCD ekranda görüntüleyebiliriz. Dolayısıyla, bir kez basamağı elde etmek için modül operatörünü kullanıyoruz ve değişkeni 10'a bölerek onlar basamağını elde ediyoruz. Aynı şey tüm değişkenler için de yapılır.
// lcd char sec_0 = sec% 10; karakter sn_1 = (sn / 10); char min_0 = min% 10; char min_1 = min / 10; char hour_0 = saat% 10; char saat_1 = saat / 10; karakter tarihi_0 = tarih% 10; karakter tarihi_1 = tarih / 10; char month_0 = ay% 10; char month_1 = ay / 10; char year_0 = yıl% 10; char year_1 = yıl / 10;
Tek yapmamız gereken, elde ettiğimiz bilgileri LCD ekranda görüntülemek. Bu, daha önce LCD eğitimimizde tartıştığımız LCD işlevleri ile kolayca yapılabilir. Dolayısıyla zamanı gösterecek kod aşağıda verilmiştir, aynı yöntem tarihi görüntülemek için de kullanılır. Veriler görüntülendikten sonra, bir güncelleme aralığı olarak işlev görmesi için 500 ms gecikme verilir.
Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("TIME:"); Lcd_Print_Char (saat_1 + '0'); Lcd_Print_Char (saat_0 + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (min_1 + '0'); Lcd_Print_Char (min_0 + '0'); Lcd_Print_Char (':'); Lcd_Print_Char (sn_1 + '0'); Lcd_Print_Char (sn_0 + '0');
PIC16F877a_DS3231.h başlık dosyasının kısa açıklaması:
Şimdiye kadar açıklanan şeyler, DS3231 modülünü kendi projeleriniz için PIC ile kullanmak için yeterlidir, ancak meraklı beyinler için başlık dosyasının içinde gerçekte ne olduğunu bilmek ister ve veriler aslında PIC tarafından RTC modülünden alınır, sadece daha fazla okuyun.
Bunu yapmanın en iyi yolu, DS3231'in veri sayfasını tamamen okumaktır. Neye ihtiyaç duyulduğunun bir özetini vermek gerekirse, modül PIC için bir slave görevi görür ve tüm DS3231 modülünün adresi D0'dır. Bu yüzden modüle veri yazmalıyız D0 adresini geçmeliyiz ve RTC'den veri okumak için D1 adresini geçmeliyiz. Yazma adresini RTC modülüne geçirirsek, PIC'den veri almaya hazırlanırız, böylece PIC tarafından yazılan sonuç verileri alınır ve RTC modülüne kaydedilir. Benzer şekilde , adresi okumak için gönderirsekdaha sonra PIC, RTC modülü sahip olduğu tüm verileri göndermeye başlayacağından, değerleri RTC'den okumaya hazır olmalıdır. Hem D0 hem de D1 için bit dizisi aşağıda veri sayfasından gösterilmektedir. 0b11010000 adresinin D0 (Yaz) ve 0b11010001 D01 (Oku) anlamına geldiğine dikkat edin
PIC, D0 veya D1 adresini yazmak veya okumak için gönderdiğinde, aşağıdaki veriler sırayla okunmalı veya yazılmalıdır. Bu sıra aşağıdaki tabloda gösterilmektedir. Bu nedenle ilk veriler saniye (00h), ardından dakikalar (01h), ardından saatler (02h), ardından gün (03h) ve MSB Sıcaklık değerine kadar olacaktır.
RTC modülü Ondalık değerleri anlamaz, yalnızca BCD değerleri aracılığıyla iletişim kurar. Bu yüzden RTC modülüne herhangi bir değer yazmadan önce BCD'ye dönüştürülmeli ve ayrıca RTC modülünden alınan değerler BCD formatında olacak ve bizim için anlamlı olması için Decimal'e dönüştürülmelidir. Bunu akılda tutarak, RTC modülünü kullanmak için gerekli tüm işlevi oluşturalım.
BCD_2_DEC ve DEC_2_BCD işlevleri:
RTC modülü yalnızca BCD'yi anladığından, ilk iki işlev BCD verilerini Ondalık ve Ondalık verileri BCD'ye dönüştürmek için kullanılır. BCD'yi Ondalık'a ve BCD'yi Ondalık'a dönüştürme formülleri
Ondalık = (BCD >> 4) * 10 + (BCD ve 0x0F) BCD = ((Ondalık / 10) << 4) + (Ondalık% 10)
Karşıt birimi parametre olarak alan ve onu istenen biçime dönüştüren ve geri döndüren bir işlev oluşturmak için bu iki formülü kullanmalıyız, aynısını yapmak için işlev aşağıda gösterilmiştir.
int BCD_2_DEC (int to_convert) { return (to_convert >> 4) * 10 + (to_convert & 0x0F); } int DEC_2_BCD (int to_convert) { return ((to_convert / 10) << 4) + (to_convert% 10); }
Set_Time_Date () işlevi:
Bu işlev saat ve tarih değerini PIC'den RTC modülüne yazacaktır. Gerçek zaman ve tarih değerleri kullanıcı tarafından sn, dk, saat, tarih, ay ve yıl değişkenlerinde güncellenmelidir. Bu değerler daha sonra BCD'ye dönüştürülecek ve RTC modülüne yazılacaktır.
Tartıştığımız gibi, RTC modülüne bir değer yazmak için D0 adresini geçmeli ve yazma sürecini başlatmak için bir boğa biti 0 yazmalıyız. Daha sonra verileri yukarıdaki tabloda gösterildiği gibi gönderebiliriz.
void Set_Time_Date () { I2C_Begin (); I2C_Write (0xD0); I2C_Write (0); I2C_Write (DEC_2_BCD (sn)); // saniyeyi güncelle I2C_Write (DEC_2_BCD (dakika)); // min I2C_Write (DEC_2_BCD (saat)) güncelleme; // I2C_Write (1) saatini güncelle ; // I2C_Write gününü güncellemeyi göz ardı et (DEC_2_BCD (tarih)); // güncelleme tarihi I2C_Write (DEC_2_BCD (ay)); // I2C_Write (DEC_2_BCD (yıl)) ayını güncelle ; // I2C_End () yılını güncelle ; }
Update_Current_Date_Time () işlevi:
Kitaplıktaki son işlev , RTC modülünden saat ve tarihi okumak ve bunu PIC mikro denetleyiciye aktarmak için kullanılan işlevdir . Bu fonksiyon, biri okuma sürecini başlatmak, ikincisi değerleri okumak ve sn, min, saat, tarih, ay ve yıl gibi global değişkenlere kaydetmek için olmak üzere üç bölüme ayrılmıştır. Üçüncüsü, okumanın başarılı olduğunu kabul etmektir.
Her eylem için I2C iletişiminin başlatılması ve bitirilmesi gerektiğine dikkat edin.
RTC'den değerleri okumak için D0 adresini ve ardından 0 adresini göndermemiz gerekir. Bu, RTC modülünün sahip olduğu tüm değerleri yukarıdaki tabloda gösterilen sırayla göndermesini sağlayacaktır. Onları ondalık sayıya çevirip aynı sırayla değişkenlere kaydedebiliriz.
Son olarak, okuma tamamlandıktan sonra, RTC modülü, okunması ve onaylanması gereken bir onay biti gönderir.
void Update_Current_Date_Time () { // I2C_Begin () Okumak için BAŞLAT ; I2C_Write (0xD0); I2C_Write (0); I2C_End (); // I2C_Begin () OKUYUN; I2C_Write (0xD1); // Veri okumayı başlat sec = BCD_2_DEC (I2C_Read (1)); min = BCD_2_DEC (I2C_Read (1)); saat = BCD_2_DEC (I2C_Read (1)); I2C_Read (1); tarih = BCD_2_DEC (I2C_Read (1)); ay = BCD_2_DEC (I2C_Read (1)); yıl = BCD_2_DEC (I2C_Read (1)); I2C_End (); // END Okuma I2C_Begin (); I2C_Write (0xD1); // Veriyi okumayı başlat I2C_Read (1); I2C_End (); }
Simülasyon:
Proje, Proteus simülasyon yazılımı kullanılarak simüle edilebilir. Bağlantıları devre şemasında gösterildiği gibi yapın ve altıgen dosyayı PIC kontrol cihazına yükleyin. Bunu simüle ettiğinizde, iki açılır kutu ve aşağıda gösterildiği gibi LCD'de görüntülenen tarih ve saat göreceksiniz.
Üstteki küçük olan, RTC modülünün içinde geçerli olan saat ve tarihi gösterir ve ikinci açılır pencere I2C hata ayıklayıcıdır. I2C hatasına gerçekte hangi verilerin aktarıldığını kontrol etmek için mükemmel bir araçtır.
LCD'de Saat ve Tarihi Göster:
Donanımınız hazır olduğunda ve kod verilen bağlantı üzerinden ZIP dosyası olarak indirildikten sonra MPLABX IDE'yi kullanarak programı açın. Önce IDE'yi başlatmanız ve proje aç seçeneğini kullanmanız ve ZIP dosyası içindeki içeriğe göz atmanız ve.X klasörünü açmanız gerekir.
Programın derleyip derlemediğini kontrol edin ve PicKit3'ü kullanarak kodu donanımınıza yükleyin. Program yüklenir yüklenmez giriş mesajını görmeli ve ardından aşağıda gösterildiği gibi saat ve tarih görüntülenmelidir.
LCD'de hiçbir şey yoksa bağlantılarınızı kontrol edin ve potansiyometreyi değiştirerek kontrast seviyesinin doğru ayarlandığından emin olun. Bu, tüm PIC mikrodenetleyici projelerinize saati ve tarihi nasıl gösterebilir ve bunu Dijital Saat olarak kullanabilirsiniz. Umarım yeni bir şey öğrenmişsinizdir ve bu öğreticiyi öğrenmekten zevk almışsınızdır. Herhangi bir sorunla karşılaştıysanız, teknik yardım için aşağıdaki yorumlara veya forumlara gönderin.
Başlık dosyalarıyla birlikte bu proje için eksiksiz PIC programını buradan indirin ve ayrıca tüm PIC Öğreticilerimizi buradan kontrol edin.