Ở đâ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 để thực hiện dự án nà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.
[Cũng kiểm tra: Giao tiếp UART giữa hai bộ điều khiển ATmega]
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 hiện tại chúng tôi sẽ giữ ở mức 8BITS.
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 đặt để 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.
The data ATMEGA here is programmed to send data with no parity, as the data transmission length is small, we can clearly expect no data loss or error. So we are not setting any parity here. So we set both UPM1, UPM0 to zero or they are left, because all bits are 0 by default.
BLUE (USBS): This bit is used for choosing the number of stop bits we are using during communication.
The communication established her is of asynchronous type, so for getting more accurate data transmission and reception, we need to use two stop bits, Hence we set USBS to ‘1’ in TRANSMITTER side..
The baud rate is set in controller by choosing the appropriate UBRRH:
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ề MẶT BẰNG TIẾP NHẬN ngay 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.
- Serial.begin(9600);
- receiveddata = Serial.read();
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ư 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 đượ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 tắt đèn LED được kết nối với nó BẬT và TẮT để hiển thị quá trình truyền dữ liệu thành công giữa hai bộ điều khiển.
PROGRAM ON TRANSMITTER SIDE:
#include <avr/io.h>
//header to enable data flow control over pins
#define F_CPU 1000000UL
//telling controller crystal frequency attached
#include <util/delay.h>
//header to enable delay function in program
int main(void)
{
DDRB =0;//PORTB is set as INPUT
DDRD |= 1 << PIND1;//pin1 of portD as OUTPUT
DDRD &= ~(1 << PIND0);//pin0 of portD as INPUT
PORTD |= 1 << PIND0;
int UBBRValue = 6;//AS described before setting baud rate 9600BPS
//Put the upper part of the baud number here (bits 8 to 11)
UBRRH = (unsigned char) (UBBRValue >> 8);
//Put the remaining part of the baud number here
UBRRL = (unsigned char) UBBRValue;
//Enable the receiver and transmitter
UCSRB = (1 << RXEN) | (1 << TXEN);
//Set 2 stop bits and data bit length is 8-bit
UCSRC = (1 << USBS) | (3 << UCSZ0);
while (1)
{
if (bit_is_clear(PINC,0))//once button is pressed
{
while (! (UCSRA & (1 << UDRE)) );
{
UDR = 0b11110000;//once transmitter is ready sent eight bit data
}
_delay_ms(220);
}
PROGRAM ON RECEIVER SIDE:
int receiveddata =0;
void setup()
{
Serial.begin(9600);//serial data rate is set for 9600BPS
pinMode(0,INPUT);//RXD pin is set for INPUT
pinMode(1,OUTPUT);
pinMode(7,OUTPUT);//PIN1,PIN7 are set for output
}
void loop()
{
if (Serial.available() > 0) //if data received is available
{
receiveddata = Serial.read();//read serial data available
if (receiveddata == 0)//compare the data received
{
PORTD^=(1<<7);//id data matches toggle the LED.
}
}
}