Upload
tranthiecchan
View
407
Download
4
Embed Size (px)
Citation preview
ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINHTRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
BÁO CÁO ĐỀ TÀI VI ĐIỀU KHIỂN AVR
Thành viên:Võ Đình Chinh MSSV: 07520456 KTMT02Phạm Hoài Phước MSSV: 07520292 KTMT02Trần Minh Tính MSSV: 07520362 KTMT02Huỳnh Thanh Long MSSV: 07520588 KTMT02
GVHD: ThS Lê Hoài Nghĩa
Tp Hồ Chí Minh 20/055/2010
LÔØI GIỚI THIỆU
Từ khi công nghệ chế tạo loại vi mạch lập trình ra đời đã đem đến các kỹ thuật
điều khiển hiện đại có nhiều ưu điểm hơn so với việc sử dụng các mạch điều khiển lắp
ráp bằng các linh kiện rời như kích thước nhỏ, giá thành rẻ, độ làm việc tin cậy, công
suất tiêu thụ nhỏ. Hàng loạt nhà sản xuất MCU ra đời như Atmel, Philip, Motorola
với hàng loạt chip với nhiều tính năng vô cùng phong phú và đa dạng.
Ngày nay, lĩnh vực điều khiển đã được ứng dụng rộng rãi trong các thiết bị, sản
phẩm phục vụ cho nhu cầu sinh hoạt hàng ngày của con người như máy giặt, đồng hồ
báo giờ….. đã giúp cho đời sống cuả chúng ta ngày càng hiện đại và tiện nghi hơn.
Trong số những nhà sản xuất MCU 8 bit thì Atmel đã trở nên quá quen thuộc
với giới sinh viên, kỹ thuật Việt Nam. Nhóm chúng em tìm hiểu đề tài về MCU AVR
– một trong những MCU được sử dụng rất rộng rãi trong kỹ thuật điều khiển. Vì kiến
thức có hạn nên trong nội dung đề tài chắc chắn không tránh khỏi thiếu sót. Nhóm
chúng em xin gửi lời cám ơn đến thầy Lê Hoài Nghĩa và sẽ cố gắng hoàn thiện trong
những lần báo cáo sau.
Thay mặt nhóm
Võ Đình Chinh
MỤC LỤC
&1 – GIỚI THIỆU AVR MCU ATMEL ……………………………01
I – Tổng quan về AVR …………………………………………………………..01
1. Giới thiệu ………………………………………………………………….01
2. Ưu thế của MCU AVR ……………………………………………………01
3. Một số dòng AVR ………………………………………………………...02
II – Một số dòng AVR phổ biến ………………………………………………..03
&2 – ATMEGA16 – KIẾN TRÚC TỔNG QUAN ……………….05
I – Ưu điểm ………………………………………………………………………05
II – Kiến trúc …………………………………………………………………….05
1. Sơ đồ chân ………………………………………………………………...05
2. Sơ đồ khối …………………………………………………………………06
3. Các port xuất nhập ………………………………………………………...06
4. Các chân khác ……………………………………………………………..07
III – Các khối chính ……………………………………………………………..07
1. CPU ……………………………………………………………………….07
2. Con trỏ ngăn xếp SP ………………………………………………………09
3. Memory …………………………………………………………………...10
4. Quá trình thực thi lệnh …………………………………………………….12
&3 – CÁC MODULE ĐIỀU KHIỂN TRONG ATMEGA16….13
I – Input & Ouput ……………………………………………………………….13
1. Giới thiệu ………………………………………………………………….13
2. Cấu tạo chân ……………………………………………………………….14
3. Thiết lập truy xuất I/O ………………………………….………………….15
II – Timer & Counter ……………………………………………………………16
1. Giới thiệu …………………………………………………………………..16
2. Cấu trúc bộ định thời 8 bit Timer 0 ………………………………………..16
3. Mô tả chi tiết các thanh ghi của bộ định thời ………………………………19
4. Sử dụng timer/counter ……………………………………………………..21
5. Các chế độ hoạt động của Timer 0 …………………………………………21
6. Các bước sử dụng Timer …………………………………………………..24
III – Interrupt …………………………………………………………………….25
1. Giới thiệu …………………………………………………………………..25
2. Ngắt ngoài ATMEGA16 …………………………………………………..26
3. Các thanh ghi phục vụ ngắt ………………………………………………..27
4. Thiết lập ngắt ngoài ………………………………………………………..28
IV – ADC …………………………………………………………………………30
1. Giới thiệu …………………………………………………………………..30
2. Cấu trúc …………………………………………………………………….30
3. Các thanh ghi điều khiển ADC …………………………………………….31
4. Quá trình chuyển đổi ADC ………………………………………………...37
5. Các bươc lập trình điều khiển ADC ……………………………………….38
V – USART ……………………………………………………………………….39
1. Giới thiệu …………………………………………………………………..39
2. Cấu trúc của một USART ………………………………………………….40
3. Tạo xung clock cho USART ……………………………………………….41
4. Một số khái niệm liên quan đến USART …………………………………..42
5. Các thanh ghi điều khiển USART ………………………………………….44
6. Sử dụng USART …………………………………………………………..49
VI – SPI …………………………………………………………………………..51
1. Giới thiệu …………………………………………………………………..51
2. Cấu trúc của một SPI ………………………………………………………54
3. Các thanh ghi điều khiển SPI ………………………………………………55
4. Sử dụng SPI ………………………………………………………………..59
VII – TWI-I2C …………………………………………………………………...61
1. Giới thiệu …………………………………………………………………..61
2. Cấu trúc của một I2C ………………………………………………………64
3. Các thanh ghi điều khiển I2C ………………………………………………65
4. Sử dụng TWI-I2C ………………………………………………………….68
Kết luận …………………………………………………………………………...70
&1. GIỚI THIỆU AVR MCU ATMEL
I. Tổng quan về AVR:
1. Giới thiệu:
AVR là một họ vi điều khiển do hãng Atmel sản xuất. Atmel cung cấp
các vi điều khiển phổ biến như 8051, AT91 ARM7, Atmel AVR 8-bit
RISC, và mới đây là DSP dual-CPU AT57. Atmel AVR32 là một vi
điều khiển lai DSP với 7 tầng pipeline và khả năng thực thi song song..
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í.
Hình vẽ:
2. Ưu thế của MCU AVR:
Kết nối phần cứng cho AVR đơn giản với những linh kiện thông dụng
như điện trở, tụ điện, thạch anh. Dòng ra điều khiển Port lớn và không
cần dùng điện trở kéo.
Thiết kế mạch nạp cho AVR khá đơn giản giao tiếp qua cổng LPT,
COM, USB. Hỗ trợ ISP lập trình trực tiếp trên mạch.
Hỗ trợ lập trình trên nền ngôn ngữ ASM, C với nhiều công cụ hỗ trợ
như CodeVision, AVR Studio.
Hầu hết các chip AVR có những tính năng (features) sau:
1
Xung External OSC lên đến 16Mhz và Internal OSC 8Mhz.
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ó thể ghi và xóa trên 1000 lần. Bên cạnh đó bộ
nhớ EEPROM có thể lập trình được.
32 Port xuất nhập.
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
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.
Giao diện nối tiếp Serial Peripheral Interface (SPI).
3. Một số dòng AVR:
Nhìn chung AVR có các dòng chính sau:
* tinyAVR — the ATtiny series
1–8 kB program memory
6–32-pin package
Limited peripheral set
* megaAVR — the ATmega series
4–256 kB program memory
28–100-pin package
Extended instruction set (Multiply instructions and instructions
for handling larger program memories)
2
Extensive peripheral set
* XMEGA — the ATxmega series
16–384 kB program memory
44–64–100-pin package (A4, A3, A1)
Extended performance features, such as DMA, "Event System", and
cryptography support.
Extensive peripheral set with DACs
* Application specific AVR
megaAVRs with special features not found on the other members of
the AVR family, such as LCD controller, USB controller, advanced
PWM, CAN etc.
II.Một số dòng AVR phổ biến:
AT90S1200
AT90S2313
AT90S2323 and AT90S2343
AT90S2333 and AT90S4433
AT90S4414 and AT90S8515
AT90S4434 and AT90S8535
AT90C8534
ATtiny10, ATtiny11 and ATtiny12
ATtiny15
ATtiny22
ATtiny26
ATtiny28
3
ATmega8/8515/8535
ATmega16
ATmega161
ATmega162
ATmega163
ATmega169
ATmega32
ATmega323
ATmega103
ATmega64/128/2560/2561
4
&2. ATMEGA16 – KIẾN TRÚC TỔNG QUAN
I. Ưu điểm:
Tốc độ xử lý cao, tiêu thụ điện năng thấp
Kiến trúc 131 tập lệnh thưc thi hầu hết trong mỗi chu kỳ xung clock
32x8 thanh ghi đa dụng
Đạt tốc độ tối đa 16MIPS ở 16Mhz xung clock
Dung lượng bộ nhớ: 16Kb Flash, 512 EEPROM, 1kb Internal SRAm
Khả năng ghi và xóa có thể đạt đến 10000 lần, lưu trữ trong thời gian
dài trên 20 năm/85oC-100 năm 25oC.
Giao tiếp chuẩn JTAG hỗ trợ debug, Lock, Fuse bit
2 bộ Timer 16 bit, 1 bộ timer 16 bit
4 kênh PWM
8 kênh ADC 10 bit
32 port xuất nhập
Hỗ trợ gioa tiếp I2C, USART, SPI
Hoạt động tốt ở hiệu điện thế 4.5-5.5 .
II.Kiến trúc:
1. Sơ đồ chân:
5
2. Sơ đồ khối:
3. Các Port xuất nhập:
a. Port A:
Port A là bên cạnh là Port xuất nhập thông thường 8 bit còn được thiết
kế cho bộ ADC chuyển đổi tương tự số. Port A thiết kế với điện trở nội
treo lên ở mức cao.
b. Port B:
Là port xuất nhập thông thường 8 bit.
c. Port C:
6
Là port xuất nhập thông thường 8 bit. Bên cạnh đó Port C còn có một số
chân giao tiếp JTAG PC5-TDI, PC3-TMS, PC2 –TCK.
d. PORT D:
Là port xuất nhập thông thường 8 bit.
4. Các chân khác:
VCC, AVCC, AREF, XTAL1, XTAL2, RESET
III. Các khối chính:
1. CPU:
AVR có cấu trúc Harvard, trong đó đường truyền cho bộ nhớ dữ liệu (data
memory bus) và đường truyền cho bộ nhớ chương trình (program memory bus)
được tách riêng. Data memory bus chỉ có 8 bit và được kết nối với hầu hết các
thiết bị ngoại vi, với register file. Trong khi đó program memory bus có độ
rộng 16 bits và chỉ phục vụ cho instruction registers.
a. ALU:
7
ALU làm việc trực tiếp với các thanh ghi chức năng chung. Các phép
toán được thực hiện trong một chu kỳ xung clock. Hoạt động của ALU
được chia làm 3 loại: đại số, logic và theo bit.
b. Thanh ghi trạng thái:
Đây là thanh ghi 8 bit lưu trữ trạng thái của ALU sau các phép tính số
học và logic.
C: Carry Flag cờ nhớ .
Z: Zero Flag Cờ zero.
N: Negative Flag kết quả phép toán âm.
V: Two’s complement overflow cờ bù 2.
S For signed tests (S=N XOR V) kiểm tra 2 cờ N và V.
H: Half Carry Flag được sử dụng trong BCD cho một số toán hạng.
T: Transfer bit used by BLD and BST instructionsđược sử dụng
làm nơi trung gian trong các lệnh BLD,BST.
I: Global Interrupt Enable/Disable Flag ây là bit cho phép toàn cục
ngắt. Nếu bit này ở trạng thái logic 0 thì không có một ngắt nào
được phục vụ.
c. Thanh ghi chức năng chung:
Atmega 16 có 32 thanh ghi chức năng chung thực thi nhiều tác vụ trong
đó:
8
Một 8 bit output toán hạng và một 8 bit cho input kết quả.
Hai 8 bit output toán hạng và một 8 bit cho input kết quả.
Hai 8 bit cho output kết quả và một 16 bit cho input kết quả.
Một 16 bit cho output toán hạng và một 16 bit cho input kết quả.
2. Con trỏ ngăn xếp SP:
Là một thanh ghi 16 bit nhưng cũng có thể được xem như hai thanh ghi
chức năng đặc biệt 8 bit dùng để lưu trữ biến trong quá trình tính toán.
Stack được hiểu như là 1 “tháp” dữ liệu, dữ liệu được chứa vào stack ở
đỉnh “tháp” và dữ liệu cũng được lấy ra từ đỉnh. Kiểu truy cập dữ liệu
của stack gọi là LIFO.
Khia báo SP tại một vùng nhớ trong SRAM với địa chỉ của SP thiết lập
>$60. Con trỏ giảm địa chỉ xuống 1 khi dữ liệu được đưa vào Stack với
lệnh PUSH và hai khi có Subroutine hoặc Interrupt được gọi. Con trỏ
tăng địa chỉ lên 1 khi có lệnh POP dữ liệu thực hiện và lên hai khi trả
dữ liệu về cho chương trình con.
9
3. Memory:
a. Bộ nhớ chương trình Flash:
Bộ nhớ Flash 16KB của ATmega16 dùng để lưu trữ chương trình với độ
rộng 16 bit. Do các lệnh của AVR có độ dài 16 hoặc 32 bit nên bộ nhớ
Flash được sắp xếp theo kiểu 8KX16.
Bộ nhớ chương trình chỉ gồm 1 phần là Application Flash Section
nhưng trong các chip AVR mới chúng ta có thêm phần Boot Flash
section. Boot Section. Thực chất, application section bao gồm 2 phần:
phần chứa các instruction và phần chứa interrupt vectors. Các vector
ngắt nằm ở phần đầu của application section từ địa chỉ 0x0000 và dài
đến bao nhiêu tùy thuộc vào loại chip và phần chứa instruction nằm liền
sau đó. Các chương trình được viết sau địa chỉ đó.
10
b. Bộ nhớ dữ liệu SRAM:
Đây là phần chứa các thanh ghi quan trọng nhất của chip, việc lập trình
cho chip phần lớn là truy cập bộ nhớ này và bộ nhớ này gồm các phần
sau:
Phần 1: là phần đầu tiên trong bộ nhớ dữ liệu bao gồm 32 thanh
General Purpose Rgegister – GPR. Tất cả các thanh ghi này đều là các
thanh ghi 8 bits. Tất cả các chip trong họ AVR đều bao gồm 32 thanh
ghi Register File có địa chỉ tuyệt đối từ 0x0000 đến 0x001F. Mỗi
thanh ghi có thể chứa giá trị dương từ 0 đến 255 hoặc các giá trị có dấu
từ -128 đến 127 hoặc mã ASCII của một ký tự nào đó…Các thanh ghi
này được đặt tên theo thứ tự là R0 đến R31. Chúng được chia thành 2
phần, phần 1 bao gồm các thanh ghi từ R0 đến R15 và phần 2 là các
thanh ghi R16 đến R31.
Phần 2: là phần nằm ngay sau SFR bao gồm 64 thanh ghi IO hay còn
gọi là vùng nhớ IO. Vùng nhớ I/O là cửa ngõ giao tiếp giữa CPU và
thiết bị ngoại vi. Vùng nhớ I/O có thể được truy cập như S
RAM hay như các thanh ghi I/O. Nếu sử dụng instruction truy xuất
SRAM để truy xuất vùng nhớ này thì địa chỉ của chúng được tính từ
11
0x0020 đến 0x005F. Nhưng nếu truy xuất như các thanh ghi I/O thì
địa chỉ của chúng đựơc tính từ 0x0000 đến 0x003F.
Phần 3: internal SRAM là vùng không gian cho chứa các biến trong
lúc thực thi chương trình.
c. Bộ nhớ dữ liệu EEPROM:
ATmega16 chứa bộ nhớ dữ liệu EEPROM dung lượng 512 byte, và
được sắp xếp theo từng byte, cho phép các thao tác đọc/ghi từng byte
một. EEPROM được tách riêng và có địa chỉ tính từ 0x0000H.
4. Quá trình thực thi lệnh:
Giản đồ xung:
Các instruction được chứa trong bộ nhớ chương trình Flash memory
dưới dạng các thanh ghi 16 bit. Bộ nhớ chương trình được truy cập
trong mỗi chu kỳ xung clock và 1 instruction chứa trong program
memory sẽ được load vào trong instruction register, instruction register
tác động và lựa chọn register file cũng như RAM cho ALU thực thi.
Trong lúc thực thi chương trình, địa chỉ của dòng lệnh đang thực thi
được quyết định bởi một bộ đếm chương trình – PC (Program counter).
Hầu hết các instruction đều được thực thi trong 1 chu kỳ xung clock.
12
&3.CÁC MODULE ĐIỀU KHIỂN TRONG ATMEGA 16
I. Input & Output:
1. Giới thiệu:
Vi điều khiểnATmega16có 32 đường vào ra chia làm bốn Port: PORTA-
PORTB-PORTC-PORTD mỗi Port 8bit có thể tương tác điều khiển từng bit
một. Các cổng ra có điện trở nội kéo lên nên khi dùng chức năng input ta
không cần dùng điện trở kéo lên ở bên ngoài. Các Port được điều khiển bởi
các bô thanh ghi sau: thanh ghi dữ liệu cổng PORT, thanh ghi dữ liệu điều
khiển cổng DDR và cuối cùng là địa chỉ chân vào của cổng PIN.
a. Thanh ghi DDR:
Đây là thanh ghi 8 bit (ta có thể đọc và ghi các bit ở thanh ghi này) và có
tác dụng điều khiển hướng cổng PORT (tức là cổng ra hay cổng vào). Nếu
như một bit trong thanh ghi này được set thì bit tương ứng đó trên PORT
được định nghĩa như một cổng ra. Ngược lại nếu như bit đó không được set
thì bit tương ứng trên PORT được định nghĩa là cổng vào.
b. Thanh ghi PORT:
Đây cũng là thanh ghi 8 bit (các bit có thể đọc và ghi được) nó là thanh ghi
dữ liệu của cổng P và trong trường hợp nếu cổng được định nghĩa là cổng
ra thì khi ta ghi một bit lên thanh ghi này thì chân tương ứng trên port đó
cũng có cùng mức logic. Trong trường hợp mà cổng được định nghĩa là
cổng vào thì thanh ghi này lại mang dữ liệu điều khiển cổng. Cụ thể nếu bit
nào đó của thanh ghi này được set (đưa lên mức 1) thì điện trở kéo lên
(pull-up) của chân tương ứng của port đó sẽ được kích hoạt. Ngược lại nó
sẽ ở trạng thái hi-Z. Thanh ghi này sau khi khởi động Vi điều khiểnsẽ có
giá trị là 000.
c. Thanh ghi PIN:
13
Đây là thanh ghi 8 bit chứa dữ liệu vào của PORT (trong trường hợp PORT
được thiết lập là cổng vào) và nó chỉ có thể đọc mà không thể ghi vào được.
2. Cấu tạo chân:
Cấu trúc chân của AVR có thể phân biệt rõ chức năng (vào ra) trạng thái (0
1) từ đó ta có 4 kiểu vào ra cho một chân của avr. Khác với 89 là chỉ có 2
trạng thái duy nhất (0 1) . Đặc biệt nguồn từ chân của AVR đủ khoẻ để điều
khiển Led trực tiếp (mA) còn 89 chỉ là vài uA .
Bảng trạng thái truy xuất I/O:
14
Giản đồ xung khi truy cập chân:
3. Thiết lập truy xuất I/O:
a. Read:
Đưa dữ liệu ra thanh ghi điều khiển DDRxn để đặt cho PORTx (hoặc bit n
trong port) đó là đầu vào (xóa thanh ghi DDRx hoặc bit).
Kích hoạt điện trở pull-up bằng cách set thanh ghi PORTx ( bit).
Cuối cùng đọc dữ liệu từ địa chỉ PINxn (trong đó x: là cổng và n là bit).
b. Write:
Đưa dữ liệu ra thanh ghi điều khiển DDRxn để đặt cho PORTx (hoặc bit n
trong port) đó là đầu ra (xóa thanh ghi DDRx hoặc bit).
Xuất giá trị ra Port
c. Code Example:
#include <avr/io.h>
15
#include <avr/interrupt.h>
#include <util/delay.h>
int main(void){
DDRB=0xFF; //PORTB la output PORT
PORTB=0x00;
DDRD=0x00; //PORTD la input PORT
PORTB=0xFF;
while (1){ //vòng lặp vô tận
//do nothing
}
return 0;
}
II.Timer&Counter:
1. Giới thiệu:
Bộ định thời (timer/counter0) là một module định thời/đếm 8 bit/16 bit,
Atmega 16 có 4 bộ định thời là Timer 0-Timer 2 8 bit và Timer 1 16 bit dùng
để định thời gian và đếm sự kiện với các đặc điểm sau:
Bộ đếm một kênh
Xóa bộ định thời khi trong mode so sánh (tự động nạp)
PWM
Tạo tần số
Bộ đếm sự kiện ngoài
Bộ chia tần 10 bit
Nguồn ngắt tràn bộ đếm và so sánh
2. Cấu trúc bộ định thời 8 bit Timer 0:
16
a. Sơ đồ khối:
b. Các thanh ghi:
TCNT0 và OCR0 là các thanh ghi 8 bit. Các tín hiệu yêu cầu ngắt đều nằm
trong thanh ghi TIFR. Các ngắt có thể được che bởi thanh ghi TIMSK. Bộ
định thời có thể sử dụng xung clock nội thông qua bộ chia hoặc xung
clock ngoài trên chân T0. Khối chọn xung clock điều khiển việc bộ định
thời/bộ đếm sẽ dùng nguồn xung nào để tăng giá trị của nó.
Ngõ ra của khối chọn xung clock được xem là xung clock của bộ định thời
(clkT0). Thanh ghi OCR0 luôn được so sánh với giá trị của bộ định thời/bộ
đếm. Kết quả so sánh có thể được sử dụng để tạo ra PWM hoặc biến đổi tần
số ngõ ra tại chân OC0.
c. Đơn vị đếm:
Phần chính của bộ định thời 8 bit là một đơn vị đếm song hướng có thể lập
trình
được. Cấu trúc của nó như hình dưới đây:
17
count: tăng hay giảm TCNT0 1
direction: lựa chọn giữa đếm lên và đếm xuống
clear: xóa thanh ghi TCNT0
clkT0: xung clock của bộ định thời
TOP: báo hiệu bộ định thời đã tăng đến giá trị lớn nhất
BOTTOM: báo hiệu bộ định thời đã giảm đến giá trị nhỏ nhất (0)
d. Đơn vị so sánh ngõ ra:
Bộ so sánh 8 bit liên tục so sánh giá trị TCNT0 với giá trị trong thanh ghi
so sánh ngõ ra (OCR0). Khi giá trị TCNT0 bằng với OCR0, bộ so sánh sẽ
tạo một báo hiệu. Báo hiệu này sẽ đặt giá trị cờ so sánh ngõ ra (OCF0) lên 1
vào chu kỳ xung clock tiếp theo. Nếu được kích hoạt (OCIE0=1), cờ OCF0
sẽ tạo ra một ngắt so sánh ngõ ra và sẽ tự động được xóa khi ngắt được thực
thi. Cờ OCF0 cũng có thể được xóa bằng phần mềm.
18
3. Mô tả chi tiết các thanh ghi của bộ định thời:
Có 4 thanh ghi được thiết kế riêng cho hoạt động và điều khiển T/C0, đó là:
a. Thanh ghi điều khiển bộ định thời/bộ đếm TCCR0:
Bit 7-FOC0: So sánh ngõ ra bắt buộc. Bit này chỉ tích cực khi bit
WGM00 chỉ định chế độ làm việc không có PWM. Khi đặt bit này lên 1,
một báo hiệu so sánh bắt buộc xuất hiện tại đơn vị tạo dạng sóng.
Bit 6, 3-WGM01:0: Chế độ tạo dạng sóng. Các bit này điều khiển đếm
thứ tự của bộ đếm, nguồn cho giá trị lớn nhất của bộ đếm (TOP) và kiểu
tạo dạng sóng sẽ được sử dụng.
Bit 5:4-COM01:0: Chế độ báo hiệu so sánh ngõ ra. Các bit này điều khiển
hoạt động của chân OC0. Nếu một hoặc cả hai bit COM01:0 được đặt lên
1, ngõ ra OC0 sẽ hoạt động.
Bit 2:0: CS02:0: Chọn xung đồng hồ
19
Bảng trạng thái:
b. Thanh ghi bộ định thời/ đếm TCNT0:
Là 1 thanh ghi 8 bit chứa giá trị vận hành của T/C0. Thanh ghi này cho
phép đọc và ghi giá trị một cách trực tiếp.
c. Thanh ghi ngõ ra so sánh OCR:
Thanh ghi này chứa một giá trị 8 bit và liên tục được so sánh với giá trị của
bộ đếm.
d. Thanh ghi mặt nạ ngắt TIMSK:
Là thanh ghi mặt nạ cho ngắt của tất cả các T/C trong Atmega 16, trong
đó chỉ có bit TOIE0 tức bit số 0 (bit đầu tiên) trong thanh ghi này là liên
quan đến T/C0, bit này có tên là bit cho phép ngắt khi có tràn ở T/C0.
20
Tràn (Overflow) là hiện tượng xảy ra khi bộ giá trị trong thanh ghi
TCNT0 đã đạt đến MAX (255) và lại đếm thêm 1 lần nữa.
Bit 1-OCIE0: Cho phép ngắt báo hiệu so sánh
Bit 0-TOIE0: Cho phép ngắt tràn bộ đếm
e. Thanh ghi cờ ngắt bộ định thời:
Là thanh ghi cờ nhớ cho tất cả các bộ T/C. Trong thanh ghi này bit số 0,
TOV0 là cờ chỉ thị ngắt tràn của T/C0. Khi có ngắt tràn xảy ra, bit này tự
động được set lên 1.
Bit 1-OCF0: Cờ so sánh ngõ ra 0
Bit 0-TOV0: Cờ tràn bộ đếm
4. Sử dụng timer/Counter:
Một số giá trị cần lưu ý khi sử dụng Timer/Counter:
BOTTOM: là giá trị thấp nhất mà một T/C có thể đạt được, giá trị này luôn
là 0.
MAX: là giá trị lớn nhất mà một T/C có thể đạt được, giá trị này được quy
định bởi bởi giá trị lớn nhất mà thanh ghi đếm của T/C có thể chứa được.
Ví dụ với một bộ T/C 8 bit thì giá trị MAX luôn là 0xFF (tức 255 trong hệ
thập phân), với bộ T/C 16 bit thì MAX bằng 0xFFFF (65535).
TOP: là giá trị mà khi T/C đạt đến nó sẽ thay đổi trạng thái, giá trị này
không nhất thiết là số lơn nhất 8 bit hay 16 bit như MAX, giá trị của TOP
có thể thanh đổi bằng cách điều khiển các bit điều khiển tương ứng hoặc có
thể nhập trừ tiếp thông qua một số thanh ghi.
5. Các chế độ hoạt động của Timer 0:
a. Normal Mode:
21
Đây là chế độ hoạt động đơn giản nhất của Timer. Bộ đếm sẽ liên tục đếm
tăng lên cho đến khi vượt quá giá trị lớn nhất TOP và sau đó sẽ được khởi
động lại tại giá trị Bottom.Trong các hoạt động thông thường thì cờ tràn
sẽ được thiết lập khi giá trị trong Timer đạt giá trị không và không bị xoá
đi.Tuy nhiên nếu mà ngắt tràn được chấp nhận thì cờ ngắt sẽ tự động bị
xoá khi ngắt được thực hiện.Giá trị trong Timer có thể được viết vào bất
cứ lúc nào.
b. Chế Độ So Sánh (CTC):
Đây là chế độ mà giá trị trong Timer luôn được so sánh với giá trị trong
thanh ghi ORC .Khi giá trị trong Timer bằng giá trị trong thanh ghi ORC
thì giá trị trong Timer sẽ bị xoá đi. Giá trị trong ORC đóng vai trò là giá
trị TOP cho bộ đếm. Chế độ này cũng cho phép tạo ra tần số so sánh ở
đầu ra.Tuy nhiên trong chế độ này nếu giá trị mới ghi vào thanh ghi ORC
mà nhỏ hơn giá trị tức thời của bộ đếm thì thì 1 so sánh sẽ bị lỡ, khi đó bộ
đếm sẽ đếm đến giá trị lớn nhất sau đó rơi xuống giá trị 0 trước khi so
sánh tiếp theo xuất hiện.
22
c. Chế Độ Fast PWM:
Cho phép tạo ra sóng với tần số cao.Sự khác biệt cơ bản giữa Fast PWM
với các loại PWM khác là nó chỉ sử dụng 1 sườn dốc. Bộ đếm sẽ đếm từ
Bottom đến Max sau đó khởi động lại từ bottom. Trong chế độ không đảo
đầu ra của chân so sánh OCx sẽ bị xoá khi có phép toán so sánh giữa
TCNTx và thanh ghi ORC là bằng nhau. Và sẽ được sét lên 1 khi giá trị
đạt Bottom. Trong chế độ đảo ,đầu ra đảo sẽ được set lên 1 khi sự so sánh
giữa thanh ghi ORC và giá trị trong Timer bằng nhau và sẽ bị xoá khi giá
trị đạt Bottom.
Trong cả hai trường hợp này tần số của chế đô Fast PWM đều gấp đôi so
với chế độ phase correct PWM sử dụng hai sườn dốc. Với tần số cao này
chế độ độ Fast PWM rất tốt cho các ứng dụng như ADC hay chỉnh
lưu.Ngoài ra với tần số cao giúp làm giảm kích thước của thiết bị ngoài
như cuộn dây tụ từ đó giúp làm giảm toàn bộ chi phí cho hệ thống.
23
d. Chế độ Phase correct PWM:
Chế độ này hoạt động dựa trên hai sườn lên xuống.Bộ đếm sẽ đếm liên
tục từ giá trị BOTTOM đến giá trị MAX và sau đó từ giá trị MAX đến giá
trị BOTTOM. Trong chế độ so sánh không đảo chân so sánh (OCx) sẽ bị
xóa khi giá trị TCNTx bằng giá trị OCRx trong quá trình đếm lên và sẽ
được set bằng 1 khi giá trị so sánh xuất hiện trong quá trình đếm xuống.
Chế độ so sánh đảo thì các giá trị là ngược lại.
Với hoạt động hai sườn xung này thì chế độ này không tạo ra được tần số
nhỏ như chế độ một sườn xung. Nhưng do tính cân đối của hai sườn xung
thì nó tốt hơn cho điều khiển động cơ. Chế độ phase correct PWM hoạt
động cố định là 8 bit. Trong chế độ này bộ đếm sẽ tăng cho đến khi đạt
giá trị MAX ,khi đó nó sẽ đổi chiều đếm.
6. Các bước sử dụng Timer:
Step 1: Set pin Timer là output bằng cách set giá trị trong thanh ghi
DDRn.X
Step 2: chọn chế độ Timer bằng cách set thanh ghi TCCRX
Step 3: chọn xung clock bằng cách set thanh ghi TCCRX
Step 4: chọn giá trị của thanh ghi OCRX-TCNTX
Step 5: bắt đầu Timer
24
Code Example:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <until/delay.h>
int main(void){
DDRB=0xFF; //PORTB la output PORT
PORTB=0x00;
TCCR0=(1<<CS01);// CS02=0, CS01=1, CS00=0: chon Prescaler =
8
TCNT0=131; //gan gia tri khoi tao cho T/C0
TIMSK=(1<<TOIE0);//cho phep ngat khi co tran o T/C0
sei(); //set bit I cho phep ngat toan cuc
while (1){ //vòng lặp vô tận
//do nothing
}
return 0;
}
III. Interrupt:
1. Giới thiệu:
Ngắt là một cơ chế cho phép thiết bị ngoại vi báo cho CPU biết về tình
trạng sẵn sàng cho đổi dữ liệu của mình.Ví dụ: Khi bộ truyền nhận UART
nhận được một byte nó sẽ báo cho CPU biết thông qua cờ RXC,hoặc khi nó
đã truyền được một byte thì cờ TX được thiết lập…
Khi có tín hiệu báo ngắt CPU sẽ tạm dừng công việc đạng thực hiện lại và
lưu vị trí đang thực hiên chương trình (con trỏ PC) vào ngăn xếp sau đó trỏ
25
tới vector phuc vụ ngắt và thức hiện chương trình phục vụ ngắt đó chơ tới
khi gặp lệnh RETI (return from interrup) thì CPU lại lấy PC từ ngăn xếp ra
và tiếp tục thực hiện chương trình mà trước khi có ngăt nó đang thực hiện.
Trong trường hợp mà có nhiều ngắt yêu cầu cùng một lúc thì CPU sẽ lưu
các cờ báo ngắt đó lại và thực hiện lần lượt các ngắt theo mức ưu tiên.
Atmega 16 có các ngắt sau:
2. Ngắt ngoài Atmega 16:
a. Quá trình ngắt:
Atmega16 có 3 ngắt ngoài INT0(PORTD.2) INT1(PORTD.3) và
INT2(PORTB.2). Khi xảy ra một trong các sự kiện đối với các chân này :
26
Low level - Điện áp ở chân ngắt xuống mức logic 0 V
Any change - Bất kì sự thay đổi điện áp từ chân ngắt
Falling Edge - Khi có 1 sườn điện áp xuống (5V->0V)
Rising Edge -Khi có 1 sườn điện áp lên (0V->5V)
Sau đó 1 cờ ngắt sẽ dựng lên 1 và báo cho biết có ngắt , nhảy đến chương trình con
thực hiện ngắt .
3. Các thanh ghi phục vụ ngắt:
a. MCUCR – MCU Control Register:
Thanh ghi MCUCR chứa các bits cho phép chúng ta chọn 1 trong 4
MODE trên cho các ngắt ngoài. MCUCR là một thanh ghi 8 bit nhưng đối
với hoạt động ngắt ngoài, chúng ta chỉ quan tâm đến 4 bit thấp của nó (4
bit cao dùng cho Power manager và Sleep Mode). Bốn bit thấp là các bit
Interrupt Sense Control (ISC) trong đó 2 bit ISC11:ISC10 dùng cho INT1
và 2 bit ISC01:ISC00 dùng cho INT0. Bảng chân trị cho các bit ISC01,
ISC00 hoàn toàn tương tự.
27
b. MCUCSR – MCU Control and Status Register:
Bit 6 – ISC2: Interrupt Sense Control 2: là bit quan trọng nhất trong thanh
ghi này dùng ghi và xóa cờ ngắt INT2.
c. GICR – General Interrup Control Register:
GICR cũng là 1 thanh ghi 8 bit nhưng chỉ có 2 bit cao (bit 6 và bit 7) là
được sử dụng cho điều khiển ngắt. Bit 7 – INT1 gọi là bit cho phép ngắt
1(Interrupt Enable), set bit này bằng 1 nghĩa bạn cho phép ngắt INT1 hoạt
động, tương tự, bit INT0 điều khiển ngắt INT0.
Thanh ghi cờ ngắt chung – GIFR (General Interrupt Flag Register) có 2
bit INTF1 và INTF0 là các bit trạng thái (hay bit cờ - Flag) của 2 ngắt
INT1 và INT0. Nếu có 1 sự kiện ngắt phù hợp xảy ra trên chân INT1, bit
INTF1 được tự động set bằng 1 (tương tự cho trường hợp của INTF0),
chúng ta có thể sử dụng các bit này để nhận ra các ngắt, tuy nhiên điều
này là không cần thiết nếu chúng ta cho phép ngắt tự động, vì vậy thanh
ghi này thường không được quan tâm khi lập trình ngắt ngoài.
4. Thiết lập ngắt ngoài:
Step 1: chọn chế độ ngắt trong than ghi MCUCR
Step 2: cho phép ngắt toàn cục trên thanh ghi GICR
Step 3: cho phép ngắt trong thanh ghi trạng thái SREG
Code Example:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
28
volatile int8_t val=0
int main(void){
DDRD=0x00; //khai báo PORTD là Input để sử dụng 2 chân
ngắt.
PORTD=0xFF; //sử dụng điện trở nội kéo lên.
MCUCR|=(1<<ISC11)|(1<<ISC01); //cả 2 ngắt là ngắt cạnh
xuống
GICR |=(1<<INT1)|(1<<INT0); //cho phép 2 ngắt hoạt động
sei(); //set bit I cho phép ngắt toàn cục
DDRC=0xFF; //PORTC là Output
while (1){ //vòng lặp vô tận
PORTC++; //quét PORTC
_delay_loop_2(60000);
}
return 0;
}
//Trình phục vụ ngắt của INT0
ISR(INT0_vect){
val++; //nếu có ngắt INT0 xảy ra, tăng val
thêm 1
if (val>9) val=0; //giới hạn không vượt quá 9
PORTB=val;
}
IV. ADC:
1. Giới thiệu:
Hầu hết trong tự nhiên các tín hiệu cần xử lý ở dạng tương tự như nhiệt độ,
ánh sáng. Các hệ thống số chỉ làm việc ở các mức logic do đó ta cần chuyển
29
đổi từ tín hiệu tương tự sang tín hiệu số. ADC là một bộ chuyển đổi tương
tự sang số được sử dụng nhiều trong các hệ thống điều khiển.
Atmega 16 tích hợp sẵn Module ADC được input ở PORTA. Đây là bộ
ADC với những đặc điểm sau:
Độ phân giải 10 bit
Sai số tuyến tính: 0.5LSB
Độ chính xác +/-2LSB
Thời gian chuyển đổi:65-260μs
8 Kênh đầu vào có thể được lựa ch
Có hai chế độ chuyển đổi free run
Có nguồn báo ngắt khi hoàn thành
Loại bỏ nhiễu trong chế độ ngủ
2. Cấu trúc:
30
a. Sơ đồ khối:
3. Các thanh ghi điều khiển ADC:
Có 4 thanh trong bộ ADC trên AVR trong đó có 2 thanh ghi data chứa dữ liệu
sau khi chuyển đổi, 2 thanh ghi điều khiển và chứa trạng thái của ADC.
a. ADMUX (ADC Multiplexer Selection Register):
Là 1 thanh ghi 8 bit điều khiển việc chọn điện áp tham chiếu, kênh và chế
độ hoạt động của ADC.
Bit 7:6- REFS1:0 (Reference Selection Bits): là các bit chọn điện áp
tham chiếu cho ADC, 1 trong 3 nguồn điện áp tham chiếu có thể được
chọn là: điện áp ngoài từ chân VREF, điện áp tham chiếu nội 2.56V
31
hoặc điện áp AVCC. Bảng 2 tóm tắt giá trị các bit và điện áp tham chiếu
tương ứng.
Bit 5-ADLAR (ADC Left Adjust Result): là bit cho phép hiệu chỉnh trái
kết quả chuyển đổi. Sở dĩ có bit này là vì ADC trên AVR có độ phân
giải 10 bit, nghĩa là kết quả thu được sau chuyển đổi là 1 số có độ dài 10
bit (tối đa 1023), AVR bố trí 2 thanh ghi data 8 bit để chứa giá trị sau
chuyển đổi. Như thế giá trị chuyển đổi sẽ không lắp đầy 2 thanh ghi
data, trong một số trường hợp người dùng muốn 10 bit kết quả nằm lệch
về phía trái trong khi cũng có trường hợp người dùng muốn kết quả nằm
về phía phải. Bit ADLAR sẽ quyết định vị trí của 10 bit kết quả trong 16
bit của 2 thanh ghi data. Nếu ADLAR=0 kết quả sẽ được hiệu chỉnh về
phía phải (thanh ghi ADCL chứa trọn 8 bit thấp và thanh ghi ADCH
chứa 2 bit cao trong 10 bit kết quả), và nếu ADLAR=1 thì kết quả được
hiệu chỉnh trái (thanh ghi ADCH chứa trọn 8 bit cao nhất, các bit từ 9
đến 2, và thanh ADCL chứa 2 bit thấp nhất trong 10 bit kết quả (bạn
xem hình cách bố trí 2 thanh ghi ADCL và ADCH bên dưới để hiểu rõ
hơn).
Bits 4:0-MUX4:0 (Analog Channel and Gain Selection Bits): là 5 bit
cho phép chọn kênh, chế độ và cả hệ số khuyếch đại cho ADC. Do bộ
ADC trên AVR có nhiều kênh và cho phép thực hiện chuyển đổi ADC
kiểu so sánh (so sánh điện áp giữa 2 chân analog) nên trước khi thực
hiện chuyển đổi, chúng ta cần set các bit MUX để chọn kênh và chế độ
cần sử dụng. Bảng 3 tóm tắt các chế độ hoạt động của ADC thông qua
32
các giá trị của các bit MUX. Trong bảng này, ứng với các giá trị từ
00000 đến 00111 (nhị phân), các kênh ADC được chọn ở chế độ đơn
kênh (tín hiệu input lấy trực tiếp từ các chân analog và so sánh với 0V),
giá trị từ 01000 đến 11101 tương ứng với chế độ chuyển đổi so sánh.
33
b. ADCSRA (ADC Control and Status RegisterA):
Là thanh ghi chính điều khiển hoạt động và chứa trạng thái của module
ADC.
Bit 7 - ADEN(ADC Enable): viết giá trị 1 vào bit này tức bạn đã cho
phép module ADC được sử dụng. Tuy nhiên khi ADEN=1 không có
nghĩa là ADC đã hoạt động ngay, bạn cần set một bit khác lên 1 để bắt
đầu quá trình chuyển đổi, đó là bit ADSC.
Bit 6 - ADSC(ADC Start Conversion): set bit này lên 1 là bắt đầu khởi
động quá trình chuyển đổi. Trong suốt quá trình chuyển đổi, bit ADSC
sẽ được giữ nguyên giá trị 1, khi quá trình chuyển đổi kết thúc (tự
động), bit này sẽ được trả về 0. Vì vậy bạn không cần và cũng không
nên viết giá trị 0 vào bit này ở bất kỳ tình huống nào. Để thực hiện một
chuyển đổi, thông thường chúng ta sẽ set bit ADEN=1 trước và sau đó
set ADSC=1.
Bit 4 – ADIF(ADC Interrupt Flag): cờ báo ngắt. Khi một chuyển đổi kết
thúc, bit này tự động được set lên 1, vì thế người dùng cần kiểm tra giá
34
trị bit này trước khi thực hiện đọc giá trị chuyển đổi để đảm bảo quá
trình chuyển đổi đã thực sự hoàn tất.
Bit 3 – ADIE(ADC Interrupt Enable): bit cho phép ngắt, nếu bit này
được set bằng 1 và bit cho phép ngắt toàn cục (bit I trong thanh ghi
trạng thái của chip) được set, một ngắt sẽ xảy ra khi một quá trình
chuyển đổi ADC kết thúc và các giá trị chuyển đổi đã được cập nhật
(các giá trị chuyển đổi chứa trong 2 thanh ghi ADCL và ADCH).
Bit 2:0 – ADPS2:0(ADC Prescaler Select Bits): các bit chọn hệ số chia
xung nhịp cho ADC. ADC, cũng như tất cả các module khác trên AVR,
cần được giữ nhịp bằng một nguồn xung clock. Xung nhịp này được lấy
từ nguồn xung chính của chip thông qua một hệ số chia. Các bit ADPS
cho phép người dùng chọn hệ số chia từ nguồn clock chính đến ADC.
Tham khảo bảng 4 để biết cách chọn hệ số chia.
35
c. ADCL và ADCH (ADC Data Register):
Là 2 thanh ghi chứa giá trị của quá trình chuyển đổi. Do module ADC
trên AVR có độ phân giải tối đa 10 bits nên cần 2 thanh ghi để chứa giá
trị chuyển đổi. Tuy nhiên tổng số bít của 2 thanh ghi 8 bit là 16, con số
này nhiều hơn 10 bit của kết quả chuyển đổi, vì thế chúng ta được phép
chọn cách ghi 10 bit kết quả vào 2 thanh ghi này. Bit ADLAR trong
thanh ghi ADMUX quy định cách mà kết quả được ghi vào.
d. SFIOR(Special FunctionIO Register C):
Là thanh ghi chức năng đặc biệt, 3 bit cao trong thanh ghi này quy định
nguồn kích ADC nếu chế độ Auto Trigger được sử dụng. Đó là các bit
36
ADTS2:0 (Auto Trigger Source 2:0).
4. Quá trình chuyển đổi ADC:
ADC có nhiệm vụ chuyển đổi tín hiệu điện áp tương tự thành tín hiệu số
có độ phân giải 10 bit.Với giá trị nhỏ nhất của điện áp đặt ở chân AGND
và giá trị cực đại của điện áp tương tự được mắc vào chân AREF. Tám
kênh tương tự đầu vào được chọn lựa thông qua ADMUX và ADMUX
này được điều khiển bởi thanh ghi ADMUX.
ADC này có thể hoạt động được ở hai chế độ. Đó là chuyển đổi đơn: chỉ
chuyển đổi một lần khi có lệnh chuyển đổi và chế độ tự chuyển đổi (Free
running mode) đây là chế độ mà ADC tự động chuyển đổi khi được hoạt
động và công việc chuyển đổi có tính tuần hoàn (chỉ cần khởi động một
lần).
ADC được phép hoạt động nhờ thiết lập bit ADEN. Quá trình chuyển đổi
được bắt đầu bằng việc ghi vào bit ADSC mức logic 1 và trong suốt quá
trình chuyển đổi bit này luôn được giữ ở mức cao. Khi quá trình chuyển
đổi hoàn thành thì bit này được xóa bằng phần cứng và cờ AIDF được bật
lên.
Dữ liệu sau khi chuyển đổi được đưa ra thanh ghi dữ liệu ADCL và
ADCH, nhưng chú ý khi đọc dữ liệu từ hai thanh ghi này thì đọc ADCL
trước rồi mới đọc ADCH. Nếu đọc ADCH trước thì dữ liệu cập nhật có
thể ghi đè lên ADCL (Vi điều khiển nghĩ rằng đã đọc xong dữ liệu).
37
5. Các bước lập trình điều khiển ADC:
Step 1: Định nghĩa các cổng vào cho tín hiệu tương tự. Xóa bit tương ứng
với chân đó trong thanh ghi DDRA. Sau đó loại bỏ điện trở treo bằng
cách xóa bit tương ứng ở thanh ghi PORTA.
Step 2: Chọn kênh tương tự vào (chọn chân vào cho ADC) thông qua
thanh ghi ADMUX (có thể thay đổi trong quá trình hoạt động).
Step 3: hiết lập các thông số cho ADC. Tốc độ chuyển đổi thông qua xung
nhip chuyển đổi. Chế độ chuyển đổi : đơn hoặc tự động. Sử dụng ngắt
hoặc không.
Step 4: Bắt đầu chuyển đổi và đọc dữ liệu.
Code Example:
#include <avr/io.h>
#include <util/delay.h>
int main(void){
ADCSRA=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS0); //enable ADC,
khong dung interrupt
ADMUX=ADC_VREF_TYPE; //chon kieu dien ap tham chieu
while (1){ //vòng lặp vô tận
//do nothing
}
return 0;
38
V. USART:
1. Giới thiệu:
Thuật ngữ USART trong tiếng anh là viết tắt của cụm từ: Universal
Synchronous & Asynchronous serial Reveiver and Transmitter, nghĩa là bộ
truyền nhận nối tiếp đồng bộ và không đồng bộ. Cần chú ý rằng khái niệm
USART (hay UART nếu chỉ nói đến bộ truyền nhận không đồng bộ)
thường để chỉ thiết bị phần cứng (device, hardware), không phải chỉ một
chuẩn giao tiếp. USART hay 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 đó. Ví dụ, chuẩn
RS232 (hay COM) trên các máy tính cá nhân là sự kết hợp của chip UART
và chip chuyển đổi mức điện áp. Tín hiệu từ chip UART thường theo mức
TTL: mức logic high là 5, mức low là 0V. Trong khi đó, tín hiệu theo chuẩn
RS232 trên máy tính cá nhân thường là -12V cho mức logic high và +12
cho mức low.
Atmega 16 sử dụng hai pin sau cho USART đó là:
Bộ truyền nhận nối tiếp đồng bộ và bất đồng bộ là một thiết truyền thông
nối tiếp có các chức năng chính như sau:
Hoạt động song công (các thanh ghi truyền và nhận nối tiếp độc lập
với nhau).
39
Hoạt động đồng bộ hoặc bất đồng bộ.
Bộ tạo tốc độ baud có độ chính xác cao
Hỗ trợ khung truyền nối tiếp với 5, 6, 7, 8, hoặc 9 bit dữ liệu và 1 hoặc
2 bit
Kiểm tra chẵn lẻ
Phát hiện tràn dữ liệu
Phát hiện lỗi khung
Lọc nhiễu, bao gồm phát hiện bit start lỗi và bộ lọc thông thấp số
Ngắt khi kết thúc truyền, thanh ghi truyền hết dữ liệu và kết thúc nhận
Chế độ truyền thông đa vi xử lý
Chế độ truyền đồng bộ tốc độ cao
2. Cấu trúc của một USART:
40
Sơ đồ khối:
USART bao gồm 3 phần chính: bộ tạo xung clock, bộ truyền và bộ nhận. Các
thanh ghi điều khiển được sử dụng chung giữa các phần này.
3. Tạo xung clock cho USART:
Bộ tạo xung clock tạo ra xung đồng hồ căn bản cho bộ truyền và bộ nhận.
USART hỗ trợ 4 chế độ hoạt động xung clock: bất đồng bộ, bất đồng bộ
tốc độ cao, truyền đồng bộ master và truyền đồng bộ slave. Sơ đồ khối
41
của bộ tạo xung clock như sau:
txclk: xung đồng hộ bộ truyền
rxclk: xung đồng hồ bộ nhận
xcki: tín hiệu vào từ chân XCK, sử dụng cho hoạt động truyền đồng bộ
master
xcko: tín hiệu xung clock ngõ ra tới chân XCK, sử dụng cho hoạt động
truyền đồng
bộ slave
fosc: tần số từ chân XTAL
4. Một số khái niệm liên quan đến USART:
Baud rate (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. Mô
42
hình khung truyền như sau:
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ị
43
của parity bit là 1. Parity 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 .
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 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).
5. Các thanh ghi điều khiển USART:
a. UDR – Usart I/O Data Register:
Là thanh ghi dữ liệu, là 1 thanh ghi 8 bit chứa giá trị nhận được và phát đi
của USART. Thực chất thanh ghi này có thể coi như 2 thanh ghi TXB
(Transmit data Buffer) và RXB (Reveive data Buffer) có chung địa chỉ.
Đọc UDR thu được giá trị thanh ghi đệm dữ liệu nhận, viết giá trị vào UDR
tương đương đặt giá trị vào thanh ghi đệm phát, chuẩn bị để gởi đi. Trong
các khung truyền sử dụng 5, 6 hoặc 7 bit dữ liệu, các bit cao của thanh ghi
UDR sẽ không được sử dụng.
b. UCSRA - USART Control and Status Register A:
Thanh ghi UCSRA chủ yếu chứa các bit trạng thái như bit báo quá trình
nhận kết thúc (RXC), truyền kết thúc (TXC), báo thanh ghi dữ liệu trống
(UDRE), khung truyền có lỗi (FE), dữ liệu tràn (DOR), kiểm tra parity có
lỗi (PE), cần lưu ý một số bit sau:
44
UDRE (USART Data Register Empty) khi bit bày bằng 1 nghĩa là
thanh ghi dữ liệu UDR đang trống và sẵn sàng cho một nhiệm vụ
truyền hay nhận tiếp theo.
U2X là bit chỉ định gấp đôi tốc độ truyền, khi bit này được set lên 1,
tốc độ truyền so cao gấp 2 lần so với khi bit này mang giá trị 0.
MPCM là bit chọn chế độ hoạt động đa xử lí (multi-processor).
c. UCSRB - USART Control and Status Register B:
Đây là thanh ghi quan trọng điều khiển USART. Các bit được mô tả như
sau:
RXCIE (Receive Complete Interrupt Enable) là bit cho phép ngắt khi quá
trình nhận kết thúc. Việc nhận dữ liệu truyền bằng phương pháp nối tiếp
không đồng bộ thường được thực hiện thông qua ngắt, vì thế bit này
thường được set bằng 1 khi USART được dùng nhận dữ liệu.
TXCIE (Transmit Complete Interrupt Enable) bit cho phép ngắt khi quá
trình truyền kết thúc.
UDRIE (USART Data Register Empty Interrupt Enable) là bit cho phép
ngắt khi thanh ghi dữ liệu UDR trống.
RXEN (Receiver Enable) là một bit quan trọng điều khiển bộ nhận của
USART, đề kích hoạt chức năng nhận dữ liệu bạn phải set bit này lên 1.
TXEN (Transmitter Enable) là bit điều khiển bộ phát. Set bit này lên 1
bạn sẽ khởi động bộ phát của USART.
UCSZ2 (Chracter size) bit này kết hợp với 2 bit khác trong thanh ghi
UCSRC quy định độ dài của dữ liệu truyền/nhận. Chúng ta sẽ khảo sát chi
tiết khi tìm hiểu thanh ghi UCSRC.
RXB8 (Receive Data Bit 8) gọi là bit dữ liệu 8. USART trong AVR có hỗ
trợ truyền dữ liệu có độ dài tối đa 9 bit, trong khi thanh ghi dữ liệu là
45
thanh ghi 8 bit. Do đó, khi có gói dữ liệu 9 bit được nhận, 8 bit đầu sẽ
chứa trong thanh ghi UDR, cần có 1 bit khác đóng vai trò bit thứ chín,
RXD8 là bit thứ chín này.
TXB8 (Transmit Data Bit 8), tương tự như bit RXD8, bit TXB8 cũng
đóng vai trò bit thứ 9 truyền thông, nhưng bit này được dùng trong lúc
truyền dữ liệu.
d. UCSRC - USART Control and Status Register C:
Thanh ghi này chủ yếu quy định khung truyền và chế độ truyền. Thanh
ghi này lại có địa chỉ với thanh ghi UBRRH (thanh ghi chứa byte cao
dùng để xác lập tốc độ baud). Vì thế bit 7 trong thanh ghi này, tức bit
URSEL là bit chọn thanh ghi. Khi URSEL=1, thanh ghi này được chip
AVR hiểu là thanh ghi điều khiển UCSRC, nhưng nếu bit URSEL=0 thì
thanh ghi UBRRH sẽ được sử dụng. Các bit trong thanh ghi này được mô
tả như sau:
UMSEL (USART Mode Select) là bit lựa chọn giữa 2 chế độ truyền
thông đồng bộ và không đồng bộ. Nếu UMSEL=0, chế độ không đồng
bộ được chọn, ngược lại nếu UMSEL=1, chế độ đồng bộ được kích
hoạt.
Hai bit UPM1 và UPM0( Parity Mode) được dùng để quy định kiểm tra
pariry. Nếu UPM1:0=00, parity không được sử dụng (mode này khá
thông dụng), UPM1:0=01 không được sử dụng, UPM1:0=10 thì parity
46
chẵn được dùng, UPM1:0=11 parity lẻ được sử dụng.
USBS (Stop bit Select), bit Stop trong khung truyền bằng AVR USART
có thể là 1 hoặc 2 bit, nếu USBS=0 thì Stop bit chỉ là 1 bit trong khi
USBS=1 sẽ có 2 Stop bit được dùng.
Hai bit UCSZ1 và UCSZ2 (Character Size) kết hợp với bit UCSZ2
trong thanh ghi UCSRB tạo thành 3 bit quy định độ dài dữ liệu truyền.
UCPOL (Clock Pority) là bit chỉ cực của xung kích trong chế độ truyền
thông đồng bộ. nếu UCPOL=0, dữ liệu sẽ thay đổi thay đổi ở cạnh lên
của xung nhịp, nếu UCPOL=1, dữ liệu thay đổi ở cạnh xuống xung
nhịp. Nếu bạn sử dụng chế độ truyền thông không đồng bộ, hãy set bit
47
này bằng 0.
e. UBRRL và UBRRH -USART Baud Rate Register:
Là 2 thanh ghi thấp và cao quy định tốc độ baud. Thanh ghi UBRRH
dùng chung địa chỉ thanh ghi UCSRC do đó ta phải set bit này bằng 0 nếu
muốn sử dụng thanh ghi UBRRH. 4 bit thấp của UBRRH được dùng, 4
bit này kết hợp với 8 bit trong thanh ghi UBRRL tạo thành thanh ghi 12
bit quy định tốc độ baud. Giá trị gán cho thanh ghi UBRR không phải là
tốc độ baud, nó chỉ được USART dùng để tính tốc độ baud. Bảng 3
hướng dẫn cách tính tốc độ baud dựa vào giá trị của thanh ghi UBRR và
ngược lại, cách tính giá trị cần thiết gán cho thanh ghi UBRR khi đã biết
tốc độ baud. Bảng tính tốc độ baud:
48
Ví dụ bảng tính tốc độ baud:
6. Sử dụng USART:
a. Khởi tạo USART:
Quá trình khởi tạo USART bao gồm việc thiết lập tốc độ baud, thiết lập
định dạng khung và kích hoạt bộ truyền và bộ nhận.
Code Example:
void USART_Init( unsigned int baud )
{
/* Set baud rate */
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}
b. Truyền dữ liệu:
49
Bộ truyền USART được kích hoạt bằng cách thiết lập bit TXEN trong
thanh ghi UCSRB. Khi bộ truyền được kích hoạt, chân TxD hoạt động như
ngõ ra của bộ truyền nối tiếp. Tốc độ baud, chế độ hoạt động và định dạng
khung truyền phải được thiết lập trước khi thực hiện truyền dữ liệu.\
Việc truyền dữ liệu được thiết lập bằng cách nạp dữ liệu truyền vào bộ đệm
truyền. Dữ liệu trong bộ đệm sẽ được đưa vào thanh ghi dịch khi thanh ghi
dịch đã sẵn sàng gửi một khung mới. Ví dụ dưới đây là một hàm truyền
USART dựa trên việc kiểm tra cờ UDRE.
void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Put data into buffer , sends the data */
UDR = data;
}
c. Nhận dữ liệu:
Bộ nhận USART được kích hoạt bằng cách đặt bit RXEN trong thanh ghi
UCRSB lên 1. Khi bộ nhận được kích hoạt, chân RxD hoạt động như ngõ
vào của bộ nhận nối tiếp. Tốc độ baud, chế độ hoạt động và định dạng
khung truyền phải được thiết lập trước khi thực hiện truyền dữ liệu.
Bộ nhận bắt đầu nhận dữ liệu khi nó phát hiện một bit start hợp lệ. Mỗi bit
theo sau bit start sẽ được lấy mẫu tại tốc độ baud hoặc tốc độ đồng hồ
XCK, và được dịch vào trong thanh ghi dịch của bộ nhận cho đến khi phát
hiện một bit stop đầu tiên. Nội dung của thanh ghi dịch sau đó được đưa
vào bộ đệm. Bộ đệm của bộ nhận có thể được đọc bằng cách đọc UDR. Ví
dụ sau đây là một hàm nhận USART dựa trên việc kiểm tra cờ kết thúc
truyền (RXC):
unsigned char USART_Receive( void )
50
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) );
/* Get and return received data from buffer */
return UDR;
}
VI. SPI:
1. Giới thiệu:
SPI (Serial Peripheral Bus) là một chuẩn truyền thông nối tiếp tốc độ cao
do hãng Motorola đề xuất. Đây là kiểu truyền thông Master-Slave, trong
đó có 1 chip Master điều phối quá trình tuyền thông và các chip Slaves
được điều khiển bởi Master vì thế truyền thông chỉ xảy ra giữa Master và
Slave. SPI là một cách truyền song công (full duplex) nghĩa là tại cùng
một thời điểm quá trình truyền và nhận có thể xảy ra đồng thời. SPI đôi
khi được gọi là chuẩn truyền thông “4 dây” vì có 4 đường giao tiếp trong
chuẩn này đó là SCK (Serial Clock), MISO (Master Input Slave Output),
MOSI (Master Ouput Slave Input) và SS (Slave Select).
51
SCK: Xung giữ nhịp cho giao tiếp SPI, vì SPI là chuẩn truyền
đồng bộ nên cần 1 đường giữ nhịp, mỗi nhịp trên chân SCK báo 1
bit dữ liệu đến hoặc đi. Đây là điểm khác biệt với truyền thông
không đồng bộ mà chúng ta đã biết trong chuẩn UART. Sự tồn tại
của chân SCK giúp quá trình tuyền ít bị lỗi và vì thế tốc độ truyền
của SPI có thể đạt rất cao. Xung nhịp chỉ được tạo ra bởi chip
Master.
MISO– Master Input / Slave Output: nếu là chip Master thì đây
là đường Input còn nếu là chip Slave thì MISO lại là Output.
MISO của Master và các Slaves được nối trực tiếp với nhau..
MOSI – Master Output / Slave Input: nếu là chip Master thì đây
là đường Output còn nếu là chip Slave thì MOSI là Input. MOSI
của Master và các Slaves được nối trực tiếp với nhau.
SS – Slave Select: SS là đường chọn Slave cần giap tiếp, trên các
chip Slave đường SS sẽ ở mức cao khi không làm việc. Nếu chip
Master kéo đường SS của một Slave nào đó xuống mức thấp thì
việc giao tiếp sẽ xảy ra giữa Master và Slave đó. Chỉ có 1 đường
SS trên mỗi Slave nhưng có thể có nhiều đường điều khiển SS trên
Master, tùy thuộc vào thiết kế của người dùng.
SPI trên AVR có các đặc điểm sau:
Chế độ truyền song công với 3 đường dữ liệu.
52
Điều khiển ở hai chế độ Master và Slave
7 bit lập trình giá trị khác nhau
Kết thúc quá trình chuyển đổi bằng cờ ngắt
Chế độ ghi tránh xung đột
Thay đổi trạng thái nghỉ
Tốc độ truyền có thể đạt đến 2 lần ở chip Master
b. Hoạt động:
Mỗi chip Master hay Slave có một thanh ghi dữ liệu 8 bits. Cứ mỗi xung
nhịp do Master tạo ra trên đường giữ nhịp SCK, một bit trong thanh ghi dữ
liệu của Master được truyền qua Slave trên đường MOSI, đồng thời một bit
trong thanh ghi dữ liệu của chip Slave cũng được truyền qua Master trên
đường MISO. Do 2 gói dữ liệu trên 2 chip được gởi qua lại đồng thời nên
quá trình truyền dữ liệu này được gọi là “song công”.
Cực của xung giữ nhịp, phase và các chế độ hoạt động: cực của xung giữ
nhịp (Clock Polarity) được gọi tắt là CPOL là khái niệm dùng chỉ trạng thái
của chân SCK ở trạng thái nghỉ. Ở trạng thái nghỉ (Idle), chân SCK có thể
được giữ ở mức cao (CPOL=1) hoặc thấp (CPOL=0). Phase (CPHA) dùng
để chỉ cách mà dữ liệu được lấy mẫu (sample) theo xung giữ nhịp. Dữ liệu
có thể được lấy mẫu ở cạnh lên của SCK (CPHA=0) hoặc cạnh xuống
(CPHA=1). Sự kết hợp của SPOL và CPHA làm nên 4 chế độ hoạt động
của SPI. Nhìn chung việc chọn 1 trong 4 chế độ này không ảnh hưởng đến
chất lượng truyền thông mà chỉ cốt sao cho có sự tương thích giữa Master
và Slave.
53
2. Cấu trúc của một SPI:
Sơ đồ khối:
SCK – PB7 (chân 8)
MISO – PB6 (chân 7)
MOSI – PB5 (chân 6)
SS – PB4 (chân 5)
3. Các thanh ghi điều khiển SPI:
SPI trên AVR được vận hành bởi 3 thanh ghi bao gồm thanh ghi điều khiển
SPCR , thanh ghi trạng thái SPSR và thanh ghi dữ liệu SPDR.
a. SPCR - SPI Control Register:
Là 1 thanh ghi 8 bit điều khiển tất cả hoạt động của SPI gồm các bit được
mô tả như sau:
54
Bit 7- SPIE (SPI Interrupt Enable) bit cho phép ngắt SPI. Nếu bit này
được set bằng 1 và bit I trong thanh ghi trạng thái được set bằng 1
(sei), 1 ngắt sẽ xảy ra sau khi một gói dữ liệu được truyền hoặc nhận.
Bit 6 – SPE (SPI Enable) set bit này lên 1 để cho phép bộ SPI hoạt
động. Nếu SPIE=0 thì module SPI dừng hoạt động.
Bit 5 – DORD (Data Order) bit này chỉ định thứ tự dữ liệu các bit được
truyền và nhận trên các đường MISO và MOSI, khi DORD=0 bit có
trọng số lớn nhất của dữ liệu được truyền trước (MSB) ngược lại khi
DORD=1, bit LSB được truyền trước.
Bit 4 – MSTR (Master/Slave Select) nếu MSTR =1 thì chip được nhận
diện là Master, ngược lại MSTR=0 thì chip là Slave.
Bit 3 và 2 – CPOL và CPHA đây chính là 2 bit xác lập cực của xung
giữ nhịp và cạnh sample dữ liệu mà chúng ta đã khảo sát trong phần
đầu. Sự kết hợp 2 bit này tạo thành 4 chế độ hoạt động của SPI.
Bit 1:0 – CPR1:0 hai bit này kết hợp với bit SPI2X trong thanh ghi
SPSR cho phép chọn tốc độ giao tiếp SPI, tốc độ này được xác lập dựa
trên tốc độ nguồn xung clock chia cho một hệ số chia. Thông thường,
tốc bộ này không được lớn hơn 1/4 tốc độ xung nhịp cho chip.
55
b. SPSR - SPI Status Register:
Là 1 thanh ghi trạng thái của module SPI. Trong thanh ghi này chỉ có 3
bit được sử dụng.
Bit 7 – SPIF là cờ báo SPI, khi một gói dữ liệu đã được truyền hoặc
nhận từ SPI, bit SPIF sẽ tự động được set len 1.
Bit 6 – WCOL là bít báo va chạm dữ liệu (Write Colision), bit này
được AVR set lên 1 nếu chúng ta cố tình viết 1 gói dữ liệu mới vào
thanh ghi dữ liệu SPDR trong khi quá trình truyền nhận trước chưa
kết thúc.
Bit 0 – SPI2X gọi là bit nhân đôi tốc độ truyền, bit này kết hợp với 2
bit SPR1:0 trong thanh ghi điều khiển SPCR xác lập tốc độ cho SPI.
c. SPDR - SPI Data Register:
Là thanh ghi dữ liệu của SPI. Trên chip Master, ghi giá trị vào thanh ghi
SPDR sẽ kích quá trình tuyền thông SPI. Trên chip Slave, dữ liệu nhận
56
được từ Master sẽ lưu trong thanh ghi SPDR, dữ liệu được lưu sẵn trong
SPDR sẽ được truyền cho Master.
d. Chế độ truyền nhận dữ liệu:
57
4. Sử dụng SPI:
a. Khởi tạo SPI:
Trước khi truyền nhận bằng SPI chúng ta cần khởi động SPI, quá trình khởi
động thường bao gồm chọn hướng giao tiếp cho các chân SPI, chọn loại
giao tiếp: Master hay Slave, chọn chế độ SPI (SPOL, SPHA) và chọn tốc
độ giao tiếp. Truyền thông SPI luôn được khởi xướng bởi chip Master, khi
Master muốn giao tiếp với 1 Slave nào đó, nó sẽ kéo chân SS của Slave
xuống mức thấp (gọi là chọn địa chỉ) và sau đó viết dữ liệu cần truyền vào
thanh ghi dữ liệu SPDR, khi dữ liệu vừa được viết vào SPDR xung giữ nhịp
sẽ được tự động tạo ra trên SCK và quá trình truyền nhận bắt đầu. Đối với
các chip Slave, khi chân SS bị kéo xuống nó sẽ sẵn sàng cho quá trình
truyền nhận. Khi phát hiện xung giữ nhịp trên SCK, Slave sẽ bắt đầu
sample dữ liệu đến trên đường MOSI và gởi dữ liệu di trên MISO.
Code Example:
void SPI_MasterInit(void)
{
/* Set MOSI and SCK output, all others in
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
/* Enable SPI, Master, set clock rate fck
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
void SPI_SlaveInit(void)
{
/* Set MISO output, all others input */
DDR_SPI = (1<<DD_MISO);
/* Enable SPI */
SPCR = (1<<SPE);
}
b. Thực hiện quá trình giao tiếp:
58
Code Example:
void SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)))
;
}
char SPI_SlaveReceive(void)
{
/* Wait for reception complete */
while(!(SPSR & (1<<SPIF)))
;
/* Return data register */
return SPDR;
}
VII. TWI-I2C:
1. Giới thiệu:
TWI (Two-Wire Serial Intereafce) là một module truyền thông nối tiếp
đồng bộ trên các chip AVR dựa trên chuẩn truyền thông I2C. I2C là viết tắc
của từ Inter-Integrated Circuit là một chuẩn truyền thông do hãng điện tử
Philips Semiconductor sáng lập và xây dựng thành chuẩn năm 1990. Phiên
bản mới nhất của I2C là V3.0 phát hành năm 2007. I2C dùng để điều khiển
các chip nhớ, bộ chuyển đổi ADC, DCA, đồng hồ thời gian thực…
59
Một giao tiếp I2C gồm có 2 dây: Serial Data (SDA) và Serial Clock (SCL).
SDA là đường truyền dữ liệu 2 hướng, còn SCL là đường truyền xung đồng
hồ và chỉ theo một hướng. Như hình vẽ trên, khi một thiết bị ngoại vi kết nố
i vào đường I2C thì chân SDA của nó sẽ nối với dây SDA của bus, chân SC
L sẽ nối với dây SCL.
I2C của Atmega 16 có những đặc điểm sau:
Hoạt động đơn giản, hiệu quả kết nối đơn giản chỉ với 2 bus
Hỗ trợ 2 chế độ Master và Slave
7 bit địa chỉ chọn chế độ Slave
Nhiều chế độ lựa chọn Master
Tốc độ truyền cực đại có thể lên tới 400KHz
Chế độ chống nhiễu trên bus
60
Một số khái niệm về I2C:
Master: là chip khởi động quá trình truyền nhận, phát đi địa chỉ của
thiết bị cần giao tiếp và tạo xung giữ nhịp trên đường SCL.
Slave: là chip có một địa chỉ cố định, được gọi bởi Master và phục vụ
yêu cầu từ Master.
SDA- Serial Data: là đường dữ liệu nối tiếp, tất cả các thông tin về địa
chỉ hay dữ liệu đều được truyền trên đường này theo thứ tự từng bit
một. Bit có trọng số lớn nhất (MSB) được truyền trước nhất, đặc điểm
này ngược lại với chuẩn USART.
SCL –Serial Clock: là đường giữ nhịp nối tiếp. I2C là chuần truyền
thông nối tiếp đồng bộ, cần có 1 đường tạo xung giữ nhịp cho quá
trình truyền/nhận, cứ mỗi xung trên đường giữ nhịp SCL, một bit dữ
liệu trên đường SDA sẽ được lấy mẫu (sample). Dữ liệu nối tiếp trên
đường SDA được lấy mẫu khi đường SCL ở mức cao trong một chu
kỳ giữ nhịp, vì thế đường SDA không được đổi trạng thái khi SCL ở
mức cao (trừ START và STOP condition). Chân SDA có thể được đổi
trạng thái khi SCL ở mức thấp.
START Condition: từ trạng thái nghỉ, khi cả SDA và SCL ở mức cao
nếu Master muốn truyền dữ liệu Master sẽ kéo chân SDA xuống thấp
trong khi SCL vẫn cao.
STOP Condition: sau khi thực hiện truyền/nhận dữ liệu, nếu Master
muốn kết thúc quá trình nó sẽ tạo ra một STOP condition. STOP
condition được Master thực hiện bằng cách kéo chân SDA lên cao khi
đường SCL đang ở mức cao.
REPEAT START – Bắt đầu lặp lại: khoảng giữa START và STOP
condition là khoảng bận của đường truyền, các Master khác không tác
động được vào đường truyền trong khoảng này. Trường hợp sau khi
kết thúc truyền/nhận mà Master không gởi STOP condition lại gởi
thêm 1 START condition gọi là REPEAT START.
61
Address Packet Format – Định dạng gói địa chỉ: trên mạng TWI
(I2C), tất cả các thiết bị (chip) đều có thể là Master hay Slave. Mỗi
thiết bị có một địa chỉ cố định gọi là Device address. Khi một Master
muốn giao tiếp với một Slave nào đó, nó trước hết tạo ra một START
condition và tiếp theo là gởi địa chỉ Device address của Slave cần giao
tiếp trên đường truyền, vì thế xuất hiện khái niệm “gói địa chỉ”
(Address Packet). Gói địa chỉ trong TWI (I2C) có định dạng 9 bits
trong đó 7 bit đầu (gọi là SLA, được gởi liền sau START condition)
chứa địa chỉ Slave, một bit READ/WRITE và một bit ACK-
Ackknowledge (xác nhận). Do bit địa chỉ có độ dài 7 bits nên về mặt
lý thuyết, trên 1 mạng TWI (I2C) có thể tồn tại tối đa 27=128 thiết bị
có địa chỉ riêng biệt.
2. Cấu trúc của một I2C:
62
a. Sơ đồ khối:
3. Các thanh ghi điều khiển I2C:
a. TWBR - TWI Bit Rate Register:
Là 1 thanh ghi 8 bit quy định tốc độ phát xung giữ nhịp trên đường SCL
của chip Master. Tốc độ phát xung giữ nhịp được tính theo công thức:
Trong đó CPU Clock frequency là tần số hoạt động chính của AVR, TWBR
là giá trị thanh thi TWBR và TWPS là giá trị của 2 bits TWPS1 và TWPS0
nằm trong thanh thi trạng thái TWSR. Hai bits này được gọi là bit prescaler,
thông thường người ta hay set TWPS1:0 =00 để chọn Prescaler là 1 (40=1).
Bảng tham chiếu như sau:
63
b. TWCR (TWI Control Register):
Là thanh ghi 8 bit điều khiển hoạt động của I2C. Các bit được mô tả như
sau:
Bit 7- TWINT (TWI Interrupt Flag): bit này được tự động set lên 1
khi TWI kết thúc một quá trình bất kỳ nào đó (như phát/nhận
START, phát nhận địa chỉ…).
Bit 6 – TWEA (TWI Enable Acknowledge Bit): là bit kích hoạt tín
hiệu xác nhận. Đối với chip Slave, nếu bit này được set thì tín hiệu
xác nhận ACK sẽ được gởi trong các trường hợp sau: địa chỉ do
Master phát ra trùng khớp với địa chỉ của Slave; một cuộc gọi chung
đang xảy ra và Slave này cho phép cuộc gọi chung; dữ liệu đã được
Slave nhận từ Master. Khi set một chip ở chế độ Slave, chúng ta cần
set bit này để nó có thể đáp ứng lại Master bất cứ khi nào được gọi.
Đối với chip Master, tín hiệu ACK chỉ được phát trong 1 trường hợp
duy nhất đó là khi Master nhận dữ liệu từ Slave, Master phát ACK
64
để báo cho Slave là mình đã nhận được và muốn tiếp tục nhận từ
Slave.
Bit 5 – TWSTA (TWI START Condition Bit): là bit tạo START
condition. Khi một chip muốn trở thành Master để thực hiện 1 cuộc
gọi, bit này cần được set và một START condition được tạo ra trên
đường truyền nếu đường truyền đang rỗi.
Bit 4 – TWSTO (TWI STOP Condition Bit): là bit tạo STOP
condition cho TWI. Khi Master muốn kết thúc một cuộc gọi, nó sẽ
phát STOP condition bằng cách viết giá trị 1 vào bit TWSTO. Slave
cũng có thể tác động vào bit này, nếu một cuộc gọi bị lỗi, viết 1 vào
TWSTO trên Slave sẽ reset đường truyền về trạng thái rỗi ban đầu.
Bit 3 – TWWC (TWI Write Collision Flag): khi cờ TWINT đang ở
mức thấp tức TWI đang bận, nếu chúng ta viết dữ liệu vào thanh ghi
dữ liệu (TWDR) thì một lỗi xảy ra, khi đó bit TWWC tự động được
set lên 1. Vì thế, trong quá trình truyền dữ liệu, bit TWINT cần được
giữ mức cao khi ghi dữ liệu vào thanh ghi TWDR và sau đó xóa khi
dữ liệu đã sẵn sàng.
Bit 2 – TWEN (TWI Enable Bit): bit kích hoạt TWI trên AVR, khi
TWEN được set lên 1, TWI sẵn sàng hoạt động.
Bit 1 – Reserve: không sử dụng.
Bit 0 – TWIE (TWI Interrupt Enable Bit): bit cho phép ngắt TWI,
khi bit nay được set bằng 1 đồng thời bit I trong thanh ghi trạng thái
chung được set, một ngắt TWI xảy ra khi bit TWINT được set bởi
phần cứng. Ngắt TWI có thể xảy ra sau bất kỳ hoạt động nào liên
quan đến TWI. Do đó cần sử dụng ngắt hợp lý. Thông thường, ngắt
chỉ được sử dụng cho Slave, đối với Master ngắt không cần thiết vì
Master chủ động khởi động một cuộc gọi.
65
c. TWSR - TWI Status Register:
Là 1 thanh ghi 8 bit trong đó có 5 bit chứa code trạng thái của TWI và 2 bit
chọn prescaler.
Chọn prescaler:
d. TWDR - TWI Data Register:
Là thanh ghi dữ liệu chính của TWI. Trong quá trình nhận, dữ liệu nhận về
sẽ được lưu trong TWDR. Trong quá trình gởi, dữ liệu chứa trong TWDR
sẽ được chuyển ra đường SDA.
e. TWAR - TWI Address Register:
Là thanh ghi chứa device address của chip Slave.
4. Sử dụng TWI-I2C:
a. Quá trình giao tiếp:
Truyền dữ liệu từ chủ đến tớ :
Master xung START
Master gửi địa chỉ đến Slave R/W=0 và xung ACK
66
Khi nhận đúng ACK Master bắt đầu gửi dữ liệu từng byte một ra bus và
kèm theo ACK
Kết thúc quá trình giao tiếp bằng bit STOP
Đọc dữ liệu từ lave:
Master tạo xung START
Master gửi địa chỉ đến Slave R/W=1 và xung ACK
Khi nhận đúng ACK Slave bắt đầu gửi dữ liệu từng byte một ra bus và
kèm theo ACK.
Kết thúc quá trình giao tiếp bằng bit STOP
67
KẾT LUẬN
Qua đđề tài tìm hiểu về MCU AVR nhóm chúng em đã học thêm được rất
nhiều kiến thức. Quá trình tìm hiểu nhóm đã thực hiện được một số demo nhỏ như led
đơn, LCD, ADC…Tuy nhiên vì kiến thức còn nhiều hạn chế nên đề tài chưa được mở
rộng với những ứng dụng thực tế. Trong thời gian tới nhóm sẽ cố gắng tìm nhiểu
nhiều ứng dụng cụ thể hơn nữa.
Em xin gửi lời cám ơn chân thành đến thầy Lê Hoài Nghĩa và xin chúc thầy
sức khỏe.
TÀI LIỆU THAM KHẢO:
1. Datasheet Atmel
2. http://www.hocavr.com
3. .http://www.dientuvietnam.net
68