- Persyaratan:
- Pemrograman Mikrokontroler PIC untuk Komunikasi UART:
- Simulasi program kami:
- Pengaturan Perangkat Keras dan Menguji output:
Dalam tutorial ini kita belajar Mengaktifkan komunikasi UART dengan Mikrokontroler PIC dan cara mentransfer data ke dan dari Komputer Anda. Sejauh ini, kami telah membahas semua modul dasar seperti ADC, Timer, PWM dan juga telah mempelajari cara menghubungkan LCD dan tampilan 7-Segmen. Sekarang, kami akan melengkapi diri kami dengan alat komunikasi baru bernama UART yang banyak digunakan di sebagian besar proyek Mikrokontroler. Lihat di sini Tutorial Mikrokontroler PIC lengkap kami menggunakan MPLAB dan XC8.
Di sini kita telah menggunakan PIC16F877A MCU, ia memiliki modul yang disebut "Penerima dan Pemancar Asinkron Universal Sinkron Beralamat" yang dikenal sebagai USART. USART adalah sistem komunikasi dua kabel di mana data mengalir secara serial. USART juga merupakan komunikasi dupleks penuh, artinya Anda dapat mengirim dan menerima data pada saat yang sama yang dapat digunakan untuk berkomunikasi dengan perangkat periferal, seperti terminal CRT dan komputer pribadi.
The USART dapat dikonfigurasi dalam mode berikut:
- Asinkron (dupleks penuh)
- Sinkron - Master (setengah dupleks)
- Sinkron - Budak (setengah dupleks)
Ada juga dua mode berbeda yaitu mode 8-bit dan 9-bit, dalam tutorial ini kita akan mengkonfigurasi modul USART agar bekerja dalam mode Asynchronous dengan sistem komunikasi 8-bit, karena ini adalah jenis komunikasi yang paling banyak digunakan. Karena asynchronous, tidak perlu mengirim sinyal clock bersama dengan sinyal data. UART menggunakan dua jalur data untuk mengirim (Tx) dan menerima (Rx) data. Dasar kedua perangkat juga harus dibuat sama. Jenis komunikasi ini tidak berbagi jam yang sama sehingga kesamaan sangat penting agar sistem dapat bekerja.
Di akhir tutorial ini Anda akan dapat membangun komunikasi (UART) antara komputer Anda dan Mikrokontroler PIC Anda dan mengaktifkan LED pada papan PIC dari laptop Anda. Status LED akan dikirim ke laptop Anda dari PIC MCU. Kami akan menguji output menggunakan Hyper Terminal di komputer. Video Detil juga diberikan di akhir tutorial ini.
Persyaratan:
Perangkat keras:
- Papan Perf PIC16F877A
- Modul konverter RS232 ke USB
- Komputer
- Programmer PICkit 3
Perangkat lunak:
- MPLABX
- HyperTerminal
Sebuah RS232 ke USB converter diperlukan untuk mengkonversi data serial ke bentuk yang dapat dibaca komputer. Ada cara untuk mendesain sirkuit Anda sendiri daripada membeli modul Anda sendiri tetapi mereka tidak dapat diandalkan karena terkena kebisingan. Yang kami gunakan ditunjukkan di bawah ini
Catatan: Setiap konverter RS232 ke USB memerlukan penginstalan driver khusus; kebanyakan dari mereka akan terinstal secara otomatis segera setelah Anda mencolokkan perangkat. Tapi, jika tidak rileks !!! Gunakan bagian komentar dan saya akan membantu Anda.
Pemrograman Mikrokontroler PIC untuk Komunikasi UART:
Seperti semua modul (ADC, Timer, PWM) kita juga harus menginisialisasi modul USART dari PIC16F877A MCU kita dan menginstruksikannya untuk bekerja dalam mode komunikasi UART 8-bit. Mari tentukan bit konfigurasi dan mulai dengan fungsi inisialisasi UART.
Inisialisasi modul UART dari Mikrokontroler PIC:
Pin Tx dan Rx secara fisik ada di pin RC6 dan RC7. Menurut datasheet mari kita deklarasikan TX sebagai output dan RX sebagai input.
// **** Mengatur pin I / O untuk UART **** // TRISC6 = 0; // Pin TX ditetapkan sebagai keluaran TRISC7 = 1; // Pin RX disetel sebagai input // ________ Set pin I / O __________ //
Sekarang baud rate harus diatur. Baud rate adalah laju transfer informasi dalam saluran komunikasi. Ini bisa menjadi salah satu dari banyak nilai default, tetapi dalam program ini kami menggunakan 9600 karena baud rate yang paling banyak digunakan.
/ ** Inisialisasi register SPBRG untuk baud rate yang diperlukan dan setel BRGH untuk baud_rate cepat ** / SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1; BRGH = 1; // untuk baud_rate tinggi // _________ Akhir dari pengaturan baud_rate _________ //
Nilai baud rate harus diatur menggunakan register SPBRG, nilainya tergantung pada nilai frekuensi kristal eksternal, rumus untuk menghitung baud rate ditunjukkan di bawah ini:
SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1;
Bit BRGH harus dibuat tinggi untuk memungkinkan kecepatan bit yang tinggi. Menurut lembar data (halaman 13) itu selalu menguntungkan untuk mengaktifkannya, karena dapat menghilangkan kesalahan selama komunikasi.
Seperti yang dikatakan sebelumnya kita akan bekerja dalam mode Asynchronous, maka SYNC bit harus dibuat nol dan bit SPEM harus dibuat tinggi untuk mengaktifkan pin serial (TRISC6 dan TRICSC5)
// **** Aktifkan port serial Asynchronous ******* // SYNC = 0; // Asynchronous SPEN = 1; // Aktifkan pin port serial // _____ Port serial asinkron diaktifkan _______ //
Dalam tutorial ini kita akan mengirim dan menerima data antara MCU dan komputer sehingga kita harus mengaktifkan bit TXEN dan CREN.
// ** Ayo persiapkan untuk transmisi & penerimaan ** // TXEN = 1; // aktifkan transmisi CREN = 1; // aktifkan penerimaan // __ modul UART dan siap untuk transmisi dan penerimaan __ //
The bit TX9 dan RX9 harus dibuat nol sehingga kami beroperasi dalam mode 8-bit. Jika harus ada kehandalan tinggi yang perlu ditetapkan maka mode 9-bit dapat dipilih.
// ** Pilih mode 8-bit ** // TX9 = 0; // Penerimaan 8-bit dipilih RX9 = 0; // Mode penerimaan 8-bit dipilih // __ Mode 8-bit dipilih __ //
Dengan ini kami menyelesaikan pengaturan inisialisasi kami. dan siap untuk dioperasikan.
Mengirimkan data menggunakan UART:
Fungsi di bawah ini dapat digunakan untuk mengirimkan data melalui modul UART:
// ** Berfungsi untuk mengirimkan satu byte tanggal ke UART ** // void UART_send_char (char bt) {while (! TXIF); // tahan program sampai buffer TX bebas TXREG = bt; // Muat buffer pemancar dengan nilai yang diterima} // _____________ Akhir fungsi ________________ //
Setelah modul diinisialisasi, nilai apa pun yang dimuat ke register, TXREG akan dikirim melalui UART, tetapi transmisi mungkin tumpang tindih. Oleh karena itu kita harus selalu memeriksa flag Transmission Interrupt TXIF. Hanya jika bit ini rendah, kita dapat melanjutkan dengan bit berikutnya untuk transmisi, jika tidak, kita harus menunggu sampai bendera ini rendah.
Namun, fungsi di atas hanya dapat digunakan untuk mengirim hanya satu byte data, untuk mengirim string lengkap, fungsi di bawah ini harus digunakan
// ** Berfungsi untuk mengubah string menjadi byte ** // void UART_send_string (char * st_pt) {while (* st_pt) // jika terdapat char UART_send_char (* st_pt ++); // proses sebagai data byte} // ___________ Akhir fungsi ______________ //
Fungsi ini mungkin agak sulit untuk dipahami karena memiliki petunjuk, tetapi percayalah bahwa petunjuk sangat bagus dan membuat pemrograman lebih mudah dan ini adalah salah satu contoh bagus dari yang sama.
Seperti yang Anda perhatikan, kami memanggil lagi UART_send_char () tetapi sekarang berada di dalam loop sementara. Kami telah membagi string menjadi karakter individu, setiap kali fungsi ini dipanggil, satu karakter akan dikirim ke TXREG dan akan dikirimkan.
Menerima data menggunakan UART:
Fungsi berikut dapat digunakan untuk menerima data dari modul UART:
// ** Berfungsi untuk mendapatkan satu byte tanggal dari UART ** // char UART_get_char () {if (OERR) // periksa Error {CREN = 0; // Jika error -> Reset CREN = 1; // Jika error -> Reset} while (! RCIF); // tahan program hingga buffer RX adalah pengembalian bebas RCREG; // terima nilainya dan kirimkan ke fungsi utama} // _____________ Akhir fungsi ________________ //
Ketika sebuah data diterima oleh modul UART, ia mengambilnya dan menyimpannya di register RCREG. Kami hanya dapat mentransfer nilai ke variabel apa pun dan menggunakannya. Tetapi mungkin ada kesalahan tumpang tindih atau pengguna mungkin mengirim data terus menerus dan kami belum mentransfernya ke variabel.
Dalam hal ini bit bendera Terima RCIF datang untuk menyelamatkan. Bit ini akan menjadi rendah setiap kali data diterima dan belum diproses. Oleh karena itu kami menggunakannya di while loop membuat penundaan untuk menahan program sampai kami menangani nilai itu.
Toggling LED menggunakan modul UART Mikrokontroler PIC:
Sekarang mari kita sampai pada bagian terakhir dari Program, fungsi utama void (void) , di mana kita akan menyalakan LED melalui komputer menggunakan komunikasi UART antara PIC dan komputer.
Saat kita mengirim karakter “1” (dari komputer) LED akan ON dan pesan status “LED MERAH -> ON” akan dikirim kembali (dari PIC MCU) ke komputer.
Demikian pula kami mengirim karakter "0" (dari komputer) LED akan dimatikan dan pesan status "LED MERAH -> OFF" akan dikirim kembali (dari PIC MCU) ke komputer.
while (1) // Pengulangan tak terbatas {get_value = UART_get_char (); if (get_value == '1') // Jika pengguna mengirim "1" {RB3 = 1; // Nyalakan LED UART_send_string ("LED MERAH -> ON"); // Kirim notifikasi ke komputer UART_send_char (10); // ASCII nilai 10 digunakan untuk carriage return (untuk mencetak di baris baru)} if (get_value == '0') // Jika pengguna mengirim "0" {RB3 = 0; // Matikan LED UART_send_string ("RED -> OFF"); // Kirim pemberitahuan ke komputer UART_send_char (10); // ASCII nilai 10 digunakan untuk carriage return (untuk mencetak di baris baru)}}
Simulasi program kami:
Seperti biasa mari kita simulasikan program kita menggunakan proteus dan cari tahu apakah itu berfungsi seperti yang diharapkan.
Gambar di atas menunjukkan terminal virtual yang menampilkan pesan selamat datang dan status LED. LED Warna Merah terlihat terhubung ke pin RB3. Kerja rinci simulasi dapat ditemukan di Video di bagian akhir.
Pengaturan Perangkat Keras dan Menguji output:
Koneksi untuk rangkaian ini sangat sederhana, kami menggunakan papan PIC Perf kami dan hanya menghubungkan tiga kabel ke RS232 ke konverter USB dan menghubungkan modul ke komputer kami menggunakan kabel data USB seperti yang ditunjukkan di bawah ini.
Selanjutnya kami menginstal Aplikasi Hyper Terminal (unduh dari sini) dan membukanya. Ini harus menunjukkan sesuatu seperti ini
Sekarang buka Device Manager di komputer Anda dan periksa port Com mana modul Anda terhubung, milik saya terhubung ke COM port 17 seperti yang ditunjukkan di bawah ini
Catatan: Nama port COM untuk modul Anda mungkin berubah menurut vendor Anda, itu bukan masalah.
Sekarang kembali ke Aplikasi Hyper Terminal dan arahkan ke Set Up -> Port Configuration atau tekan Alt + C, untuk mendapatkan kotak sembulan berikut dan pilih port yang diinginkan (COM17 dalam kasus saya) di jendela pop-up dan klik sambungkan.
Setelah koneksi dibuat, hidupkan papan kinerja PIC Anda dan Anda akan melihat sesuatu seperti ini di bawah
Arahkan kursor ke Command Window dan masukkan 1 lalu tekan enter. LED akan menyala dan status akan ditampilkan seperti di bawah ini.
Caranya sama, simpan kursor Anda di Command Window dan masukkan 0 lalu tekan enter. LED akan dimatikan dan statusnya akan ditampilkan seperti di bawah ini.
Di bawah ini diberikan kode lengkap dan detail video, yang akan menunjukkan bagaimana LED merespon secara real time untuk “1” dan “0”.
Itu saja guys, kami telah menghubungkan PIC UART dengan komputer kami dan mentransfer data untuk mengaktifkan LED menggunakan terminal Hyper. Harap Anda mengerti, jika tidak, gunakan bagian komentar untuk menanyakan pertanyaan Anda. Dalam tutorial berikutnya, kami akan kembali menggunakan UART tetapi membuatnya lebih menarik dengan menggunakan modul Bluetooth dan menyiarkan data melalui udara.
Juga periksa Komunikasi UART antara Dua Mikrokontroler ATmega8 dan komunikasi UART antara ATmega8 dan Arduino Uno.