Jam tangan biner. Jam pada mikrokontroler AVR dengan jam biner DIY DS1307

Semuanya dimulai dengan keinginan untuk membuat perangkat yang sepenuhnya selesai pada mikrokontroler AVR.

Pilihannya jatuh pada jam biner, karena Mereka mudah dibuat dan terlihat cukup mengesankan. Dan juga karena saya selalu menyukai plasmoid jam biner dari KDE yang terlihat seperti ini:

Apa itu jam biner?

Bagi yang belum mengetahui apa itu jam biner dan cara menentukan waktu darinya, saya akan membuat sedikit penyimpangan. Jam biner hanyalah sebuah jam yang menunjukkan waktu dalam sistem bilangan biner (atau biner), bukan sistem bilangan desimal yang biasa kita gunakan.

Jam biner hadir dalam berbagai jenis (seperti jam biasa pada umumnya) - dengan jumlah dan lokasi indikator yang berbeda, dengan atau tanpa detik, dengan format waktu 24 atau 12 jam, dll. Saya memutuskan untuk menggunakan opsi yang semirip mungkin dengan plasmoid dari KDE yang disebutkan di atas:


Jam terdiri dari enam kolom vertikal - dua kolom untuk jam, dua untuk menit, dan dua untuk detik (dari kiri ke kanan). Setiap kolom pada dasarnya mewakili satu digit (yaitu dua digit jam, menit, dan detik).

Jam memiliki empat garis horizontal, karena kita harus dapat menampilkan angka dari nol hingga sembilan (setidaknya untuk angka paling tidak signifikan), dan representasi biner dari sembilan adalah 1001 , berisi empat digit (bit). Digit terkecil ada di bagian bawah.

Cara termudah untuk memahami jam berapa yang ditampilkan adalah dengan menganalisis “dial” dari kiri ke kanan, dari bawah ke atas. Mari kita tuliskan nilai bilangan biner yang diwakili oleh kolom paling kiri jam yang ditunjukkan pada gambar di atas (dengan asumsi indikator yang menyala berarti satu, dan indikator yang padam berarti nol): 0010 dalam sistem bilangan biner memang demikian 2 - dalam desimal. Mari kita tuliskan nilai kolom kedua dengan cara yang sama: 0001 dalam sistem bilangan biner (seperti dalam desimal), atau hanya satu. Artinya, pada jam 21 jam. Dengan cara yang sama Anda dapat membaca tampilan jam 35 menit dan 28 detik Dengan sedikit latihan, Anda akan dapat membaca waktu dari jam biner hampir secepat jam biasa.

Penerapan

Jadi idenya jelas, mari kita lanjutkan ke implementasi.

Mari kita mulai dengan indikator ("dial") - yang merupakan kisi-kisi LED.

Karena jam memiliki 4 baris horizontal dan 6 baris vertikal, jumlah LED yang dibutuhkan adalah 6 * 4 = 24. Faktanya, Anda dapat menggunakan lebih sedikit LED, karena tidak semua digit akan digunakan - misalnya, digit jam yang paling signifikan (kolom paling kiri) dapat menunjukkan angka tidak lebih dari dua (dengan format waktu dua puluh jam), yang berarti Anda dapat menyimpan sebanyak dua LED. Tapi saya tidak melakukan ini dan memasang semua 24 LED, karena... ingin (di masa depan) menggunakan jam tangan ini untuk menampilkan pesan teks sederhana.

Anda memerlukan tombol untuk mengatur waktu. Ada tiga di antaranya: tombol pertama mengalihkan jam tangan ke mode pengaturan waktu dan sebaliknya. Tombol kedua, pemilihan digit, mengganti kolom di mana waktu sedang disesuaikan. Dan terakhir, yang ketiga menambah waktu di kolom yang dipilih sebanyak satu.

ATMega32 digunakan sebagai mikrokontroler. Tentu saja, tidak perlu menggunakan mikrokontroler sekuat itu untuk tugas sederhana seperti itu, tapi saya sudah punya satu, jadi saya menggunakannya.

Skema dan PCB

Rangkaiannya cukup standar: mikrokontroler, power supply, reset, konektor untuk menghubungkan programmer. Sebuah jam kuarsa terhubung ke TOSC1 dan TOSC2 dari mana jam akan berdetak. Tombol pengaturan waktu terhubung ke tegangan suplai. Sepuluh output LED (6 kolom + 4 baris). Sebuah resistor dihubungkan ke setiap baris horizontal untuk membatasi arus melalui LED.

Papan sirkuit tercetak tersebut ternyata satu sisi, namun masih dengan dua jumper di sisi lainnya (ditandai dengan warna merah), yang cukup mudah dibuat dari kawat tembaga tipis.

Bingkai

Ini mungkin bagian yang paling tidak menarik. Tapi di saat yang sama, dialah yang menghabiskan sebagian besar waktunya.

Badannya sendiri terbuat dari papan kayu yang diikat dengan paku dan lem. Setelah perakitan, papan diampelas dengan hati-hati, ditutup dengan noda dan beberapa lapis pernis furnitur.

