Daftar Isi:

Membaca Switch Dengan ATtiny2313: 9 Langkah
Membaca Switch Dengan ATtiny2313: 9 Langkah

Video: Membaca Switch Dengan ATtiny2313: 9 Langkah

Video: Membaca Switch Dengan ATtiny2313: 9 Langkah
Video: Pluggable ATTINY Development Board For ATtiny13A/ATtiny25/ATtiny45/ATtiny85 Programming Micro Usb 2024, Juli
Anonim
Membaca Switch Dengan ATtiny2313
Membaca Switch Dengan ATtiny2313

Ada beberapa Instruksi yang menangani keluaran dari ATtiny2313 dan perangkat AVR serupa. Misalnya, 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-Mikroprosesor/. Bekerja pada yang terbaru dari The Real Elliot, yang menunjukkan cara mengontrol motor stepper, saya menemukan bahwa akan sangat membantu untuk dapat menjalankan bagian kode alternatif dalam program yang sama sehingga saya tidak perlu memprogram ulang masing-masing ATtiny2313 kali saya ingin mencoba sedikit variasi kode (seperti setengah melangkah atau menjalankan stepper secara terbalik). Meskipun mudah untuk menulis kode menggunakan pernyataan switch/case untuk memungkinkan pemilihan variasi alternatif, beberapa cara untuk memilih case diperlukan. Itu berarti semacam perangkat input harus dibaca untuk mengontrol kasing. Untungnya, ATtiny2313 memiliki banyak pin I/O dan dirancang dengan baik untuk membaca input dari sakelar. Instruksi ini akan menunjukkan cara membaca input dan membuat keputusan berdasarkan statusnya. Karena itu saja akan membuat Instructable yang cukup membosankan, saya akan menjelaskan cara sederhana menggunakan kemampuan timer/counter dari ATtiny2313 untuk menggerakkan speaker kecil sebagai pager. Juga akan ada penyimpangan kecil pada teknik debugging sederhana.

Langkah 1: Perangkat Input

Perangkat Masukan
Perangkat Masukan
Perangkat Masukan
Perangkat Masukan

Instruksi ini dibangun di atas karya luar biasa The Real Elliot dan menggunakan sistem pengembangan ATtiny2313 Ghetto yang dia gambarkan. Lembar data ATtiny2313 dari Atmel adalah referensi utama untuk semua fungsi, tetapi tidak selalu mudah dibaca. https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (Tautan memiliki semua lembar data AVR, temukan 2313.) Gambar menunjukkan satu set sakelar input sederhana. Ini hanyalah paket empat sakelar hidup/mati; juga dikenal sebagai single pole, single throw switch (SPST). Biasanya, satu koneksi, atau kutub, dari setiap sakelar diikat ke ground sementara koneksi lainnya ditarik tinggi melalui resistor pembatas arus (10K atau lebih). Sebuah input mikrokontroler dihubungkan ke kutub dengan resistor. Jika sakelar terbuka, mikrokontroler akan membaca input sebagai HI. Jika saklar ditutup, mikrokontroler akan membaca masukan LO. Lihat skema untuk detailnya. ATtiny2313 menyederhanakan berbagai hal dengan menyediakan resistor pull-up yang dapat diprogram pada pin I/O saat dikonfigurasi sebagai input. Ini berarti bahwa sakelar hanya dapat memiliki satu kutub yang diikat ke ground (LO) dan kutub lainnya terhubung ke input prosesor. Contoh pertama hanya menunjukkan dua sakelar. Sakelar dibaca dan dikonfigurasi dengan kode berikut. Konfigurasikan sakelar sebagai input: (Tidak diperlukan kode; ini adalah default.)Nyalakan resistor pull-up: PORTB = _BV(PB0) | _BV(PB1);Baca input: but1 = ~PINB & 0x03; Perhatikan penggunaan inversi dan masking untuk mendapatkan nilai yang benar.

Langkah 2: Blinkenlights untuk Sinyal

