Untuk masuk
Semua rahasia komputer untuk pemula dan profesional
  • Memeriksa dokumen elektronik dalam format xml di portal Rosreestr
  • Unduh minecraft untuk android: semua versi
  • Timekillers untuk Android Unduh game untuk menghabiskan waktu
  • Alkimia Dewa Doodle: Resep Artefak
  • Gagal menginisialisasi game Warface: memperbaiki kesalahan Kesalahan “tidak dapat menemukan file yang ditentukan”
  • The Elder Scrolls Online - Pencopetan - Panduan: cara menghasilkan uang di teso (Pencurian) Unduh video dan potong mp3 - kami permudah
  • Kami menyinkronkan waktu pada modul DS3231 dengan komputer. Diagram koneksi untuk jam real-time DS3231 dan program sederhana

    Kami menyinkronkan waktu pada modul DS3231 dengan komputer.  Diagram koneksi untuk jam real-time DS3231 dan program sederhana

    ". Mari berkenalan dengan modul jam real-time DS3231. Artikel ini berisi instruksi video, daftar program, tujuan dan metode menghubungkan modul dari keluarga DS ke Arduino.

    Modul Jam Waktu Nyata DS3231

    Apa itu Modul Jam Waktu Nyata DS3231?

    Modul jam waktu nyata- ini adalah sirkuit elektronik yang dirancang untuk merekam data kronometrik (waktu saat ini, tanggal, hari dalam seminggu, dll.), dan merupakan sistem yang terdiri dari sumber daya otonom dan alat perekam.

    modul DS3231 Ini pada dasarnya adalah jam tangan biasa. Papan Arduino sudah memiliki sensor waktu bawaan Milis, namun, ini hanya berfungsi jika daya dialirkan ke papan. Jika Anda mematikan lalu menghidupkan Arduino, waktu Millis akan direset ke nol. Dan DS3231 memiliki baterai terpasang, yang, bahkan ketika papan Arduino dilepas, terus “memberi daya” pada modul, memungkinkannya mengukur waktu.

    Modul ini dapat digunakan sebagai jam atau jam alarm berbasis papan Arduino. Atau sebagai peringatan untuk berbagai sistem, misalnya di Rumah Pintar.

    Spesifikasi DS3231:

    • modul menghitung jam, menit, detik, tanggal, bulan, tahun (tahun kabisat diperhitungkan sampai tahun 2100);
    • Untuk terhubung ke berbagai perangkat, jam terhubung melalui antarmuka I2C.

    32K— Output dirancang untuk memasok daya eksternal >12V.

    S.Q.W.— Output sinyal Gelombang Persegi yang dapat diprogram.

    SCL– Melalui pin ini, data dipertukarkan dengan jam melalui antarmuka I2C.

    SDA– Data dari jam tangan dikirimkan melalui pin ini.

    VCC– Catu daya untuk jam waktu nyata, diperlukan 5 volt. Jika tidak ada tegangan yang disuplai ke pin ini, jam tangan akan masuk ke mode tidur.

    GND- Bumi.

    Diagram koneksi untuk jam waktu nyata DS3231 dan program sederhana

    Pin SDA dan SCL pada papan Arduino yang berbeda:

    SDA SCL
    UNO A4 A5
    Mini A4 A5
    nano A4 A5
    Mega2560 20 21
    Leonardo 2 3

    Mari kita sambungkan modul jam real-time ke Arduino UNO. SDA - pin A4, SCL - pin A5.

    Program berikut ini cocok agar model dapat berfungsi (Anda cukup menyalin program ke Arduino IDE):

    #termasuk

    batalkan pengaturan() (
    penundaan(300);
    Serial.mulai(9600);
    waktu.mulai();
    }
    lingkaran kosong()



    }
    }

    Dalam sketsa ini, waktu hanya menghitung mundur.

    Pertama-tama, di sktech, sambungkan perpustakaan iarduino_RTC.h.

    Di sana, tunjukkan nama persis modul Anda agar dapat berfungsi dengan benar.

    Hasilnya, kami mendapatkan output waktu dari modul DS3231 ke port monitor. Jam, menit, detik ditampilkan.

    Pada sketsa selanjutnya kita akan menambahkan fungsi Atur waktu, yang memungkinkan Anda mengatur waktu hitung mundur awal.

    #termasuk
    waktu iarduino_RTC(RTC_DS3231);
    batalkan pengaturan() (
    penundaan(300);
    Serial.mulai(9600);
    waktu.mulai();
    waktu.settime(0,0,18,24,04,17,1); // 0 detik, 0 menit, 18 jam, 24 April 2017, Senin
    }
    lingkaran kosong()
    if(millis()%1000==0)( // jika 1 detik telah berlalu
    Serial.println(time.gettime("dm-Y, H:i:s, D")); // waktu tampilan
    penundaan(1); // jeda selama 1 ms agar tidak menampilkan waktu beberapa kali dalam 1 ms
    }
    }

    Pada contoh, waktu mulai dihitung dari 0 detik, 0 menit, pukul 18, 24 April 2017, Senin.

    Postingan pelajaran:

    1. Pelajaran pertama: .
    2. Pelajaran kedua: .
    3. Pelajaran ketiga: .
    4. Pelajaran keempat: .
    5. Pelajaran kelima: .
    6. Pelajaran keenam: .
    7. Pelajaran ketujuh: .
    8. Pelajaran kedelapan: .
    9. Pelajaran kesembilan:

    Keterangan

    Modul jam waktu nyata dengan catu daya independen. Pengontrol Arduino/Genuino tidak memiliki jam waktu nyata bawaan. Untuk bekerja dengan waktu, ada fungsi millis(). Namun, untuk proyek yang memerlukan waktu dan tanggal, kemampuan fungsi ini tidak cukup dan jam waktu nyata dapat membantu.

    Modul DS3231 adalah jam real-time I2C yang murah dan akurat dengan kompensasi suhu TCXO. Perangkat ini dilengkapi konektor untuk baterai CR2032 dan menjaga ketepatan waktu saat daya perangkat terputus. Jam mendukung informasi tentang detik, menit, jam, hari, bulan dan tahun. Tanggal akhir bulan secara otomatis disesuaikan untuk bulan-bulan yang memiliki hari kurang dari 31, termasuk penyesuaian tahun kabisat. Mereka beroperasi dalam salah satu mode: format 24 atau 12 jam (dengan indikator AM/PM). Mereka memiliki dua alarm yang dapat diprogram.

    Karakteristik utama jam tangan:

      Jam waktu nyata dengan penghitungan detik, menit, jam, hari, bulan dan tahun (dengan penyesuaian tanggal termasuk tahun kabisat hingga 2100)

      Kesalahan perjalanan: ±2 menit per tahun

      Sensor suhu dengan kesalahan ±3°С

      Dua jam alarm

    Spesifikasi

      Suhu pengoperasian: -40°С - +85°С

      Tegangan suplai: 2,3 - 5,5 V

      Tegangan suplai baterai: 2,3 - 5,5 V

      Konsumsi arus maksimum: 650 nA

    Dimensi Fisik

      Modul (P x L x T): 45 x 23 x 15 mm

    Kelebihan penggunaan

      Akurasi jam tangan yang tinggi

      Ada dua jam alarm dengan fungsi interupsi

      Kisaran suhu pengoperasian yang luas

    Kekurangan penggunaan

      Lebih mahal dari beberapa analog

    Perpustakaan untuk bekerja dengan modul

    Contoh koneksi dan penggunaan

    Contoh 1: Contoh ini mengilustrasikan menghubungkan modul jam ke pengontrol, mengatur waktu dan tanggal pada jam, mengeluarkan waktu, tanggal dan hari dalam seminggu ke monitor port Serial, serta menerima suhu dari modul saat ini. (Contoh diuji pada pengontrol Smart UNO)

    Diagram koneksi:

    Sketsa untuk diunduh:

    //Menghubungkan perpustakaan#termasuk #sertakan "DS3231.h" DS3231 RTC; //Buat objek DS3231 char weekDay [ 4 ] = ( "Minggu", "Senin", "Selasa", ​​"Rabu", "Kamis", "Jumat", "Sabtu" ) ; //Membuat array hari dalam seminggu //Membuat variabel bertipe DateTime untuk mengatur tanggal dengan format: //tahun, bulan, hari, jam, menit, detik dan hari dalam seminggu (dari 0 - Minggu hingga 6 - Sabtu) TanggalWaktu dt(2016, 8, 22, 16, 10, 0, 1); batal setup() (Serial.mulai (9600); //menginisialisasi port Serial Kawat.begin(); //inisialisasi perpustakaan Wire RTC.mulai(); //inisialisasi jam RTC.sesuaikan (dt) ; //Atur tanggal-waktu seperti yang ditentukan dalam variabel dt) void loop () ( DateTime sekarang = RTC.now () ; //mendapatkan tanggal dan waktu saat ini //menghasilkan tahun yang diterima Serial.print(sekarang.tahun(), DEC); Serial.cetak("/"); //output bulan Serial .print (sekarang.bulan () , DEC) ; Serial.cetak("/"); //hari Serial .print (sekarang.tanggal () , DEC) ; Serial.cetak(" "); //jam Serial .print (sekarang.jam () , DEC) ; Serial.cetak(":"); //menit Serial .print (sekarang.menit () , DEC) ; Serial.cetak(":"); //detik Serial .print (sekarang.detik () , DEC) ; Serial.println(); //hari dalam seminggu Serial .print (weekDay[ now.dayOfWeek () ] ) ; Serial.println(); penundaan(1000); //penundaan selama 1 detik RTC.convertTemperature(); //konversi suhu saat ini dalam register Serial.print(RTC.getTemperature()); //baca register dan keluarkan suhu yang dihasilkan Serial.println("C"); penundaan(1000); //penundaan selama 1 detik }

    Hari ini kami akan melanjutkan pencarian chip jam waktu nyata (RTC) yang sempurna. Kami akan membuat jam tangan berdasarkan. Tampilan akan lebih nyaman untuk pengembangan - layar LCD, yang akan menampilkan semua informasi sekaligus kecuali pengaturan. Dalam bentuk ini, jam nyaman digunakan sebagai versi desktop.

    Jadi, mari kita lihat chip DS3231 itu sendiri. DS3231 adalah jam real-time dengan pergerakan yang sangat presisi (produsen memilih kata tersebut) berkat resonator kuarsa internal dengan kompensasi suhu. Antarmuka transfer data adalah I 2 C. Sirkuit mikro ini juga memiliki input untuk tegangan baterai cadangan; ketika daya utama dimatikan, sirkuit mikro secara otomatis beralih ke pengoperasian dari baterai cadangan, keakuratan pengoperasian dari baterai cadangan tidak. terpengaruh. Sangat menyenangkan bukan? DS3231 mendukung penghitungan detik, menit, jam, hari dalam sebulan (tanggal), hari dalam seminggu, bulan, dan tahun (termasuk tahun kabisat untuk bulan). Mendukung pekerjaan dalam format 12 dan 24 jam. Ada 2 jam alarm dengan kemampuan untuk mengkonfigurasinya dan memantau statusnya. Penyesuaian akurasi kompensasi suhu. Dan juga dua output - pada 32 kHz (outputnya 32,768 kHz) dan output yang dapat diprogram dari 1 Hz hingga 8,192 kHz. Ada juga pin reset - RST. Chip jam waktu nyata tersedia dalam paket SO-16. Kasingnya cukup besar, tetapi mengingat sudah ada kuarsa di dalamnya, dan juga kompensasi suhu, menurut saya semuanya baik-baik saja dengan dimensinya. DS3231 memiliki kembaran berupa DS3232, namun memiliki 2 kaki lebih banyak. Semua ini sangat mengingatkan pada produk NXP - chip jam PCA2129 dan PCF2129. Resonator kuarsa bawaan dengan kompensasi suhu serupa, keduanya merupakan kembaran yang sama hanya dengan jumlah n.c. pin dan fungsi serupa yang berhubungan dengan DS3231 selain ketepatan waktu.

    RTC DS3231 tersedia untuk dijual dalam bentuk modul dengan kabel yang diperlukan, serta lengkap dengan chip EEPROM, yang seringkali tidak diperlukan, hanya menambah bobot:

    Selain bagian-bagian yang diperlukan, pada papan modul juga terdapat LED yang fungsinya untuk menunjukkan sambungan listrik ke terminal. Mereka mungkin hanya mengirimkannya untuk kecantikan.

    Yang penting untuk diketahui saat bekerja dengan chip jam waktu nyata adalah cara mengekstrak data darinya atau menulisnya di sana. Jam memiliki antarmuka I 2 C. Untuk menulis data (dan ini juga diperlukan untuk membaca data), Anda harus melewati kondisi awal (perintah ini dilakukan menggunakan perangkat keras atau perangkat lunak I 2 C untuk mikrokontroler), kemudian meneruskan alamat chip dengan catatan bit, kemudian meneruskan alamat register yang akan kita akses dan kemudian mentransfer satu byte data ke register ini, jika Anda kemudian mentransfer byte data lainnya, itu akan menjadi ditulis ke register berikutnya, dan seterusnya. Setelah selesai, Anda harus melewati kondisi berhenti. Representasi grafis di atas pada gambar:

    Perekaman data diperlukan untuk pengaturan awal serta pengaturan waktu saat ini. Selanjutnya, kita perlu terus-menerus menerima data tentang waktu dan tanggal saat ini. Untuk melakukan ini, perlu membaca dari register yang menyimpan informasi ini. Membaca terdiri dari dua prosedur - mengatur penunjuk ke register yang diinginkan dan membacanya. Untuk menyetel penunjuk ke register yang diinginkan, Anda harus meneruskan kondisi awal, kemudian meneruskan alamat chip dengan bit tulis dan satu byte dengan alamat register. Berikutnya adalah kondisi berhenti dan kemudian kondisi mulai, atau hanya memulai kembali. Sekarang prosedur kedua adalah membaca langsung dari register. Awal ditransmisikan, maka Anda perlu mengirim alamat sirkuit mikro dengan bit baca dan kemudian membaca register dalam nomor yang diperlukan, dan setelah selesai, mengirimkan kondisi berhenti. Jika informasi dari register telah dibaca, penunjuk secara otomatis berpindah ke register berikutnya tanpa tindakan yang tidak perlu dari pihak mikrokontroler (master perangkat). Gambar tersebut mengilustrasikan semua hal di atas mengenai pembacaan register menggunakan antarmuka I 2 C:

    Alamat chip:

    • untuk merekam - 0b11010000
    • untuk membaca - 0b11010001

    Kode C akan terlihat seperti ini:

    // berfungsi dengan jam ================ =============== ===== === ======== // menginisialisasi pengaturan awal void RTC_init(void)( i2c_start_cond(); // memulai i2c i2c_send_byte(RTC_adr_write); // mentransfer alamat perangkat, mode perekaman i2c_send_byte(0x0E); // mentransfer alamat memori i2c_send_byte(0b00100000); // memulai konversi suhu dan output pada 1 Hz i2c_send_byte(0b00001000); // menghentikan i2c ) // mendapatkan waktu dan tanggal void RTC_read_time(void)( i2c_start_cond() ; // memulai i2c_send_byte(RTC_adr_write); // mentransfer alamat perangkat, mode tulis i2c_stop_cond(); // menghentikan i2c i2c_send_byte(RTC_adr_read) ; / mengirimkan alamat perangkat, mode baca detik = bcd(i2c_get_byte(0)); // membaca detik, ACK min = bcd(i2c_get_byte(0)); // membaca menit, ACK jam = bcd(i2c_get_byte(0)); / baca jam, ACK wday = bcd(i2c_get_byte(0)); // membaca hari dalam seminggu, hari ACK = bcd(i2c_get_byte(0)); // membaca nomornya, ACK bulan = bcd(i2c_get_byte(0)); // membaca bulan, tahun ACK = bcd(i2c_get_byte(1)); // membaca tahun, NACK i2c_stop_cond(); // hentikan i2c ) // atur waktu void RTC_write_time(unsigned char hour1, unsigned char min1, unsigned char sec1)( i2c_start_cond(); // mulai i2c i2c_send_byte(RTC_adr_write); // transfer alamat perangkat, mode perekaman i2c_send_byte( 0x00) ; // transfer alamat memori i2c_send_byte(bin(detik1)); // 0x00 detik (apakah sebaiknya juga menentukan detik?) i2c_send_byte(bin(min1)); ; jam i2c_stop_cond(); // hentikan i2c ) // menyetel tanggal batal RTC_write_date(tanggal karakter yang tidak ditandatangani, hari karakter yang tidak ditandatangani, bulan karakter yang tidak ditandatangani, tahun karakter yang tidak ditandatangani)( i2c_start_cond(); // mulai i2c i2c_send_byte(RTC_adr_write); / / mentransfer alamat perangkat, mode perekaman i2c_send_byte(0x03); // transfer alamat memori i2c_send_byte(bin(wday)); // 0x03 hari dalam seminggu (Minggu - 1, Sen 2, Sel 3, Rabu 4, Kam 5, Jum 6, Sabtu 7 ) i2c_send_byte(bin(hari)); // 0x04 hari bulan i2c_send_byte(bin(bulan)); // 0x05 bulan i2c_send_byte(bin(tahun)); // 0x06 tahun i2c_stop_cond(); // hentikan i2c ) // baca suhu void RTC_read_temper(void)( i2c_start_cond(); // mulai i2c i2c_send_byte(RTC_adr_write); // transfer alamat perangkat, mode tulis i2c_send_byte(0x11); // transfer alamat memori i2c_stop_cond (); // menghentikan i2c i2c_start_cond(); // memulai i2c_send_byte(RTC_adr_read); // mengirimkan alamat perangkat, mode baca t1 = i2c_get_byte(0); / stop i2c t2=(t2/128); // bergeser sebanyak 6 - presisi 0,25 (2 bit) // bergeser sebanyak 7 - presisi 0,5 (1 bit) t2=t2*5;

    Ini semua kode sumber yang digunakan untuk bekerja dengan sirkuit mikro; penyesuaian kecepatan jam tidak terpengaruh, karena jam tidak kehilangan satu detik pun dalam beberapa hari.

    Ya - fitur yang hebat DS3231 adalah chip yang sama menjalankan fungsi termometer (jika tidak, bagaimana lagi melakukan kompensasi suhu) dan kemampuan membaca suhu saat ini. Resolusi suhu maksimum adalah 0,25 derajat Celcius. Selain itu, periode pembaruan suhunya cukup lama - sekitar 1 menit. Ya, kami tidak perlu memperbaruinya dengan cepat.

    Diagram seluruh struktur jam terlihat seperti ini:

    Mikrokontroler dipilih oleh Atmega8 karena ketersediaannya yang luas dan harganya yang murah. Mikrokontroler ini dapat digunakan baik dalam paket DIP-28 maupun dalam versi SMD dalam paket TQFP-32. Resistor R3 diperlukan untuk mencegah restart spontan mikrokontroler jika terjadi gangguan acak pada pin PC6. Resistor R3 menarik daya plus ke pin ini, menciptakan potensi yang andal di dalamnya. Layar kristal cair (LCD) digunakan untuk tampilan. Saya menggunakan tampilan 2004A - 4 baris 20 karakter lebih untuk kecantikan, jadi Anda bisa menggunakan tampilan yang lebih familiar - 2 baris 16 karakter. Layar LCD dihubungkan ke mikrokontroler menggunakan sistem empat bit. Resistor variabel R2 diperlukan untuk mengatur kontras karakter pada tampilan. Dengan memutar penggeser resistor ini, kami mendapatkan pembacaan paling jelas di layar untuk kami. Lampu latar layar LCD diatur melalui pin “A” dan “K” pada papan display. Lampu latar dinyalakan melalui resistor pembatas arus - R1. Semakin tinggi nilainya, semakin redup tampilannya. Namun resistor ini tidak boleh diabaikan untuk menghindari kerusakan pada lampu latar. Tombol S1 - S4 mengontrol pengaturan jam. LED menunjukkan bahwa alarm telah berbunyi. LED dapat diganti dengan semacam rangkaian suara. Resistor R5 - R8 bersifat pull-up dan diperlukan untuk pembentukan pulsa persegi panjang di terminal chip jam. Ini juga diperlukan agar protokol I2C dapat berfungsi dengan benar. Untuk memberi daya pada rangkaian, digunakan chip penstabil linier L7805; dapat diganti dengan analog domestik dari penstabil linier lima volt KR142EN5A, atau Anda dapat menggunakan chip penstabil tegangan lain sesuai dengan koneksinya di sirkuit (misalnya, LM317 atau switching stabilisator LM2576, LM2596, MC34063, dan seterusnya). Selanjutnya, 5 volt distabilkan oleh sirkuit mikro lain - AMS1117 dalam versi yang memberikan output 3,3 volt. Chip jam tersebut, menurut datasheet, ditenagai oleh tegangan 3,3 volt. Namun tegangan maksimumnya adalah 5,5 volt. Oleh karena itu, stabilizer ini dapat digunakan atau tidak, sesuai kebijaksanaan Anda. Penstabil tegangan AMS1117 juga dapat diganti dengan versi ADJ (AMS1117ADJ) - yaitu, versi yang dapat disesuaikan, Anda perlu mengatur tegangan yang diperlukan dengan pilihan inimenggunakan dua buah resistor yang dihubungkan pada rangkaian mikro sesuai dengan datasheetnya.

    Sirkuit dirakit dan di-debug menggunakan papan pengembangan untuk mikrokontroler ATmega8:

    Tujuan dari tombol:

    • S1 - mematikan sinyal alarm, atau keluar ke menu utama dari menu pengaturan apa pun
    • S2- reset mikrokontroler
    • S3 - mengubah waktu atau tanggal di menu pengaturan
    • S4 - masuk ke menu pengaturan dan gulir menu

    Pin 32 kHz dapat digunakan untuk mengontrol frekuensi kristal. Kami menghubungkan pengukur frekuensi atau osiloskop ke pin ini dan mengontrol frekuensi:

    Seperti yang dapat dilihat dari tangkapan layar osilogram, frekuensinya kira-kira sama dengan 32,768 kHz (kira-kira karena keterbatasan resolusi pengukuran frekuensi, dan sulit untuk menentukan secara akurat “dengan mata”).

    Hasilnya adalah jam tangan dengan ciri-ciri sebagai berikut:

    • indikasi waktu
    • tampilan tanggal
    • indikasi hari dalam seminggu
    • indikasi aktivitas jam alarm
    • 1 jam alarm dengan keluaran sinyal dari mikrokontroler
    • indikasi suhu sekitar (hanya suhu positif yang diterapkan dalam perangkat lunak; suhu negatif, menurut saya, tidak ada gunanya bagi kami)
    • pengaturan alarm
    • pengaturan waktu
    • pengaturan tanggal
    • Layar LCD dengan lampu latar
    • menyimpan pengaturan dan melanjutkan jam saat daya utama dimatikan

    Mari kita rangkum. Chip jam waktu nyata DS3231 adalah solusi terbaik. Akurasinya sebanding dengan beberapa DS1307 atau lebih tinggi, namun PCA/PCF2129 masih dapat bersaing dengannya. Di antara chip jam real-time yang telah saya ulas, instance ini saat ini menempati peringkat pertama dalam hal fungsionalitas dan akurasi.

    Untuk memprogram mikrokontroler Atmega8, Anda perlu mengetahui konfigurasi bit sekering (tangkapan layar diambil dalam program):

    Artikel ini disertai dengan firmware untuk mikrokontroler Atmega8, desain sirkuit dalam program, serta video jam kerja (di awal alarm akan berbunyi - LED akan menyala).

    Daftar elemen radio

    Penamaan Jenis Denominasi Kuantitas CatatanTokoBuku catatan saya
    IC1 MK AVR 8-bit

    ATmega8

    1 Ke buku catatan
    IC2 Jam Waktu Nyata (RTC)

    DS3231

    1 Ke buku catatan
    VR1 Pengatur linier

    L7805AB

    1 Ke buku catatan
    VR2 Pengatur linier

    AMS1117-3.3

    1 Ke buku catatan
    VD1 Dioda penyearah

    1N4148

    1 Ke buku catatan
    C1 470 mikrofarad1 Ke buku catatan
    C2, C3, C5, C7 Kapasitor100 nF4 Ke buku catatan
    C4 Kapasitor elektrolitik220 uF1 Ke buku catatan
    C6, C8 Kapasitor elektrolitik10 mikrofarad2 Ke buku catatan
    R1 Penghambat

    22 ohm

    1 Ke buku catatan
    R2 Resistor pemangkas10 kOhm1 3296W-1-103LF

    Chip DS3231 adalah jam real-time RTC presisi tinggi yang memiliki osilator kuarsa kompensasi suhu internal, sehingga penyimpangan waktu hanya ±2 menit per tahun. Selain itu, fungsi alarm diterapkan, dan ada juga keluaran interupsi. Jam dapat dibeli sebagai modul Arduino siap pakai dengan elemen pengikat dan tempat baterai.

    Saya memesan modul di sini. Diagramnya ditunjukkan pada gambar di bawah ini:


    Sirkuit mikro menggunakan yang banyak digunakan. Mendukung kecepatan data standar (100 kHz) dan tinggi (400 kHz). Alamat sirkuit mikro (7 bit) pada bus I2C adalah 1101000. Selain itu, modul ini memiliki memori I2C (24C32), tidak ditampilkan dalam diagram.

    Mode Daya

    Tegangan suplai rangkaian mikro dapat berkisar antara 2.3...5.5V, terdapat dua saluran listrik, untuk sumber luar (saluran Vcc), dan juga untuk baterai (Vbat). Tegangan sumber eksternal dipantau secara konstan, dan ketika turun di bawah ambang batas Vpf=2.5V, tegangan tersebut beralih ke saluran baterai. Tabel berikut menunjukkan kondisi peralihan antar saluran listrik:

    Akurasi jam tangan dijaga dengan memantau suhu sekitar. Sirkuit mikro memulai prosedur internal untuk menyesuaikan frekuensi generator jam; jumlah penyesuaian ditentukan menggunakan grafik khusus frekuensi versus suhu. Prosedur dimulai setelah listrik dialirkan dan kemudian dijalankan setiap 64 detik.

    Untuk menghemat daya, ketika baterai terhubung (tegangan diterapkan ke saluran Vbat), generator jam tidak akan hidup sampai tegangan pada saluran Vcc melebihi nilai ambang batas Vpf, atau alamat sirkuit mikro yang benar ditransmisikan melalui antarmuka I2C. Waktu pengaktifan generator jam kurang dari satu detik. Sekitar 2 detik setelah daya dialirkan (Vcc), atau alamat diterima melalui antarmuka I2C, prosedur koreksi frekuensi dimulai. Setelah generator jam dimulai, generator jam akan terus beroperasi selama Vcc atau Vbat ada. Saat dihidupkan untuk pertama kalinya, register tanggal dan waktu direset dan memiliki nilai berikut: 01/01/00 – 01 – 00/00/00 (hari/bulan/tahun/ – hari dalam seminggu – jam/menit /detik).

    Konsumsi arus saat ditenagai oleh baterai 3,63V adalah 3 µA, tanpa adanya transmisi data melalui antarmuka I2C. Konsumsi arus maksimum dapat mencapai 300 µA bila menggunakan catu daya eksternal 5.5V dan kecepatan transfer data I2C yang tinggi.

    Fungsi reset eksternal

    Jalur RST dapat digunakan untuk reset eksternal dan juga memiliki fungsi alarm tegangan rendah. Garis ditarik tinggi melalui resistor internal; tidak diperlukan pull-up eksternal. Untuk menggunakan fungsi reset eksternal, sebuah tombol dapat dihubungkan antara saluran RST dan kabel umum; sirkuit mikro memiliki perlindungan pantulan kontak. Fungsi alarm diaktifkan ketika tegangan suplai Vcc turun di bawah nilai ambang batas Vpf, sedangkan saluran RST diatur ke level logika rendah.

    Deskripsi register DS3231

    Tabel di bawah ini menunjukkan daftar register jam waktu nyata:

    AlamatD7D6D5D4D3D2D1D0FungsiBatasan
    0x000 10 detikDetikDetik00-59
    0x010 10 menitmenitmenit00-59
    0x020 12/24 pagi/sore10 jamJamJam tangan1-12 + AM/PM atau 00-23
    10 jam
    0x030 0 0 0 0 HariHari di minggu ini1-7
    0x040 0 tanggal 10Nomortanggal01-31
    0x05Abad0 0 10 bulanBulanBulan/abad01-12 + Abad
    0x0610 tahunTahunBertahun-tahun00-99
    0x07A1M110 detikDetikDetik, alarm pertama00-59
    0x08A1M210 menitmenitMenit, alarm pertama00-59
    0x09A1M312/24 pagi/sore10 jamJamJam, alarm pertama1-12 + AM/PM atau 00-23
    10 jam
    0x0AA1M4DY/DTtanggal 10HariHari dalam seminggu, alarm pertama1-7
    NomorTanggal, alarm pertama01-31
    0x0BA2M210 menitmenitMenit, alarm ke-200-59
    0x0CA2M312/24 pagi/sore10 jamJamJam, alarm ke-21-12 + AM/PM atau 00-23
    10 jam
    0x0DA2M4DY/DTtanggal 10HariHari dalam seminggu, alarm ke-21-7
    NomorTanggal, alarm ke-201-31
    0x0EEOSCBBSQWKONVRS2RS1INTCNA2IEA1IEDaftar pengaturan (Kontrol)
    0x0FOSF.0 0 0 EN32kHzBSYA2FA1FDaftar Status
    0x10TANDADATADATADATADATADATADATADATADaftar Offset Penuaan
    0x11TANDADATADATADATADATADATADATADATADaftar suhu, byte tinggi
    0x12DATADATA0 0 0 0 0 0 Daftar suhu, byte rendah

    Informasi waktu disimpan dalam format desimal biner, yaitu setiap digit angka desimal (dari 0 hingga 9) direpresentasikan sebagai kelompok 4 bit. Dalam kasus satu byte, nibble rendah menghitung satu, nibble tinggi menghitung puluhan, dll. Waktu dihitung dalam register dengan alamat 0x00-0x06; untuk menghitung jam, Anda dapat memilih mode 12 atau 24 jam. Mengatur bit ke-6 dari register jam (alamat 0x02) mengatur mode 12 jam, di mana bit ke-5 menunjukkan waktu, nilai 1 berarti sore (PM), nilai 0 berarti sore (AM). Nilai nol dari bit ke-6 sesuai dengan mode 24 jam, di sini bit ke-5 terlibat dalam penghitungan jam (nilai 20-23).

    Register hari dalam seminggu bertambah pada tengah malam, menghitung dari 1 hingga 7, register bulan (alamat 0x05) berisi bit Abad (bit ke-7), yang beralih ketika register penghitungan tahun (alamat 0x06) meluap, dari 99 ke 00 .

    Chip DS3231 mengimplementasikan dua jam alarm, jam alarm pertama dikonfigurasi menggunakan register dengan alamat 0x07-0x0A, jam alarm ke-2 dikonfigurasi menggunakan register 0x0B-0x0D. Bit A1Mx dan A2Mx dapat digunakan untuk mengkonfigurasi berbagai mode alarm; pengaturan bit mengecualikan register yang sesuai dari operasi perbandingan. Tabel di bawah menunjukkan kombinasi bit untuk mode alarm yang berbeda:

    Kombinasi bit yang tidak ditentukan dalam tabel menyebabkan fungsi alarm tidak tepat. Jika bit DY/DT dihapus, maka kecocokan tanggal (hari dalam sebulan) dimonitor untuk jam alarm; ketika bit DY/DT disetel, kecocokan hari dalam seminggu diperiksa.

    Sebagian besar fungsi dikonfigurasikan dalam register Kontrol. Bit EOSC mengontrol permulaan generator jam, menyetel ulang bit akan memulai generator jam. Menyetel bit akan menghentikan generator, hanya untuk mode baterai (Vbat). Ketika diberi daya dari sumber eksternal (Vcc), osilator selalu berjalan terlepas dari status bit EOSC. Saat diaktifkan, nilai bit default adalah 0.

    Mengatur bit BBSQW memungkinkan output INT/SQW (pin ke-3) beroperasi dalam mode daya baterai, tanpa adanya daya eksternal. Ketika bit diatur ke nol, keluaran INT/SQW masuk ke keadaan 3 (dinonaktifkan) jika tegangan sumber eksternal Vcc turun di bawah nilai ambang batas Vpf. Setelah daya diterapkan, nilai bit default adalah 0.

    Bit CONV bertanggung jawab untuk pengukuran suhu paksa; pengaturan bit memulai proses konversi, di mana frekuensi generator jam juga disesuaikan; hasil pengukuran terletak di register dengan alamat 0x11, 0x12. Memulai hanya mungkin jika konversi sebelumnya telah selesai; sebelum memulai, Anda perlu memeriksa tanda sibuk BSY. Konversi suhu paksa tidak mempengaruhi siklus penyesuaian frekuensi internal 64 detik. Menyetel bit CONV tidak mempengaruhi flag BSY selama 2 ms. Bit CONV dan BSY dihapus secara otomatis setelah konversi selesai.

    Bit RS2, RS1 mengatur frekuensi pulsa persegi panjang (gelombang persegi) pada output INT/SQW. Secara default, saat diaktifkan, bit disetel ke 1. Tabel di bawah menunjukkan kemungkinan kombinasi bit:

    Bit INTCN mengontrol keluaran INT/SQW. Jika bit direset, pulsa persegi panjang (gelombang persegi) muncul pada output, yang frekuensinya diatur oleh bit RS2, RS1. Ketika bit INTCN disetel, outputnya digunakan untuk menghasilkan interupsi alarm. Secara default, nilai bitnya adalah 1. Tipe outputnya adalah INT/SQW - open drain, oleh karena itu perlu ditarik melalui resistor ke level logika tinggi, level aktifnya rendah.

    Mengatur bit A1IE, A2IE mengaktifkan interupsi masing-masing pada sinyal alarm ke-1 dan ke-2. Reset bit, nonaktifkan interupsi. Nilai defaultnya adalah 0.

    Register Status berisi tanda peristiwa dan mengontrol output 32 kHz. Flag OSF mencerminkan keadaan generator jam, nilai 1 berarti generator jam dihentikan, peristiwa ini dapat terjadi dalam kasus berikut:

    • Untuk pertama kalinya setelah listrik diterapkan
    • Baterai atau voltase eksternaltage tidak cukup untuk mengoperasikan generator jam
    • Generator dinonaktifkan dengan mengatur bit EOSC dalam mode baterai
    • Faktor eksternal yang mempengaruhi osilator kristal (kebisingan, kebocoran, dll.)

    Setelah disetel, nilai bit tidak berubah; bit harus diatur ulang secara manual.

    Pengaturan bit EN32kHz memungkinkan pembangkitan pulsa persegi panjang (gelombang persegi) pada output 32kHz (pin pertama), frekuensi pulsa tetap dan sama dengan 32,768 kHz. Menyetel ulang bit akan menonaktifkan fungsi ini dan memindahkan keluaran ke keadaan ke-3 (impedansi masukan tinggi). Secara default, nilai bit adalah 1; setelah daya diterapkan, pulsa muncul pada output. Tipe outputnya adalah open drain 32kHz, jadi diperlukan pull-up ke level logika tinggi.

    Bendera sibuk BSY diatur selama proses konversi suhu dan penyesuaian jam. Bendera disetel ulang ketika konversi selesai.

    Bendera jam alarm A1F, A2F diatur ketika nilai register penghitung waktu dan register jam alarm cocok. Jika interupsi dari alarm A1IE, A2IE diaktifkan, dan output interupsi ditetapkan (bit INTCN diatur), maka sinyal interupsi muncul pada output INT/SQW (transisi dari level logika tinggi ke rendah). Bendera harus direset secara manual dengan menulis nilai 0.

    Register Aging Offset dirancang untuk mengatur frekuensi generator jam. Nilai register ditambahkan ke frekuensi osilator selama prosedur penyesuaian internal, jika perubahan suhu terdeteksi, dan juga ketika konversi suhu dipicu oleh bit CONV. Nilai offset ditandatangani, yaitu nilai positif (1-127) mengurangi frekuensi, nilai negatif (128-255) meningkatkannya. Untuk offset yang sama, perubahan frekuensi akan berbeda tergantung suhu. Pada +25°C, perubahan frekuensi akan menjadi 0,1 ppm/LSB.

    Nilai suhu saat ini disimpan dalam register dengan alamat 0x11 dan 0x12, masing-masing byte tinggi dan rendah, nilai suhu dalam register diperbarui secara berkala. Perataan kiri diatur, resolusinya adalah 10 bit atau 0,25°C/LSB, yaitu byte tinggi berisi bagian bilangan bulat suhu, dan bit ke-6, ke-7 dalam register rendah membentuk bagian pecahan. Pada byte tinggi, bit ke-7 menunjukkan tanda suhu, misalnya nilai 00011011 01 melambangkan suhu +27.25 °C, nilai 11111110 10 melambangkan suhu -2.5 °C.

    Saat membaca register waktu, disarankan untuk menggunakan buffer tambahan, yaitu membaca beberapa register sekaligus, dan tidak secara terpisah, karena antara operasi pembacaan individual, register waktu dapat mengubah nilainya. Aturan ini juga disarankan untuk dipatuhi saat menulis data baru ke register akun. Menulis nilai baru ke register detik akan menjeda jam selama 1 detik, register yang tersisa harus ditulis ulang selama waktu ini.

    Menghubungkan DS3231 ke mikrokontroler

    Saya menghubungkan jam ke mikrokontroler PIC16F628A dan menggunakan . Diagram koneksi ditunjukkan di bawah ini:


    Setelah daya dialirkan, tanda hubung (– – – – – –) ditampilkan pada indikator, kemudian jam diinisialisasi, nilai waktu muncul pada indikator dengan penundaan 1 detik, yang diperlukan untuk menghidupkan generator jam. Indikator menampilkan jam, menit dan detik, dipisahkan dengan titik desimal, dan format waktu adalah 24 jam. Dengan menggunakan tombol “Indikasi” SB1, Anda dapat mengubah format tampilan, di mana indikator akan menampilkan suhu, serta nilai jam dan menit, dipisahkan dengan titik desimal, yang berkedip dengan frekuensi 2 Hz. Suhu ditampilkan tanpa bagian pecahan; program hanya membaca byte tinggi penyimpanan suhu di alamat 0x11.

    Nilai waktu dibaca dari jam melalui interupsi pada jalur SQW/INT, yang dikendalikan oleh sinyal alarm pertama; selama inisialisasi jam, jam alarm diatur ke sinyal setiap detik. LED HL1 berfungsi sebagai indikator dan berkedip pada sinyal interupsi setiap detik. LED HL2 menyala jika terjadi kesalahan pengiriman data melalui antarmuka I2C.

    Selain itu, saya menambahkan ke program kemampuan untuk mengatur jam menggunakan tombol "Pengaturan" SB2, "Instalasi" SB3. Mode pengaturan dimasukkan dengan menekan tombol SB2; indikator menampilkan 00 jam dan tanda hubung, bukan menit dan detik (00 – – – –). Tombol SB3 mengatur nilai jam (bertambah setiap kali ditekan), lalu menekan tombol SB2 akan mengubah menit, bukan tanda hubung, 00 menit akan ditampilkan. Tombol SB3 juga menetapkan nilai yang diperlukan dan seterusnya. Setelah mengedit detik dan menekan tombol SB2, waktu dalam jam ditulis ulang, dan waktu yang diperbarui ditampilkan pada indikator.

    Sebagian kode program diberikan di bawah ini (versi lengkap dapat diunduh di akhir artikel):

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; #termasuk LIST p=16F628A __CONFIG H"3F10" ;tingkat kesalahan konfigurasi mikrokontroler -302 ;tidak menampilkan pesan dengan kesalahan 302 dalam daftar Sec equ 0020h ;register akun tambahan Sec1 equ 0021h ; Detik2 sama dengan 0022h ; scetbit equ 0024h;register tambahan untuk menghitung jumlah bit perem equ 0025h;register tambahan untuk penerimaan/transmisi byte melalui spi, i2c temp equ 0026h;register suhu perem_1 equ 0027h;register tambahan untuk konverter biner-desimal. hasilnya sama dengan 0028h; register tambahan BCD dat_ind equ 0029h ;daftar data untuk transmisi melalui protokol spi adr_ind equ 002Ah ;daftar alamat untuk transmisi melalui protokol spi second equ 002Bh ;daftar penyimpanan detik untuk mengatur waktu minut equ 002Ch ;daftar penyimpanan menit untuk mengatur waktu jam equ 002Dh ; register penyimpanan jam untuk pengaturan waktu adr_i2c equ 002Eh ;register subrutin transfer data antarmuka i2c tmp_i2c equ 002Fh slave_adr equ 0030h data_i2c equ 0031h flag equ 007Fh ;register bendera #DEFINE int PORTB,0 ;interrupt line INT/SQW DS3231 #DEFINE s dan PORTB ,1 ; Penelitian SDA untuk koneksi DS3231 #DEFINE scl PORTB,2 ;Jalur SCL untuk menghubungkan DS3231 #DEFINE sda_io TRISB,1 ;arah jalur SDA #DEFINE scl_io TRISB,2 ;arah jalur SCL #DEFINE datai PORTB,5 ;jalur input data driver MAX7219 #DEFINE cs PORTB ,6 ;jalur pemilihan driver MAX7219 #DEFINE clk PORTB,7 ;jalur jam driver MAX7219 #DEFINE led PORTB,4 ;LED kesalahan i2c #DEFINE led_sec PORTB,3 ;indikator progres jam LED 1Hz #DEFINE regim PORTA,2 ;Tombol indikasi - mengubah mode tampilan #DEFINE nast PORTA,3 ;Tombol pengaturan - memasuki mode pengaturan waktu #DEFINE ust PORTA,4 ;Tombol pengaturan - mengatur nilai jam;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h ;mulai eksekusi program dari alamat 0000h goto Mulai ;pergi ke label Mulai ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Program utama Mulai movlw b"00000000" ;mengatur nilai kait keluaran port A movwf PORTA ; movlw b"01000000" ;atur nilai kait keluaran port B movwf PORTB ; movlw b"00000111" ;matikan pembanding movwf CMCON ; bsf STATUS,RP0 ;pilih bank pertama movlw b"00000111" ;atur jalur input/output port B movwf TRISB ;RB0-RB2 - untuk input, sisanya untuk output movlw b"11111111" ;atur input/ jalur keluaran port A movwf TRISA ;semua jalur untuk masukan bcf STATUS,RP0 ;pilih bank 0 bendera clrf ;setel ulang bendera register panggil init_lcd ;panggil subrutin inisialisasi driver (MAX7219) panggil viv_not ;simbol tanda hubung keluaran " ------ " ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;; movlw b"11010000" ;alamat perangkat (DS3231) movwf slave_adr ;Menulis 4 byte ke register penerima/pengiriman melalui i2c; di sini alarm pertama dikonfigurasi, berbunyi bip setiap detik movlw data_i2c ;mengatur register penerimaan/pengiriman pertama melalui i2c movwf FSR ; movlw b"10000000" ;data untuk register detik alarm pertama movwf INDF ; termasuk FSR,F ; movlw b"10000000" ;data untuk register menit alarm pertama movwf INDF ; termasuk FSR,F ; movlw b"10000000" ;data untuk register jam pada jam alarm pertama movwf INDF ; termasuk FSR,F ; movlw b"10000000" ;data untuk tanggal/hari dalam seminggu register alarm pertama movwf INDF ; bergerak. 4 ;mentransfer 4 byte melalui i2c movwf tmp_i2c ; movlw 0x07 ;mengatur alamat register detik jam alarm pertama movwf adr_i2c ; panggil write_i2c ;memanggil subrutin penulisan melalui antarmuka i2c memanggil err_prov ;memeriksa kesalahan tulis/baca I2C movlw .1 ;mentransfer byte pertama melalui i2c movwf tmp_i2c ; movlw 0x0E ;mengatur alamat register Kontrol movwf adr_i2c ; movlw data_i2c ;mengatur register transmisi/penerimaan pertama melalui i2c movwf FSR ; movlw b"00000101" ;mulai generator jam, larang pengoperasian pin INT/SQW untuk movwf INDF ;mode daya baterai, frekuensi pulsa pada keluaran INT/SQW adalah 1Hz, ;output INT/SQW digunakan untuk menghasilkan alarm interupsi jam, ;aktifkan interupsi jam alarm panggilan alarm pertama write_i2c ;memanggil subrutin perekaman melalui panggilan antarmuka i2c err_prov ;memeriksa kesalahan tulis/baca I2C met_2 movlw .1 ;mentransfer byte pertama melalui i2c movwf tmp_i2c ; movlw 0x0F ;mengatur alamat register Status movwf adr_i2c ; movlw data_i2c ;mengatur register transmisi/penerimaan pertama melalui i2c movwf FSR ; movlw b"00000000" ;setel ulang bit OSF, larang pembuatan pulsa pada output EN32kHz, movwf INDF ;setel ulang tanda interupsi alarm A2F, panggilan A1F write_i2c ;panggil subrutin perekaman melalui antarmuka i2c, panggil err_prov ;periksa penulisan I2C /baca kesalahan met_1 btfsc int ; melakukan polling pada baris interupsi alarm goto met_3; bsf led_sec ;nyalakan LED indikator kemajuan jam goto met_4 ; met_3 bcf led_sec ;mematikan indikator kemajuan jam LED btfsc nast ;melakukan polling tombol pengaturan jam goto met_5 ; panggil nast_time ;panggil subrutin pengaturan waktu goto met_2 ; met_5 btfsc regim ;jajak pendapat tombol mode indikasi goto met_1 ; met_6 panggilan jeda_knp ; rezim btfss; pergi bertemu_6 ; btfss flag,2 ;ubah nilai flag mode indikasi goto met_7 ; bendera bcf,2 ;setel ulang bendera indikasi, mode tampilan jam goto met_1 ; met_7 bsf flag,2 ;mengatur bendera indikasi, suhu dan mode tampilan jam goto met_1 ; met_4 movlw .1 ;mentransmisikan byte pertama melalui i2c movwf tmp_i2c ; movlw 0x11 ;mengatur alamat register suhu tinggi movwf adr_i2c ; panggil read_i2c ;memanggil subrutin pembacaan melalui panggilan I2C err_prov ;memeriksa kesalahan tulis/baca I2C movf INDF,W ;menyalin nilai suhu ke dalam register temp movwf temp rd_time movlw .3 ;mentransfer 3 byte melalui i2c movwf tmp_i2c ; movlw 0x00 ;mengatur alamat register detik movwf adr_i2c ; panggil read_i2c ;memanggil subrutin pembacaan melalui panggilan I2C err_prov ;memeriksa kesalahan tulis/baca I2C bendera btfsc,2 ;jajak pendapat bendera mode indikasi goto met_8 ; panggil vivod ;memanggil subrutin untuk menampilkan nilai jam pada tampilan digital goto met_2 ; met_8 panggil vivod_temp ;memanggil subrutin untuk menampilkan suhu dan jam pada tampilan digital goto met_2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

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

    #termasuk

    CONFIG H"3F10" ;Konfigurasi mikrokontroler

    errorlevel -302 ;jangan tampilkan pesan kesalahan 302 dalam daftar

    Detik sama dengan 0020h; register akun tambahan

    Detik1 sama dengan 0021h ;

    Detik2 sama dengan 0022h ;

    scetbit equ 0024h ;menghitung jumlah bit register tambahan

    perem equ 0025h; register penerimaan/transmisi byte tambahan melalui spi, i2c

    temp equ 0026h ;register suhu

    perem_1 equ 0027h ;daftar tambahan konverter biner-desimal.

    hasilnya sama dengan 0028h; register tambahan BCD

    dat_ind equ 0029h ;registrasi data untuk transmisi melalui protokol spi

    adr_ind equ 002Ah ;daftar alamat untuk transmisi melalui protokol spi

    detik sama dengan 002Bh; register penyimpanan detik untuk mengatur waktu

    minut equ 002Ch ;daftar penyimpanan menit untuk mengatur waktu

    jam setara 002Dh ;daftar penyimpanan jam untuk mengatur waktu

    adr_i2c equ 002Eh ;register subrutin transfer data antarmuka i2c

    tmp_i2c sama dengan 002Fh

    slave_adr sama dengan 0030h

    data_i2c sama dengan 0031h

    bendera sama dengan 007Fh ;daftar bendera

    #DEFINE int PORTB,0 ;interupsi jalur INT/SQW DS3231

    #DEFINE sda PORTB,1 ;Jalur SDA untuk menghubungkan DS3231

    #DEFINE scl PORTB,2 ;SCL line untuk menghubungkan DS3231

    #DEFINE datai PORTB,5 ;jalur input data driver MAX7219

    #DEFINE cs PORTB,6 ;jalur pemilihan driver MAX7219

    #DEFINE clk PORTB,7 ;garis jam driver MAX7219

    #DEFINE led PORTB,4 ;LED kesalahan i2c

    #DEFINE led_sec PORTB,3 ;Indikator kemajuan jam LED 1Hz

    #DEFINE regim PORTA,2 ;Tombol indikasi - mengubah mode tampilan

    #DEFINE nast PORTA,3 ;Tombol pengaturan - memasuki mode pengaturan waktu

    #DEFINE ust PORTA,4 ;Tombol setel - atur nilai jam

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

    org 0000h ;mulai eksekusi program dari alamat 0000h

    goto Mulai; buka label Mulai

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

    ;Program utama

    Mulai movlw b"00000000" ;atur nilai kait keluaran port A

    movlw b"01000000" ;atur nilai kait keluaran port B

    movlw b"00000111" ;matikan pembanding

    bsf STATUS,RP0 ;pilih bank pertama

    movlw b"00000111" ;mengonfigurasi jalur input/output port B

    movwf TRISB ;RB0-RB2 - ke input, sisanya ke output

    movlw b"11111111" ;menyiapkan jalur input/output port A

    movwf TRISA ;semua baris untuk dimasukkan

    bcf STATUS,RP0 ;pilih bank 0

    bendera clrf ;setel ulang daftar bendera

    panggil init_lcd ;panggil rutinitas inisialisasi driver (MAX7219)

    panggil viv_not ;simbol tanda hubung keluaran " ------ " ke indikator

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

    movlw b"11010000";alamat perangkat (DS3231)

    ;Tulis 4 byte ke register penerimaan/pengiriman melalui i2c

    movlw data_i2c ;mengatur register penerimaan/pengiriman pertama melalui i2c

    movlw b"10000000" ;data untuk register detik alarm pertama

    movlw b"10000000" ;data untuk register menit alarm pertama

    movlw b"10000000" ;data untuk register jam alarm pertama

    movlw b"10000000" ;data untuk tanggal/hari minggu register alarm pertama

    movlw .4 ;transfer 4 byte melalui i2c

    movlw 0x07 ;mengatur alamat register detik jam alarm pertama

    Dalam banyak proyek Arduino, diperlukan pemantauan dan pencatatan waktu terjadinya peristiwa tertentu. Modul jam waktu nyata, dilengkapi dengan baterai tambahan, memungkinkan Anda menyimpan tanggal saat ini tanpa bergantung pada ketersediaan daya pada perangkat itu sendiri. Pada artikel ini kita akan membahas tentang modul RTC paling umum DS1307, DS1302, DS3231 yang dapat digunakan dengan papan Arduino.

    Modul jam adalah papan kecil yang biasanya berisi salah satu sirkuit mikro DS1307, DS1302, DS3231. Selain itu, di papan tersebut Anda secara praktis dapat menemukan mekanisme pemasangan baterai. Papan semacam itu sering digunakan untuk melacak waktu, tanggal, hari dalam seminggu, dan parameter kronometrik lainnya. Modul beroperasi dengan daya otonom - baterai, akumulator, dan terus menghitung bahkan jika daya ke Arduino dimatikan. Model jam tangan yang paling umum adalah DS1302, DS1307, DS3231. Mereka didasarkan pada modul RTC (real time clock) yang terhubung ke Arduino.

    Jam dihitung dalam satuan yang nyaman bagi kebanyakan orang - menit, jam, hari dalam seminggu, dan lain-lain, berbeda dengan penghitung konvensional dan generator jam yang bertuliskan “detik”. Arduino memiliki fungsi millis() khusus yang juga dapat membaca interval waktu berbeda. Namun kelemahan utama dari fungsi ini adalah ia akan disetel ulang ke nol saat pengatur waktu dihidupkan. Dengan bantuannya Anda hanya dapat membaca waktu; tidak mungkin menentukan tanggal atau hari dalam seminggu. Modul jam waktu nyata digunakan untuk mengatasi masalah ini.

    Sirkuit elektronik mencakup sirkuit mikro, catu daya, resonator kuarsa, dan resistor. Resonator kuarsa beroperasi pada frekuensi 32768 Hz, yang sesuai untuk pencacah biner konvensional. Sirkuit DS3231 memiliki kuarsa dan stabilisasi termal bawaan, yang memungkinkan nilai yang sangat akurat.

    Perbandingan modul RTC populer DS1302, DS1307, DS3231

    Dalam tabel ini kami telah menyediakan daftar modul paling populer dan karakteristik utamanya.

    Nama Frekuensi Ketepatan Protokol yang didukung
    DS1307 1 Hz, 4,096 kHz, 8,192 kHz, 32,768 kHz Tergantung pada kuarsa - biasanya nilainya mencapai 2,5 detik per hari, tidak mungkin mencapai akurasi lebih tinggi dari 1 detik per hari. Selain itu, keakuratannya bergantung pada suhu. I2C
    DS1302 32,768 kHz 5 detik sehari I2C, SPI
    DS3231 Dua output - yang pertama pada 32,768 kHz, yang kedua dapat diprogram dari 1 Hz hingga 8,192 kHz ±2 ppm pada suhu dari 0C hingga 40C.

    ±3,5 ppm pada suhu -40C hingga 85C.

    Akurasi pengukuran suhu – ±3С

    I2C

    Modul DS1307

    DS1307 adalah modul yang digunakan untuk pengaturan waktu. Itu dirakit berdasarkan chip DS1307ZN, daya disuplai dari baterai lithium untuk memastikan operasi otonom untuk jangka waktu yang lama. Baterai di papan dipasang di sisi sebaliknya. Modul ini memiliki chip AT24C32 - ini adalah memori EEPROM non-volatil 32 KB. Kedua sirkuit mikro dihubungkan oleh bus I2C. DS1307 memiliki konsumsi daya yang rendah dan berisi jam dan kalender untuk tahun 2100.

    Modul ini memiliki parameter berikut:

    • Catu daya – 5V;
    • Kisaran suhu pengoperasian dari -40C hingga 85C;
    • memori 56 byte;
    • Baterai litium LIR2032;
    • Menerapkan mode 12 dan 24 jam;
    • Dukungan antarmuka I2C.

    Modul ini dibenarkan jika data jarang dibaca, dengan interval seminggu atau lebih. Hal ini memungkinkan Anda menghemat daya, karena penggunaan tanpa gangguan akan memerlukan lebih banyak voltase, bahkan dengan baterai. Kehadiran memori memungkinkan Anda untuk mendaftarkan berbagai parameter (misalnya pengukuran suhu) dan membaca informasi yang diterima dari modul.

    Interaksi dengan perangkat lain dan pertukaran informasi dengannya dilakukan menggunakan antarmuka I2C dari pin SCL dan SDA. Sirkuit ini berisi resistor yang memungkinkan Anda memberikan level sinyal yang diperlukan. Papan juga memiliki tempat khusus untuk memasang sensor suhu DS18B20. Kontak dibagi menjadi 2 kelompok, pitch 2,54 mm. Grup kontak pertama berisi pin berikut:

    • DS – keluaran untuk sensor DS18B20;
    • SCL – garis jam;
    • SDA – jalur data;
    • VCC – 5V;

    Grup kontak kedua berisi:

    • meter persegi – 1 MHz;
    • BAT – masukan untuk baterai litium.

    Untuk terhubung ke papan Arduino, Anda memerlukan papan itu sendiri (dalam hal ini kami mempertimbangkan Arduino Uno), modul jam waktu nyata RTC DS1307, kabel dan kabel USB.

    Untuk menghubungkan pengontrol ke Arduino digunakan 4 pin - VCC, ground, SCL, SDA.. VCC dari jam dihubungkan ke 5V di Arduino, ground dari jam dihubungkan ke ground dari Arduino, SDA - A4, SCL - A5.

    Untuk mulai bekerja dengan modul jam, Anda perlu menginstal perpustakaan DS1307RTC, TimeLib dan Wire. Anda juga dapat menggunakan RTCLib untuk bekerja.

    Memeriksa modul RTC

    Saat Anda menjalankan kode pertama, program akan membaca data dari modul satu kali per detik. Pertama, Anda dapat melihat bagaimana program berperilaku jika Anda melepas baterai dari modul dan menggantinya dengan yang lain saat papan Arduino tidak terhubung ke komputer. Anda perlu menunggu beberapa detik dan melepas baterai, pada akhirnya jam tangan akan reboot. Kemudian Anda perlu memilih contoh dari menu Contoh→RTClib→ds1307. Penting untuk mengatur kecepatan transmisi dengan benar ke 57600 bps.

    Saat Anda membuka jendela Serial Monitor, baris berikut akan muncul:

    Waktu akan menunjukkan 0:0:0. Ini karena jam tangan kehilangan tenaga dan berhenti menghitung waktu. Oleh karena itu, baterai tidak boleh dilepas saat modul sedang beroperasi.

    Untuk mengatur waktu pada modul, Anda perlu menemukan garis di sketsa

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

    Baris ini akan berisi data dari komputer yang digunakan untuk mem-flash modul jam waktu nyata. Untuk pengoperasian yang benar, Anda harus terlebih dahulu memeriksa kebenaran tanggal dan waktu di komputer, dan baru kemudian mulai mem-flash modul jam. Setelah pengaturan, monitor akan menampilkan data berikut:

    Penyiapan dilakukan dengan benar dan tidak perlu lagi mengkonfigurasi ulang jam waktu nyata.

    Waktu membaca. Setelah modul dikonfigurasi, permintaan waktu dapat dikirim. Hal ini dilakukan dengan menggunakan fungsi now(), yang mengembalikan objek DateTime yang berisi informasi waktu dan tanggal. Ada sejumlah perpustakaan yang digunakan untuk membaca waktu. Misalnya, RTC.year() dan RTC.hour() - keduanya memperoleh informasi tentang tahun dan jam secara terpisah. Saat bekerja dengan mereka, masalah mungkin muncul: misalnya, permintaan untuk menampilkan waktu akan dilakukan pada 1:19:59. Sebelum menunjukkan waktu 1:20:00, jam akan menampilkan waktu 1:19:00, artinya satu menit akan hilang. Oleh karena itu, disarankan untuk menggunakan perpustakaan ini jika pembacaan jarang terjadi - setiap beberapa hari sekali. Ada fungsi lain untuk memanggil waktu, tetapi jika Anda perlu mengurangi atau menghindari kesalahan, lebih baik gunakan sekarang() dan ekstrak bacaan yang diperlukan darinya.

    Contoh proyek dengan modul dan tampilan jam i2C

    Proyek ini adalah jam biasa; waktu yang tepat akan ditampilkan pada indikator, dan titik dua di antara angka-angka tersebut akan berkedip dengan interval sekali setiap detik. Untuk mengimplementasikan proyek ini, Anda memerlukan papan Arduino Uno, indikator digital, jam waktu nyata (dalam hal ini, modul ds1307 yang dijelaskan di atas), pelindung untuk koneksi (dalam hal ini, Troyka Shield digunakan), baterai untuk jam dan kabel.

    Proyek ini menggunakan indikator empat digit sederhana pada chip TM1637. Perangkat ini memiliki antarmuka dua kabel dan menyediakan 8 tingkat kecerahan monitor. Hanya digunakan untuk menampilkan waktu dalam format jam:menit. Indikatornya mudah digunakan dan mudah dihubungkan. Ini bermanfaat untuk digunakan pada proyek yang tidak memerlukan verifikasi data setiap menit atau setiap jam. Untuk memperoleh informasi lebih lengkap mengenai waktu dan tanggal digunakan monitor LCD.

    Modul jam terhubung ke pin SCL/SDA milik bus I2C. Anda juga perlu menghubungkan ground dan listrik. Terhubung ke Arduino dengan cara yang sama seperti dijelaskan di atas: SDA – A4, SCL – A5, ground dari modul ke ground dari Arduino, VCC -5V.

    Indikatornya terhubung secara sederhana - pin CLK dan DIO-nya terhubung ke pin digital mana pun di papan.

    Sketsa. Untuk menulis kode, gunakan fungsi pengaturan, yang memungkinkan Anda menginisialisasi jam dan indikator serta mencatat waktu kompilasi. Pencetakan waktu ke layar akan dilakukan menggunakan loop.

    #termasuk #include "TM1637.h" #include "DS1307.h" //Anda perlu menyertakan semua perpustakaan yang diperlukan untuk bekerja dengan jam dan tampilan. char waktu kompilasi = __TIME__; //waktu kompilasi. #define DISPLAY_CLK_PIN 10 #define DISPLAY_DIO_PIN 11 //angka dari output Arduino yang terhubung dengan layar; void setup() ( display.set(); display.init(); //menghubungkan dan mengkonfigurasi layar. clock.begin(); //menghidupkan jam. byte hour = getInt(compileTime, 0); byte menit = getInt( compilerTime, 2); byte second = getInt(compileTime, 4); //mendapatkan waktu. clock.fillByHMS(jam, menit, detik); informasi ke dalam memori internal, mulai membaca waktu ) void loop() ( int8_t timeDisp; //tampilkan pada masing-masing empat bit. clock.getTime();//permintaan untuk mendapatkan waktu. timeDisp = clock.hour / 10; timeDisp = jam.jam % 10; timeDisp = jam.menit / 10; timeDisp = jam.menit % 10; //berbagai operasi untuk mendapatkan puluhan, satuan jam, menit, dll. display.display(timeDisp); .point(clock.second % 2 ? POINT_ON: POINT_OFF);//menghidupkan dan mematikan titik dua setelah satu detik) char getInt(const char* string, int startIndex) ( return int(string - "0") * 10 + int(string) - "0"; //tindakan untuk menulis waktu dengan benar ke dalam bilangan bulat dua digit. Jika tidak, hanya beberapa simbol yang akan ditampilkan di layar. )

    Setelah ini, sketsa perlu dimuat dan waktu akan ditampilkan di monitor.

    Program ini dapat sedikit dimodernisasi. Saat power dimatikan, sketsa yang tertulis di atas akan menyebabkan tampilan menunjukkan waktu yang telah diatur saat kompilasi setelah dinyalakan. Dalam fungsi setup, setiap waktu yang telah berlalu dari 00:00:00 hingga awal kompilasi akan dihitung. Hash ini akan dibandingkan dengan apa yang disimpan di EEPROM, yang dipertahankan ketika daya dimatikan.

    Untuk menulis dan membaca waktu ke atau dari memori non-volatile, Anda perlu menambahkan fungsi EEPROMWriteInt dan EEPROMReadInt. Mereka diperlukan untuk memeriksa apakah hash cocok/tidak cocok dengan hash yang dicatat di EEPROM.

    Proyek ini dapat ditingkatkan. Jika Anda menggunakan monitor LCD, Anda dapat membuat proyek yang menampilkan tanggal dan waktu di layar. Koneksi semua elemen ditunjukkan pada gambar.

    Akibatnya, kode perlu menentukan perpustakaan baru (untuk layar kristal cair ini adalah LiquidCrystal), dan menambahkan baris ke fungsi loop() untuk mendapatkan tanggal.

    Algoritma operasinya adalah sebagai berikut:

    • Menghubungkan semua komponen;
    • Periksa - waktu dan tanggal pada layar monitor akan berubah setiap detik. Jika waktu di layar salah, Anda perlu menambahkan fungsi RTC.write (tmElements_t tm) ke sketsa. Masalah dengan waktu yang salah disebabkan oleh fakta bahwa modul jam mengatur ulang tanggal dan waktu menjadi 00:00:00 01/01/2000 ketika dimatikan.
    • Fungsi tulis memungkinkan Anda mendapatkan tanggal dan waktu dari komputer, setelah itu parameter yang benar akan ditunjukkan di layar.

    Kesimpulan

    Modul jam digunakan di banyak proyek. Mereka diperlukan untuk sistem pencatatan data, saat membuat pengatur waktu dan perangkat kontrol yang beroperasi sesuai jadwal tertentu, pada peralatan rumah tangga. Dengan modul yang tersedia secara luas dan murah, Anda dapat membuat proyek seperti jam alarm atau pencatat data sensor, merekam informasi ke kartu SD, atau menampilkan waktu di layar tampilan. Dalam artikel ini, kita melihat skenario penggunaan umum dan opsi koneksi untuk jenis modul paling populer.