LED dipasang di kisi-kisi dengan partisi, terbuat dari penggaris kayu menggunakan gergaji ukir. Sepotong kertas kalkir biasa (yang digunakan untuk gambar atau pola) dimasukkan ke dalam setiap sel dengan LED untuk menyebarkan cahaya.

Kaca buram dua sisi direkatkan ke bagian depan jam tangan. Bagian belakang ditutup dengan penutup yang dipasang pada sekrup, tempat tombol pengaturan waktu menonjol.

Bagian perangkat lunak

Saya memutuskan untuk menulis program dalam assembler. Bukan karena ini adalah bahasa pengembangan yang paling nyaman, namun semata-mata untuk tujuan pendidikan. Kode sumber dapat ditemukan di bawah di bagian "File".

Saya tidak akan menjelaskan keseluruhan kodenya, karena... itu dikomentari dengan cukup rinci. Saya hanya akan menjelaskan poin-poin penting saja.

Pemindaian dilakukan secara kolom, yaitu pertama-tama LED kolom pertama saja yang menyala sebentar, lalu kolom kedua, dan seterusnya. Hal ini terjadi dengan sangat cepat dan mata tidak sempat menyadarinya, sehingga seolah-olah semua LED yang menyala menyala secara bersamaan. Untuk menampilkan nilai waktu dalam kolom, gunakan makro DISPLAY_COLUMN. Kolom dialihkan menggunakan timer Timer0.

Perubahan waktu terjadi sekali per detik ketika Timer/Counter2 diinterupsi. Karena frekuensi kristal adalah 32768 Hz dan pengatur waktu diatur ke 128, pengatur waktu satu byte akan meluap sekali per detik ( 32768 / (128 * 256) = 1 ), yang sangat nyaman.

Pemrosesan klik tombol terjadi pada prosedur button_stop_pressed untuk tombol untuk mengalihkan jam ke mode pengaturan dan kembali, button_set_pressed untuk tombol pengaturan waktu, dan button_switch_pressed untuk tombol saklar kolom. Perhatikan bahwa dalam prosedur button_stop_pressed waktu saat ini disimpan di EEPROM. Hal ini dilakukan agar waktu tidak diatur ulang jika diperlukan, misalnya untuk mengalihkan jam ke soket lain (saat jam dihidupkan, waktu dibaca dari EEPROM).

Semua "pekerjaan" utama, seperti polling status tombol, mengganti kolom pemindaian aktif dan menampilkan waktu, terjadi di utama . Inisialisasi awal dilakukan di mengatur ulang.

Hasil

Hasilnya bisa dilihat pada video di bawah ini. Beberapa tahapan proses pembuatan juga terekam di sana.

File

Kode sumber untuk firmware, skema, dan papan pengkabelan terdapat di repositori ini di GitLab.

Sebagai sebuah kesimpulan

Secara umum, untuk perangkat pertama, menurut saya hasilnya cukup baik.

Jika Anda menemukan ketidakakuratan dalam artikel ini, atau jika menurut Anda ada sesuatu yang perlu dijelaskan lebih detail, silakan tulis di komentar.

