Isi kandungan:

Suis Membaca Dengan ATtiny2313: 9 Langkah
Suis Membaca Dengan ATtiny2313: 9 Langkah

Video: Suis Membaca Dengan ATtiny2313: 9 Langkah

Video: Suis Membaca Dengan ATtiny2313: 9 Langkah
Video: Logic Gates Learning Kit #2 - Transistor Demo 2024, Julai
Anonim
Suis Membaca Dengan ATtiny2313
Suis Membaca Dengan ATtiny2313

Terdapat beberapa Instructables yang berurusan dengan output dari ATtiny2313 dan peranti AVR yang serupa. Contohnya, https://www.instructables.com/id/Ghetto-Programming%3a-Getting-started-with-AVR-micro/, https://www.instructables.com/id/Drive-a-Stepper- Motor-dengan-an-AVR-Mikropemproses /. Mengusahakan yang terbaru dari The Real Elliot, yang menunjukkan cara mengawal motor stepper, saya mendapati bahawa sangat berguna untuk dapat menjalankan bahagian kod ganti dalam program yang sama sehingga saya tidak perlu memprogram ulang ATtiny2313 masing-masing masa saya ingin mencuba sedikit variasi kod (seperti langkah setengah atau menjalankan stepper secara terbalik). Walaupun mudah untuk menulis kod menggunakan pernyataan suis / kes untuk membolehkan pemilihan variasi alternatif, beberapa cara memilih casing sangat diperlukan. Ini bermaksud sejenis peranti input mesti dibaca untuk mengawal kes itu. Nasib baik, ATtiny2313 mempunyai banyak pin I / O dan direka dengan baik untuk membaca input dari suis. Instructable ini akan menunjukkan cara membaca input dan membuat keputusan berdasarkan keadaannya. Oleh kerana itu akan menjadikan Instructable yang cukup membosankan, saya akan menerangkan cara mudah menggunakan keupayaan pemasa / penghitung ATtiny2313 untuk mendorong pembesar suara kecil sebagai bip. Terdapat juga penyimpangan kecil pada teknik debugging sederhana.

Langkah 1: Peranti Input

Peranti Input
Peranti Input
Peranti Input
Peranti Input

Instructable ini dibina berdasarkan karya cemerlang The Real Elliot dan menggunakan sistem pembangunan Ghetto ATtiny2313 yang diterangkannya. Lembaran data ATtiny2313 dari Atmel adalah rujukan utama untuk semua fungsi, tetapi tidak semestinya mudah dibaca. https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (Pautan mempunyai semua helaian data AVR, cari 2313.) Gambar menunjukkan satu set suis input yang ringkas. Ini hanyalah sekumpulan empat suis hidup / mati; juga dikenali sebagai tiang tunggal, suis lemparan tunggal (SPST). Biasanya, satu sambungan, atau tiang, setiap suis diikat ke tanah sementara sambungan yang lain ditarik tinggi melalui perintang pengehad arus (10K atau lebih). Input mikrokontroler disambungkan ke tiang dengan perintang. Sekiranya suis terbuka, pengawal mikro akan membaca input sebagai HI. Sekiranya suis ditutup, mikrokontroler akan membaca input LO. Rujuk skema untuk perinciannya. ATtiny2313 mempermudah sesuatu dengan menyediakan perintang penarik yang dapat diprogram pada pin I / O apabila ia dikonfigurasikan sebagai input. Ini bermaksud bahawa suis boleh mempunyai satu tiang yang diikat ke tanah (LO) dan tiang yang lain disambungkan ke input pemproses. Contoh pertama menunjukkan hanya dua suis. Suis dibaca dan dikonfigurasi dengan kod berikut. Konfigurasikan suis sebagai input: (Tidak diperlukan kod; ini adalah lalai.) Hidupkan perintang penarik: PORTB = _BV (PB0) | _BV (PB1); Baca input: but1 = ~ PINB & 0x03; Perhatikan penggunaan inversi dan masking untuk mendapatkan nilai yang betul.

Langkah 2: Lampu Berkedip untuk Isyarat

