İçeri gel
Yeni başlayanlar ve profesyoneller için tüm bilgisayar sırları
  • Yeni Rus ufuk ötesi radarlarının lansmanına doğru Radarlar tarafından çözülen ana görevler
  • Obturator foramen'in tıbbi açıdan anlamı
  • Yeni kelimelerle çalışmak
  • Safir dersleri. PC safir. Geniş araç yelpazesi
  • Dekupaj kartlarıyla nasıl çalışılır
  • Smile'da İnternet hesabınıza nasıl yükleme yapılır?
  • DS3231 modülündeki saati bilgisayarla senkronize ediyoruz. DS3231 gerçek zamanlı saat ve basit bir program için bağlantı şeması

    DS3231 modülündeki saati bilgisayarla senkronize ediyoruz.  DS3231 gerçek zamanlı saat ve basit bir program için bağlantı şeması

    ". DS3231 gerçek zamanlı saat modülünü tanıyalım. Makale, DS ailesinden modülleri Arduino'ya bağlamanın video talimatlarını, program listelerini, amacını ve yöntemlerini içerir.

    DS3231 Gerçek Zamanlı Saat Modülü

    DS3231 Gerçek Zamanlı Saat Modülü Nedir?

    Gerçek zamanlı saat modülü- kronometrik verileri (güncel saat, tarih, haftanın günü vb.) kaydetmek için tasarlanmış bir elektronik devre olup, otonom bir güç kaynağı ve bir kayıt cihazından oluşan bir sistemdir.

    DS3231 modülü Aslında sıradan bir saat. Arduino kartlarında zaten yerleşik bir zaman sensörü var Milliler ancak yalnızca karta güç uygulandığında çalışır. Arduino'yu kapatıp açarsanız Millis zamanı sıfırlanacaktır. Ve DS3231'de, Arduino kartının bağlantısı kesildiğinde bile modüle "güç sağlamaya" devam eden ve zamanı ölçmesine olanak tanıyan bir pil bulunur.

    Modül, Arduino kartlarına dayalı olarak saat veya alarm saati olarak kullanılabilir. Veya Akıllı Ev gibi çeşitli sistemler için bir uyarı olarak.

    DS3231 Özellikleri:

    • modül saatleri, dakikaları, saniyeleri, tarihleri, ayları, yılları hesaplar (artık yıllar 2100'e kadar dikkate alınır);
    • Çeşitli cihazlara bağlanmak için saat bir I2C arayüzü aracılığıyla bağlanır.

    32 bin— Çıkış >12V harici güç sağlamak üzere tasarlanmıştır.

    S.Q.W.— Programlanabilir Kare Dalga sinyal çıkışı.

    SCL– Bu pin aracılığıyla I2C arayüzü üzerinden saat ile veri alışverişi yapılır.

    S.D.A.– Saatten gelen veriler bu pin üzerinden iletilir.

    VCC– Gerçek zamanlı saat için güç kaynağı, 5 volt gereklidir. Bu pine voltaj gelmezse saat uyku moduna geçer.

    GND- Toprak.

    DS3231 gerçek zamanlı saat ve basit bir program için bağlantı şeması

    Farklı Arduino kartlarındaki SDA ve SCL pinleri:

    S.D.A. SCL
    UNO A4 A5
    Mini A4 A5
    nano A4 A5
    Mega2560 20 21
    Leonardo 2 3

    Gerçek zamanlı saat modülünü Arduino UNO'ya bağlayalım. SDA - pim A4, SCL - pim A5.

    Aşağıdaki program modelin çalışması için uygundur (programı Arduino IDE'ye kopyalamanız yeterlidir):

    #katmak

    geçersiz kurulum() (
    gecikme(300);
    Seri.begin(9600);
    time.begin();
    }
    geçersiz döngü ()



    }
    }

    Bu çizimde zaman basitçe geri sayılıyor.

    Her şeyden önce, sktech'te kütüphaneyi bağlayın iarduino_RTC.h.

    Orada, modülünüzün doğru şekilde çalışması için tam adını belirtin.

    Sonuç olarak DS3231 modülünden port monitöre zaman çıkışını alıyoruz. Saat, dakika, saniye görüntülenir.

    Bir sonraki çizimde bir fonksiyon ekleyeceğiz ayarlanan zaman, ilk geri sayım süresini ayarlamanıza olanak tanır.

    #katmak
    iarduino_RTC zamanı(RTC_DS3231);
    geçersiz kurulum() (
    gecikme(300);
    Seri.begin(9600);
    time.begin();
    time.settime(0,0,18,24,04,17,1); // 0 sn, 0 dk, 18 saat, 24 Nisan 2017, Pazartesi
    }
    geçersiz döngü ()
    if(millis()%1000==0)( // eğer 1 saniye geçtiyse
    Serial.println(time.gettime("g-m-Y, H:i:s, D")); // zamanı gösterme
    gecikme(1); // 1 ms'de zamanın birkaç kez görüntülenmemesi için 1 ms duraklatın
    }
    }

    Örnekte süre, 24 Nisan 2017 Pazartesi günü saat 0 saniye, 0 dakika, saat 18'den itibaren sayılmaya başlar.

    Ders gönderileri:

    1. İlk ders: .
    2. İkinci ders: .
    3. Üçüncü ders: .
    4. Dördüncü ders: .
    5. Beşinci ders: .
    6. Altıncı ders: .
    7. Yedinci ders: .
    8. Sekizinci ders: .
    9. Dokuzuncu ders:

    Tanım

    Bağımsız güç kaynağına sahip gerçek zamanlı saat modülü. Arduino/Genuino kontrolörlerinde yerleşik bir gerçek zamanlı saat yoktur. Zamanla çalışmak için millis() işlevi vardır. Ancak saat ve tarih gerektiren projelerde bu fonksiyonun yetenekleri yeterli olmuyor ve gerçek zamanlı bir saat imdada yetişiyor.

    DS3231 modülü, TCXO sıcaklık telafisine sahip, düşük maliyetli, doğru, I2C gerçek zamanlı bir saattir. Cihazda CR2032 pil için bir konektör bulunur ve cihazın gücü kesildiğinde doğru zaman işleyişini korur. Saat, saniye, dakika, saat, gün, ay ve yıl hakkındaki bilgileri destekler. Ay sonu tarihi, artık yıl ayarlaması da dahil olmak üzere, 31 günden daha az gün içeren aylar için otomatik olarak ayarlanır. Modlardan birinde çalışırlar: 24 veya 12 saatlik format (AM/PM göstergeli). Programlanabilir iki alarmı vardır.

    Saatin ana özellikleri:

      Saniyeleri, dakikaları, saatleri, günü, ayı ve yılı sayan gerçek zamanlı saat (2100'e kadar artık yıllar dahil tarih ayarlamalarıyla)

      Seyahat hatası: Yılda ±2 dakika

      ±3°С hataya sahip sıcaklık sensörü

      İki alarm saati

    Özellikler

      Çalışma sıcaklığı: -40°С - +85°С

      Besleme gerilimi: 2,3 - 5,5 V

      Akü besleme voltajı: 2,3 - 5,5 V

      Maksimum akım tüketimi: 650 nA

    Fiziksel Boyutlar

      Modül (U x G x Y): 45 x 23 x 15 mm

    Kullanım artıları

      Yüksek saat doğruluğu

      Kesme işlevine sahip iki alarm saati vardır

      Geniş çalışma sıcaklığı aralığı

    Kullanım dezavantajları

      Bazı analoglardan daha pahalı

    Modülle çalışmak için kütüphane

    Bağlantı ve kullanım örnekleri

    Örnek 1:Örnek, bir saat modülünün denetleyiciye bağlanmasını, saat üzerinde saat ve tarihin ayarlanmasını, saatin, tarihin ve haftanın gününün Seri port monitörüne gönderilmesini ve ayrıca mevcut modülden sıcaklığın alınmasını gösterir. (Örnekler Smart UNO kontrol cihazında test edilmiştir)

    Bağlantı şeması:

    İndirilecek taslak:

    //Kütüphaneleri bağlama#katmak #include "DS3231.h" DS3231 RTC; //DS3231 nesnesini oluştur char haftanınDay [ 4 ] = ( "Paz" , "Pzt" , "Salı" , "Çarşamba" , "Per" , "Cum" , "Cumartesi" ) ; //Haftanın günlerinin bir dizisini oluştur //Tarihi şu formatta ayarlamak için DateTime türünde bir değişken oluşturuluyor: //yıl, ay, gün, saat, dakika, saniye ve haftanın günü (0 - Pazar'dan 6 - Cumartesi'ye kadar) TarihSaat dt(2016, 8, 22, 16, 10, 0, 1); void setup() (Seri.begin (9600); //Seri port başlatılıyor Wire.begin(); //Wire kütüphanesini başlatıyoruz RTC.begin(); //saati başlat RTC.adjust (dt) ; //Tarih-saati dt değişkeninde belirtildiği gibi ayarlayın) void loop () ( DateTime now = RTC.now () ; //geçerli tarih ve saati alıyoruz //alınan yılın çıktısını alıyoruz Seri.print(şimdi.yıl(), DEC); Seri.print("/"); //ayın çıktısı Seri .print (now.month () , DEC) ; Seri.print("/"); //gün Seri .print (şimdi.tarih () , DEC) ; Seri.print(" "); //saat Seri .print (şimdi.saat () , DEC) ; Seri.print(":"); //dakika Seri .print (şimdi.dakika () , DEC) ; Seri.print(":"); //saniye Seri .print (şimdi.saniye () , DEC) ; Seri.println(); //haftanın günü Seri .print (weekDay[ now.dayOfWeek () ] ) ; Seri.println(); gecikme(1000); //1 saniye gecikme RTC.convertTemperature(); //kayıtlardaki mevcut sıcaklığın dönüştürülmesi Serial.print(RTC.getTemperature()); //kayıtları oku ve ortaya çıkan sıcaklığı çıkar Seri.println("C"); gecikme(1000); //1 saniye gecikme }

    Bugün mükemmel gerçek zamanlı saat (RTC) çipi arayışımıza devam edeceğiz. . Ekran, geliştirme için daha uygun olacaktır - ayarlar dışındaki tüm bilgileri aynı anda görüntüleyen bir LCD ekran. Bu formda saatin masaüstü seçeneği olarak kullanılması uygundur.

    Öyleyse DS3231 yongasının kendisine bakalım. DS3231, sıcaklık dengelemeli yerleşik kuvars rezonatörü sayesinde son derece hassas hareketlere sahip (üreticiler bu kelimeyi seçti) gerçek zamanlı bir saattir. Veri aktarım arayüzü I 2 C'dir. Bu mikro devre ayrıca yedek akü voltajı için bir girişe sahiptir, ana güç kapatıldığında mikro devre otomatik olarak yedek aküden çalışmaya geçer, yedek aküden çalışmanın doğruluğu değişmez etkilendi. Çok sevindirici değil mi? DS3231 saniyeleri, dakikaları, saatleri, ayın günlerini (tarih), haftanın günlerini, ayları ve yılları (aylar için artık yıl dahil) saymayı destekler. 12 ve 24 saatlik formatta çalışmayı destekler. Bunları yapılandırma ve durumlarını izleme yeteneğine sahip 2 alarm saati vardır. Sıcaklık telafisi doğruluğunun ayarlanması. Ve ayrıca iki çıkış - 32 kHz'de (çıkış 32,768 kHz'dir) ve 1 Hz'den 8,192 kHz'e kadar programlanabilir bir çıkış. Ayrıca bir sıfırlama pimi de vardır - RST. Gerçek zamanlı saat çipi SO-16 paketinde mevcuttur. Kasa oldukça büyük, ancak içeride zaten kuvars olduğunu ve aynı zamanda sıcaklığın da dengelendiğini düşünürseniz, bana öyle geliyor ki boyutlarda her şey yolunda. DS3231'in DS3232 şeklinde bir ikizi vardır ancak onun 2 bacağı daha vardır. Bütün bunlar NXP ürünlerini çok anımsatıyor - PCA2129 ve PCF2129 saat çipleri. Benzer sıcaklık dengelemeli yerleşik kuvars rezonatör, her ikisi de yalnızca farklı sayıda n.c. ile aynı ikizlerdir. Zaman işleyişine ek olarak DS3231'e göre pinler ve benzer işlevler.

    RTC DS3231, gerekli kablolamaya sahip modüller şeklinde ve çoğu zaman ihtiyaç duyulmayan bir EEPROM yongasıyla birlikte satışa sunulmaktadır, yalnızca ağırlık katar:

    Gerekli parçalara ek olarak modül kartı üzerinde, işlevi terminallere güç bağlantısını göstermek olan bir LED de bulunmaktadır. Muhtemelen güzellik olsun diye teslim ettiler.

    Böyle bir gerçek zamanlı saat çipiyle çalışırken bilmeniz gereken önemli şey, ondan nasıl veri çıkarılacağı veya oraya nasıl yazılacağıdır. Saatin bir I 2 C arayüzü vardır.Veri yazmak için (ve bu, verileri okumak için de gereklidir), başlatma koşulunu geçmeniz gerekir (bu komutlar, I 2 C donanım veya yazılımı kullanılarak gerçekleştirilir). mikrodenetleyici), daha sonra bit kaydı ile çipin adresini iletin, ardından erişeceğimiz kaydın adresini iletin ve ardından bir bayt veriyi bu kayda aktarın, daha sonra başka bir bayt veri aktarırsanız, bir sonraki kayda yazılır vb. Bitirdiğinizde durma koşulunu geçmeniz gerekir. Yukarıdakilerin şekilde grafiksel gösterimi:

    Veri kaydı, ilk kurulum ve güncel saatin ayarlanması için gereklidir. Daha sonra sürekli olarak güncel saat ve tarihle ilgili verileri almamız gerekiyor. Bunu yapmak için bu bilgiyi saklayan kayıtlardan okumak gerekir. Okuma iki prosedürden oluşur - istenen kayda bir işaretçi koymak ve onu okumak. İstenilen kayda bir işaretçi ayarlamak için, başlangıç ​​​​koşulunu geçmeniz, ardından yazma biti ile çipin adresini ve kayıt adresiyle birlikte bir baytı iletmeniz gerekir. Sonraki ya bir durdurma koşulu ve ardından bir başlangıç ​​koşulu ya da yalnızca yeniden başlatmadır. Şimdi ikinci prosedür doğrudan kayıtlardan okumaktır. Başlatma iletilir, ardından mikro devrenin adresini bir okuma biti ile göndermeniz ve ardından gerekli sayıdaki kayıtları okumanız ve tamamlandığında durdurma koşulunu iletmeniz gerekir. Kayıttan bilgi okunmuşsa, işaretçi, mikro denetleyicinin (aygıt yöneticisi) gereksiz eylemlerine gerek kalmadan otomatik olarak bir sonraki kayda geçer. Şekil, I 2 C arayüzünü kullanarak kayıtların okunmasıyla ilgili yukarıda söylenen her şeyi göstermektedir:

    Çip adresi:

    • kayıt için - 0b11010000
    • okumak için - 0b11010001

    C kodu şöyle görünecek:

    // saatli fonksiyonlar ============================================== =============== ==================================== ================== ======== // başlangıç ​​ayarları başlatılıyor void RTC_init(void)( i2c_start_cond(); // i2c başlatılıyor i2c_send_byte(RTC_adr_write); // cihaz adresini aktarma, kayıt modu i2c_send_byte(0x0E); // bellek adresini aktarma i2c_send_byte(0b00100000); // sıcaklık dönüşümünü başlat ve 1 Hz'de çıkış i2c_send_byte(0b00001000); // 32 kHz çıkışını etkinleştir i2c_stop_cond(); // i2c'yi durdur ) // saati ve tarihi al void RTC_read_time(void)( i2c_start_cond() ; // i2c'yi başlat i2c_send_byte(RTC_adr_write); // cihaz adresini aktar, yazma modu i2c_send_byte(0x00); // hafıza adresini aktar i2c_stop_cond(); // i2c'yi durdurun i2c_start_cond(); // i2c'yi başlatın i2c_send_byte(RTC_adr_read); // cihaz adresi gönderiliyor, okuma modu sec = bcd(i2c_get_byte(0)); // saniye okunuyor, ACK min = bcd(i2c_get_byte) (0)); // okuma dakikaları, ACK saati = bcd(i2c_get_byte(0)); / / okuma saati, ACK wday = bcd(i2c_get_byte(0)); // haftanın gününü okuyoruz, ACK günü = bcd(i2c_get_byte(0)); // sayıyı okuyoruz, ACK ayı = bcd(i2c_get_byte(0)); // okuma ayı, ACK yılı = bcd(i2c_get_byte(1)); // yılı okuma, NACK i2c_stop_cond(); // i2c'yi durdur ) // zamanı ayarla void RTC_write_time(unsigned char hour1, unsigned char min1, unsigned char sec1)( i2c_start_cond(); // i2c'yi başlat i2c_send_byte(RTC_adr_write); // cihaz adresini aktar, kayıt modu i2c_send_byte( 0x00) ; // bellek adresinin aktarımı i2c_send_byte(bin(sec1)); // 0x00 saniye (saniyelerin de belirtilmesi tavsiye edilir mi?) i2c_send_byte(bin(min1)); // 0x01 dakika i2c_send_byte(bin(saat1)) ; // 0x02 saat i2c_stop_cond(); // i2c'yi durdur ) // tarihi ayarla void RTC_write_date(unsigned char wday, unsigned char day, unsigned char ay, unsigned char yıl)( i2c_start_cond(); // i2c'yi başlat i2c_send_byte(RTC_adr_write) ); // cihaz adreslerini aktarın, kayıt modu i2c_send_byte(0x03); // hafıza adresini aktarın i2c_send_byte(bin(wday)); // 0x03 haftanın günü (Pazar - 1, Pazartesi 2, Salı 3, Çarşamba 4, 5 Per, 6 Cum, 7 Cumartesi ) i2c_send_byte(bin(gün)); // 0x04 gün ay i2c_send_byte(bin(ay)); // 0x05 ay i2c_send_byte(bin(yıl)); // 0x06 yıl i2c_stop_cond(); // i2c'yi durdurun ) // sıcaklığı okuyun void RTC_read_temper(void)( i2c_start_cond(); // i2c'yi başlatın i2c_send_byte(RTC_adr_write); // cihaz adresini aktarın, yazma modu i2c_send_byte(0x11); // hafıza adresini aktarın i2c_stop_cond (); // i2c'yi durdur i2c_start_cond(); // i2c'yi başlat i2c_send_byte(RTC_adr_read); // cihaz adresini ilet, okuma modu t1 = i2c_get_byte(0); // MSB sıcaklığını oku t2 = i2c_get_byte(1); // oku LSB sıcaklığı i2c_stop_cond (); // i2c'yi durdur t2=(t2/128); // 6 birim kaydırma - hassasiyet 0,25 (2 bit) // 7 birim kaydırma - hassasiyet 0,5 (1 bit) t2=t2*5; )

    Mikro devreyle çalışmak için kullanılan tüm kaynak kodu budur; saat birkaç gün içinde bir saniye bile kaybetmediği için saat hızının ayarlanması etkilenmedi.

    Evet - harika bir özellik DS3231, aynı çipin bir termometrenin işlevlerini (aksi takdirde sıcaklık telafisi nasıl yapılır) ve mevcut sıcaklığı okuma yeteneğini yerine getirmesidir. Maksimum sıcaklık çözünürlüğü 0,25 santigrat derecedir. Ayrıca sıcaklık güncelleme süresi oldukça uzundur - yaklaşık 1 dakika. Evet, hızlı bir şekilde güncellememize gerek yok.

    Tüm saat yapısının şeması şuna benzer:

    Mikrodenetleyici, yaygın bulunabilirliği ve düşük fiyatı nedeniyle Atmega8 tarafından seçildi. Bu mikrodenetleyici hem DIP-28 paketinde hem de TQFP-32 paketindeki SMD versiyonunda kullanılabilir. PC6 pininde rastgele gürültü oluşması durumunda mikro denetleyicinin kendiliğinden yeniden başlatılmasını önlemek için direnç R3 gereklidir. Direnç R3, artı gücü bu pime çekerek, bunun üzerinde güvenilir bir potansiyel oluşturur. Görüntüleme için sıvı kristal ekran (LCD) kullanılır. Ben 2004A ekranını kullandım - 20 karakterlik 4 satır güzellik açısından daha fazladır, bu nedenle daha tanıdık bir ekran kullanabilirsiniz - 16 karakterlik 2 satır. LCD ekran, dört bitlik bir sistem kullanılarak mikro denetleyiciye bağlanır. Ekrandaki karakterlerin kontrastını ayarlamak için değişken direnç R2 gereklidir. Bu direncin kaydırıcısını döndürerek bizim için ekrandaki en net okumaları elde ediyoruz. LCD ekranın arka aydınlatması, ekran kartındaki “A” ve “K” pinleri aracılığıyla düzenlenir. Arka ışık, akım sınırlayıcı bir direnç - R1 aracılığıyla açılır. Değer ne kadar yüksek olursa ekranın arka aydınlatması da o kadar sönük olur. Ancak arka ışığın zarar görmemesi için bu direncin ihmal edilmemesi gerekir. S1 - S4 düğmeleri saat ayarlarını kontrol eder. LED alarmın çaldığını gösterir. LED bir çeşit ses devresiyle değiştirilebilir. R5 - R8 dirençleri yukarı çekilir ve saat çipinin terminallerinde dikdörtgen darbelerin oluşması için gereklidir. Bu aynı zamanda I2C protokolünün doğru çalışması için de gereklidir. Devreye güç sağlamak için L7805 doğrusal stabilizatör yongası kullanılır; beş voltluk doğrusal dengeleyici KR142EN5A'nın yerli bir analogu ile değiştirilebilir veya devredeki bağlantısına göre başka bir voltaj dengeleyici yongası kullanabilirsiniz (örneğin, LM317 veya anahtarlama stabilizatörleri LM2576, LM2596, MC34063 vb.). Daha sonra, 5 volt başka bir mikro devre - AMS1117 tarafından 3,3 volt çıkış sağlayan bir versiyonda stabilize edilir. Veri sayfasına göre saat çipi 3,3 voltluk bir voltajla çalışıyor. Ancak maksimum voltaj 5,5 volttur. Bu nedenle, bu dengeleyici sizin takdirinize bağlı olarak kullanılabilir veya kullanılmayabilir. AMS1117 voltaj dengeleyici aynı zamanda ADJ versiyonu (AMS1117ADJ) ile de değiştirilebilir - yani ayarlanabilir bir versiyon, bu seçimle gerekli voltajı ayarlamanız gerekecektir.veri sayfasına uygun olarak mikro devreye bağlı iki direnç kullanarak.

    Devre, ATmega8 mikrokontrolcüsü için bir geliştirme kartı kullanılarak monte edildi ve hata ayıklaması yapıldı:

    Düğmelerin amacı:

    • S1 - alarm sinyalini kapatır veya herhangi bir ayar menüsünden ana menüye çıkar
    • S2- mikrodenetleyici sıfırlama
    • S3 - ayarlar menüsünde saati veya tarihi değiştirir
    • S4 - ayarlar menüsüne girin ve menüde ilerleyin

    32 kHz pin kristal frekansını kontrol etmek için kullanılabilir. Bu pin'e bir frekans ölçer veya osiloskop bağlayıp frekansı kontrol ediyoruz:

    Osilogramın ekran görüntüsünden görülebileceği gibi, frekans yaklaşık olarak 32.768 kHz'e karşılık gelir (yaklaşık olarak frekans ölçümlerinin çözünürlüğündeki sınırlamalar nedeniyle ve "gözle" bu kadar doğru bir şekilde belirlenmesi zordur).

    Sonuç olarak aşağıdaki özelliklere sahip bir saat ortaya çıktı:

    • zaman göstergesi
    • tarih ekranı
    • haftanın günü göstergesi
    • çalar saat etkinlik göstergesi
    • Mikrodenetleyiciden sinyal çıkışı olan 1 alarm saati
    • ortam sıcaklığı göstergesi (yazılımda yalnızca pozitif sıcaklık uygulanır; negatif sıcaklığın bize faydası olmadığını düşünüyorum)
    • alarm ayarları
    • zaman Ayarları
    • tarih ayarları
    • Arkadan aydınlatmalı LCD ekran
    • ayarları kaydetme ve ana güç kapatıldığında saatin devam ettirilmesi

    Özetleyelim. DS3231 gerçek zamanlı saat çipi mükemmel bir çözümdür. Doğruluk bazı DS1307 veya üstüyle karşılaştırılabilir ancak PCA/PCF2129 yine de onunla rekabet edebilir. İncelediğim gerçek zamanlı saat çipleri arasında bu örnek şu anda işlevsellik ve doğruluk açısından ilk sırada yer alıyor.

    Atmega8 mikrokontrolcüyü programlamak için sigorta bitlerinin konfigürasyonunu bilmeniz gerekir (programda alınan ekran görüntüsü):

    Makaleye Atmega8 mikrodenetleyici için ürün yazılımı, programdaki devre tasarımı ve saatin çalışmasını gösteren bir video eşlik ediyor (en başta alarm çalacak - LED yanacak).

    Radyo elemanlarının listesi

    Tanım Tip Mezhep Miktar NotMağazanot defterim
    IC1 MK AVR 8 bit

    ATmega8

    1 Not defterine
    IC2 Gerçek Zamanlı Saat (RTC)

    DS3231

    1 Not defterine
    VR1 Doğrusal regülatör

    L7805AB

    1 Not defterine
    VR2 Doğrusal regülatör

    AMS1117-3.3

    1 Not defterine
    VD1 Doğrultucu diyot

    1N4148

    1 Not defterine
    C1 470 µF1 Not defterine
    C2, C3, C5, C7 Kapasitör100 nF4 Not defterine
    C4 Elektrolitik kondansatör220 uF1 Not defterine
    C6, C8 Elektrolitik kondansatör10 uF2 Not defterine
    R1 Direnç

    22Ohm

    1 Not defterine
    R2 Düzeltici direnci10 kOhm1 3296W-1-103LF

    DS3231 yongası, yerleşik sıcaklık dengelemeli kuvars osilatörüne sahip, yüksek hassasiyetli bir RTC gerçek zamanlı saattir ve yılda yalnızca ±2 dakikalık zaman kaymasına neden olur. Ek olarak bir alarm fonksiyonu uygulanmıştır ve ayrıca bir kesme çıkışı da mevcuttur. Saat, bağlama elemanları ve pil bölmesiyle birlikte hazır bir Arduino modülü olarak satın alınabilir.

    Modülü buradan sipariş ettim. Diyagram aşağıdaki resimde gösterilmektedir:


    Mikro devre yaygın olarak kullanılanı kullanır. Standart (100 kHz) ve yüksek (400 kHz) veri hızlarını destekler. I2C veriyolundaki mikro devre adresi (7 bit) 1101000'dir. Ek olarak modülde şemada gösterilmeyen I2C belleği (24C32) bulunur.

    Güç Modları

    Mikro devrenin besleme voltajı 2,3...5,5V aralığında olabilir, harici bir kaynak (Vcc hattı) ve akü (Vbat) için iki güç hattı vardır. Harici kaynak voltajı sürekli izlenir ve Vpf=2,5V eşiğinin altına düştüğünde akü hattına geçer. Aşağıdaki tabloda güç hatları arasında geçiş yapma koşulları gösterilmektedir:

    Saatin doğruluğu ortam sıcaklığının izlenmesiyle korunur. Mikro devre, saat üretecinin frekansını ayarlamak için dahili bir prosedür başlatır; ayar miktarı, özel bir frekans-sıcaklık grafiği kullanılarak belirlenir. Prosedür güç uygulandıktan sonra başlar ve her 64 saniyede bir çalışır.

    Şarjı korumak için, pil bağlandığında (Vbat hattına voltaj uygulandığında), Vcc hattındaki voltaj Vpf eşik değerini aşıncaya veya mikro devrenin doğru adresi üzerinden iletilinceye kadar saat üreteci çalışmaz. I2C arayüzü. Saat üreteci başlatma süresi bir saniyeden azdır. Güç verildikten (Vcc) veya I2C arayüzü üzerinden adres alındıktan yaklaşık 2 saniye sonra frekans düzeltme işlemi başlar. Saat üreteci başlatıldığında Vcc veya Vbat mevcut olduğu sürece çalışmaya devam eder. İlk açıldığında tarih ve saat kayıtları sıfırlanır ve aşağıdaki değerlere sahiptir: 01/01/00 – 01 – 00/00/00 (gün/ay/yıl/ – haftanın günü – saat/dakika) /saniye).

    3,63V pil ile çalıştırıldığında akım tüketimi, I2C arayüzü üzerinden veri aktarımı olmadığında 3 µA'dır. Harici 5,5V güç kaynağı ve yüksek I2C veri aktarım hızı kullanıldığında maksimum akım tüketimi 300 µA'ya ulaşabilir.

    Harici sıfırlama fonksiyonu

    RST hattı harici sıfırlama için kullanılabilir ve ayrıca düşük voltaj alarm fonksiyonuna da sahiptir. Hat, dahili bir direnç aracılığıyla yukarıya çekilir; harici bir yukarı çekmeye gerek yoktur. Harici sıfırlama işlevini kullanmak için, RST hattı ile ortak kablo arasına bir düğme bağlanabilir; mikro devrede temas sıçrama koruması vardır. RST hattı düşük bir mantık seviyesine ayarlandığında, besleme gerilimi Vcc eşik değeri Vpf'nin altına düştüğünde alarm fonksiyonu etkinleştirilir.

    DS3231 kayıtlarının açıklaması

    Aşağıdaki tabloda gerçek zamanlı saat kayıtlarının bir listesi gösterilmektedir:

    AdresD7D6D5D4D3D2D1D0İşlevSınırlar
    0x000 10 saniyeSaniyeSaniye00-59
    0x010 10 dakikadakikadakika00-59
    0x020 12/24 AM/PM10 saatSaatKol saati1-12 + AM/PM veya 00-23
    10 saat
    0x030 0 0 0 0 GünHaftanın günü1-7
    0x040 0 10'uncuSayıtarih01-31
    0x05Yüzyıl0 0 10 ayAyAy/yüzyıl01-12 + Yüzyıl
    0x0610 yılYılYıllar00-99
    0x07A1M110 saniyeSaniyeSaniye, 1. alarm00-59
    0x08A1M210 dakikadakikaDakika, 1. alarm00-59
    0x09A1M312/24 AM/PM10 saatSaatSaat, 1. alarm1-12 + AM/PM veya 00-23
    10 saat
    0x0AA1M4DY/DT10'uncuGünHaftanın günü, 1. alarm1-7
    SayıTarih, 1. alarm01-31
    0x0BA2M210 dakikadakikaDakika, 2. alarm00-59
    0x0CA2M312/24 AM/PM10 saatSaatSaat, 2. alarm1-12 + AM/PM veya 00-23
    10 saat
    0x0DA2M4DY/DT10'uncuGünHaftanın günü, 2. alarm1-7
    SayıTarih, 2. alarm01-31
    0x0EEOSCBBSQWDÖN.RS2RS1INTCNA2IEA1IEAyarlar kaydı (Kontrol)
    0x0FOSF0 0 0 EN32kHzBSYA2FA1FDurum Kaydı
    0x10İMZAVERİVERİVERİVERİVERİVERİVERİYaşlandırma Ofset Kaydı
    0x11İMZAVERİVERİVERİVERİVERİVERİVERİSıcaklık kaydı, yüksek bayt
    0x12VERİVERİ0 0 0 0 0 0 Sıcaklık kaydı, düşük bayt

    Zaman bilgisi ikili ondalık formatta saklanır, yani ondalık sayının her basamağı (0'dan 9'a kadar) 4 bitlik bir grup olarak temsil edilir. Bir bayt durumunda, düşük yarım bayt birleri, yüksek yarım bayt onlarcayı vb. sayar. Zaman, 0x00-0x06 adresli kayıtlarda sayılır; saatleri saymak için 12 veya 24 saat modunu seçebilirsiniz. Saat kaydının 6. bitinin ayarlanması (adres 0x02), 5. bitin günün saatini gösterdiği, 1 değerinin öğleden sonraya (PM), 0 değerinin öğleden sonraya (AM) karşılık geldiği 12 saatlik modu ayarlar. 6. bitin sıfır değeri 24 saatlik moda karşılık gelir, burada 5. bit saatlerin sayılmasında rol oynar (20-23 değerleri).

    Haftanın günü kaydı gece yarısı, 1'den 7'ye kadar sayılarak artırılır, ay kaydı (adres 0x05), yıl sayma kaydı (adres 0x06) 99'dan 00'a taştığında değişen Yüzyıl bitini (7. bit) içerir. .

    DS3231 yongası iki alarm saati uygular; 1. alarm saati, 0x07-0x0A adresli kayıtlar kullanılarak yapılandırılır, 2. alarm saati, 0x0B-0x0D kayıtları kullanılarak yapılandırılır. A1Mx ve A2Mx bitleri, alarmlara yönelik çeşitli modları yapılandırmak için kullanılabilir; bitin ayarlanması, karşılık gelen kaydı karşılaştırma işleminin dışında bırakır. Aşağıdaki tablolarda farklı alarm modları için bit kombinasyonları gösterilmektedir:

    Tablolarda belirtilmeyen bit kombinasyonları alarmların hatalı çalışmasına neden olur. DY/DT biti temizlenirse alarm saati için tarih eşleşmesi (ayın günü) izlenir; DY/DT biti ayarlandığında haftanın gününün eşleşmesi kontrol edilir.

    Çoğu fonksiyon Kontrol kaydında yapılandırılır. EOSC biti saat üretecinin başlatılmasını kontrol eder, bitin sıfırlanması saat üretecini başlatır. Bitin ayarlanması jeneratörü yalnızca pil modu (Vbat) için durdurur. Harici bir kaynaktan (Vcc) güç verildiğinde osilatör, EOSC bitinin durumuna bakılmaksızın her zaman çalışır. Etkinleştirildiğinde varsayılan bit değeri 0'dır.

    BBSQW bitinin ayarlanması, INT/SQW çıkışının (3. pin) harici güç olmadığında pil gücü modunda çalışmasına olanak tanır. Bit sıfıra ayarlandığında, eğer harici kaynak voltajı Vcc eşik değeri Vpf'nin altına düşerse INT/SQW çıkışı durum 3'e (devre dışı) geçer. Güç uygulandıktan sonra varsayılan bit değeri 0'dır.

    CONV biti zorunlu sıcaklık ölçümünden sorumludur; bitin ayarlanması, saat üreteci frekansının da ayarlandığı dönüştürme sürecini başlatır; ölçüm sonucu, 0x11, 0x12 adresli kayıtlarda bulunur. Başlatma yalnızca önceki dönüştürme tamamlanmışsa mümkündür; başlamadan önce BSY meşgul bayrağını kontrol etmeniz gerekir. Zorunlu sıcaklık dönüşümü, dahili 64 saniyelik frekans ayar döngüsünü etkilemez. CONV bitinin ayarlanması BSY bayrağını 2 ms boyunca etkilemez. CONV ve BSY bitleri, dönüştürme tamamlandıktan sonra otomatik olarak temizlenir.

    RS2, RS1 bitleri, INT/SQW çıkışındaki dikdörtgen darbelerin (kare dalga) frekansını ayarlar. Varsayılan olarak, etkinleştirildiğinde bitler 1'e ayarlanır. Aşağıdaki tablo olası bit kombinasyonlarını gösterir:

    INTCN biti INT/SQW çıkışını kontrol eder. Bit sıfırlanırsa, çıkışta frekansı RS2, RS1 bitleri tarafından ayarlanan dikdörtgen darbeler (kare dalgalar) görünür. INTCN biti ayarlandığında çıkış, alarm kesintileri oluşturmak için kullanılır. Varsayılan olarak bit değeri 1'dir. Çıkış tipi INT/SQW - açık drenajdır, bu nedenle onu bir direnç aracılığıyla yüksek mantık seviyesine çekmek gerekir, aktif seviye düşüktür.

    A1IE, A2IE bitlerinin ayarlanması sırasıyla 1. ve 2. alarm sinyallerinde kesintileri etkinleştirir. Bitleri sıfırlayın, kesintileri devre dışı bırakın. Varsayılan değer 0'dır.

    Durum kaydı olay bayraklarını içerir ve 32 kHz çıkışını kontrol eder. OSF bayrağı saat üretecinin durumunu yansıtır; 1 değeri saat üretecinin durdurulduğu anlamına gelir; bu olay aşağıdaki durumlarda meydana gelebilir:

    • Güç uygulandıktan sonra ilk kez
    • Pil veya harici voltaj saat üretecini çalıştırmak için yeterli değil
    • Jeneratör, EOSC bitinin pil modunda ayarlanmasıyla kapatılır
    • Kristal osilatörü etkileyen dış faktörler (gürültü, sızıntı vb.)

    Ayarlandıktan sonra bit değeri değişmez; bitin manuel olarak sıfırlanması gerekir.

    EN32kHz bitinin ayarlanması, 32kHz çıkışta (1. pin) dikdörtgen darbelerin (kare dalgalar) üretilmesine olanak tanır, darbe frekansı sabittir ve 32,768 kHz'e eşittir. Bitin sıfırlanması bu işlevi devre dışı bırakır ve çıkışı 3. duruma (yüksek giriş empedansı) taşır. Varsayılan olarak bit değeri 1'dir; güç uygulandıktan sonra çıkışta darbeler görünür. Çıkış tipi 32kHz açık drenajdır, bu nedenle yüksek mantık seviyesine yükseltme gerektirir.

    BSY meşgul bayrağı sıcaklık dönüştürme ve saat ayarlama işlemi sırasında ayarlanır. Dönüşüm tamamlandığında bayrak sıfırlanır.

    A1F, A2F alarm saati bayrakları, zaman sayma kayıtlarının ve alarm saati kayıtlarının değerleri eşleştiğinde ayarlanır. Alarm kesintileri A1IE, A2IE etkinleştirilirse ve bir kesme çıkışı atanırsa (INTCN biti ayarlanır), o zaman INT/SQW çıkışında bir kesme sinyali görünür (yüksek mantık seviyesinden düşük mantık seviyesine geçiş). Bayrakların manuel olarak 0 değeri yazılarak sıfırlanması gerekmektedir.

    Yaşlanma Ofseti kaydı saat üreteci frekansını ayarlamak için tasarlanmıştır. Bir sıcaklık değişikliği tespit edilirse ve ayrıca sıcaklık dönüşümü CONV biti tarafından tetiklendiğinde, dahili ayarlama prosedürü sırasında kayıt değeri osilatör frekansına eklenir. Ofset değeri işaretlenir, yani pozitif değerler (1-127) frekansı azaltır, negatif değerler (128-255) arttırır. Aynı ofset için frekans değişimi sıcaklığa bağlı olarak farklı olacaktır. +25°C'de frekans değişimi 0,1 ppm/LSB olacaktır.

    Mevcut sıcaklık değeri, sırasıyla yüksek ve düşük bayt olan 0x11 ve 0x12 adresli kayıtlarda saklanır, kayıtlardaki sıcaklık değeri periyodik olarak güncellenir. Sola hizalama ayarlanmıştır, çözünürlük 10 bit veya 0,25°C/LSB'dir, yani yüksek bayt sıcaklığın tamsayı kısmını içerir ve düşük kayıtlardaki 6., 7. bitler kesirli kısmı oluşturur. Yüksek baytta 7. bit sıcaklığın işaretini belirtir; örneğin 00011011 01 değeri +27,25 °C sıcaklığa, 11111110 10 değeri -2,5 °C sıcaklığa karşılık gelir.

    Zaman kayıtlarını okurken, ek bir tampon kullanılması, yani birden fazla kaydın ayrı ayrı değil aynı anda okunması tavsiye edilir, çünkü bireysel okuma işlemleri arasında zaman kayıtları değerlerini değiştirebilir. Hesap kayıtlarına yeni veriler yazarken de bu kurala uyulması önerilir. Saniye kaydına yeni bir değer yazılması saati 1 saniye duraklatır, bu süre içinde kalan kayıtların yeniden yazılması gerekir.

    DS3231'i bir mikro denetleyiciye bağlama

    Saati bir PIC16F628A mikrodenetleyiciye bağladım ve kullandım. Bağlantı şeması aşağıda gösterilmiştir:


    Güç verildikten sonra göstergelerde tire işaretleri (– – – – – –) görüntülenir, ardından saat başlatılır, saat üretecinin başlatılması için gerekli olan zaman değeri 1 saniye gecikmeyle göstergelerde görünür. Göstergeler, ondalık noktayla ayrılmış olarak saatleri, dakikaları ve saniyeleri görüntüler ve saat formatı 24 saattir. SB1 “Gösterge” düğmesini kullanarak, göstergelerin sıcaklığı ve ayrıca 2 Hz frekansında yanıp sönen ondalık noktayla ayrılmış saat ve dakika değerini görüntüleyeceği ekran formatını değiştirebilirsiniz. Sıcaklık kesirli bir kısım olmadan görüntülenir; program yalnızca 0x11 adresindeki sıcaklık depolamanın yüksek baytını okur.

    Zaman değeri, 1. alarm sinyali tarafından kontrol edilen SQW/INT hattındaki bir kesinti yoluyla saatten okunur; saatin başlatılması sırasında alarm saati, her ikinci sinyale ayarlanır. HL1 LED'i gösterge görevi görür ve kesme sinyalinde her saniye yanıp söner. I2C arayüzü üzerinden veri aktarımında bir hata olması durumunda HL2 LED'i yanar.

    Ayrıca programa SB2 “Ayarlar”, SB3 “Kurulum” butonlarını kullanarak saat ayarlama özelliğini ekledim. SB2 düğmesine basılarak kurulum moduna girilir; göstergelerde dakika ve saniye yerine 00 saat ve çizgiler görüntülenir (00 – – – –). SB3 düğmesini kullanarak saat değerini ayarlarsınız (her basışta artar), ardından SB2 düğmesine bastığınızda dakikalar düzenlenir; çizgi yerine 00 dakika görüntülenecektir. SB3 düğmesi ayrıca gerekli değeri vb. ayarlar. Saniyeleri düzenleyip SB2 tuşuna bastıktan sonra saatteki saat yeniden yazılır ve güncellenen saat göstergelerde görüntülenir.

    Program kodunun bir kısmı aşağıda verilmiştir (tam sürüm makalenin sonunda indirilebilir):

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; #katmak LIST p=16F628A __CONFIG H"3F10" ;Mikrodenetleyici yapılandırma hata düzeyi -302 ;Sec equ 0020h listesinde hata 302 olan mesajları görüntüleme;yardımcı hesap kayıtları Sec1 equ 0021h ; Sec2 eşdeğeri 0022h; scetbit equ 0024h;bit sayısını saymak için yardımcı kayıt perem equ 0025h;spi aracılığıyla bayt alımı/iletimi için yardımcı kayıt, i2c temp equ 0026h;sıcaklık kaydı perem_1 equ 0027h;ikili-ondalık dönüştürücü için yardımcı kayıt. result equ 0028h; ikili-ondalık dönüştürücü yardımcı kaydı dat_ind equ 0029h ;spi protokolü aracılığıyla aktarım için veri kaydı adr_ind equ 002Ah ;spi protokolü aracılığıyla aktarım için adres kaydı ikinci equ 002Bh ;zamanı ayarlamak için saniye depolama kaydı minut equ 002Ch ;saat saat equ 002Dh'yi ayarlamak için dakika depolama kaydı; zaman ayarları için saat depolama kaydı adr_i2c equ 002Eh ;i2c arayüzü veri aktarımı alt yordamının kayıtları tmp_i2c equ 002Fhslave_adr equ 0030h data_i2c equ 0031h flag equ 007Fh ;flag Register #DEFINE int PORTB,0 ;interrupt line INT/SQW DS3231 #DEFINE s da PORTB ,1 ;DS3231 bağlantıları için SDA hattı #DEFINE scl PORTB,2 ;DS3231'i bağlamak için SCL hattı #DEFINE sda_io TRISB,1 ;SDA hattının yönü #DEFINE scl_io TRISB,2 ;SCL hattının yönü #DEFINE datai PORTB,5 ;MAX7219 sürücüsünün veri giriş satırı #DEFINE cs PORTB ,6 ;sürücü seçim satırı MAX7219 #DEFINE clk PORTB,7 ;sürücü saat satırı MAX7219 #DEFINE ledi PORTB,4 ;i2c hata LED'i #DEFINE led_sec PORTB,3 ;saat ilerleme göstergesi LED 1Hz #DEFINE regim PORTA,2 ;Gösterge düğmesi - ekran modunu değiştirme #DEFINE nast PORTA,3 ;Ayar düğmesi - zaman ayar moduna giriş #DEFINE ust PORTA,4 ;Ayar düğmesi - saat değerini ayarlama;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h ;program yürütmeyi 0000h adresinden başlatın, Başlat'a gidin;Başlat etiketine gidin ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Ana program Start movlw b"00000000" ;port A movwf PORTA'nın çıkış mandallarının değerlerinin ayarlanması; movlw b"01000000" ;B bağlantı noktasının çıkış mandallarının değerlerini ayarlayın movwf PORTB ; movlw b"00000111" ; karşılaştırıcıları kapat movwf CMCON ; bsf STATUS,RP0 ;1. sırayı seçin movlw b"00000111" ;port B'nin giriş/çıkış hatlarını ayarlayın movwf TRISB ;RB0-RB2 - giriş için, geri kalanı çıkış için movlw b"11111111" ;giriş/çıkış hatlarını ayarlayın A bağlantı noktasının çıkış satırları movwf TRISA; bcf girişi için tüm satırlar STATUS,RP0 ;banka 0 clrf işaretini seçin; bayrak kaydını sıfırlayın init_lcd'yi çağırın; sürücü başlatma alt yordamını çağırın (MAX7219) viv_not'u çağırın; kısa çizgi sembollerini çıkarın " ------ " ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;; movlw b"11010000" ;cihaz adresi (DS3231) movwfslave_adr ;i2c aracılığıyla alma/iletme kayıtlarına 4 bayt yazar;burada 1. alarm yapılandırılır, her saniye bip sesi çıkarır movlw data_i2c ;i2c movwf FSR aracılığıyla ilk alma/iletme kaydını ayarlar ; movlw b"10000000" ;1. alarm movwf INDF'nin saniye kaydına ait veriler; FSR,F dahil; movlw b"10000000" ;1. alarm movwf INDF'nin dakika kaydına ait veriler; FSR,F dahil; movlw b"10000000" ;1. alarm saatinin saat kaydına ilişkin veriler movwf INDF ; FSR,F dahil; movlw b"10000000" ;1. alarm movwf INDF'nin tarih/haftanın günü kaydına ilişkin veriler; hareket. 4 ;i2c movwf tmp_i2c aracılığıyla 4 bayt aktarın; movlw 0x07 ;1. alarm saatinin saniye kaydının adresini ayarlama movwf adr_i2c ; write_i2c'yi çağırın; i2c arayüzü aracılığıyla yazma alt yordamını çağırın err_prov'u çağırın; I2C yazma/okuma hatalarını kontrol edin movlw .1; 1. baytı i2c movwf tmp_i2c aracılığıyla aktarın; movlw 0x0E ;Kontrol kaydının adresini ayarlama movwf adr_i2c ; movlw data_i2c ;i2c movwf FSR aracılığıyla ilk gönderme/alma kaydını ayarlama; movlw b"00000101" ;saat üretecini başlatın, movwf INDF için INT/SQW pininin çalışmasını yasaklayın; pil gücü modu, INT/SQW çıkışındaki darbe frekansı 1Hz'dir; INT/SQW çıkışı alarm oluşturmak için kullanılır saat kesintileri, ;alarm saat kesintilerini etkinleştir 1. alarm çağrısı write_i2c ;i2c arayüzü aracılığıyla kayıt altprogramını çağırma err_prov çağrısı ;I2C yazma/okuma hatalarını kontrol etme met_2 movlw .1 ;1. baytı i2c movwf tmp_i2c aracılığıyla aktarma; movlw 0x0F ;Durum kaydının adresini ayarlama movwf adr_i2c ; movlw data_i2c ;i2c movwf FSR aracılığıyla ilk gönderme/alma kaydını ayarlama; movlw b"00000000" ;OSF bitini sıfırlayın, EN32kHz çıkışında darbe oluşumunu yasaklayın, movwf INDF ;alarm kesme bayraklarını sıfırlayın A2F, A1F write_i2c'yi çağırın; i2c arayüzü aracılığıyla kayıt alt rutinini çağırın err_prov'u çağırın; I2C yazımı kontrol edin /okuma hataları met_1 btfsc int; met_3'e giden alarm kesme hattını yoklama; bsf led_sec ;saat ilerleme göstergesi LED'ini açın, met_4'e gidin; met_3 bcf led_sec ;saat ilerleme göstergesi LED'ini kapatır btfsc nast ;met_5'e giden saat ayar düğmesini çağırır; nast_time'ı çağırın; met_2'ye giden zamanı ayarlamak için alt yordamı çağırın; met_5 btfsc regim ;gösterge modu düğmesinin yoklaması met_1'e gidin; met_6 çağrı paus_knp ; btfss rejimi; met_6'ya git; btfss bayrağı,2 ;gösterge modu bayrağının değerini met_7'ye değiştirin; bcf bayrağı,2 ;gösterge bayrağını sıfırla, saat görüntüleme modu met_1'e git; met_7 bsf bayrağı,2 ;gösterge bayrağını, sıcaklığı ve saat görüntüleme modunu ayarlama met_1'e gidin; met_4 movlw .1 ;1. baytı i2c movwf tmp_i2c aracılığıyla iletme; movlw 0x11 ;yüksek sıcaklık yazmacının adresini ayarlama movwf adr_i2c ; read_i2c'yi çağırın; I2C aracılığıyla okuma alt yordamını çağırın err_prov'u çağırın; I2C yazma/okuma hatalarını kontrol edin movf INDF,W; sıcaklık değerini geçici kayıt defterine kopyalayın movwf temp rd_time movlw .3; i2c movwf tmp_i2c aracılığıyla 3 baytı aktarın; movlw 0x00 ;saniye kayıt adresinin ayarlanması movwf adr_i2c ; read_i2c'yi çağırın; I2C yoluyla okuma alt yordamını çağırın err_prov'u çağırın; I2C yazma/okuma hatalarını kontrol edin btfsc bayrağı,2; gösterge modu bayrağının yoklaması met_8'e gidin; vivod'u çağır; saat değerini dijital ekranda görüntülemek için met_2'ye giden alt programı çağır; met_8 çağrı vivod_temp ;dijital ekranda sıcaklık ve saati görüntülemek için alt yordamı çağırmak için met_2'ye gidin;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    #katmak

    CONFIG H"3F10" ;Mikrodenetleyici konfigürasyonu

    errorlevel -302 ;listede 302 hata mesajını gösterme

    Sec equ 0020h; yardımcı hesap kayıtları

    Sec1 eşdeğeri 0021h;

    Sec2 eşdeğeri 0022h;

    scetbit equ 0024h;yardımcı kayıt bitlerinin sayılması

    perem equ 0025h; spi, i2c aracılığıyla yardımcı bayt alım/iletim kaydı

    temp equ 0026h;sıcaklık kaydı

    perem_1 equ 0027h ;BCD yardımcı kayıtçı

    result equ 0028h; ikili-ondalık dönüştürücü yardımcı kaydı

    dat_ind equ 0029h ;spi protokolü aracılığıyla iletim için veri kaydı

    adr_ind equ 002Ah ;spi protokolü aracılığıyla iletim için adres kaydı

    saniye equ 002Bh;saati ayarlamak için saniye saklama kaydı

    minut equ 002Ch;saati ayarlamak için dakika saklama kaydı

    saat equ 002Dh;saati ayarlamak için saat saklama kaydı

    adr_i2c equ 002Eh ;i2c arayüzü veri aktarımı alt yordamının kayıtları

    tmp_i2c eşdeğeri 002Fh

    köle_adr eşdeğeri 0030h

    data_i2c eşdeğeri 0031h

    flag equ 007Fh ;bayrak kaydı

    #DEFINE int PORTB,0 ;interrupt satırı INT/SQW DS3231

    #DEFINE sda PORTB,1 ;DS3231'i bağlamak için SDA hattı

    #DEFINE scl PORTB,2 ;DS3231'i bağlamak için SCL hattı

    #DEFINE datai PORTB,5 ;MAX7219 sürücüsünün veri giriş satırı

    #DEFINE cs PORTB,6 ;sürücü seçim satırı MAX7219

    #DEFINE clk PORTB,7 ;MAX7219 sürücüsünün saat satırı

    #DEFINE ledi PORTB,4 ;i2c hata ledi

    #DEFINE led_sec PORTB,3 ;LED saat ilerleme göstergesi 1Hz

    #DEFINE regim PORTA,2 ;Gösterge düğmesi - ekran modunu değiştirir

    #DEFINE nast PORTA,3 ;Ayarlar butonu - zaman ayarlama moduna girer

    #DEFINE ust PORTA,4 ;Set butonu - saat değerini ayarlayın

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    org 0000h ;program yürütmeyi 0000h adresinden başlat

    Başlat'a git;Başlat etiketine git

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    ;Ana program

    movlw b"00000000"'i başlatın; A bağlantı noktasının çıkış mandallarının değerlerini ayarlayın

    movlw b"01000000" ;B portunun çıkış mandallarının değerlerini ayarlayın

    movlw b"00000111" ;karşılaştırıcıları kapat

    bsf STATUS,RP0 ;1. sırayı seç

    movlw b"00000111" ;B noktasının giriş/çıkış hatlarını yapılandırma

    movwf TRISB ;RB0-RB2 - girişe, geri kalanı çıkışa

    movlw b"11111111" ;port A'nın giriş/çıkış hatlarını ayarlama

    movwf TRISA ;girilecek tüm satırlar

    bcf STATUS,RP0 ;banka 0'ı seç

    clrf flag ;bayrak kaydını sıfırla

    init_lcd'yi çağırın; sürücü başlatma rutinini çağırın (MAX7219)

    viv_not'u çağır; göstergelere " ------ " çizgi sembollerini çıkar

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

    movlw b"11010000" ;cihaz adresi (DS3231)

    ;i2c üzerinden alma/iletme yazmaçlarına 4 byte yaz

    movlw data_i2c ;i2c aracılığıyla ilk alma/iletme kaydını ayarlama

    movlw b"10000000" ;1. alarmın saniye kaydına ilişkin veriler

    movlw b"10000000" ;1. alarmın dakika kaydına ilişkin veriler

    movlw b"10000000" ;1. alarm saati kaydına ilişkin veriler

    movlw b"10000000" ;1. alarmın tarih/haftanın günü kaydına ilişkin veriler

    movlw .4 ;i2c aracılığıyla 4 bayt aktarın

    movlw 0x07 ;1. alarm saatinin saniye kaydının adresini ayarlama

    Birçok Arduino projesinde belirli olayların meydana gelme zamanının izlenmesi ve kaydedilmesi gerekmektedir. Ek bir pille donatılmış gerçek zamanlı saat modülü, cihazın kendisinde güç olup olmamasına bağlı olmaksızın güncel tarihi saklamanıza olanak tanır. Bu yazımızda Arduino kartı ile kullanılabilecek en yaygın RTC modülleri DS1307, DS1302, DS3231'den bahsedeceğiz.

    Saat modülü, kural olarak DS1307, DS1302, DS3231 mikro devrelerinden birini içeren küçük bir karttır.Ayrıca kartta pratik olarak bir pil takma mekanizması bulabilirsiniz. Bu tür panolar genellikle saati, tarihi, haftanın gününü ve diğer kronometrik parametreleri izlemek için kullanılır. Modüller otonom güçle (piller, akümülatörler) çalışır ve Arduino'nun gücü kapatılsa bile saymaya devam eder. En yaygın saat modelleri DS1302, DS1307, DS3231'dir. Arduino'ya bağlı bir RTC (gerçek zamanlı saat) modülünü temel alırlar.

    Saatler, "keneleri" okuyan geleneksel sayaçların ve saat üreteçlerinin aksine, ortalama bir insan için uygun birimlerle (dakikalar, saatler, haftanın günleri ve diğerleri) sayılır. Arduino'nun farklı zaman aralıklarını da okuyabilen özel bir millis() fonksiyonu vardır. Ancak bu fonksiyonun ana dezavantajı, zamanlayıcı açıldığında sıfıra sıfırlanmasıdır. Onun yardımıyla yalnızca zamanı okuyabilirsiniz; tarihi veya haftanın gününü ayarlamak imkansızdır. Bu sorunu çözmek için gerçek zamanlı saat modülleri kullanılır.

    Elektronik devre bir mikro devre, bir güç kaynağı, bir kuvars rezonatör ve dirençler içerir. Kuvars rezonatör, geleneksel bir ikili sayaç için uygun olan 32768 Hz frekansında çalışır. DS3231 devresi, son derece doğru değerlere izin veren yerleşik kuvars ve termal stabilizasyona sahiptir.

    Popüler RTC modülleri DS1302, DS1307, DS3231'in karşılaştırılması

    Bu tabloda en popüler modüllerin ve bunların temel özelliklerinin bir listesini sunduk.

    İsim Sıklık Kesinlik Desteklenen protokoller
    DS1307 1 Hz, 4,096 kHz, 8,192 kHz, 32,768 kHz Kuvarsa bağlıdır - genellikle değer günde 2,5 saniyeye ulaşır, günde 1 saniyeden daha yüksek bir doğruluk elde etmek imkansızdır. Ayrıca doğruluk sıcaklığa bağlıdır. I2C
    DS1302 32.768 kHz günde 5 saniye I2C, SPI
    DS3231 İki çıkış - birincisi 32,768 kHz'de, ikincisi 1 Hz'den 8,192 kHz'e programlanabilir 0C ile 40C arasındaki sıcaklıklarda ±2 ppm.

    -40C ila 85C arasındaki sıcaklıklarda ±3,5 ppm.

    Sıcaklık ölçüm doğruluğu – ±3С

    I2C

    Modül DS1307

    DS1307 zamanlama için kullanılan bir modüldür. DS1307ZN çipi temel alınarak monte edilmiştir, uzun süre otonom çalışmayı sağlamak için güç lityum pilden sağlanır. Karttaki pil arka tarafa monte edilmiştir. Modülün bir AT24C32 yongası vardır - bu, 32 KB'lik kalıcı bir EEPROM belleğidir. Her iki mikro devre de bir I2C veri yolu ile bağlanır. DS1307 düşük güç tüketimine sahiptir ve 2100 yılına ait bir saat ve takvim içerir.

    Modül aşağıdaki parametrelere sahiptir:

    • Güç kaynağı – 5V;
    • -40C ila 85C arası çalışma sıcaklığı aralığı;
    • 56 bayt bellek;
    • Lityum pil LIR2032;
    • 12 ve 24 saatlik modları uygular;
    • I2C arayüz desteği.

    Modül, verilerin oldukça nadiren, bir hafta veya daha uzun aralıklarla okunduğu durumlarda haklı çıkar. Kesintisiz kullanım, pille bile daha fazla voltaj gerektireceğinden bu, güçten tasarruf etmenizi sağlar. Belleğin varlığı, çeşitli parametreleri (örneğin sıcaklık ölçümü) kaydetmenize ve modülden alınan bilgileri okumanıza olanak tanır.

    Diğer cihazlarla etkileşim ve onlarla bilgi alışverişi, SCL ve SDA pinlerinden gelen I2C arayüzü kullanılarak gerçekleştirilir. Devre, gerekli sinyal seviyesini sağlamanıza izin veren dirençler içerir. Kartta ayrıca DS18B20 sıcaklık sensörünün montajı için özel bir yer vardır.Kontaklar 2 gruba, pin aralığı 2,54 mm'ye dağıtılmıştır. İlk kontak grubu aşağıdaki pinleri içerir:

    • DS – DS18B20 sensörü için çıkış;
    • SCL – saat satırı;
    • SDA – veri hattı;
    • VCC-5V;

    İkinci kişi grubu şunları içerir:

    • SQ – 1 MHz;
    • BAT – lityum pil girişi.

    Arduino kartına bağlanmak için kartın kendisine (bu durumda Arduino Uno'yu düşünüyoruz), bir RTC DS1307 gerçek zamanlı saat modülüne, kablolara ve bir USB kablosuna ihtiyacınız var.

    Denetleyiciyi Arduino'ya bağlamak için 4 pin kullanılır - VCC, toprak, SCL, SDA.. Saatten gelen VCC, Arduino'da 5V'ye bağlanır, saatten gelen toprak Arduino, SDA - A4, SCL'den toprağa bağlanır. - A5.

    Saat modülü ile çalışmaya başlamak için DS1307RTC, TimeLib ve Wire kütüphanelerini kurmanız gerekmektedir. RTCLib'i iş için de kullanabilirsiniz.

    RTC modülünün kontrol edilmesi

    İlk kodu çalıştırdığınızda program saniyede bir modülden veri okuyacaktır. İlk olarak, Arduino kartı bilgisayara bağlı değilken modülden pili çıkarıp başka bir pille değiştirirseniz programın nasıl davrandığını görebilirsiniz. Birkaç saniye beklemeniz ve pili çıkarmanız gerekir, sonunda saat yeniden başlatılacaktır. Daha sonra Örnekler→RTClib→ds1307 menüsünden bir örnek seçmeniz gerekiyor. İletim hızının 57600 bps'ye doğru şekilde ayarlanması önemlidir.

    Seri Monitör penceresini açtığınızda aşağıdaki satırların görünmesi gerekir:

    Saat 0:0:0'ı gösterecektir. Bunun nedeni saatin gücünü kaybetmesi ve zamanı saymayı bırakmasıdır. Bu nedenle modül çalışırken pilin çıkartılmaması gerekir.

    Modüldeki saati ayarlamak için çizimdeki çizgiyi bulmanız gerekir.

    RTC.adjust(DateTime(__DATE__, __TIME__));

    Bu satır, gerçek zamanlı saat modülünü flaşlamak için kullanılan bilgisayardan gelen verileri içerecektir. Doğru çalışma için öncelikle bilgisayardaki tarih ve saatin doğru olduğunu kontrol etmeli ve ancak bundan sonra saat modülünü yanıp sönmeye başlamalısınız. Kurulumdan sonra monitör aşağıdaki verileri görüntüleyecektir:

    Kurulum doğru şekilde yapılır ve gerçek zamanlı saatin ayrıca yeniden yapılandırılmasına gerek yoktur.

    Zaman okuma. Modül yapılandırıldıktan sonra zaman istekleri gönderilebilir. Bu, saat ve tarih bilgilerini içeren bir DateTime nesnesi döndüren now() işlevi kullanılarak yapılır. Zamanı okumak için kullanılan çok sayıda kütüphane vardır. Örneğin, RTC.year() ve RTC.hour() - yıl ve saat hakkında ayrı ayrı bilgi alırlar. Onlarla çalışırken bir sorun ortaya çıkabilir: örneğin, saatin 1:19:59 olarak görüntülenmesi talebi yapılacaktır. Saat 1:20:00'ı göstermeden önce saat 1:19:00'ı gösterecek, yani aslında bir dakika kaybedilecek. Bu nedenle, okumanın nadiren gerçekleştiği durumlarda - birkaç günde bir - bu kütüphanelerin kullanılması tavsiye edilir. Zamanı çağırmak için başka işlevler de vardır, ancak hataları azaltmanız veya önlemeniz gerekiyorsa, now() işlevini kullanmak ve gerekli okumaları ondan çıkarmak daha iyidir.

    i2C saat modülü ve ekranıyla örnek proje

    Proje normal bir saat olup, göstergede tam saat görüntülenecek ve sayıların arasındaki iki nokta üst üste saniyede bir yanıp sönecektir. Projeyi uygulamak için bir Arduino Uno kartına, bir dijital göstergeye, bir gerçek zamanlı saate (bu durumda yukarıda açıklanan ds1307 modülü), bağlantı için bir kalkana (bu durumda Troyka Kalkanı kullanılır), saat ve kablolar için bir pil.

    Proje, TM1637 çipinde dört haneli basit bir gösterge kullanıyor. Cihaz iki kablolu bir arayüze sahiptir ve 8 seviyeli monitör parlaklığı sağlar. Yalnızca saati saat:dakika biçiminde görüntülemek için kullanılır. Göstergenin kullanımı kolaydır ve bağlanması kolaydır. Dakikalık veya saatlik veri doğrulamasının gerekli olmadığı projelerde kullanılmasında fayda vardır. Saat ve tarih hakkında daha eksiksiz bilgi elde etmek için LCD monitörler kullanılır.

    Saat modülü I2C veriyoluna ait olan SCL/SDA pinlerine bağlanır. Ayrıca toprak ve gücü de bağlamanız gerekir. Arduino'ya yukarıda anlatıldığı gibi bağlanır: SDA – A4, SCL – A5, modülden topraktan Arduino'ya, VCC -5V.

    Gösterge basit bir şekilde bağlanır; CLK ve DIO pinleri kart üzerindeki herhangi bir dijital pin'e bağlanır.

    Eskiz. Kod yazmak için saati ve göstergeyi başlatmanıza ve derleme süresini kaydetmenize olanak tanıyan kurulum işlevini kullanın. Saatin ekrana yazdırılması döngü kullanılarak yapılacaktır.

    #katmak #include "TM1637.h" #include "DS1307.h" //saat ve ekranla çalışmak için gerekli tüm kitaplıkları eklemeniz gerekir. char compileTime = __TIME__; //derleme zamanı. #define DISPLAY_CLK_PIN 10 #define DISPLAY_DIO_PIN 11 //ekranın bağlı olduğu Arduino çıkışlarından gelen sayılar; void setup() ( display.set(); display.init(); //ekranı bağlayın ve yapılandırın.clock.begin(); //saati açın. bayt saat = getInt(compileTime, 0); bayt dakika = getInt( compileTime, 2); bayt saniye = getInt(compileTime, 4); //zaman alınıyor.clock.fillByHMS(saat, dakika, saniye); //zaman modülüne yazmaya hazırlanıyor.clock.setTime(); //alınan bilgiler dahili belleğe kaydediliyor, zamanı okumaya başlayın. ) void loop() ( int8_t timeDisp; //dört bitin her birinde görüntülenir.clock.getTime();//zaman alma isteği. timeDisp = saat .saat / 10; timeDisp = saat.saat % 10; timeDisp = saat.dakika / 10; timeDisp = saat.dakika % 10; //onlarca, saat birimleri, dakika vb. almak için çeşitli işlemler. display.display( timeDisp); //göstergeye zamanı göster display.point(clock.second % 2 ? POINT_ON: POINT_OFF);//iki noktayı bir saniye sonra açıp kapat. ) char getInt(const char* string, int startIndex) ( return int(string - "0") * 10 + int(string) - "0"; //zamanı iki basamaklı bir tamsayıya doğru şekilde yazmak için yapılan eylemler. Aksi takdirde ekranda yalnızca birkaç sembol görüntülenecektir. )

    Bundan sonra taslağın yüklenmesi gerekiyor ve saat monitörde gösterilecek.

    Program biraz modernize edilebilir. Güç kapatıldığında yukarıda yazılan çizim, ekranın açıldıktan sonra derleme sırasında ayarlanan süreyi göstermesine neden olacaktır. Kurulum fonksiyonunda her defasında 00:00:00'dan derleme başlangıcına kadar geçen süre hesaplanacaktır. Bu karma, güç kesildiğinde tutulan EEPROM'da saklanan değerle karşılaştırılacaktır.

    Geçici olmayan belleğe veya bellekten zaman yazmak ve okumak için EEPROMWriteInt ve EEPROMReadInt işlevlerini eklemeniz gerekir. Hash'in EEPROM'da kayıtlı hash ile eşleşip eşleşmediğini/eşleşip eşleşmediğini kontrol etmeleri gerekir.

    Proje geliştirilebilir. LCD monitör kullanıyorsanız tarih ve saati ekranda gösteren bir proje yapabilirsiniz. Tüm elemanların bağlantısı şekilde gösterilmiştir.

    Sonuç olarak, kodun yeni bir kitaplık belirtmesi (sıvı kristal ekranlar için bu LiquidCrystal'dır) ve tarihi elde etmek için loop() işlevine satırlar eklemesi gerekecektir.

    Çalışma algoritması aşağıdaki gibidir:

    • Tüm bileşenlerin bağlanması;
    • Kontrol edin - monitör ekranındaki saat ve tarih her saniye değişmelidir. Ekrandaki saat yanlışsa çizime RTC.write (tmElements_t tm) fonksiyonunu eklemeniz gerekir. Yanlış saatlerle ilgili sorunlar, saat modülünün kapatıldığında tarih ve saati 01/01/2000 00:00:00 olarak sıfırlamasından kaynaklanmaktadır.
    • Yazma işlevi, bilgisayardan tarih ve saati almanızı sağlar, ardından ekranda doğru parametreler gösterilir.

    Çözüm

    Saat modülleri birçok projede kullanılmaktadır. Ev aletlerinde, belirli bir programa göre çalışan zamanlayıcılar ve kontrol cihazları oluştururken veri kayıt sistemleri için gereklidirler. Yaygın olarak bulunabilen ve ucuz modüller ile alarm saati veya sensör veri kaydedici, SD karta bilgi kaydetme veya saati ekranda gösterme gibi projeler oluşturabilirsiniz. Bu makalede en popüler modül türleri için tipik kullanım senaryolarına ve bağlantı seçeneklerine baktık.