Kami tidak mencari cara sederhana.

Sebelumnya, ini adalah
publikasi pertama saya
yang menyebabkan resonansi di kalangan pengguna Habr. Memutuskan untuk tidak berhenti. Kami terus memeras yang mustahil dari ATtiny13. Saya segera memperingatkan Anda, solusi yang dijelaskan adalah non-standar lagi, dan seseorang dapat menyebabkan kemarahan dan disonansi kognitif ("Dan apa gunanya artikel itu? Perlihatkan elemen apa yang dapat dihubungkan?"). Selain itu, solusi seperti itu juga sangat tidak praktis, yang akan saya tulis lebih terinci di bawah ini. Tetapi kebetulan bahwa solusi standar telah lama dikenal, dan membaca tentang mereka tidak selalu menarik, tetapi menulis tidak berterima kasih.
Saya sangat suka anak ini ATtiny13. Dia memiliki otak yang cukup untuk menyelesaikan banyak masalah sehari-hari (nyalakan lampu, ventilasi,
lari ke toko untuk minum bir ). Dan harganya hanya konyol. Ini hanya beberapa kaki, dan tidak ada pegangan sama sekali. Karena itu, Anda harus pergi ke segala macam trik untuk menyelesaikan masalah kekurangan kaki.
Dalam proses mempelajari pemrograman mikrokontroler (di lingkungan Arduino, jangan beri tahu siapa pun) Saya, seperti banyak orang, melewati langkah menghubungkan sensor jarak ultrasonik, seperti ini:

Karena metode pengiriman informasi dari sensor ke controller mudah dipermalukan, ATtiny13 mengatasi ini dengan mudah. Maka itu perlu untuk menampilkan informasi pada indikator tujuh segmen menggunakan register geser. Artinya, skema tampilan bagian itu beberapa kali lebih besar dari pengontrol itu sendiri. Pada saat itu saya bermain-main dan pindah.
Baru-baru ini, saya berpikir, apa lagi yang akan menjadi tugas besar untuk ditugaskan ke Tinka? Apa yang masih tidak bisa dia tangani dalam contoh yang dijelaskan. Hal pertama yang saya ingat tentang indikasi. Beberapa waktu lalu saya sudah mencari informasi tentang topik serupa. Kemudian saya menemukan
opsi yang menarik .21 segmen dari 5 kaki controller. Wow! Saya bahkan tidak membutuhkan banyak, dua tanda sudah cukup, ditambah satu titik, total 15 segmen. Dan jika dengan empat kaki? Kemudian dapatkan maksimal 13 segmen, tidak cukup. Saat melihat rangkaian, keinginan muncul segera untuk berkumpul dan mencoba, meskipun tidak mudah untuk membuat algoritma operasi. Tetapi dengan melihat lebih dekat, Anda mengerti bahwa itu tidak akan berfungsi untuk mengumpulkan, hewan tujuh segmen seperti itu tidak ada di alam (kemungkinan besar). Anda dapat membuat, tentu saja, tetapi ini adalah level yang berbeda. Kemudian ide itu ditunda hingga masa yang lebih baik.
Offtopic: Mengapa tidak ada indikator tujuh segmen dengan logika terintegrasi? Di mana pengembang mencari? Seberapa mudah instalasi dan kontrol - dua power leg dan 3 (1, 2) data leg. Dan bagaimanapun, mereka bahkan berada di USSR: 490IP1, 490IP2. Di dalam indikator yang paling biasa untuk 2 ... 4 digit ada banyak ruang untuk menempatkan microcircuit chip, dan harga register geser adalah 0,064 cu bersama dengan kasing. Oh baiklah
Jadi saya berpikir lagi, bagaimana cara mengurangi jumlah kaki untuk bekerja dengan indikator tujuh segmen? Output pengontrol dapat mengambil tiga status (sebenarnya 4, tapi sekarang tidak masalah). Apakah ada cara untuk menggunakan ini? Jika dua negara sehubungan dengan LED dapat diartikan hanya sebagai bersinar, bukan bersinar, maka dengan tiga itu sedikit lebih menarik. Saya belum menemukan cara menggunakannya, tetapi skema berikut muncul di benak saya:

Jika output pengontrol dalam keadaan nol, LED tidak menyala (yang jelas).
Jika output dalam status unit, maka LED menyala, yang juga bisa dimengerti.
Tetapi jika output bukan output sama sekali, tetapi terhubung ke input, maka arus mengalir melalui rangkaian dua resistor dan LED HL1, yang menciptakan penurunan tegangan pada titik koneksi resistor kira-kira (5-1.7) / (2.2 + 1.5) * 1.5 + 1.7 = 3.0 V. Ini tidak cukup untuk arus mengalir melalui sirkuit VD1_R3_HL2 (sekitar 3,4 V diperlukan). VD1 adalah LED tambahan yang digunakan sebagai dioda zener (penstabil lebih tepat), oleh karena itu kami tidak akan menganggapnya sebagai LED, agar tidak bingung. Tidak masalah jika resistor pull-up dihidupkan di dalam mikrokontroler, resistansi (20 kOhm) praktis tidak mempengaruhi situasi. Saya tidak datang ke peringkat seperti itu segera, sebelum itu saya mencoba dengan dioda biasa seperti VD1, itu juga bekerja cukup baik dengan resistor yang sama R1 dan R2. Tetapi lebih baik R2 sekitar satu setengah kali lebih besar dari R1. Dan saya hampir lupa hal yang paling penting: semuanya dijelaskan hanya mungkin dengan penggunaan LED
merah baik di indikator dan yang tambahan. Dalam kasus ekstrim, indikator
atau LED tambahan dapat diterapkan hijau. Dan dengan tegangan suplai 4,5 V hingga 5 V.
Apa yang kita miliki pada akhirnya? Tiga status: tidak ada LED (0) bersinar, HL1 (1) bersinar, atau HL1 dan HL2 (2) bersinar. Sangat mirip dengan sistem terner. Tapi kita tidak bisa menyalakan HL2 tanpa HL1, ini harus diingat. Tapi sekarang dengan bantuan empat kaki mikrokontroler kita dapat mengontrol delapan LED (saya ingin berpikir begitu).
Kemudian saya mencoba memecah segmen indikator menjadi berpasangan (seperti di taman kanak-kanak: perempuan). Syarat utamanya adalah bahwa pada setiap pasangan salah satu segmen tidak dapat bersinar dengan sendirinya, diskriminasi semacam itu. Inilah yang saya dapatkan:

Empat pasang segmen, dalam setiap huruf kapital ditunjukkan segmen dominan, yang dapat bekerja dengan sendirinya, yang kedua hanya bisa bersamanya. Anda mungkin memperhatikan bahwa segmen âaâ bergerak dengan dua sekaligus, dan tidak ada yang sampai pada titik yang buruk sama sekali. Seperti apa kehidupan ini!
Tetapi dengan pasangan ini Anda dapat menampilkan (hampir) semua angka:
Setiap pasangan dicat dengan warnanya sendiri. Seorang penonton yang penuh perhatian memperhatikan bahwa ada sesuatu yang salah dengan deuce. Kami tidak akan fokus pada ini untuk saat ini. Saya mencoba beberapa opsi lagi untuk mengelompokkan segmen, lebih baik tidak muncul. Mungkin seseorang akan menyarankan. Mungkin jaringan saraf bisa menanganinya.
Pada tahap kedua percobaan, saya harus menggunakan indikator dengan anoda umum. Oleh karena itu, skema terakhir adalah sebagai berikut:
Seseorang mungkin bertanya: kemana perginya 100 ohm resistor? Telah lama diketahui (dan digunakan secara aktif) bahwa dengan indikasi dinamis yang dibuat dengan benar, resistor pembatas arus dapat ditiadakan. Bahkan jika tegangan secara konstan diterapkan dari output pengontrol ke dua LED yang dihubungkan secara tidak sengaja, mikrokontroler dan LED biasanya menahan ini, arus dibatasi oleh resistansi transisi di dalam MC. Dan lebih banyak tentang resistor. Arus maksimum melalui HL1 menurut skema sebelumnya adalah sekitar 2 mA, dan melalui HL2 mencapai 25 ... 40 mA (mungkin, nanti saya akan mengatakan dari mana angka-angka ini berasal). Ini berarti bahwa keluaran cahaya dari segmen yang berbeda akan berbeda. Tetapi karena indikasi dinamis akan digunakan, ini dapat dengan mudah diselesaikan karena waktu tampilan segmen yang berbeda.
Semua percobaan yang saya lakukan pada Arduino Nano di Arduino IDE. Papan prototyping yang sangat baik, itu bagus di papan tempat memotong roti, itu di-flash melalui USB tanpa masalah. Apakah ada yang gagal? Saya memperbaiki sketsa dan dalam satu menit saya mengunggah firmware baru. Dan ketika Anda men-debug kode, Anda dapat pergi ke firmware di ATtiny13, masih membutuhkan sedikit lebih banyak gerakan.
Ngomong-ngomong, saya juga menginstal menggunakan Arduino di lingkungan Arduino, ini praktis menghilangkan kemungkinan mengunci MK dengan sekering yang salah, dan jauh lebih mudah.
Berikut adalah contoh menampilkan angka 4 dalam kode:
pinMode(f_a, INPUT);
Pada prinsipnya, semuanya harus jelas bahkan bagi mereka yang tidak terbiasa dengan Arduino, tetapi mengerti sedikit tentang pengendali. Angka 150 mikrodetik dan 2 milidetik dipilih secara eksperimental oleh kecerahan segmen. Dalam kode terakhir, Anda perlu menempatkan mereka dalam variabel yang terpisah sehingga Anda dapat mengubahnya selama debugging. Dari angka-angka ini adalah mungkin untuk kira-kira menentukan urutan perbedaan arus di dua segmen dalam satu pasangan. Karena segmen G bersinar sekitar 13 kali lebih sedikit daripada yang lain dan memberikan kecerahan yang sama, dapat diasumsikan bahwa arus yang melalui segmen ini 13 kali lebih banyak daripada yang lain. Faktanya, ketergantungan kecerahan pada arus adalah nonlinier, sehingga arus dapat 25 kali lebih besar, yaitu 50 mA. Bahwa dengan siklus tugas seperti itu cukup aman untuk keluaran MK. By the way, perbedaan dalam arus dimainkan ke tangan ketika memecahkan masalah gambar 2. Seperti yang saya tulis di atas, segmen G hanya bisa menyala bersama dengan segmen C. Tapi jika Anda melewati 0 ke kaki MK, yang bertanggung jawab untuk C dan G, 150 Ξs, dan setelah 2 ms untuk mempertahankan 1 di atasnya, maka segmen G akan "bekerja" dengan kecerahan penuh, dan segmen C hanya akan memiliki sedikit waktu untuk menyala selama 150 mikrodetik yang sama. Kami mendapatkan dua yang hampir penuh. Jadi, saya berhasil melanggar aturan yang saya buat sendiri. Apa yang tidak bisa dilakukan dari keputusasaan.
Jadi, kami menyalakan sosok dengan empat kaki MK. Sebenarnya, saya merindukan tahap ini untuk diri saya sendiri, segera ditampilkan dua karakter. Untuk melakukan ini, lepaskan output dari anoda umum dari salah satu bit indikator dari plus daya, dan sambungkan ke output MK lain, dan anoda pelepasan lain ke output berikutnya (6 kaki sudah). Sekarang, pada gilirannya, atur 1 pada anoda digit paling signifikan, tampilkan digit dari digit paling signifikan, lalu 1 pada anoda digit paling signifikan, dan tampilkan digit dari digit tertinggi, dan seterusnya dalam lingkaran. Saya melakukan percobaan ini dengan Arduino Nano, dia punya cukup kaki. Semua kode di-debug, bukan pertama kali. Dan itu berhasil, sebagaimana mestinya.
Karena anoda terhubung secara bergantian, dengan bantuan penyempurnaan sederhana, satu lagi output dari MK dapat dirilis. Berikut ini ringkasan diagram:
Total gunakan 5 kaki MK untuk menampilkan angka dua digit. Pada tahap ini, Anda sudah bisa mencoba dengan bayi ATtiny. Yang saya lakukan. Tapi tidak segera. Sebuah sketsa yang dikompilasi dalam lingkungan Arduino untuk ATtiny13 membutuhkan sekitar 1,7 kB memori dengan 1 kB tersedia. Untuk mengurangi ukuran, saya harus beralih ke port secara langsung, yang akan saya lakukan nanti. Ngomong-ngomong, di Arduino saya menggunakan port yang sama yang akan saya gunakan pada ATtiny, itu sangat nyaman. Mereka sudah ditunjukkan dalam diagram terakhir. Setelah diproses, kode kehilangan satu kilobyte.
Berikut adalah kode yang dihasilkan untuk ATtiny13:
Kode di atas akan memungkinkan ATtiny13 Anda membaca dari 0 hingga 99. Akan lebih tepat untuk memberikan kemungkinan penugasan kembali kaki MK. Pemrograman guru dapat mengurangi kode beberapa kali (
Di mana batas Hello World minimum pada AVR? ).
Anda dapat menambahkan fungsi yang diperlukan ke kode sehingga MK menampilkan sesuatu yang disadari. Benar, Tinki sudah memiliki semua kakinya terisi. Ada juga leg reset yang dapat digunakan sebagai port input / output. Tetapi menggunakannya lebih sulit dari yang saya kira. Karena itu, untuk diriku sendiri aku pergi "untuk nanti" Tetapi ada fitur menarik yang tidak semua orang tahu. Input analog ADC0 adalah output ke kaki yang sama, dan berfungsi! Benar, ketika tegangan di bawah kurang dari 1/4 dari tegangan suplai, MK beralih ke mode reset. Tetapi dari 1/4 ke tegangan suplai, sangat mungkin untuk mengukur tegangan input. Saya mengambil keuntungan dari ini:
Pengalaman menunjukkan bahwa indikator dapat dikurangi hingga 21, hanya kemudian MK masuk ke mode reset dan mulai bekerja ketika kembali ke sekitar 25 ke atas. Jadi dimungkinkan untuk membuat "indikator" yang sangat salah untuk menunjukkan tegangan dari 25 hingga 99 volt, tentu saja, dengan pembagi pada input pengukuran.
Sekarang tentang aplikasi praktis. Gagasan asli menampilkan data dari sensor jarak ditunda hingga waktu yang lebih baik karena kurangnya satu input digital. Kenapa lagi Anda bisa menerapkan skema sampai ide datang. Peringatan lain: tidak ada pertanyaan tentang keuntungan. Bahkan jika Anda melunasi semua segmen, arus 2,5 mA akan mengalir melalui resistor R2 (sesuai dengan skema pertama), secara total 10 mA ke indikator, ditambah kontrol transistor menambahkan sekitar 5 lebih. Saya tidak menyebutkan, transistor dari hampir semua pnp modern.
Tentang kemanfaatan. Pilihan termurah untuk output ke tujuh segmen adalah ATtiny13 plus 74HC595. Dua kasus SMD akan menelan biaya sekitar 0,50 cu Yang paling sederhana adalah ATmega8 (dan hanya itu, tidak ada resistor, tidak lebih), itu 0,68 cu Dan opsi yang dijelaskan di atas adalah biaya ATtiny, 9 resistor, 4 LED, transistor (semua SMD) - ini sekitar 0,46 cu, meskipun itu sepotong demi sepotong semuanya lebih mahal di kali. Selain itu, menyatukan semuanya lebih rumit daripada di versi sebelumnya.
Sebenarnya, satu-satunya pilihan yang bisa saya lihat adalah jika Anda memiliki ATtiny13 penuh, tetapi Anda masih perlu pergi ke toko untuk ATmega. Nah, jika indikator tujuh segmen adalah dekorasi utama perangkat Anda, saya tidak akan merekomendasikan skema ini, tampilan tidak sempurna, dalam beberapa kombinasi, segmen yang tidak perlu sedikit disorot. Kebetulan indikasi itu kadang-kadang diperlukan ketika mengatur, kemudian tempat itu sendiri.
Secara umum, saya menghabiskan beberapa hari dengan sia-sia.
Selain kritik, saya menunggu saran untuk memperbaiki kode dan menyederhanakan skema. Atau fungsionalitas yang ditingkatkan tanpa komplikasi. Yang paling menarik minat saya adalah bagaimana menjelaskan suatu hal, ini akan memperluas cakupan. Tetapi jika kita juga bisa mengeluarkan satu kesimpulan dari 5 yang terlibat, maka akan mungkin untuk berkeliaran.
Saya akan senang jika solusi non-standar saya akan menguntungkan seseorang, bukan sekarang, suatu hari nanti.
UPD: Saya tahu tentang Charliplexing! Skema pihak ketiga yang saya kutip di awal artikel ini adalah Charliplexing. Dan di sana saya menulis mengapa Charliplexing tidak cocok.
Tolong jangan menulis komentar jika Anda membaca artikel secara diagonal.