Kami akan menggunakan dua sakelar ini untuk mengedipkan LED beberapa kali yang dapat diprogram. LED yang akan kita gunakan adalah lampu kedip yang dibuat oleh The Real Elliot. Sakelar 1 dan 2 akan diperlakukan sebagai dua digit biner, sehingga kombinasi tersebut dapat mewakili angka 0, 1, 2, dan 3. Program kami akan membaca kedua sakelar dan mengedipkan LED beberapa kali, tetapi hanya jika sakelar pengaturan telah berubah. Sakelar di-debounce selama 500 milidetik (tidak dioptimalkan). Algoritma debounce cukup sederhana. Sakelar dibaca dan bacaan dicatat. Jika berbeda dari nilai oldBut (nilai terakhir yang disimpan), maka program akan ditunda selama 500 milidetik dan sakelar dibaca kembali. Jika nilainya sama dengan yang dibaca sebelumnya, nilai oldBut akan diperbarui dan LED akan berkedip beberapa kali yang ditunjukkan oleh nilai biner dari kedua sakelar. Perhatikan inversi nilai karena sakelar yang "aktif" membaca LO. Sakelar akan dipindai terus menerus untuk perubahan lebih lanjut. Silakan merujuk ke Instruksi sebelumnya oleh The Real Elliot untuk mempelajari lebih lanjut tentang lampu kedip. Lihat https://www.ganssle.com/debouncing.pdf ini untuk mempelajari lebih lanjut tentang sakelar debouncing. Berikut kode ATtiny2313 untuk contoh ini. Dalam pengoperasiannya, program ini akan mengedipkan LED pada PB4 (pin fisik 8) dua kali untuk menunjukkan inisialisasi. Kemudian akan membaca sakelar satu dan dua, dan berkedip satu hingga tiga kali tergantung pada pengaturan sakelar setiap kali diubah. Ketika sakelar tidak berubah, LED akan berkedip perlahan. Untuk menjalankan kode ini, buat direktori baru (sebut saja "Basic" jika Anda suka) dan unduh file kode C berikut dan makefile ke dalamnya. Ganti nama Makefile1.txt menjadi Makefile saja. Menggunakan WinAVR, kompilasi program dan muat ke ATtiny2313 Anda.

Langkah 3: Penyimpangan Kecil pada Debugging

Jika Anda seperti saya (dan setiap programmer lain di dunia), Anda mungkin pernah mengalami saat-saat ketika kode "bebas kesalahan" yang Anda ketik dan kompilasi dengan hati-hati tidak melakukan apa yang Anda harapkan. Mungkin itu tidak melakukan apa-apa! Jadi apa masalahnya? Bagaimana Anda akan mencari tahu? Untungnya, ada beberapa pendekatan untuk membuat sesuatu bekerja. (Dapatkan buku ini untuk pembahasan yang sangat baik tentang topik debugging. https://www.debuggingrules.com/) Saya ingin menawarkan beberapa saran sederhana yang berkaitan dengan topik debugging aplikasi mikrokontroler. Langkah pertama adalah membangun apa yang Anda tahu. Jika Anda mendapatkan lampu kedip untuk bekerja sekali, gunakan lagi untuk melihat di mana Anda berada dalam program Anda. Saya suka LED berkedip dua kali untuk menandakan dimulainya program. Anda dapat memasukkan kode untuk melakukan ini pada awalnya di awal program Anda. Setelah Anda tahu bahwa tidak ada yang salah dengan perangkat keras Anda, buat fungsi untuk melakukan kedipan. Berikut fungsi yang saya gunakan./*------------------------------------------ ------------------------------** blinkEm - berfungsi untuk mengedipkan LED menggunakan PD4** PD4 harus dikonfigurasi sebagai output. ** ------------------------------------------------ ---------------------*/void blinkEm(hitungan uint8_t){ while (hitungan > 0){ PORTD = _BV(PD4); _delay_ms(1000); PORTD = ~_BV(PD4); _delay_ms(1000); menghitung--; }}Sekarang dimungkinkan untuk menggunakan fungsi ini di berbagai titik dalam kode Anda sebagai sinyal bahwa kode telah dieksekusi sejauh itu. Mengetahui kode sedang berjalan berarti Anda dapat dengan cermat memeriksa setiap bagian yang telah berjalan, tetapi tidak melakukan apa yang Anda harapkan, untuk menemukan kesalahan. Mengubah satu per satu adalah teknik kunci untuk debugging juga (dijelaskan dalam referensi di atas). Metode klasik ini bekerja bersama dengan "membagi dan menaklukkan": mengambil langkah kecil untuk menambahkan fungsionalitas secara bertahap. Ini mungkin tampak seperti pendekatan yang lambat, tetapi tidak selambat mencoba men-debug sebagian besar kode yang tidak berfungsi sekaligus.

Langkah 4: Lebih Banyak Debugging

Sering kali kita ingin memeriksa bagian kode dengan melewatkan sebagian besar baris di dalamnya, lalu mengaktifkannya satu per satu saat kami memverifikasi setiap baris berfungsi. Biasanya, kami melakukan ini dengan "mengomentari" baris yang ingin kami lewati. Perpanjangan dari teknik ini adalah memotong dan menempelkan blok kode, mengomentari yang asli (sehingga kita tidak kehilangannya), dan meretas salinannya. C memiliki empat cara mudah untuk mengomentari baris. Menempatkan "//" di depan baris memberi komentar di luar baris itu. Mengapit satu atau lebih baris di "/*" dan "*/" akan mengomentari seluruh bagian. Agar metode ini bekerja secara efektif, tidak boleh ada "*/" lain di blok kode (selain yang berakhir). Jadi disiplin yang efektif adalah menggunakan // untuk komentar di dalam blok kode, dan menyimpan konstruksi /* */ untuk blok komentar dan untuk mengomentari bagian kode. Menempatkan "#if 0" di awal blok untuk berkomentar dan akhiri bagian dengan "#endif". Kontrol yang lebih selektif dimungkinkan menggunakan "#ifdef (pengidentifikasi)" di awal blok dan "#endif" di akhir. Jika Anda ingin blok dikompilasi, gunakan "#define (identifier)" di awal program. Perhatikan bahwa tanda kutip hanya untuk penekanan dan tidak untuk disertakan. Menggabungkan teknik ini akan memberikan pendekatan yang berguna untuk men-debug program ATtiny2313 Anda. Anda mungkin menemukan alat ini berguna saat kami melanjutkan melalui Instruksi ini.

Langkah 5: Menggunakan Timer/Counter 0 untuk Bip

Menggunakan Timer/Counter 0 untuk Bip
Menggunakan Timer/Counter 0 untuk Bip

ATtiny2313 memiliki dua sumber daya timer/counter yang kuat: satu 8-bit dan satu 16-bit. Ini dapat dikonfigurasi sebagai generator frekuensi, pengontrol modulasi lebar pulsa variabel, dan register pembanding keluaran. Fungsionalitas penuh dari ini dijelaskan dalam 49 halaman lembar data. Namun, kami akan menggunakan kasus sederhana. Hanya Timer/Counter 0 (8-bit) yang akan digunakan dan akan digunakan hanya sebagai generator frekuensi. Frekuensi akan dialihkan ke speaker kecil untuk menghasilkan bunyi bip. Timer/Counter 0 sepenuhnya dijelaskan di halaman 66 hingga 83 dari lembar data ATtiny2313. Membaca materi ini dengan cermat akan memberikan pemahaman yang lengkap tentang Waktu/Penghitung 0. Untungnya, mode yang cukup sederhana, Clear Timer on Compare (CTC), adalah semua yang diperlukan untuk menghasilkan nada bip yang kita inginkan.

Untuk mode yang akan kita gunakan, pengoperasian Timer/Counter adalah lurus ke depan. Ketika sinyal clock dipilih, penghitung mulai dari nol dan menambah setiap pulsa clock. Ketika nilai pencacah mencapai nilai dalam Daftar Perbandingan Keluaran (TOP), pencacah direset ke nol dan penghitungan dimulai lagi. Bit output yang terkait dengan Timer/Counter diaktifkan untuk menghasilkan output gelombang persegi. Ini secara langsung menggerakkan transduser audio untuk membuat suara bip. Transduser Audio TDK kecil menghasilkan bunyi bip. Unit yang cocok adalah Digikey 445-2530-ND, TDK SD1209T3-A1 (saya menggunakan versi awal ini). Ini adalah versi 3 volt; versi 5 volt juga akan bekerja saya harapkan. Saya mengendarai ini langsung dari port output Attiny2313 dan tampaknya berfungsi dengan baik. Sparkfun memiliki perangkat serupa.

Langkah 6: Mengkonfigurasi Timer/Counter 0

Mode CTC dapat digunakan untuk mengaktifkan output OC0A pada Pin 2, Port B (pin fisik 14). Untuk mengaktifkan output pada pin ini, DDRB harus diatur dengan tepat. Kode C untuk ini sama seperti menyiapkan output untuk lampu kedip. DDRB = _BV(PB2); // Port B2 adalah keluaran. Langkah selanjutnya adalah mensuplai sinyal clock dan memuat register pembanding keluaran untuk menghasilkan bentuk gelombang sebagai frekuensi. Persamaan untuk frekuensi yang dihasilkan diberikan dalam lembar data (halaman 72). Istilah dalam persamaan akan dijelaskan di bawah ini. Berikut persamaannya: fOC0A = fclk_I/O / 2*N*(1+OCR0A)Di mana fOC0A:= frekuensi keluaran fclk_I/O:= frekuensi sumber clock N:= faktor skala awal jam OCR0A:= nilai dalam output bandingkan register untuk Timer/ Counter 0A. Clock Source Frequency, fclk_I/OIni adalah frekuensi clock sistem. Nilai defaultnya adalah 1MHz. Bit CS00, CS01, dan CS02 dari TCCR0B mengontrol pemilihan ini. Karena bit-bit ini juga memilih nilai N, maka akan dijelaskan selanjutnya. Nilai Prescaler, NN adalah nilai yang digunakan untuk membagi, atau menskalakan, jam sistem. Bit CS00, CS01, dan CS02 dari TCCR0B mengontrol pemilihan ini. Tabel 41 pada halaman 81 dari lembar data ATtiny2313 menjelaskan kombinasi-kombinasi tersebut. Karena frekuensi mendekati 1kHz diinginkan, bit CS00 dan CS01 dari TCCR0B akan diatur. Perhatikan bahwa menyetel ketiga bit ke 0, sehingga tidak memilih sumber clock, secara efektif menghentikan output. Ini adalah metode yang akan digunakan untuk memulai dan menghentikan bunyi bip. Nilai TOP, OCR0ANilai ini adalah nilai TOP untuk pencacah yang dimuat ke dalam Output Bandingkan Register untuk Timer/Counter 0A. Ketika nilai ini tercapai, penghitung akan diatur ulang ke nol dan penghitungan akan dimulai lagi sampai TOP tercapai dan siklus berulang. TOP mudah dimodifikasi, sehingga frekuensi pager mudah diubah. Karena frekuensi mendekati 1kHz yang diinginkan, TOP diatur ke 7. (Perhatikan bahwa prescaler dapat disetel ke 8, dan TOP diatur ke 63. Hasil yang sama - pilihan Anda.)Frekuensi Output, fOC0AUMenggunakan persamaan untuk menghitung hasil frekuensi output dalam: fOC0A = 1, 000, 000 / 2 * 64 * (1+7) fOC0A = 977HzCukup dekat! Berikut kode untuk memuat Output Compare Register dan Timer Counter Control Register 0B. Silakan lihat kode program yang sebenarnya untuk memahami bagaimana ini digunakan. OCR0A = 7; // Nilai Waktu TCCR0B = _BV(CS01) | _BV(CS00); // Pilih jam internal & prescale=8 TCCR0B = 0; // tidak ada sumber jam yang mematikan nada Menyetel Mode Waktu/Penghitung Sebagai detail terakhir, kami akan menentukan mode Timer/Counter yang kami inginkan dengan mengatur bit yang sesuai di Timer/Counter Control Register 0A. Mode CTC dipilih dengan menyetel bit WGM01 seperti yang dijelaskan pada Tabel 40, halaman 79 dari lembar data. Karena kita ingin output beralih setiap siklus, bit COM0A0 juga perlu diatur seperti yang dijelaskan pada Tabel 34 di halaman 77. Berikut kodenya: TCCR0A = _BV(COM0A0) | _BV(WGM01); // Mode Beralih CTC

Langkah 7: Menggunakan Empat Sakelar

Saat kita mengimplementasikan pager, mari kita perluas perangkat keras dan perangkat lunak kita untuk menangani empat sakelar. Karena output dari Timer Counter 0A ada di Port B, pin 2, kita tidak bisa begitu saja menghubungkan lebih banyak sakelar secara berurutan ke Port B. Solusi mudahnya adalah menggunakan Port D, tetapi biarkan port itu tersedia untuk fungsi lain (mungkin motor langkah). Jadi mari kita sambungkan sakelar tambahan ke PB3 dan PB4. Membaca sakelar sebagian besar tidak berubah. Nilai mask diubah menjadi 0x1B (biner 00011011) menjadi mask bit 2 bersama dengan 5, 6, dan 7. Satu trik lebih lanjut digunakan untuk membuat bilangan biner 4-bit. Geser bit 3 dan 4 ke kanan satu bit dan gabungkan dengan bit 0 dan 1 menjadi bilangan biner 4 bit. Ini adalah sintaks C standar untuk menggeser dan menggabungkan bit, tetapi mungkin tidak terlalu dikenal oleh pemula. but1a = (but1 & 0x03) | ((tetapi1 & 0x18) >> 1); // but1 memiliki pembacaan sakelarDalam operasi, program akan berkedip dua kali dan berbunyi bip dua kali untuk menandakan inisialisasi. Setiap kali sakelar diubah, nomor yang diwakilinya akan berbunyi bip. Ketika sakelar tidak berubah, LED akan berkedip. Untuk menjalankan kode ini, buat direktori baru (sebut saja Bip jika Anda mau) dan unduh file kode C berikut dan buat file ke dalamnya. Ganti nama Makefile2.txt menjadi Makefile saja. Menggunakan WinAVR, kompilasi program dan muat ke Attiny2313 Anda.

Langkah 8: Menggunakan Konstruk Switch/case

Langkah terakhir adalah "hanya perangkat lunak": Seperti yang dijanjikan, kami akan mengimplementasikan konstruksi sakelar/kasus. Meskipun contoh ini hanya menunjukkan dua tindakan alternatif, harus sangat jelas bagaimana menggunakan konstruksi ini untuk memilih salah satu dari beberapa bagian kode alternatif. Dalam pengoperasiannya, program ini memonitor switch dan jika ada perubahan akan berbunyi sesuai nomor jika ganjil; itu akan berkedip jika angkanya genap. Itu tidak melakukan apa pun kecuali sakelar berubah.

Untuk menjalankan kode ini, buat direktori baru (sebut saja Switch jika Anda suka) dan unduh file kode C berikut dan makefile ke dalamnya. Ganti nama Makefile3.txt menjadi Makefile saja. Menggunakan WinAVR, kompilasi program dan muat ke Attiny2313 Anda.

Langkah 9: Kesimpulan

Kesimpulan
Kesimpulan

Jadi itu saja! Sekarang Anda tahu cara menggunakan sakelar untuk mengontrol eksekusi program Anda dengan membacanya dan memilih tindakan berdasarkan pengaturan sakelar. Anda juga tahu cara membuat nada bip dan telah mempelajari beberapa strategi debug juga.

Jika Anda ingin menguji pemahaman Anda, coba modifikasi program terakhir untuk berbunyi bip pada nada tinggi jika genap, bip nada rendah jika ganjil, dan kedipkan LED terus menerus jika tidak ada perubahan pada sakelar. Anda mungkin ingin melihat kembali ke bagian debugging untuk bantuan.

Direkomendasikan: