Daftar Isi:

Tutorial Perakitan AVR 7: 12 Langkah
Tutorial Perakitan AVR 7: 12 Langkah

Video: Tutorial Perakitan AVR 7: 12 Langkah

Video: Tutorial Perakitan AVR 7: 12 Langkah
Video: cara pemasangan AvR yg aman 2024, Juli
Anonim
Tutorial Perakitan AVR 7
Tutorial Perakitan AVR 7

Selamat datang di Tutorial 7!

Hari ini pertama-tama kita akan menunjukkan cara mengais keypad, dan kemudian menunjukkan cara menggunakan port input Analog untuk berkomunikasi dengan keypad. Kita akan melakukannya menggunakan interupsi dan satu kabel sebagai input. Kami akan menyambungkan papan tombol sehingga setiap penekanan tombol mengirimkan tegangan unik ke input analog yang memungkinkan kami membedakan tegangan tombol mana yang ditekan. Kemudian kami akan menampilkan nomor yang ditekan ke penganalisis register kami untuk menunjukkan bahwa semuanya terjadi sebagaimana mestinya. Ada sejumlah jebakan yang dapat Anda hadapi saat menggunakan Analog to Digital Converter (ADC) di ATmega328p dan kami akan mengambil hal-hal dalam beberapa tahap dalam perjalanan untuk mencoba dan mencari cara untuk menghindarinya. Kita juga akan melihat mengapa menggunakan konverter analog ke digital bukanlah cara terbaik untuk mengontrol keypad meskipun menggunakan lebih sedikit port pada mikrokontroler Anda. Dalam tutorial ini Anda akan membutuhkan:

  1. sebuah papan tombol. Anda dapat membeli satu atau Anda dapat melakukan apa yang saya lakukan dan mengaisnya.
  2. 2 header perempuan untuk keypad (jika Anda mengais satu)
  3. menghubungkan kabel
  4. papan tempat memotong roti
  5. 4 resistor 1 Kohm
  6. 1 15 Kohm resistor
  7. 1 resistor 3,3 Kohm
  8. 1 180 ohm resistor
  9. Resistor 1 680 ohm
  10. multimeter digital
  11. penganalisa Anda dari Tutorial 5

Anda mungkin ingin melewati beberapa langkah pertama jika Anda sudah memiliki keypad dan tidak perlu memungutnya.

Berikut ini tautan ke koleksi lengkap tutorial assembler AVR saya:

Langkah 1: Mengais Keypad 1

Mengais Keypad 1
Mengais Keypad 1
Mengais Keypad 1
Mengais Keypad 1
Mengais Keypad 1
Mengais Keypad 1
Mengais Keypad 1
Mengais Keypad 1

Dahulu kala, ketika kakek-nenek Anda masih anak-anak, orang-orang biasa menggunakan perangkat yang tampak aneh ini, yang memiliki kabel panjang yang ditancapkan ke dinding, untuk berkomunikasi satu sama lain. Mereka disebut "telepon" dan biasanya benda plastik murahan yang mengeluarkan suara mengganggu ketika seseorang menelepon Anda (bukan karena nada dering "Justin Bieber" hari ini tidak sama mengganggunya). Bagaimanapun, perangkat ini memiliki papan tombol yang sangat sederhana sehingga mudah untuk mengais dan mereka memiliki 2 tombol tambahan pada mereka ("panggil ulang" dan "flash") dari papan tombol yang dapat Anda beli yang mungkin ingin Anda gunakan kembali sebagai "tombol panah", "tombol menu", atau sesuatu yang lain. Jadi kita akan mulai dengan memulung keypad dari telepon lama. Pertama ambil telepon (saya menggunakan GE seperti yang ditunjukkan pada gambar) dan cungkil untuk mengungkapkan kabelnya. Kemudian ambil pahat dan lepaskan kenop plastik kecil yang menahan keypad dan lepaskan keypad.

Langkah 2: Mengais Keypad 2

Mengais Keypad 2
Mengais Keypad 2
Mengais Keypad 2
Mengais Keypad 2
Mengais Keypad 2
Mengais Keypad 2

Sekarang ambil gergaji PVC dan potong plastik dari sekitar lubang kunci dan kemudian potong di sekitar tepi untuk mendapatkan kedalaman yang tepat meninggalkan keypad tipis.

Kemudian pasang kembali papan tombol menggunakan pasak kecil yang tersisa setelah Anda memotong bagian atasnya pada langkah terakhir dan gunakan besi solder untuk menyodok besi panas ke setiap lubang pasak yang akan melelehkan plastik dan menyebarkannya ke atas bagian bawah keypad membentuk "kenop" baru yang akan menahan keypad di tempatnya seperti sebelumnya.

Saya suka mengais tiga speaker dan mungkin hal-hal lain seperti sakelar dan apa yang tidak ada di papan tulis. Namun, kali ini saya tidak akan mengais sakelar dan hal-hal lain karena kami memiliki tujuan lain saat ini. Juga, ada IC linier TA31002 di sana yang merupakan dering telepon. Lembar data mudah ditemukan dan diunduh secara online dengan memberikan pinout dan fitur. Jadi saya akan membiarkannya disolder ke papan untuk saat ini dan kemudian bermain-main dengannya nanti. Saya ingin menghubungkannya ke osiloskop dan melihat sinyal keren apa yang bisa saya dapatkan darinya. Bahkan mungkin membuat bel pintu dari itu. Siapa tahu.

Pokoknya setelah Anda selesai menghancurkan telepon dan mengais bagian-bagiannya, kami akan menyelesaikan pembuatan keypad kami.

Langkah 3: Mengais Keypad 3

Mengais Keypad 3
Mengais Keypad 3
Mengais Keypad 3
Mengais Keypad 3
Mengais Keypad 3
Mengais Keypad 3

Gunakan sumbu pematrian dan lepaskan kabel pita dari bagian bawah papan tombol untuk memastikan lubang di papan sirkuit bersih dan kemudian pasang dua kepala perempuan ke papan tempat lubang berada. Anda mungkin harus memotong header Anda sehingga menjadi header 4-pin.

Sekarang setelah header terpasang, Anda dapat menghubungkannya ke papan tempat memotong roti, mengambil multimeter, dan menguji kunci dengan menempelkan multimeter pada pin acak dan mengukur resistansi. Ini akan memungkinkan Anda untuk memetakan kunci. Sulit untuk melihat bagaimana kunci dihubungkan ke output dengan melihat sirkuit tetapi jika Anda menggunakan multimeter, Anda dapat menghubungkannya ke dua pin dan kemudian menekan tombol sampai Anda melihat angka di layar alih-alih sirkuit terbuka. Ini akan menjadi pinout untuk kunci itu.

Petakan semua kunci ke pin keluaran dengan cara ini.

Langkah 4: Hubungkan Keypad

Hubungkan Keypad
Hubungkan Keypad
Hubungkan Keypad
Hubungkan Keypad

Sekarang ikuti diagram pengkabelan dan sambungkan papan tombol ke papan tempat memotong roti Anda.

Bagaimana ini akan bekerja kita akan menempatkan 5V ke sisi kiri dan sisi kanan pergi ke GND. Pin pertama di sebelah kanan pada diagram masuk ke pin analog pertama kami pada mikrokontroler Atmega328p. Ketika tidak ada tombol yang ditekan, sinyal akan menjadi 0V, dan ketika masing-masing tombol yang berbeda ditekan, input ke port analog akan berkisar antara 0V dan 5V dengan jumlah yang berbeda tergantung pada tombol mana yang ditekan. Kami memilih nilai resistor sehingga setiap jalur akan berisi resistansi yang berbeda dari yang lain. Port analog pada mikrokontroler mengambil sinyal analog dan membaginya menjadi 1024 saluran yang berbeda antara 0V dan 5V. Artinya setiap saluran memiliki lebar 5V/1024 = 0,005 V/saluran = 5 mV/saluran. Jadi port analog dapat membedakan tegangan input selama berbeda lebih dari 5 mV. Dalam kasus kami, kami telah memilih nilai resistor sehingga setiap dua penekanan tombol akan mengirimkan sinyal tegangan yang berbeda lebih dari ini sehingga mikrokontroler dapat dengan mudah memutuskan tombol mana yang ditekan. Masalah besarnya adalah seluruh sistem sangat bising sehingga kita perlu memilih rentang voltase untuk dipetakan ke setiap penekanan tombol -- tetapi kita akan membahasnya nanti.

Perhatikan bahwa kita dapat mengontrol keypad 14 tombol hanya dengan menggunakan satu jalur input ke pengontrol. Itulah salah satu aspek yang berguna dari input analog.

Sekarang upaya pertama kita untuk mengontrol keypad adalah menekan tombol yang menyebabkan interupsi, subrutin interupsi akan membaca port input analog dan memutuskan tombol mana yang ditekan, dan kemudian akan menampilkan nomor itu ke subrutin penganalisis register yang akan menampilkan nilai kunci dalam biner pada 8 LED kami yang kami atur di Tutorial 5.

Langkah 5: Hubungkan Keypad ke Analyzer Anda

Hubungkan Keypad ke Analyzer Anda
Hubungkan Keypad ke Analyzer Anda
Hubungkan Keypad ke Analyzer Anda
Hubungkan Keypad ke Analyzer Anda

Gambar-gambar tersebut menunjukkan bagaimana kita ingin menghubungkan keypad ke mikrokontroler sehingga kita dapat melihat output pada tampilan analyzer kita. Pada dasarnya kita hanya menghubungkan output dari keypad ke portC pin 0, yang juga disebut ADC0 pada ATmega328P.

Namun, ada beberapa hal tambahan. Kami juga akan menghubungkan tombol ke PD2. Yaitu. ambil kabel dari rel 5V Anda ke sebuah tombol dan dari sisi lain tombol ke PD2, dan terakhir, kami ingin melepaskan pin AREF dari rel 5V kami dan sebagai gantinya membiarkannya terputus. Kita bisa memasukkan kapasitor decoupling 0,1 mikrofarad jika kita mau. Ini adalah kapasitor keramik dengan 104 tertulis di atasnya. Dua digit pertama adalah angka dan digit terakhir adalah kekuatan 10 kita kalikan dengan untuk mendapatkan jawaban dalam picofarads (pico berarti 10^-12), Jadi 104 berarti 10 x 10^4 picofarads, yang sama dengan 100 nanofarad (nano berarti 10^-9), yang sama dengan 0,1 mikrofarad (mikro berarti 10^-6). Bagaimanapun, semua ini adalah menstabilkan pin AREF ketika kita dapat menggunakannya sebagai pin referensi kita.

Kami juga menginginkan resistor 1 Mohm antara PD2 dan ground. Kami akan mengatur PD2 sebagai pin output pada 0V dan kami akan memicu pada tepi positif pada pin itu. Kami ingin tepi segera menghilang ketika kami melepaskan tombol sehingga kami akan memasukkan resistor "tarik ke bawah" ini.

Alasan kami menginginkan tombol ini adalah karena kami ingin memicu konverter Analog-ke-Digital kami dari pin INT0 pada chip, yang juga PD2. Akhirnya kami ingin penekanan tombol untuk memicu ADC dan juga memberikan input untuk dikonversi tanpa memiliki tombol terpisah, tetapi karena cara kerja waktu, kami akan mulai dengan memiliki tombol terpisah untuk memicu ADC dan setelah kami menyetrika semua bug keluar dan yakin bahwa semuanya berfungsi dengan baik, maka kami akan mengatasi masalah kebisingan dan waktu yang datang dengan pemicu dari penekanan tombol yang sama yang ingin kami baca.

Jadi, untuk saat ini, cara kerjanya adalah kita akan menahan tombol, lalu menekan tombol untuk memicu ADC, dan kemudian melepaskan dan semoga nilai biner dari tombol yang kita tekan akan muncul di analyzer.

Jadi mari kita menulis beberapa kode yang akan mencapai itu.

Langkah 6: Sakelar Toggle Mana yang Harus Kita Tetapkan?

Sakelar Toggle Mana yang Harus Kita Setel?
Sakelar Toggle Mana yang Harus Kita Setel?

Pertama-tama mari kita pikirkan bagaimana kita akan membuat kode ini sehingga pengontrol dapat membaca input dari keypad dan mengubahnya menjadi nilai numerik yang sesuai dengan tombol yang ditekan. Kita akan menggunakan Analog to Digital Converter (ADC) yang ada di dalam Atmega328p. Kami akan menggunakan AREF sebagai tegangan referensi kami dan output keypad kami akan terhubung ke PortC0 atau PC0. Perhatikan bahwa pin ini juga disebut ADC0 untuk Analog-to-Digital Converter 0. Mungkin ada baiknya Anda membaca Bagian 12.4 tentang interupsi untuk ATmega328P dan juga bab 24 tentang Analog-to-Digital Converter sebelum kita mendapatkan memulai atau setidaknya menyiapkan bagian-bagian tersebut untuk referensi. Untuk mengatur mikrokontroler agar mengetahui apa yang harus dilakukan dengan sinyal input analog, dan bagaimana berinteraksi dengan program kita, pertama-tama kita harus mengatur beberapa dari berbagai ADC bit register terkait. Ini pada dasarnya setara dengan sakelar sakelar lama di komputer pertama. Anda bisa menyalakan atau mematikan sakelar, atau bahkan lebih jauh ke belakang Anda akan mencolokkan kabel antara satu outlet dan yang lain sehingga elektron yang mencapai percabangan di jalan akan menemukan satu gerbang tertutup dan yang lain terbuka memaksanya menuruni jalur yang berbeda di labirin sirkuit dan dengan demikian melakukan tugas logis yang berbeda. Saat mengkode dalam bahasa rakitan, kami memiliki akses dekat ke fungsi mikrokontroler ini yang merupakan salah satu hal menarik tentang melakukannya sejak awal. Ini lebih "langsung" dan jauh lebih sedikit yang terjadi "di belakang layar" seolah-olah. Jadi jangan menganggap pengaturan register ini sebagai tugas yang membosankan. Inilah yang membuat bahasa assembly menarik! Kami mendapatkan hubungan yang sangat pribadi dengan cara kerja dan logika chip dan membuatnya melakukan apa yang kami inginkan -- tidak lebih dan tidak kurang. Tidak ada siklus jam yang terbuang. Jadi, inilah daftar sakelar yang perlu kita atur:

  1. Matikan bit ADC Pengurangan Daya, PRADC, yang merupakan bit 0 dari register PRR, karena jika bit ini aktif maka akan mematikan ADC. Register pengurangan daya pada dasarnya adalah cara untuk mematikan berbagai hal yang menggunakan daya saat Anda tidak membutuhkannya. Karena kami menggunakan ADC, kami ingin memastikannya tidak dinonaktifkan dengan cara ini. (Lihat PRADC di halaman 46)
  2. Pilih saluran input analog menjadi ADC0 dengan mematikan MUX3…0 dalam register ADC Multiplexer Selection (ADMUX) (Lihat tabel 24-4 halaman 249) ini sudah dimatikan secara default sehingga kita tidak perlu melakukan ini. Namun, saya menyertakannya karena jika Anda pernah menggunakan port selain ADC0, Anda harus mengaktifkan sakelar ini. Berbagai kombinasi MUX3, MUX2, MUX1, MUX0 memungkinkan Anda untuk menggunakan salah satu port analog sebagai input Anda dan Anda juga dapat mengubahnya dengan cepat jika Anda ingin melihat sekumpulan sinyal analog yang berbeda sekaligus.
  3. Matikan bit REFS0 dan REFS1 di register ADMUX sehingga kita akan menggunakan AREF sebagai tegangan referensi kita daripada referensi internal (Lihat halaman 248).
  4. Nyalakan bit ADLAR di ADMUX agar hasilnya “left disesuaikan” pilihan ini akan kita bahas pada langkah selanjutnya.
  5. Atur bit ADC0D di Digital Input Disable Register (DIDR0) untuk mematikan input digital ke PC0. Kami menggunakan port itu untuk input analog sehingga kami mungkin juga menonaktifkan input digital untuk itu.
  6. Atur ISC0 dan ISC1 di External Interrupt Control Register A (EICRA) untuk menunjukkan bahwa kita ingin memicu pada tepi naik dari sinyal tegangan ke pin INT0 (PD2), lihat halaman 71.
  7. Hapus bit INT0 dan INT1 di External Interrupt Mask Register (EIMSK) untuk menunjukkan bahwa kita tidak menggunakan interupsi pada pin ini. Jika kita ingin mengaktifkan interupsi pada pin ini, kita akan memerlukan penangan interupsi di alamat 0x0002 tetapi sebaliknya kita mengaturnya sehingga sinyal pada pin ini memicu konversi ADC, penyelesaiannya ditangani oleh konversi ADC, interupsi lengkap di alamat 0x002A. Lihat halaman 72.
  8. Atur bit ADC Enable (ADEN) (bit 7) di kontrol ADC dan register status A (ADCSRA) untuk mengaktifkan ADC. Lihat halaman 249.
  9. Kita dapat memulai konversi tunggal dengan mengatur bit konversi awal ADC (ADSC) setiap kali kita ingin membaca sinyal analog, namun, untuk saat ini kita lebih suka membacanya secara otomatis setiap kali seseorang menekan tombol, jadi sebagai gantinya kita akan mengaktifkan ADC Autotrigger Enable (ADATE) bit pada register ADCSRA sehingga triggering dilakukan secara otomatis.
  10. Kami juga mengatur bit ADPS2..0 (bit AD Prescalar) ke 111 sehingga jam ADC adalah jam CPU dibagi dengan faktor 128.
  11. Kami akan memilih sumber pemicu ADC menjadi PD2 yang juga disebut INT0 (External Interrupt Request 0). Kami melakukan ini dengan mengubah berbagai bit dalam register ADCSRB (Lihat Tabel 24-6 di halaman 251). Kita lihat dari tabel bahwa kita ingin ADTS0 off, ADTS1 on, dan ADTS2 off sehingga ADC akan memicu pin itu. Perhatikan jika kami ingin terus-menerus mengambil sampel port analog seperti jika kami membaca beberapa sinyal analog terus menerus (seperti pengambilan sampel suara atau semacamnya), kami akan mengaturnya ke Free Running Mode. Metode yang kami gunakan untuk mengatur pemicuan pada PD2 memicu pembacaan ADC dari port analog PC0 tanpa menyebabkan interupsi. Interupsi akan datang ketika konversi selesai.
  12. Aktifkan bit ADC Interrupt Enable (ADIE) di register ADCSRA sehingga ketika konversi analog ke digital selesai, itu akan menghasilkan interupsi yang dapat kita tuliskan handler interupsinya dan letakkan di.org 0x002A.
  13. Atur bit I di SREG untuk mengaktifkan interupsi.

Latihan 1: Pastikan Anda membaca bagian yang relevan dalam lembar data untuk setiap pengaturan di atas sehingga Anda memahami apa yang sedang terjadi dan apa yang akan terjadi jika kami mengubahnya ke pengaturan alternatif.

Langkah 7: Tulis Interrupt Handler

Pada langkah terakhir kami melihat bahwa kami telah mengaturnya sehingga tepi naik yang terdeteksi pada PD2 akan memicu konversi analog ke digital pada PC0 dan ketika konversi ini selesai, ia akan mengeluarkan interupsi Konversi Lengkap ADC. Sekarang kami ingin melakukan sesuatu dengan interupsi ini. Jika Anda memeriksa Tabel 12-6 di halaman 65, Anda akan melihat daftar kemungkinan interupsi. Kita telah melihat interupsi RESET di alamat 0x0000 dan interupsi Overflow Timer/Counter0 di alamat 0x0020 di Tutorial sebelumnya. Sekarang kita ingin melihat interupsi ADC yang kita lihat pada tabel di alamat 0x002A. Jadi di awal kode bahasa assembly kita akan membutuhkan baris yang berbunyi:

.org 0x002Arjmp ADC_int

yang akan melompat ke penangan interupsi kami berlabel ADC_int setiap kali ADC telah menyelesaikan konversi. Lalu bagaimana seharusnya kita menulis interrupt handler kita? Cara kerja ADC adalah dengan melakukan perhitungan sebagai berikut:

ADC = Vin x 1024 / Vref

Jadi mari kita lihat apa yang terjadi jika saya menekan tombol "Panggil Ulang" pada keypad. Dalam hal ini tegangan pada PC0 akan berubah menjadi beberapa nilai, katakanlah 1,52V, dan karena Vref berada pada 5V, kita akan memiliki:

ADC = (1.52V) x 1024 / 5V = 311.296

dan itu akan muncul sebagai 311. Jika kita ingin mengubahnya kembali menjadi tegangan, kita hanya akan membalikkan perhitungan. Namun kita tidak perlu melakukan ini karena kita tidak tertarik pada tegangan sebenarnya hanya untuk membedakannya. Ketika konversi selesai, hasilnya disimpan dalam nomor 10-bit yang ditempatkan di register ADCH dan ADCL dan kami telah menyebabkannya menjadi "disesuaikan kiri" yang berarti bahwa 10-bit mulai dari bit 7 ADCH dan turun ke bit 6 dari ADCL (ada total 16 bit dalam dua register ini dan kami hanya menggunakan 10 dari mereka, yaitu 1024 saluran). Kita bisa mendapatkan hasil "penyesuaian kanan" jika kita mau dengan menghapus bit ADLAR di register ADMUX. Alasan kami memilih penyesuaian kiri adalah karena jarak sinyal kami cukup jauh sehingga dua digit terakhir dari nomor saluran tidak relevan dan mungkin hanya noise jadi kami akan membedakan penekanan tombol hanya menggunakan 8 digit atas, dengan kata lain, kami hanya perlu melihat ADCH untuk mengetahui tombol mana yang ditekan. Jadi handler interupsi kami hanya perlu membaca nomor dari ADCH mendaftar, ubah angka itu menjadi nilai keypad, dan kemudian kirim nilai itu ke LED penganalisis register kami sehingga kami dapat memverifikasi bahwa menekan angka "9", akan menyebabkan LED yang sesuai dengan "00001001" menyala. Sebelum kita melakukannya jauh meskipun kita harus terlebih dahulu melihat apa yang muncul di ADCH ketika kita menekan berbagai tombol. Jadi mari kita tulis sebuah pengendali interupsi sederhana yang hanya mengirimkan isi ADCH ke tampilan penganalisa. Jadi, inilah yang kita butuhkan:

ADC_int:lds analyzer, ADCH;muat nilai ADCH ke dalam analyzersbi EIFR kami, 0; hapus tanda interupsi eksternal sehingga siap untuk digunakan kembali

Sekarang, Anda seharusnya sudah dapat menyalin kode dari penganalisis kami di tutorial 5 dan menambahkan interupsi ini dan pengaturan sakelar dan menjalankannya. Latihan 2: Tulis kodenya dan jalankan. Pastikan Anda mendapatkan tampilan ADCH di layar penganalisis Anda. Coba tekan tombol yang sama beberapa kali. Apakah Anda selalu mendapatkan nilai yang sama di ADCH?

Langkah 8: Memetakan Nilai Keypress

Memetakan Nilai Tekan Tombol
Memetakan Nilai Tekan Tombol

Yang perlu kita lakukan sekarang adalah mengubah nilai dalam ADCH menjadi angka yang sesuai dengan tombol yang ditekan. Kami melakukan ini dengan menuliskan isi ADCH untuk setiap penekanan tombol dan kemudian mengubahnya menjadi angka desimal seperti yang saya lakukan pada gambar. Dalam rutinitas penanganan interupsi kami, kami akan mempertimbangkan seluruh rentang nilai yang sesuai dengan setiap penekanan tombol sehingga ADC akan memetakan apa pun dalam rentang tersebut ke penekanan tombol yang diberikan.

Latihan 3: Lakukan pemetaan ini dan tulis ulang rutin interupsi ADC Anda.

Inilah yang saya dapatkan untuk milik saya (milik Anda kemungkinan besar akan berbeda). Perhatikan bahwa saya telah mengaturnya dengan rentang nilai untuk setiap penekanan tombol.

