Isi kandungan:

Tutorial Penyusun AVR 7: 12 Langkah
Tutorial Penyusun AVR 7: 12 Langkah

Video: Tutorial Penyusun AVR 7: 12 Langkah

Video: Tutorial Penyusun AVR 7: 12 Langkah
Video: TUTORIAL PEMASANGAN AVR | VOLTAGE JADI STABIL 2024, November
Anonim
Tutorial Penyusun AVR 7
Tutorial Penyusun AVR 7

Selamat Datang ke Tutorial 7!

Hari ini kita akan mula-mula menunjukkan cara membersihkan papan kekunci, dan kemudian menunjukkan cara menggunakan port input Analog untuk berkomunikasi dengan papan kekunci. Kami akan melakukan ini menggunakan gangguan dan wayar tunggal sebagai input. Kami akan memasangkan papan kekunci sehingga setiap penekanan kekunci menghantar voltan unik ke input analog yang akan membolehkan kami membezakan dengan voltan kekunci mana yang ditekan. Kemudian kami akan mengeluarkan nombor yang ditekan ke penganalisis daftar kami untuk menunjukkan bahawa semuanya berlaku sebagaimana mestinya. Terdapat sebilangan perangkap yang boleh anda jalani semasa menggunakan Analog to Digital Converter (ADC) di ATmega328p dan jadi kami akan lakukan beberapa peringkat dalam perjalanan untuk mencuba dan mengetahui cara menjauhinya. Kami juga akan melihat mengapa menggunakan analog ke digital converter bukanlah kaedah terbaik untuk mengawal papan kekunci walaupun menggunakan lebih sedikit port pada mikrokontroler anda. Dalam tutorial ini, anda memerlukan:

  1. pad kekunci. Anda boleh membeli satu atau anda boleh melakukan apa yang saya buat dan membakarnya.
  2. 2 header wanita untuk pad kekunci (jika anda menggunakan satu)
  3. wayar penyambung
  4. papan roti
  5. 4 1 perintang Kohm
  6. 1 15 perintang Kohm
  7. 1 3.3 Perintang Kohm
  8. Perintang 1 180 ohm
  9. 1 680 ohm perintang
  10. multimeter digital
  11. penganalisis anda dari Tutorial 5

Anda mungkin mahu melangkau beberapa langkah pertama jika anda sudah mempunyai papan kekunci dan tidak perlu mencucinya.

Berikut adalah pautan ke koleksi lengkap tutorial penghimpun AVR saya:

Langkah 1: Mengeluarkan Pad Kekunci 1

Padam Pad Kekunci 1
Padam Pad Kekunci 1
Padam Pad Kekunci 1
Padam Pad Kekunci 1
Padam Pad Kekunci 1
Padam Pad Kekunci 1
Mengeluarkan Pad Kekunci 1
Mengeluarkan Pad Kekunci 1

Dulu, walaupun datuk dan nenek anda hanyalah anak-anak, orang-orang biasa menggunakan alat-alat yang kelihatan pelik ini, yang mempunyai kabel panjang yang terpasang di dinding, untuk berkomunikasi antara satu sama lain. Mereka dipanggil "telefon" dan biasanya barang plastik murah yang mengeluarkan suara yang menjengkelkan ketika seseorang memanggil anda (bukan bahawa nada dering "Justin Bieber" hari ini tidak sama mengganggu). Walau apa pun, peranti ini mempunyai pad kekunci yang hanya berwayar dan mudah dicabut dan mempunyai 2 kunci tambahan padanya ("memanggil semula" dan "kilat") dari papan kekunci yang boleh anda beli yang mungkin anda mahu gunakan semula sebagai "kekunci anak panah", "kekunci menu", atau yang lain. Oleh itu, kita akan memulakan dengan mencungkil papan kekunci dari telefon lama. Mula-mula ambil telefon (saya menggunakan GE seperti yang ditunjukkan dalam gambar) dan lepaskannya untuk mendedahkan pendawaian. Kemudian ambil pahat dan lepaskan tombol plastik kecil yang memegang pad kekunci dan lepaskan papan kekunci.

Langkah 2: Mengeluarkan Pad Kekunci 2

Padam Pad Kekunci 2
Padam Pad Kekunci 2
Mengeluarkan Pad Kekunci 2
Mengeluarkan Pad Kekunci 2
Mengeluarkan Pad Kekunci 2
Mengeluarkan Pad Kekunci 2

Sekarang ambil gergaji PVC dan potong plastik dari sekitar lubang kunci dan kemudian potong di sekitar tepi untuk mendapatkan kedalaman tepat meninggalkan pad kekunci nipis.

Kemudian pasangkan semula pad kekunci menggunakan pasak kecil yang tersisa setelah anda memotong bahagian atasnya pada langkah terakhir dan gunakan besi pematerian untuk hanya memasukkan besi panas ke dalam setiap lubang pasak yang akan mencairkan plastik dan menyebarkannya ke atas bahagian bawah papan kekunci membentuk "tombol" baru yang akan menahan papan kekunci di tempat seperti sebelumnya.

