97
ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH TRƯỜ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 KTMT02 Phạm Hoài Phước MSSV: 07520292 KTMT02 Trần Minh Tính MSSV: 07520362 KTMT02 Huỳnh Thanh Long MSSV: 07520588 KTMT02 GVHD: ThS Lê Hoài Nghĩa

Báo cáo đề tài VĐK AVR

Embed Size (px)

Citation preview

Page 1: Báo cáo đề tài VĐK AVR

ĐẠ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

Page 2: Báo cáo đề tài VĐK AVR

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

Page 3: Báo cáo đề tài VĐK AVR

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

Page 4: Báo cáo đề tài VĐK AVR

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

Page 5: Báo cáo đề tài VĐK AVR

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

Page 6: Báo cáo đề tài VĐK AVR

&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

Page 7: Báo cáo đề tài VĐK AVR

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

Page 8: Báo cáo đề tài VĐK AVR

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

Page 9: Báo cáo đề tài VĐK AVR

ATmega8/8515/8535

ATmega16

ATmega161

ATmega162

ATmega163

ATmega169

ATmega32

ATmega323

ATmega103

ATmega64/128/2560/2561

4

Page 10: Báo cáo đề tài VĐK AVR

&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

Page 11: Báo cáo đề tài VĐK AVR

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

Page 12: Báo cáo đề tài VĐK AVR

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

Page 13: Báo cáo đề tài VĐK AVR

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

Page 14: Báo cáo đề tài VĐK AVR

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

Page 15: Báo cáo đề tài VĐK AVR

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

Page 16: Báo cáo đề tài VĐK AVR

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

Page 17: Báo cáo đề tài VĐK AVR

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

Page 18: Báo cáo đề tài VĐK AVR

&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

Page 19: Báo cáo đề tài VĐK AVR

Đâ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

Page 20: Báo cáo đề tài VĐK AVR

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

Page 21: Báo cáo đề tài VĐK AVR

#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

Page 22: Báo cáo đề tài VĐK AVR

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

Page 23: Báo cáo đề tài VĐK AVR

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

Page 24: Báo cáo đề tài VĐK AVR

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

Page 25: Báo cáo đề tài VĐK AVR

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

Page 26: Báo cáo đề tài VĐK AVR

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

Page 27: Báo cáo đề tài VĐK AVR

Đâ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

Page 28: Báo cáo đề tài VĐK AVR

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

Page 29: Báo cáo đề tài VĐK AVR

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

Page 30: Báo cáo đề tài VĐK AVR

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

Page 31: Báo cáo đề tài VĐK AVR

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

Page 32: Báo cáo đề tài VĐK AVR

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

Page 33: Báo cáo đề tài VĐK AVR

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

Page 34: Báo cáo đề tài VĐK AVR

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

Page 35: Báo cáo đề tài VĐK AVR

đổ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

Page 36: Báo cáo đề tài VĐK AVR

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

Page 37: Báo cáo đề tài VĐK AVR

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

Page 38: Báo cáo đề tài VĐK AVR

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

Page 39: Báo cáo đề tài VĐK AVR

     

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

Page 40: Báo cáo đề tài VĐK AVR

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

Page 41: Báo cáo đề tài VĐK AVR

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

Page 42: Báo cáo đề tài VĐK AVR

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

Page 43: Báo cáo đề tài VĐK AVR

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

Page 44: Báo cáo đề tài VĐK AVR

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

Page 45: Báo cáo đề tài VĐK AVR

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

Page 46: Báo cáo đề tài VĐK AVR

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

Page 47: Báo cáo đề tài VĐK AVR

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

Page 48: Báo cáo đề tài VĐK AVR

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

Page 49: Báo cáo đề tài VĐK AVR

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

Page 50: Báo cáo đề tài VĐK AVR

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

Page 51: Báo cáo đề tài VĐK AVR

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

Page 52: Báo cáo đề tài VĐK AVR

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

Page 53: Báo cáo đề tài VĐK AVR

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

Page 54: Báo cáo đề tài VĐK AVR

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

Page 55: Báo cáo đề tài VĐK AVR

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

Page 56: Báo cáo đề tài VĐK AVR

{

/* 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

Page 57: Báo cáo đề tài VĐK AVR

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

Page 58: Báo cáo đề tài VĐK AVR

Đ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

Page 59: Báo cáo đề tài VĐK AVR

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

Page 60: Báo cáo đề tài VĐK AVR

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

Page 61: Báo cáo đề tài VĐK AVR

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

Page 62: Báo cáo đề tài VĐK AVR

đượ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

Page 63: Báo cáo đề tài VĐK AVR

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

Page 64: Báo cáo đề tài VĐK AVR

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

Page 65: Báo cáo đề tài VĐK AVR

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

Page 66: Báo cáo đề tài VĐK AVR

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

Page 67: Báo cáo đề tài VĐK AVR

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

Page 68: Báo cáo đề tài VĐK AVR

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

Page 69: Báo cáo đề tài VĐK AVR

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

Page 70: Báo cáo đề tài VĐK AVR

để 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

Page 71: Báo cáo đề tài VĐK AVR

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

Page 72: Báo cáo đề tài VĐK AVR

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

Page 73: Báo cáo đề tài VĐK AVR

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