Pemrograman Mikrokontroler PIC

Mikrokontroler PIC adalah alat yang sangat berguna dan serbaguna untuk digunakan dalam banyak proyek elektronik. Mereka sangat murah dan mudah ditemukan. Mereka juga sangat kuat dan banyak yang mampu kecepatan hingga 64 MIPS menggunakan blok osilator internal, sekitar 16 kali lebih cepat daripada kebanyakan mikrokontroler AVR yang sebanding. PIC juga mudah diprogram, namun mengatur proyek terkadang bisa rumit. Instruksi ini akan berjalan melalui proses pengaturan perangkat lunak, membuat proyek baru, dan memprogram beberapa fungsi yang sangat sederhana untuk menguji konfigurasi dan memastikan semuanya berfungsi. Mereka dirancang untuk berakhir sangat terbuka; setelah proyek dibuat dan dasar-dasar selesai pembaca didorong untuk menjelajahi semua fitur dan tambahan yang tidak tercakup dalam instruksi ini. Anda juga akan menemukan bahwa instruksi ini akan mulai berjalan selangkah demi selangkah, tetapi ketika instruksi mendekati akhir pembaca didorong untuk mengeksplorasi cara-cara lain dalam menyelesaikan tugas dan membuat proyek menjadi tugas mereka sendiri.

Apa yang Anda perlukan Untuk membangun proyek dengan mikrokontroler PIC hanya memerlukan beberapa item.

  • Mikrokontroler PIC
    • Instruksi-instruksi ini untuk pemrograman seri PIC18F MCU, meskipun yang lain serupa.
    • Diperoleh dari situs web Microchips.
    • Microchip memungkinkan siswa dengan alamat email .edu yang valid, sampel PIC gratis!
    • PIC yang saya gunakan untuk membuat instruksi ini adalah PIC18F22K80
  • PICkit 3 In-Circuit Debugger
    • Tersedia dari Microchip.
    • Biaya $ 45 untuk masyarakat umum, dan # 34 dengan diskon siswa jika Anda memiliki alamat email .edu.
    • Ada juga programmer lain yang akan bekerja dengan baik; namun, ini yang terbaik untuk memulai.
  • Papan tempat memotong roti dan kabel papan tempat memotong roti
  • LED, tombol, potensiometer, atau apa pun yang ingin Anda sambungkan ke PIC

Langkah 1: Bangun Perangkat Keras

Sebelum melakukan pemrograman apa pun, langkah pertama adalah membangun perangkat keras. Meskipun portofolio PIC18F sangat besar, banyak chip memiliki beberapa kesamaan. Untuk informasi lebih rinci, lihat bagian "Pedoman untuk Memulai dengan Mikrokontroler PIC18Fxxxx" di lembar data perangkat Anda. Untuk detail pin-out mikrokontroler PIC, lihat bagian "Diagram Pin" di lembar data perangkat Anda.

Catatan: VDD = Tegangan Positif dan VSS = Tanah.
  1. Hubungkan pin MCLR melalui resistor 1kΩ ke VDD.
  2. Hubungkan kapasitor 0, 1μF antara setiap pasangan pasangan VDD-VSS yang berdampingan atau pasangan AVDD-AVSS.
  3. Hubungkan kapasitor 10μF antara VCAP dan Vss.
  4. Hubungkan pin MCLR ke pin 1 dari PICkit 3.
  5. Hubungkan VDD ke pin 2 dari PICkit 3.
  6. Hubungkan VSS ke pin 3 dari PICkit 3.
  7. Hubungkan pin PGD ke pin 4 dari PICkit 3.
  8. Hubungkan pin PGC ke pin 5 dari PICkit 3.
  9. Biarkan pin 6 dari PICkit 3 tidak terhubung.
  10. Hubungkan input analog ke pin dengan fungsi ANx di mana x adalah angka.
  11. Hubungkan input atau output digital ke pin dengan fungsi Rxy di mana x adalah huruf yang mengidentifikasi port, dan y adalah angka yang mengidentifikasi bit.
Sebagai contoh saya, saya memiliki LED yang terhubung antara RA0 dan ground, penghapus potensiometer yang terhubung ke AN1, dan saklar DPST yang terhubung ke RA2. Anda mungkin lebih mudah untuk memprogram PIC jika Anda telah membuat skematis skema Anda.

Langkah 2: Dapatkan Perangkat Lunak

Petunjuk ini akan menggunakan kompiler XC8 dan MPLAB X IDE oleh Microchip. Langkah ini akan menjelaskan cara mendapatkan alat-alat ini dan memastikan mereka telah diinstal dengan benar.
  1. Untuk mendapatkan versi terbaru perangkat lunak, kunjungi situs web Microchips di //www.microchip.com/pagehandler/en-us/family/mplabx/
  2. Pilih perangkat lunak untuk OS Anda dan ikuti instruksi instalasi standar.
Catatan: Jika Anda menggunakan Windows 8 Anda mungkin perlu menjalankan installer dalam mode kompatibilitas untuk Windows 7.
  1. Setelah perangkat lunak diinstal, mulai MPLAB X
  2. Di bilah menu pilih Alat-> Opsi
  3. Dalam dialog Opsi pilih tab Tertanam dan pastikan XC8 terdaftar dalam daftar Toolchain.
  4. Jika terdaftar, pilih OK dan lanjutkan ke langkah berikutnya.
  5. Jika tidak terdaftar pastikan instilasi telah selesai, dan klik tombol Pindai Alat Bangun.
  6. Jika masih belum terdaftar, lihat di forum Microchips untuk bantuan dengan masalah spesifik Anda.

Langkah 3: Buat Proyek Baru

Pada langkah ini kita akan membuat proyek baru berdasarkan templat dari Microchip.
  1. Pada bilah menu pilih File-> Proyek Baru ...
  2. Dalam kotak dialog file baru memperluas Sampel dan pilih Microchip Tertanam
  3. Dalam kotak proyek pilih Template PIC18 C
  4. Pilih Berikutnya
  5. Beri proyek nama yang Anda suka
  6. Pilih lokasi untuk menyimpan proyek ke dalam kotak Lokasi Proyek
  7. Biarkan Folder Proyek sebagai opsi default
  8. Centang kotak "Set as Main Project"
  9. Pilih Selesai
Proyek sekarang akan muncul di Project Explore di sisi kiri layar.

Langkah 4: Bangun Parameter

Sebelum kita memulai pemrograman, kita perlu mengatur parameter build.
Buat Konfigurasi
  1. Klik kanan pada nama proyek di bilah alat proyek.
  2. Dalam dialog Properti Proyek pilih Kelola Konfigurasi ...
  3. Dalam dialog Konfigurasi, pilih Baru
  4. Dalam dialog Nama Konfigurasi Baru, masukkan Default dan klik OK
  5. Dalam dialog Konfigurasi, pastikan Default dipilih dan klik Set Active
  6. Klik OK di dialog Konfigurasi
Setel Properti Konfigurasi
  1. Dalam dialog Project Properties pilih "Conf: [Default]" di daftar Categories
    1. Di kotak Perangkat ketik nama perangkat yang Anda gunakan. Dalam kasus saya PIC18F26K80
    2. Dalam daftar Alat Perangkat Keras pilih PICkit3
    3. Di Compiler Toolchain pilih XC8 (v ...) Di mana ... adalah versi yang telah Anda instal.
    4. Pilih Terapkan
  2. Di bawah Conf: [Default] pilih PICkit 3
    1. Untuk kategori Opsi, pilih Daya
    2. Periksa "Sirkuit target daya dari PICkit3
    3. Pilih Terapkan.
  3. Di bawah Conf: [Default] pilih compiler XC8
    1. Untuk kategori Opsi pilih Optimasi
    2. Setel "Set Optimasi" menjadi "tidak ada"
    3. Pilih Terapkan
  4. Klik OK untuk menutup kotak dialog
Uji Konfigurasi Untuk menguji konfigurasi klik tombol bersih dan bangun (tombol dengan palu dan sapu). Teks akan mulai bergulir di jendela output di bagian bawah halaman. Jika semuanya berhasil, teks ini akan mengatakan BUILD SUCCESSFUL (total waktu: ...) . Jika Anda mendapatkan kesalahan, kembali ke langkah ini untuk memastikan bahwa Anda tidak melewatkan apa pun, dan semuanya telah diterapkan.

