Dalam tutorial kami sebelumnya, kami belajar tentang Blinking LED menggunakan mikrokontroler PIC dan membangun sirkuit yang sama di papan Perf. Kemudian kami menggunakan PICkit 3, ICSP dan MPLAB IPE untuk membuang program ke papan Perf kami. Sekarang, dalam tutorial ini kita akan memajukan diri kita untuk menggunakan lebih banyak pin pada mikrokontroler PIC. Kami akan menggunakan 7 output (LED) dan satu Input. Untuk tutorial ini kita akan menggunakan papan Perf lama (ditunjukkan di bawah) dan akan menambahkan tongkat berg untuk menarik pin yang diperlukan ke papan LED kedua. Di akhir tutorial ini kita akan Menghasilkan Urutan Blinking LED menggunakan mikrokontroler PIC PIC16F877A dan akan belajar bagaimana menggunakan beberapa input dan output, beberapa dasar-dasar tentang 'for' loop dan pemanggilan fungsi.
Papan LED tidak lain adalah papan kinerja lain, di mana kami akan menyolder LED dengan Resistor pembatas arus (ditunjukkan di bawah). Kami juga akan menambahkan tombol tekan untuk memulai urutan LED berkedip.
Diagram Sirkuit:
PIC Mikrokontroler PIC16F877A LED Kode Urutan Berkedip dan Penjelasan Kerja:
Kode Lengkap telah diberikan di bawah ini (periksa di bagian akhir), di sini kita akan mendapatkannya melalui baris demi baris. Kode ini akan mulai menyalakan LED secara berurutan saat tombol ditekan. Untuk memahami urutannya, tonton video di akhir tutorial. Saya akan merekomendasikan Anda untuk membandingkan output yang ditampilkan dalam video dengan kode di bawah ini dan mencoba memahami programnya.
Mari kita lihat kode baris demi baris. Beberapa baris pertama adalah untuk menyiapkan bit konfigurasi yang telah dijelaskan di tutorial sebelumnya jadi saya melewatkannya untuk saat ini. Cara terbaik untuk memahami program apa pun adalah memulai dari fungsi main ( void main () ), jadi mari kita lakukan
TRISB0 = 1; // Perintahkan MCU bahwa PORTB pin 0 digunakan sebagai input untuk tombol. TRISD = 0x00; // Perintahkan MCU bahwa semua pin adalah keluaran PORTD = 0x00; // Inisialisasi semua pin ke 0
Kata TRIS digunakan untuk mendefinisikan apakah pin digunakan sebagai input / output dan kata PORT digunakan untuk membuat pin High / Low. Garis TRISB0 = 1 akan menjadikan pin ke-0 dari PORT B sebagai input. Ini akan menjadi tombol tekan kami. Garis TRISD = 0x00; PORTD = 0x00; akan menjadikan semua pin port D sebagai Output dan menetapkan nilai awal LOW ke pin tersebut.
Karena kami mengatakan bahwa B0 digunakan sebagai input, kami akan menghubungkan salah satu ujung tombol tekan ke pin B0 dan ujung lainnya ke ground. Saat itu, setiap kali kita menekan tombol, pin akan tertahan di tanah seperti yang ditunjukkan pada diagram koneksi di atas. Namun untuk mewujudkan hal tersebut kita harus menggunakan resistor pull up agar pin akan tertahan tinggi saat tombol tidak ditekan. Sebuah resistor pull up adalah seperti ini.
Tetapi PIC MCU kami memiliki resistor pull up internal yang lemah yang dapat diaktifkan oleh perangkat lunak sehingga menghemat banyak kerumitan (ketika lebih banyak tombol harus dihubungkan).
Apa itu resistor pull up yang lemah?
Ada dua jenis resistor pull up, yaitu Weak Pull Up dan Strong Pull Up. Resistor pull up yang lemah memiliki nilai tinggi dan dengan demikian memungkinkan arus yang lemah untuk mengalir dan resistor pull up yang kuat memiliki nilai rendah sehingga memungkinkan arus yang kuat untuk mengalir. Semua MCU kebanyakan menggunakan resistor pull up yang lemah. Untuk mengaktifkan ini di PIC MCU kami, kami harus melihat ke dalam lembar data kami untuk OPTION_REG (daftar opsi) seperti yang ditunjukkan pada snapshot di bawah ini.
Seperti yang ditunjukkan, bit 7 berhubungan dengan resistor pull up yang lemah. Ini harus dibuat nol untuk mengaktifkannya. Ini dilakukan oleh OPTION_REG <7> = 0 . Ini secara khusus berhubungan dengan bit 7 membiarkan bit lainnya ke nilai defaultnya. Dengan ini kita masuk ke while loop kita, di mana ia memeriksa apakah tombol ditekan dengan menggunakan if (RB0 == 0). Jika kondisinya terpenuhi kita memanggil fungsi kita dengan parameter 1, 3, 7 dan 15.
kedip (1); // FUNGSI PANGGILAN 1 dengan parameter 1 sblink (3); // FUNCTION CALL 3 dengan parameter 3 sblink (7); // FUNCTION CALL 7 dengan parameter 7 sblink (15); // FUNCTION CALL 4 dengan parameter 15
Mengapa kami menggunakan fungsi?
Fungsi digunakan untuk mengurangi jumlah baris dalam kode kita. Inilah yang kebanyakan dari kita pasti tahu. Tetapi mengapa kita perlu mengurangi jumlah baris, terutama jika menyangkut pemrograman MCU. The alasannya adalah ruang terbatas di memori Program kami. Jika kita tidak mengoptimalkan kode dengan benar, kita mungkin kehabisan ruang memori. Ini akan berguna saat kita menulis halaman kode yang panjang.
Setiap fungsi akan memiliki fungsi Definisi ( sblink (int get) dalam kasus kami) dan panggilan fungsi ( sblink (1) dalam kasus kami). Ini adalah opsional untuk memiliki deklarasi fungsi, untuk menghindarinya saya telah menempatkan definisi fungsi saya sebelum memanggil fungsi tersebut ke dalam fungsi utama saya.
Parameter fungsi adalah nilai yang akan diteruskan dari pemanggilan fungsi ke definisi fungsi. Dalam kasus kita, nilai integer (1, 3, 7, 15) adalah parameter yang dikirimkan dari pemanggilan fungsi dan variabel "get" mendapatkan nilai parameter ke dalam definisi fungsi untuk memprosesnya. Suatu fungsi dapat memiliki lebih dari satu parameter.
Setelah fungsi dipanggil, baris di bawah ini dalam definisi fungsi akan dijalankan.
untuk (int i = 0; i <= 7 && RB0 == 0; i ++) {PORTD = get << i; // LED bergerak Urutan Kiri __delay_ms (50); } untuk (int i = 7; i> = 0 && RB0 == 0; i--) {PORTD = get << i; // LED bergerak Urutan Kiri __delay_ms (50); }
Sekarang baris ini tampak aneh: PORTD = get << i . Saya akan menjelaskan apa yang sebenarnya terjadi di sini.
"<<" adalah operator shift kiri yang menggeser semua bit ke posisi kirinya. Sekarang ketika kita memanggil fungsi sblink (int get) dengan parameter '1' sebagai sblink (1), itu akan membuat nilai 'get' sebagai 1, yang dalam biner adalah 0b00000001. Maka baris ini akan menjadi seperti PORTD = 0b00000001 << i .
Nilai "i" akan bervariasi dari 0 sampai 7 karena kita telah menggunakan 'for loop' untuk (int i = 0; i <= 7 && RB0 == 0; i ++). Nilai 'i' dari 0 menjadi 7 akan mengubah hasil seperti berikut:
Seperti yang Anda lihat, kami telah MENGAKTIFKAN satu LED pada satu waktu (dari kiri ke kanan) dengan membiarkan sisanya MATI. 'For loop' berikutnya untuk (int i = 7; i> = 0 && RB0 == 0; i--) , juga akan melakukan hal yang sama tetapi kali ini LED akan DIHIDUPKAN dari kanan ke kiri secara berurutan, saat kami mulai dari 7 dan turun ke 0. Kami telah menggunakan penundaan 200ms sehingga kami dapat memvisualisasikan LED sedang dinyalakan dan dimatikan.
Sekarang ketika kita melewatkan nilai 3 pada fungsi sblink (int get) , maka fungsi sblink (3) akan dieksekusi yang menjadikan nilai 'get' sebagai 0b00000011, maka hasil pada PORTD adalah:
Jadi sekarang kali ini dua LED akan menyala pada waktu tertentu dengan menggunakan sblink (3). Demikian pula untuk sblink (7) dan sblink (15), tiga dan empat LED akan ON secara berurutan. Setelah ini selesai, kita akan membuat semua LED menyala menggunakan garis PORTD = 0xFF . Periksa Video di bawah ini untuk Demonstrasi lengkap.
Harap Anda telah memahami kode dan dengan demikian telah belajar bagaimana menggunakan fungsi, loop 'for' dan 'while' untuk mendapatkan keluaran yang Anda inginkan. Sekarang Anda dapat mengubah kode untuk mendapatkan urutan kedipan LED yang berbeda. Silakan kompilasi kode Anda dan letakkan di MCU Anda dan nikmati hasilnya. Anda dapat menggunakan bagian komentar jika Anda terjebak di suatu tempat. Saya juga telah melampirkan file simulasi dan program di sini.
Itu saja untuk saat ini di tutorial berikutnya kita akan belajar cara menggunakan timer PIC16F877A daripada menggunakan fungsi penundaan. Anda dapat menelusuri semua tutorial mikrokontroler PIC di sini.