Tutorial PIC- Dari Daftar hingga Gangguan

Cuba Instrumen Kami Untuk Menghapuskan Masalah





Sebelum mengetahui terperinci mengenai pengaturcaraan PIC, penting sekali untuk mempelajari beberapa kaedah pengaturcaraan yang baik.

Memahami Daftar

Sebagai permulaan andaikan anda menaip (titik koma) pada mana-mana program, semua yang berlaku selepas titik koma ini akan diabaikan oleh penyusun, sehingga sudah tentu kereta akan kembali ke kedudukannya.



Ciri di atas membolehkan kita menambahkan komen atau komen sehingga tidak menjadi bahagian dalam program ini tetapi memudahkan kita untuk mengenal pasti program dengan bantuan komen di sebelahnya. Meletakkan komen adalah amalan yang disarankan semasa memprogram IC mana pun.

Perkara penting seterusnya adalah memberikan nama kepada pelbagai pemalar (anda akan mempelajarinya kemudian dengan terperinci). Ini menjadikannya lebih mudah untuk memahami apa yang ditulis, atau mengenai nilai-nilai yang terlibat, daripada menjadi keliru dengan angka yang disertakan.



Perkara di atas mesti dilakukan dalam bentuk nama sebenar untuk pengecaman segera, misalnya COUNT, penting untuk diperhatikan bahawa di sini semua huruf besar digunakan untuk membuatnya berbeza dan juga menunjukkan bahawa ia adalah nilai tetap.


Seperti yang dapat kita lihat, perkara di atas dilakukan dalam bentuk kotak yang terbuat dari titik koma, ini menjadikannya kelihatan lebih bersih. Selain itu, cubalah mendokumentasikan program di atas kertas juga, latihan ini akan membantu memahami sesuatu dengan cara yang bijak.

2. Para Pendaftar.

Daftar dalam PIC adalah kawasan yang menerima maklumat bertulis dan juga membolehkan membaca daripadanya. Anda boleh membandingkannya dengan sehelai kertas di mana anda dapat memvisualisasikan kandungan dan menambahkannya dengan menulis di atasnya.

Gambar di bawah menggambarkan peta fail daftar khas yang tersemat dalam PIC16F84. Formatnya bukan sesuatu yang sebenarnya diatur dalam PIC, itu hanya untuk menunjukkan bagaimana bit dapat disusun di dalam cip dan memahami beberapa perintah yang terlibat.

Anda dapat melihat bahawa pada dasarnya dibahagikan kepada Bank 0 dan Bank 1. Bank 1 bertanggungjawab untuk mengendalikan kerja sebenar PIC, contohnya ia menelefon PIC yang bit di Port A ditugaskan sebagai input dan yang sebagai output.

Bank 2 hanya untuk memanipulasi maklumat.

Mari kita fahami ini melalui contoh berikut:

Anggaplah kita mahu memberikan satu bit pada tahap tinggi PortA. Untuk ini, pertama-tama kita perlu pergi ke Bank 1 untuk menetapkan bit atau pin yang ditentukan di Port A dalam bentuk output. Selepas ini kami kembali ke Bank 0 dan menyampaikan logik 1 (bit 1) ke pin tertentu.

Daftar yang paling biasa yang ingin kami gunakan di Bank 1 ialah STATUS, TRISA dan TRISB.

STATUS membantu kita untuk kembali ke Bank 0, TRISA membolehkan kita memilih pin di Port A yang mana output dan mana yang mungkin input, sementara TRISB memudahkan untuk memilih antara pin output dan input di Port B. Daftar SELECT di BANK 0 membenarkan pengguna untuk beralih ke Bank 1.

Mari kita ringkaskan keseluruhan konsep dengan penerangan berikut:

STATUS:

Untuk beralih dari Bank 0 ke Bank 1, kami memerintahkan daftar STATUS. Ini dilaksanakan dengan menetapkan bit # 5 dari daftar STATUS ke 1. Untuk kembali ke Bank 0, kami memberikan bit 5 dari daftar STATUS ke 0. Daftar STATUS diletakkan di alamat 03h, di sini h menandakan nombor tersebut mungkin dalam Heksadesimal.

TRISA dan TRISB:

Ini terletak di alamat 85h dan 86h. Untuk memprogram pin sebagai output atau input, kami hanya memberikan angka nol atau satu ke bit tertentu dalam daftar. Sekarang ini boleh dilakukan dengan dua cara, melalui binari, atau Hex. Sekiranya seseorang tidak dapat menukar parameter, dia boleh menggunakan kalkulator saintifik untuk menerapkan nilai.

Sekarang kita mempunyai 5 pin di Port A, yang sepadan dengan 5 pin. Sekiranya kita bermaksud memperbaiki salah satu pin sebagai input, kita memberikan “1” pada bit tertentu.

Sekiranya kita ingin menetapkan salah satu pin sebagai output, kita akan menetapkan pin khusus ke '0'. Bit ditolong turun tepat sesuai dengan bit, atau bit 0 yang lebih tepat adalah RA0, bit 1 akan menjadi RA1, bit 2 = RA2 dan sebagainya. Mari kita fahami dengan cara ini:

Katakan anda ingin menetapkan RA0, RA3 dan RA4 sebagai output, sementara RA1 / RA2 sebagai i / ps, anda akan melakukan ini dengan menghantar 00110 (06h). Periksa bit 0 ke arah kanan seperti yang ditunjukkan di sini:

Port A Pin RA4 RA3 RA2 RA1 RA0

Nombor Bit 4 3 2 1 0

Perduaan 0 0 1 1 0

Perkara yang sama berlaku untuk TRISB.

PORTA dan PORTB

Untuk mendapatkan salah satu pin output yang tinggi, kami hanya menawarkan '1' ke bit masing-masing dalam daftar PORTA atau PORTB kami. Prosedur yang serupa juga boleh diikuti untuk daftar TRISA dan TRISB. Sebelum kita mempercepat pengekodan contoh pertama, mari kita fahami lebih banyak daftar, iaitu: w dan f.

W dan F

Daftar W adalah daftar biasa yang membolehkan anda memberikan nilai pilihan anda. Sebaik sahaja anda memberikan magnitud ke W, anda boleh meneruskan dengan menambahkan ini ke nilai lain atau hanya memindahkannya. Dengan nilai lain yang diberikan, butirannya akan diganti pada W.

Pendaftaran F meneruskan perkara bertulisnya ke daftar. Kami memerlukan daftar F ini untuk memberikan nilai di atas daftar, mungkin melebihi STATUS atau daftar TRISA, kerana ini tidak akan membolehkan kita meletakkan nilai secara langsung di atasnya. Program Contoh

Mari kita kaji contoh kod berikut yang akan menunjukkan kepada kita bagaimana arahan di atas dilaksanakan dan juga akan menyaksikan beberapa petunjuk dalam kursus ini.

Mari kita mulakan dengan memperbaiki Port A seperti yang dibincangkan di atas.

Untuk ini kita perlu beralih dari Bank 0 ke Bank1, ini dilakukan dengan menyiapkan daftar STATUS yang terletak di alamat 03h, bit 5 hingga 1.

BSF 03h, 5

BSF Bermakna Set Bit F. Kami menggunakan dua nombor selepas arahan ini - 03h, yang merupakan alamat daftar STATUS, dan nombor 5 yang sesuai dengan nombor bit.

Jadi, apa yang kita katakan adalah 'Tetapkan bit 5 dalam alamat 03h hingga 1'.

Kami kini berada di Bank 1.

MOVLW 00110b

Kami memasukkan nilai binari 00110 (huruf b bermaksud angka itu dalam binari) ke dalam daftar tujuan umum W. Saya tentu saja saya dapat melakukan ini dalam hex, dalam hal ini arahan kami adalah:

MOVLW 06hb

Sama ada berfungsi. MOVLW bermaksud ‘Move Literal Value Into W’, yang dalam bahasa Inggeris bermaksud memasukkan nilai yang mengikuti terus ke daftar W.

Sekarang kita perlu memasukkan nilai ini ke daftar TRISA kami untuk menyiapkan port:

MOVWF 85jam

Arahan ini menunjukkan 'Pindahkan Isi W Ke Alamat Alamat Yang Ikut', dalam hal ini alamat merujuk kepada TRISA.

Daftar TRISA kami pada tahap ini menunjukkan angka 00110, atau ditunjukkan secara grafik:

Port A Pin RA4 RA3 RA2 RA1 RA0

Perduaan 0 0 1 1 0

Input / Output O O I I O

Jadi sekarang kita mempunyai pin Port A, kita mesti kembali ke Bank 0 untuk menyesuaikan salah satu maklumat.

BCF 03h, 5

Arahan ini mencapai kebalikan dari BSF. Ini menyiratkan 'Bit Clear F'. Sepasang nombor yang sesuai adalah alamat daftar, di sini daftar STATUS, dan juga angka bit, dalam contoh ini bit lima. Apa yang sebenarnya telah kita selesaikan pada masa ini adalah, yang dinyatakan pada bit lima

STATUS mendaftar ke 0

Kami pada masa ini telah kembali di Bank 0.
Berikut adalah kod semua dalam satu blok:

BSF 03h, 5 Pergi ke Bank 1
MOVLW 06h Masukkan 00110 ke W
MOVWF 85h Pindahkan 00110 ke TRISA
BCF 03h, 5 Kembali ke Bank 0

Dalam instruksional terakhir, kami mengesahkan cara untuk membuat pin port IO pada PIC untuk menjadi input atau output.

Melalui kursus ini, Izinkan saya membantu anda menghantar data ke port.

Menghantar Data ke Pelabuhan

Dalam tutorial seterusnya, kita akan menyelesaikan dengan menyalakan dan mematikan LED yang terdiri daripada perincian program yang lengkap dan gambarajah litar langsung supaya anda dapat melihat PIC melakukan dengan tepat seperti yang kita jangkakan.

Jangan cuba mengumpulkan dan memprogram PIC anda dengan hasil di bawah, kerana ini hanya ilustrasi. Pada mulanya, kami akan menjadikan Port A bit 2 sebagai output:

Ini dapat dikenali dari instruksional sebelumnya. Satu-satunya perbezaan adalah Kami telah menetapkan setiap bit pin pada A sebagai output, dengan memberikan 0h ke daftar tri-keadaan. Oleh itu, apa yang mesti dia lakukan ialah menghidupkan LED.

Kami mencapainya dengan menjadualkan salah satu pin (yang disambungkan dengan LED) tinggi. Untuk meletakkannya secara berbeza, kami menggunakan tanda '1' pada pin. Ini persis seperti yang dilakukan (perhatikan komen untuk penjelasan untuk setiap baris):

Oleh itu, apa yang telah kita capai sekarang ialah hidupkan LED kemudian padamkan sekali sahaja. Apa yang kita mahukan adalah agar LED terus menyala secara berterusan.

Kami mencapainya dengan mendapatkan program untuk kembali ke permulaan. Kami mencapai ini dengan mula-mula menetapkan tanda pada awal program kami, selepas itu memberitahu program untuk terus kembali ke sana. Kami menetapkan teg dengan jelas.

Kami memasukkan istilah, katakan MULAI, ketik kod seterusnya:

Seperti yang ditunjukkan, pada mulanya kami menyebut ungkapan 'Mula' di awal program.

Seterusnya, pada akhir program kami dengan jelas menyebutkan 'goto Start'. Arahan ‘goto’ melakukan apa yang dinyatakan.

Program ini akan menyalakan dan mematikan LED secara konsisten setiap kali kita menghidupkan litar, cenderung untuk mematikan apabila kita mengeluarkan elektrik. Mungkin kita harus memeriksa program kita sekali lagi:

Tentunya kami telah menghilangkan komen, namun kami masih dapat mematuhi petunjuk dan nombornya.

Ini mungkin sedikit membingungkan sekiranya anda mencuba menyelesaikan masalah program dan semasa menulis kod anda telah menghafal semua alamat.

Walaupun komen mungkin ditempatkan tetap boleh menjadi sedikit kekacauan. Ini memerlukan penamaan nombor dan mungkin dapat dicapai dengan arahan tambahan: arahan 'equ' The 'equ' menunjukkan bahawa beberapa barang mungkin sama dengan barang lain.

Ini mungkin bukan arahan untuk PIC, melainkan untuk assembler. Arahan ini memudahkan pemberian nama ke lokasi alamat daftar, atau pemalar untuk istilah pengaturcaraan.

Kami akan menetapkan beberapa pemalar untuk program kami dan juga menyaksikan betapa mudahnya membaca program ini.

Sejak sekarang kita telah menetapkan nilai tetap, kita boleh meneruskannya dengan memasukkannya ke dalam program kita. Nilai pemalar perlu ditentukan sebelum menggunakannya.

oleh itu pastikan untuk selalu meletakkannya pada awal program. Kami akan menulis semula program tersebut kecuali komen sekali lagi, untuk membandingkan pelabelan sebelumnya dengan yang terbaru.

Mungkin anda dapat memperhatikan bahawa pemalar memungkinkan pemahaman yang lebih mudah mengenai program ini, namun kami masih tanpa komen, tidak perlu risau, kerana kami belum selesai.

Mungkin terdapat sedikit kelemahan program LED berkelip kami.
Setiap arahan memerlukan 1 urutan jam untuk diselesaikan. Sekiranya kita menggunakan kristal 4MHz, maka setiap arahan memerlukan 1 / 4MHz, atau 1uS untuk selesai.

Oleh kerana kami hanya menggunakan lima arahan, LED akan menyala kemudian mati dalam 5uS. Ini mungkin terlalu cepat bagi orang untuk memerhatikan, selain itu, nampaknya LED menyala sepenuhnya.

Apa yang harus kita capai adalah menghasilkan penghambatan antara menghidupkan LED dan mematikan LED. Teori penghambatan adalah bahawa kita mengira dari kuantiti yang lebih awal, jadi apabila mencapai sifar, kita berhenti mengira.

Nilai sifar menandakan kesimpulan penundaan, dan kami terus menjalankan proses kami sepanjang program ini. Oleh itu, yang pertama mesti kita lakukan ialah menentukan pemalar untuk digunakan sebagai kaunter kita.

Mari kita sebut COUNT berterusan ini. Selepas itu, kita mesti menentukan betapa pentingnya bilangan untuk mula mengira. Tentunya, angka terbesar yang dapat kita sertakan adalah 255, atau FFh dalam hex., Seperti yang saya bicarakan dalam tutorial sebelumnya, arahan equ memberikan pernyataan untuk situasi daftar.

Ini menunjukkan bahawa tidak kira berapa kuantiti yang kita peruntukkan COUNT, ia akan sesuai dengan item daftar. Sekiranya kita cuba menetapkan nilai FFh, kita akan mendapat kesilapan setelah kita menyusun program.

Sebabnya adalah lokasi FFh, oleh itu kami tidak dapat mengaksesnya. Oleh itu, bagaimana kita mesti menetapkan nombor asli? Sudah tentu, ia memerlukan sedikit renungan lateral.

Sekiranya mungkin kita menetapkan COUNT kita ke alamat 08h, misalnya, ini akan menunjukkan tujuan pendaftaran objektif asas. Secara lalai, kawasan yang tidak disentuh ditetapkan ke FFh. Oleh itu, jika COUNT mengarah ke 08h, anda akan menemui nilai FFh semasa kami pertama kali mengaktifkan. Walaupun begitu, saya anda, bagaimana kita dapat membetulkan COUNT ke nombor lain?, Yang kita gunakan adalah ‘memindahkan’ penilaian ke destinasi ini terlebih dahulu.

Sebagai gambaran, andaikan kita ingin COUNT memiliki nilai 85 jam, kita tidak dapat menyebut COUNT sama dengan 85jam kerana itu adalah kedudukan keluar dari Tri-State register untuk Port A. Tepatnya yang kita capai adalah yang berikut: movlw 85hPertama nilai 85h di W register movwf 08h

Sekarang pindahkan ke daftar 08h kami. Selanjutnya, sekiranya kita menyatakan COUNT sama dengan 08 jam, COUNT akan sesuai dengan nilai 85 jam. Halus, bukan! Oleh itu, pada mulanya kita menentukan pemalar kita: COUNT sama dengan 08j. Mengikuti kita mesti mengurangkan COUNT ini satu hingga ia menjadi sifar.

Kebetulan ada satu arahan yang dirancang untuk mencapai ini untuk kita, dengan menggunakan 'goto' dan tag.

Arahan yang akan kita laksanakan adalah: DECFSZ COUNT, 1 Arahan ini menyatakan ‘Decrement the register (inilah COUNT) dengan nombor yang menjejaki koma. Sekiranya kita mencapai sifar, naiklah dua tempat ke depan. 'Mari kita beraksi terlebih dahulu, sebelum kita memasukkannya ke arah kursus kita.

Apa yang telah kami lakukan pada mulanya adalah menetapkan COUNT tetap kami hingga 255. Segmen berikutnya meletakkan tag, yang disebut LABEL dekat dengan arahan decfsz kami.

COUNT decfsz, 1 mengurangkan nilai COUNT satu, dan mengekalkan hasil akhirnya terus menjadi COUNT. Lebih-lebih lagi ia mengesahkan untuk memeriksa sama ada COUNT memiliki nilai 0.

Sekiranya tidak, ia akan menyebabkan program beralih ke baris berikutnya. Sekarang kita mempunyai deklarasi ‘goto’ yang mengembalikan kita kepada arahan decfsz kita.

Sekiranya nilai COUNT berjalan sama, maka instruksi decfsz menghasilkan program kami untuk melonjak 2 tempat ke depan, dan dihantar ke tempat Kami telah menuntut 'Teruskan di sini'.

Oleh itu, kerana anda dapat melihatnya, kami telah menjadikan program ini untuk duduk di satu tempat untuk waktu yang telah ditentukan sebelum meneruskan. Ini boleh dinamakan gelung penundaan.

Memahami Gelung Kelewatan

Sekiranya kita memerlukan kelewatan yang lebih besar, kita dapat mengejar satu gelung dengan yang berikutnya. Gelung tambahan, kelewatan dilanjutkan. Mari kita sekurang-kurangnya dua, dengan asumsi kita ingin melihat lampu kilat LED. Kami akan meletakkan gelung penangguhan ini ke dalam program kami, dan menyelesaikannya dengan menjadikannya program yang tulen dengan memperkenalkan komen:

Adalah mungkin untuk menyusun program ini selepas program mana PIC. Jelas, pastikan anda mencuba litar untuk memeriksa sama ada ia benar-benar berfungsi. Berikut adalah gambarajah litar yang harus anda buat sebaik sahaja anda memprogram PIC.


Syabas, anda sebenarnya dapat menyusun program PIC pertama anda, serta membina litar untuk menyalakan dan mematikan LED. Sehingga sekarang, sekiranya anda mengikuti kursus ini, anda mungkin telah mempelajari keseluruhan tujuh pengajaran dari 35, tetapi tanpa keraguan sejauh ini anda mungkin mengendalikan port I / O!

Adakah anda akan cuba mengubah gelung penangguhan untuk menjadikan lampu kilat LED lebih cepat - apa yang muncul dengan nilai minimum COUNT untuk melihat lampu kilat LED? Atau mungkin, anda ingin memasukkan gelung kelewatan ke-3 atau tambahan selepas yang pertama untuk menstabilkan LED ke bawah. pemalar unik untuk setiap gelung penundaan.

Anda mungkin berpotensi bermain-main dengan gelung penangguhan anda untuk membuat lampu kilat LED pada kelajuan tertentu, misalnya sesaat. Dalam instruksional berikutnya, mari kita lihat bagaimana kita dapat memanfaatkan sesuatu yang dikenal sebagai subrutin untuk menjaga program yang ringkas dan dasar Subrutin adalah bagian integral dari kod, atau program, yang dapat disebut sebagai dan kapan anda memerlukannya. Subrutin digunakan dalam keadaan di mana anda sering melakukan fungsi yang sama.

Apa itu Subrutin

Manfaat menggunakan subrutin adalah mungkin lebih mudah untuk mengubah nilainya sekali di dalam subrutin daripada, katakanlah, sepuluh kali sepanjang program anda, dan juga memberikan sumbangan besar untuk menurunkan tahap memori yang digunakan oleh program anda di dalam PIC. Kami akan memeriksa subrutin:

Pada mulanya, kita perlu memberikan sebutan subrutin kami, dan dalam keadaan ini Kami telah memilih ROUTINE. Kami selepas itu menaip kod yang ingin kami laksanakan seperti biasa. Itulah sebabnya, Kami telah memilih kelewatan dalam program flashing flash kami. Terakhir, kami menyimpulkan subrutin dengan memasukkan arahan RETURN.

Untuk memulakan subrutin dari mana sahaja dalam program kami, kami dengan cepat menaip arahan CALL dan kemudian sebutan subrutin.

Kami akan mempertimbangkannya dengan lebih mendalam. Sebaik sahaja kami tiba di bahagian program kami yang CALL xxx, di mana xxx adalah nama subrutin kami, program ini akan melangkah ke mana sahaja subrutinine xxx dipasang. Arahan di dalam subrutin dijalankan.

Setiap kali arahan RETURN dicapai, program melompat kembali ke program utama kami ke arahan selepas arahan CALL xxx kami.

Adalah mungkin untuk memanggil subrutin yang serupa beberapa kali seperti yang anda mahukan, yang menjelaskan mengapa menggunakan subrutin mengurangkan tempoh umum program kami.

Walaupun begitu, terdapat beberapa faktor yang harus anda ketahui. Pada mulanya, seperti program utama kami, setiap pemalar tertentu perlu diketahui sebelum anda dapat menggunakannya.

Ini mungkin diakui dalam subrutin itu sendiri, atau secara langsung pada awal program utama. Saya mencadangkan anda bahawa anda mengetahui segalanya pada awal program utama anda, sejak itu anda menyedari bahawa semuanya berada dalam kedudukan yang sama. Seterusnya, seseorang harus memastikan bahawa program utama melewati subrutin.

Yang saya maksudkan dengan ini adalah sekiranya anda meletakkan subrutin secara langsung pada akhir program utama anda, kecuali jika anda menggunakan deklarasi 'Goto' untuk melompat dari mana subrutin itu, program tersebut akan diteruskan dan melaksanakan subrutin tanpa mengira anda memerlukannya atau sebaliknya.

PIC tidak akan membezakan antara subrutin dan program utama. Kami akan memeriksa program flashing flash kami, namun kali ini kami akan menggunakan subrutin untuk loop delay. Sebaik-baiknya, anda akan mengetahui betapa kurang rumitnya program ini, dan anda juga dapat mengetahui bagaimana subrutin itu berlaku secara praktikal.

Akhirnya, anda dapat memperhatikan bahawa dengan menggunakan subrutin untuk gelung penundaan kami, kami mungkin telah menurunkan dimensi program.

Setiap kali kita menginginkan kelewatan, mungkin ketika LED menyala atau mati, kita pada dasarnya memanggil penundaan penundaan. Pada akhir subrutin, program ini kembali ke baris yang mengikuti arahan ‘Call’ kami. Dalam ilustrasi di atas, kami menyalakan LED.

Kami selepas itu menghubungi subrutin. Program ini kemudian kembali agar kita dapat mematikan LED. Kami memanggil subrutin sekali lagi, sekiranya subrutin dilengkapkan, program akan kembali dan arahan seterusnya yang dikenalinya adalah ‘goto Start’. Bagi sesiapa yang mungkin tertarik, program pertama kami adalah panjang 120 byte.

Melalui penggunaan subrutin, kami dapat menurunkan ukuran program kami menjadi 103 bait. Kedengarannya tidak begitu hebat, namun mengingat fakta bahawa kita hanya memiliki 1024 byte keseluruhan di dalam PIC, setiap keuntungan kecil.

Dalam instruksional seterusnya, mari kita lihat bacaan dari port.

Sejauh ini, kami telah membuat komposisi ke Port A agar kami dapat menghidupkan dan mematikan LED. Pada ketika ini, kita akan melihat bagaimana kita akan membaca pin I / O di port.

Membaca Port Input / Output

Ini tepat untuk memastikan bahawa kita dapat menghubungkan rangkaian luaran, dan mempengaruhi output tertentu yang ditawarkannya.

Sekiranya anda menghafal dari kursus sebelumnya, jika anda ingin membuat pelabuhan I / O, kami perlu melompat dari Bank 0 ke Bank 1. Kami akan melakukannya pada mulanya:

Pada ketika ini kami telah menetapkan bit 0 dari Port A untuk dimasukkan. kita sekarang mesti memeriksa apakah pin itu tinggi atau rendah. Untuk mencapai ini, seseorang boleh menggunakan salah satu daripada dua arahan:

BTFSC dan BTFSS.

Arahan BTFSC menandakan ‘Lakukan sedikit ujian pada daftar dan juga bit yang kami tetapkan.

Sekiranya itu adalah 0, dalam hal ini kita menghilangkan arahan berikutnya '. BTFSS menyiratkan ‘Lakukan sedikit ujian dalam daftar dan bit yang kami buat. Sekiranya ia diatur ke 1, maka kita memotong petunjuk berikutnya.

Yang mana yang kita gunakan, ditentukan dengan tepat bagaimana kita ingin program kita merespons ketika kita mempelajari inputnya. Sebagai gambaran, sekiranya kita hanya menunggu input menjadi 1, maka kita mungkin dapat menggunakan instruksi BTFSS dengan cara berikut:

Kod di sini:

BTFSS PortA, 0Mulakan Teruskan di sini:
:

Program hanya akan beralih ke 'Teruskan di sini' dengan syarat bahawa bit 0 di PortA dijadualkan ke 1.

Kami akan menulis program yang boleh meminta LED pada satu kadar, namun jika suis terkurung, LED akan menyala LED dua kali lebih perlahan.

Anda mungkin boleh menjalankan program ini sendiri, namun kita telah memasukkan senarai tersebut.

Anda boleh mencuba dan mengarang keseluruhan program, untuk memeriksa sama ada sekiranya anda memahami prinsipnya. Kami akan menggunakan litar setara seperti sebelumnya, dengan memasukkan suis terpasang RA0 PIC dan rel positif bekalan kami.

Apa yang telah kami capai di sini adalah menghidupkan LED. Saya kemudiannya menentukan sama ada suis ditutup.

Sekiranya terkurung, seterusnya saya menyambung ke subrutin penundaan kami. Ini memberi kita kelewatan yang setara seperti sebelumnya, namun pada masa ini kita menghubunginya dua kali.

Perkara yang sama berlaku apabila LED mati. Sekiranya suis tidak ditutup, maka kita telah mencatat tempoh hidup dan mati.

Adakah anda mengikuti pelajaran ini dari awal, anda mungkin ingin memahami bahawa anda telah menemui sepuluh daripada 35 arahan untuk PIC 16F84! Dan setiap perkara ini mesti dipelajari hanya dengan menghidupkan dan mematikan LED.

Sehingga kini, kami telah menyalakan dan mematikan LED PIC.

Selepas itu kami dapat menggunakan PIC kami dengan memasukkan suis, oleh itu mengubah kelajuan kilat.

Menggunakan Ruang Memori dengan cekap

Satu-satunya masalah adalah, program ini cukup panjang dan ruang memori agak tidak cekap. Nampaknya ok semasa saya memasukkan perintah untuk pertama kalinya, namun harus ada cara yang lebih mudah untuk melaksanakannya. Secara positifnya, kita akan menganalisis bagaimana kita menghidupkan dan mematikan LED secara harfiah.

movlw 02hmovwf PORTAmovlw 00hmovlw PORTA

Mula-mula kami mengisi daftar w kami dengan 02h, setelah itu memindahkannya ke daftar PortA kami untuk menghidupkan LED. Untuk mematikannya, kami mengemas dengan jam 00 setelah itu mengalihkannya ke daftar PortA kami.

Di antara semua rutin ini, kami terpaksa menghubungi subrutin untuk memastikan bahawa kami dapat melihat LED berkedip.

Oleh itu, kami perlu memindahkan dua set maklumat beberapa kali (satu kali ke daftar kemudian ke PORTA) dan juga memanggil subrutin dua kali (sekali untuk kemudian sekali untuk tidak aktif). Oleh itu, bagaimana kita dapat mencapainya dengan kecekapan tambahan? Sangat ringkas.

Kami menggunakan arahan berbeza yang dikenali sebagai XORF. Arahan XORF berfungsi fungsi ATAU Eksklusif pada daftar yang kami tetapkan dengan maklumat yang kami berikan. Saya percaya bahawa saya harus menjelaskan apa yang ada di dunia eksklusif ATAU sebelum kita meneruskannya. Sekiranya kita mempunyai dua input, dan satu output, input hanya dapat 1 jika, dan selama, kedua input tersebut berbeza. Walaupun ia sama, maka hasilnya mungkin 0. Berikut adalah jadual kebenaran, untuk individu yang memilih untuk memeriksa ini:

A B F0 0 00 1 11 0 11 1 0

Kami pada masa ini akan memeriksa apa yang berlaku jika kita menjadikan B sama seperti output sebelumnya, dan hanya mengubah nilai A:

A B F
0 0 0
0 0 0
1 0 1
1 1 0
1 0 1

Sekiranya kita mengekalkan nilai A sama dengan 1, dan kita Eksklusif ATAU dengan output, output akan beralih. Sekiranya anda tidak dapat melihatnya dari jadual kebenaran, di bawah ini dapat dilihat menggunakan binari:

0 Output Semasa
EX-ATAU Dengan 1 1 Output Baru
EX-ATAU Dengan 1 0 Output Baru

Mungkin anda dapat mengetahui bahawa dengan mengeluarkan output eksklusif dengan 1, kita sekarang akan menukar output dari 0 hingga 1 hingga 0.
Oleh itu, untuk menghidupkan dan mematikan LED kami, kami hanya memerlukan beberapa ayat:

MOVLW 02h
PINTU XORWF, 1

Apa yang akan kita capai adalah menambah daftar w kita dengan 02h. Dalam kes ini, kami adalah Eksklusif ATAU nombor ini tanpa mengira apa yang ada di PortA kami. Sekiranya bit 1 adalah 1, ia akan berubah menjadi 0. Sekiranya bit 1 adalah 0, ia akan berubah menjadi 1. Mari kita periksa kod ini sekali atau dua kali, untuk memaparkan bagaimana ia berjalan binari:

PINTU
00010
xorwf 00000
xorwf 00010
xorwf 00000
xorwf 00010

Kami sebenarnya tidak perlu memuatkan nilai yang sama ke dalam daftar w kami setiap kali, oleh itu adalah mungkin untuk menyelesaikannya satu kali pada permulaan, dan hanya kembali ke perintah beralih kami. Selain itu, kami tidak seharusnya menetapkan nilai pada daftar PortA kami. Sebabnya? Tentunya, kerana jika dihidupkan adalah 1, kita dapat menukarnya dengan mudah. Saya, sebagai ganti 0 dihidupkan, kita sekarang juga menukarnya.

Oleh itu, anda ingin melihat kod kami yang baru dibentuk. Yang pertama mewakili kod LED kami yang berkedip, sementara yang kedua menunjukkan kod LED dengan penambahan suis:

Mari berharap anda dapat mengetahui bahawa hanya dengan menggunakan satu arahan yang mudah, kita sekarang telah mengurangkan skala program kita. Yang benar adalah, untuk menunjukkan seberapa banyak kita dapat mengurangkan program kita, Kami telah menunjukkan dua program, hanya apa yang disusun, dan dimensinya dalam jadual di bawah:

Dimensi Perubahan Program (Byte)
LED Berkelip Asli 120
Subrutin LED Berkelip Ditambah 103
Fungsi LED Berkedip XOR Digunakan 91
LED Dengan Suis Asli 132
LED Dengan Fungsi Switch XOR Digunakan 124.

Oleh itu, bukan hanya kita menemui beberapa petunjuk novel, kita juga telah mengurangkan ukuran skrip kita!

Di bawah ini, kami akan menganalisis bagaimana anda boleh menggoyangkan bit individu, menjalankan aritmetik tertentu dan jadual data.

Pengurus Logik

Dalam tutorial terakhir saya membentangkan operasi Eksklusif ATAU. Fungsi ExOR difahami sebagai pengendali logik.

Dalam tutorial ini saya akan memberi penerangan mengenai pengendali logik tambahan yang dipromosikan oleh PIC. Tidak ada jenis kes dalam program titik, namun Kami akan belajar kaedah mudah untuk menggunakan operator dengan menerapkan bidang kecil.

Fungsi AND pada dasarnya menganalisis dua bit dan memberikan 1 sama ada sama, dan 0 sekiranya mereka berbeza. Sebagai contoh, jika kita menyebut 1 DAN 1, hasilnya adalah 1, sementara sekiranya kita menyatakan 1 DAN 0 maka akibatnya adalah 0.

Tidak perlu dikatakan, kami dapat menilai kata-kata juga, dan semua fungsi DAN yang dicapai adalah mengkaji kedua-dua istilah itu sedikit demi sedikit. Contoh di bawah menunjukkan dua perkataan 8-bit menjadi ANDed bersama dengan produk:

11001011
DAN 10110011
Sama dengan 10000011

Saya harap anda setuju, hasilnya hanya akan berlaku 1 setiap kali 2 1s berganding bahu antara satu sama lain dalam sepasang kata. Kita dapat menggunakan fungsi AND untuk mengesahkan port, misalnya.

Sekiranya kita memeriksa beberapa pin I / O yang dihubungkan ke litar, dan kita harus mengawasi situasi tertentu di mana hanya beberapa pin yang tinggi, dalam hal ini kita dapat membaca banyak port, selepas itu DAN hasilnya dengan keadaan yang telah kami kaji, sama dengan contoh di atas.

PIC menyediakan dua bahan untuk AND.
Mereka adalah ANDLW dan ANDWF. ANDLW membenarkan kami menjalankan fungsi AND dengan perincian daftar W, dan jumlah yang kami tetapkan.

Sintaksnya adalah: ANDLW yang mana sebenarnya yang akan kita jalani DAN kandungan W dengan.

Akibat fungsi AND akan disimpan terus ke dalam daftar W.
ANDWF membenarkan kita menjalankan fungsi AND pada daftar W dan daftar yang berbeza, contohnya PORT. Sintaksnya adalah: ANDWF, d yang merupakan senarai yang kita sukai, mis. PORTA, dan d menunjukkan PIC di mana anda harus meletakkan hasilnya. Jika d = 0, hasilnya dimasukkan ke dalam daftar W, dan dari d = 1 hasil akhirnya disimpan dalam daftar yang kami tetapkan. Kedua-dua bahagian kod di bawah menunjukkan contoh yang baik bagi setiap fungsi AND.

Yang pertama adalah memeriksa status PORTA, di mana kita perlu memeriksa apakah inputnya adalah 1100. Kita dapat meletakkan hasilnya kembali ke daftar W

movlw 1100
ANDWF 05h, 0 Ilustrasi kedua sekarang mungkin mengesahkan kandungan daftar W:
ANDLW 1100

ATAU

Kami telah menemui satu fungsi ATAU, tepatnya XOR. Ini berkembang menjadi 1 jika dua bit tidak sama, tetapi berbeza. Anda boleh menemui fungsi OR lain yang dipanggil IOR, yang merupakan OR inklusif. Fungsi ini akan menghasilkan 1 sekiranya bit adalah 1, tetapi tambahan jika setiap bit adalah 1. Berikut adalah jadual kebenaran yang jelas untuk menggambarkan ini:

A B O / P
0 0 0
0 1 1
1 0 1
1 1 1

Apa itu Pengendali Aritmetik

TAMBAH

Fungsi ini memenuhi apa yang biasanya dituntutnya. Ini menyumbang dua angka! Sekiranya konsekuensi penambahan dua angka melebihi 8 bit, maka bendera CARRY mungkin akan ditetapkan. Bendera CARRY terletak di alamat 03h bit 0.

Apabila bit ini dijadualkan, maka dua angka melebihi 8 bit. Apabila ia adalah 0, dalam kes itu konsekuensinya terletak dalam 8 bit. Seperti sebelumnya, PIC memberikan kami dua gaya ADD, khususnya ADDLW dan ADDWF. Seperti yang anda sangka, ini seperti fungsi di atas. ADDLW menawarkan kandungan daftar W yang kami tetapkan. Sintaksnya adalah: ADDLW ADDWF menambah kandungan daftar W dan beberapa daftar lain yang kami tetapkan.

Sintaksnya adalah: ADDWF, d adalah di mana

SUB

Pada ketika ini, saya rasa anda tidak dapat menganggap apa fungsi ini dijalankan! Betul, anda mengesyaki, fungsi ini
tolak satu bit dari yang lain. Sekali lagi PIC memberikan kami 2 citarasa: SUBLW dan SUBWF. Sintaksnya hampir sama dengan fungsi ADD, selain jelas anda menaip SUB sebagai pengganti ADD!

Kenaikan Sekiranya kita ingin memasukkan 1 hingga nombor dalam PIC, kita benar-benar dapat menggunakan fungsi ADD, dan menggunakan yang nombor satu. ~ Kesukaran dengan ini adalah bahawa kita mesti meletakkan angka terlebih dahulu ke dalam daftar W, kemudian menggunakan kawalan ADDLW 1 untuk menaikkannya. Sekiranya kita mahu memasukkan 1 ke daftar, ia masih boleh menjadi lebih buruk. Kita mesti memasukkan nombor 1 ke dalam daftar W, selepas itu menggunakan ADDWF, 1. Oleh itu, misalnya, untuk memasukkan 1 ke lokasi 0C, katakanlah, kita perlu memiliki bahagian skrip berikut:

movlw 01
tambahwc 0c, 1

Terdapat kaedah yang lebih mudah untuk melakukan ini. Kita boleh menggunakan perintah INCF. Sintaksnya adalah: INCF, d di mana, adalah daftar, atau tempat, yang menjadi perhatian kita, dan d menunjukkan PIC di mana anda harus meletakkan hasilnya. Dalam kasus d = 0, hasilnya ada dalam daftar W, dan dalam kasus d = 1, konsekuensinya ditetapkan dalam daftar yang kami tetapkan.

Dengan menggunakan arahan individu ini, kita dapat benar-benar lima puluh peratus pengekodan. Sekiranya kita menginginkan hasilnya dikembalikan ke daftar W, dalam hal menggunakan contoh di atas, kita mungkin harus memasukkan perintah tambahan untuk mengalihkan item 0C kembali ke daftar W, setelah itu tempatkan daftar 0C kembali ke tidak kira apa itu.

Terdapat arahan kenaikan. Ia adalah INCFSZ. Perintah ini mungkin meningkatkan daftar yang kita tetapkan, namun jika kita mendaftar sama dengan 0 setelah kenaikan (yang akan berlaku semasa kita memasukkan 1 hingga 127) setelah itu PIC mungkin akan melalui arahan berikutnya. Bahagian kod di bawah menunjukkan ini:

Gelung incfsz 0C
Gelung Goto
:
:
Sisa program.

Di bahagian kod di atas, 0C akan ditingkatkan oleh 1. Kami seterusnya memiliki arahan yang memberitahu PIC untuk kembali ke tag kami bernama Loop, dan kenaikan 0C dengan 1 lagi. Ini berterusan sehingga 0C sama dengan 127. Dalam keadaan ini, ketika kita menambah 0C dengan 1, 0C sekarang akan sesuai dengan 0. Arahan INCFSZ kami dapat memberitahu PIC untuk menghilangkan arahan berikutnya, yang dalam hal ini adalah pernyataan goto, oleh itu PIC akan terus maju dengan baki program.

Penurunan

Kami telah membincangkan fungsi penurunan dalam latihan sebelumnya, oleh itu saya tidak akan menyemaknya lagi.

Pelengkap

Arahan terakhir dalam perbincangan ini akan membalikkan setiap bit dalam daftar yang kita tetapkan. Sintaksnya adalah: COMF, d di mana

Memahami Operasi Bit

Ini dapat dimanfaatkan, misalnya, untuk menukar pin port dengan cepat dari output ke input dan sebagainya. Fungsi bit membolehkan kita membentuk satu bit dalam ekspresi. Mereka mengizinkan kita untuk meneruskan, mengatur dan menyingkirkan bit tunggal dalam daftar atau angka yang kita tetapkan.

Pada akhir kursus ini Kami akan mendedahkan program yang dirancang untuk membuat satu set lampu penjujukan yang terus maju, kemudian sebaliknya. Kami melihat ini dapat dicapai lebih awal ketika kami memeriksa fungsi eksklusif ATAU, di mana kami secara eksklusif mengarahkan port dengan ekspresi. Kami kini telah melihat beberapa fungsi semasa kita membuat port di PIC, dan

Izinkan saya mengulangi penggunaannya di sini.

BCF

Arahan ini akan menghapuskan sedikit yang kita tetapkan dalam daftar yang kita tetapkan. Sintaks
adalah:
BCF,

Kami menggunakan ini lebih awal untuk mengubah dari halaman 1 ke halaman 0 dengan membuang sedikit di daftar STATUS. Kami juga dapat menggunakannya untuk memperbaiki sedikit hingga 0 di mana-mana daftar / lokasi yang berbeza. Sebagai contoh, sekiranya kita ingin menetapkan bit ke-3 pada 11001101 yang disimpan di bahagian 0C hingga 0, kita mungkin
masukkan:

BCF 0C, 03

BSF

Arahan ini akan menetapkan sedikit yang kami tetapkan hingga 1 dalam daftar apa pun yang kami nyatakan. Kami menggunakan ini lebih awal untuk meneruskan dari Halaman 0 ke Halaman 1. Sintaksnya adalah: BSF ,, dan digunakan dengan kaedah yang sama seperti BCF di atas.

BTFSCUntuk sekarang kita dapat menetapkan atau menghapus sedikit dalam daftar. Namun bayangkan jika kita pada dasarnya perlu memeriksa apakah bit adalah 1 atau 0 dalam daftar?

Tentunya, mungkin menggunakan BTFSC. Ia menyatakan Bit Test Register F, dan Langkau Jika Jelas. Arahan ini akan menganalisis bit yang kita tetapkan dalam daftar. Sekiranya bit adalah 0, arahan akan memberitahu PIC untuk meneruskan arahan berikutnya.

Kami mungkin menggunakan arahan ini sekiranya kami ingin memeriksa bendera, misalnya bendera bawaan. Ini menjimatkan kita perlu membaca daftar STATUS dan mencari bit individu untuk mengetahui bendera mana yang diperbaiki. 29 Sebagai contoh, sekiranya kita ingin memeriksa apakah bendera Carry diatur ke 1 setelah kita menambahkan 2 angka, maka kita dapat mengetikkan yang berikut:

BTFSC 03h, 0
teruskan di sini jika ditetapkan ke 1
atau di sini jika ditetapkan ke 0

Sekiranya status bit adalah 1, dalam hal ini arahan selepas BTFSC akan selesai. Sekiranya ia diatur ke 0, dalam hal ini arahan berikutnya dilewati. Bahagian pameran kod berikut yang mungkin digunakan:

Gelung:
:
:
BTFSC 03,0
Gelung Goto

Dalam kod di atas, PIC akan keluar dari gelung sekiranya bit 0 dari daftar STATUS (atau bendera Carry) ditakrifkan menjadi 0. Atau yang lain, perintah goto akan dijalankan.

BTFSS

Arahan ini menyatakan Bit Test Register F, dan Langkau Jika Ditetapkan. Ini dapat dibandingkan dengan instruksi BTFSC, selain itu PIC akan menghilangkan arahan berikutnya jika bit yang telah kami nilaikan ditetapkan ke 1, bukan 0.

CLRF

Arahan ini akan menetapkan keseluruhan perincian daftar menjadi 0. Sintaksnya adalah:

CLRF
Kami menggunakan ini lebih awal untuk menetapkan output Ports ke 0, dengan menerapkan CLRF 85h. Kami juga menggunakannya untuk memperbaiki Pelabuhan untuk memasukkan semua pin ke output dengan menggunakan CLRF
05h.

CLRW

Ini mungkin menyerupai arahan CLRF, kecuali untuk membersihkan daftar W. Sintaksnya cukup ringkas:

CLRW

RLF Dan RRF

Petunjuk ini akan membawa sedikit dalam daftar satu slot ke kiri (RLF) atau kanan (RRF) dalam daftar. Sebagai contoh, jika kita memerlukan 00000001 dan kita menggunakan RLF, dalam hal ini kita mungkin memiliki 00000010. Pada ketika ini, apa yang terjadi sekiranya terdapat 10000000 dan menerapkan arahan RLF? Pasti, 1 akan diposisikan di bendera bawa. Sekiranya kita menggunakan arahan RLF sekali lagi, 1 akan muncul semula pada permulaannya. Perkara serupa berlaku, namun bertentangan, untuk arahan RRF. Kes di bawah menunjukkan ini untuk arahan RLF, di mana Kita dapat melihat 8 bit daftar, dan juga bendera bawa:

C 87654321
0 00000001
RLF 0 00000010
RLF 0 00000100
RLF 0 00001000
RLF 0 00010000
RLF 0 00100000
RLF 0 01000000
RLF 0 10000000
RLF 1 00000000
RLF 0 00000001

Contoh Program

Kita sekarang akan melihat contoh kod yang dapat disusun dan dipacu oleh seseorang. Ia akan menghasilkan cahaya penjujukan bermula pada PortA bit 0, pergi ke PortB bit 8 dan
kemudian kembali.
Sambungkan LED ke setiap pin Port. Kami akan mempunyai sedikit
prosedur yang dinyatakan dalam tutorial ini.

TIME EQU 9FH Pembolehubah untuk gelung penundaan.
PORTB EQU 06H Port B alamat.
TRISB EQU 86H Port B Tristate alamat.
PORTA EQU 05H Port A alamat.
TRISA EQU 85H Port A Tristate alamat.
Halaman STATUS EQU 03H pilih daftar.
COUNT1 EQU 0CH Daftar gelung.
COUNT2 EQU 0DH Gelung daftar.

STATUS BSF, 5 Pergi ke halaman 1
MOVLW 00H dan sediakan
MOVWF TRISB kedua-dua Pelabuhan A dan B
MOVLW 00H ke output,
MOVWF TRISA kemudian kembali ke
STATUS BCF, 5 halaman 0.
Pelabuhan Jelas MOVLW 00H
PINTU MOVWF

Permulaan program utama

RUNMOVLW
01H Tetapkan bitMOVWF pertama
PORTB di Port B.CALL
DELAY Tunggu sebentarCALL
MENYAMPAIKAN
Gerakkan bit di Port B ke kiri, kemudian jeda.RLF
PORTB, 1 PANGGILAN
PANGGILAN DELAY
DELAYRLF
PORTB, 1 PANGGILAN
PANGGILAN DELAY
DELAYRLF
PORTB, 1 PANGGILAN
PANGGILAN DELAY
DELAYRLF
PORTB, 1 PANGGILAN
PANGGILAN DELAY
DELAYRLF
PORTB, 1 PANGGILAN
Panggilan DELAY
DELAYRLF
PORTB, 1 PANGGILAN
PANGGILAN DELAY
DELAYRLF
PORTB, 1 PANGGILAN
PANGGILAN DELAY
DELAYRLF
PORTB, 1 Ini memindahkan bit ke bendera bawa
Sekarang pindah ke Port A, dan gerakkan sedikit ke kiri.RLF
PORTA, 1 Ini memindahkan bit dari bendera sifar ke PortACALL
DELAYCALL DELAYRLF
PINTU, 1 PANGGILAN
PANGGILAN DELAY
DELAYRLF
PINTU, 1 PANGGILAN
PANGGILAN DELAY
DELAYRLF
PINTU, 1 PANGGILAN
PANGGILAN DELAY
MENYAMPAIKAN
Pindahkan bit kembali ke Port ARRF
PINTU, 1 PANGGILAN
PANGGILAN DELAY
DELAYRRF
PINTU, 1 PANGGILAN
PANGGILAN DELAY
DELAYRRF
PINTU, 1 PANGGILAN
PANGGILAN DELAY
DELAYRRF
PORTA, 1 Ini memindahkan bit ke bendera sifar Sekarang gerakkan bit
kembali di Port BRRF
PORTB, 1 PANGGILAN
PANGGILAN DELAY
DELAYRRF
PORTB, 1 PANGGILAN
PANGGILAN DELAY
DELAYRRF
PORTB, 1 PANGGILAN
PANGGILAN DELAY
DELAYRRF
PORTB, 1 PANGGILAN
DELAYCALL DELAYRRF
PORTB, 1 PANGGILAN
PANGGILAN DELAY
DELAYRRF
PORTB, 1 PANGGILAN
PANGGILAN DELAY
DELAYRRF
PORTB, 1 PANGGILAN
PANGGILAN DELAY
DELAY Sekarang kita kembali ke tempat yang kita mulakan, GOTO
JALANKAN mari kita pergi lagi.

Terdapat banyak pilihan dalam set latihan yang membolehkan anda menggunakan jadual data.

Jadual data hanyalah senarai petikan data, di mana semuanya diperiksa berdasarkan beberapa pertimbangan.
Sebagai contoh, anda mungkin mempunyai rangkaian yang menggunakan PIC yang menghitung jumlah kejadian pin input menjadi tinggi dalam 1 saat. Selepas itu anda dapat menunjukkan nombor pada paparan 7 segmen.

Sebaik sahaja waktunya dilancarkan, PIC mula menghitung jumlah kesempatan pin menjadi tinggi. Setelah 1 saat ia mengunjungi meja dan melihat data, ia mesti menunjukkan nombor di paparan yang melambangkan jumlah situasi yang tinggi pin. Ini boleh bermanfaat, kerana kita tidak menentukan angka apa itu sehingga PIC berjaya mencapai anggarannya.

Dengan menggunakan jadual, kita dapat membiarkan PIC menentukan angka mana yang akan digambarkan. Pada ketika ini, sebelum saya terus menunjukkan kepada anda bagaimana tabel data berfungsi, saya mungkin harus memberitahu anda bahawa PIC mengekalkan jalan keberadaannya dalam program semasa program tersebut beroperasi.

Ini memudahkan bagi mereka yang telah melakukan pengaturcaraan tertentu dalam BASIC. Jika tidak, jangan risau, anda mungkin ingin terus belajar mengenai teori ini. Bayangkan ada program BASIC yang serupa dengan yang ditunjukkan di bawah:

10 TAHUN K = 0
11 K = K + 1
12 JIKA K> 10 KALI GOTO 20 LAIN GOTO 11
20 CETAKAN K
21 TAMAT

Program bermula pada baris 10. Sebaik sahaja K dijadualkan ke 0, ia seterusnya ke baris 11. Setelah kita memasukkan 1 hingga K, kita kemudian meneruskan ke baris 12.

Pada ketika ini kita mungkin ingin tahu jika K lebih tinggi daripada 10. Sekiranya berlaku, seterusnya kita menuju ke baris 20, atau kita kembali ke baris 11.

Baris 20 mendokumentasikan K, dan baris 21 menyimpulkan program. BASIC menggunakan statistik garis untuk membantu pengaturcara menyimpan rekod di mana masalahnya, kerana label tidak dibenarkan. PIC menggunakan label untuk melarikan diri antara destinasi - atau bolehkah ia benar-benar?

Kami menggunakan label untuk memastikan bahawa kami menyedari di mana masalahnya, dan juga untuk memastikan kami dapat memberitahu PIC dengan cara mudah untuk mencari.

Apa yang berlaku ialah PIC memanfaatkan kaunter garis dalam yang disebut Kaunter Program. Counter Program (disingkat PC) jejak tujuan memori di mana arahan ini.

Setiap kali kita memaklumkan kepada PIC untuk mengunjungi label yang dipilih, ia memahami tempat ingatan dan oleh itu menambah PC sehingga melihat tujuan memori itu. Ini betul-betul kaedah yang sama seperti kita melihat program BASIC di atas. Berikut adalah segmen kod, dengan ruang memori, atau item PC, di samping setiap arahan:

Arahan PC0000 movlw 03
0001 movwf 0C
0002 Gelung decfsc 0C
0003 goto Gelung
0004 akhir

Dalam demonstrasi di atas, Kami telah menetapkan PC ke 0000. Mengenai ini kita mempunyai arahan movlw 03. Apabila PIC telah melaksanakan data ini, ia akan menaikkan PC agar arahan berikutnya diimbas. Pada ketika ini PIC melihat movwf 0C. PC bertambah lagi.

Sekarang PIC mengkaji decfsc 0C. Sekiranya perincian 0C tidak 0, dalam hal PC bertambah 1, begitu juga dengan arahan berikut, goto Loop, memberitahu PC untuk kembali ke posisi 0003, yang ada adalah Loop tersebut. Sekiranya butiran 0C adalah 0, maka PC disarankan untuk menambah 2, cukup hilangkan instruksi berikutnya.

Memahami Jadual Data

Ini meletakkan PC pada kedudukan 0004, di mana program selesai. Destinasi diperbaiki oleh assembler, dan secara amnya kita tidak perlu risau apa yang dicapai oleh PC. Sehingga, kita merasa perlu untuk mengawalnya seperti yang kita lakukan semasa menggunakan jadual data. Cara paling senang untuk menerangkan bagaimana jadual data berfungsi, adalah bermula dengan ilustrasi.

PC sama 02
movlw 03
jadual panggilan
:
PC addwf jadual
balas 01
balas 02
balas 03
balas 04
balas 05
balas 06
balas 07
kembali

Arahan awal adalah memperuntukkan label PC dengan alamat Kaunter Program (02h). Kami akan segera setelah memasukkan nilai 03h ke dalam daftar w. Kami selepas itu berkomunikasi ke meja. Garis paling utama dalam jadual subrutin menambah perincian daftar W (03h) ke kaunter program.

Ini memicu penghitung program untuk menaikkan 3, atau dengan cara yang lain, merangsang penghitung program untuk meneruskan 3 baris. Semasa kaunter tiba 3 baris ke bawah, PIC mengenali arahan arahan. Perintah ini mengirimkan nilai mengikutnya ke daftar W, setelah itu kembali dari subrutin. RETLW pada dasarnya menandakan Return, Literal to W.

Lihat saya meletakkan koma selepas perkataan Return. Oleh kerana kita berada di subrutin, kita memerlukan instruksi Kembali ke permukaannya. Oleh itu RET dalam arahan. Selepas arahan RETLW adalah nombor, dan inilah yang dimasukkan ke dalam daftar W.

Dalam contoh ini adalah angka 3. Kita dapat menetapkan kuantiti apa pun ke daftar W, selama angka ini digabungkan dengan Penghitung Program di subrutin tabel, kita akan menemui petunjuk retlw. Dalam ilustrasi di atas ini menunjukkan kita dapat memiliki angka dari 1 hingga 7. Sekiranya kita melepasi subrutin, kita mungkin dapat menyelesaikan pelaksanaan bahagian tambahan program. Atas sebab ini, biasanya merupakan langkah yang bijak untuk meletakkan jadual data tepat pada akhir program PIC, oleh itu jika kita melakukan overhoot dalam hal ini kita akan sampai pada akhir program.

Topik gangguan mungkin akan menjadi yang terpanjang dan paling sukar untuk dilalui.

Anda tidak dapat mencari kaedah yang rumit untuk merinci gangguan, namun dengan sedikit keberuntungan hingga akhir bahagian ini, anda mungkin dapat menerapkan gangguan ke dalam program anda sendiri.
Kami telah memisahkan bahagian tersebut kepada 2 peringkat. Itu adalah untuk membolehkan memisahkan topik menjadi beberapa bahagian, juga untuk memberi anda petua yang berguna agar mudah difahami.

Apa sebenarnya gangguan? Tentunya, seperti istilah menunjukkan, gangguan adalah teknik atau isyarat yang menghalang mikropemproses / mikrokontroler dari apa pun yang dilakukannya sehingga sesuatu yang berbeza dapat terjadi.

Izinkan saya memberi anda gambaran harian. Fikirkan anda berehat di rumah anda sendiri, bercakap dengan orang lain. Tiba-tiba telefon berbunyi.

Anda berhenti bercakap, dan ambil telefon untuk bercakap dengan pemanggil. Sebaik sahaja anda mempunyai interaksi telefon, anda memutuskan untuk kembali bercakap dengan individu sebelum telefon berdering. Adalah mungkin untuk mempertimbangkan rutin utama semasa anda berbicara dengan seseorang, deringan telefon menyebabkan gangguan perbualan anda, dan rehat dalam rutin adalah kaedah bercakap di telefon.

Walaupun perbincangan telefon berakhir, anda akan kembali ke rutin utama berbual anda. Gambaran ini adalah tepat bagaimana mengganggu pemproses untuk mengambil tindakan.

Program utama beroperasi, menjalankan fungsi tertentu dalam rangkaian, namun ketika terjadi gangguan, program utama berhenti sementara rutin yang berbeda dilakukan. rutin berakhir, pemproses bergerak kembali ke rutin utama seperti sebelumnya.

Memahami Gangguan

PIC mempunyai 4 sumber gangguan. Mereka boleh dibahagikan kepada beberapa kumpulan. Dua adalah sumber gangguan yang dapat digunakan secara luar ke PIC, sementara dua yang lain adalah proses batin. Izinkan saya menjelaskan dua jenis luaran di sini. Dua yang lain akan dijelaskan dalam tutorial yang berbeza setelah kami tiba di timer dan menyimpan data.

Sekiranya anda melihat pin-out PIC, anda akan melihat bahawa pin 6 itu adalah RB0 / INT. Pada titik ini, RB0 jelas Port B bit 0. INT menunjukkan bahawa ia juga boleh dikonfigurasi sebagai pin interrupt luar. Selanjutnya, pin Port B 4 hingga 7 (pin 10 hingga 13) juga boleh digunakan untuk gangguan. Sebelum kita dapat menggunakan INT atau pin Port B yang lain, kita mesti menyelesaikan dua tugas. Pertama sekali, kita mesti memberitahu PIC bahawa kita akan menggunakan gangguan.

Seterusnya, kita mesti menetapkan pin port B yang akan kita gunakan sebagai gangguan dan bukan sebagai pin I / O. Di dalam PIC anda dapat mencari daftar yang dikenali sebagai INTCON, dan berada di alamat 0Bh. Dalam daftar ini, anda akan menemui 8 bit yang mungkin diaktifkan atau dilumpuhkan. Bit 7 dari INTCON dikenali sebagai GIE. Ini adalah Global Interrngupt Enable. Memperbaiki ini menjadi 1 memberitahu PIC bahawa kami akan menggunakan gangguan.

Bit 4 dari INTCON dikenali sebagai INTE, INTerrupt Enable. Meletakkan bit ini ke 1 menyampaikan kepada PIC bahawa RB0 akan menjadi pin interrupt. Mengkonfigurasi bit 3, yang disebut RBIE, memberitahu PIc bahawa kita akan menggunakan bit Port B 4 hingga 7. Pada titik ini PIC memahami kapan pin ini dapat tinggi atau rendah, harus menghentikan apa yang sedang dilakukannya dan melanjutkan dengan gangguan rutin. Pada ketika ini, kita mesti memaklumkan kepada PIC sama ada gangguan tersebut mungkin berlaku di tepi menaik (0V hingga + 5V) atau transformasi tepi penurunan (+ 5V hingga 0V) isyarat.

Sederhananya, adakah kita ingin PIC mengganggu setiap kali isyarat bergerak dari rendah ke tinggi, atau dari tinggi ke rendah. Dengan kenakalan, ini dapat dibentuk untuk diletakkan di tepi yang naik.

Tepi ‘triggering’ dijadualkan dalam daftar tambahan yang disebut register OPTION, di alamat 81h. Bit yang kita gemari adalah bit 6, yang sering disebut sebagai INTEDG.

Menetapkan ini ke 1 akan memicu PIC terganggu di tepi pelekap (keadaan lalai) dan menetapkannya ke 0 merangsang PIC untuk mengganggu pada gelongsor. Sekiranya anda ingin PIC diaktifkan di bahagian atas, anda pasti tidak perlu melakukan apa-apa.

Pada ketika ini, sayangnya, daftar Opsyen ada di Bank 1, yang bermaksud bahawa kita senang mengubah suai dari bank 0 ke bank 1, menetapkan bit dalam daftar Opsyen, setelah itu kembali ke bank 0. Kuncinya di sini adalah untuk mencapai setiap bit Bank 1 mendaftar dalam satu teguran, contohnya menetapkan pin port, setelah itu kembali ke Bank 0 jika anda selesai.

Baiklah, akibatnya kami telah memberitahu PIC pin mana yang mungkin menjadi gangguan, dan di mana kelebihan untuk dicetuskan, apa yang berlaku dalam program dan PIC setiap kali gangguan berlaku? Beberapa perkara berlaku. Pertama sekali, 'bendera' dijadualkan.

Ini memberitahu pemproses dalaman PIC bahawa gangguan telah berlaku. Seterusnya, kaunter program (yang saya bicarakan dalam tutorial sebelumnya) memberi petua ke alamat tertentu dalam PIC. Mari kita periksa semua ini secara pantas. Bendera Interrupt Dalam daftar INTCON kami, bit 1 adalah bendera interrupt, yang disebut INTF. Pada ketika ini, setiap kali timbul gangguan, bendera ini kemungkinan akan tetap menjadi 1.

Apabila tidak ada gangguan, bendera diletakkan hingga 0. Begitu juga dengan semua pencapaian. Pada ketika ini anda mungkin merenungkan 'apa gunanya?' Tentunya, walaupun bendera ini dijadwalkan menjadi 1, PIC tidak dapat, dan tidak akan, bertindak balas terhadap gangguan lain. Oleh itu, mari kita nyatakan bahawa kita akan menyebabkan gangguan. Bendera mungkin akan tetap menjadi 1, dan PIC mungkin berjalan ke rutin kami kerana bekerja mengganggu.

Apabila bendera ini tidak diperbaiki menjadi 1, dan PIC diizinkan untuk terus menjawab interupsi, maka pulsing terus menerus dapat membuat PIC kembali ke awal rutin interupsi kami, dan sama sekali tidak menyelesaikannya. Kembali ke ilustrasi telefon saya, ia serupa dengan mengangkat telefon, dan dengan segera setelah membincangkannya, ia mula berdering sekali lagi kerana orang lain ingin bercakap dengan anda.

Sebaiknya selesaikan satu dialog, kemudian ambil semula telefon untuk bercakap dengan individu berikutnya. Anda boleh menemui masalah kecil dengan bendera ini. Walaupun PIC dengan cepat menetapkan bendera ini menjadi 1, ia tidak menetapkannya lagi 0! Aktiviti itu mesti dilaksanakan oleh pengaturcara - iaitu anda. Ini dapat dicapai dengan mudah, kerana saya yakin, dan harus dicapai setelah PIC menjalankan rutin gangguan.

Lokasi Memori Setiap kali anda mula-mula menghidupkan PIC, atau sekiranya terdapat reset, petua Program Counter untuk mengatasi 0000 jam, yang mungkin akan berlaku di awal memori program. Tetapi, sekiranya terdapat gangguan, Kaunter Program akan menunjukkan alamat 0004h.

Oleh itu, semasa kita menyusun program kita yang akan mempunyai gangguan, pertama kita mesti memberitahu PIC untuk melompati alamat 0004h, dan menjaga rutin gangguan yang bermula pada alamat 0004h yang berbeza dari baki program.

Ini boleh dilakukan tanpa gangguan. Pada mulanya, kami memulakan program kami dengan arahan yang dikenali sebagai ORG. Perintah ini menunjukkan Origin, atau start. Kami berpegang teguh dengan alamat. Oleh kerana PIC bermula di alamat 0000h, kami menaip ORG 0000h. Selepas itu kita mesti memotong alamat melebihi 0004h. Kami mencapainya dengan meletakkan arahan GOTO, disertakan dengan label yang memberi petua untuk program utama kami.

Kami selepas itu mematuhi perintah GOTO ini dengan satu ORG lagi, ketika ini dengan alamat 0004h. Setelah perintah ini, kita memasukkan rutin gangguan kita. Pada ketika ini, kami mungkin dapat mengetik rutin gangguan kami mengikut arahan ORG kedua, atau kami dapat meletakkan pernyataan GOTO yang menunjukkan rutin gangguan.

Ini benar-benar berkaitan dengan pilihan di pihak anda. Untuk memberitahu PIC yang ditawarkan sampai pada akhir rutin gangguan, kita harus meletakkan perintah RTFIE menjelang akhir rutin. Perintah ini menandakan kembali dari rutin gangguan. Sementara PIC memperhatikan hal ini, Kaunter Program menunjukkan ke kedudukan terakhir PIC sebelum gangguan berlaku. Kami telah menetapkan bahagian kod ringkas untuk memaparkan perkara di atas:

Terdapat beberapa perkara yang harus anda maklumkan semasa menggunakan gangguan. Permulaan cenderung adalah bahawa jika anda mungkin menggunakan daftar yang sama dalam program utama dan rutin gangguan, ingatlah bahawa perincian daftar kemungkinan besar akan berubah ketika gangguan berlaku.

Sebagai contoh, mari kita gunakan daftar w untuk meneruskan data ke program utama Port A, oleh itu anda juga dapat menggunakan daftar w dalam rutin interupsi untuk mengalihkan data dari satu tujuan ke tujuan lain.

Sekiranya anda tidak berhati-hati, daftar w akan memasukkan nilai terakhir yang diterima semasa berada dalam rutin gangguan, jadi apabila anda kembali dari gangguan, maklumat ini akan dihantar ke Port A dan bukannya nilai yang anda miliki sebelumnya gangguan itu berlaku.

Cara di sekitar ini adalah menyimpan seketika perincian daftar w sebelum Anda menggunakannya sekali lagi dalam rutin gangguan. Yang kedua adalah hakikat bahawa anda dapat mencari kelewatan antara ketika satu gangguan berlaku dan ketika yang berikutnya dapat timbul. Walaupun anda faham, PIC mempunyai jam luaran, yang mungkin berupa kristal atau kombo resistor-kapasitor.

Tidak kira berapa frekuensi jam ini, PIC membaginya dengan 4 dan selepas ini menggunakan ini untuk jangka masa dalaman. Contohnya sekiranya anda mempunyai kristal 4MHz yang dihubungkan ke PIC anda, dalam hal PIC akan melaksanakan arahan pada 1MHz. Pemasaan dalaman ini dikenali sebagai Instruction Cycle. Pada ketika ini, lembaran data mendakwa (tidak diragukan lagi dalam cetakan kecil) bahawa anda perlu mengaktifkan 3 hingga 4 putaran arahan antara gangguan.

Saya ingin membolehkan 4 pusingan. Sebab di sebalik penundaan itu adalah PIC memerlukan masa untuk melonjak ke alamat gangguan, bendera, dan tiba kembali dari rutin gangguan. Oleh itu, ingatlah ini jika anda bekerja dengan litar alternatif untuk mengaktifkan gangguan untuk PIC.

Pada ketika ini, yang perlu diperhatikan adalah kenyataan bahawa jika anda menggunakan bit 4 hingga 7 dari Port B sebagai gangguan. Anda tidak dapat memilih pin tertentu di Port B untuk berfungsi sebagai gangguan.

Oleh itu, sekiranya anda membenarkan pin ini, semuanya mungkin boleh didapati. Oleh itu, sebagai contoh, anda tidak boleh mempunyai bit 4 dan 5 - bit 6 dan 7 kemungkinan akan diberi kuasa pada masa yang sama. Apa sebenarnya tujuan mendapatkan empat bit untuk mewakili gangguan? Tentunya, anda mungkin mempunyai litar yang terhubung ke PIC, sekiranya ada empat baris yang tinggi, sekiranya ini mungkin menjadi masalah yang anda perlukan PIC untuk mempengaruhi dengan serta-merta.

Salah satu ilustrasi ini ialah penggera keselamatan rumah, di mana empat sensor dihubungkan ke pin Port B 4 hingga 7. Setiap sensor tertentu dapat mendorong PIC untuk memicu penggera, dan rutin isyarat penggera adalah rutin gangguan. Alat ini sentiasa memeriksa pelabuhan dan membolehkan PIC meneruskan perkara yang berbeza. Dalam tutorial seterusnya, kami akan menyusun program untuk menguruskan gangguan.

Kami menangani banyak asas dalam tutorial terakhir, oleh itu saya merasakan sudah tiba masanya kami menyusun program pertama kami.

Program yang akan kita tulis akan menghitung jumlah kesempatan ketika kita menghidupkan, dan kemudian menunjukkan jumlahnya.

Program akan dihitung dari 0 hingga 9, dapat dilihat pada 4 LED dalam bentuk binari, bersama-sama dengan input atau gangguan mungkin pada RB0.

Perkara utama yang mesti kita lakukan ialah memberitahu PIC untuk melompati alamat di mana Kaunter Program menunjukkan setiap kali gangguan berlaku.

Anda akan melihat bahawa Kami menggunakan kaedah unik untuk menunjukkan nombor heksadesimal. Sebelum saya berlaku gunakan F9h di mana h menunjukkan heksadesimal. Kita boleh menulisnya sebagai 0xF9, yang merupakan struktur yang akan kita gunakan mulai sekarang.

Sekarang kita perlu memberitahu PIC bahawa kita akan menggunakan gangguan, dan kita menggunakan RB0 pin 6 sebagai pin interrupt:

bsf INTCON, 7GIE - Mengaktifkan gangguan global (1 = aktifkan)
bsf INTCON, 4INTE - gangguan RB0 aktifkan (1 = aktifkan)
Saya akan membersihkan bendera gangguan sekiranya berlaku (saya tidak pernah mempercayai apa-apa!)
bcf INTCON, 1INTF - Kosongkan sedikit bendera sekiranya berlaku

Pada masa ini kita mesti mewujudkan 2 port kita. Perlu diingat bahawa karena kita sekarang menggunakan RB0 sebagai pin interrupt, ini harus ditetapkan sebagai input:

Kami akan menggunakan pemboleh ubah yang dipanggil COUNT untuk menyimpan bilangan kiraan suis. Kami hanya boleh menambah nilai di Port A, tetapi anda akan melihat mengapa saya menggunakan pemboleh ubah semasa menulis rutin gangguan kami.

Oleh itu, program utama kami disusun, dan pada ketika ini kita mesti memberitahu PIC bagaimana untuk meneruskan setiap kali gangguan berlaku. Dalam contoh ini, gangguan kita mungkin akan menjadi pertukaran. Apa yang kita mahukan PIC adalah satu dengan COUNT yang boleh disesuaikan setiap kali suis dikurung.

Walaupun begitu, kami hanya ingin menunjukkan berapa kali suis ditutup dari 0 hingga 9. Di atas, saya menyatakan bahawa kami mungkin hanya dapat menaikkan nilai di Port A setiap kali ada gangguan. Walau bagaimanapun, Port A mempunyai 5 bit, sekiranya kita menaikkan port, kita akan memperoleh jumlah tertinggi 31. Terdapat beberapa penjelasan mengapa saya memilih untuk tidak bergerak hingga 31.

Pada mulanya, kami akan menggunakan skrin 7-segmen, yang paling banyak hanya dapat dari 0 hingga 15 (0 hingga F dalam hex). Seterusnya, saya juga ingin menunjukkan kepada anda beberapa arahan aritmetik yang anda jalani dalam beberapa pelajaran terakhir.

Oleh itu, kami akan meneruskan rutin gangguan kami. Pada masa ini yang pertama mesti kita capai adalah menyimpan butiran daftar w kita secara ringkas, kerana kita telah menerapkan ini untuk mengalihkan kandungan COUNT ke PORTA. Sekiranya kami tidak menyimpannya, sekiranya kami dapat memberikan nombor yang sangat berbeza kerana aritmetik kami. Oleh itu mari kita selesaikan yang pertama:

Pada tahap ini kita memahami jika nilai COUNT adalah 9 atau lebih. Yang perlu kita capai sekarang ialah jika COUNT lebih dari 9, letakkan kembali ke 0, atau kembali ke program utama untuk memastikan bahawa kita dapat menyampaikannya ke Pelabuhan A. Perintah BTFSS kerana anda faham akan selanjutnya
arahan sekiranya bendera bawa dijadualkan iaitu COUNT = 10:

Satu-satunya perkara yang masih perlu dilakukan sekarang adalah memasukkan secara kolektif dan juga menentukan nilai bagi pemalar kita, yang dapat kita lakukan tepat pada permulaan program kita.

Setiap kali anda mengaktifkan suis, LED akan dihitung secara binari dari 0000 hingga 1010 kemudian kembali ke 0000.

Gambar berikut menunjukkan gambarajah litar yang sesuai dengan kod yang dijelaskan di atas. Menariknya anda akan dapati bahawa pemuat masa telah dimasukkan dalam reka bentuk. Ini adalah cara kecil yang bagus di mana anda mendapat kebebasan untuk mengelakkan kemasukan kapasitor sekiranya anda tidak mempunyai apa-apa dengan anda pada masa itu.

Di sini kapasitans dimainkan melalui kapasitans sesat di pin dan tanah pengayun.
Sudah tentu ia mungkin bukan kaedah yang sangat bijak untuk mengelakkan kapasitor secara praktikal kerana nilai sesat mungkin berbeza dengan keadaan yang berbeza.

Bahagian lain yang dapat dilihat dalam litar adalah rangkaian pengecam di seluruh suis. Ini mencegah gangguan semasa beralih mekanikal dan mencegah PIC menjadi keliru jika beralih adalah satu atau satu atau beberapa togol.




Sebelumnya: Litar Pemasa Motor Bidirectional Bidirectional Seterusnya: Bagaimana Litar Buck-Boost Berfungsi