Tutorial PIC- Dari Register ke Interrupts

Coba Instrumen Kami Untuk Menghilangkan Masalah





Sebelum masuk ke detail menit dari pemrograman PIC, pertama-tama penting untuk mempelajari beberapa metode pemrograman yang baik.

Memahami Register

Untuk memulai dengan misalkan Anda mengetik (titik koma) di setiap titik program, semua yang muncul setelah titik koma ini akan diabaikan oleh kompiler, sampai tentu saja kereta kembali ke posisi semikolon.



Fitur di atas memungkinkan kita untuk menambahkan komentar atau komentar sedemikian rupa sehingga tidak menjadi bagian dari program namun memudahkan kita untuk mengidentifikasi program dengan bantuan komentar di sampingnya. Memberi komentar adalah praktik yang disarankan saat memprogram IC apa pun.

Hal penting berikutnya dalam kursus ini adalah menetapkan nama ke berbagai konstanta (Anda akan mempelajarinya nanti). Aso ini membuatnya lebih mudah untuk memahami apa yang sedang ditulis, atau mengenai nilai-nilai yang terlibat, daripada bingung dengan angka yang disertakan.



Hal di atas harus dilakukan dalam bentuk nama sebenarnya untuk pengenalan instan, misalnya JUMLAH, perlu diperhatikan bahwa di sini semua huruf kapital digunakan untuk membuatnya berbeda dan juga menunjukkan bahwa nilainya konstan.


Seperti yang bisa kita lihat, di atas dilakukan dalam bentuk kotak yang terbuat dari titik koma sehingga terlihat lebih bersih. Selain itu, cobalah mendokumentasikan program di atas kertas juga, praktik ini akan membantu memahami berbagai hal dengan cara yang bijaksana.

2. Register.

Register di dalam PIC adalah area yang menerima detail tertulis serta memungkinkan membaca darinya. Anda dapat membandingkannya dengan selembar kertas di mana Anda dapat memvisualisasikan isinya dan menambahkan dengan menulis di atasnya.

Gambar di bawah ini menggambarkan peta file register tipikal yang disematkan dalam PIC16F84. Formatnya bukanlah sesuatu yang benar-benar diatur di dalam PIC, itu hanya untuk menunjukkan bagaimana bit dapat diatur di dalam chip dan untuk memahami beberapa perintah yang terlibat.

Anda dapat melihat bahwa itu pada dasarnya dibagi menjadi Bank 0 dan Bank 1. Bank 1 bertanggung jawab untuk mengontrol kerja sebenarnya dari PIC, misalnya telp PIC bit mana di Port A yang ditugaskan sebagai input dan yang sebagai output.

Bank 2 hanya untuk memanipulasi informasi.

Mari kita pahami melalui contoh berikut:

Misalkan kita ingin menetapkan satu bit pada PortA tinggi. Untuk ini, pertama-tama kita perlu pergi ke Bank 1 untuk mengatur bit atau pin tertentu di Port A dalam bentuk output. Setelah ini kita kembali ke Bank 0 dan mengirimkan logika 1 (bit 1) ke pin tertentu.

Register paling umum yang ingin kami gunakan di Bank 1 adalah STATUS, TRISA, dan TRISB.

STATUS membantu kita kembali ke Bank 0, TRISA mengizinkan kita untuk memilih pin mana di Port A yang merupakan keluaran dan mana yang mungkin merupakan masukan, sedangkan TRISB memfasilitasi untuk memilih antara pin keluaran dan masukan di Port B. Register SELECT di BANK 0 mengizinkan pengguna untuk beralih ke Bank 1.

Mari kita rangkum seluruh konsep dengan uraian berikut:

STATUS:

Untuk beralih dari Bank 0 ke Bank 1, kami memerintahkan register STATUS. Ini diimplementasikan dengan mengatur bit # 5 dari register STATUS ke 1. Untuk kembali ke Bank 0, kami menetapkan bit 5 dari register STATUS ke 0. Register STATUS diposisikan pada alamat 03h, di sini h menandakan tat nomor mungkin dalam Heksadesimal.

TRISA dan TRISB:

Ini terletak di alamat 85h dan 86h yang sesuai. Untuk memprogram pin sebagai output atau input, kami hanya mengirimkan nol atau satu ke bit tertentu di register. Sekarang ini dapat dilakukan dengan dua cara, melalui biner, atau Hex. Jika seseorang tidak dapat mengubah parameter, dia dapat menggunakan kalkulator ilmiah untuk mengimplementasikan nilai.

Sekarang kami memiliki 5 pin di Port A, yang sesuai dengan 5 pin. Jika kita bermaksud untuk memperbaiki salah satu pin sebagai input, kita mengirimkan angka “1” ke bit tertentu.

Jika kami ingin menetapkan salah satu pin sebagai output, kami akan menetapkan pin spesifik ke '0'. Bit-bit tersebut diturunkan secara tepat sesuai dengan bit-bit tersebut, atau lebih tepatnya bit 0 adalah RA0, bit 1 adalah RA1, bit 2 = RA2 dan seterusnya. Mari kita pahami dengan cara ini:

Misalkan Anda ingin memperbaiki RA0, RA3 dan RA4 sebagai keluaran, sedangkan RA1 / RA2 sebagai i / ps, Anda akan melakukannya dengan mengirimkan 00110 (06h). Perhatikan bahwa bit 0 mengarah ke kanan seperti yang ditunjukkan di sini:

Port A Pin RA4 RA3 RA2 RA1 RA0

Bit Nomor 4 3 2 1 0

Biner 0 0 1 1 0

Hal yang sama berlaku untuk TRISB.

PORTA dan PORTB

Untuk memberikan salah satu pin keluaran tinggi, kami hanya menawarkan '1' ke bit masing-masing di register PORTA atau PORTB kami. Prosedur yang sama juga dapat diikuti untuk register TRISA dan TRISB. Sebelum kita mempercepat contoh pengkodean pertama kita, mari kita pahami coupe dari lebih banyak register, yaitu: w dan f.

W dan F

Register W adalah register biasa yang memungkinkan Anda menetapkan nilai apa pun yang Anda pilih. Segera setelah Anda menetapkan besaran ke W, Anda dapat melanjutkan dengan menambahkannya ke nilai lain atau cukup memindahkannya. Dengan nilai lain yang ditetapkan, detailnya akan diganti dengan W.

Register F meneruskan masalah tertulisnya ke register. Kami akan memerlukan register F ini untuk menetapkan nilai di atas register, mungkin di atas STATUS atau register TRISA, karena ini tidak akan memungkinkan kami untuk menempatkan nilai secara langsung di atasnya. Program Contoh

Mari kita periksa contoh kode berikut yang akan menunjukkan kepada kita bagaimana instruksi di atas diterapkan dan juga akan menyaksikan beberapa instruksi dalam kursus.

Mari kita mulai dengan memperbaiki Port A seperti yang dibahas di atas.

Untuk ini kita perlu bergeser dari Bank 0 ke Bank1, ini dilakukan dengan mengatur register STATUS yang terletak di alamat 03h, bit 5 ke 1.

BSF 03h, 5

BSF Berarti Set Bit F. Kami menggunakan dua angka setelah instruksi ini - 03h, yang merupakan alamat register STATUS, dan angka 5 yang sesuai dengan nomor bit.

Jadi, yang kami katakan adalah 'Set bit 5 di alamat 03h ke 1'.

Kami sekarang di Bank 1.

MOVLW 00110b

Kami meletakkan nilai biner 00110 (huruf b berarti bilangan dalam biner) ke dalam register tujuan umum kami W. Saya tentu saja bisa melakukan ini dalam hex, dalam hal ini instruksi kami adalah:

MOVLW 06h

Keduanya bekerja. MOVLW berarti 'Pindahkan Nilai Literal Ke W', yang dalam bahasa Inggris berarti masukkan nilai yang mengikuti langsung ke register W.

Sekarang kita perlu memasukkan nilai ini ke register TRISA kita untuk mengatur port:

MOVWF 85 jam

Instruksi ini menunjukkan “Pindahkan Isi W Ke Alamat Register Yang Mengikuti”, dalam hal ini alamat mengacu pada TRISA.

Register TRISA kami pada saat ini menunjukkan angka 00110, atau disajikan dalam bentuk grafik:

Port A Pin RA4 RA3 RA2 RA1 RA0

Biner 0 0 1 1 0

Masukan / Keluaran O O I I O

Jadi sekarang kita memiliki pin Port A kita, kita harus kembali ke Bank 0 untuk menyesuaikan salah satu infonya.

BCF 03h, 5

Instruksi ini menyelesaikan kebalikan dari BSF. Ini menyiratkan 'Bit Clear F'. Sepasang angka yang sesuai adalah alamat register, di sini register STATUS, serta angka bit, dalam hal ini bit lima. Apa sebenarnya yang telah kami selesaikan saat ini adalah, definisi bit lima di kami

STATUS mendaftar ke 0

Kami saat ini telah kembali di Bank 0.
Berikut ini adalah kode semua dalam satu blok:

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

Dalam instruksi terakhir, kami mengonfirmasi kepada Anda cara untuk menetapkan pin port IO pada PIC untuk kemungkinan input atau output.

Melalui kursus ini, Izinkan saya membantu Anda mengirim data ke port.

Mengirim Data ke Port

Dalam tutorial berikutnya, kita akan menyelesaikannya dengan menyalakan dan mematikan LED yang terdiri dari detail program lengkap dan diagram sirkuit langsung sehingga Anda dapat melihat PIC melakukan persis seperti yang kami antisipasi.

Jangan mencoba menggabungkan dan memprogram PIC Anda dengan hasil di bawah ini, karena itu hanya ilustrasi. Awalnya, kami akan membuat Port A bit 2 sebagai output:

Ini bisa dikenali dari instruksi sebelumnya. Satu-satunya perbedaan adalah Kami telah memperbaiki setiap bit pin pada A sebagai output, dengan mengirimkan 0h ke register tri-state. Jadi yang harus dia lakukan sekarang adalah menyalakan LED.

Kami mencapai ini dengan menjadwalkan salah satu pin (yang LED terhubung dengannya) tinggi. Dengan kata lain, kami menerapkan '1' ke pin. Ini persis seperti yang dilakukan (amati komentar untuk klarifikasi untuk setiap baris):

Oleh karena itu, yang telah kita capai sekarang adalah menyalakan LED kemudian mematikannya satu kali. Apa yang kami inginkan adalah agar LED menyala kemudian terus menerus.

Kami mencapai ini dengan mendapatkan program untuk kembali ke awal. Kami mencapai ini dengan awalnya membuat tag di awal program kami, kemudian memberi tahu program untuk melanjutkan kembali ke sana. Kami menentukan tag dengan mudah.

Kami memasukkan sebuah istilah, katakan MULAI, selanjutnya ketik kode:

Seperti yang ditunjukkan, kami awalnya menyebutkan ekspresi 'Mulai' segera di awal program.

Selanjutnya, di akhir program, kami dengan jelas menyebutkan ‘goto Start’. Instruksi 'goto' melakukan apa yang dideklarasikannya.

Program ini secara konsisten akan menyalakan dan mematikan LED setiap kali kita menyalakan sirkuit, cenderung mati begitu kita mematikan listrik. Mungkin kita harus memeriksa program kita lagi:

Tentunya kami telah menghilangkan komentar, namun kami masih dapat mengamati petunjuk dan nomornya.

Ini bisa menjadi sedikit membingungkan nanti jika Anda mencoba memecahkan masalah program dan saat menulis kode Anda telah mengingat semua alamat.

Meskipun komentar dapat ditempatkan, tetap saja itu bisa menjadi sedikit berantakan. Ini akan membutuhkan penamaan nomor dan mungkin dilakukan dengan instruksi tambahan: 'equ' Instruksi 'equ' menunjukkan bahwa beberapa hal mungkin sama dengan barang lain.

Ini mungkin bukan instruksi untuk PIC, melainkan untuk assembler. Instruksi ini memfasilitasi pemberian nama ke lokasi alamat register, atau konstanta ke istilah pemrograman.

Kami akan menetapkan beberapa konstanta untuk program kami dan juga menyaksikan seberapa mudahnya membaca program.

Karena sekarang kami telah menetapkan nilai konstan kami dapat melanjutkan dengan mengaturnya ke dalam program kami. Nilai konstanta perlu ditentukan sebelum menggunakannya.

oleh karena itu pastikan untuk selalu memposisikannya di awal program. Kami akan menulis ulang program tidak termasuk komentar sekali lagi, untuk membandingkan pelabelan sebelumnya dengan yang terbaru.

Mungkin Anda dapat memperhatikan bahwa konstanta memungkinkan pemahaman program yang sedikit lebih mudah, namun kami masih tanpa komentar, jangan khawatir, karena kami belum selesai.

Mungkin ada kerugian kecil dari program LED berkedip kami.
Setiap instruksi membutuhkan 1 urutan jam untuk diselesaikan. Jika kita menggunakan kristal 4MHz, maka setiap instruksi membutuhkan 1 / 4MHz, atau 1uS sampai selesai.

Karena kami telah menggunakan hanya lima instruksi, LED akan aktif kemudian mati dalam 5uS. Ini mungkin terlalu cepat untuk diperhatikan orang, selain itu, LED akan tampak menyala penuh.

Apa yang seharusnya kita capai adalah menghasilkan penghambatan antara menyalakan LED dan mematikan LED. Teori penghambatan adalah bahwa kita menghitung mundur dari kuantitas sebelumnya, jadi ketika mencapai nol, kita berhenti menghitung.

Nilai nol menandakan akhir dari penundaan, dan kami terus mengerjakan proses kami sepanjang program. Oleh karena itu, yang pertama harus kita lakukan adalah menentukan konstanta yang akan digunakan sebagai penghitung kita.

Mari kita sebut konstanta ini JUMLAH. Setelah itu, kita harus menentukan seberapa signifikan suatu angka untuk mulai menghitung. Tentunya, angka terbesar yang bisa kita sertakan adalah 255, atau FFh dalam hex., Seperti yang saya bicarakan di tutorial sebelumnya, instruksi equ memberikan ekspresi ke situasi register.

Ini menyiratkan bahwa tidak peduli berapa kuantitas yang kita alokasikan COUNT kita, itu akan cocok dengan item dari sebuah register. Jika kami mencoba untuk menetapkan nilai FFh, kami akan mendapatkan kesalahan begitu kami dapat mengompilasi program.

Alasan menjadi lokasi FFh adalah, oleh karena itu kami tidak dapat mengaksesnya. Oleh karena itu, bagaimana kita harus menunjukkan nomor asli? Tentu saja, ini akan membutuhkan sedikit perenungan lateral.

Jika mungkin kita menetapkan COUNT kita ke alamat 08h, misalnya, ini akan menunjukkan tujuan register tujuan dasar. Secara default, area yang tidak tersentuh diatur ke FFh. Akibatnya, jika COUNT mengarah ke 08h, Anda akan menemukan nilai FFh saat kami pertama kali menyalakan. Namun demikian ya, bagaimana kita bisa memperbaiki HITUNGAN ke nomor lain ?, yang kita terapkan hanyalah 'pindahkan' penilaian ke tujuan ini terlebih dahulu.

Sebagai ilustrasi, misalkan kita ingin COUNT memiliki nilai 85h, kita tidak dapat menyebutkan COUNT sama dengan 85h karena itu adalah posisi register Tri-State keluar untuk Port A. Tepatnya yang kita capai adalah sebagai berikut: movlw 85hFirst put nilai 85h di register W movwf 08h

Sekarang pindahkan ke register 08h kami. Selanjutnya, jika kita menyatakan COUNT sama dengan 08h, COUNT akan cocok dengan nilai 85h. Halus, bukan! Oleh karena itu, awalnya kita menentukan konstanta kita: COUNT equ 08h Setelah itu kita harus mengurangi COUNT ini dengan satu sampai menjadi nol.

Itu terjadi begitu saja bahwa ada satu instruksi yang dirancang untuk mencapai ini untuk kita, dengan menggunakan 'goto' dan tag.

Instruksi yang akan kita terapkan adalah: DECFSZ COUNT, 1 Instruksi ini menyatakan 'Mengurangi register (di sini COUNT) dengan nomor yang melacak koma. Jika kita mencapai nol, lompatlah dua tempat ke depan. 'Mari kita cari tahu cara kerjanya dulu, sebelum kita menempatkannya di jalur kita.

Apa yang telah kami lakukan awalnya menetapkan COUNT konstan kami ke 255. Segmen berikutnya menempatkan tag, yang disebut LABEL dekat dengan instruksi decfsz kami.

JUMLAH decfsz, 1 mengurangi nilai JUMLAH satu per satu, dan mempertahankan hasil akhirnya langsung menjadi JUMLAH. Selain itu, verifikasi untuk memeriksa apakah JUMLAH memiliki nilai 0.

Jika tidak, dalam hal ini memicu program untuk berpindah ke baris berikutnya. Sekarang kita memiliki deklarasi 'goto' yang mengembalikan kita ke instruksi decfsz.

Jika nilai JUMLAH berkinerja sama, maka instruksi decfsz menghasilkan program kami untuk melompat 2 tempat ke depan, dan dikirim ke tempat Kami telah mengklaim 'Lanjutkan di sini'.

Oleh karena itu, karena Anda dapat mengamati, kami telah membuat program untuk duduk di satu tempat untuk waktu yang telah ditentukan sebelum melanjutkan. Ini bisa dinamai loop penundaan.

Memahami Delay Loops

Jika kami memerlukan penundaan yang lebih besar, kami dapat mengejar satu putaran per putaran berikutnya. Loop ekstra, memperpanjang penundaan. Mari kita setidaknya dua, dengan asumsi kita ingin mengamati flash LED .. Kita akan menempatkan loop penundaan ini ke dalam program kita, dan menyelesaikannya dengan membuat program asli dengan memberikan komentar:

Dimungkinkan untuk mengkompilasi program ini setelah itu memprogram PIC. Jelas, pastikan Anda mencoba sirkuit untuk memeriksa apakah memang berfungsi. Berikut ini adalah diagram sirkuit yang harus Anda buat segera setelah Anda memprogram PIC.


Bagus, Anda sebenarnya bisa menyusun program PIC pertama Anda, serta membangun sirkuit untuk menyalakan dan mematikan LED. Hingga saat ini, jika Anda telah mengikuti kursus ini, Anda mungkin telah mempelajari keseluruhan tujuh instruksi dari 35, tetapi tanpa keraguan sejauh ini Anda mungkin mengendalikan port I / O!

Apakah Anda mencoba untuk mengubah loop penundaan untuk membuat flash LED lebih cepat - apa yang tampak sebagai nilai minimal COUNT untuk melihat flash LED? Atau mungkin, Anda ingin memasukkan loop penundaan ke-3 atau tambahan setelah yang pertama untuk menstabilkan LED turun. konstanta unik untuk setiap loop penundaan.

Anda kemudian dapat secara potensial benar-benar mengutak-atik loop penundaan Anda untuk membuat flash LED pada kecepatan tertentu, misalnya setelah satu detik. Dalam instruksi berikutnya mari kita lihat bagaimana kita dapat menggunakan sesuatu yang dikenal sebagai subrutin untuk menjaga program tetap kompak dan dasar Sebuah subrutin adalah bagian integral dari kode, atau program, yang dapat dirujuk sebagai dan ketika Anda mungkin membutuhkannya. Subrutin digunakan jika Anda sering menyelesaikan fungsi yang sama.

Apa itu Subrutin

Manfaat menggunakan subrutin adalah kemungkinan akan lebih mudah untuk mengubah nilai sekali di dalam subrutin daripada, katakanlah, sepuluh kali di seluruh program Anda, dan juga berkontribusi besar untuk menurunkan tingkat memori yang dikonsumsi program Anda di dalam PIC. Kami akan memeriksa subrutin:

Awalnya, kami perlu memberikan subrutin kami sebutan, dan dalam situasi ini Kami telah memilih ROUTINE. Kami setelah itu ketik kode yang ingin kami lakukan seperti biasa. Itu sebabnya, Kami telah memilih penundaan dalam program led flashing kami. Terakhir, kami menyimpulkan subrutin dengan memasukkan instruksi RETURN.

Untuk memulai subrutin dari mana saja dalam program kita, kita dengan cepat mengetik instruksi CALL dan kemudian subrutin.

Kami akan mempertimbangkan ini sedikit lebih dalam. Begitu kita sampai di bagian program kita yaitu CALL xxx, di mana xxx adalah nama subrutin kita, program akan melompat ke mana saja subrutin xxx diinstal. Instruksi di dalam subrutin dilakukan.

Kapanpun instruksi RETURN diselesaikan, program melompat kembali ke program utama kami ke instruksi setelah instruksi CALL xxx kami.

Subrutin serupa dapat dipanggil beberapa kali sesuai keinginan Anda, yang menjelaskan mengapa penggunaan subrutin mengurangi durasi umum program kita.

Namun demikian, ada beberapa faktor yang harus Anda ketahui. Awalnya, seperti program utama kami, konstanta tertentu perlu diketahui sebelum Anda dapat menggunakannya.

Ini mungkin diakui di dalam subrutin itu sendiri, atau langsung di awal program utama. Saya mengusulkan kepada Anda bahwa Anda mengakui segala sesuatu di awal program utama Anda, sejak saat itu Anda menyadari bahwa segala sesuatunya berada pada posisi yang sama. Selanjutnya, kita harus memastikan bahwa program utama melewati subrutin.

Apa yang saya maksud dengan ini adalah jika Anda menempatkan subrutin langsung pada akhir program utama Anda, kecuali jika Anda menggunakan deklarasi 'Goto' untuk melompat dari tempat subrutin itu, program akan melanjutkan dan mengimplementasikan subrutin tersebut terlepas dari apakah Anda membutuhkannya atau sebaliknya.

PIC tidak akan membedakan antara subrutin dan program utama. Kami akan memeriksa program led flashing kami, namun kali ini kami akan menggunakan subrutin untuk loop penundaan. Idealnya, Anda akan menemukan betapa rumitnya program tersebut muncul, serta Anda mungkin menemukan bagaimana subrutin tersebut diterapkan secara praktis.

Akhirnya, Anda dapat mengamati bahwa dengan menggunakan subrutin untuk loop penundaan kami, kami mungkin telah memperkecil ukuran dimensi program.

Setiap kali kita menginginkan penundaan, mungkin saat LED hidup atau mati, pada dasarnya kita memanggil subrutin penundaan. Di akhir subrutin, program mengarah kembali ke baris mengikuti instruksi 'Panggilan' kami. Pada ilustrasi di atas, kita menyalakan LED.

Kami setelah itu menghubungi subrutin. Program kemudian kembali agar kita dapat mematikan LED. Kami memanggil subrutin sekali lagi, untuk berjaga-jaga jika subrutin tersebut mungkin telah selesai, program kembali dan instruksi selanjutnya yang dikenali adalah 'goto Start'. Bagi siapa pun yang mungkin tertarik, program pertama kami berukuran 120 byte.

Melalui penggunaan subrutin, kami dapat mengurangi ukuran program menjadi 103 byte. Ini tidak mungkin terdengar begitu fantastis, tetapi mengingat fakta bahwa kita hanya memiliki 1024 byte secara keseluruhan di dalam PIC, semua manfaat kecil.

Dalam instruksi berikutnya, mari kita periksa membaca dari pelabuhan.

Sejauh ini, kami telah menyusun ke Port A agar kami dapat menghidupkan dan mematikan LED. Pada titik ini, kita akan melihat bagaimana kita akan membaca pin I / O pada port.

Membaca Port Input / Output

Ini persis untuk memastikan bahwa kami dapat menghubungkan sirkuit eksternal, dan memengaruhi output spesifik apa pun yang ditawarkannya.

Jika Anda mengingat kursus kami sebelumnya, jika Anda ingin membangun port I / O, kami perlu beralih dari Bank 0 ke Bank 1. Kami akan menyelesaikannya pada awalnya:

Pada titik ini kami telah memperbaiki bit 0 dari Port A ke input. kita sekarang harus memeriksa apakah pinnya tinggi atau rendah. Untuk mencapai ini, seseorang dapat menggunakan salah satu dari dua instruksi:

BTFSC dan BTFSS.

Instruksi BTFSC menandakan 'Lakukan tes bit pada register serta bit yang kami tentukan.

Jika itu adalah 0, dalam hal ini kami menghilangkan instruksi berikutnya '. BTFSS menyiratkan 'Lakukan tes bit di register dan bit yang kami buat. Jika ini disetel ke 1, maka kami melewati instruksi berikutnya.

Yang mana yang kita gunakan, ditentukan oleh bagaimana kita ingin program kita merespons saat kita mempelajari masukannya. Sebagai gambaran, jika kita hanya menunggu input menjadi 1, maka instruksi BTFSS dapat kita manfaatkan dengan cara sebagai berikut:

Kode di sini:

BTFSS PortA, 0Goto start Lanjutkan di sini:
:

Program hanya akan bergeser ke 'Lanjutkan di sini' asalkan bit 0 di PortA dijadwalkan ke 1.

Saat ini kami akan menulis program yang dapat meminta LED pada satu kecepatan, namun jika sakelar dibatasi, itu akan mem-flash LED dua kali lebih lambat.

Mungkin mungkin untuk menjalankan program ini sendiri, namun Kami telah memasukkan daftar tersebut.

Anda dapat mencoba dan membuat seluruh program, untuk memeriksa apakah Anda telah memahami prinsip-prinsipnya. Kami akan menggunakan rangkaian ekuivalen seperti sebelumnya, dengan penyertaan sakelar yang terpasang RA0 dari PIC dan rel positif dari suplai kami.

Apa yang Kami capai di sini adalah menyalakan LED. Saya kemudian menentukan apakah sakelar dimatikan.

Dalam kasus itu terbatas, selanjutnya saya terhubung ke subrutin penundaan kami. Ini memberi kami penundaan yang sama seperti sebelumnya, namun kami pada saat ini menghubungi itu dua kali.

Hal yang sama berlaku untuk setiap kali LED mati. Jika sakelar tidak ditutup, maka kami telah mencatat periode hidup dan mati kami sebelumnya.

Apakah Anda telah mengikuti pelajaran ini dari awal, Anda mungkin berusaha memahami bahwa saat ini Anda telah menemukan sepuluh dari 35 instruksi untuk PIC 16F84! Dan setiap bit ini dapat dipelajari hanya dengan menyalakan dan mematikan LED.

Hingga saat ini, kami telah menyusun PIC berkedip dan mematikan LED.

Selanjutnya kami dapat menggunakan PIC kami dengan memasukkan sakelar, oleh karena itu memvariasikan kecepatan flash.

Menggunakan Ruang Memori Secara Efisien

Satu-satunya masalah adalah, program ini cukup panjang dan ruang memori agak tidak efisien. Sepertinya baik-baik saja saat saya memasukkan perintah untuk pertama kalinya, namun seharusnya ada cara yang lebih mudah untuk mengeksekusinya. Pasti ada, kami akan menganalisis bagaimana kami benar-benar menyalakan dan mematikan LED.

movlw 02hmovwf PORTAmovlw 00hmovlw PORTA

Awalnya kami mengisi register w kami dengan 02h, setelah itu mentransfernya ke register PortA kami untuk menyalakan LED. Untuk mematikannya, kami mengemas w dengan 00h setelah itu menggesernya ke register PortA kami.

Di antara semua rutinitas ini kami dipaksa untuk berhubungan dengan subrutin untuk memastikan bahwa kami dapat mengamati LED berkedip.

Oleh karena itu, kami perlu mentransfer dua set info beberapa kali (satu kali ke register w lalu ke PORTA) serta memanggil subrutin dua kali (sekali untuk aktif lalu sekali untuk nonaktif). Jadi, bagaimana kita bisa mencapai ini dengan efisiensi tambahan? Sangat sederhana.

Kami menggunakan instruksi berbeda yang dikenal sebagai XORF. Instruksi XORF menjalankan fungsi Eksklusif OR pada register yang kami tetapkan dengan info yang kami berikan. Saya yakin saya harus mengklarifikasi apa itu OR Eksklusif sebelum kita melanjutkan. Jika kita memiliki dua masukan, dan satu keluaran, masukan hanya boleh 1 jika, dan selama kedua masukan tersebut berbeda. Meskipun mereka sama, maka outputnya mungkin akan menjadi 0. Berikut ini adalah tabel kebenaran, untuk individu yang memilih untuk memeriksa ini:

A B F0 0 00 1 11 0 11 1 0

Kita pada titik ini akan memeriksa apa yang terjadi jika kita merender B seperti keluaran sebelumnya, dan hanya mengubah nilai A:

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

Jika kita mempertahankan nilai A sama dengan 1, dan kita Eksklusif ATAU dengan output, output akan berubah. Jika Anda tidak dapat melihat ini dari tabel kebenaran, di bawah ini dapat dilihat menggunakan biner:

0 Output Saat Ini
EX-OR Dengan 1 1 Output Baru
EX-OR Dengan 1 0 Output Baru

Mungkin Anda dapat menemukannya dengan ORing eksklusif output dengan 1, kita sekarang akan beralih output dari 0 ke 1 ke 0.
Karenanya, untuk menyalakan dan mematikan LED, kami hanya memerlukan beberapa kalimat:

MOVLW 02h
PINTU XORWF, 1

Apa tepatnya yang akan kita capai adalah menambahkan register w kita dengan 02h. Kami dalam hal itu Eksklusif ORing nomor ini dengan apa pun yang ada di PortA kami. Dalam kasus bit 1 adalah 1, itu akan berubah menjadi 0. Dalam kasus bit 1 adalah 0, itu akan berubah menjadi 1. Mari kita periksa kode ini sekali atau dua kali, untuk menampilkan bagaimana menjalankan biner:

PINTU
00010
xorwf 00000
xorwf 00010
xorwf 00000
xorwf 00010

Kami sebenarnya tidak harus memuat nilai yang identik ke dalam w register kami setiap saat, oleh karena itu dimungkinkan untuk melakukannya satu kali di awal, dan cukup melompat kembali ke perintah toggle kami. Selain itu, kami tidak perlu menetapkan nilai pada register PortA kami. Alasannya? Tentunya, karena jika dinyalakan itu adalah 1, kita dapat dengan mudah mengaktifkannya. Saya, sebagai alternatif 0 pada power up, kami bahkan sekarang akan mengaktifkannya.

Oleh karena itu, Anda ingin melihat kode yang baru kami bentuk. Yang pertama mewakili kode LED kami yang berkedip, sedangkan yang kedua menunjukkan yang dengan tambahan sakelar:

Semoga Anda dapat menemukan bahwa hanya dengan menggunakan satu instruksi mudah, sekarang kami telah mengurangi skala program kami. Sebenarnya, untuk menampilkan seberapa banyak kami dapat mengurangi program kami, Kami telah mendemonstrasikan dua program, apa saja yang telah dibuat, dan dimensinya dalam tabel di bawah ini:

Dimensi Pengubah Program (Bytes)
LED Berkedip Asli 120
Flashing LED Subrutin Ditambahkan 103
Fungsi XOR LED Berkedip yang Digunakan 91
LED Dengan Saklar Asli 132
LED Dengan Fungsi Saklar XOR yang Digunakan 124.

Oleh karena itu, tidak hanya kami menemukan beberapa instruksi baru, kami juga telah mengurangi ukuran skrip kami!

Di bawah ini, kami akan menganalisis bagaimana Anda dapat menggoyangkan bit individual, menjalankan aritmatika langsung tertentu, serta tabel data.

Manajer Logis

Dalam tutorial terakhir saya mempresentasikan operasi Exclusive OR. Fungsi ExOR dipahami sebagai operator logika.

Dalam tutorial ini saya akan menjelaskan operator logika tambahan yang dipromosikan PIC. Tidak akan ada kasus apa pun dalam program poin, namun Kami akan mempelajari metode mudah untuk menggunakan operator dengan menerapkan area kode yang kecil.

DAN Fungsi AND pada dasarnya menganalisis dua bit dan memberikan 1 apakah keduanya sama, dan 0 jika keduanya berbeda. Misalnya, jika kita menyebutkan 1 AND 1, hasilnya adalah 1, sedangkan jika kita menyatakan 1 AND 0 konsekuensinya adalah 0.

Tak perlu dikatakan lagi, kita juga dapat mengevaluasi kata-kata, serta semua fungsi AND yang diselesaikan adalah meninjau kedua istilah tersebut sedikit demi sedikit. Contoh di bawah ini menunjukkan dua kata 8-bit yang menjadi AND bersama dengan produk:

11001011
DAN 10110011
Sama dengan 10000011

Saya harap Anda setuju, hasilnya hanya akan memiliki 1 setiap kali 2 1 bergandengan satu sama lain dalam sepasang kata. Kami dapat menggunakan fungsi AND untuk memverifikasi port, misalnya.

Jika kami memeriksa beberapa pin I / O yang terhubung ke sirkuit, dan kami harus mengawasi situasi tertentu di mana hanya beberapa pin yang tinggi, dalam hal ini kami dapat membaca cukup banyak port, setelah itu DAN hasil dengan kondisi yang telah kita periksa, identik dengan contoh di atas.

PIC memberi kita dua bahan untuk DAN.
Mereka adalah ANDLW dan ANDWF. ANDLW mengizinkan kami untuk menjalankan fungsi AND dengan detail register W, dan jumlah yang kami tentukan.

Sintaksnya adalah: ANDLW dimana persisnya apa yang akan kita tuju DAN isi dari W dengan.

Konsekuensi dari fungsi AND akan disimpan langsung ke register W.
ANDWF mengizinkan kita untuk menjalankan fungsi AND pada register W dan register lain, misalnya PORT. Sintaksnya adalah: ANDWF, d di mana register yang kami sukai, mis. PORTA, dan d menunjukkan PIC di mana Anda harus memposisikan hasilnya. Jika d = 0, hasilnya dimasukkan ke register W, dan dari d = 1 hasil akhirnya disimpan ke register yang kita tetapkan. Dua bagian kode di bawah ini menampilkan contoh yang baik dari setiap fungsi AND.

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

Movlw 1100
ANDWF 05h, 0 Ilustrasi kedua sekarang mungkin memverifikasi isi register W:
ANDLW 1100

ATAU

Kami sekarang telah menemukan satu fungsi OR, tepatnya XOR. Ini berkembang menjadi 1 jika dua bit tidak sama, tetapi berbeda. Anda dapat menemukan fungsi OR lain yang disebut IOR, yang merupakan OR inklusif. Fungsi ini akan menghasilkan 1 jika salah satu bit adalah 1, tetapi sebagai tambahan jika setiap bit adalah 1. Di bawah ini adalah tabel kebenaran yang jelas untuk menggambarkan ini:

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

Apa itu Operator Aritmatika

MENAMBAHKAN

Fungsi ini menyelesaikan apa yang biasanya diklaimnya. Ini menyumbang dua angka! Jika konsekuensi penambahan dua angka melebihi 8 bit, dalam hal ini flag CARRY mungkin akan disetel. Bendera CARRY terletak di alamat 03h bit 0.

Ketika bit ini dijadwalkan, maka kedua angka tersebut melampaui 8 bit. Jika nilainya 0, dalam hal ini konsekuensinya terletak dalam 8 bit. Seperti sebelumnya, PIC memberikan kita dua gaya ADD, yaitu ADDLW dan ADDWF. Seperti yang mungkin Anda asumsikan, ini mirip dengan fungsi di atas. ADDLW menawarkan isi register W yang kami tentukan. Sintaksnya adalah: ADDLW ADDWF menambahkan isi register W dan beberapa register lain yang kita tunjuk.

Sintaksnya adalah: ADDWF, d is where

SUB

Pada titik ini, saya rasa Anda tidak dapat menduga apa yang dilakukan fungsi ini! Memang, Anda sudah curiga, fungsi ini
mengurangi satu bit dari bit lainnya. Sekali lagi PIC memberi kita 2 rasa: SUBLW dan SUBWF. Sintaksnya persis sama dengan fungsi ADD, selain ternyata Anda mengetik SUB sebagai ganti ADD!

Penambahan Jika kita ingin memasukkan 1 ke angka di PIC, kita benar-benar dapat menggunakan fungsi ADD, dan menggunakan nomor satu. ~ Kesulitan dengan ini adalah kita harus menempatkan angka tersebut ke dalam register W, kemudian menggunakan kontrol ADDLW 1 untuk menaikkannya. Jika kita ingin memasukkan 1 ke register, itu bisa lebih buruk lagi. Kita harus menempatkan angka 1 terlebih dahulu ke register W, setelah itu gunakan ADDWF, 1. Oleh karena itu, misalnya, untuk memasukkan 1 ke lokasi 0C, katakanlah, kita perlu memiliki bagian skrip berikut:

Movlw 01
addwf 0c, 1

Ada metode yang lebih mudah untuk melakukan ini. Kita bisa menjalankan perintah INCF. Sintaksnya adalah: INCF, d di mana, adalah register, atau tempat, yang menjadi perhatian kita, dan d menunjukkan PIC di mana Anda harus memposisikan hasilnya. Dalam kasus d = 0, hasilnya ada dalam register W, dan dalam kasus d = 1, konsekuensinya diatur dalam register yang kami tetapkan.

Dengan menggunakan instruksi individu ini kami dapat benar-benar lima puluh persen dari pengkodean. Jika kita menginginkan hasil dikembalikan ke register W, dalam hal menggunakan contoh di atas, kita mungkin harus menyertakan perintah tambahan untuk menggeser item 0C kembali ke register W, setelah itu kembalikan register 0C ke no peduli apa itu.

Ada perintah increment. Ini adalah INCFSZ. Perintah ini mungkin menaikkan register yang kita tetapkan, namun jika kita register sama dengan 0 setelah kenaikan (itu akan terjadi saat kita memasukkan 1 hingga 127) maka PIC mungkin akan melewatkan instruksi berikutnya. Bagian kode di bawah ini mencerminkan ini:

Ulangi incfsz 0C
Goto Loop
:
:
Sisa program.

Pada bagian kode di atas, 0C akan bertambah 1. Selanjutnya kita memiliki instruksi yang menginformasikan PIC untuk kembali ke tag kita bernama Loop, dan menaikkan 0C dengan 1 lagi. Ini berlanjut hingga 0C sama dengan 127. Dalam keadaan ini, ketika kita menaikkan 0C dengan 1, 0C sekarang akan cocok dengan 0. Instruksi INCFSZ kita dapat dengan baik menginformasikan PIC untuk menghilangkan instruksi berikutnya, yang dalam hal ini adalah deklarasi goto, maka PIC akan melanjutkan program lainnya.

Pengurangan

Fungsi penurunan pada pelatihan sebelumnya sudah kita bahas, oleh karena itu saya tidak akan merevisinya lagi.

Melengkapi

Instruksi terakhir dalam diskusi ini akan membalikkan setiap bit dalam register yang kami tetapkan. Sintaksnya adalah: COMF, d wherein

Memahami Operasi Bit

Ini dapat digunakan, misalnya, untuk dengan cepat menukar pin port dari output ke input dan sebagainya. Fungsi bit memungkinkan kita untuk membentuk satu bit dalam ekspresi. Mereka mengizinkan kita untuk melanjutkan, mengatur dan membuang bit tunggal dalam register atau angka yang kita tentukan.

Pada akhir kursus ini, Kami akan mengungkapkan program yang dirancang untuk membuat serangkaian lampu yang berurutan yang maju, lalu sebaliknya. Kami mengamati ini dicapai sebelumnya ketika kami memeriksa fungsi OR eksklusif, di mana kami secara Eksklusif ORed port dengan ekspresi. Kami sampai sekarang telah melihat beberapa fungsi bit ketika kami membangun port pada PIC, dan

Izinkan saya mengulangi penggunaannya di sini.

BCF

Instruksi ini akan menghapus sedikit yang kami tetapkan dalam register yang kami tentukan. Sintaks
aku s:
BCF,

Kami menggunakan ini sebelumnya untuk mengubah dari halaman 1 ke halaman 0 dengan menghapus sedikit di register STATUS. Kami juga dapat menggunakannya untuk memperbaiki sedikit ke 0 di register / lokasi yang berbeda. Misalnya, jika kami ingin menyetel bit ke-3 di 11001101 yang disimpan di bagian 0C ke 0, kami mungkin
memasukkan:

BCF 0C, 03

BSF

Instruksi ini akan memperbaiki bit apa pun yang kami tetapkan ke 1 dalam register mana pun yang kami tunjukkan. Kami menggunakan ini sebelumnya untuk melanjutkan dari Halaman 0 ke Halaman 1. Sintaksnya adalah: BSF ,, dan digunakan persis dengan metode yang sama seperti BCF di atas.

BTFSC Sampai saat ini kita bisa mengatur atau menghapus sedikit di register. Namun bayangkan jika pada dasarnya kita perlu memeriksa apakah sedikit adalah 1 atau 0 dalam register?

Tentunya, BTFSC dapat digunakan. Ini menyatakan Bit Test Register F, dan Skip If It Is Clear. Instruksi ini akan menganalisis bit yang kita tentukan di register. Dalam kasus bit adalah 0, instruksi akan memberitahu PIC untuk melewati instruksi berikutnya.

Kami dapat menggunakan instruksi ini jika kami ingin memeriksa sebuah bendera, misalnya bendera carry. Ini membuat kita tidak perlu membaca register STATUS dan mencari bit individu untuk mempelajari flag mana yang diperbaiki. 29 Misalnya, jika kami ingin memeriksa apakah bendera Carry disetel ke 1 setelah kami menambahkan 2 angka, maka kami dapat mengetik yang berikut ini:

BTFSC 03h, 0
lanjutkan di sini jika diatur ke 1
atau di sini jika disetel ke 0

Dalam hal status bit adalah 1, dalam hal ini instruksi setelah BTFSC akan diselesaikan. Jika disetel ke 0, dalam hal ini instruksi selanjutnya akan dilewati. Bagian berikut dari pameran kode yang mungkin digunakan:

Loop:
:
:
BTFSC 03,0
Goto Loop

Dalam kode di atas, PIC hanya akan keluar dari loop jika bit 0 dari register STATUS (atau bendera Carry) didefinisikan ke 0. Atau, perintah goto akan dijalankan.

BTFSS

Instruksi ini menyatakan Bit Test Register F, And Skip If Set. Ini dapat dibandingkan dengan instruksi BTFSC, selain itu PIC akan menghilangkan instruksi berikutnya jika bit yang telah kita evaluasi diatur ke 1, bukan 0.

CLRF

Instruksi ini akan memperbaiki seluruh detail register menjadi 0. Sintaksnya adalah:

CLRF
Kami menggunakan ini sebelumnya untuk mengatur output Port ke 0, dengan menerapkan CLRF 85h. Kami selanjutnya menggunakannya untuk memperbaiki Port agar menyertakan semua pin ke output dengan menggunakan CLRF
05h.

CLRW

Ini bisa menyerupai instruksi CLRF, kecuali untuk membersihkan register W. Sintaksnya cukup sederhana:

CLRW

RLF dan RRF

Arah ini akan mengangkut sedikit dalam register satu slot ke kiri (RLF) atau kanan (RRF) dalam register. Misalnya, jika kita membutuhkan 00000001 dan menggunakan RLF, maka kita mungkin memiliki 00000010. Pada titik ini, apa yang terjadi jika ada 10000000 dan menerapkan instruksi RLF? Tentunya, 1 akan ditempatkan di carry flag. Jika kita menerapkan instruksi RLF sekali lagi, angka 1 akan muncul kembali di awal. Hal yang sama terjadi, namun sebaliknya, untuk instruksi RRF. Kasus dalam poin di bawah ini menunjukkan ini untuk instruksi RLF, di mana Kita dapat melihat 8 bit register, serta flag carry:

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

Contoh Program

Sekarang kita akan melihat contoh kode yang dapat dikompilasi dan dijalankan. Ini akan menghasilkan cahaya pengurutan mulai dari PortA bit 0, menuju ke PortB bit 8 dan
lalu kembali.
Hubungkan LED ke masing-masing pin Port. Kami akan memiliki sedikit
prosedur yang ditunjukkan dalam tutorial ini.

TIME EQU 9FH Variabel untuk loop penundaan.
Alamat PORTB EQU 06H Port B.
Alamat TRISB EQU 86H Port B. Tristate.
PORTA EQU 05H Alamat Port A.
Alamat TRISA EQU 85H Port A Tristate.
STATUS EQU 03H Halaman pilih register.
COUNT1 EQU 0CH Loop register.
COUNT2 EQU 0DH Daftar loop.

BSF STATUS, 5 Buka halaman 1
MOVLW 00H dan set up
MOVWF TRISB baik Port A dan B
MOVLW 00H ke keluaran,
MOVWF TRISA lalu kembali ke
BCF STATUS, 5 halaman 0.
MOVLW 00H Hapus Port A.
PINTU MOVWF

Memulai program utama

RUNMOVLW
01H Setel bitMOVWF pertama
PORTB di Port B. CALL
TUNDA Tunggu beberapa saat
MENUNDA
Pindahkan bit pada Port B ke kiri, lalu jeda .RLF
PORTB, 1 PANGGILAN
PANGGILAN TUNDA
DELAYRLF
PORTB, 1 PANGGILAN
PANGGILAN TUNDA
DELAYRLF
PORTB, 1 PANGGILAN
PANGGILAN TUNDA
DELAYRLF
PORTB, 1 PANGGILAN
PANGGILAN TUNDA
DELAYRLF
PORTB, 1 PANGGILAN
PANGGILAN TUNDA
DELAYRLF
PORTB, 1 PANGGILAN
PANGGILAN TUNDA
DELAYRLF
PORTB, 1 PANGGILAN
PANGGILAN TUNDA
DELAYRLF
PORTB, 1 Ini memindahkan bit ke dalam carry flag
Sekarang pindah ke Port A, dan pindahkan sedikit ke kiri.RLF
PORTA, 1 Ini memindahkan bit dari bendera nol ke PortACALL
DELAYCALL DELAYRLF
PINTU, 1 PANGGILAN
PANGGILAN TUNDA
DELAYRLF
PINTU, 1 PANGGILAN
PANGGILAN TUNDA
DELAYRLF
PINTU, 1 PANGGILAN
PANGGILAN TUNDA
MENUNDA
Pindahkan bit kembali ke Port ARRF
PINTU, 1 PANGGILAN
PANGGILAN TUNDA
DELAYRRF
PINTU, 1 PANGGILAN
PANGGILAN TUNDA
DELAYRRF
PINTU, 1 PANGGILAN
PANGGILAN TUNDA
DELAYRRF
PORTA, 1 Ini memindahkan bit ke bendera nol. Sekarang pindahkan bit
kembali ke Pelabuhan BRRF
PORTB, 1 PANGGILAN
PANGGILAN TUNDA
DELAYRRF
PORTB, 1 PANGGILAN
PANGGILAN TUNDA
DELAYRRF
PORTB, 1 PANGGILAN
PANGGILAN TUNDA
DELAYRRF
PORTB, 1 PANGGILAN
DELAYCALL DELAYRRF
PORTB, 1 PANGGILAN
PANGGILAN TUNDA
DELAYRRF
PORTB, 1 PANGGILAN
PANGGILAN TUNDA
DELAYRRF
PORTB, 1 PANGGILAN
PANGGILAN TUNDA
TUNDA Sekarang kita kembali ke tempat kita mulai, GOTO
LARI, ayo pergi lagi.

Ada pilihan yang bagus dalam set pelatihan yang memungkinkan Anda untuk menggunakan tabel data.

Tabel data hanyalah daftar kutipan data, yang semuanya dilihat berdasarkan beberapa pertimbangan.
Misalnya, Anda dapat memiliki sirkuit yang menggunakan PIC yang menghitung jumlah instance pin input menjadi tinggi dalam 1 detik. Setelah itu Anda dapat memamerkan nomor tersebut pada tampilan 7 segmen.

Segera setelah waktu diluncurkan, PIC mulai menghitung frekuensi pin menjadi tinggi. Setelah 1 detik ia mengunjungi tabel dan melihat ke atas data, ia harus menampilkan angka pada tampilan yang melambangkan jumlah situasi yang membuat pin tinggi. Ini bisa bermanfaat, karena kami tidak menentukan berapa angka yang bisa didapat sampai PIC menyelesaikan perkiraannya.

Dengan menggunakan tabel, kita dapat mengizinkan PIC menentukan gambar mana yang akan ditampilkan. Pada titik ini, sebelum saya melanjutkan menunjukkan kepada Anda bagaimana tabel data berfungsi, saya mungkin harus memberi tahu Anda bahwa PIC mempertahankan jalur keberadaan dalam program itu saat program beroperasi.

Ini memfasilitasi bagi mereka yang telah melakukan pemrograman tertentu di BASIC. Jika tidak, jangan cemas, Anda mungkin ingin terus belajar tentang teori tersebut. Bayangkan ada program BASIC yang mirip dengan yang disajikan di bawah ini:

10 TAHUN K = 0
11 K = K + 1
12 JIKA K> 10 MAKA GOTO 20 LAIN GOTO 11
20 CETAK K
21 SELESAI

Program dimulai pada baris 10. Segera setelah K dijadwalkan ke 0, selanjutnya maju ke baris 11. Setelah kita memasukkan 1 ke K, kita kemudian melanjutkan ke baris 12.

Pada titik ini kita mungkin ingin tahu apakah K lebih tinggi dari 10. Jika ya, selanjutnya kita menuju ke baris 20, atau kita kembali ke baris 11.

Baris 20 mendokumentasikan K, dan baris 21 menutup program. BASIC menggunakan statistik garis untuk membantu programmer mencatat di mana masalah berada, karena label tidak diizinkan. PIC menggunakan label untuk keluar di antara tujuan - atau benarkah?

Kami menggunakan label untuk memastikan bahwa kami mengetahui di mana masalah berada, serta untuk memastikan kami dapat menginformasikan PIC dengan cara yang sederhana untuk mencari.

Justru yang terjadi adalah PIC memanfaatkan penghitung garis dalam yang disebut Penghitung Program. Program Counter (disingkat PC) jejak tujuan memori di mana instruksi ini berada.

Setiap kali kami memberi tahu PIC untuk mengunjungi label yang dipilih, PIC memahami tempat memori dan karenanya menambah PC hingga ia melihat tujuan memori tersebut. Ini persis metode yang sama seperti yang kita lihat program BASIC di atas. Di bawah ini adalah segmen kode, dengan ruang memori, atau item PC, di samping setiap instruksi:

Instruksi PC0000 movlw 03
0001 movwf 0C
0002 Putaran decfsc 0C
0003 goto Loop
0004 akhir

Dalam demonstrasi di atas, Kami telah memperbaiki PC ke 0000. Dalam hal ini kami memiliki instruksi movlw 03. Ketika PIC telah mengimplementasikan data ini, itu akan menaikkan PC agar instruksi selanjutnya dipindai. Pada titik ini PIC melihat movwf 0C. PC di-increment lagi.

Sekarang PIC mempelajari decfsc 0C. Jika detail 0C bukan 0, dalam hal itu PC bertambah 1, serta instruksi berikut, goto Loop, memberi tahu PC untuk kembali ke posisi 0003, yang ada Loop tersebut. Jika detail 0C adalah 0, maka PC disarankan untuk menambah 2, lupakan saja instruksi selanjutnya.

Memahami Tabel Data

Ini menempatkan PC pada posisi 0004, di mana program selesai. Tujuan ditetapkan oleh assembler, dan kita biasanya tidak perlu khawatir tentang apa yang dicapai PC. Hingga, kami merasa perlu untuk mengendalikannya seperti yang kami lakukan saat menggunakan tabel data. Cara paling mudah untuk mendeskripsikan bagaimana tabel data berfungsi, adalah dengan memulai dengan ilustrasi.

Perlengkapan PC 02
Movlw 03
tabel panggilan
:
tabel addwf PC
retlw 01
retlw 02
retlw 03
retlw 04
retlw 05
retlw 06
retlw 07
kembali

Instruksi awal mengalokasikan PC label dengan alamat Penghitung Program (02h). Kami akan segera setelah memasukkan nilai 03h ke dalam w register. Kami kemudian berkomunikasi dengan meja. Baris terdepan dalam tabel subrutin menambahkan rincian register W (03h) ke penghitung program.

Ini memicu pencacah program untuk menaikkan 3, atau dengan kata lain, menstimulasi pencacah program untuk melanjutkan ke bawah 3 baris. Sementara penghitung tiba 3 baris di bawahnya, PIC mengenali instruksi retlw. Perintah ini mengirimkan nilai setelahnya ke register W, setelah itu kembali dari subrutin. RETLW pada dasarnya menandakan Return, Literal to W.

Lihat saya menempatkan koma setelah kata Return. Karena kita berada dalam subrutin, kita membutuhkan instruksi Return untuk memunculkannya. Oleh karena itu RET dalam instruksi tersebut. Setelah instruksi RETLW adalah angka, dan inilah yang dimasukkan ke register W.

Dalam contoh ini adalah gambar 3. Kita dapat menentukan kuantitas apapun ke register W, selama angka ini digabungkan dengan Penghitung Program dalam subrutin tabel, kita akan menemukan instruksi retlw. Dalam ilustrasi di atas, ini berarti kita dapat memiliki nomor dari 1 hingga 7. Jika kita melanjutkan melewati subrutin, kita mungkin dapat menyelesaikan bagian tambahan dari program tersebut. Untuk alasan ini, biasanya merupakan langkah cerdas untuk menempatkan tabel data tepat di akhir program PIC, oleh karena itu jika kita melakukan overshoot dalam hal ini kita akan sampai pada kesimpulan program.

Topik interupsi mungkin akan menjadi yang terpanjang dan tersulit untuk dibahas.

Anda tidak dapat menemukan metode rumit untuk merinci interupsi, namun dengan sedikit keberuntungan di akhir bagian ini Anda mungkin dapat menerapkan interupsi ke dalam program Anda sendiri.
Kami telah memisahkan bagian menjadi 2 tahap. Itu untuk memungkinkan memisahkan topik menjadi beberapa bagian, juga untuk memberi Anda plit up praktis untuk pemahaman yang mudah.

Apa sebenarnya interupsi? Tentunya, seperti istilahnya, interupsi adalah teknik atau sinyal yang mencegah mikroprosesor / mikrokontroler dari apa pun yang kinerjanya sehingga sesuatu yang berbeda dapat terjadi.

Izinkan saya memberi Anda ilustrasi harian. Pikirkan Anda sedang bersantai di rumah sendiri, bercakap-cakap dengan orang lain. Tiba-tiba telepon berbunyi.

Anda berhenti berbicara, dan meraih telepon untuk berbicara dengan penelepon. Setelah Anda melakukan interaksi telepon, Anda memutuskan untuk kembali bercakap-cakap dengan orang tersebut sebelum telepon berdering. Dimungkinkan untuk mempertimbangkan rutinitas utama saat Anda mengobrol dengan seseorang, dering telepon akan mengganggu percakapan Anda, dan jeda dalam rutinitas adalah metode berbicara di telepon.

Saat diskusi telepon berakhir, Anda kembali ke rutinitas utama Anda yaitu mengobrol. Ilustrasi ini tepatnya bagaimana sebuah prosesor melakukan interupsi untuk mengambil tindakan.

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

Memahami Interupsi

PIC memiliki 4 sumber interupsi. Mereka dapat dipecah menjadi beberapa kelompok. Dua adalah sumber interupsi yang dapat digunakan secara lahiriah ke PIC, sedangkan dua lainnya adalah proses dalam. Izinkan saya menjelaskan dua jenis eksternal di sini. Dua lainnya akan dijelaskan dalam tutorial yang berbeda setelah kita sampai pada pengatur waktu dan menyimpan data.

Jika Anda memeriksa pin-out dari PIC, Anda akan melihat bahwa pin 6 itu adalah RB0 / INT. Pada titik ini, RB0 jelas merupakan Port B bit 0. INT menyatakan bahwa ia juga dapat dikonfigurasi sebagai pin interupsi luar. Lebih lanjut, Port B pin 4 sampai 7 (pin 10 sampai 13) juga dapat digunakan untuk interupsi. Sebelum kita dapat menggunakan INT atau pin Port B lainnya, kita harus menyelesaikan dua tugas. Pertama-tama kita harus memberi tahu PIC bahwa kita akan menggunakan interupsi.

Selanjutnya, kita harus menentukan pin port B mana yang akan kita gunakan sebagai interupsi daripada sebagai pin I / O. Di dalam PIC Anda dapat menemukan register yang dikenal sebagai INTCON, dan berada di alamat 0Bh. Dalam register ini Anda akan menemukan 8 bit yang dapat diaktifkan atau dinonaktifkan. Bit 7 dari INTCON dikenal sebagai GIE. Ini adalah Pengaktifan Interrngupt Global. Memperbaiki ini ke 1 memberi tahu PIC bahwa kami akan menggunakan interupsi.

Bit 4 dari INTCON dikenal sebagai INTE, INTerrupt Enable. Menempatkan bit ini ke 1 menyampaikan ke PIC bahwa RB0 akan menjadi pin interupsi. Mengkonfigurasi bit 3, disebut RBIE, memberi tahu PIc bahwa kita akan menggunakan Port B bit 4 hingga 7. Pada titik ini PIC memahami kapan pin ini bisa tinggi atau rendah, harus menghentikan apa yang dilakukannya dan melanjutkan dengan interupsi rutin. Pada titik ini, kita harus menginformasikan PIC apakah interupsi kemungkinan besar akan berada di tepi menaik (0V ke + 5V) atau tepi jatuh (+ 5V ke 0V) transformasi sinyal.

Sederhananya, apakah kita ingin PIC menginterupsi setiap kali sinyal bergerak dari rendah ke tinggi, atau dari tinggi ke rendah. Dengan kenakalan, ini dapat ditetapkan untuk ditempatkan di tepi menanjak.

Tepi 'memicu' dijadwalkan di register tambahan yang disebut register OPTION, di alamat 81h. Sedikit yang kami sukai adalah bit 6, sering disebut sebagai INTEDG.

Menyetel ini ke 1 memicu PIC untuk mengganggu tepi pemasangan (status default) dan menyetelnya ke 0 akan merangsang PIC untuk mengganggu di tepi geser. Jika Anda ingin PIC diaktifkan di tepi menanjak, Anda tentu tidak perlu melakukan apa pun untuk hal ini.

Pada titik ini, sayangnya, Option register ada di Bank 1, artinya kita senang mengubah dari bank 0 ke bank 1, atur bitnya di Option register, kemudian kembali ke bank 0. Kuncinya di sini adalah untuk mencapai setiap bit dari register Bank 1 dalam satu pemogokan, misalnya memasang pin port, kemudian kembali ke Bank 0 jika sudah selesai.

Baik, karena itu kami telah memberi tahu PIC pin mana yang mungkin akan menjadi interupsi, dan di mana edge untuk memicu, apa yang terjadi dalam program dan PIC setiap kali interupsi terjadi? Ada beberapa hal yang terjadi. Pertama-tama, sebuah 'bendera' dijadwalkan.

Ini memberi tahu prosesor internal PIC bahwa interupsi telah terjadi. Selanjutnya, penghitung program (yang saya bicarakan dalam tutorial sebelumnya) tip ke alamat tertentu dalam PIC. Mari kita segera periksa semua ini satu per satu. Bendera Interupsi Dalam register INTCON kami, bit 1 adalah bendera interupsi, disebut INTF. Pada titik ini, setiap kali interupsi muncul, flag ini kemungkinan besar akan ditetapkan ke 1.

Ketika tidak ada interupsi, bendera ditempatkan ke 0. Dan itu hampir semua selesai. Pada titik ini Anda mungkin merenungkan 'apa gunanya?' Tentunya, meskipun bendera ini dijadwalkan ke 1, PIC tidak dapat, dan tidak akan, bereaksi terhadap interupsi lain. Oleh karena itu, mari kita ungkapkan bahwa kita membawa interupsi. Bendera kemungkinan besar akan diperbaiki ke 1, dan PIC mungkin pergi ke rutinitas kita untuk mengerjakan interupsi.

Jika flag ini tidak ditetapkan ke 1, dan PIC diizinkan untuk terus menjawab interupsi, maka secara terus menerus menekan pin dapat membuat PIC kembali ke awal rutinitas interupsi kami, dan tidak berarti menyelesaikannya. Kembali ke ilustrasi saya tentang telepon, itu mirip dengan mengangkat telepon, dan segera setelah melanjutkan untuk membahasnya mulai berdering lagi karena orang lain ingin berbicara dengan Anda.

Dianjurkan untuk menyelesaikan satu dialog, lalu ambil telepon lagi untuk berbicara dengan orang berikutnya. Anda dapat menemukan masalah kecil dengan bendera ini. Meskipun PIC dengan cepat menyetel bendera ini ke 1, PIC tidak menyetelnya lagi 0! Aktivitas itu harus dilakukan oleh pemrogram - yaitu Anda. Ini dapat dilakukan dengan mudah, karena saya yakin, dan perlu dicapai setelah PIC melakukan rutinitas interupsi.

Lokasi Memori Kapanpun Anda pertama kali menyalakan PIC, atau jika ada reset, Penghitung Program tip ke alamat 0000h, yang bisa segera di awal dari memori program. Tapi, jika ada interupsi, Program Counter akan menunjukkan alamat 0004h.

Oleh karena itu, saat kita membuat program yang akan memiliki interupsi, pertama-tama kita harus memberi tahu PIC untuk melompati alamat 0004h, dan mempertahankan rutin interupsi yang dimulai pada alamat 0004h yang terpisah dari program lainnya.

Ini bisa dilakukan tanpa repot. Awalnya, kami memulai program kami dengan perintah yang dikenal sebagai ORG. Perintah ini menunjukkan Asal, atau mulai. Kami mematuhinya dengan alamat. Karena PIC dimulai pada alamat 0000h, kita ketik ORG 0000h. Setelah itu kita harus melewati alamat 0004h. Kami melakukannya dengan meletakkan instruksi GOTO, disertai dengan label yang menunjukkan tip untuk program utama kami.

Kami kemudian mengikuti perintah GOTO ini dengan satu ORG lagi, saat ini dengan alamat 0004h. Setelah perintah ini kita memasukkan rutinitas interupsi kita. Pada titik ini, kita mungkin bisa mengetikkan rutinitas interupsi kita langsung mengikuti perintah ORG kedua, atau kita bisa memposisikan pernyataan GOTO yang menunjuk ke rutin interupsi.

Ini benar-benar terkait dengan pilihan di pihak Anda. Untuk menginformasikan PIC yang ditawarkannya sampai pada kesimpulan dari rutinitas interupsi, kita harus memposisikan perintah RTFIE menjelang akhir rutinitas. Perintah ini menandakan kembali dari rutinitas interupsi. Sementara PIC memperhatikan hal ini, Penghitung Program menunjukkan ke posisi akhir PIC sebelum interupsi terjadi. Kami telah menetapkan di bawah bagian kode singkat untuk menampilkan di atas:

Ada beberapa hal yang harus Anda ketahui saat menggunakan interupsi. Yang pertama adalah bahwa jika Anda menggunakan register yang sama di program utama dan rutin interupsi, ingatlah bahwa detail register kemungkinan besar akan berubah ketika interupsi terjadi.

Sebagai contoh, mari kita gunakan register w untuk meneruskan data ke program utama Port A, oleh karena itu Anda juga dapat menggunakan register w dalam rutinitas interupsi untuk memindahkan data dari satu tujuan ke tujuan lainnya.

Jika Anda tidak berhati-hati, w register akan menyertakan nilai terakhir yang diterimanya saat berada dalam rutinitas interupsi, jadi ketika Anda kembali dari interupsi informasi ini akan dikirimkan ke Port A daripada nilai yang Anda miliki sebelumnya interupsi terjadi.

Cara di sekitar ini adalah untuk sementara menyimpan rincian register w sebelum Anda menggunakannya sekali lagi dalam rutinitas interupsi. Yang kedua adalah fakta bahwa Anda dapat menemukan penundaan antara saat satu interupsi terjadi dan saat interupsi berikutnya dapat muncul. Sementara Anda mengerti, PIC memiliki jam eksterior, yang bisa berupa kristal atau bisa juga kombinasi resistor-kapasitor.

Tidak peduli berapa frekuensi jam ini, PIC membaginya dengan 4 dan kemudian menggunakan ini untuk pengaturan waktu bagian dalam. Misalnya jika Anda memiliki kristal 4MHz yang terhubung ke PIC Anda, maka PIC akan melakukan instruksi pada 1MHz. Pengaturan waktu interior ini dikenal sebagai Siklus Instruksi. Pada titik ini, lembar data mengklaim (tidak diragukan lagi dalam cetakan kecil) bahwa Anda perlu mengaktifkan 3 hingga 4 putaran instruksi di antara interupsi.

Saya akan mengaktifkan 4 putaran. Alasan di balik penundaan adalah PIC membutuhkan waktu untuk melompat ke alamat interupsi, bendera, dan kembali dari rutinitas interupsi. Oleh karena itu, ingatlah ini jika Anda bekerja dengan sirkuit alternatif untuk mengaktifkan interupsi untuk PIC.

Pada titik ini, yang menjadi tujuan adalah fakta bahwa jika Anda menggunakan bit 4 hingga 7 dari Port B sebagai interupsi. Anda tidak dapat memilih pin tertentu pada Port B untuk berfungsi sebagai interupsi.

Oleh karena itu, jika Anda mengizinkan pin ini, kemungkinan besar semuanya bisa diperoleh. Oleh karena itu, misalnya, Anda tidak bisa begitu saja memiliki bit 4 dan 5 - bit 6 dan 7 kemungkinan akan diberdayakan pada saat yang bersamaan. Apa sebenarnya tujuan mendapatkan empat bit untuk mewakili interupsi? Tentunya, Anda mungkin memiliki sirkuit yang terhubung ke PIC, jika salah satu dari empat jalur naik, dalam hal ini mungkin masalah yang Anda perlukan PIC untuk mempengaruhi secara instan.

Salah satu ilustrasi dari hal ini dapat berupa alarm keamanan rumah, di mana empat sensor dihubungkan ke Port B pin 4 hingga 7. Setiap sensor spesifik dapat meminta PIC untuk memicu alarm, dan rutinitas pensinyalan alarm adalah rutinitas interupsi. Ini suku cadang memeriksa pelabuhan secara konstan dan memungkinkan PIC untuk melanjutkan dengan hal-hal yang berbeda. Dalam tutorial berikutnya, kita akan membuat program untuk mengelola interupsi.

Kami membahas banyak hal mendasar dalam tutorial terakhir, oleh karena itu saya merasa sudah waktunya kami menyusun program pertama kami.

Program yang akan kita tulis akan menghitung berapa kali kita menghidupkan sakelar, dan kemudian menunjukkan jumlahnya.

Program akan menghitung dari 0 hingga 9, dapat dilihat pada 4 LED dalam bentuk biner, bersama dengan input atau interupsi kemungkinan besar pada RB0.

Hal nomor satu yang harus kita lakukan adalah memberi tahu PIC untuk melompati alamat di mana Program Counter menunjuk setiap kali interupsi terjadi.

Anda akan mengamati bahwa Kami menggunakan metode unik untuk menunjukkan bilangan heksadesimal. Sebelum saya kebetulan menerapkan F9h di mana h menunjukkan heksadesimal. Kita bisa menulis ini sebagai 0xF9, yang merupakan struktur yang akan kita gunakan mulai sekarang.

Sekarang kita perlu memberi tahu PIC bahwa kita akan menggunakan interupsi, dan kita menggunakan RB0 pin 6 sebagai pin interupsi:

bsf INTCON, 7GIE - Aktifkan interupsi global (1 = aktifkan)
bsf INTCON, 4INTE - RB0 mengaktifkan interupsi (1 = aktifkan)
Saya akan menghapus bendera interupsi untuk berjaga-jaga (saya tidak pernah mempercayai apa pun!)
bcf INTCON, 1INTF - Hapus bit flag untuk berjaga-jaga

Saat ini kami harus membangun 2 pelabuhan kami. Perlu diingat bahwa karena kita sekarang menggunakan RB0 sebagai pin interupsi, ini perlu ditetapkan sebagai masukan:

Kami akan menggunakan variabel yang disebut JUMLAH untuk menyimpan jumlah sakelar. Kita bisa saja menaikkan nilai pada Port A, tetapi Anda akan melihat mengapa saya menggunakan variabel ketika kita menulis rutinitas interupsi kita.

Oleh karena itu, program utama kami disusun, dan pada titik ini kami harus memberi tahu PIC bagaimana melanjutkan kapan pun terjadi interupsi. Dalam contoh ini, interupsi kami mungkin akan menjadi sakelar. Yang kami inginkan adalah PIC satu ke COUNT yang dapat disesuaikan setiap kali sakelar dibatasi.

Namun demikian, kami hanya ingin menunjukkan berapa kali sakelar dimatikan dari 0 ke 9. Di atas, saya menyatakan bahwa kami mungkin dapat dengan mudah menaikkan nilai pada Port A setiap kali ada interupsi. Namun, Port A memiliki 5 bit, jika kita hanya menaikkan port, kita akan mendapatkan jumlah tertinggi 31. Ada beberapa penjelasan mengapa saya memilih untuk tidak naik ke 31.

Awalnya, kami akan menggunakan layar 7-segmen, yang paling banyak hanya dapat berubah dari 0 hingga 15 (0 ke F dalam hex). Selanjutnya, saya juga ingin menunjukkan kepada Anda beberapa perintah aritmatika yang Anda temukan dalam beberapa pelajaran terakhir.

Oleh karena itu kami akan melanjutkan rutinitas interupsi kami. Saat ini yang pertama harus kita selesaikan adalah menyimpan secara singkat detail w register kita, karena kita telah menerapkan ini untuk menggeser isi COUNT ke PORTA. Jika kami tidak menyimpannya, dalam kasus tersebut kami mungkin dapat mengirimkan angka yang sama sekali berbeda karena aritmatika kami. Oleh karena itu, mari kita selesaikan dulu:

Pada titik ini kami memahami jika nilai JUMLAH adalah 9 atau lebih. Yang perlu kita capai sekarang adalah jika COUNT lebih dari 9, letakkan kembali ke 0, atau kembali ke program utama untuk memastikan bahwa kita dapat mengirimkannya ke Port A. Perintah BTFSS karena Anda mengerti akan perintah berikutnya.
instruksi jika bendera carry dijadwalkan, yaitu JUMLAH = 10:

Satu-satunya hal yang tersisa untuk dilakukan sekarang adalah memasukkan secara kolektif serta menentukan nilai konstanta kami, yang dapat kami lakukan tepat di awal program kami.

Setiap kali Anda mengaktifkan sakelar, LED akan menghitung dalam biner dari 0000 hingga 1010 lalu kembali ke 0000.

Gambar berikut menunjukkan diagram sirkuit yang kompatibel dengan kode yang dijelaskan di atas. Menariknya Anda akan menemukan bahwa kapasitor timing telah disertakan dalam desain. Ini adalah taktik kecil yang bagus di mana Anda mendapatkan kebebasan untuk menghindari penyertaan kapasitor jika Anda tidak memilikinya selama waktu itu.

Di sini kapasitansi ikut bermain melalui kapasitansi nyasar di pin osilator dan ground.
Tentu saja ini mungkin bukan cara yang sangat cerdas untuk menghindari kapasitor secara praktis karena nilai nyasar dapat bervariasi dengan kondisi yang berbeda.

Bagian lain yang dapat disaksikan di sirkuit adalah jaringan yang mengecam di seluruh sakelar. Ini mencegah interferensi saat peralihan mekanis dan mencegah PIC menjadi bingung jika peralihan adalah satu atau beberapa sakelar.




Sepasang: Sirkuit Timer Motor Dua Arah yang Dapat Diprogram Berikutnya: Bagaimana Sirkuit Buck-Boost Bekerja