Saya suka mengorek ketiga-tiga pembesar suara dan mungkin perkara lain seperti suis dan apa-apa yang ada di papan kenyataan. Walau bagaimanapun, kali ini saya tidak akan membuang suis dan barang kerana kita mempunyai tujuan lain pada masa ini. Juga, ada IC linear TA31002 di dalamnya yang merupakan deringan telefon. Lembar data mudah dijumpai dan dimuat turun dalam talian dengan memberikan pinout dan ciri. Oleh itu, saya akan meninggalkannya pada masa ini dan kemudian bermain dengannya kemudian. Saya ingin menyambungkannya ke osiloskop dan melihat isyarat sejuk apa yang boleh saya keluarkan. Mungkin juga mengeluarkan loceng pintu. Siapa tahu.

Bagaimanapun setelah anda selesai memusnahkan telefon dan mencabut bahagiannya, kami akan selesai membuat papan kekunci kami.

Langkah 3: Mengeluarkan Pad Kekunci 3

Mengeluarkan Pad Kekunci 3
Mengeluarkan Pad Kekunci 3
Padam Pad Kekunci 3
Padam Pad Kekunci 3
Mengeluarkan Pad Kekunci 3
Mengeluarkan Pad Kekunci 3

Gunakan sumbu pemutus dan lepaskan kabel pita dari bahagian bawah papan kekunci untuk memastikan bahawa lubang di papan litar jelas dan kemudian pasangkan dua kepala wanita ke papan di mana lubang itu berada. Anda mungkin perlu memotong tajuk anda sehingga tajuk 4-pin.

Setelah header terpasang, anda boleh memasangkannya ke papan roti, mengambil multimeter, dan menguji kuncinya dengan menempelkan multimeter pada pin rawak dan mengukur rintangan. Ini akan membolehkan anda memetakan kunci. Sukar untuk melihat bagaimana kunci disambungkan ke output dengan melihat litar tetapi jika anda menggunakan multimeter, anda boleh memasangkannya ke mana-mana dua pin dan kemudian tekan butang sehingga anda melihat nombor di skrin dan bukannya litar terbuka. Ini akan menjadi petunjuk untuk kunci itu.

Petakan semua kunci pin output dengan cara ini.

Langkah 4: Kabel Pad Kekunci

Kabel Pad Kekunci
Kabel Pad Kekunci
Kabel Pad Kekunci
Kabel Pad Kekunci

Sekarang ikuti rajah pendawaian dan pasangkan papan kekunci ke papan roti anda.

Cara ini berfungsi adalah kita akan meletakkan 5V ke sebelah kiri dan sebelah kanan menuju ke GND. Pin pertama di sebelah kanan dalam rajah masuk ke pin analog kami yang pertama pada mikrokontroler Atmega328p. Apabila tidak ada butang yang ditekan, isyarat akan menjadi 0V, dan apabila masing-masing butang ditekan, input ke port analog akan berkisar antara 0V dan 5V dengan jumlah yang berbeza bergantung pada tombol mana yang ditekan. Kami memilih nilai perintang supaya setiap jalur mengandungi rintangan yang berbeza dari yang lain. Port analog pada mikrokontroler mengambil isyarat analog dan membaginya menjadi 1024 saluran yang berbeza antara 0V dan 5V. Ini bermaksud setiap saluran mempunyai lebar 5V / 1024 = 0,005 V / saluran = 5 mV / saluran. Oleh itu port analog dapat membezakan voltan input selagi ia berbeza lebih daripada 5 mV. Dalam kes kami, kami telah memilih nilai perintang sehingga mana-mana dua penekanan kekunci akan menghantar isyarat voltan yang berbeza lebih dari ini sehingga pengawal mikro dengan mudah dapat memutuskan kunci mana yang ditekan. Masalah besarnya adalah bahawa keseluruhan sistem sangat bising, jadi kita perlu memilih rangkaian voltan untuk dipetakan ke setiap tekan butang - tetapi kita akan menerimanya sedikit kemudian.

Perhatikan bahawa kita dapat mengawal papan kekunci 14 menggunakan hanya satu baris input ke pengawal. Itu adalah salah satu aspek input analog yang berguna.

Sekarang percubaan pertama kami untuk mengawal papan kekunci adalah dengan menekan kekunci menyebabkan gangguan, subrutin interrupt akan membaca port input analog dan memutuskan kekunci mana yang ditekan, dan kemudian ia akan mengeluarkan nombor itu ke subrutin penganalisis daftar kami yang akan memaparkan nilai utama dalam binari pada 8 LED kami yang kami tetapkan dalam Tutorial 5.

Langkah 5: Kabelkan Papan Kekunci ke Penganalisis Anda

Kabelkan Papan Kekunci ke Penganalisis Anda
Kabelkan Papan Kekunci ke Penganalisis Anda
Kabelkan Papan Kekunci ke Penganalisis Anda
Kabelkan Papan Kekunci ke Penganalisis Anda

Gambar-gambar menunjukkan bagaimana kita ingin memasang papan kekunci ke mikrokontroler sehingga kita dapat melihat output pada paparan penganalisis kita. Pada dasarnya kita hanya memasukkan output dari papan kekunci ke pin PortC, yang juga disebut ADC0 pada ATmega328P.

