- Yêu cầu:
- Lập trình vi điều khiển PIC cho giao tiếp UART:
- Mô phỏng chương trình của chúng tôi:
- Thiết lập phần cứng và kiểm tra đầu ra:
Trong hướng dẫn này, chúng ta học cách Bật giao tiếp UART với Vi điều khiển PIC và cách truyền dữ liệu đến và đi từ Máy tính của bạn. Cho đến nay, chúng tôi đã đề cập đến tất cả các mô-đun cơ bản như ADC, Timers, PWM và cũng đã học cách giao tiếp với màn hình LCD và màn hình 7-Segment. Bây giờ, chúng tôi sẽ tự trang bị cho mình một công cụ giao tiếp mới gọi là UART được sử dụng rộng rãi trong hầu hết các dự án Vi điều khiển. Kiểm tra tại đây Hướng dẫn sử dụng vi điều khiển PIC hoàn chỉnh của chúng tôi bằng MPLAB và XC8.
Ở đây chúng tôi đã sử dụng PIC16F877A MCU, nó có một mô-đun được gọi là “Bộ thu và phát không đồng bộ đa năng có thể định địa chỉ” được gọi là USART. USART là một hệ thống giao tiếp hai dây, trong đó dữ liệu được lưu chuyển theo thứ tự. USART cũng là giao tiếp song công, có nghĩa là bạn có thể gửi và nhận dữ liệu cùng lúc, dữ liệu này có thể được sử dụng để giao tiếp với các thiết bị ngoại vi, chẳng hạn như thiết bị đầu cuối CRT và máy tính cá nhân.
Các USART có thể được cấu hình trong các phương thức sau:
- Không đồng bộ (song công)
- Đồng bộ - Chính (bán song công)
- Đồng bộ - Slave (bán song công)
Ngoài ra còn có hai chế độ khác nhau là chế độ 8-bit và 9-bit, trong hướng dẫn này chúng ta sẽ cấu hình mô-đun USART để hoạt động ở chế độ Không đồng bộ với hệ thống giao tiếp 8-bit, vì đây là kiểu giao tiếp được sử dụng nhiều nhất. Vì nó là không đồng bộ, nó không cần phải gửi tín hiệu đồng hồ cùng với các tín hiệu dữ liệu. UART sử dụng hai đường dữ liệu để gửi (Tx) và nhận (Rx) dữ liệu. Mặt đất của cả hai thiết bị cũng nên được làm chung. Loại giao tiếp này không chia sẻ đồng hồ chung do đó điểm chung là rất quan trọng để hệ thống hoạt động.
Vào cuối hướng dẫn này, bạn sẽ có thể thiết lập giao tiếp (UART) giữa máy tính và Bộ vi điều khiển PIC và bật tắt đèn LED trên bo mạch PIC từ máy tính xách tay của bạn. Trạng thái của đèn LED sẽ được gửi đến máy tính xách tay của bạn từ MCU PIC. Chúng tôi sẽ kiểm tra đầu ra bằng Hyper Terminal trên máy tính. Video chi tiết cũng được đưa ra ở cuối hướng dẫn này.
Yêu cầu:
Phần cứng:
- PIC16F877A Bảng hoàn hảo
- Mô-đun chuyển đổi RS232 sang USB
- Máy vi tính
- Lập trình viên PICkit 3
Phần mềm:
- MPLABX
- HyperTerminal
Cần có bộ chuyển đổi RS232 sang USB để chuyển đổi dữ liệu nối tiếp sang dạng máy tính có thể đọc được. Có nhiều cách để thiết kế mạch của riêng bạn thay vì mua mô-đun của riêng bạn nhưng chúng không đáng tin cậy vì chúng bị nhiễu. Cái mà chúng tôi đang sử dụng được hiển thị bên dưới
Lưu ý: Mỗi bộ chuyển đổi RS232 sang USB sẽ yêu cầu một trình điều khiển đặc biệt được cài đặt; hầu hết chúng sẽ được cài đặt tự động ngay khi bạn cắm thiết bị vào. Nhưng, nếu nó không thư giãn !!! Sử dụng phần bình luận và tôi sẽ giúp bạn.
Lập trình vi điều khiển PIC cho giao tiếp UART:
Giống như tất cả các mô-đun (ADC, Timer, PWM), chúng ta cũng nên khởi tạo mô-đun USART của MCU PIC16F877A của chúng tôi và hướng dẫn nó hoạt động ở chế độ giao tiếp 8-bit UART. Hãy xác định các bit cấu hình và bắt đầu với chức năng khởi tạo UART.
Khởi tạo mô-đun UART của Vi điều khiển PIC:
Các chân Tx và Rx có mặt vật lý ở các chân RC6 và RC7. Theo biểu dữ liệu, hãy khai báo TX là đầu ra và RX là đầu vào.
// **** Đặt các chân I / O cho UART **** // TRISC6 = 0; // TX Pin được thiết lập là đầu ra TRISC7 = 1; // Bộ chân RX làm đầu vào // ________ Bộ chân I / O __________ //
Bây giờ tốc độ truyền phải được thiết lập. Tốc độ truyền là tốc độ truyền thông tin trong một kênh truyền thông. Đây có thể là một trong nhiều giá trị mặc định, nhưng trong chương trình này, chúng tôi đang sử dụng 9600 vì tốc độ truyền được sử dụng nhiều nhất.
/ ** Khởi tạo thanh ghi SPBRG cho tốc độ truyền yêu cầu và đặt BRGH cho tốc độ baud_rate nhanh ** / SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1; BRGH = 1; // cho baud_rate cao // _________ Kết thúc cài đặt baud_rate _________ //
Giá trị của tốc độ truyền phải được thiết lập bằng cách sử dụng thanh ghi SPBRG, giá trị phụ thuộc vào giá trị của tần số tinh thể Ngoài, công thức tính tốc độ truyền được hiển thị dưới đây:
SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1;
Bit BRGH phải được làm cao để cho phép tốc độ bit cao. Theo biểu dữ liệu (trang 13), việc kích hoạt nó luôn có lợi vì nó có thể loại bỏ lỗi trong quá trình giao tiếp.
Như đã nói trước đó, chúng tôi sẽ làm việc ở chế độ Không đồng bộ, do đó, SYNC bit phải được đặt bằng 0 và bit SPEM phải được đặt ở mức cao để kích hoạt các chân nối tiếp (TRISC6 và TRICSC5)
// **** Kích hoạt cổng nối tiếp không đồng bộ ******* // SYNC = 0; // SPEN không đồng bộ = 1; // Bật các chân cổng nối tiếp // _____ Đã bật cổng nối tiếp không đồng bộ _______ //
Trong hướng dẫn này, chúng ta sẽ gửi và nhận dữ liệu giữa MCU và máy tính, do đó chúng ta phải bật cả bit TXEN và CREN.
// ** Hãy chuẩn bị cho quá trình truyền & nhận ** // TXEN = 1; // cho phép truyền CREN = 1; // bật tiếp nhận // __ Mô-đun UART lên và sẵn sàng để truyền và nhận __ //
Các bit TX9 và RX9 phải được làm bằng 0 để chúng tôi hoạt động ở chế độ 8 bit. Nếu phải thiết lập độ tin cậy cao thì có thể chọn chế độ 9 bit.
// ** Chọn chế độ 8 bit ** // TX9 = 0; // Tiếp nhận 8 bit đã chọn RX9 = 0; // Chế độ thu 8 bit được chọn // __ Chế độ 8 bit được chọn __ //
Với điều này, chúng tôi hoàn thành thiết lập khởi tạo của mình. và sẵn sàng hoạt động.
Truyền dữ liệu bằng UART:
Chức năng dưới đây có thể được sử dụng để truyền dữ liệu thông qua mô-đun UART:
// ** Hàm gửi một byte ngày tới UART ** // void UART_send_char (char bt) {while (! TXIF); // giữ chương trình cho đến khi bộ đệm TX trống TXREG = bt; // Nạp bộ đệm máy phát với giá trị nhận được} // _____________ Kết thúc hàm ________________ //
Khi mô-đun được khởi tạo, bất kỳ giá trị nào được tải vào thanh ghi TXREG sẽ được truyền qua UART, nhưng quá trình truyền có thể chồng chéo. Do đó, chúng ta nên luôn kiểm tra cờ Ngắt truyền TXIF. Chỉ khi bit này ở mức thấp, chúng ta có thể tiếp tục với bit tiếp theo để truyền, nếu không, chúng ta nên đợi cờ này xuống thấp.
Tuy nhiên, hàm trên chỉ có thể được sử dụng để gửi chỉ một byte dữ liệu, để gửi một chuỗi hoàn chỉnh thì nên sử dụng hàm bên dưới
// ** Hàm chuyển chuỗi thành byte ** // void UART_send_string (char * st_pt) {while (* st_pt) // nếu có char UART_send_char (* st_pt ++); // xử lý nó dưới dạng dữ liệu byte} // ___________ Kết thúc hàm ______________ //
Hàm này có thể hơi phức tạp để hiểu vì nó có con trỏ, nhưng hãy tin tưởng tôi, con trỏ rất tuyệt vời và chúng giúp lập trình dễ dàng hơn và đây là một ví dụ điển hình về điều tương tự.
Như bạn có thể nhận thấy, chúng tôi đã gọi lại UART_send_char () nhưng bây giờ bên trong vòng lặp while. Chúng tôi đã chia chuỗi thành các ký tự riêng lẻ, mỗi khi hàm này được gọi, một ký tự sẽ được gửi đến TXREG và nó sẽ được truyền.
Nhận dữ liệu bằng UART:
Có thể sử dụng chức năng sau để nhận dữ liệu từ mô-đun UART:
// ** Hàm lấy một byte ngày từ UART ** // char UART_get_char () {if (OERR) // kiểm tra lỗi {CREN = 0; // Nếu lỗi -> Đặt lại CREN = 1; // Nếu lỗi -> Đặt lại} while (! RCIF); // giữ chương trình cho đến khi bộ đệm RX miễn phí trả về RCREG; // nhận giá trị và gửi đến hàm main} // _____________ Kết thúc hàm ________________ //
Khi một dữ liệu được mô-đun UART nhận, nó sẽ chọn và lưu trữ trong thanh ghi RCREG. Chúng ta chỉ cần chuyển giá trị vào bất kỳ biến nào và sử dụng nó. Nhưng có thể có lỗi chồng chéo hoặc người dùng có thể gửi dữ liệu liên tục và chúng tôi chưa chuyển chúng sang một biến.
Trong trường hợp đó, bit RCIF của cờ nhận được giải cứu. Bit này sẽ xuống thấp bất cứ khi nào một dữ liệu được nhận và chưa được xử lý. Do đó, chúng tôi sử dụng nó trong vòng lặp while tạo ra độ trễ để giữ chương trình cho đến khi chúng tôi xử lý giá trị đó.
Chuyển đổi đèn LED bằng cách sử dụng mô-đun UART của Vi điều khiển PIC:
Bây giờ chúng ta hãy đến với phần cuối cùng của Chương trình, hàm void main (void) , nơi chúng ta sẽ chuyển đổi một đèn LED thông qua máy tính bằng cách sử dụng giao tiếp UART giữa PIC và máy tính.
Khi chúng tôi gửi một ký tự “1” (từ máy tính), đèn LED sẽ được BẬT và thông báo trạng thái “Đèn LED ĐỎ -> BẬT” sẽ được gửi trở lại (từ PIC MCU) đến máy tính.
Tương tự, chúng tôi gửi một ký tự “0” (từ máy tính) đèn LED sẽ TẮT và thông báo trạng thái “Đèn LED ĐỎ -> TẮT” sẽ được gửi lại (từ PIC MCU) đến máy tính.
while (1) // Vòng lặp vô hạn {get_value = UART_get_char (); if (get_value == '1') // Nếu người dùng gửi "1" {RB3 = 1; // Bật LED UART_send_string ("LED ĐỎ -> BẬT"); // Gửi thông báo đến máy tính UART_send_char (10); // Giá trị ASCII 10 được dùng để xuống dòng (để in ở dòng mới)} if (get_value == '0') // Nếu người dùng gửi "0" {RB3 = 0; // Tắt LED UART_send_string ("RED -> OFF"); // Gửi thông báo đến máy tính UART_send_char (10); // Giá trị ASCII 10 được dùng để xuống dòng (để in ra dòng mới)}}
Mô phỏng chương trình của chúng tôi:
Như thường lệ, hãy mô phỏng chương trình của chúng tôi bằng cách sử dụng proteus và tìm hiểu xem nó có hoạt động như mong đợi hay không.
Hình ảnh trên cho thấy một thiết bị đầu cuối ảo, trong đó thiết bị đầu cuối hiển thị thông báo chào mừng và trạng thái của đèn LED. Có thể nhận thấy đèn LED màu đỏ được kết nối với chân RB3. Hoạt động chi tiết của mô phỏng có thể được tìm thấy trong Video ở cuối.
Thiết lập phần cứng và kiểm tra đầu ra:
Kết nối cho mạch này thực sự đơn giản, chúng tôi sử dụng bảng PIC Perf của chúng tôi và chỉ cần kết nối ba dây với bộ chuyển đổi RS232 sang USB và kết nối mô-đun với máy tính của chúng tôi bằng cáp dữ liệu USB như hình dưới đây.
Tiếp theo, chúng tôi cài đặt Ứng dụng Hyper Terminal (tải xuống từ đây) và mở nó lên. Nó sẽ hiển thị một cái gì đó như thế này
Bây giờ hãy mở Device Manager trên máy tính của bạn và kiểm tra xem module của bạn được kết nối với cổng Com nào, của tôi được kết nối với cổng COM 17 như hình bên dưới
Lưu ý: Tên cổng COM cho mô-đun của bạn có thể thay đổi theo nhà cung cấp của bạn, nó không phải là vấn đề.
Bây giờ quay lại Ứng dụng Hyper Terminal và điều hướng đến Thiết lập -> Cấu hình cổng hoặc nhấn Alt + C, để nhận hộp bật lên sau và chọn cổng mong muốn (COM17 trong trường hợp của tôi) trong cửa sổ bật lên và nhấp vào kết nối.
Khi kết nối được thiết lập, hãy bật bảng điều khiển PIC của bạn và bạn sẽ thấy một cái gì đó như thế này bên dưới
Giữ con trỏ của bạn trong Cửa sổ Lệnh và nhập 1 rồi nhấn enter. Đèn LED sẽ được bật và trạng thái sẽ hiển thị như hình dưới đây.
Theo cách tương tự, giữ con trỏ của bạn trong Cửa sổ Lệnh và nhập 0 rồi nhấn enter. Đèn LED sẽ được tắt và hiển thị trạng thái như hình bên dưới.
Dưới đây là mã đầy đủ và video chi tiết, sẽ hiển thị cách đèn LED phản hồi trong thời gian thực cho “1” và “0”.
Vậy đó các bạn, chúng ta đã giao tiếp PIC UART với máy tính của mình và chuyển dữ liệu để bật tắt đèn LED bằng thiết bị đầu cuối Hyper. Hy vọng bạn đã hiểu, nếu không, hãy sử dụng phần bình luận để hỏi truy vấn của bạn. Trong hướng dẫn tiếp theo, chúng tôi sẽ lại sử dụng UART nhưng làm cho nó thú vị hơn bằng cách sử dụng mô-đun Bluetooth và truyền dữ liệu qua mạng.
Đồng thời kiểm tra Giao tiếp UART giữa hai Vi điều khiển ATmega8 và giao tiếp UART giữa ATmega8 và Arduino Uno.