Langkah 5: Atur Bit Konfigurasi

Langkah selanjutnya adalah mengatur bit konfigurasi. Bit konfigurasi memberi tahu MCU kondisi awal saat dihidupkan. Mereka digunakan untuk mengatur sumber dan kecepatan jam, konfigurasi waktu pengawas, dan fitur serupa lainnya. Bit konfigurasi tergantung pada perangkat, jadi periksa lembar data untuk chip yang Anda gunakan untuk informasi lebih lanjut.
  1. Dalam proyek explorer perluas File Sumber dan buka configuration_bits.c
  2. Hapus semua teks di bawah baris # endif
  3. Perhatikan tab baru telah dibuka di bagian bawah layar
  4. Atur bit sesuai kebutuhan untuk proyek Anda. Karena ini tergantung chip, periksa lembar data untuk informasi lebih lanjut tentang apa yang masing-masing lakukan. Beberapa pengaturan umum mengikuti:
    1. Extended Instruction Set - Seharusnya diatur ke OFF saat menggunakan template
    2. Oscillator - Digunakan untuk memilih prosesor. Kecuali jika Anda menggunakan kristal eksternal, biarkan ditetapkan sebagai osilator RC Internal. Lihat lembar data untuk konfigurasi osilator lainnya. Catatan: CLKOUT akan memungkinkan untuk debugging lebih mudah, dan harus diaktifkan jika tersedia.
    3. Aktifkan PLL - Akan memungkinkan penggunaan PLL di masa depan. Catatan: ini tidak akan menyalakan PLL, itu hanya akan mengaktifkannya. Disarankan untuk mengaktifkannya.
    4. Timer Watchdog - Timer dog watch digunakan untuk memastikan prosesor tidak akan terkunci. Namun itu membuatnya lebih sulit untuk di-debug. Dianjurkan untuk menonaktifkannya saat awalnya pemrograman, dan hanya mengaktifkannya setelah proyek hampir selesai.
    5. Kode / Tabel Tulis / Baca melindungi - Digunakan untuk menonaktifkan penulisan atau membaca ke rentang memori tertentu. Biarkan semua ini dinonaktifkan.
    6. Jika tidak yakin tentang pengaturan, biasanya aman untuk membiarkannya sebagai pengaturan default.
  5. Setelah semua bit konfigurasi telah ditetapkan, klik tombol "Hasilkan Kode Sumber untuk Output" di bagian bawah panel.
  6. Panel sekarang akan beralih ke tab Output. Pilih semua teks di tab ini dan salin ke papan klip
  7. Rekatkan di bagian bawah file configuration_bits.c dan simpan.
  8. Bersihkan dan bangun proyek lagi dengan mengklik ikon sapu dan palu.
  9. Pastikan pembangunan berhasil. Periksa juga untuk memastikan tidak ada kesalahan dalam output
Jika semuanya berhasil, lanjutkan ke langkah berikutnya. Jika ada kesalahan atau peringatan, perbaiki sebelum melanjutkan.

Langkah 6: Konfigurasikan Osilator

Langkah selanjutnya adalah memulai pemrograman; namun, sebelum kita sampai ke kode aplikasi kita harus memprogram kode sistem. Kode sistem adalah fungsi tingkat rendah seperti mengkonfigurasi osilator dan fungsi penundaan dasar.

Menentukan Pengaturan

Sebelum kita dapat memprogram pengaturan, kita harus memilih kecepatan yang ingin kita jalankan. Untuk contoh ini saya akan menggunakan 16MHz karena kebanyakan PIC dapat berjalan pada kecepatan ini. Untuk konfigurasi saya, saya akan menggunakan postscaller 4MHz dari HF-INTOSC, dan 4x PLL memberikan frekuensi output 4MHz * 4x = 16MHz
  1. Di lembar data, temukan bagian yang berlabel Konfigurasi Osilator
  2. Hal pertama yang tercantum dalam bagian ini adalah Jenis Osilator. Jika Anda menggunakan osilator internal, gunakan pengaturan yang berkaitan dengan INTIO1
  3. Pada satu atau dua halaman berikutnya Anda akan menemukan gambar skematis dari osilator yang sama dengan yang ditunjukkan. Sangat membantu untuk melacak sinyal pada gambar ini untuk memastikan kecepatan yang benar sedang dipilih.
  4. Langkah selanjutnya adalah memprogram pengaturan ini ke MCU. Ini dilakukan dengan mengatur register. Register pertama yang ditetapkan adalah OSCCON.
    1. IDLEN - digunakan untuk mengontrol aksi perintah tidur. Dapat dibiarkan sebagai default.
    2. IRCF - Pilihan Osilator. Karena saya menggunakan HF-INTOSC / 4 (4MHz) saya perlu mengatur ini ke nilai biner 101
    3. OSTS - Hanya baca sedikit
    4. HFIOFS - Hanya baca sedikit
    5. SCS - clock pilih bits. Karena saya menggunakan osilator internal, saya akan mengatur ke 1x di mana x dapat menjadi 0 atau 1
  5. Register berikutnya adalah OSCCON2; Namun, register ini kebanyakan hanya baca dan tidak penting pada saat ini
  6. Register konfigurasi osilator terakhir adalah OSCTUNE. Kami tidak akan menyetel frekuensi untuk proyek ini, namun kami harus menggunakan register ini untuk menghidupkan PLL menggunakan bit PLLEN.

Pengaturan Aplikasi

  1. Kembali ke MPLAB
  2. Dalam proyek explorer di bawah File Sumber, buka system.c
  3. Di bagian bawah file ini adalah fungsi ConfigureOscillator. Hapus komentar di fungsi itu.
  4. Untuk mengatur bit tipe register dalam semua huruf besar nama register, diikuti oleh bit kata huruf kecil dan kemudian sebuah periode dan nama bit.
  5. Untuk mengatur bit, ikuti itu dengan tanda sama dengan. Untuk menggunakan tipe biner 0bXXXX di mana XXXX adalah nomor biner. Terakhir akhiri garis dengan titik koma.
  6. Atur semua bit seperti yang ditentukan di atas untuk register OSCCON. Contoh: OSCCONbits.IRCF = 0b101;
  7. Lakukan hal yang sama untuk semua register osilator yang dibutuhkan lainnya. Lihat di bawah untuk contoh fungsi ConfigureOscillator yang sudah jadi.
  8. Setelah selesai membangun dan periksa peringatan / kesalahan

 / ** * Konfigurasikan sumber dan kecepatan jam * / void ConfigureOscillator (void) {OSCCONbits. IRCF = 0b101; OSCCONbits. SCS = 0b00; OSCTUNEbits. PLLEN = 0b1; } 

Langkah 7: Tunggu Fungsi Milli-Second

Salah satu fungsi yang paling berguna adalah wait_ms. Namun ini bukan fungsi di perpustakaan standar, dan perlu diprogram oleh Anda. Untuk implementasi ini akan ada loop yang akan menahan prosesor sampai waktu yang diberikan telah berlalu.

Mikrokontroler PIC18F membutuhkan 4 siklus clock untuk menjalankan satu baris kode rakitan. Oleh karena itu dengan clock 16MHz, saluran akan dieksekusi pada 4 juta baris per detik = 4000 baris per mili detik. Karena for for akan mengambil satu instruksi setiap kali untuk perbandingan, dan dua untuk operasi satu untuk body of loop, itu akan bekerja dengan sempurna. Kita hanya perlu for loop to loop 1000 kali per mili-detik.
  1. Di system.c buat fungsi baru di bagian bawah file ketik void wait_ms (waktu uint16_t)
  2. Di bawah ini adalah fungsi yang selesai
 / ** * Tunggu beberapa mili detik menggunakan skema tunggu sibuk. * @param waktu - waktu dalam ms untuk menunggu. * / membatalkan wait_ms (waktu uint16_t) {static long timel = 0; timel = waktu * 1000l; untuk (; timel; timel -); // tidak ada kondisi awal, sementara waktu> 0, waktu pengurangan setiap loop} 
  1. Buka system.h di folder File Header di browser proyek
  2. Pada akhirnya tambahkan baris void wait_ms (uint16_t); untuk membuat prototipe fungsi.
  3. Ubah baris 8 dari 8000000L ke 16000000L
  4. Bangun dan periksa kesalahan / peringatan

Langkah 8: Kedipkan LED

Cara terbaik untuk menguji apakah semuanya sudah diatur dengan benar adalah dengan mengedipkan lampu LED. Jika lampu berkedip pada tingkat yang diharapkan maka semuanya telah dikonfigurasikan dengan benar. Dalam contoh ini LED terhubung ke PORT A, Pin 0 (RA0 pada datasheet). Jika LED Anda terhubung ke pin yang berbeda, gunakan register dan bit yang sesuai.
  1. Buka main.c di penampil proyek di bawah file sumber.
Fungsi void main (void) adalah titik masuk utama program. Ketika kekuatan MCU pertama di atasnya akan masuk ke dalam fungsi ini. Baris pertama memanggil fungsi ConfigureOscillator yang Anda isi untuk mengatur sumber dan kecepatan jam. Baris berikutnya memanggil InitApp, sebuah fungsi yang akan segera kita isi, dan akhirnya memasuki loop tak terbatas. Karena tidak ada sistem operasi untuk fungsi kembali, tidak ada panggilan balik di akhir.
Fungsi yang sudah selesai akan terlihat seperti ini:
  1. Langsung di atas loop sementara tambahkan kode berikut.
    1. Tetapkan pin LED sebagai output - TRISAbits.TRISA0 = 0; // mengatur bit TRIS ke 0 set sebagai output, mengatur ke 1 set sebagai input
  2. Di dalam loop sementara tambahkan kode berikut
    1. Atur LED ke OFF - LATAbits.LATA0 = 0; // bit LAT mengontrol output dari pin. 0 = RENDAH, 1 = TINGGI
    2. Tunggu 1/2 detik - wait_ms (500);
    3. Atur LED ke ON - LATAbits.LATA0 = 1;
    4. Tunggu 1/2 detik - wait_ms (500);
 void main (void) {/ * Konfigurasikan osilator untuk perangkat * / ConfigureOscillator (); / * Inisialisasi I / O dan Periferal untuk aplikasi * / InitApp (); TRISAbits.TRISA0 = 0; // tetapkan pin sebagai output sementara (1) {LATAbits.LATA0 = 0; // atur pin LOW wait_ms (500); // tunggu 0, 5 detik LATAbits.LATA0 = 1; // atur pin HIGH wait_ms (500); // tunggu 0, 5 detik}} 
  1. Bangun program dan periksa kesalahan atau peringatan
  2. Pastikan PICkit terhubung dengan benar ke PIC dan komputer
  3. Klik tombol make dan program perangkat (tombol di sebelah kanan tombol clean and build)
  4. Jika diminta pilih PICkit 3 dan klik OK
  5. Ketika peringatan menunjukkan periksa ganda Anda memiliki PIC yang benar di sirkuit dan klik OK
  6. Jika peringatan menunjukkan tentang ID Perangkat Target, klik OK untuk mengabaikannya

Langkah 9: Membaca Nilai Analog

Sejauh ini program tersebut dapat berkedip LED. Selanjutnya mari kita berikan beberapa input pengguna. Kami akan menggunakan potensiometer untuk membuat sinyal analog yang akan mengubah kecepatan LED. ADC mengambil tegangan analog, dan menghasilkan nilai digital.
  1. Dalam browser proyek buka user.c di bawah File Sumber
  2. Di atas fungsi InitApp, buat fungsi baru void init_adc(void)
  3. Masukkan kode berikut untuk menginisialisasi modul ADC
 / ** * Inisialisasi Pengonversi Analog ke Digital. * / void init_adc (void) {TRISAbits. TRISA1 = 0b1; // atur pin sebagai input ANCON0bits. ANSEL1 = 0b1; // atur pin sebagai ADCON1bits analog. VCFG = 0b00; // atur v + referensi ke Vdd ADCON1bits. VNCFG = 0b0; // atur v- referensi ke GND ADCON1bits. CHSN = 0b000; // atur input negatif ke GND ADCON2bits. ADFM = 0b1; // benar membenarkan output ADCON2bits. ACQT = 0b110; // 16 TAD ADCON2bits. ADCS = 0b101; // gunakan Fosc / 16 untuk clock source ADCON0bits. ADON = 0b1; // nyalakan ADC} 
  1. Selanjutnya buat fungsi lain segera setelah dipanggil uint16_t adc_convert(uint8_t channel)
 / ** * Memformat konversi analog ke digital. * @param saluran Saluran input ADC untuk digunakan. * @return Nilai konversi. * / uint16_t adc_convert (saluran uint8_t) ADRESL; // kembalikan hasilnya 
  1. Dalam fungsi InitApp tambahkan baris init_adc()
  2. Dalam file user.h tambahkan prototipe uint16_t adc_convert(uint8_t);
  3. Ubah main untuk mencocokkan yang berikut ini:
 void main (void) {uint16_t adc_value; // variabel untuk menahan hasil konversi ADC di / * Konfigurasikan osilator untuk perangkat * / ConfigureOscillator (); / * Inisialisasi I / O dan Periferal untuk aplikasi * / InitApp (); TRISAbits. TRISA0 = 0; // atur pin sebagai output saat (1) {LATAbits. LATA0 = 0; // atur pin RENDAH adc_value = adc_convert (1); // konversi A / D sebelumnya pada saluran 1 wait_ms (adc_value>> 2); // tunggu 0, 5 detik LATAbits. LATA0 = 1; // atur pin HIGH adc_value = adc_convert (1); // konversi A / D sebelumnya pada saluran 1 wait_ms (adc_value>> 2); // tunggu 0, 5 detik}} 
  1. Buat dan unduh kodenya. Saat Anda memutar POT, kecepatan LED akan berubah

Langkah 10: Baca Nilai Digital

Selanjutnya mari kita dapatkan input digital dari switch. Ketika sakelar mati, kami akan membuat program melakukan apa yang telah dilakukan selama ini, dan ketika sakelar itu menyala, program akan menyalakan padatan LED hingga sakelar dimatikan lagi.
  1. Untuk mengatur pin sebagai input, tulis 1 ke pin tersebut TRISAbits.TRISA2 = 1; register bit - TRISAbits.TRISA2 = 1;
  2. Jika pin berbagi fitur analog, mungkin perlu mengaturnya ke digital dengan menghapus bit yang sesuai dalam register ANCONx
  3. Saat menulis nilai ke pin, gunakan register LAT; namun, ketika membaca nilai dari pin menggunakan register PORT - value = PORTAbits.RA2;
  4. Ubah main ke yang berikut:
 void main (void) {uint16_t adc_value; // variabel untuk menahan hasil konversi ADC di / * Konfigurasikan osilator untuk perangkat * / ConfigureOscillator (); / * Inisialisasi I / O dan Periferal untuk aplikasi * / InitApp (); TRISAbits. TRISA0 = 0; // atur pin sebagai TRISAbits keluaran. TRISA2 = 1; // atur pin sebagai input ANCON0bits. ANSEL2 = 0; // atur pin sebagai digital while (1) {if (PORTAbits. RA2) // jika pinnya tinggi {LATAbits. LATA0 = 1; // atur pin sebagai tinggi} selain // jika pin rendah {// berkedipkan LATAbits LED. LATA0 = 0; // atur pin RENDAH adc_value = adc_convert (1); // konversi A / D sebelumnya pada saluran 1 wait_ms (adc_value>> 2); // tunggu beberapa saat LATAbits. LATA0 = 1; // atur pin HIGH adc_value = adc_convert (1); // konversi A / D sebelumnya pada saluran 1 wait_ms (adc_value>> 2); // tunggu beberapa saat}}} 

Hanya itu saja! Anda sekarang memiliki pengetahuan dasar tentang cara mengatur proyek baru, membaca dan menulis ke pin digital, dan cara membaca dari pin analog. Tiga fitur ini akan memungkinkan Anda untuk melakukan 90% dari proyek menggunakan PIC di Internet. Selain itu, saat Anda melanjutkan eksplorasi ke dalam mikrokontroler PIC, Anda akan menemukan bahwa sebagian besar fitur lain memerlukan langkah-langkah yang sangat mirip untuk mengonfigurasi periferal, dan membaca serta berhak mendaftar.

Artikel Terkait