Walau bagaimanapun, terdapat beberapa perkara tambahan. Kami juga akan memasang butang ke PD2. I. E. bawa wayar dari rel 5V anda ke butang dan dari sisi lain butang ke PD2, dan terakhir, kami ingin memutuskan pin AREF dari rel 5V kami dan sebaliknya membiarkannya terputus. Kita boleh memasukkan kapasitor pemutusan 0.1 mikrofarad jika kita mahu. Ini adalah kapasitor seramik dengan tulisan 104 di atasnya. Dua digit pertama adalah nombor dan digit terakhir adalah kekuatan 10 kita mengalikannya dengan mendapatkan jawapan dalam picofarads (pico bermaksud 10 ^ -12), Jadi 104 bermaksud 10 x 10 ^ 4 picofarads, yang sama dengan 100 nanofarads (nano bermaksud 10 ^ -9), yang sama dengan 0.1 microfarads (micro bermaksud 10 ^ -6). Bagaimanapun, semua yang dilakukan ini adalah menstabilkan pin AREF apabila kita dapat menggunakannya sebagai pin rujukan kita.

Kami juga mahukan perintang 1 Mohm antara PD2 dan tanah. Kami akan menetapkan PD2 sebagai pin output pada 0V dan kami akan memicu kelebihan positif pada pin itu. Kami mahu pinggirnya hilang dengan segera apabila kami melepaskan butang jadi kami akan memasukkan perintang "tarik ke bawah" ini.

Sebab yang kami mahukan butang adalah kerana kami ingin mencetuskan penukar Analog-ke-Digital pin INT0 pada cip, yang juga PD2. Akhirnya kami ingin menekan kekunci untuk kedua-duanya memicu ADC dan juga memberikan input untuk ditukar tanpa butang yang terpisah, tetapi kerana cara kerjanya berfungsi, kami akan mulai dengan mempunyai butang terpisah untuk memicu ADC dan setelah kami menyetrika semua bug keluar dan yakin bahawa semuanya berfungsi dengan baik, maka kita akan mengatasi masalah kebisingan dan masa yang datang dengan mencetuskan dari tekan butang yang sama yang ingin kita baca.

Jadi, buat masa ini, cara kerjanya adalah kita akan menahan kekunci, kemudian tekan butang untuk mencetuskan ADC, dan kemudian lepaskan dan semoga nilai binari butang yang kita tekan akan muncul di penganalisis.

Oleh itu, mari kita tulis beberapa kod yang akan mencapai itu.

Langkah 6: Suis Toggle Yang Harus Kita Tetapkan?

Suis Toggle Yang Perlu Kita Tetapkan?
Suis Toggle Yang Perlu Kita Tetapkan?