Selamat siang, para amatir radio yang terkasih. Saya persembahkan untuk perhatian Anda yang biner, saya menemukan sirkuit di Radokot, saya baru saja mengubah firmware untuk resonator kuarsa 7,2 MHz (karena sudah lama berdebu di rak dan tidak tahu di mana harus menggunakannya, Saya membuat ulang papan, karena penulis mengembangkannya, menurut saya kabelnya kurang tepat (saya harap dia tidak tersinggung dengan kata-kata saya), menambahkan ionistor ke saluran listrik - ini adalah kapasitor berkapasitas tinggi, 0,47 Farad

(di foto berwarna hitam, berbentuk persegi panjang, tertutup rapat dari semacam radio mobil), agar waktu tidak diatur ulang ketika relay UPS diaktifkan (di sinilah saya akan membuat jam ini), dan stabilizer 78L05, karena catu daya saya yang tidak pernah terputus tidak memiliki tegangan 5V (semua logika di dalamnya ditenagai oleh 12V). Dan apa? Entah bagaimana UPS terlihat terlalu sederhana, dan sekarang akan ada waktu untuk menunjukkan dan juga membantu berpikir dalam kode biner, yang akan mencegah otak mengalami atrofi.


Saya harap semua orang tahu cara mengubah angka dari desimal ke biner? Saya akan mengulanginya untuk berjaga-jaga. Dengan empat bit Anda dapat mengirimkan angka dari 1 hingga 15, harga bit dihitung dari kanan ke kiri, yaitu 8_4_2_1, seperti yang Anda lihat, harga bit yang lebih tinggi sama dengan dua kali harga bit yang lebih rendah. Contoh: mari kita ubah 5 dari sistem desimal ke biner, kita mendapatkan 0_1_0_1, yaitu, kita menjumlahkan harga bit sama dengan harga logis. Dan sekarang, sebaliknya, 1_0_0_1 akan menjadi 8+1=9. Mengerti? Besar.


Pada jam tangan ini, LED yang menyala berarti satu, dan LED yang tidak bercahaya berarti nol. Saya melampirkan artikel foto perangkat yang saya ulangi.

Video pendek berdurasi setengah menit tentang jam kerja

Karena ingin merakit jam biner, saya tidak pernah menemukan desain siap pakai yang dapat diterima di Internet. Sebagian besar jam tangan memiliki kelemahan serius - ketika daya dimatikan, pengaturan waktu hilang. Untungnya, sesaat sebelum ini, saya mulai menguasai bahasa C dan mikrokontroler AVR. Jadi, diputuskan untuk memperkuat pengetahuan yang diperoleh dengan pengalaman praktis, dan pada saat yang sama menemukan kembali rodanya. Saya juga sangat menyukai LED berkedip hijau.



Skema



RTC

Masalah menyimpan pengaturan saat ini diselesaikan dengan sempurna oleh jam waktu nyata (RTC). Pilihan saya jatuh pada chip DS1307.

Menurut pabrikannya, jika listrik dimatikan dapat menghemat waktu dan tanggal selama 10 tahun, hanya memakan energi baterai lithium CR2032. Artinya, jam terus berdetak, menjaga keakuratan yang dapat diterima. Waktu tidak hilang; saat kita menghidupkan kembali jam tangan, kita mendapatkan waktu sebenarnya pada pelat jam, dan bukan waktu pada saat jam dimatikan. Sirkuit mikro berkomunikasi dengan mikrokontroler melalui “bus persegi” I 2 C, melaporkan waktu yang tepat dan menerima nilai barunya.

Inti dari perangkat

Pilihan mikrokontroler Mega32a ditentukan oleh faktor-faktor berikut:
Ada cukup port untuk menghindari penggunaan tampilan dinamis, yang saya tidak suka, terutama karena mengganggu mata (berkedip pada frekuensi tinggi juga tidak wajar). Saya mengenalnya saat bermain dengan mikrokontroler PIC dalam bahasa Proton PICBasic, dan jika memungkinkan untuk tidak menggunakan tampilan dinamis, saya lebih suka melakukannya.
Biaya yang relatif rendah yaitu 130 rubel (Mega16a, misalnya, harganya sama), dan dengan diskon biasanya 104 rubel.
Hapus paket QPF-44, dengan pinout yang nyaman


Port “A” menampilkan detik, port “B” menampilkan menit, dan port “C” menampilkan jam. Sangat mudah bahwa Anda dapat menetapkan nilai waktu yang diambil dari DS1307 ke port tanpa perubahan apa pun. Tombol terhubung ke port “D” (pin 3 – 7), pin 0 dan 1 masing-masing berfungsi sebagai jalur jam (SCL) dan jalur data serial (SDA). Chip RTC dikonfigurasikan sehingga menghasilkan pulsa pada frekuensi 1 hertz pada kaki ketujuh. Kaki ini terhubung ke pin ke-3 port “D”. Port ini sendiri dikonfigurasikan sebagai input, dan untuk berjaga-jaga, pull-up internal ke catu daya plus disertakan, diduplikasi dengan resistor SMD di bagian luar. Tindakan seperti itu sepenuhnya melindungi dari segala kejutan.

LED


Saya memilih LED dalam wadah matte dengan luminositas rendah. Pertama, dioda terang dalam wadah transparan diuji, tetapi bahkan dengan arus 3 mA, dioda tersebut bersinar terlalu terang dan tidak merata, yang sekali lagi menyebabkan ketidaknyamanan. Dengan penurunan tegangan pada dioda sebesar 2 volt, tegangan suplai 5 volt dan resistor 1 kOhm, maka nilai arus yang mengalir melalui dioda akan sama dengan (5 – 2)/1000 = 3 mA. Nilai ini dipilih secara empiris, dan kecerahan cahayanya sempurna untuk ruangan redup. Jika Anda berencana memasang jam tangan di bawah sinar matahari langsung, maka nilai resistor harus dikurangi, hingga 200 ohm, untuk cahaya yang lebih terang (terima kasih Cap).

Tombol

Pada papan terpisah yang memiliki kancing, terdapat “sekring” (akan melindungi kita dari tembakan yang tidak disengaja di kepala), berupa tombol Bt6 lainnya. Waktu dapat diedit dengan menahannya terlebih dahulu.

Perangkat lunak

Kode ini ditulis di lingkungan CodeVisionAvr.
Program diawali dengan kita melakukan setting periferal mikrokontroler.
Konfigurasikan port (A,B,C – output, D – input)
Untuk berjaga-jaga, jeda 300 ms disediakan agar DS1307 punya waktu untuk "sadar"
Menginisialisasi "bus persegi"
Kami mengkonfigurasi chip RTC sehingga menghasilkan pulsa persegi panjang setiap detik pada pin SQW/OUT
Kami memeriksa apakah tombol CLR ditekan. Jika ya, setel ulang semua nilai ke 0
Aktifkan interupsi global
Ya, beberapa kata tentang mereka. Kami menggunakan interupsi eksternal INT0 pada PD2 di tepi jatuh, mis. setiap detik program akan menuju ke pengendali interupsi, di mana kita membaca nilai waktu dari DS1307 dan menampilkannya pada indikator LED.
Kita masuk ke dalam lingkaran tanpa akhir, di mana kita melakukan polling pada tombol-tombolnya
Jika tombol ditekan, tambahkan (kurangi) jam (menit) dan kirimkan nilai baru melalui I2C
Pada saat yang sama, kami memeriksa apakah nilai waktu baru sesuai dengan rentang 24 jam dan 60 menit.

Papan sirkuit tercetak

Papan dibuat menggunakan Teknologi Penyetrikaan Laser Kosmik Hebat pada textolite satu sisi. Saat membuat papan atas, kertas biasa digunakan (percobaan tidak berhasil).


Ada banyak variasi dari teknologi ini. Menurut saya, ini yang terbaik:
1. Potong sepotong PCB sesuai ukuran yang dibutuhkan.
2. Kami mengampelas ujungnya, menghilangkan gerinda yang berbahaya.
3. Lumasi papan masa depan dengan bubuk pembersih atau pasta gigi dan gosok dengan sisi spons yang keras hingga mengkilat.
4. Celupkan potongan kita selama beberapa puluh detik ke dalam larutan lemah besi klorida hangat sampai permukaan seragam, matte, berwarna coklat merah anggur muncul. Saat dikeluarkan dari larutan, cairan harus membasahi permukaan sepenuhnya.
5. Cuci kotoran dan keringkan dengan hati-hati, tanpa menyentuh permukaannya dengan jari atau benda berminyak lainnya. Segera letakkan di atas kertas bersih dengan sisi tembaga menghadap ke bawah untuk menghindari debu atau rambut.
6. Cetak gambar cermin pada kertas tipis (!) Glossy, Anda bisa memotongnya dari majalah, misalnya. Kami tidak menyentuh gambar itu dengan tangan kami. Gunting dengan hati-hati dan letakkan polanya di bawah.
7. Oleskan pada potongan PCB yang sudah disiapkan, setrika melalui 1-2 lapis kertas bersih, atur setrika ke suhu maksimum. 10 detik sudah cukup, karena jika Anda berlebihan, trek akan menjadi rata dan bertumpuk. Toner harus menempel sepenuhnya pada tembaga.
8. Rendam dengan air hangat mengalir, diamkan di dalam air selama 10 menit. Sobek dan kikis kertas dengan hati-hati. Sikat gigi bekas membantu saya dalam hal ini. Keluarkan sisa kertas dengan jarum. Toner masih tertinggal di PCB.
9. Panaskan larutan kuat besi klorida dalam penangas air, masukkan papan kita ke dalamnya dan percikkan selama beberapa menit (menurut aturan Van't Hoff, dengan peningkatan suhu sebesar 10 derajat, laju reaksi meningkat 2 kali lipat. Tembaga menghilang tepat di depan mata kita, Anda tidak bisa memanaskannya, tetapi Anda harus menunggu lebih lama.
10. Segera setelah semua tembaga yang tidak perlu hilang, matikan gas, cabut (misalnya dengan pinset) papan, coba cuci piring dan jari dari besi klorida. Kami mencucinya dari papan dengan air mengalir.
11. Ambil aseton (penghapus cat kuku) dan bersihkan tonernya. Anda bisa mencoba mengikisnya dengan amplas atau spons.
12. Bor lubang.
13. Ayo curang. Saya menggunakan LTI sebagai fluks, dan saya menyarankan Anda, namun, setelah penyalinan dan penyolderan, fluks ini harus dicuci (dengan aseton yang sama, atau lebih baik lagi dengan campuran alkohol dan bensin 1:1), karena LTIshka memiliki beberapa konduktivitas.
Semua pekerjaan harus dilakukan di area yang berventilasi, selama
banyak asap berbahaya yang dikeluarkan.


Papan dihubungkan satu sama lain menggunakan konektor PBS dan PLD. Yang pertama dihubungkan ke papan atas menggunakan kabel pemasangan tipis, dapat ditarik keluar, misalnya dari kabel atau adaptor LPT lama.


Yang kedua disolder ke papan bawah, dan pin yang mengarah ke keyboard ditekuk (lihat foto).

Papan sirkuit tercetak dalam format SprintLayout5.0 disertakan. Ada beberapa kesalahan pada foto, namun sudah diperbaiki pada file terlampir.

Firmware mikrokontroler

Untuk tujuan ini, programmer USBasp telah dirakit, yang dapat dilihat pada foto di atas. Ini adalah barang yang cukup bagus, mudah digunakan dan Anda dapat membawanya di saku Anda sepanjang tahun (saya harap tidak ada yang akan melakukan itu). Untuk mem-flash firmware mega32 Anda harus menginstal jumper "Slow SCK".
Sekering:
Sekering rendah = 0xC4
Sekering tinggi = 0xD9
Mikrokontroler kami di-clock dari osilator RC internal dengan frekuensi 8 MHz. Saya harus menonaktifkan antarmuka JTAG di PortC, jika tidak, beberapa LED tidak akan menyala.
Papan ini memiliki konektor ISP10 untuk flashing/debugging cepat.

Panel depan

Terbuat dari plat alumunium, lebar 40 mm dan tebal 1,5 mm. Ini memiliki 18 lubang yang dibor dengan diameter 5mm, dan 4 lubang dengan diameter 3mm untuk memasang rak.


Pertama, template dicetak dan ditempelkan ke piring. Selanjutnya lubang pilot dibor dengan bor 1,5 mm, setelah itu lubang utama dibor dengan bor dengan diameter yang dibutuhkan.


Terakhir, pelat dibengkokkan, diampelas dengan amplas halus dan dipoles dengan pasta Pemerintah Indonesia.
Templat disertakan dengan file terlampir sebagai file layout5.0

LED merah di pojok kiri atas

Mengulangi pulsa yang dihasilkan oleh DS1307 pada kaki ke-7, yaitu. berkedip setiap detik. Transistor MOSFET saluran-p kecil beroperasi dalam mode switching, membuka dan menutup seiring waktu dengan pulsa. Awalnya saya ingin membuat lampu latar (seperti Ambilight), yang untuknya saya membuat inverter CMOS pada sepasang transistor pelengkap (pastinya). Tapi aku tidak menyukainya. Untuk satu LED cukup satu transistor, bahkan bisa menggunakan pnp tipe bc857. Saya menggunakan mosfet bingkai terbuka irml6402 atau irml6302.

File

Sumber, file hex, papan sirkuit tercetak, skema, sirkuit proteus, dan sekering disertakan dalam gambar ini sebagai arsip. Saya tidak mempercayai penyimpanan file, saya belum memiliki server sendiri, jadi, menurut pendapat amatir saya, tempat penyimpanan yang paling dapat diandalkan adalah Habr. Pengguna Windows dapat mengakses file dengan membuka gambar yang disimpan menggunakan WinRar.
Ya, inilah gambarnya.

Video

Kesimpulan

Anda dapat menggunakan sumber listrik apa pun yang mampu mengalirkan 5 volt pada arus 70 mA. Port USB cukup cocok untuk ini. Yang utama adalah dayanya “bersih” dan tidak melebihi 5 volt. Memberi daya pada jam dari konverter DC-DC dari chip mc34063 dengan tingkat kebisingan ~50 mV, saya melihat gangguan saat mengatur waktu. Sekarang perangkat ini diberi daya oleh saklar yang tergantung di dekatnya. Ini menghasilkan tegangan 5 volt. Sisi baiknya, Anda juga perlu membuat perlindungan yang sangat mudah dalam bentuk dioda, dan semacam penstabil linier untuk 3,3 - 5 volt.
Tidak adanya fungsi jam alarm dan tampilan tanggal di jam tangan cukup beralasan: keduanya ada di telepon, yang berarti dengan kemungkinan besar tidak ada yang akan menggunakannya dalam jam tangan biner (terima kasih kepada Paman Occam untuk kesimpulan ini) .

Karena ingin merakit jam biner, saya tidak pernah menemukan desain siap pakai yang dapat diterima di Internet. Sebagian besar jam tangan memiliki kelemahan serius - ketika daya dimatikan, pengaturan waktu hilang. Untungnya, sesaat sebelum ini, saya mulai menguasai bahasa C dan mikrokontroler AVR. Jadi, diputuskan untuk memperkuat pengetahuan yang diperoleh dengan pengalaman praktis, dan pada saat yang sama menemukan kembali rodanya. Saya juga sangat menyukai LED berkedip hijau.



Skema



RTC

Masalah menyimpan pengaturan saat ini diselesaikan dengan sempurna oleh jam waktu nyata (RTC). Pilihan saya jatuh pada chip DS1307.

Menurut pabrikannya, jika listrik dimatikan dapat menghemat waktu dan tanggal selama 10 tahun, hanya memakan energi baterai lithium CR2032. Artinya, jam terus berdetak, menjaga keakuratan yang dapat diterima. Waktu tidak hilang; saat kita menghidupkan kembali jam tangan, kita mendapatkan waktu sebenarnya pada pelat jam, dan bukan waktu pada saat jam dimatikan. Sirkuit mikro berkomunikasi dengan mikrokontroler melalui “bus persegi” I 2 C, melaporkan waktu yang tepat dan menerima nilai barunya.

Inti dari perangkat

Pilihan mikrokontroler Mega32a ditentukan oleh faktor-faktor berikut:
Ada cukup port untuk menghindari penggunaan tampilan dinamis, yang saya tidak suka, terutama karena mengganggu mata (berkedip pada frekuensi tinggi juga tidak wajar). Saya mengenalnya saat bermain dengan mikrokontroler PIC dalam bahasa Proton PICBasic, dan jika memungkinkan untuk tidak menggunakan tampilan dinamis, saya lebih suka melakukannya.
Biaya yang relatif rendah yaitu 130 rubel (Mega16a, misalnya, harganya sama), dan dengan diskon biasanya 104 rubel.
Hapus paket QPF-44, dengan pinout yang nyaman


Port “A” menampilkan detik, port “B” menampilkan menit, dan port “C” menampilkan jam. Sangat mudah bahwa Anda dapat menetapkan nilai waktu yang diambil dari DS1307 ke port tanpa perubahan apa pun. Tombol terhubung ke port “D” (pin 3 – 7), pin 0 dan 1 masing-masing berfungsi sebagai jalur jam (SCL) dan jalur data serial (SDA). Chip RTC dikonfigurasikan sehingga menghasilkan pulsa pada frekuensi 1 hertz pada kaki ketujuh. Kaki ini terhubung ke pin ke-3 port “D”. Port ini sendiri dikonfigurasikan sebagai input, dan untuk berjaga-jaga, pull-up internal ke catu daya plus disertakan, diduplikasi dengan resistor SMD di bagian luar. Tindakan seperti itu sepenuhnya melindungi dari segala kejutan.

LED


Saya memilih LED dalam wadah matte dengan luminositas rendah. Pertama, dioda terang dalam wadah transparan diuji, tetapi bahkan dengan arus 3 mA, dioda tersebut bersinar terlalu terang dan tidak merata, yang sekali lagi menyebabkan ketidaknyamanan. Dengan penurunan tegangan pada dioda sebesar 2 volt, tegangan suplai 5 volt dan resistor 1 kOhm, maka nilai arus yang mengalir melalui dioda akan sama dengan (5 – 2)/1000 = 3 mA. Nilai ini dipilih secara empiris, dan kecerahan cahayanya sempurna untuk ruangan redup. Jika Anda berencana memasang jam tangan di bawah sinar matahari langsung, maka nilai resistor harus dikurangi, hingga 200 ohm, untuk cahaya yang lebih terang (terima kasih Cap).

Tombol

Pada papan terpisah yang memiliki kancing, terdapat “sekring” (akan melindungi kita dari tembakan yang tidak disengaja di kepala), berupa tombol Bt6 lainnya. Waktu dapat diedit dengan menahannya terlebih dahulu.

Perangkat lunak

Kode ini ditulis di lingkungan CodeVisionAvr.
Program diawali dengan kita melakukan setting periferal mikrokontroler.
Konfigurasikan port (A,B,C – output, D – input)
Untuk berjaga-jaga, jeda 300 ms disediakan agar DS1307 punya waktu untuk "sadar"
Menginisialisasi "bus persegi"
Kami mengkonfigurasi chip RTC sehingga menghasilkan pulsa persegi panjang setiap detik pada pin SQW/OUT
Kami memeriksa apakah tombol CLR ditekan. Jika ya, setel ulang semua nilai ke 0
Aktifkan interupsi global
Ya, beberapa kata tentang mereka. Kami menggunakan interupsi eksternal INT0 pada PD2 di tepi jatuh, mis. setiap detik program akan menuju ke pengendali interupsi, di mana kita membaca nilai waktu dari DS1307 dan menampilkannya pada indikator LED.
Kita masuk ke dalam lingkaran tanpa akhir, di mana kita melakukan polling pada tombol-tombolnya
Jika tombol ditekan, tambahkan (kurangi) jam (menit) dan kirimkan nilai baru melalui I2C
Pada saat yang sama, kami memeriksa apakah nilai waktu baru sesuai dengan rentang 24 jam dan 60 menit.

Papan sirkuit tercetak

Papan dibuat menggunakan Teknologi Penyetrikaan Laser Kosmik Hebat pada textolite satu sisi. Saat membuat papan atas, kertas biasa digunakan (percobaan tidak berhasil).


Ada banyak variasi dari teknologi ini. Menurut saya, ini yang terbaik:
1. Potong sepotong PCB sesuai ukuran yang dibutuhkan.
2. Kami mengampelas ujungnya, menghilangkan gerinda yang berbahaya.
3. Lumasi papan masa depan dengan bubuk pembersih atau pasta gigi dan gosok dengan sisi spons yang keras hingga mengkilat.
4. Celupkan potongan kita selama beberapa puluh detik ke dalam larutan lemah besi klorida hangat sampai permukaan seragam, matte, berwarna coklat merah anggur muncul. Saat dikeluarkan dari larutan, cairan harus membasahi permukaan sepenuhnya.
5. Cuci kotoran dan keringkan dengan hati-hati, tanpa menyentuh permukaannya dengan jari atau benda berminyak lainnya. Segera letakkan di atas kertas bersih dengan sisi tembaga menghadap ke bawah untuk menghindari debu atau rambut.
6. Cetak gambar cermin pada kertas tipis (!) Glossy, Anda bisa memotongnya dari majalah, misalnya. Kami tidak menyentuh gambar itu dengan tangan kami. Gunting dengan hati-hati dan letakkan polanya di bawah.
7. Oleskan pada potongan PCB yang sudah disiapkan, setrika melalui 1-2 lapis kertas bersih, atur setrika ke suhu maksimum. 10 detik sudah cukup, karena jika Anda berlebihan, trek akan menjadi rata dan bertumpuk. Toner harus menempel sepenuhnya pada tembaga.
8. Rendam dengan air hangat mengalir, diamkan di dalam air selama 10 menit. Sobek dan kikis kertas dengan hati-hati. Sikat gigi bekas membantu saya dalam hal ini. Keluarkan sisa kertas dengan jarum. Toner masih tertinggal di PCB.
9. Panaskan larutan kuat besi klorida dalam penangas air, masukkan papan kita ke dalamnya dan percikkan selama beberapa menit (menurut aturan Van't Hoff, dengan peningkatan suhu sebesar 10 derajat, laju reaksi meningkat 2 kali lipat. Tembaga menghilang tepat di depan mata kita, Anda tidak bisa memanaskannya, tetapi Anda harus menunggu lebih lama.
10. Segera setelah semua tembaga yang tidak perlu hilang, matikan gas, cabut (misalnya dengan pinset) papan, coba cuci piring dan jari dari besi klorida. Kami mencucinya dari papan dengan air mengalir.
11. Ambil aseton (penghapus cat kuku) dan bersihkan tonernya. Anda bisa mencoba mengikisnya dengan amplas atau spons.
12. Bor lubang.
13. Ayo curang. Saya menggunakan LTI sebagai fluks, dan saya menyarankan Anda, namun, setelah penyalinan dan penyolderan, fluks ini harus dicuci (dengan aseton yang sama, atau lebih baik lagi dengan campuran alkohol dan bensin 1:1), karena LTIshka memiliki beberapa konduktivitas.
Semua pekerjaan harus dilakukan di area yang berventilasi, selama
banyak asap berbahaya yang dikeluarkan.


Papan dihubungkan satu sama lain menggunakan konektor PBS dan PLD. Yang pertama dihubungkan ke papan atas menggunakan kabel pemasangan tipis, dapat ditarik keluar, misalnya dari kabel atau adaptor LPT lama.


Yang kedua disolder ke papan bawah, dan pin yang mengarah ke keyboard ditekuk (lihat foto).

Papan sirkuit tercetak dalam format SprintLayout5.0 disertakan. Ada beberapa kesalahan pada foto, namun sudah diperbaiki pada file terlampir.

Firmware mikrokontroler

Untuk tujuan ini, programmer USBasp telah dirakit, yang dapat dilihat pada foto di atas. Ini adalah barang yang cukup bagus, mudah digunakan dan Anda dapat membawanya di saku Anda sepanjang tahun (saya harap tidak ada yang akan melakukan itu). Untuk mem-flash firmware mega32 Anda harus menginstal jumper "Slow SCK".
Sekering:
Sekering rendah = 0xC4
Sekering tinggi = 0xD9
Mikrokontroler kami di-clock dari osilator RC internal dengan frekuensi 8 MHz. Saya harus menonaktifkan antarmuka JTAG di PortC, jika tidak, beberapa LED tidak akan menyala.
Papan ini memiliki konektor ISP10 untuk flashing/debugging cepat.

Panel depan

Terbuat dari plat alumunium, lebar 40 mm dan tebal 1,5 mm. Ini memiliki 18 lubang yang dibor dengan diameter 5mm, dan 4 lubang dengan diameter 3mm untuk memasang rak.


Pertama, template dicetak dan ditempelkan ke piring. Selanjutnya lubang pilot dibor dengan bor 1,5 mm, setelah itu lubang utama dibor dengan bor dengan diameter yang dibutuhkan.


Terakhir, pelat dibengkokkan, diampelas dengan amplas halus dan dipoles dengan pasta Pemerintah Indonesia.
Templat disertakan dengan file terlampir sebagai file layout5.0

LED merah di pojok kiri atas

Mengulangi pulsa yang dihasilkan oleh DS1307 pada kaki ke-7, yaitu. berkedip setiap detik. Transistor MOSFET saluran-p kecil beroperasi dalam mode switching, membuka dan menutup seiring waktu dengan pulsa. Awalnya saya ingin membuat lampu latar (seperti Ambilight), yang untuknya saya membuat inverter CMOS pada sepasang transistor pelengkap (pastinya). Tapi aku tidak menyukainya. Untuk satu LED cukup satu transistor, bahkan bisa menggunakan pnp tipe bc857. Saya menggunakan mosfet bingkai terbuka irml6402 atau irml6302.

File

Sumber, file hex, papan sirkuit tercetak, skema, sirkuit proteus, dan sekering disertakan dalam gambar ini sebagai arsip. Saya tidak mempercayai penyimpanan file, saya belum memiliki server sendiri, jadi, menurut pendapat amatir saya, tempat penyimpanan yang paling dapat diandalkan adalah Habr. Pengguna Windows dapat mengakses file dengan membuka gambar yang disimpan menggunakan WinRar.
Ya, inilah gambarnya.

Video

Kesimpulan

Anda dapat menggunakan sumber listrik apa pun yang mampu mengalirkan 5 volt pada arus 70 mA. Port USB cukup cocok untuk ini. Yang utama adalah dayanya “bersih” dan tidak melebihi 5 volt. Memberi daya pada jam dari konverter DC-DC dari chip mc34063 dengan tingkat kebisingan ~50 mV, saya melihat gangguan saat mengatur waktu. Sekarang perangkat ini diberi daya oleh saklar yang tergantung di dekatnya. Ini menghasilkan tegangan 5 volt. Sisi baiknya, Anda juga perlu membuat perlindungan yang sangat mudah dalam bentuk dioda, dan semacam penstabil linier untuk 3,3 - 5 volt.
Tidak adanya fungsi jam alarm dan tampilan tanggal di jam tangan cukup beralasan: keduanya ada di telepon, yang berarti dengan kemungkinan besar tidak ada yang akan menggunakannya dalam jam tangan biner (terima kasih kepada Paman Occam untuk kesimpulan ini) .

Membuat jam biner adalah impian setiap nerd di dunia, bukan? (...atau mungkin menggunakan laser biru untuk lightsaber :)). Saya memikirkan ide ini selama tahun terakhir sekolah saya dan kemudian memutuskan untuk merancang dan membuat jam tangan biner.

Saat ini saya baru mempelajari mikrokontroler, jadi untuk proyek ini saya memilih yang populer PIC16F628.

Untuk menunjukkan waktu pada jam, digunakan 4 LED untuk menampilkan jam dan 6 LED untuk menampilkan menit:

Anda juga dapat menggunakan LED hijau untuk menunjukkan jam, dan LED merah untuk menunjukkan menit:

Bagaimana cara meningkatkan akurasi waktu?

Untuk meningkatkan akurasi jam saya menggunakan Timer 1 (TMR1) yang beroperasi dalam mode asynchronous, idenya sebagai berikut:
Untuk memperpanjang masa pakai baterai, mikrokontroler berada dalam mode tidur ketika tidak ada waktu yang ditampilkan, dan LED hanya akan menyala selama beberapa detik setelah menekan salah satu dari dua tombol. Dalam mode tidur, hampir semua fungsi mikrokontroler dinonaktifkan, namun pengatur waktu/penghitung TMR1 tetap beroperasi dalam mode asinkron, sehingga waktu dapat dihitung saat PIC16F628 tidur.

Ketika register TMR1 16-bit mencatat overflow, sinyal interupsi akan menyebabkan mikrokontroler bangun, dalam hal ini penghitung detik akan diperbarui dan mikrokontroler akan kembali ke mode tidur.

Untuk menggunakan TMR1 dalam mode asynchronous, Anda perlu mengatur sumber clock, hal ini dilakukan dengan menghubungkan kristal 32,768 Hz antara pin RB7 dan RB6.

Bagaimana cara menunjukkan waktu?

Waktu ditampilkan dengan menekan salah satu dari dua tombol. Sekarang pertanyaannya adalah: bagaimana cara menentukan status tombol jika mikrokontroler dalam mode tidur? Tentu saja, saya menggunakan interupsi perubahan level pada pin RB4 dan RB5, ketika status kontak ini berubah, pengontrol akan aktif. Ketika Anda menekan tombol, pengatur waktu TMR0 akan dimuat dengan nilai yang digunakan untuk mengukur waktu tampilan, dan interupsi akan diaktifkan; ketika TMR0 meluap, semua LED akan padam dan mikrokontroler akan kembali ke mode tidur.

Algoritma operasi jam:

Mulai program (inisialisasi);
- Masuk ke mode tidur.

Jika terjadi luapan TMR1
- Kebangkitan;
- Saatnya memperbarui;
- Masuk ke mode tidur.

Jika terjadi interupsi eksternal
- Kebangkitan;
- Indikasi waktu menggunakan LED;
- Menunggu TMR0 meluap;
- Matikan LED;
- Masuk ke mode tidur.

Bagaimana cara mengatur waktunya?

Dalam hal ini, waktu diatur menggunakan tombol dan hanya saat jam tangan dinyalakan untuk pertama kali.

Diagram jam

Bodinya terbuat dari plastik, tempat baterai untuk baterai CR2032 dipotong menggunakan mesin CNC. Talinya hanya direkatkan ke bagian bawah casing.

Saat memprogram mikrokontroler, atur bit konfigurasi seperti yang ditunjukkan pada gambar di bawah ini:

Arsip untuk artikel "Jam tangan biner di PIC16F628"
Keterangan: Kode sumber program (Assembler)
Ukuran file: 33,9 KB Jumlah unduhan: 610