Tải bản đầy đủ (.docx) (22 trang)

Giao tiếp UART giữa máy tính và vi điều khiển full code

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (600.9 KB, 22 trang )

TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN ĐIỆN TỬ VIỄN THÔNG

BÁO CÁO VI XỬ LÝ
Đề tài :Giao tiếp UART giữa máy tính và vi điều khiển
Giáo viên hướng dẫn:Thầy Nguyễn Hoàng Dũng
Sinh viên thực hiện:
Tào Tuấn Mạnh 20111842 ĐTTT 7 - K56
Nguyễn Kim Nam 20101915 ĐTVT 5 - K55
Đào Minh Ngọc 20111905 ĐTTT 9 - K56
Nguyễn Văn Phòng 20113738 SPKT - K56
Hà Nội 5/2014
1

MỤC LỤC


LỜI NÓI ĐẦU
Như chúng ta đã biết,vi xử lí có ứng dụng rất rộng rãi trong cuộc sống.Vi xử
lí là bộ xử lý trung tâm trong: máy tính (PC, Laptop, mini computer, super
computer), thiết bị smartphone, thiết bị nhúng, và đặc biệt trong công nghiệp
ngành Điện - chuyên ngành tự động hóa: bộ điều khiển khả trình PLC và Vi điều
khiển để ứng dụng điều khiển các dây chuyền, hệ thống tự động Để có sự phát
triển mạnh mẽ như vậy,vi xử lí đã tiến hóa qua nhiều thế hệ,từ vi xử lí 4 bit thương
mại đầu tiên Intel 4004 đến các vi xử lí hiện đại dùng cho máy tính cá nhân ngày
nay như Intel Core i5,i7…Các mạch tích hợp trong các vi xử lí đời đầu chỉ chứa
vào khoảng vài chục transistor,đến nay đã có thể tích hợp hàng triệu transistor.Sự
tăng số lượng transistor tích hợp này tuân theo định luật Moore: sự phức tạp của
một mạch tích hợp sẽ tăng lên gấp đôi sau mỗi chu kỳ 18 tháng.Đi cùng với đó là
công suất tiêu thụ và giá thành các bộ vi xử lí giảm đáng kể.
Phân loại theo chức năng,vi xử lí được chia thành:vi xử lí đa năng,DSP,vi


điều khiển,vi xử lí chuyên dụng ASIP.Trong đó vi điều khiển được sử dụng rộng rãi
2
trong rất nhiều thiết bị trong đời sống như:đèn giao thông,máy giặt,điều hòa nhiệt
độ…,vi xử lí được chia thành:vi xử lí đa năng,DSP,vi điều khiển,vi xử lí chuyên
dụng ASIP.Trong đó vi điều khiển được sử dụng rộng rãi trong rất nhiều thiết bị
trong đời sống như:đèn giao thông,máy giặt,điều hòa nhiệt độ…Với sự hướng dẫn
của thầy Nguyễn Hoàng Dũng,nhóm chúng em đã tìm hiểu về họ vi điều khiển
AVR của hãng Atmel để hoàn thành bài tập lớn với chủ đề :”Giao tiếp với máy
tính bằng UART”
3
I / Giới thiệu chung về AVR
AVR là một họ vi điều khiển do hãng Atmel sản xuất.AVR là chip vi điều
khiển 8 bits với cấu trúc tập lệnh đơn giản hóa-RISC(Reduced Instruction Set
Computer), một kiểu cấu trúc đang thể hiện ưu thế trong các bộ xử lí.
So với các chip vi điều khiển 8 bits khác, AVR có nhiều đặc tính hơn hẳn,
hơn cả trong tính ứng dụng (dễ sử dụng) và đặc biệt là về chức năng:
• Gần như chúng ta không cần mắc thêm bất kỳ linh kiện phụ nào khi sử dụng
AVR, thậm chí không cần nguồn tạo xung clock cho chip (thường là các khối thạch
anh).
• Thiết bị lập trình (mạch nạp) cho AVR rất đơn giản, có loại mạch nạp chỉ
cần vài điện trở là có thể làm được. một số AVR còn hỗ trợ lập trình on – chip bằng
bootloader không cần mạch nạp…
• Bên cạnh lập trình bằng ASM, cấu trúc AVR được thiết kế tương thích C.
• Nguồn tài nguyên về source code, tài liệu, application note…rất lớn trên
internet.
• Hầu hết các chip AVR có những tính năng sau:
- Có thể sử dụng xung clock lên đến 16MHz, hoặc sử dụng xung clock nội lên đến 8
MHz (sai số 3%)
- Bộ nhớ chương trình Flash có thể lập trình lại rất nhiều lần và dung lượng lớn, có
SRAM (Ram tĩnh) lớn, và đặc biệt có bộ nhớ lưu trữ lập trình được EEPROM.

- Nhiều ngõ vào ra (I/O PORT) 2 hướng (bi-directional).
- 8 bits, 16 bits timer/counter tích hợp PWM.
- Các bộ chuyển đối Analog – Digital phân giải 10 bits, nhiều kênh.
- Chức năng Analog comparator.
- Giao diện nối tiếp USART (tương thích chuẩn nối tiếp RS-232).
- Giao diện nối tiếp Two –Wire –Serial (tương thích chuẩn I2C) Master và Slaver.
4
- Giao diện nối tiếp Serial Peripheral Interface (SPI)
Để lập trình cho các vi xử lý này ta dùng các phần mềm như AVRstudio,
CodeVision
Các vi xử lý đều có chung những đặc điểm sau:
• Điện áp làm việc là 5V
• Dòng qua các chân của vi xử lý nhỏ (cỡ vài chục mA), nên không thể đấu
trực tiếp với các thiết bị công suất lớn (động cơ ).
Trong đề tài “Giao tiếp UART” chúng em sẽ chọn vi xử lý Atmega 16.
5
Port A (PA7
÷
PA0)
Port B (PB7
÷
PB0)
Port C (PC7
÷
PC0)
Port D (PD7
÷
PD0)
VCC, GND, RESET, XTAL1, XTAL2, AVCC, AREF
VCC: Nguồn cung cấp.

GND: Đất.
RESET
: Ngõ vào Reset. Một mức thấp trên chân này dài hơn độ rộng xung tối
thiểu sẽ tạo ra một reset, ngay khi xung nhịp không hoạt động. Độ rộng xung tối
thiểu là 1,5us. Xung ngắn hơn không đảm bảo để tạo ra một reset.
XTAL1: Ngõ vào của bộ khuếch đại dao động đảo và mạch tạo xung nhịp bên
trong.
XTAL2: Ngõ ra của bộ khuếch đại dao động đảo.
6
AVCC: là chân nguồn cung cấp cho Port A và bộ chuyển đổi A/D. Nó nên
được kết nối ngoài tới VCC, ngay khi nếu bộ ADC không được dùng. Nếu bộ ADC
được sử dụng thì nó được kết nối tới VCC thông qua một mạch lọc thông thấp.
AREF: là chân tham chiếu cho bộ chuyển đổi A/D.
Hình 1 mô tả cấu trúc bộ nhớ của AVR.
Hình 1: Cấu trúc bộ nhớ của AVR
II / Thiết kế mạch
1 / Phân tích yêu cầu đề tài
+ Đối với đề tài:” Giao tiếp với máy tính bằng UART”, nhóm chúng em đã tìm
hiểu về cách thức giao tiếp giữa vi xử lí và máy tính này
a / UART (Universal Asynchronous serial Reveiver and Transmitter – Bộ truyền
nhận nối tiếp không đồng bộ)
- UART thường để chỉ thiết bị phần cứng (device, hardware), không
phải chỉ một chuẩn giao tiếp. UART cần phải kết hợp với một thiết bị
chuyển đổi mức điện áp để tạo ra một chuẩn giao tiếp nào đó.
- Tín hiệu từ chip UART thường theo mức TTL: mức logic high là 5,
mức low là 0V
Các khái niệm trong phương thức truyền thông này:
• Baud rate (tốc độ Baud): như trong ví dụ trên về việc truyền 1 bit trong
1ms, bạn thấy rằng để việc truyền và nhận không đồng bộ xảy ra thành công
thì các thiết bị tham gia phải “thống nhất” nhau về khoảng thời dành cho 1

7
bit truyền, hay nói cách khác tốc độ truyền phải được cài đặt như nhau trước,
tốc độ này gọi là tốc độ Baud. Theo định nghĩa, tốc độ baud là số bit truyền
trong 1 giây. Ví dụ nếu tốc độ baud được đặt là 19200 thì thời gian dành cho
1 bit truyền là 1/19200 ~ 52.083us.
• Frame (khung truyền): do truyền thông nối tiếp mà nhất là nối tiếp không
đồng bộ rất dễ mất hoặc sai lệch dữ liệu, quá trình truyền thông theo kiểu
này phải tuân theo một số quy cách nhất định. Bên cạnh tốc độ baud, khung
truyền là một yếu tốc quan trọng tạo nên sự thành công khi truyền và nhận.
Khung truyền bao gồm các quy định về số bit trong mỗi lần truyền, các bit
“báo” như bit Start và bit Stop, các bit kiểm tra như Parity, ngoài ra số lượng
các bit trong một data cũng được quy định bởi khung truyền. Hình 1 là một
ví dụ của một khung truyền theo UART, khung truyền này được bắt đầu
bằng một start bit, tiếp theo là 8 bit data, sau đó là 1 bit parity dùng kiểm tra
dữ liệu và cuối cùng là 2 bits stop.
• Start bit: start là bit đầu tiên được truyền trong một frame truyền, bit này có
chức năng báo cho thiết bị nhận biết rằng có một gói dữ liệu sắp được truyền
tới. Ở module USART trong AVR, đường truyền luôn ở trạng thái cao khi
nghỉ (Idle), nếu một chip AVR muốn thực hiện việc truyền dữ liệu nó sẽ gởi
một bit start bằng cách “kéo” đường truyền xuống mức 0. Như vậy, với AVR
bit start là mang giá trị 0 và có giá trị điện áp 0V (với chuẩn RS232 giá trị
điện áp của bit start là ngược lại), start là bit bắt buộc phải có trong khung
truyền.
• Data: data hay dữ liệu cần truyền là thông tin chính mà chúng ta cần gởi và
nhận. Data không nhất thiết phải là gói 8 bit, với AVR bạn có thể quy định
số lượng bit của data là 5, 6, 7, 8 hoặc 9 (tương tự cho hầu hết các thiết bị hỗ
trợ UART khác). Trong truyền thông nối tiếp UART, bit có ảnh hưởng nhỏ
nhất (LSB – Least Significant Bit, bit bên phải) của data sẽ được truyền
trước và cuối cùng là bit có ảnh hưởng lớn nhất (MSB – Most Significant
Bit, bit bên trái).

• Parity bit: parity là bit dùng kiểm tra dữ liệu truyền đúng không (một cách
tương đối). Có 2 loại parity là parity chẵn (even parity) và parity lẻ (odd
parity). Parity chẵn nghĩa là số lượng số 1 trong dữ liệu bao gồm bit parity
luôn là số chẵn. Ngược lại tổng số lượng các số 1 trong parity lẻ luôn là số
lẻ. Ví dụ, nếu dữ liệu của bạn là 10111011 nhị phân, có tất cả 6 số 1 trong dữ
liệu này, nếu parity chẵn được dùng, bit parity sẽ mang giá trị 0 để đảm bảo
tổng các số 1 là số chẵn (6 số 1). Nếu parity lẻ được yêu cầu thì giá trị của
parity bit là 1. Hình 1 mô tả ví dụ này với parity chẵn được sử dụng. Parity
8
bit không phải là bit bắt buộc và vì thế chúng ta có thể loại bit này khỏi
khung truyền (các ví dụ trong bài này tôi không dùng bit parity).
• Stop bits: stop bits là một hoặc các bit báo cho thiết bị nhận rằng một gói dữ
liệu đã được gởi xong. Sau khi nhận được stop bits, thiết bị nhận sẽ tiến
hành kiểm tra khung truyền để đảm bảo tính chính xác của dữ liệu. Stop bits
là các bits bắt buộc xuất hiện trong khung truyền, trong AVR USART có thể
là 1 hoặc 2 bits (Trong các thiết bị khác Stop bits có thể là 2.5 bits). Trong
ví dụ ở hình 1, có 2 stop bits được dùng cho khung truyền.Giá trị của stop bit
luôn là giá trị nghỉ (Idle) và là ngược với giá trị của start bit, giá trị stop bit
trong AVR luôn là mức cao (5V).

• (Khung truyền phổ biến nhất là : 1 start bit+ 8 bit data+1 stop bit)
b / Xác định đề tài
- Các vi điều khiển như Atmega 8,Atmega16… đã có sẵn module
UART.Có 2 chân liên quan đến module này là RxD(chân nhận dữ
liệu) và TxD(chân truyền dữ liệu).
- Sau khi nhận đề tài và thảo luận,nhóm quyết định thực hiện đề tài:”Đo
và điều khiển đo nhiệt độ phòng và giao tiếp với máy tính bằng
UART”.
- Nhóm sử dụng cảm biến nhiệt độ để đo nhiệt độ phòng, rồi truyền số
liệu nhận được bằng giao tiếp UART giữa vi điều khiển và máy tính

để hiện thị lên màn hình máy tính
2 / Xây dựng sơ đồ khối
Mạch của nhóm có sơ đồ khối tổng quan:
9
Hình 2: Sơ đồ khối tổng quan
3 / Thông số kĩ thuật từng khối
a / Khối nguồn
+ Mạch cần có nguồn nuôi là nguồn 5V DC
+ Để có nguồn nuôi ổn định,nhóm sử dụng adapter 9V – 1A và mạch sử dụng
IC LM7805 để có đầu ra là dòng 5V – 1A
10
b / Khối cảm biến
+ Để có thể đo nhiệt độ phòng, nhóm chúng em sử dụng cảm biến nhiệt LM35
nối với chân ADC0 (chân 40 ) của Atmega16.
+Cảm biến LM35 là bộ cảm biến nhiệt mạch tích hợp chính xác cao mà điện áp
đầu ra của nó tỷ lệ tuyến tính với nhiệt độ theo thang độ Celsius
+Việc đo nhiệt độ sử dụng LM35 thông thường chúng ta sử dụng bằng cách
LM35 - > ADC - > Vi điều khiển
c / Khối điều khiển
+ Có nhiều vi điều khiển AVR trên thị trường.Để phù hợp với chức năng của
mạch,đồng thời tiết kiệm tiền bạc và tài nguyên bộ nhớ,nhóm quyết định chọn
vi điều khiển Atmega16
+ Để tiện cho việc nạp code,nhóm sử dụng chân nạp ISP
+ Vi điều khiển được tạo dao động với thạch anh 8Mhz và có nút bấm để Reset
d / Khối giao tiếp máy tính
Trong truyền thông với máy tính, chuẩn giao tiếp RS232 được sử dụng vì vậy cần kết
nối với IC MAX232 để chuyển các mức điện áp thành chuẩn TTL.
11
e / Khối hiển thị
Sử dụng LCD 1602 để hiện thị nhiệt độ đo được và các kí tự nhận được từ máy

tính.
12
4 / Xây dựng sơ đồ nguyên lí toàn mạch
13
5 / Xây dựng sơ đồ mạch in toàn mạch
6 / Đo đạc,đánh giá,kiểm tra chất lượng toàn mạch
14
III / Lập trình và mô phỏng
1 / Mô phỏng
Nhóm chúng em sử dụng proteus để mô phỏng mạch:
2 / Mã nguồn
Nhóm chúng em sử dụng phần mềm code vision để viết code bằng ngôn ngữ C
thực hiện các chức năng đã phân tích.
(Phụ lục 1)
15
3 / Kết quả mô phỏng
LCD hiển thị nhiệt độ đo được và kí tự khi gõ kí tự từ bàn phím máy tính
Khi bấm kí tự e (quy ước để điểu khiển đo nhiệt độ) thì LM35 sẽ đo và cập nhật
lại nhiệt độ ,hiển thị lên LCD.
16
IV / Kết luận
Sau một thời gian học tập và nghiên cứu, nhóm chúng em đã hoàn thành bài tập
lớn,mạch đã chạy được tuy nhiên còn nhiều hạn chế như trễ hơi lâu ,đôi khi LCD
hiện không đúng chữ mong muốn.Nhóm chúng em mong nhận được nhiều góp ý
từ thầy.
Tài liệu tham khảo:
• Giáo trình vi điều khiển AVR
• Kỹ thuật vi điều khiển AVR
• WEB: hocavr.com
17

Phụ lục 1:
Mã nguồn trong code vision:
#include <mega16.h>
#include <stdio.h>
#include <stdlib.h>
#include <delay.h>
// Alphanumeric LCD Module functions
#include <alcd.h>
….
float adc_vIn;
int nhietDo;
unsigned char thongBao[10];
char Data;
char str[50];
void main(void)
{
PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC=0x00;
DDRC=0xFF;
18
PORTD=0x00;
DDRD=0xFE;
….
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On

// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;
#asm("sei")
lcd_init(16);
lcd_clear();
lcd_gotoxy(0,0);
sprintf(str,"Nhom8-VXL");
puts(str); //Gui len may tinh chuoi ki tu
putchar(13);
sprintf(str,"Giao tiep UART \n");
puts(str); //Gui len may tinh chuoi ki tu DDTT07-K56
putchar(13);
sprintf(str,"Nhan phim e de cap nhat lai nhiet do hien thi LCD");
19
puts(str);
putchar(13);
F:adc_vIn = (float)adc_data[0]*5/1024; // doc gia tri dien ap Vadc In
nhietDo = adc_vIn*100; // quy doi ra nhiet do
itoa(nhietDo,thongBao); // chuyen kieu de hien thi ra LCD
lcd_clear();
lcd_putsf("Nhiet do la:");
lcd_puts(thongBao); // hien thi nhiet do ra LCD
delay_ms(100);
sprintf(str,"Nhiet do do duoc:");
puts(str);

puts(thongBao); puts("^C");
putchar(13);
while (1)
{
// Place your code here
Data = getchar();
if(Data)
{
lcd_gotoxy(0,1);
sprintf(str,"Ky tu: %c",Data);
lcd_puts(str);
}
delay_ms(1);
20
if (Data == 'e') goto F;
}
}

PHỤ LỤC 2: Bảng phân công công việc nhóm
Tuần Mạnh Nam Ngọc Phòng
21
3
Tìm hiểu chung AVR(tìm hiểu UART+xác định yêu
cầu đề tài)
4
5
Tìm hiểu ,thiết kế các khối
trong mạch
Tìm hiểu code để lập
trình

6
7
8
Thiết kế mạch nguyên
lý(altium) + vẽ mô
phỏng(proteus)
Viết Code
9
10
11 Chạy ,kiểm tra mô phỏng
12 Layout mạch in Mua linh kiện
13 Chỉnh sửa ,tối ưu code Đặt mạch
14 Hoàn thiện + chỉnh sửa mạch
15 Viết báo cáo
22

×