Mari kita fikirkan terlebih dahulu bagaimana kita akan membuat kod ini supaya pengawal dapat membaca input dari papan kekunci dan mengubahnya menjadi nilai berangka yang sesuai dengan butang yang ditekan. Kami akan menggunakan Analog ke Digital Converter (ADC) yang dibina di Atmega328p. Kami akan menggunakan AREF sebagai voltan rujukan kami dan output papan kekunci kami akan disambungkan ke PortC0 atau PC0. Perhatikan bahawa pin ini juga disebut ADC0 untuk Analog-ke-Digital Converter 0. Mungkin ada baiknya anda membaca Bahagian 12.4 mengenai gangguan untuk ATmega328P dan juga bab 24 mengenai Analog-ke-Digital Converter sebelum kita mendapat memulakan atau sekurang-kurangnya menyediakan bahagian-bahagian itu untuk rujukan. Untuk menyiapkan mikrokontroler supaya tahu apa yang harus dilakukan dengan isyarat input analog, dan bagaimana untuk berinteraksi dengan program kami, pertama-tama kita harus menetapkan beberapa daripada beberapa ADC bit daftar yang berkaitan. Ini pada dasarnya setara dengan suis togol lama pada komputer pertama. Anda sama ada menghidupkan atau mematikan suis, atau lebih jauh lagi, anda akan memasang kabel di antara satu alur keluar dan yang lain sehingga elektron yang mencapai garpu di jalan akan mendapati satu pintu ditutup dan yang lain terbuka memaksanya menyusuri jalan yang berbeza di labirin litar dan dengan itu melakukan tugas logik yang berbeza. Semasa pengekodan dalam bahasa pemasangan, kita mempunyai akses yang dekat ke fungsi mikrokontroler ini yang merupakan salah satu perkara menarik untuk melakukannya sejak awal. Ia lebih "hands on" dan lebih kurang berlaku "di belakang tabir" seperti dulu. Oleh itu, jangan fikirkan menetapkan daftar ini sebagai tugas yang membosankan. Inilah yang menjadikan bahasa perhimpunan menarik! Kami memperoleh hubungan yang sangat peribadi dengan cara kerja dan logik cip tersebut dan menjadikannya tepat seperti yang kami mahukan - tidak lebih dan tidak kurang. Tidak ada kitaran jam yang sia-sia. Jadi, inilah senarai suis yang perlu kita atur:

  1. Matikan bit ADC Pengurangan Daya, PRADC, yang merupakan bit 0 dari daftar PRR, kerana jika bit ini di dalamnya akan mematikan ADC. Daftar pengurangan kuasa pada dasarnya adalah cara untuk mematikan pelbagai perkara yang menggunakan kuasa apabila anda tidak memerlukannya. Oleh kerana kami menggunakan ADC, kami ingin memastikannya tidak dilumpuhkan dengan cara ini. (Lihat PRADC di halaman 46)
  2. Pilih saluran input analog untuk menjadi ADC0 dengan mematikan MUX3… 0 dalam daftar ADC Multiplexer Selection (ADMUX) (Lihat jadual 24-4 halaman 249) ini sudah dimatikan secara lalai sehingga kita tidak perlu melakukan ini. Namun, saya menyertakannya kerana jika anda pernah menggunakan port selain ADC0, anda perlu menukar suis ini dengan sewajarnya. Pelbagai kombinasi MUX3, MUX2, MUX1, MUX0 membolehkan anda menggunakan mana-mana port analog sebagai input anda dan anda juga boleh mengubahnya dengan cepat jika anda ingin melihat sekumpulan isyarat analog yang berbeza sekaligus.
  3. Matikan bit REFS0 dan REFS1 dalam daftar ADMUX supaya kami akan menggunakan AREF sebagai voltan rujukan kami dan bukannya rujukan dalaman (Lihat halaman 248).
  4. Hidupkan bit ADLAR di ADMUX sehingga hasilnya "disesuaikan kiri" kita akan membincangkan pilihan ini pada langkah seterusnya.
  5. Tetapkan bit ADC0D dalam Digital Input Disable Register (DIDR0) untuk mematikan input digital ke PC0. Kami menggunakan port itu untuk input analog sehingga kami mungkin juga mematikan input digital untuknya.
  6. Tetapkan ISC0 dan ISC1 di Daftar Kawalan Interupsi Luaran A (EICRA) untuk menunjukkan bahawa kami ingin mencetuskan pada tepi isyarat voltan yang meningkat ke pin INT0 (PD2), lihat halaman 71.
  7. Hapus bit INT0 dan INT1 dalam Daftar Masker Interrupt Luaran (EIMSK) untuk menunjukkan bahawa kami tidak menggunakan gangguan pada pin ini. Sekiranya kami mengaktifkan gangguan pada pin ini, kami memerlukan pengendali gangguan di alamat 0x0002 tetapi sebaliknya kami menyiapkannya supaya isyarat pada pin ini mencetuskan penukaran ADC, penyelesaiannya ditangani oleh penukaran ADC sepenuhnya berhenti pada alamat 0x002A. Lihat halaman 72.
  8. Tetapkan bit ADC Enable (ADEN) (bit 7) dalam kawalan ADC dan status status A (ADCSRA) untuk mengaktifkan ADC. Lihat halaman 249.
  9. Kami boleh memulakan satu penukaran dengan menetapkan bit penukaran permulaan ADC (ADSC) setiap kali kami ingin membaca isyarat analog, namun, buat masa ini kami lebih suka membacanya secara automatik setiap kali seseorang menekan butang, jadi kami akan mengaktifkan ADC Autotrigger Enable (ADATE) bit di ADCSRA register sehingga pencetusan dilakukan secara automatik.
  10. Kami juga menetapkan bit ADPS2..0 (bit AD Prescalar) ke 111 sehingga jam ADC adalah jam CPU dibahagi dengan faktor 128.
  11. Kami akan memilih sumber pemicu ADC menjadi PD2 yang juga disebut INT0 (External Interrupt Request 0). Kami melakukan ini dengan menukar pelbagai bit dalam daftar ADCSRB (Lihat Jadual 24-6 di halaman 251). Kami melihat jadual bahawa kami mahu ADTS0 mati, ADTS1 aktif, dan ADTS2 mati sehingga ADC akan mencetuskan pin itu. Perhatikan jika kita ingin terus mengambil sampel port analog seperti jika kita membaca beberapa isyarat analog berterusan (seperti pensampelan suara atau sesuatu) kita akan menetapkannya ke Free Running Mode. Kaedah yang kami gunakan untuk menetapkan pemicu pada PD2 memicu pembacaan ADC dari port analog PC0 tanpa menyebabkan gangguan. Selang akan datang apabila penukaran selesai.
  12. Aktifkan bit ADC Interrupt Enable (ADIE) dalam daftar ADCSRA supaya apabila penukaran analog ke digital selesai, ia akan menghasilkan gangguan yang boleh kita tulis penangan interrupt dan letakkan di.org 0x002A.
  13. Tetapkan bit I di SREG untuk membolehkan gangguan.

Latihan 1: Pastikan anda membaca bahagian yang relevan dalam lembar data untuk setiap tetapan di atas sehingga anda memahami apa yang sedang berlaku dan apa yang akan berlaku jika kami mengubahnya ke tetapan alternatif.

Langkah 7: Tulis Pengendali Interrupt

Pada langkah terakhir kami melihat bahawa kami telah menyiapkannya sehingga kelebihan yang dikesan pada PD2 akan mencetuskan penukaran analog ke digital pada PC0 dan apabila penukaran ini selesai, ia akan menghentikan gangguan ADC Penukaran Lengkap. Sekarang kita mahu melakukan sesuatu dengan gangguan ini. Sekiranya anda memeriksa Jadual 12-6 di halaman 65, anda akan melihat senarai kemungkinan gangguan. Kami telah melihat RESET terganggu di alamat 0x0000 dan Timer / Counter0 Overflow terganggu di alamat 0x0020 pada Tutorial sebelumnya. Sekarang kita ingin melihat gangguan ADC yang kita lihat di jadual adalah di alamat 0x002A. Oleh itu, pada awal kod bahasa perhimpunan kita memerlukan garis yang berbunyi:

.org 0x002Arjmp ADC_int

yang akan beralih ke pengendali gangguan kami berlabel ADC_int setiap kali ADC menyelesaikan penukaran. Jadi bagaimana kita harus menulis pengendali gangguan kita? Cara ADC berfungsi adalah dengan melakukan pengiraan berikut:

ADC = Vin x 1024 / Vref

Oleh itu, mari kita lihat apa yang berlaku sekiranya saya menekan butang "memanggil semula" pada papan kekunci. Sekiranya voltan pada PC0 akan berubah menjadi beberapa nilai, katakanlah 1.52V, dan kerana Vref pada 5V kita akan mempunyai:

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

dan ia akan muncul sebagai 311. Sekiranya kita mahu menukarnya kembali ke voltan, kita hanya akan membalikkan pengiraan. Kami tidak perlu melakukan ini kerana kami tidak berminat dengan voltan sebenar hanya untuk membezakan antara voltan tersebut. Apabila penukaran selesai, hasilnya disimpan dalam nombor 10-bit yang ditempatkan di register ADCH dan ADCL dan kami telah menyebabkannya "diselaraskan kiri" yang bermaksud bahawa 10-bit bermula pada bit 7 dari ADCH dan turun ke bit 6 dari ADCL (terdapat 16 bit total dalam kedua register ini dan kami hanya menggunakan 10 daripadanya, iaitu 1024 saluran). Kami dapat hasilnya "betul disesuaikan" jika kami mahu dengan membersihkan bit ADLAR dalam daftar ADMUX. Sebab kami memilih disesuaikan kiri adalah kerana isyarat kami cukup jauh sehingga dua digit terakhir dari nombor saluran tidak relevan dan mungkin hanya bunyi bising sehingga kita akan membezakan penekanan kekunci hanya dengan menggunakan 8 digit atas, dengan kata lain, kita hanya perlu melihat ADCH untuk mengetahui butang mana yang ditekan. Oleh itu, pengendali gangguan kita hanya perlu membaca nombor dari ADCH daftar, ubah nombor itu menjadi nilai papan kekunci, dan kemudian hantarkan nilai tersebut ke LED penganalisis daftar kami supaya kami dapat mengesahkan bahawa menolak kata "9", akan menyebabkan LED yang sepadan dengan "00001001" menyala. Sebelum kita pergi, walaupun kita perlu melihat terlebih dahulu apa yang muncul di ADCH ketika kita menekan pelbagai butang. Oleh itu, mari kita tulis penangan interrupt sederhana yang hanya menghantar kandungan ADCH ke paparan penganalisis. Oleh itu, inilah yang kita perlukan:

ADC_int: lds analyzer, ADCH; muatkan nilai ADCH ke dalam penganalisis kami EIFR, 0; kosongkan bendera gangguan luaran sehingga siap untuk dilancarkan semula

Sekarang, anda seharusnya dapat menyalin kod dari penganalisis kami dalam tutorial 5 dan menambahkan gangguan ini dan tetapan togol dan jalankan. Latihan 2: Tulis kod dan jalankan. Lihat bahawa anda mendapat paparan ADCH pada paparan penganalisis anda. Cuba tekan kekunci yang sama berulang kali. Adakah anda selalu mendapat nilai yang sama di ADCH?

Langkah 8: Memetakan Nilai Tekan Kekunci

Memetakan Nilai Kekunci
Memetakan Nilai Kekunci

Apa yang perlu kita lakukan sekarang ialah menukar nilai dalam ADCH menjadi angka yang sepadan dengan kekunci yang ditekan. Kami melakukan ini dengan menuliskan kandungan ADCH untuk setiap tekan kekunci dan kemudian menukarnya menjadi nombor perpuluhan seperti yang saya lakukan dalam gambar. Dalam rutin pengendalian interupsi kami, kami akan mempertimbangkan sebilangan besar nilai yang sesuai dengan setiap penekanan kekunci sehingga ADC akan memetakan apa-apa yang berada dalam julat ke tekanan kekunci tertentu.

Latihan 3: Lakukan ma-p.webp

Inilah yang saya dapat untuk milik saya (kemungkinan anda akan berbeza). Perhatikan bahawa saya telah menetapkannya dengan pelbagai nilai untuk setiap penekanan kekunci.

ADC_int:; Penganalisis gangguan gangguan luaran; bersiap untuk butang nombor baru H, ADCH; Kemas kini ADC apabila ADCH dibaca butang clccpiH, 240brlo PC + 3; jika ADCH lebih besar maka itu adalah penganalisis 1ldi, 1; jadi muatkan penganalisis dengan pulangan 1rjmp; dan kembalikan butang 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 return clccpi button, 5rjmp return clccpi butang 155brlo PC + 3ldi analyzer, 6rjmp return clccpi buttonH, 127brlo PC + 3ldi analyzer, 255; kami akan menetapkan flash kerana semua butang clccpi pulangan onrjmpH, penganalisis 115brlo PC + 3ldi, butang clccpi pulangan 7rjmpH, penganalisis 94brlo PC + 3ldi, butang klccpi pemulangan 8rjmpH, penganalisis PC + 3bri 62rb, butang klccpi pulangan 9rjmpH, penganalisis 37brlo PC + 3ldi, 0b11110000; asterisk adalah butang clccpi pulangan onrjmp separuh teratasH, penganalisis 28brlo PC + 3ldi, butang clccpi pulangan 0rjmpH, penganalisis 17brlo PC + 3ldi, 0b00001111; tanda hash adalah butang clccpi pulangan onrjmp separuh bawahH, penganalisis 5brlo PC + 3ldi, 0b11000011; redial adalah 2rjmp return ldi analyzer top 2 bawah, 0b11011011; jika tidak, ralat berlaku kembali: reti

Langkah 9: Kod dan Video untuk Versi 1

Saya telah melampirkan kod saya untuk pemacu kekunci versi pertama ini. Untuk ini, anda perlu menekan kekunci dan kemudian tekan butang agar ADC membaca input dari papan kekunci. Apa yang kita mahukan adalah bukan butang melainkan isyarat untuk melakukan penukaran berasal dari penekanan kekunci itu sendiri. Latihan 3: Pasang dan muat naik kod ini dan cuba. Anda mungkin perlu mengubah pelbagai ambang penukaran agar sesuai dengan voltan penekanan kekunci anda kerana kemungkinannya berbeza dari yang saya miliki. Apa yang berlaku jika anda cuba menggunakan input dari papan kekunci baik untuk ADC0 dan untuk pin gangguan luaran dan bukannya melalui butang? Saya juga akan melampirkan video operasi versi pertama pemacu kekunci kami ini. Anda akan menyedari bahawa dalam kod saya ada bahagian yang memulakan Stack Pointer. Terdapat pelbagai daftar yang mungkin ingin kita tolak dan keluar dari timbunan ketika kita memanipulasi pemboleh ubah dan apa-tidak dan ada juga daftar yang mungkin ingin kita simpan dan pulihkan kemudian. Sebagai contoh, SREG adalah daftar yang tidak disimpan di antara gangguan, jadi pelbagai bendera yang ditetapkan dan dibersihkan sebagai hasil operasi boleh diubah jika gangguan berlaku di tengah-tengah sesuatu. Oleh itu, adalah lebih baik jika anda mendorong SREG ke timbunan pada awal pengendali interrupt dan kemudian mengeluarkannya semula pada akhir pengendali interrupt. Saya telah memasukkannya ke dalam kod untuk menunjukkan bagaimana ia diinisialisasi dan untuk menjangka bagaimana kita akan memerlukannya kemudian tetapi kerana kita tidak peduli apa yang berlaku pada SREG semasa gangguan dalam kod kita, saya tidak menggunakan timbunan untuk ini. Juga perhatikan bahawa saya telah menggunakan operasi shift untuk menetapkan pelbagai bit dalam daftar ketika memulakan. Contohnya dalam baris:

ldi temp, (1 <> sts EICRA, temp

Perintah "<<" pada baris pertama kod di atas adalah operasi shift. Pada dasarnya ia mengambil nombor perduaan 1, iaitu 0b00000001 dan mengalihkannya ke kiri dengan jumlah nombor ISC01. Ini adalah kedudukan bit bernama ISC01 dalam daftar EICRA. Oleh kerana ISC01 adalah bit 1, nombor 1 dialihkan ke kedudukan kiri 1 menjadi 0b00000010. Begitu juga yang kedua, ISC00, adalah bit 0 dari EICRA dan pergeseran nombor 1 adalah kedudukan sifar ke kiri. Sekiranya melihat, lihat fail m328Pdef.inc yang anda muat turun dalam tutorial pertama dan sejak itu anda menggunakan evrr, anda akan melihat bahawa itu hanyalah senarai panjang penyataan ".equ". Anda akan dapati bahawa ISC01 sama dengan 1. Penyusun menggantikan setiap contohnya dengan 1 sebelum mula mengumpulkan apa-apa. Mereka hanyalah nama untuk bit register untuk membantu kita manusia membaca dan menulis kod. Sekarang, garis menegak antara operasi dua shift di atas adalah operasi "atau" yang logik. Inilah persamaannya:

0b00000010 | 0b00000001 = 0b00000011

dan inilah yang kita muatkan (menggunakan "ldi") ke dalam temp. Sebab orang menggunakan kaedah ini untuk memasukkan nilai ke dalam daftar adalah kerana ia membolehkan seseorang menggunakan nama bit dan bukan hanya nombor dan ini menjadikan kodnya lebih mudah dibaca. Terdapat juga dua teknik lain yang telah kami gunakan. Kami menggunakan arahan "ori" dan "andi". Ini membolehkan kita SET dan HAPUS bit masing-masing tanpa mengubah bit lain dalam daftar. Contohnya, semasa saya menggunakan

ori temp, (1

temp "atau" ini dengan 0b00000001 yang meletakkan 1 di bit nol dan meninggalkan semua yang lain tidak berubah. Juga semasa kami menulis

andi temp, 0b11111110

ini mengubah sedikit suhu sifar menjadi 0 dan meninggalkan semua selebihnya tidak berubah.

Latihan 4: Anda harus membaca kod dan memastikan anda memahami setiap baris. Anda mungkin merasa senang untuk mencari kaedah yang lebih baik untuk melakukan sesuatu dan menulis program yang lebih baik. Terdapat seratus cara untuk membuat kod perkara dan saya yakin anda dapat mencari cara yang jauh lebih baik daripada kaedah saya. Anda mungkin juga menemui kesilapan dan peninggalan (suruhan melarang!). Dalam kes itu, saya pasti ingin mendengarnya supaya mereka dapat diperbaiki.

Baiklah, sekarang mari kita lihat sama ada kita dapat membuang butang berlebihan itu …

Langkah 10: Kod untuk Versi 2

Cara paling mudah untuk menghilangkan butang adalah dengan melepaskannya sama sekali, melupakan input ke PB2, dan hanya menukar ADC ke "Free Running Mode".

Dengan kata lain cukup ubah daftar ADCSRB supaya ADTS2, ADTS1, dan ADTS0 semuanya sifar.

Kemudian tetapkan bit ADSC di ADCSRA ke 1 yang akan memulakan penukaran pertama.

Sekarang muat naik ke mikrokontroler anda dan anda akan dapati bahawa nombor yang betul muncul di paparan semasa anda menekan butang dan hanya semasa anda menekan butang. Ini kerana ADC secara berterusan mengambil sampel port ADC0 dan menunjukkan nilainya. Apabila anda melepaskan jari dari butang, "butang melantun" akan menyebabkan beberapa nilai rawak berlaku dengan cepat dan kemudian ia akan kembali ke input 0V. Dalam kod kami, 0V ini muncul sebagai 0b11011011 (kerana penekanan tombol "0" sudah menggunakan nilai paparan 0b00000000)

Ini bukan jalan penyelesaian yang kita mahukan kerana dua sebab. Mula-mula kita tidak mahu menahan butang. Kami ingin menekannya sekali dan memaparkan nombornya (atau digunakan dalam beberapa kod baru dalam tutorial kemudian). Kedua, kami tidak mahu terus mencuba ADC0. Kami mahu ia mengambil satu bacaan, menukarnya, dan kemudian tidur sehingga tekan kekunci baru mencetuskan penukaran baru. Mod larian percuma adalah yang terbaik jika satu-satunya perkara yang anda mahukan pengawal mikro adalah terus membaca beberapa input analog - seperti jika anda ingin memaparkan suhu masa nyata atau sesuatu.

Oleh itu, mari cari jalan penyelesaian lain …

Langkah 11: Bagaimana Kita Menghilangkan Butang? Versi 3

Bagaimana Kita Menghilangkan Butang? Versi 3
Bagaimana Kita Menghilangkan Butang? Versi 3

Terdapat banyak cara untuk kita teruskan. Mula-mula kita dapat menambah perkakasan untuk menghilangkan butang. Sebagai contoh, kita mungkin mencuba meletakkan transistor di litar pada garis output dari kekunci sehingga ia akan mengambil arus kecil dari output dan menghantar denyut 5V ke pin interupsi PD2.

Walau bagaimanapun, itu mungkin akan terlalu bising dan paling tidak ia tidak akan memberi masa yang cukup untuk bacaan tekan kekunci yang tepat kerana output voltan papan kekunci tidak mempunyai masa untuk stabil sebelum bacaan ADC ditangkap.

Oleh itu, kami lebih suka mencari penyelesaian perisian. Apa yang ingin kami lakukan ialah menambahkan gangguan pada pin PD2 dan menulis pengendali gangguan untuknya yang memanggil satu bacaan pin pad kekunci. Dengan kata lain, kita menyingkirkan gangguan automotif dari ADC, dan menambahkan gangguan luaran yang memanggil ADC di dalamnya. Dengan cara itu isyarat untuk membaca ADC muncul setelah isyarat PD2 telah berlaku dan ini mungkin memberi cukup masa untuk menstabilkan voltan yang tepat sebelum pin PC0 dibaca dan ditukar. Kami masih mempunyai gangguan penyelesaian ADC yang mengeluarkan hasilnya ke paparan penganalisis pada akhir.

Masuk akal? Baiklah mari kita lakukan …

Lihat kod baru yang dilampirkan.

Anda melihat perubahan berikut:

  1. Kami menambah rjmp di alamat.org 0x0002 untuk menangani gangguan luaran INT0
  2. Kami menukar daftar EIMSK untuk menunjukkan bahawa kami ingin mengganggu pin INT0
  3. Kami menukar pin ADATE dalam daftar ADCSRA untuk melumpuhkan autotriggering
  4. Kami menyingkirkan tetapan ADCSRB kerana tidak relevan ketika ADATE dimatikan
  5. Kita tidak perlu menetapkan semula bendera pemicu luaran kerana rutin gangguan INT0 melakukan ini secara automatik apabila selesai - sebelumnya kita tidak mempunyai rutin gangguan, kita hanya memicu ADC dari isyarat pada pin itu, jadi kita harus jelas bendera itu dengan tangan.

Sekarang di pengendali interrupt kita hanya memanggil satu penukaran dari ADC.

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

Langkah 12: Kod dan Video untuk Versi Bekerja

Seperti yang kita lihat pada versi terakhir, interrupt butang tidak berfungsi dengan baik kerana interrupt dipicu pada tepi yang meningkat untuk menyematkan PD2 dan kemudian pengendali interrupt memanggil penukaran ADC. Walau bagaimanapun, ADC kemudian mendapat bacaan voltan sebelum ia stabil dan ia menjadi tidak masuk akal.

Apa yang kita perlukan adalah memperkenalkan kelewatan antara gangguan pada PD2 dan bacaan ADC di PC0. Kami akan melakukan ini dengan menambahkan pemasa / penghitung, gangguan limpahan kaunter, dan rutin penundaan. Nasib baik kita sudah mengetahui cara melakukannya dari Tutorial 3! Oleh itu, kita hanya akan menyalin dan menampal kod yang berkaitan dari sana.

Saya telah memberikan kod yang dihasilkan dan video yang menunjukkannya sedang beroperasi.

Anda akan melihat bahawa bacaannya tidak tepat seperti yang diharapkan. Ini mungkin disebabkan oleh sejumlah sumber:

  1. kita mengetuk dari output voltan papan kekunci untuk mencetuskan PD2 yang mempengaruhi bacaan di PC0.
  2. kita tidak benar-benar tahu berapa lama untuk menunda selepas pencetus untuk mendapatkan bacaan terbaik.
  3. memerlukan beberapa kitaran untuk penukaran ADC selesai yang bermaksud bahawa kita tidak dapat menyalakan pad keypad dengan pantas.
  4. mungkin ada bunyi di papan kekunci itu sendiri.
  5. dan lain-lain…

Oleh itu, walaupun kami berjaya menjadikan papan kekunci berfungsi, dan sekarang kami dapat menggunakannya dalam aplikasi dengan menggunakan nilai tekan kekunci dengan cara lain dan bukannya hanya mengeluarkannya ke paparan penganalisis, ia tidak begitu tepat dan sangat menjengkelkan. Itulah sebabnya saya berpendapat bahawa kaedah terbaik untuk memasang papan kekunci adalah dengan memasukkan setiap output dari papan kekunci ke port yang berbeza dan memutuskan kekunci mana yang ditekan oleh port mana yang melihat voltan. Itu mudah, sangat cepat, dan sangat tepat.

Sebenarnya, hanya ada dua sebab mengapa seseorang ingin menggunakan papan kekunci seperti yang kita lakukan di sini:

  1. Ia hanya menggunakan 2 pin pada mikrokontroler dan bukannya 8.
  2. Ini adalah projek yang bagus untuk menunjukkan aspek ADC yang berbeza pada mikrokontroler yang berbeza dengan perkara standard yang dapat anda temukan di sana seperti bacaan suhu, potensiometer putar, dan lain-lain. Saya mahukan contoh pembacaan tunggal yang dicetuskan dan pemicu automatik pin luaran dan bukannya hanya menjalankan CPU-gobbling mode percuma.

Bagaimanapun, inilah beberapa latihan terakhir untuk anda:

Latihan 6: Tulis semula penangan interrupt lengkap penukaran ADC untuk menggunakan Jadual Carian. I. E. Sehingga menguji nilai analog dengan item pertama dalam jadual dan jika lebih besar ia akan kembali dari gangguan, jika tidak maka ia menambah Z ke item seterusnya dalam jadual dan kembali ke ujian kembali. Ini akan memendekkan kod dan membersihkan rutin gangguan dan menjadikannya lebih bagus. (Saya akan memberikan satu penyelesaian yang mungkin sebagai langkah seterusnya) Latihan 7: Sambungkan pad kekunci anda hingga 8 pin pada mikrokontroler dan tulis pemacu mudah untuknya dan rasakan seberapa baiknya. Bolehkah anda memikirkan beberapa kaedah untuk menjadikan kaedah kami berfungsi dengan lebih baik?

Itu sahaja untuk tutorial ini. Saya telah melampirkan versi terakhir dengan petunjuk. Semasa kita menghampiri tujuan akhir kita, kita akan menggunakan papan kekunci sekali lagi di Tutorial 9 untuk menunjukkan cara mengendalikan tujuh paparan segmen dengannya (dan membina sesuatu yang menarik yang menggunakan kekunci tambahan pada papan kekunci telefon) dan kemudian kita akan beralih ke mengendalikan sesuatu dengan menekan butang (kerana kaedah itu lebih sesuai dengan produk akhir yang sedang kita bangun dengan tutorial ini) dan kita hanya akan menyimpan papan kekunci.

Jumpa awak lain kali!

Disyorkan: