- Keperluan:
- Pengaturcaraan PIC Microcontroller untuk Komunikasi UART:
- Simulasi program kami:
- Penyediaan Perkakasan dan Menguji output:
Dalam tutorial ini kita belajar Mengaktifkan komunikasi UART dengan PIC Microcontroller dan cara memindahkan data ke dan dari Komputer anda. Setakat ini, kami telah merangkumi semua modul asas seperti ADC, Timer, PWM dan juga telah belajar bagaimana untuk menghubungkan antara LCD dan paparan 7-Segmen. Sekarang, kita akan melengkapkan diri kita dengan alat komunikasi baru yang disebut UART yang banyak digunakan dalam kebanyakan projek Pengawal Mikro. Lihat di sini Tutorial Mikrokontroler PIC lengkap kami menggunakan MPLAB dan XC8.
Di sini kita telah menggunakan PIC16F877A MCU, ia mempunyai modul yang dipanggil "Addressable Universal Synchronous Asynchronous penerima dan pemancar" sebentar lagi dikenali sebagai USART. USART adalah sistem komunikasi dua wayar di mana data mengalir secara bersiri. USART juga merupakan komunikasi dupleks penuh, yang bermaksud anda dapat mengirim dan menerima data pada masa yang sama yang dapat digunakan untuk berkomunikasi dengan peranti periferal, seperti terminal CRT dan komputer peribadi.
The USART boleh dikonfigurasikan dalam mod berikut:
- Tidak segerak (dupleks penuh)
- Segerak - Master (separuh dupleks)
- Segar - Hamba (separuh dupleks)
Terdapat juga dua mod berbeza iaitu mod 8-bit dan 9-bit, dalam tutorial ini kita akan mengkonfigurasi modul USART untuk berfungsi dalam mod Asynchronous dengan sistem komunikasi 8-bit, kerana ia adalah jenis komunikasi yang paling banyak digunakan. Oleh kerana tidak segerak, ia tidak perlu menghantar isyarat jam bersama dengan isyarat data. UART menggunakan dua baris data untuk menghantar (Tx) dan menerima (Rx) data. Landasan kedua-dua peranti juga harus dibuat umum. Jenis komunikasi ini tidak mempunyai jam yang sama, maka persamaan sangat penting untuk sistem berfungsi.
Pada akhir tutorial ini, anda akan dapat menjalin komunikasi (UART) antara komputer dan PIC Microcontroller anda dan menukar LED pada papan PIC dari komputer riba anda. Status LED akan dihantar ke komputer riba anda dari PIC MCU. Kami akan menguji output menggunakan Hyper Terminal di komputer. Video Terperinci juga diberikan pada akhir tutorial ini.
Keperluan:
Perkakasan:
- PIC16F877A Perf Board
- Modul penukar RS232 ke USB
- Komputer
- Pengaturcara PICkit 3
Perisian:
- MPLABX
- HyperTerminal
A RS232 untuk USB converter diperlukan untuk menukar data siri ke dalam bentuk yang boleh dibaca komputer. Ada cara untuk merancang litar anda sendiri dan bukannya membeli modul anda sendiri tetapi tidak boleh dipercayai kerana mereka mengalami kebisingan. Yang kami gunakan ditunjukkan di bawah
Catatan: Setiap penukar RS232 ke USB memerlukan pemacu khas untuk dipasang; kebanyakannya akan dipasang secara automatik sebaik sahaja anda memasang peranti. Tetapi, jika tidak santai !!! Gunakan bahagian komen dan saya akan membantu anda.
Pengaturcaraan PIC Microcontroller untuk Komunikasi UART:
Seperti semua modul (ADC, Timer, PWM), kita juga harus menginisialisasi modul USART MCU PIC16F877A kami dan mengarahkannya untuk berfungsi dalam mod komunikasi 8-bit UART. Mari tentukan bit konfigurasi dan mulakan dengan fungsi permulaan UART.
Memulakan modul UART Mikrokontroler PIC:
Pin Tx dan Rx terdapat secara fizikal pada pin RC6 dan RC7. Menurut lembar data mari kita nyatakan TX sebagai output dan RX sebagai input.
// **** Menetapkan pin I / O untuk UART **** // TRISC6 = 0; // TX Pin ditetapkan sebagai output TRISC7 = 1; // Pin RX ditetapkan sebagai input // ________ Pin pin I / O __________ //
Sekarang kadar baud mesti ditetapkan. Baud rate adalah kadar di mana maklumat dipindahkan dalam saluran komunikasi. Ini boleh menjadi salah satu dari banyak nilai lalai, tetapi dalam program ini kita menggunakan 9600 sejak kadar baud yang paling banyak digunakan.
/ ** Permulaan daftar SPBRG untuk kadar baud yang diperlukan dan tetapkan BRGH untuk kadar baud_ cepat ** / SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1; BRGH = 1; // untuk kadar baud_rate tinggi // _________ Akhir tetapan kadar baud _________ //
Nilai kadar baud harus ditetapkan menggunakan SPBRG register, nilainya bergantung pada nilai frekuensi kristal luaran, formula untuk mengira kadar baud ditunjukkan di bawah:
SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1;
Bit BRGH mesti dibuat tinggi untuk membolehkan kadar bit berkelajuan tinggi. Menurut lembar data (halaman 13) selalu menguntungkan untuk mengaktifkannya, kerana dapat menghilangkan kesalahan semasa komunikasi.
Seperti yang dinyatakan sebelumnya, kami akan bekerja dalam mod Asinkron, oleh itu bit SYNC harus dibuat sifar dan bit SPEM mesti dibuat tinggi untuk membolehkan pin bersiri (TRISC6 dan TRICSC5)
// **** Dayakan port bersiri tidak segerak ******* // SYNC = 0; // SPEN segerak = 1; // Dayakan pin port bersiri // _____ Port siri tak segerak didayakan _______ //
Dalam tutorial ini kita akan menghantar dan menerima data antara MCU dan komputer oleh itu kita harus mengaktifkan bit TXEN dan CREN.
// ** Mari bersiap sedia untuk penghantaran & penerimaan ** // TXEN = 1; // aktifkan penghantaran CREN = 1; // aktifkan penerimaan // __ modul UART siap dan siap untuk penghantaran dan penerimaan __ //
The bit TX9 dan RX9 perlu dibuat sifar supaya kita beroperasi dalam mod 8-bit. Sekiranya mesti ada kebolehpercayaan yang tinggi perlu dibuat maka mod 9-bit dapat dipilih.
// ** Pilih mod 8-bit ** // TX9 = 0; // Penerimaan 8-bit dipilih RX9 = 0; // Mod penerimaan 8-bit dipilih // __ mod penerimaan 8-bit dipilih __ //
Dengan ini kami menyelesaikan persediaan permulaan kami. dan sedia untuk beroperasi.
Menghantar data menggunakan UART:
Fungsi di bawah ini dapat digunakan untuk mengirimkan data melalui modul UART:
// ** Fungsi untuk menghantar satu bait tarikh ke UART ** // batal UART_send_char (char bt) {sementara (! TXIF); // tahan program sehingga penyangga TX bebas TXREG = bt; // Muatkan buffer pemancar dengan nilai yang diterima} // _____________ Tamat fungsi ________________ //
Setelah modul diinisialisasi apa pun nilai yang dimuat ke dalam daftar TXREG akan dihantar melalui UART, tetapi penghantaran mungkin bertindih. Oleh itu, kita harus selalu memeriksa bendera TXIF Transmission Interrupt . Hanya jika bit ini rendah, kita boleh meneruskan bit seterusnya untuk penghantaran, kita harus menunggu bendera ini menjadi rendah.
Namun, fungsi di atas hanya dapat digunakan untuk mengirim hanya satu bait data, untuk mengirim tali lengkap fungsi di bawah harus digunakan
// ** Fungsi untuk menukar rentetan ke bait ** // batal UART_send_string (char * st_pt) {sementara (* st_pt) // jika ada char UART_send_char (* st_pt ++); // memprosesnya sebagai data bait} // ___________ Tamat fungsi ______________ //
Fungsi ini mungkin agak sukar difahami kerana mempunyai petunjuk, tetapi percayalah petunjuknya bagus dan mereka menjadikan pengaturcaraan lebih mudah dan ini adalah salah satu contoh yang sama.
Seperti yang anda perhatikan, kami telah memanggil UART_send_char () tetapi kini berada di dalam loop sementara. Kami telah membagi rentetan menjadi beberapa watak, setiap kali fungsi ini dipanggil, satu char akan dihantar ke TXREG dan ia akan dihantar.
Menerima data menggunakan UART:
Fungsi berikut dapat digunakan untuk menerima data dari modul UART:
// ** Fungsi untuk mendapatkan satu bait tarikh dari UART ** // char UART_get_char () {if (OERR) // periksa Ralat {CREN = 0; // Sekiranya ralat -> Tetapkan semula CREN = 1; // Sekiranya ralat -> Tetapkan semula} semasa (! RCIF); // tahan program sehingga penyangga RX bebas RCREG; // terima nilai dan hantarkan ke fungsi utama} // _____________ Tamat fungsi ________________ //
Apabila data diterima oleh modul UART, data akan diambil dan menyimpannya dalam daftar RCREG. Kita hanya boleh memindahkan nilai ke mana-mana pemboleh ubah dan menggunakannya. Tetapi mungkin terdapat ralat bertindih atau pengguna mungkin menghantar data secara berterusan dan kami belum memindahkannya ke pemboleh ubah.
Dalam kes itu, RCIF bit bendera Terima untuk menyelamatkan. Bit ini akan menjadi rendah setiap kali data diterima dan belum diproses. Oleh itu, kami menggunakannya dalam loop sementara membuat kelewatan untuk menahan program sehingga kami menangani nilai tersebut.
Menukar LED menggunakan modul UART MIC Microcontroller:
Sekarang mari kita sampai ke bahagian akhir Program, fungsi utama kosong (void) , di mana kita akan menukar LED melalui komputer menggunakan komunikasi UART antara PIC dan komputer.
Apabila kita mengirim watak "1" (dari komputer) LED akan DIPAKAI dan pesan status "LED MERAH -> AKTIF" akan dikirim kembali (dari PIC MCU) ke komputer.
Begitu juga kita mengirim watak "0" (dari komputer) LED akan dimatikan dan pesan status "LED MERAH -> MATI" akan dihantar kembali (dari PIC MCU) ke komputer.
sementara (1) // Gelung tak terhingga {get_value = UART_get_char (); if (get_value == '1') // Sekiranya pengguna menghantar "1" {RB3 = 1; // Hidupkan LED UART_send_string ("LED MERAH -> AKTIF"); // Kirim pemberitahuan ke komputer UART_send_char (10); // Nilai ASCII 10 digunakan untuk pengembalian kereta (untuk mencetak dalam baris baru)} jika (get_value == '0') // Jika pengguna mengirim "0" {RB3 = 0; // Matikan LED UART_send_string ("MERAH -> MATI"); // Kirim pemberitahuan ke komputer UART_send_char (10); // ASCII nilai 10 digunakan untuk pengembalian kereta (untuk mencetak dalam baris baru)}}
Simulasi program kami:
Seperti biasa mari kita mensimulasikan program kita menggunakan proteus dan mengetahui apakah ia berfungsi seperti yang diharapkan.
Gambar di atas menunjukkan terminal maya di mana ia menunjukkan mesej selamat datang dan status LED. LED Warna Merah dapat dilihat disambungkan ke pin RB3. Kerja terperinci simulasi boleh didapati di Video pada akhir.
Penyediaan Perkakasan dan Menguji output:
Sambungan untuk litar ini sangat mudah, kami menggunakan papan PIC Perf kami dan hanya menghubungkan tiga wayar ke penukar RS232 ke USB dan menyambungkan modul ke komputer kami menggunakan kabel data USB seperti yang ditunjukkan di bawah.
Seterusnya kami memasang Aplikasi Hyper Terminal (muat turun dari sini) dan membukanya. Ia harus menunjukkan sesuatu seperti ini
Sekarang buka Device Manager di komputer anda dan periksa port Com mana modul anda disambungkan, saya disambungkan ke COM port 17 seperti yang ditunjukkan di bawah
Catatan: Nama port COM untuk modul anda mungkin berubah mengikut vendor anda, itu tidak menjadi masalah.
Sekarang kembali ke Aplikasi Terminal Hyper dan arahkan ke Set Up -> Port Configuration atau tekan Alt + C, untuk mendapatkan kotak pop timbul berikut dan pilih port yang diinginkan (COM17 dalam kes saya) di tetingkap pop-up dan klik pada connect.
Setelah sambungan dibuat, hidupkan papan PIC perf anda dan anda akan melihat sesuatu seperti ini di bawah
Simpan kursor anda di Command Window dan masukkan 1 kemudian tekan enter. LED akan dihidupkan dan statusnya akan dipaparkan seperti gambar di bawah.
Dengan cara yang sama, simpan kursor anda di Command Window dan masukkan 0 kemudian tekan enter. LED akan dimatikan dan statusnya akan dipaparkan seperti gambar di bawah.
Di bawah ini diberikan kod lengkap dan video terperinci, yang akan menunjukkan bagaimana LED bertindak balas dalam masa nyata untuk "1" dan "0".
Itu sahaja, kami telah menghubungkan PIC UART dengan komputer kami dan memindahkan data untuk menukar LED menggunakan terminal Hyper. Harap anda faham, jika tidak, gunakan bahagian komen untuk bertanya. Dalam tutorial seterusnya kami akan menggunakan UART sekali lagi tetapi menjadikannya 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.