ADC_int:; Penganalisis interupsi handlerclr eksternal; bersiap untuk tombol angka baruH, ADCH; Pembaruan ADC ketika ADCH dibaca clccpi buttonH, 240brlo PC+3; jika ADCH lebih besar maka itu adalah 1ldi analyzer, 1; jadi load analyzer dengan pengembalian 1rjmp; dan kembalikan tombol clccpiH, 230; jika ADCH lebih besar maka 2brlo PC+3ldi analyzer, 2rjmp return clccpi buttonH, 217brlo PC+3ldi analyzer, 3rjmp return clccpi buttonH, 203brlo PC+3ldi analyzer, 4rjmp return clccpi buttonH, 187brlo PC+3ldi analyzer, 5rjmp buttonH 155brlo PC+3ldi analyzer, 6rjmp kembali tombol clccpiH, 127brlo PC+3ldi analyzer, 255; kami akan mengatur flash sebagai semua tombol clccpi kembali onrjmpH, 115brlo PC+3ldi analyzer, 7rjmp return clccpi buttonH, 94brlo PC+3ldi analyzer, 8rjmp return clccpi buttonH, 62brlo PC+3ldi analyzer, 9rjmp return clccpi buttonH, 37brlo PC+3ldi 0b11110000; asterisk adalah bagian atas tombol clccpi return onrjmpH, 28brlo PC+3ldi analyzer, 0rjmp return clccpi buttonH, 17brlo PC+3ldi analyzer, 0b00001111; tanda hash adalah bagian bawah onrjmp return clccpi buttonH, 5brlo PC+3ldi analyzer, 0b11000011; redial adalah top 2 bottom 2rjmp return ldi analyzer, 0b11011011; jika tidak terjadi kesalahan kembali:reti

Langkah 9: Kode dan Video untuk Versi 1

Saya telah melampirkan kode saya untuk driver keypad versi pertama ini. Dalam hal ini Anda perlu menekan tombol dan kemudian menekan tombol agar ADC membaca input dari keypad. Apa yang kita lebih suka adalah tidak ada tombol tetapi sinyal untuk melakukan konversi berasal dari penekanan tombol itu sendiri. Latihan 3: Rakit dan unggah kode ini dan coba. Anda mungkin harus mengubah berbagai ambang konversi agar sesuai dengan tegangan penekanan tombol Anda karena kemungkinan berbeda dari saya. Apa yang terjadi jika Anda mencoba menggunakan input dari keypad baik untuk ADC0 dan untuk pin interupsi eksternal alih-alih melalui tombol? Saya juga akan melampirkan video pengoperasian versi pertama dari driver penekanan tombol kami. Anda akan melihat bahwa dalam kode saya ada bagian yang menginisialisasi Stack Pointer. Ada berbagai register yang mungkin ingin kita push dan pop dari stack ketika kita memanipulasi variabel dan yang lainnya dan ada juga register yang mungkin ingin kita simpan dan pulihkan nanti. Misalnya, SREG adalah register yang tidak disimpan di seluruh interupsi, sehingga berbagai flag yang ditetapkan dan dihapus sebagai hasil operasi dapat diubah jika interupsi terjadi di tengah-tengah sesuatu. Jadi yang terbaik adalah jika Anda mendorong SREG ke tumpukan di awal penangan interupsi dan kemudian melepaskannya lagi di akhir penangan interupsi. Saya telah menempatkannya dalam kode untuk menunjukkan bagaimana ini diinisialisasi dan untuk mengantisipasi bagaimana kita akan membutuhkannya nanti, tetapi karena kita tidak peduli apa yang terjadi pada SREG selama interupsi dalam kode kita, saya tidak menggunakan tumpukan untuk ini. Perhatikan juga bahwa saya telah menggunakan operasi shift untuk mengatur berbagai bit dalam register saat inisialisasi. Misalnya pada baris:

suhu ldi, (1<> sts EICRA, suhu

Perintah "<<" pada baris pertama kode di atas adalah operasi shift. Ini pada dasarnya mengambil angka biner 1, yaitu 0b00000001 dan menggesernya ke kiri dengan jumlah angka ISC01. Ini adalah posisi bit bernama ISC01 dalam register EICRA. Karena ISC01 adalah bit 1, angka 1 digeser ke kiri 1 posisi menjadi 0b00000010. Demikian pula yang kedua, ISC00, adalah bit 0 dari EICRA sehingga pergeseran angka 1 adalah posisi nol ke kiri. Jika melihat lagi pada file m328Pdef.inc yang Anda unduh di tutorial pertama dan telah menggunakan evrr sejak itu, Anda akan melihat bahwa itu hanyalah daftar panjang dari pernyataan ".equ". Anda akan menemukan bahwa ISC01 sama dengan 1. Assembler mengganti setiap instance dengan 1 bahkan sebelum mulai merakit apa pun. Mereka hanyalah nama untuk bit register untuk membantu kita manusia membaca dan menulis kode. Sekarang, garis vertikal antara dua operasi shift di atas adalah operasi logis "atau". Berikut persamaannya:

0b00000010 | 0b00000001 = 0b00000011

dan inilah yang kami muat (menggunakan "ldi") ke temp. Alasan orang menggunakan metode ini untuk memuat nilai ke dalam register adalah karena metode ini memungkinkan seseorang untuk menggunakan nama bit, bukan hanya angka, dan ini membuat kode lebih mudah dibaca. Ada juga dua teknik lain yang telah kami gunakan. Kami menggunakan instruksi "ori" dan "andi". Ini memungkinkan kita untuk SET dan CLEAR bit masing-masing tanpa mengubah bit lain dalam register. Misalnya, ketika saya menggunakan

suhu awal, (1

suhu "atau" ini dengan 0b00000001 yang menempatkan 1 di bit nol dan membiarkan sisanya tidak berubah. Juga ketika kita menulis

suhu andi, 0b11111110

ini mengubah bit nol temp menjadi 0 dan membiarkan sisanya tidak berubah.

Latihan 4: Anda harus membaca kodenya dan pastikan Anda memahami setiap barisnya. Anda mungkin tertarik untuk menemukan metode yang lebih baik untuk melakukan sesuatu dan menulis program yang lebih baik. Ada seratus cara untuk mengkodekan sesuatu dan saya cukup yakin Anda dapat menemukan cara yang jauh lebih baik daripada saya. Anda mungkin juga menemukan (surga melarang!) kesalahan dan kelalaian. Dalam hal ini saya pasti ingin mendengar tentang mereka sehingga mereka dapat diperbaiki.

Oke, sekarang mari kita lihat apakah kita bisa menyingkirkan tombol yang berlebihan itu…

Langkah 10: Kode untuk Versi 2

Cara paling sederhana untuk menghilangkan tombol tersebut adalah dengan menghapusnya sama sekali, lupakan input ke PB2, dan alihkan saja ADC ke "Free Running Mode".

Dengan kata lain cukup ubah register ADCSRB sehingga ADTS2, ADTS1, dan ADTS0 semuanya nol.

Kemudian atur bit ADSC di ADCSRA ke 1 yang akan memulai konversi pertama.

Sekarang unggah ke mikrokontroler Anda dan Anda akan menemukan bahwa nomor yang benar muncul di layar saat Anda menekan tombol dan hanya saat Anda menekan tombol. Ini karena ADC terus-menerus mengambil sampel port ADC0 dan menampilkan nilainya. Saat Anda melepaskan jari dari tombol, "tombol memantul" akan menyebabkan beberapa nilai acak terjadi dengan sangat cepat dan kemudian akan kembali ke input 0V. Dalam kode kami, 0V ini muncul sebagai 0b11011011 (karena penekanan tombol `0' sudah menggunakan nilai tampilan 0b00000000)

Ini bukan solusi yang kami inginkan karena dua alasan. Pertama kita tidak ingin harus menahan tombol. Kami ingin menekannya sekali dan menampilkan nomornya (atau digunakan dalam beberapa kode baru di tutorial selanjutnya). Kedua, kami tidak ingin terus-menerus mengambil sampel ADC0. Kami ingin mengambil satu bacaan, mengubahnya, dan kemudian tidur sampai penekanan tombol baru memicu konversi baru. Mode berjalan bebas adalah yang terbaik jika satu-satunya hal yang Anda ingin mikrokontroler lakukan adalah terus membaca beberapa input analog -- seperti jika Anda ingin menampilkan suhu waktu nyata atau semacamnya.

Jadi mari kita cari solusi lain…

Langkah 11: Bagaimana Kita Menyingkirkan Tombol? Versi 3

Bagaimana Kita Menyingkirkan Tombol? Versi 3
Bagaimana Kita Menyingkirkan Tombol? Versi 3

Ada banyak cara yang bisa kita lakukan. Pertama kita bisa menambahkan perangkat keras untuk menghilangkan tombol. Sebagai contoh kita dapat mencoba menempatkan transistor di sirkuit pada jalur output dari penekanan tombol sehingga akan mengambil sedikit arus dari output dan mengirim pulsa 5V ke pin interupsi PD2.

Namun, itu mungkin akan terlalu berisik setidaknya dan paling buruk itu tidak akan memberikan cukup waktu untuk pembacaan penekanan tombol yang akurat karena output tegangan keypad tidak akan punya waktu untuk menstabilkan sebelum pembacaan ADC ditangkap.

Jadi kami lebih suka datang dengan solusi perangkat lunak. Apa yang ingin kita lakukan adalah menambahkan interupsi pada pin PD2 dan menulis handler interupsi untuk itu yang memanggil pembacaan tunggal pin keypad. Dengan kata lain, kita menyingkirkan interupsi autotrigger dari ADC, dan menambahkan interupsi eksternal yang memanggil ADC di dalamnya. Dengan begitu sinyal untuk membaca ADC muncul setelah sinyal PD2 telah terjadi dan ini mungkin memberikan waktu yang cukup untuk menstabilkan tegangan yang akurat sebelum pin PC0 dibaca dan diubah. Kami masih akan memiliki interupsi penyelesaian ADC yang menampilkan hasilnya ke tampilan penganalisis di bagian akhir.

Masuk akal? Baiklah mari kita lakukan…

Lihatlah kode baru terlampir.

Anda melihat perubahan berikut:

  1. Kami menambahkan rjmp di alamat.org 0x0002 untuk menangani interupsi eksternal INT0
  2. Kami mengubah register EIMSK untuk menunjukkan bahwa kami ingin melakukan interupsi pada pin INT0
  3. Kami mengubah pin ADATE di register ADCSRA untuk menonaktifkan pemicu otomatis
  4. Kami menyingkirkan pengaturan ADCSRB karena tidak relevan ketika ADATE tidak aktif
  5. Kami tidak lagi harus mereset flag pemicu eksternal karena rutin interupsi INT0 melakukan ini secara otomatis ketika selesai -- sebelumnya kami tidak memiliki rutin interupsi, kami hanya memicu ADC dari sinyal di pin itu, jadi kami harus bersihkan bendera itu dengan tangan.

Sekarang di handler interupsi kita cukup memanggil satu konversi dari ADC.

Latihan 5: Jalankan versi ini dan lihat apa yang terjadi.

Langkah 12: Kode dan Video untuk Versi Kerja

Seperti yang kita lihat pada versi terakhir, tombol interupsi tidak bekerja dengan baik karena interupsi dipicu pada sisi yang naik ke pin PD2 dan kemudian pengendali interupsi memanggil konversi ADC. Namun, ADC kemudian mendapatkan pembacaan voltase sebelum menjadi stabil sehingga terbaca tidak masuk akal.

Apa yang kita butuhkan adalah untuk memperkenalkan penundaan antara interupsi pada PD2 dan pembacaan ADC pada PC0. Kita akan melakukannya dengan menambahkan timer/counter, interupsi counter overflow, dan delay routine. Untungnya kita sudah tahu bagaimana melakukan ini dari Tutorial 3! Jadi kami hanya akan menyalin dan menempelkan kode yang relevan dari sana.

Saya telah memberikan kode yang dihasilkan dan video yang menunjukkannya dalam operasi.

Anda akan melihat bahwa pembacaan tidak seakurat yang diharapkan. Ini mungkin karena sejumlah sumber:

  1. kami mengetuk dari output tegangan keypad untuk memicu pada PD2 yang mempengaruhi pembacaan di PC0.
  2. kita tidak begitu tahu berapa lama untuk menunda setelah pemicu untuk mendapatkan bacaan terbaik.
  3. dibutuhkan beberapa siklus untuk menyelesaikan konversi ADC yang berarti kita tidak dapat menembakkan tombol dengan cepat.
  4. mungkin ada noise di keypad itu sendiri.
  5. dll…

Jadi, meskipun kami berhasil membuat keypad berfungsi, dan sekarang kami dapat menggunakannya dalam aplikasi dengan menggunakan nilai penekanan tombol dengan cara lain alih-alih hanya menampilkannya ke tampilan penganalisis, ini tidak terlalu akurat dan sangat mengganggu. Itulah mengapa saya berpikir bahwa cara terbaik untuk menyambungkan papan tombol adalah dengan menempelkan setiap keluaran dari papan tombol ke port yang berbeda dan memutuskan tombol mana yang ditekan oleh port mana yang melihat tegangan. Itu mudah, sangat cepat, dan sangat akurat.

Faktanya, hanya ada dua alasan mengapa seseorang ingin menggerakkan keypad seperti yang telah kami lakukan di sini:

  1. Ini hanya menggunakan 2 pin pada mikrokontroler kami, bukan 8.
  2. Ini adalah proyek yang bagus untuk menunjukkan berbagai aspek ADC pada mikrokontroler yang berbeda dari hal-hal standar yang dapat Anda temukan di sana seperti pembacaan suhu, potensiometer putar, dll. Saya ingin contoh pembacaan tunggal yang dipicu dan pemicu otomatis pin eksternal daripada hanya menjalankan mode CPU-gobbling gratis.

Bagaimanapun, berikut adalah beberapa latihan terakhir untuk Anda:

Latihan 6: Tulis ulang pengendali interupsi lengkap konversi ADC untuk menggunakan Tabel Pencarian. Yaitu. Sehingga menguji nilai analog dengan item pertama dalam tabel dan jika lebih besar kembali dari interupsi, jika tidak maka menambah Z ke item berikutnya dalam tabel dan bercabang kembali ke tes lagi. Ini akan mempersingkat kode dan membersihkan rutin interupsi dan membuatnya terlihat lebih bagus. (Saya akan memberikan solusi yang mungkin sebagai langkah selanjutnya) Latihan 7: Hubungkan keypad Anda ke 8 pin pada mikrokontroler dan tulis driver sederhana untuk itu dan rasakan betapa lebih bagusnya itu. Dapatkah Anda memikirkan beberapa cara untuk membuat metode kami bekerja lebih baik?

Itu saja untuk tutorial ini. Saya telah melampirkan versi final dengan pointer. Saat kita semakin dekat dengan tujuan akhir kita, kita akan menggunakan keyboard sekali lagi di Tutorial 9 untuk menunjukkan bagaimana mengontrol tampilan tujuh segmen dengan itu (dan membangun sesuatu yang menarik yang menggunakan tombol ekstra pada keypad ponsel) dan kemudian kita akan beralih ke mengendalikan hal-hal dengan menekan tombol sebagai gantinya (karena metode itu lebih cocok dengan produk akhir yang sedang kita bangun dengan tutorial ini) dan kita hanya akan mengesampingkan keypad.

Sampai jumpa lain waktu!

Direkomendasikan: