Ở đây chúng ta sẽ thiết lập giao tiếp giữa vi điều khiển ATmega8 và Arduino Uno. Giao tiếp được thiết lập ở đây là loại UART (Máy phát nhận không đồng bộ đa năng). Đó là giao tiếp nối tiếp. Bằng cách này, dữ liệu giao tiếp nối tiếp có thể được chia sẻ giữa hai bộ điều khiển, điều này được yêu cầu trong các ứng dụng hệ thống nhúng khác nhau.
Trong các hệ thống nhúng, chúng ta phải có kiến thức cơ bản về truyền thông hệ thống, vì vậy chúng tôi đang thực hiện dự án này. Trong dự án này, chúng tôi sẽ thảo luận về hệ thống truyền thông cơ bản và chúng tôi sẽ gửi một số dữ liệu từ máy phát đến máy thu nối tiếp.
Trong dự án này, ATMEGA8 hoạt động như một TRANSMITTER và ARDUINO UNO hoạt động như một RECECIVER. Trong giao tiếp nối tiếp, chúng tôi sẽ gửi dữ liệu BIT BY BIT, cho đến khi một BYTE dữ liệu được chuyển hoàn toàn. Dữ liệu có thể có kích thước 10bit nhưng chúng tôi sẽ giữ ở mức 8BITS vào lúc này.
Thành phần bắt buộc
Phần cứng: ATMEGA8, ARDUINO UNO, nguồn điện (5v), BỘ LẬP TRÌNH AVR-ISP, tụ điện 100uF (kết nối qua nguồn điện), điện trở 1KΩ (hai mảnh), LED, Nút.
Phần mềm: Atmel studio 6.1, progisp hoặc flash magic, ARDUINO NIGHTLY.
Sơ đồ mạch và giải thích
Trước khi thảo luận về sơ đồ mạch và lập trình cho máy phát và máy thu, chúng ta cần hiểu về giao tiếp nối tiếp. ATMEGA ở đây sẽ gửi dữ liệu đến UNO nối tiếp như đã thảo luận trước đó.
Nó có các phương thức giao tiếp khác như giao tiếp MASTER SLAVE, giao tiếp JTAG nhưng để giao tiếp dễ dàng, chúng tôi chọn RS232. Ở đây chúng tôi sẽ kết nối mã PIN TXD (Bộ phát) của ATMEGA8 với mã PIN RXD (Bộ thu) của ARDUINO UNO
Giao tiếp dữ liệu được thiết lập được lập trình để có:
- Tám bit dữ liệu
- Hai bit dừng
- Không có bit kiểm tra chẵn lẻ
- Tốc độ truyền 9600 BPS (Bit trên giây)
- Giao tiếp không đồng bộ (Không có chia sẻ đồng hồ giữa ATMEGA8 và UNO (cả hai đều có đơn vị đồng hồ khác nhau))
Để thiết lập UART giữa Arduino Uno và ATMEGA8, chúng ta cần lập trình cài đặt chính xác. Đối với điều này, chúng ta cần giữ các thông số đã đề cập ở trên giống nhau ở cả hai đầu. Trong cái này hoạt động như TRANSMITTER và cái khác đóng vai trò là RECEIVER. Chúng tôi sẽ thảo luận về cài đặt từng bên dưới đây.
Bây giờ đối với giao diện RS232, các tính năng sau phải được đáp ứng cho phía TRANSMITTER (ATMEGA8):
1. Chân TXD (tính năng nhận dữ liệu) của bộ điều khiển đầu tiên phải được bật cho TRANSMITTER.
2. Vì giao tiếp là nối tiếp, chúng ta cần biết bất cứ khi nào nhận được dữ liệu tạm biệt, để chúng ta có thể dừng chương trình cho đến khi nhận được byte hoàn chỉnh. Điều này được thực hiện bằng cách cho phép ngắt hoàn toàn nhận dữ liệu.
3. DATA được truyền và nhận đến bộ điều khiển ở chế độ 8bit. Vì vậy, hai ký tự sẽ được gửi đến bộ điều khiển tại một thời điểm.
4. Không có bit chẵn lẻ, một bit dừng trong dữ liệu được gửi bởi mô-đun.
Các tính năng trên được thiết lập trong thanh ghi bộ điều khiển; chúng ta sẽ thảo luận ngắn gọn về chúng:
DARK GRAY (UDRE): Bit này không được đặt trong quá trình khởi động nhưng nó được sử dụng trong quá trình làm việc để kiểm tra xem máy phát đã sẵn sàng truyền hay chưa. Xem chương trình trên TRASMITTER SIDE để biết thêm chi tiết.
VOILET (TXEN): Bit này được thiết lập để bật chân máy phát trên TRASMITTER SIDE.
VÀNG (UCSZ0, UCSZ1 và UCSZ2): Ba bit này được sử dụng để chọn số lượng bit dữ liệu mà chúng tôi đang nhận hoặc gửi trong một lần.
Giao tiếp giữa hai SIDES được thiết lập như giao tiếp tám bit. Bằng cách kết hợp giao tiếp với bảng, chúng tôi có, UCSZ0, UCSZ1 thành một và UCSZ2 thành không.
ORANGE (UMSEL): Bit này được thiết lập dựa trên việc hệ thống đang giao tiếp không đồng bộ (cả hai sử dụng đồng hồ khác nhau) hay đồng bộ (cả hai sử dụng cùng một đồng hồ).
Cả hai SYTEMS không chia sẻ bất kỳ xung nhịp nào. Vì cả hai đều sử dụng đồng hồ nội bộ của riêng mình. Vì vậy, chúng ta cần đặt UMSEL thành 0 trong cả hai bộ điều khiển.
GREEN (UPM1, UPM0): Hai bit này được điều chỉnh dựa trên tính chẵn lẻ của bit mà chúng ta đang sử dụng trong giao tiếp.
Dữ liệu ATMEGA ở đây được lập trình để gửi dữ liệu không có tính chẵn lẻ, vì độ dài truyền dữ liệu nhỏ, chúng ta rõ ràng có thể không mất dữ liệu hoặc lỗi. Vì vậy, chúng tôi không đặt bất kỳ tính chẵn lẻ nào ở đây. Vì vậy, chúng tôi đặt cả UPM1, UPM0 bằng 0 hoặc chúng được để lại, vì tất cả các bit đều là 0 theo mặc định.
BLUE (USBS): Bit này được sử dụng để chọn số lượng bit dừng mà chúng tôi đang sử dụng trong quá trình giao tiếp.
Giao tiếp được thiết lập của cô ấy là loại không đồng bộ, vì vậy để truyền và nhận dữ liệu chính xác hơn, chúng tôi cần sử dụng hai bit dừng, Do đó chúng tôi đặt USBS thành '1' ở phía TRANSMITTER..
Tốc độ truyền được đặt trong bộ điều khiển bằng cách chọn UBRRH thích hợp:
Giá trị UBRRH được chọn bằng tốc độ truyền tham chiếu chéo và tần số tinh thể CPU:
Vì vậy, theo tham chiếu chéo, giá trị UBRR được xem là '6', và do đó tốc độ truyền được đặt.
Với điều này, chúng tôi đã thiết lập cài đặt trên TRANSMITTER SIDE; chúng ta sẽ nói về việc NHẬN MẶT bây giờ.
Việc kích hoạt giao tiếp nối tiếp trong UNO có thể được thực hiện bằng cách sử dụng một lệnh duy nhất.
|
Giao tiếp mà chúng tôi cho là thiết lập được thực hiện bằng tốc độ BAUD là 9600 bit mỗi giây. Vì vậy, để UNO thiết lập tốc độ truyền như vậy và bắt đầu giao tiếp nối tiếp, chúng tôi sử dụng lệnh ”Serial.begin (9600);”. Ở đây 9600 là tốc độ truyền và có thể thay đổi được.
Bây giờ tất cả còn lại nếu để nhận dữ liệu, một dữ liệu được nhận bởi UNO, nó sẽ có sẵn để lấy. Dữ liệu này được chọn bằng lệnh “allowdata = Serial.read ();”. Bằng lệnh này, dữ liệu nối tiếp được đưa đến 'dữ liệu nhận' có tên là số nguyên.
Như được minh họa trong mạch, một nút được kết nối ở phía máy phát, khi nhấn nút này, dữ liệu tám bit sẽ được gửi bởi TRANSMITTER (ATMEGA8) và dữ liệu này được nhận bởi RECEIVER (ARDUINO UNO). Khi nhận thành công dữ liệu này, nó sẽ bật và tắt đèn LED được kết nối với nó để BẬT và TẮT, để hiển thị việc truyền dữ liệu thành công giữa hai bộ điều khiển.
Bằng cách này, giao tiếp UART giữa bộ điều khiển ATMEGA8 và ARDUINO UNO được thiết lập thành công.