Kami akan menggunakan dua suis ini untuk mengedipkan LED sebilangan kali yang dapat diprogramkan. LED yang akan kita gunakan akan menjadi lampu suluh yang terkenal oleh The Real Elliot. Suis 1 dan 2 akan dianggap sebagai dua digit binari, jadi gabungannya dapat mewakili angka 0, 1, 2, dan 3. Program kami akan membaca dua suis dan mengedipkan LED sebilangan kali sesuai, tetapi hanya jika suis tetapan telah berubah. Suis diturunkan untuk 500 milisaat (tidak dioptimumkan). Algoritma debounce cukup mudah. Suis dibaca dan bacaannya diperhatikan. Sekiranya berbeza dengan nilai oldBut (nilai simpanan terakhir), maka program ditangguhkan selama 500 milisaat dan suisnya dibaca semula. Sekiranya nilainya sama seperti yang dibaca sebelumnya, nilai oldBut akan dikemas kini dan LED akan berkelip berkali-kali yang disiratkan oleh nilai binari kedua suis. Perhatikan nilai terbalik kerana suis yang "hidup" membaca LO. Suis akan diimbas secara berterusan untuk perubahan selanjutnya. Sila rujuk Instructables oleh The Real Elliot yang lebih awal untuk mengetahui lebih lanjut mengenai lampu kilat. Lihat https://www.ganssle.com/debouncing.pdf ini untuk mengetahui lebih lanjut mengenai pemindahan debouncing. Berikut adalah kod ATtiny2313 untuk contoh ini. Semasa beroperasi, program ini akan mengedipkan LED pada PB4 (pin fizikal 8) dua kali untuk menunjukkan bahawa ia diinisialisasi. Ia kemudian akan membaca suis satu dan dua, dan berkedip satu hingga tiga kali bergantung pada tetapan suis setiap kali ia diubah. Apabila suis tidak berubah, LED akan berkedip perlahan. Untuk menjalankan kod ini, buat direktori baru (namakan "Asas" jika anda suka) dan muat turun fail kod C berikut dan buat fail ke dalamnya. Namakan semula Makefile1.txt kepada hanya Makefile. Menggunakan WinAVR, susun program dan muatkan ke ATtiny2313 anda.

Langkah 3: Pencerobohan Kecil pada Penyahpepijatan

Sekiranya anda seperti saya (dan setiap pengaturcara lain di dunia), anda mungkin pernah mengalami masa ketika kod "bebas ralat" yang telah anda taip dan susun dengan teliti tidak melakukan apa yang anda harapkan. Mungkin ia tidak membuat apa-apa! Jadi apa masalahnya? Bagaimana anda akan mengetahui? Nasib baik, ada beberapa pendekatan untuk membuat sesuatu berjalan lancar. (Dapatkan buku ini untuk rawatan topik debugging yang sangat baik. Http://www.debuggingrules.com/) Saya ingin memberikan beberapa cadangan mudah yang berkaitan dengan topik aplikasi debugging mikrokontroler. Langkah pertama adalah membangun apa yang anda tahu. Sekiranya anda mendapat lampu suluh untuk berfungsi sekali, maka gunakan sekali lagi untuk melihat di mana anda berada dalam program anda. Saya suka LED berkedip dua kali untuk menandakan permulaan program. Anda boleh memasukkan kod untuk melakukannya pada awal program anda. Setelah anda mengetahui bahawa tidak ada yang salah dengan perkakasan anda, buat fungsi untuk melakukan sekelip mata. Inilah fungsi yang saya gunakan./*------------------------------------------ ------------------------------ ** blinkEm - fungsi untuk LED berkedip menggunakan PD4 ** PD4 mesti dikonfigurasikan sebagai output. ** ------------------------------------------------ --------------------- * / void blinkEm (jumlah uint8_t) {sementara (kiraan> 0) {PORTD = _BV (PD4); _delay_ms (1000); PORTD = ~ _BV (PD4); _delay_ms (1000); mengira--; }} Sekarang mungkin untuk menggunakan fungsi ini pada berbagai titik dalam kod anda sebagai isyarat bahawa kod tersebut telah dilaksanakan sejauh ini. Mengetahui kod berjalan bermaksud anda dapat memeriksa dengan teliti setiap bahagian yang telah berjalan, tetapi tidak melakukan apa yang anda harapkan, untuk mencari kesalahan. Mengubah satu perkara pada satu masa adalah teknik utama untuk melakukan debug (dijelaskan dalam rujukan di atas). Kaedah klasik ini berfungsi bersama dengan "membahagi dan menaklukkan": mengambil langkah bayi untuk menambahkan fungsi secara bertahap. Ini mungkin kelihatan seperti pendekatan yang perlahan, tetapi tidak semudah itu untuk mencuba debug sebahagian besar kod yang tidak berfungsi sekaligus.

Langkah 4: Penyahpepijatan Lebih Banyak

Sering kali kita ingin memeriksa bahagian kod dengan melewatkan sebahagian besar baris di dalamnya, kemudian mengaktifkannya satu per satu ketika kita mengesahkan masing-masing berfungsi. Biasanya, kami melakukan ini dengan "memberi komen" garis yang ingin kami langkau. Sambungan teknik ini adalah memotong dan menampal sekumpulan kod, memberi komen yang asli (agar kita tidak kehilangannya), dan meretas salinannya. C mempunyai empat cara mudah untuk memberi komen. Menempatkan "//" di hadapan baris memberi komen keluar dari baris itu. Menutup satu atau lebih baris di "/ *" dan "* /" akan memberi komen keseluruhan bahagian. Agar kaedah ini berfungsi dengan berkesan, tidak boleh ada "* /" lain dalam blok kod (selain dari yang berakhir). Oleh itu, disiplin yang berkesan adalah menggunakan // untuk komen dalam blok kod, dan menempah / * * / konstruk untuk blok komen dan untuk memberi komen bahagian kod. Menempatkan "#if 0" pada permulaan blok untuk memberi komen dan mengakhiri bahagian dengan "#endif". Lebih banyak kawalan selektif boleh dilakukan dengan menggunakan "#ifdef (pengenal)" pada permulaan blok dan "#endif" di akhir. Sekiranya anda mahu blok disusun, gunakan "#define (pengenal)" lebih awal dalam program. Perhatikan tanda petik hanya untuk penekanan dan tidak boleh disertakan. Menggabungkan teknik ini harus memberikan pendekatan yang berguna untuk menyahpepijat program ATtiny2313 anda. Anda mungkin mendapati alat-alat ini berguna semasa kami meneruskan Instruksinya.

Langkah 5: Menggunakan Pemasa / Pembilang 0 untuk Bunyi Bunyi

Menggunakan Pemasa / Pembilang 0 untuk Bunyi Bunyi
Menggunakan Pemasa / Pembilang 0 untuk Bunyi Bunyi

ATtiny2313 mempunyai dua sumber pemasa / pembilang yang kuat: satu 8-bit dan satu 16-bit. Ini mungkin dikonfigurasi sebagai penjana frekuensi, pengawal modulasi lebar pulsa berubah-ubah, dan daftar perbandingan output. Fungsi penuh ini dijelaskan dalam 49 halaman lembaran data. Walau bagaimanapun, kami akan menggunakan kes sederhana. Hanya Pemasa / Kaunter 0 (yang 8-bit) akan digunakan dan ia akan digunakan hanya sebagai penjana frekuensi. Frekuensi akan dialihkan ke pembesar suara kecil untuk menghasilkan bunyi bip. Pemasa / Pembilang 0 dijelaskan sepenuhnya di halaman 66 hingga 83 dari lembaran data ATtiny2313. Pembacaan secara dekat dari bahan ini akan memberikan pemahaman yang lengkap tentang Time / Counter 0. Dengan senang hati, mod yang cukup mudah, Clear Timer on Bandingkan (CTC), adalah semua yang diperlukan untuk menghasilkan nada bip yang kita mahukan.

Untuk mod yang akan kita gunakan, operasi Pemasa / Kaunter adalah lurus ke hadapan. Apabila isyarat jam dipilih, pembilang bermula pada sifar dan meningkatkan setiap denyutan jam. Apabila nilai pembilang mencapai nilai dalam Daftar Perbandingan Keluaran (TOP), kaunter diset semula ke sifar dan pengiraan bermula semula. Bit output yang berkaitan dengan Pemasa / Pembilang ditukar untuk menghasilkan output gelombang persegi. Ini secara langsung mendorong transduser audio untuk mengeluarkan bunyi bip. Transduser Audio TDK kecil menghasilkan bunyi bip. Unit yang sesuai ialah Digikey 445-2530-ND, TDK SD1209T3-A1 (saya menggunakan versi awal ini). Ini adalah versi 3 volt; versi 5 volt juga akan berfungsi seperti yang saya harapkan. Saya memandu ini terus dari port output dari Attiny2313 dan nampaknya berfungsi dengan baik. Sparkfun mempunyai peranti yang serupa.

Langkah 6: Mengkonfigurasi Pemasa / Kaunter 0

Mod CTC dapat digunakan untuk menukar output OC0A pada Pin 2, Port B (pin fizikal 14). Untuk membolehkan output pada pin ini, DDRB mesti diset dengan betul. Kod C untuk ini sama seperti menetapkan output untuk lampu kilat. DDRB = _BV (PB2); // Port B2 adalah output. Langkah seterusnya adalah memberikan isyarat jam dan memuatkan output membandingkan register untuk menghasilkan bentuk gelombang sebagai frekuensi. Persamaan untuk frekuensi yang dihasilkan diberikan dalam lembaran data (halaman 72). Istilah dalam persamaan akan dijelaskan di bawah. Inilah persamaannya: fOC0A = fclk_I / O / 2 * N * (1 + OCR0A) Di mana fOC0A: = frekuensi output fclk_I / O: = frekuensi sumber jam N: = faktor preskala jam OCR0A: = nilai dalam output membandingkan daftar untuk Pemasa / Kaunter 0A. Kekerapan Sumber Kunci, fclk_I / OIni adalah kekerapan jam sistem. Nilai lalai adalah 1MHz. Bits CS00, CS01, dan CS02 dari TCCR0B mengawal pemilihan ini. Oleh kerana bit-bit ini juga memilih nilai N, maka akan dijelaskan seterusnya. Prescaler Value, NN adalah nilai yang digunakan untuk membahagi, atau prescale, jam sistem. Bits CS00, CS01, dan CS02 dari TCCR0B mengawal pemilihan ini. Jadual 41 di halaman 81 lembaran data ATtiny2313 menerangkan kombinasi. Oleh kerana frekuensi hampir 1kHz diinginkan, bit CS00 dan CS01 TCCR0B akan ditetapkan. Perhatikan bahawa menetapkan ketiga-tiga bit ke 0, sehingga tidak memilih sumber jam, menghentikan output dengan berkesan. Ini adalah kaedah yang akan digunakan untuk memulakan dan menghentikan bip. Nilai TOP, OCR0 Nilai ini adalah nilai TOP untuk pembilang yang dimuat ke dalam Daftar Perbandingan Keluaran untuk Pemasa / Kaunter 0A. Apabila nilai ini dicapai, penghitung akan diset semula ke sifar dan pengiraan akan dimulakan lagi sehingga TOP tercapai dan kitaran berulang. TOP mudah diubah suai, jadi frekuensi bip mudah diubah. Oleh kerana frekuensi mendekati 1kHz diinginkan, TOP ditetapkan ke 7. (Perhatikan preskalaer mungkin telah ditetapkan ke 8, dan TOP ditetapkan ke 63. Hasil yang sama - pilihan anda.) Kekerapan output, fOC0Menggunakan persamaan untuk mengira hasil frekuensi output dalam: fOC0A = 1, 000, 000/2 * 64 * (1 + 7) fOC0A = 977HzTutup cukup! Inilah kod untuk memuatkan Daftar Perbandingan Keluaran dan Daftar Kawalan Penghitung Waktu 0B. Sila lihat kod program sebenar untuk memahami cara penggunaannya. OCR0A = 7; // Nilai Masa TCCR0B = _BV (CS01) | _BV (CS00); // Pilih jam dalaman & preskala = 8 TCCR0B = 0; // tiada sumber jam yang mematikan nadaMenetapkan Mode Waktu / KaunterSebagai butiran terakhir, kami akan menentukan mod Pemasa / Kaunter yang kami kehendaki dengan menetapkan bit yang sesuai dalam Daftar Pemasa / Pengawal Kaunter 0A. Mod CTC dipilih dengan menetapkan bit WGM01 seperti yang dijelaskan dalam Jadual 40, halaman 79 dari lembaran data. Oleh kerana kami mahu output beralih setiap kitaran, bit COM0A0 juga perlu ditetapkan seperti yang dijelaskan dalam Jadual 34 di halaman 77. Inilah kodnya: TCCR0A = _BV (COM0A0) | _BV (WGM01); // Mod Toggle CTC

Langkah 7: Menggunakan Empat Suis

Semasa kami menerapkan bip, mari kembangkan perkakasan dan perisian kami untuk mengendalikan empat suis. Oleh kerana output Timer Counter 0A berada di Port B, pin 2, kita tidak boleh menghubungkan lebih banyak suis secara berurutan ke Port B. Penyelesaian yang mudah adalah menggunakan Port D, tetapi mari kita simpan port tersebut untuk fungsi lain (mungkin motor stepper). Oleh itu, mari sambungkan suis tambahan ke PB3 dan PB4. Membaca suis kebanyakannya tidak berubah. Nilai topeng diubah menjadi 0x1B (00011011 binary) untuk menutup bit 2 bersama dengan 5, 6, dan 7. Satu muslihat selanjutnya digunakan untuk membuat nombor binari 4-bit. Ubah bit 3 dan 4 satu bit kanan dan gabungkannya dengan bit 0 dan 1 menjadi nombor binari 4 bit. Ini adalah sintaks C standard untuk menukar dan menggabungkan bit, tetapi mungkin tidak diketahui oleh pemula. but1a = (but1 & 0x03) | ((but1 & 0x18) >> 1); // but1 mempunyai suis membacaDalam operasi, program akan berkedip dua kali dan berbunyi bip dua kali untuk memulakan isyarat. Bila-bila masa suis diubah, nombor yang mereka wakili akan berbunyi. Apabila suis tidak berubah, LED akan berkedip. Untuk menjalankan kod ini, buat direktori baru (namakan Beep jika anda suka) dan muat turun fail kod C berikut dan buat fail ke dalamnya. Namakan semula Makefile2.txt kepada hanya Makefile. Menggunakan WinAVR, susun program dan muatkan ke Attiny2313 anda.

Langkah 8: Menggunakan Switch / Case Construct

Langkah terakhir adalah "hanya perisian": Seperti yang dijanjikan, kami akan melaksanakan konstruk suis / casing. Walaupun contoh ini hanya menunjukkan dua tindakan alternatif, harus jelas bagaimana menggunakan konstruk ini untuk memilih salah satu daripada beberapa bahagian kod alternatif. Dalam operasi, program ini memantau suis dan jika ada perubahan, ia akan mengeluarkan bunyi yang sesuai jika ganjil; ia akan berkelip sekiranya bilangannya genap. Ia tidak melakukan apa-apa kecuali suis berubah.

Untuk menjalankan kod ini, buat direktori baru (panggil ia Tukar jika anda suka) dan muat turun fail kod C berikut dan buat di dalamnya. Namakan semula Makefile3.txt kepada hanya Makefile. Menggunakan WinAVR, susun program dan muatkan ke Attiny2313 anda.

Langkah 9: Kesimpulannya

Kesimpulannya
Kesimpulannya

Jadi itu sahaja! Sekarang anda tahu bagaimana menggunakan suis untuk mengawal pelaksanaan program anda dengan membacanya dan memilih tindakan berdasarkan tetapan suis. Anda juga tahu bagaimana membuat nada bip dan juga telah mempelajari beberapa strategi debug.

Sekiranya anda ingin menguji pemahaman anda, cuba ubah program terakhir untuk berbunyi pada nada tinggi jika genap, bip not rendah jika ganjil, dan berkedip LED secara berterusan jika tidak ada perubahan pada suis. Anda mungkin ingin melihat kembali ke bahagian penyahpepijatan untuk mendapatkan bantuan.

Disyorkan: