57
Nguyn Ngc Hà . ĐT : 0982969872. Mail : [email protected] VI ĐIỀU KHIỂN AVR PHẦN 1: KIẾN THỨC AVR I. Giới thiệu AVR là họ VĐK 8 bit theo công nghệ mới, với những tính năng rất mạnh được tích hợp trong từng chip của hãng Atmel theo công nghệ RISC ( educed Instruction Set Computer ). Nó ngang hàng với các họ VĐK 8 bit kh| như PIC , Pisoc. AVR có nhiều tính năng mới đ|p ứng tối đa nhu cầu của người sử dụng, có độ ổn định, khả năng tích hợp, sự mềm dẻo trong việc lập trình. Gần như chúng ta không cần mắc thêm bất kỳ linh kiện phụ nào khi sử dụng AVR, thậm chí không cần nguồn tạo xung clock cho chip. Thiết bị lập trình đơn giản ( như mạch nạp STK 200 chỉ cần v{i con điện trở là có thể nạp chương trình cho chip). Một số còn hỗ trợ lập trình on-chip bằng bootloader không cần mạch nạp. Tương thích với ngôn ngữ lập trình C Hầu hết c|c chip AVR có c|c tính năng sau: - Giao diện SPI ( Serial Peripheral Interface) đồng bộ - Sử dụng xung clock ngo{i lên đến 16Mhz, hoặc xung clock nội lên đến 8Mhz - Bộ nhớ chương trình Flash có thể lập trình lại nhiều lần , dung lượng lớn, có bộ nhớ lưu trữ lập trình được EEPROM. - Nhiều ngõ v{o ra ( I/O )2 hướng - Bộ biến đổi ADC 10 bit - C|c kênh băm xung PWM - Các chế độ tiết kiệm năng lượng : sleep, stand by,… - Bộ dịnh thời Watchdog. - Timer/ counter 8 bit, 16bit - Bộ so sánh analog - Giao diện nối tiếp USART ( tương thích chuẩn RS-232 ) - Giao diện nối tiếp Two-Wire-Seril ( tương thích chuẩn I2C) Master và Slaver - Một số chíp AVR thông dụng: - AT90S1200 - AT90S2313 - AT90S2323 and AT90S2343 - AT90S2333 and AT90S4433

VĐK AVR by Nguyen Ha

Embed Size (px)

Citation preview

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

VI ĐIỀU KHIỂN AVR

PHẦN 1: KIẾN THỨC AVR

I. Giới thiệu

AVR là họ VĐK 8 bit theo công nghệ mới, với những tính năng rất mạnh được tích hợp trong

từng chip của hãng Atmel theo công nghệ RISC ( educed Instruction Set Computer ). Nó

ngang hàng với các họ VĐK 8 bit kh| như PIC , Pisoc. AVR có nhiều tính năng mới đ|p ứng

tối đa nhu cầu của người sử dụng, có độ ổn định, khả năng tích hợp, sự mềm dẻo trong việc

lập trình.

Gần như chúng ta không cần mắc thêm bất kỳ linh kiện phụ nào khi sử dụng AVR, thậm chí

không cần nguồn tạo xung clock cho chip. Thiết bị lập trình đơn giản ( như mạch nạp STK

200 chỉ cần v{i con điện trở là có thể nạp chương trình cho chip). Một số còn hỗ trợ lập

trình on-chip bằng bootloader không cần mạch nạp.

Tương thích với ngôn ngữ lập trình C

Hầu hết c|c chip AVR có c|c tính năng sau:

- Giao diện SPI ( Serial Peripheral Interface) đồng bộ

- Sử dụng xung clock ngo{i lên đến 16Mhz, hoặc xung clock nội lên đến 8Mhz

- Bộ nhớ chương trình Flash có thể lập trình lại nhiều lần , dung lượng lớn, có bộ nhớ

lưu trữ lập trình được EEPROM.

- Nhiều ngõ v{o ra ( I/O )2 hướng

- Bộ biến đổi ADC 10 bit

- C|c kênh băm xung PWM

- Các chế độ tiết kiệm năng lượng : sleep, stand by,…

- Bộ dịnh thời Watchdog.

- Timer/ counter 8 bit, 16bit

- Bộ so sánh analog

- Giao diện nối tiếp USART ( tương thích chuẩn RS-232 )

- Giao diện nối tiếp Two-Wire-Seril ( tương thích chuẩn I2C) Master và Slaver

- …

Một số chíp AVR thông dụng:

- AT90S1200

- AT90S2313

- AT90S2323 and AT90S2343

- AT90S2333 and AT90S4433

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

- AT90S4414 and AT90S8515

- AT90S4434 and AT90S8535

- AT90C8534

- ATtiny10, ATtiny11, ATtiny12

- ATtiny15

- ATtiny22

- ATtiny26

- ATtiny28

- ATmega8/8515/8535

- ATmega16

- ATmega161

- ATmega162

- ATmega163

- ATmega169

- ATmega32

- ATmega323

- ATmega103

- ATmega64/128/2560/2561

- AT86RF401

- ATxmega128A1

- ATxmega128A3

II. Công cụ hỗ trợ

1. Trình biên dịch: có rất nhiều trình biên dịch có thể sử dụng để biên dịch code thành

file hex để nạp chip

- AvrStudio: là trình biên dịch ASM chính thức cung cấp bởi Atmel, đ}y l{ trình biên

dịch hoàn toàn miễn phí và tốt nhất cho lập trình AVR bằng ASM

- Wavrasm: cũng được cung cấp bởi Atmel. Hiện tại thì ko còn được sửu dụng.

- WinAVR: là trình dịch được phát triển bởi GNU, sử dụng ngôn ngữ C.

- CodeVisionAVR: 1 chương trình lập trình C rất hay cho AVR, hỗ trợ nhiều thư viện

lập trình

- ICCAVR: lập trình C cho AVR

- …

2. Chương trình nạp: đa số các trình biên dịch đều tích hợp sẵn 1 chương trình nạp

chip hỗ trợ nhiều loại mạch. Việc chọn chương trình nạp sẽ được giới thiệu sau.

3. Mạch nạp: có rất nhiều loại mạch nạp cho AVR

- STK200/300 : mạch nạp giao tiếp với máy tính qua cổng LPT. Gồm 2 phiên bản là

bản thu gọn với bản dùng IC đệm 74xx244

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

Mạch nạp tương thích với chương trình nạp PonyProg

- Mạch nạp USB AVR910: là mạch nạp sử dụng cổng USB nên rất tiện lợi trong quá

trình sử dụng

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

- Mạch nạp USBasp: được đ|nh gi| cao hơn về tính ổn định và tiện lợi. Mạch điện cũng

tương đối đơn giản

4. Chương trình mô phỏng: ở đ}y tập trung vào Protues. Protues không những mô

phỏng hoạt động bên trong của chip mà còn mô phỏng mạch điện tử rất trực quan, là

công cụ hữu ích cho việc học

III. Cấu trúc AVR

1. Bộ nhớ chương trình ( program memory): là bộ nhớ Flash lập trình được. Gồm 2

phần : Application Flash Section và Boot Flash section

application section bao gồm 2 phần: phần chứa các instruction (mã lệnh cho hoạt động của

chip) và phần chứa các vector ngắt (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. Phần

chứa instruction nằm liền sau đó, chương trình viết cho chip phải được load vào phần này

Vì chức năng chính của bộ nhớ chương trình là chứa instruction, chúng ta không có nhiều

cơ hội t|c động lên bộ nhớ này khi lập trình cho chip, vì thế đối với người lập trình AVR, bộ

nhớ n{y “không qu| quan trọng”. Tất cả các thanh ghi quan trọng cần khảo sát nằm trong

bộ nhớ dữ liệu của chip

Tổ chức bộ nhớ của AVR

2. Bộ nhớ dữ liệu ( data memory ): là phần chứa các thanh ghi quan trọng của chip,

việc lập trình cho chip phần lớn là truy cập bộ nhớ này. Bộ nhớ dữ liệu trên các chip

AVR có độ lớn khác nhau. Về cơ bản bộ nhớ này gồm 5 phần:

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

- Phần 1: là phần đầu tiên trong bộ nhớ dữ liệu, bao gồm 32 thanh ghi có tên gọi là

register file (RF), hay General Purpose Register , đơn giản là các thanh ghi. Các thanh

ghi đều là các thanh ghi 8 bit

- Tất cả 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 giá trị có dấu từ -128 đến 127

hoặc mã ASCII của 1 ký tự n{o đó. C|c thanh ghi đặt tên theo thứ tự l{ R0 đến R31.

Được chia thành 2 phần, phần 1 gồm các thanh ghi từ R0 đến R15 và phần 2 là các

thanh ghi từ R16 đến R31

- Đặc điểm của các thanh ghi:

+ Được truy cập trực tiếp trong các instruction.

+ Các toán tử, phép toán thực hiện trên các thanh ghi này chỉ cần 1 chu kỳ xung

clock.

+ Register File được kết nối trực tiếp với bộ xử lý trung tâm của chip

+ Là nguồn chứa các số hạng trong phép to|n v{ cũng l{ đích kết quả trả lại của phép

toán

Tất cả các instruction sử dụng RF làm toán hạng đều có thể truy nhập tất cả các RF

một cách trực tiếp trong 1 chu kỳ xung clock, ngoại trừ SBCI, SUBI, CPI, ANDI và LDI,

các instruction này chỉ có thể truy nhập các thanh ghi từ R16 đến R31.

Thanh ghi R0 là thanh ghi duy nhất được sử dụng trong instruction LPM (Load

Program Memory). Các thanh ghi R26, R27, R28, R29, R30 và R31 ngoài chức năng

thông thường còn được sử dụng như c|c con trỏ (Pointer register) trong một số

instruction truy xuất gián tiếp

Các chức năng phụ của thanh ghi

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

32 RF của AVR được xem là 1 phần của CPU, vì thế chúng được CPU sử dụng trực

tiếp v{ nhanh chóng, để gọi các thanh ghi này, chúng ta không cần gọi địa chỉ mà chỉ

cần gọi trực tiếp tên của chúng. RF thường được sử dụng như c|c to|n hạng

(operand) của các phép toán trong lúc lập trình.

- Phần 2: là phần năm sau register file. Bao gồm 64 thanh ghi gọi là 64 thanh ghi xuất

nhập, hay còn gọi là vùng nhớ I/O. Là cửa ngõ giao tiếp của CPU với thiết bị ngoại vi

+ Vùng nhớ I/O có thể được truy cập như SRAM 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ừ 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.

+ Vì c|c thanh ghi trong vùng I/O không được hiểu theo tên gọi như c|c Register file,

khi lập trình cho c|c thanh ghi n{y, người lập trình cần nhớ địa chỉ của từng thanh

ghi, đ}y l{ việc tương đối khó khăn. Tuy nhiên, trong hầu hết các phần mềm lập trình

cho AVR, địa chỉ của tất cả c|c thanh ghi trong vùng I/O đều được định nghĩa trước

trong 1 file Definition chỉ cần đính kèm file n{y v{o chương trình của bạn là có thể

truy xuất các thanh ghi với tên gọi của chúng.

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

- Phần 3: RAM tĩnh, nội, là vùng không gian cho chứa các biến (tạm thời hoặc toàn

cục) trong lúc thực thi chương trình, vùng n{y tương tự các thanh RAM trong máy

tính nhưng có dung lượng khá nhỏ (khoảng vài KB, tùy thuộc vào loại chip

- Phần 4: RAM ngoại, c|c chip AVR cho phép người dùng gắn thêm các bộ nhớ ngoài

để chứa biến, vùng này chỉ tồn tại khi người dùng gắn thêm bộ nhớ ngoài vào chip

- Phần 5: EEPROM : là 1 phần quan trọng của chip. Bộ nhớ này không bị xóa nagy cả

khi ngắt nguồn cấp cho chip

3. Hoạt động của AVR

Cấu trúc bên trong AVR

32 thanh ghi trong Register File được kết nối trực tiếp với ALU ( Arithmetic Logic Unit)

bằng 2 line, vì thế ALU có thể truy xuất trực tiếp cùng lúc 2 thanh ghi RF chỉ trong 1 chu kỳ

xung clock

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

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). Đó chính l{ c|ch thức hoạt động của AVR.

AVR có ưu điểm l{ hầu hết c|c instruction đều được thực thi trong 1 chu kỳ xung clock,

vì vậy có thể nguồn clock lớn nhất cho AVR có thể nhỏ hơn 1 số vi điều khiển kh|c như PIC

nhưng thời gian thực thi vẫn nhanh hơn

4. Stack

Là tháp dữ liệu, dữ liệu được chứa vào stack ở đỉnh tháp và dữ liệu được lấy ra ở đỉnh. Kiểu

truy cập dữ liệu này gọi là LIFO ( last in first out )

Stack hoạt đông bằng cách khai báo một vùng nhớ trong SRAM là stack là ta có thể sử dụng

vùng nhớ n{y như 1 stack thực thụ.

Không nên sử dụng Stack để lưu c|c biên thông thường vì đôi khi sẽ l{m chương trình thực

thi sai hoặc tốn thời gian vô ích.Stack thường được sử dụng trong c|c chương trình con, khi

chúng ta cần “nhảy” từ một vị trí trong chương trình chính đến 1 chương trình con, sau khi

thực hiện chương trình con lại muốn quay về vị trí ban đầu trong chương trình chính thì

Stack l{ phương c|ch tối ưu dùng để chứa bộ đếm chương trình trong trường hợp này.

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

5. Thanh ghi trạng thái – SREG ( Status Registry )

Nằm trong vùng nhớ I/O, thanh ghi SREG có đia chỉ I/O là 0x003F v{ địa chỉ bộ nhớ là

0x005F , là thanh ghi quan trọng của AVR. Thanh ghi SREG chứa 8 bit cờ chỉ trạng thái của

bộ xử lý, tất cả đều bị xóa sau khi reset, có thể đọc ghi bởi chương trình

- Bit 0 – C ( Carry Flag : Cờ nhớ ): là bit nhớ trong c|c phép đại số hoặc logic

- Bit 1 – Z ( Zero Flag : Cờ 0 ) : cờ n{y được set nếu kết quả phép to|n đại số hay

phép logic bằng 0.

- Bit 2 – N ( Negative Flag : Cờ âm ): được set nếu kết quả phép toán đại số hay phép

logic là số âm

- Bit 3 – V ( Two’s complement Overflow Flag : Cờ tràn của bù 2 ): hoạt động liên

quan đến phần bù nhị phân

- Bit 4 – S ( Sign Bit : Bit dấu ): là kết quả giữa phép XOR giữa cờ N và V

- Bit 5 – H ( Half Carry Flag : Cừ nhờ nữa ) :cờ H là cờ nhớ trong 1 v{i phép to|n đại

số và phép logic, hiệu quả đối với phép toán BCD

- Bit 6 – T ( Bit Coppy Storage ): được sử dụng trong 2 Instruction BLD ( Bit Load )

và BST ( Bit Storage ).

- Bit 7 – I ( Golbal Interrupt Enable ): Cho phép ngắt toàn bộ. Bit n{y được set lên 1

nếu trong chương trình có sử dụng ngắt

6. Macro và chương trình con

- Macro : là khái niệm chỉ một đoạn code nhỏ để thực hiên một công việc n{o đó, nếu

có 1 đoạn code n{o đó rất hay sử dụng khi lập trình thì nên dùng macro để tránh

việc phải viết đi viết lại đoạn code đó. Macro không l{m giảm dung lượng chương

trình mà chỉ làm cho việc lập trình nhẹ nh{ng hơn.

- Chương trình con: l{ 1 đoạn code thực hiện chức năng đặc biệt n{o đó. Tuy nhiên

khác với Macro, mỗi khi gọi chương trình con, con trỏ chương trình n{y nhảy đến

chương trình con để thực hiện chương trình con v{ sau đó quay về chương trình

chính. Chương trình con chỉ được biên dịch 1 lần và sử dụng nhiều lần, nó làm giảm

dung lượng chương trình. Việc nhảy đến chương trình con v{ nhảy về chương trình

chính cần vài chu kỳ máy, có thể làm chậm chương trình.

IV. Ngắt Ngoài

1. Ngắt trên AVR

Interrupts, thường được gọi là ngắt, là một tín hiệu khẩn cấp gởi đến bộ xử lí, yêu cầu bộ

xử lí tạm ngừng tức khắc các hoạt động hiện tại để “nhảy” đến một nơi kh|c thực hiện một

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

nhiệm vụ khẩn cấp n{o đó, nhiệm vụ này gọi là trình phục vụ ngắt – isr (interrupt service

routine ). Sau khi kết thúc nhiệm vụ trong isr, bộ đếm chương trình sẽ được trả về giá trị

trước đó để bộ xử lí quay về thực hiện tiếp các nhiệm vụ còn dang dở. Như vậy, ngắt có mức

độ ưu tiên xử lí cao nhất, ngắt thường được dùng để xử lí các sự kiện bất ngờ nhưng không

tốn quá nhiều thời gian. Các tín hiệu dẫn đến ngắt có thể xuất phát từ các thiết bị bên trong

chip (ngắt báo bộ đếm timer/counter tràn, ngắt báo quá trình gởi dữ liệu bằng RS232 kết

thúc…) hay do c|c t|c nh}n bên ngo{i (ngắt b|o có 1 button được nhấn, ngắt báo có 1 gói

dữ liệu đ~ được nhận…).

2. Ngắt ngoài

Ngắt ngoài là cách rất hiệu quả để thực hiện giao tiếp giữa người dùng và chip. Có 3 thanh

ghi liên quan đến ngắt ngoài là MCUCR, GICR, GIFR

- Thanh điều khiển MCU - MCUCR ( MCU control register ) là thanh ghi các lập chế

độ ngắt cho ngắt ngoài

Cấu trúc thanh ghi MCUCR:

MCUCR l{ thanh ghi 8 bit nhưng với hoạt động ngắt, 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 ). 4 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 INT1 sense Control

- Thanh ghi diều khiển ngắt chung – GICR ( General Interrupt Control Register )

l{ 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, cấu trúc thanh ghi:

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

Bit 7 – INT1 gọi là bit cho phép ngắt 1( Interrupt enable), set bit này bằng 1 là cho phép

nagwts INT1 hoạt động, tương tự bit INT) đ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), 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. Cấu trúc thanh ghi GIFR:

Sau khi đ~ x|c lập các bit sẵn sàng cho các ngắt ngoài, việc sau cùng chúng ta cần làm là set

các bit I, tức bit cho phép ngắt toàn cục, trong thanh ghi trạng thái chung của chip. Các chân

PD2, PD3 là các chân ngắt nên phải set các chân này là input ( thanh ghi DDRD ).Hình ảnh

thiết lập ngắt ngoài:

Để sử dụng ngắt ngoài với C ta chỉ cần include file “interrupt.h” nằm trong thư viện của

phần mềm lập trình. File” interrupt.h chứa định nghĩa c|c h{m v{ phương thức phục vụ cho

viết trình phục vụ ngắt.

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

V. Timer – Counter

1. Giới thiệu

Timer/ Counter ( T/C ) l{ c|c modul độc lập với CPU. Chức năng chính của các bộ Timer/

Counter như tên gọi của chúng l{ định thì ( tạo ra một khoảng thời gian, đếm thời gian …)

v{ đếm sự kiện. Trên AVR, các bộ Timer/ Counter còn có chức năng tạo ra c|c xung điều

rộng PWM. Trên chip ATmega16 có 2 bộ Timer/ Counter 8 bit và 1 bộ 16 bit.

- Bộ định thời gian: Chúng ta có thể tạo ra 1 bộ định thời thì để c{i đặt một khoảng

thời gian n{o đó

- Bộ đếm sự kiện: chúng ta có thể dùng Timer/ Counter như 1 đếm để đếm các sự

kiện ( sự thay đổi trạng thái )

- PWM ( Pulse Width Mudulation ): “ xung điều rộng “ l{ kh|i niệm chỉ tín hiệu

xung m{ thường thì chu kỳ của nó được cố định, thời gian tín hiệu mức HIGH ( duty

cycle )của nó có thể được thay đổi

Tạo ra PWM tức là tạo ra những tín hiệu xung mà ta có thể điều khiểnduty cycle ( và cả tần

số, chu kỳ nếu cần thiết ).Timer trên AVR l{ 1 modul lý tưởng để tạo ra các tín hiệu dạng

này.

2. Các chế độ hoạt động của Timer

- Chế Độ Thông Thường: Đ}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 - 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

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

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.

Sơ đồ thời gian của chế độ CTC

- 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ẽ bi

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

Sơ đồ dưới đ}y mô tả chu kỳ thời gian của chế độ:

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

Biều đồ thời gian chế độ Fast PWM

- 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

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.Biểu đồ thời gian đ}y

mô tả hoạt động của to{n bộ qu| trình:

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

Từ biểu đồ thời gian ta nhận thấy việc thay đổi tần số trong hoạt động của phase

correct PWM có thể thay thế bằng hai gi| trị l{ MAX v{ BOTTOM. Nó linh hoạt hơn so

với chế độ Fast PWM.

Tần số có thể tính theo công thức như sau:

f=fc/N*510

Trong đó N tạo ra bởi bộ chia nó có c|c gi| trị l{:1,8,64,256 hoặc 1024

3. Các thanh ghi trong bộ Timer/Counter

- Thanh ghi điều khiển - TCCRx:

Bit 3,6 –WG00-WG01: Đ}y l{ c|c bít chọn chế độ trong Timer.Các giá trị được mô

tả trong bảng sau.

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

Bảng chọn chế độ Timer:

Bit 5-4 : COM00-COM01: Quy định giá trị đầu ra trong các phép so sánh

Bit: 0 – CS2:0 :Đ}y l{ c|c bít quy định xung cấp cho hoạt động của Timer.Bảng dưới

đ}y mô tả toàn bộ các giá trị

Chọn chế độ cho xung Clock

- Thanh ghi cờ ngắt-TIFR:

Bit 1-OCFx : Khi hai giá trị bằng nhau bít n{y được set lên bằng 1

Bit 1-TVOx : Khi bộ đếm vượt quá giá trị Top thì bít n{y được set bằng 1

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

- Thanh ghi mặt nạ ngắt-TIMSK:

Bit 1 – OCIEx: khi bít n{y được set lên bằng 1 thì cho phép ngắt so sánh

Bit 0 –TOIEX : Khi bít n{y được set lên bằng 1 thì cho phép ngắt tràn

VI. Giao tiếp UART

USART ( Universal Synchronous & Asynchronous serial Reveiver and Transmitter )

là bộ truyền nhận nối tiếp đồng bộ v{ không đồng bộ. Khái niệm USART ( hay UART nếu chr

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ỉ 1 chuẩn giao tiếp. USART hay UART cần phải kết hợp với 1 bộ

chuẩn điện |p để tạo ra 1 chuẩn giao tiếp n{o đó. Như chuẩn RS232 ( COM ) trên các máy

tính cá nhân là sựu 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à 5V, 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 ( high) và +12V( low ).

- Truyền thông nối tiếp: dữ liệu truyền từng bit trên 1 đường truyền. Vì dữ liệu

được chia nhỏ thành từng bit khi truyền/ nhận nên tốc đọ truyền sẽ bị giảm. Mặt

kh|c, để đảm báo tính chính xác của dữ liệu, bộ truyền và bộ nhận cần có những quy

tắc nhất định.

- Khái niệm đồng bộ để chỉ sự b|o trước trong quá trình truyền để có thể truyền nhận

dễ dàng với ít rủi ro trong quá trình truyền. cách truyền n{y đòi hỏi ít nhất 2 đường

truyền cho 1 quá trình.

- Truyền thông không đồng bộ chỏ cần 1 đường truyền cho 1 quá trình. Khung dữ liệu

đ~ được chuẩn hóa bởi các thiết bị nên không cần đường xung nhịp để b|o trước dữ

liệu đến.Truyền thông nối tiếp koong đồng bộ vì thế hiệu quả hơn đường truyền

thông đồng bộ. Tuy nhiên, để quá trình truyền thành công thì việc tuân thủ các tiêu

chuẩn truyền dữ liệu là hết sức quan trọng.

Các khái niệm quan trọng trong phương ph|p truyền thông này:

- 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 rất dễ mất hoặc sai lệch dữ liệu,

quá trình truyền thông thoe kiểu này phải tuân theo 1 số qya tắc nhất định. Bên cạnh

tốc độ baud, khung truyền là 1 yếu tố quan trọng tạo nên sựu thành công khi truyền

và nhận. Khung truyền bao gồm c|c quy định về số bit trong 1 lần truyền, các bit báo

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

như bít Start v{ bit Stop, c|c bit kiểm tra như Parity, ngo{i ra số lượng các bit trong

1 data cũng được quy định bởi khung truyền

- Start bit: Start l{ bit đầu tiên được truyền trong 1 frame truyền, bit này có chức

năng b|o cho c|c thiết bị nhận biết rằng có 1 gói dữ liệu sắp được truyền tới. Ở

modul USART trong AVR, đường truyền luôn ở trạng thái cao khi nghỉ ( Idle ), nếu 1

chip AVR muốn thực hiện việc truyền dữ liệu nó sẽ gởi 1 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: dữ liệu cần truyền là thông tin 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 vó thể quy đổi số lượng bit của data là 5, 6,7 ,8 , 9(

tương tự cho hầu hết các thiế bị hôc 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) 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).

- Parity Bit: parity l{ bit dùng để kiểm tra dữ liệu truyền. có 2 loại parity là parity

chẵn là parity lẻ. 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 v{ ngược lại. parity không phải là bắt buộc và vì thế chúng ta có thể

loại bit này khỏi khung truyền

- Stop bit: Stop bit là 1 hoặc các bit báo cho thiết bị nhận rằng 1 gói dữ liệu đ~ được

gởi xong. Sau khi nhận được stop bít, 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 bit bắt buộc xuất hiện

trong khung truyền, trong AVR USART có thể là 1 hoặc 2 bit

Khung truyền phổ biến nhất là: start bit + 8 bit data + stop bit

- Truyền thông nối tiếp khôn đồng bộ với AVR: ATmega 16 có 1 modul truyền

thông nối tiếp USART. Có 3 ch}n liên quan đến modul này là chân xung nhịp – XCK,

chân truyền dữ liệu – TxD ( Transmitted Data ) và nhận dữ liệu – RxD ( Reveied Data

). Trong đó ch}n XCK chỉ được sử dụng như l{ ch}n ph|t hoặc nhận xung giữ nhịp

trong chế độ truyền đồng bộ. Tuy nhiên, ở đ}y chúng ta không khảo s|t đến chế độ

truyền thông đồng bộ, vì thế ta chỉ cần quan t}m đến 2 chân TxD và RxD. Vì các chân

truyền/ nhận dữ liệu chỉ đảm nhiệm 1 chức năng độc lập ( hoặc truyền, hoặc nhận ),

để kết nối các chip AVR với nhau( hoặc AVR với các thiết bị hỗ trợ UART khác) ta

phải đấu chéo 1 chân này. TxD của thiết bị thứ nhất kết nối với RxD của thiết bị thứ 2

v{ ngược lại. Modul USART trên chip Atmega16 hoạt động song công , nghĩa l{ qu|

trình truyền và nhận dữ liệu có thể xảy ra đồng thời.

- Tất cả hoạt động và trạng thái của modul USART được điều khiển và quan sát thông

qua các thanh ghi trong vùng nhớ I/O. Có 5 thanh ghi được thiết kế riêng cho hoạt

động v{ điều khiển của USART, đó l{:

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

+ UDR: thanh ghi dữ liệu, là 1 thanh ghi 8 bit chứa các giá trị nhận được v{ ph|t đi

của USART. Thực chất thanh ghi này có thể coi như thanh ghi TXB v{ RXB có chung

địa chỉ. Đọc UDR thu được giá trị thanh ghi 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

+ UCSRA ( USART Control and Status Register A ): l{ 1 trong 3 thanh ghi điều

khiển hoạt động của modul USART

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 )…

1 số bit quan trọng của thanh ghi này:

UDRE ( USART Data Register Empty ) khi bit nà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. Vì thế, nếu muốn truyền dữ liệu đầu tiên phải kiểm tra xem bit UDRE có

bằng 1 hay không, sau khi chắc chắn rằng UDRE =1 hãy viết dữ liệu vào thanh

ghi UDR để truyền đi.

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 cao gấp 2 lần so với khi bit này mag giá trị là 0

MPCM là bit chọn chế độ hoạt động đa xử lý

+ USCRB ( USART Control and Status Register B ): đ}y l{ thanh ghi quan trọng

điều khiển USART.

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 dung 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.

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

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. Bạn nhớ lại rằng 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à

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. Bạn chú ý l{ c|c bit được đ|nh số từ 0, vì thế bit thứ chín sẽ có chỉ số là 8, vì

lẽ đó m{ bit n{y có tên là RXD8 (không phải RXD9)

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 dung trong lúc truyền dữ liệu

+ UCSRC ( USART Control and status Register C ): chủ yếu quy định khung truyền với

chế độ truyền. Tuy nhiên, thanh ghi này lại có cùng địa chỉ với thanh ghi UBRRH ( thnah ghi

chứa bit cao dùng để xác lập tốc độ baud ), tức là 2 thanh ghi này là 1. 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.

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 lựa chọn,

ngược lại nếu UMSEL=1, chế độ đồng bộ được kích hoạt.

2 bit UPM1 và UPM0 ( parity Mode ) được dùng để quy định kiểm tra parity.

Nếu UPM1:0=00, parity không được sử dụng, UPM1:0=10 thì parity chẵn được

sửu dụng, UPM1:0=11 parity lẻ được sử dụng

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

USBS ( Stop bit Seclect ), 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 trong khi USBS=1 sẽ có 2 stop

được dùng.

Hai bit UCSZ1 và UCSZ2 ( Charater 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

UBRRL và UBRRH ( USART Baud Rate Register ): 2 thanh ghi thấp và cao quy

định tốc độ Baud

Giá trị gán cho thanh ghi UBRR không phải là tốc độ Buad, nó chỉ được USART dùng để tính

tộc độ baud dựa vào gái 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

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

fOSC là tần số xung nhịp của hệ thống ( thạch anh hay nguồn xung nội …) Bảng c|ch đặt giá

trị cho UBRR theo tốc độ baud mẫu

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

- Sử dụng UART

Để sử dụng USART trên AVR phải thực hiện 3 việc quan trọng, đó l{: c{i đặt tốc độ baud (

thanh ghi UBRR ), định dạng khung truyền ( UCSRB, UCSRC ) và cuối cùng kích hoạt bộ

truyền, bộ nhận, ngắt,…

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

VII. Chuyển đổi ADC

1. Chuyển đổi dữ liệu Analog sang Digital

Trong các ứng dụng đo lường v{ điều khiển bằng vi điều khiển bộ chuyển đổi tương tự - số

( ADC ) là 1 thành phần rất quan trọng.Dữ liệu ở thế giới bên ngo{i l{ tương tự , trong khi

đó vi điều khiển là 1 thiết bị số, các giá trị mà một vi điều khiển có thể thao tác là các con số

rời rạc vì thực chất chúng được tạo thành từ sự kết hợp của 2 mức 0 và 1. Quá trình chuyển

1 dữ liệu analog thành 1 dữ liệu digital thường được thực hiện bởi 1 thiết bị gọi l{ “ bộ

chuyển đổi tương tự -số “ hay đơn giản là ADC ( Analog to Digital Converter )

Chuyển đổi ADC theo phương ph|p trực tiếp ( direct converting ) hoặc flash ADC. Các bộ

chuyển đổi n{y được cấu thành từ một dãy các bộ so sánh ( OPAMP ), các bộ so s|nh được

mắc song song v{ được kết nối trực tiếp cới tín hiệu analog cần chuyển đổi. Một điện áp

tham chiếu ( reference) và một mạch chia |p được sử dụng để tạo ra các mức điện áp so

sánh khác nhau cho mỗi bộ sa sánh.

- Độ phân giải ( resolution ): dùng để chỉ số bit cần thiết để chứa hết các mức giá trị

digital ngõ ra. Nếu một mạch chuyển đổi ADC có độ phân giải n bit thi sẽ có 2n mức

giá trị có thể có ở ngõ ra ở mức digital. Để tạo ra một mạch chuyển đổi flash ADC có

độ phân giải n bit, chúng ta sẽ cần đến 2n-1 bộ so sánh, giá trị này rất lớn khi thiết kế

bộ chuyển đổi ADC có độ phân giải cao, vì thế các bộ chuyển đổi flash ADC thường có

độ phân giải ít hơn 8 bit. Độ phân giải liên quan đến chất lượng chuyển đổi ADC, việc

lựa chọn độ phân giải phải phù hợp với độ chính xác yêu cầu và khả năng xử lý của

bộ điều khiển.

- Điện áp tham chiếu( reference voltage ): là giá trị điện áp lớn nhất mà bộ ADC có

thể chuyển đổi. trong các bộ ADC, điện áp tham chiếu – Vref ( reference voltage ) là

thông số được đặt bởi người dùng. Ví dụ, một bộ ADC 10 bit (độ phân giải) có

Vref=3V, nếu điện áp ở ngõ vào là 1V thì giá trị số thu được sau khi chuyển đổi sẽ là:

1023x(1/3)=314. Trong đó 1023 l{ gi| trị lớn nhất mà một bộ ADC 10 bit có thể tạo

ra (1023=210-1). Vì điện áp tham chiếu ảnh hưởng đến độ chính xác của quá

trình chuyển đổi, chúng ta cần tính to|n để chọn 1 điện áp tham chiếu phù hợp,

không được nhỏ hơn gi| trị lớn nhất của input nhưng cũng đừng quá lớn.

2. Chuyển đổi ADC trên AVR

Chip AVR ATmega16 của Atmel có tích hợp sẵn các bộ chuyển đổi ADC với độ phân giải

10bit. Có tất cả 8 kênh đơn ( c|c ch}n ADC0 đến ADC7 ). ADC trong AVR là laoij chuyển đổi

xấp xỉ lần lượt

ADC trên AVR cần được nuôi bằng nguồn điện áp riêng ở chân AVCC, giá trị điện áp cấp cho

AVCC không được khác nguồn nuôi chip (VCC) quá ±0,3V.Nhiễu ( noise ) là vấn đề rất quan

trọng khi sử dụng các bộ ADC, để giảm thiểu sai số chuyển đổi do nhiễu, nguồn cấp ADC cần

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

phải được lọc kỹ càng. Một c|ch đơn giản để tạo nguồn AVCC là dùng 1 mạch LC kết nối từ

nguồn VCC của chip.

Điện áp tham chiếu cho ADC trên AVR có thể được tạo bởi 3 nguồn: dùng điện áp tham

chiếu nội 2.56V ( cố định ), dùng điện áp AVCC hoặc điện |p ngo{i đặt trên ch}n VREF. Lưu

ý là cấn chú ý đến nhiễu khi đặt điện áp tham chiếu, nếu dùng điện |p ngo{i đặt trên chân

VREF thì điện áp này phải được lọc thật tốt, nếu dùng điện áp tham chiếu nội 2,56V hoặc

AVCC thì chân VREF cần được nối với 1 tụ điện.

- Thanh ghi:

Co2 4 thanh ghi trong bộ ADC trên AVR trong đó có 2 thanh ghi data chứ 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

+ 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 Seclection Bits ):là các bit chọn điện áp tham chiếu, 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 hoặc điện áp AVCC.

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

Bit 5-ADLAR ( ADC Left Adjust Result ): là bit cho phép hiệu chỉnh trái kết quả

chuyển đổi. 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ố nguyên có độ d{i 10bit. AVR có 2 thanh ghi 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 1

số trường hợp người dùng muốn 10bit kết quả nằm lệch về phía tría 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 10bit 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ả

Bit 4:0-MUX4:0 ( Analog Chanel and Gain Selection Bits ) : là 5 bit cho phép chọn

kênh, chế độ và cả hệ số khuế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 chọn chế độ chuyển đổi

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

+ ADCSRA ( ADC Control and Status RegisterA ): l{ thanh ghi chính điều khiển hoạt động

chứa trạng thái của modul ADC

Bit 7: ADEN ( ADC Enable ): viết giá trị 1 v{o bit n{y l{ đã cho phép modul ADC sử

dụng. Tuy nhiên khi ADEN=1 khhong có nghĩa l{ ADC hoạt động ngay mà cần phải

set bit ADSC lên 1 để bắt đầu quá trình chuyển đổi

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

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 ta

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 5: ADATE ( ADC Auto Trigger Enable )

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á 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 đ~ được thực sựu

hoàn tất.

Bit 3: ADIE ( ADC Interrupt Enable ) : bit cho phép ngắt, nếu bit n{y được set lên 1

và bit chp phép ngắt toàn cục trong thanh ghi trạng th|i 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: 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 modul khác trên AVR cần được giữ nhịp bằng 1 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

Bảng hệ số chia xung nhịp cho ADC

+ ADCL và ADCH ( ADC Data Register ): 2 thanh ghi chứa giá trị cảu quá trình chuyển đổi.

Do modul ADC trên AVR có độ phân giải 10bit nên cần 2 thanh ghi để chứa giá trị chuyển

đổi. tuy nhiên tổng số bit của 2 thanh ghi 8bit là 16, vì thế chúng ta được phép chọn cách ghi

10bit 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

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

Thông thường, 2 thanh ghi data được sắp xếp theo định dạng ADLAR=0, ADCL chứa 8 bit

thấp và 2 bit thấp của ADCH chứa 2 bit cao nhất của giá trị thu được. Để tránh sai kết quả,

cần phải đọc thnah ghi ADCL trước v{ ADCH sau, vì sau khi ADCH được đọc, các thanh ghi

data có thể được cập nhật giá trị tiếp theo.

+ SFIOR ( Special FunctionlO Register C ): 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

Nguồn kích ADC trong chế độ Auto Trigger

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

VIII. Giao tiếp SPI

1. Chuẩn truyền thông SPI

SPI ( Serial Peripheral Bus ) là 1 chuẩn truyền thông nối tiếp tốc độ cao do 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

truyền thông v{ c|c chip Slave được điều khiển bởi Master, vì thế truyền thông chỉ xảy ra

giữa Master và Slaver. SPI là 1 cách truyền thông song công ( full duplex ) nghĩa l{ tại cùng

1 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 Output Slave Input ) và SS ( Slave Select

).

- SCK: xung giữ nhịp cho giao tiếp SPI, SPI là chuẩn truyền động bộ nên cần 1 đường

xung 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ộ UART. Sự tồn tại của chân SCK giúp quá

trình truyền ít bị lỗi và vì thế tốc độ truyền của SPI có thể 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ì đ}y lại là Output. MISO của Master v{ Slave đượ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 chip Slave thì đ}y l{ Input. MOSI của Master v{ Slave được nối trực tiếp với nhau

- SS- Slave Select: SS l{ đường chọn Slave cần giao tiếp, trên c|c chip đường SS sẽ ở

mức cao khi không làm việc. Nếu chip Master kéo đường SS của 1 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ó 2 đườ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.

- Hoạt động: mỗi chip Master hay Slave chỉ có 1 thanh ghi dữ liệu 8 bit. 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 đượ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. Hình dưới mô tả quá trình truyền 1 gói dữ liệu thực hiện bởi modul SPI

trong AVR, bên trái là chip Master, bên phải là chip Slave

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

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ỉ, 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 ( sampel ) 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. 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à cho có sựu tương thích giữa Master

và Slave

2. Truyền thông SPI trên AVR

Các chân giao tiếp SPI cũng l{ c|c ch}n PORT thông thường, vì thế nếu muốn sử dụng

chúng ta cần xác lập c|c hướng cho các chân này. Các chân SPI trên chip ATmega16

SCK – PB7 (8)

MISO – PB6 (7)

MOSI – PB5 (6)

SS – PB4 (5)

Khi chip AVR được sử dụng làm Slave, ta cần set các chân SCK , MOSI, SS: Input, còn MISO:

output. Nếu là Master thì SCK, MISO: Output còn MOSI: input va fkhi này chân SS không

quan trọng, chúng ta có thể dùng ch}n n{y để điều khiển SS của Slave hoặc bất kỳ chân

PORT thông thường

- Thanh ghi: SPI trên AVR được vận hành bởi 3 thanh ghi bao gồm thanh ghi điều

khiển SPCR, thnah ghi trạng thái SPSR và thanh ghi dữ liệu SPDR

+ SPCR ( SPI Control Register ) : l{ 1 tahnh ghi 8 bit điều khiển các hoạt động của SPI

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

Bit 7 – SPIE ( SPI Interrupt Enable ): bit cho phép ngắt SPI. Nếu bit này set bằng 1

và bit I trong thnah ghi trạng th|i được set bằng 1, 1 ngắt sẽ xảy ra sau khi 1 gói dữu

liệu được truyền hoặc nhận. Chúng ta nên dùng ngắt khi truyền nhận dữ liệu với SPI

Bit 6 – SPE ( SPI Enable ): set bit n{y lên 1 để cho phép bộ SPI hoạt động. nếu

SPE=0 thì modul 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. Khi

giao tiếp giữa 2 AVR với nhau, thứ tự này không quan trọng nhưng phải đảm bảo các

bit DORD giống nhau trên cả Master và Slave

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 : là 2 bit xác lập cực của xung giữ nhịp và cạnh sample

dữ liệu đ~ khảo sát ở trên.Sự kết hợp 2 bit này tạo thành 4 chế độ hoạt động của SPI.

Việc chọn chế độ không quan trọng nhưng phải đảm bảo Master và Slave cùng chế

độ hoạt động.

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

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 1 hệ số chia. Bảng tóm tắt các tốc đọ mà SPI trong AVR có thể đạt

+ SPSR ( SPI status Register ): là 1 thanh ghi trạng thái của Modul SPI. Trong thanh ghi

này chỉ có 3 bit được sử dụng. bit 7 – SPIF là cờ báo SPI, khi 1 gói dữ liệu đ~ được truyền

hoặc nhận từ SPI, bit SPIF sẽ tự động được set lên 1. Bit 6 – WCOL là bit báo va chạm dữ liệu

(Write Colision ), bit n{y đưucọ AVR set lên 1 nếu chúng ta cố tình viết ra 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

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

+ 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 hoạt quá trình truyền thông SPI. Trên chip Slave, dữ liệu nhận đượ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

- Sử dụng SPI trên AVR: SPI trên AVR hoạt động không khác nguyên lý chung của

chuẩn SPI là mấy. Vận h{nh SPI trên AVR được thực hiện dựa trên việc ghi v{ đọc 3

c|c thanh ghi SPCR, SPSR v{ SPDR. 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

IX. Giao tiếp TWI – I2C

1. Giao diện TWI – I2C

- TWI ( Two – Wire Seril Intereafce ) là 1 modul truyền thông nối tiếp đồng bộ trên

các chip AVR dựa trên tiêu chuẩn truyền thông I2C. I2C ( Inter-Integarted Circuit ) là

1 chuẩn truyền thông do Philips Semiconductor sáng lập và xây dựng thành chuẩn

năm 1990. Để tìm hiểu về I2C có thể tham khảo trên web của NXP – http://nxp.com .

trong phạm vi bài viết này chỉ giới thiệu giao thức TWI được hỗ trợ trong các chip

của AVR. Về cơ bản, TWI trong AVR ho{n to{n thương thích I2C, do đó tìm hiểu TWI

của AVR ta có thể điều khiển bất kỳ 1 thiết bị nào theo chuẩn I2C ( chip nhớ, bộ

chuyển đổi ADC, DAC, đồng hồ thời gian thực,…)

- TWI là 1 truyền thông nối tiếp đa chip chủ ( multi-master serial computer bus), tức

là trên cùng 1 bus có thể có nhiều hơn 1 thiết bị l{m Master, đồng thời 1 Slave có thể

trở thành 1 Master nếu nó có khả năng. TWI được thực hiện trên 2 đường SDA (

Serial Data ) v{ SCL ( Serial Colck ) trong đó SDA l{ đường truyền/ nhận dữ liệu và

SCL l{ đường xung nhịp. Theo chuẩn I2C, c|c đường SDA và SCL trên các thiết bị có

cấu hình “ cực góp mở “, nghĩa l{ cần có c|c điện trở kéo lên ( pull-up resistor ) cho

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

c|c đường này. Ở trạng th|i nghĩ, 2 ch}n SDA v{ SCL ở mức cao. Hình dưới thể hiện

mô hình 1 mạng TWI cơ bản.

- 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ó 1 địa chỉ cố định, được gọi bởi Master và phục vụ yêu cầu từ

Master

- SDA : 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 1. Trong chuẩn I2C, bit có trọng số lớn

nhất MSB được truyền trước nhất, ngược lại với chuẩn UART

- SCL: l{ đường giữ nhịp nối tiếp. TWI 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/ nhận, cứ mỗi xung trên đường giữ nhịp

SCL, 1 bit dữ liệu trên đường SDA sẽ được lấy mẫu. dữ liệu nối tiếp trên đường SDA

được lấy mẫu khi đường SCL ở mức cao trong 1 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

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

- START Condition: điều kiện bắt đầu: từ trạng thái nghỉ, khi cả SDA và SCL ở mức

cao nếu Master muốn thực hiện một “cuộc gọi” , Master sẽ kéo chân SDA xuống thấp

trong khi SCL vẫn ở mức cao.

- STOP Codition: Điều kiện kết thúc : 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.STOP condition chỉ được tạo ra sau khi địa chỉ dữ liệu đ~ được truyền/ nhận

- REPEAT START: 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 là REPEAT START. Khả năng n{y thường được dùng khi

Master muốn lấy dữ liệu liên tiếp từ các Slave.

Hình dưới mô tả các Master tạo ra START, STOP và REPEAT START

- Address Packet Format – Định dạng gói dữ liệu : trên mạng TWI, tất cả các thiết

bị đề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 1 Master muốn giao tiếp với 1 Slave n{o đó, trước hết tạo ra 1 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 có định dạng 9bit trong đó 7bit đầu gọi làSLA chứa địa chỉ Slave, 1 bit

READ/WRITE và 1 bit ACK-Ackknowledge. Do địa chỉ có độ dài 7 bit nên về mặt lý

thuyết, trên 1 mạng TWI có thể tồn tại 27=128 thiết bị có địa chỉ riêng biệt. Tuy

nhiên, có 1 số địa chỉ không được sử dụng như c|c địa chỉ có dạng 1111xxx ( tức là

c|c địa chỉ lớn hơn hoặc bằng 120 không được dùng). Riêng địa chỉ 0 được dùng cho

“ cuộc gọi chung “. Bit READ/WRITE ( R/W ) được truyền tiếp sau 7bit địa chirlaf bit

báo cho Slave biết Master muốn đọc hay ghi vào Slave. Nếu bit này bằng 0 thì quá

trình ghi dữ liệu từ Master đến Slave được yêu cầu, nếu bit này bằng 1 thì Master

muốn đọc dữ liệu từ Slave về. 8bit trên ( SLA + R/W ) được Master phát ra sau khi

phát START Condition, nếu 1 Slave trên mạng nhận ra rằng địa chỉ mà Master yêu

cầu trùng khớp với Device address của mình, nó sẽ trả lại Master bằng cách phát ra 1

tín hiệu xác nhận ACK bằng cách kéo chân SDA xuống thấp trong xung thứ 9. Ngược

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

lại, nếu không có Salve đ|p ứng lại, chân SDA vẫn ở mức cao trong xung giữ nhịp thứ

9 gọi là tín hiệu không xác nhận - NOT ACK. Như vậy, trong 9 bit của gói địa chỉ thì

có 8bit được gởi bởi Master, bit còn lại là do Slave.

- General call – cuộc gọi chung: khi Master ph|t đi gói địa chỉ có dạng 0 tức nó

muốn thực hiện 1 cuộc gọi chung đến tất cả các Slave. Slave quyết định cho phép hay

không cho phếp cuộc gọi chung. Nếu c|c Slave được c{i đặt cho phép cuộc gọi chung,

chúng sẽ đ|p lại Master bằng ACK. Cuộc gọi chung thường xảy ra khi Master muốn

gởi dữ liệu chung đến các Slave. Cuộc gọi chung có dạng 0+R l{ vô nghĩa vì không thể

có chuyện Master nhận dữ liệu từ tất cả các Slave cùng thời điểm

- Data Packet Format - Định dạng gói dữ liệu: sau khi đia chỉ được ph|t đi, Slave đ~

đ|p lại Master bằng SCK thì quá trình truyền nhận/nhận dữ liệu sẽ diễn ra giữa cặp

Master/Slave n{y. Tùy v{o bit R/W trong gói địa chỉ, dữ liệu có thể được truyền theo

hướn từ Master đến Slave hay ngược lại. V{ theo hướng nào thì gói dữ liệu luôn bao

gồm 9bit trong đó 8 bit đầu là dữ liệu và bit cuối là bit ACK.8 bit dữ liệu do thiết bị

phát gởi ra và bit ACK do thiết bị nhận tạo ra. Nếu Slave phát tín hiệu NOT ACK (

không t|c động SDA ở xung thứ 9 ) sau khi nhận dữ liệu thì Master sẽ kết thúc quá

trình gởi bằng c|ch ph|t đi STOP condition. Hình dưới mô tả định dạng gói dữ liệu

trong TWI

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

- Phối hợp gói địa chỉ và dữ liệu : một quá trình truyền / nhận TWI thường được

bắt đầu từ Master. Master ph|t đi tín 1 START condition sau đó gởi gói địa chỉ

SLA+R/W trên đường truyền. Tiếp theo nếu có 1 Slave đ|p ứng lại, dữ liệu có thể

truyền/nhận liên tiếp đường truyền. Khung truyền thông thường được mô tả như

sau:

- Multi-Master Bus - Đường truyền đa chip chủ: TWI là chuẩn giao tiếp truyền

thông đa chip chủ, nghĩa l{ tịa 1 thời điểm có thể có nhiều hơn 1 chip l{m Master

nếu các chip này phát ra START condition cùng lúc. Nếu các Master có cùng yêu cầu

v{ thao t|c đối với Slave thì chúng có thể cùng tồn tại và quá trình truyền / nhận có

thể th{nh công.Tuy nhiên, trong đa số trường hợp sẽ có một số Master bị thất lạc. 1

Master bị thất lạc khi nó truyền/nhận 1 mức cao trên SDA trong khi các Master khác

truyền/nhận 1 mức thấp. truyền thông đa chip chủ tương đối phức tạp và vì thế ở

đ}y sẽ không đề cập đến trường hợp này

2. TWI trên AVR

TWI trên AVR được vận hành bởi 5 thanh ghi bao gồm thanh ghi tốc độ giữ nhịp TWBR,

thnah ghi ddieuf khiển TWCR, thanh ghi trạng th|i TWSR, thanh ghi địa chỉ dữ liệu TWDR

- 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

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

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 1 tóm tắt tốc độ xung giữ nhịp tạo ra trên SCL đối với các giá trị

của tham số

+ bảng tốc độ xung giữ nhịp :

- TWCR ( TWI Control Register ): l{ thanh ghi 8 bit điều khiển hoạt động của TWI

Bit 7- TWINT (TWI Interrupt Flag): là một cờ báo rất quan trọng. TWINT đượ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,

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

phát nhận địa chỉ…). Chú ý l{ bit n{y không tự động được xóa bởi phần cứng như c|c

cờ báo trong các module khác. Vì thế, khi lập trình điều khiển TWI chúng ta luôn

phải xóa TWINT trước khi muốn thực hiện một qu| trình n{o đó. Một điểm quan

trọng cần lưu ý l{ bit TWINT được xóa khi chúng ta viết giá trị 1 vào nó. Trong khi

lập trình cho TWI, chúng ta thường xóa TWINT bằng cách viết 1 v{o nó, sau đó liên

tục kiểm tra TWINT, nếu bit n{y được set lên 1 thì qu| trình đ~ ho{n th{nh.

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 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. Như thế, 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 để 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ảnh. Nếu

đường truyền không rảnh, TWI sẽ chờ cho đến khi nó rảnh (nhận ra 1 STOP

condition) và tiếp tục gởi START condition. Chú ý là bit nay cần được xóa bởi phần

mềm sau khi START condition đ~ được gởi (viết 0 v{o bit n{y để xóa nó).

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ảnh 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.

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

Trong các thanh ghi TWCR không cần được set cùng lúc, tùy vào từng giai đoạn trong quá

trình giao tiếp TWI các bit có thể được set riêng lẻ.

- 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.

Có rất nhiều bước, nhiều tình huống xảy ra khi giao tiếp bằng TWI cho cả Master và Slave. Ứng với mỗi trường hợp TWI sẽ tạo ra 1 code trong thanh ghi TWSR . Lập trình cho TWI cần xét code trong 5 bit cao của thanh ghi TWSR và đưa ra các ứng xử hợp lý ứng với từng code.

- 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.

- TWAR (TWI Address Register): là thanh ghi chứa device address của chip Slave. Cấu trúc thanh ghi được trình bày trong hình dưới.

Địa chỉ Slave được tạo thành từ 7 bits, trên thanh ghi TWAR 7 bits địa chỉ này nằm ở 7 vị trí cao. Trước khi sử dụng TWI như Slave, chúng ta phải gán địa chỉ cho chip, việc viết địa chỉ thường được thực hiện bằng lệnh TWAR = (Device_address<<1)+TWGCE. Trong đó TWGCE (TWI General Call Enable) là bit cho phép cuộc gọi chung. Slave có quyền cho phép Master thực hiện cuộc gọi chung với nó hay không. Nếu TWGCE=1, Slave sẽ đáp ứng lại cuộc gọi chung nếu có, nếu TWGCE=0 thì Slave sẽ bỏ qua cuộc gọi chung

3. Các chế độ hoạt động của TWI

TWI trên AVR được gọi là byte-oriented (hướng byte) và interrupt-based (dựa trên ngắt). Bất kỳ một sự kiện nào trong quá trình truyền/nhận TWI cũng có thể gây ra 1 ngắt TWI. TWI trên AVR vì thế hoạt động tương đối độc lập với chip. Tuy nhiên, cần khai thác ngắt trên AVR một cách hơp lý. Ví dụ, đối với Master, chúng ta không cần sử dụng ngắt vì chip này hoàn toàn chủ động trong việc truyền và nhận. Riêng với Slave, sử dụng ngắt để tránh bỏ lỡ các cuộc gọi là cần thiết. Tất cả các AVR trên mạng TWI đều có thể là Master hay Slave, cả Master và Slave đều có thể truyền và nhận dữ liệu. Vì thế, có tất cả 4 mode trong hoạt động của TWI trên AVR. Chúng ta sẽ lần lượt khảo sát các mode này như sau: Master Transmitter (chip chủ truyền), Master Receiver (Chip chủ nhận), Slave Reicever (chip tớ nhận) và Slave Transmitter (Chip tớ truyền).

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

Trước khi khảo sát các chế độ hoạt động của TWI chúng ta qui ước một số ký hiệu thường dùng (đây cũng là các ký hiệu dùng trong datasheet của các chip AVR).

S: START condition – điều kiện bắt đầu Rs: REPEAT START – bắt đầu lặp lại R: READ Bit, bit này bằng 1 được gởi kèm với gói địa chỉ W: WRITE Bit, bit này mang giá trị 0, gởi kèm gói địa chỉ ACK: Ackowledge, bit xác nhận, chân SDA được kéo xuống 0 ở xung thứ 9 NACK: Not Acknowledge, không xác nhận, SDA ở mức cao ở bit thứ 9 Data: 8 bits dữ liệu P: STOP condition – điều kiện kết thúc. SLA: Slave address, địa chỉ của Slave cần giao tiếp

- Master Transmitter mode – Master truyền dữ liệu:

Trong chế độ này, Master truyền 1 hoặc một số byte dữ liệu đến một hoặc các Slave. Để bắt đầu, Master tạo ra một START condition trên đường SDA, nếu đường truyền đang rảnh, Master sẽ tiếp tục phát đi địa chỉ của Slave cần giao tiếp cùng với bit W (ghi) theo định dạng như sau: SLA+W. Nếu Slave đáp lại bằng một ACK trong xung giữ nhịp thứ 9, Master sẽ tiếp tục gởi 1 hoặc liên tiếp các byte dữ liệu trên SDA. Cứ sau mỗi byte dữ liệu, Master sẽ kiểm tra ACK từ Slave. Nếu Slave gởi một NACK hoặc Master không muốn gởi thêm dữ liệu đến Slave nó sẽ phát đi một STOP condition hoặc một REPEAT START (Rs). Nếu STOP được phát, cuộc gọi kết thúc, nếu Rs được phát, một cuộc gọi mới bắt đầu, sau Rs là địa chỉ của Slave mới. Tất cả được TWI mã hóa thành các code chứa trong thanh ghi TWSR (chỉ 5 bit cao). Chúng ta chỉ thanh ghi này và đối chiếu với bảng code quy định sẵn để biết trạng thái đường truyền và đưa ra quyết định tiếp theo. Hình dưới mô tả một quá trình Master truyền dữ liệu, các khả năng có thể xảy ra và giá trị tương ứng của thanh ghi TWSR. Ý nghĩa các code trong thanh ghi TWSR trong lúc Master truyền dữ liệu có thể tham khảo thêm datasheet của chip.

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

Từ hình trên, chúng ta nhận thấy khi Master truyền dữ liệu, dãy code 0x08 -> 0x18 -> 0x28 ->… -> 0x28 (-> 0x30) là dãy code thành công nhất. Code 0x08 báo rằng START codition được truyền thành công, code 0x18 báo địa chỉ truyền thành công và đã có Slave xác nhận bằng ACK, code 0x28 tức dữ liệu được Master truyền thành công và Slave đã nhận được, báo ACK lại cho Master, code 0x30 tức dữ liệu đã được truyền nhưng Slave không xác nhận lại, lúc này Master có thể phát đi một STOP codition sau code 0x30. Ngoài ra còn một số code khác tương ứng với các trường hợp khác như gởi địa chỉ thất bại (code 0x20), Master bị lost (code 0x38)…Đối với mỗi loại ứng dụng, cách “hành xử” sẽ khác nhau đối với các trường hợp thất bại này. Trong bài này sẽ bỏ qua tất cả các trường hợp thất bại, nếu một trong các code thất bại xảy ra chúng ta sẽ thoát khỏi cuộc gọi và đưa đường truyền về trạng thái nghỉ.

- Master Receiver mode – Master nhận dữ liệu:

Trong chế độ này, Master nhận một hoặc một số byte dữ liệu từ một Slave. Để bắt đầu, Master tạo ra một START condition trên đường SDA, nếu đường truyền đang rảnh,

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

Master sẽ tiếp tục phát đi địa chỉ của Slave cần giao tiếp cùng với bit R (đọc) theo định dạng như sau: SLA+R. Nếu Slave đáp lại bằng một ACK trong xung giữ nhịp thứ 9, Master sẽ bắt đầu sample dữ liệu trên SDA. Cứ sau mỗi byte dữ liệu, nếu Master muốn nhận tiếp byte khác nó phải phát ra 1 ACK ở xung thứ 9 báo cho Slave. Khi Master muốn kết thúc quá trình nhận nó sẽ phát một NOT ACK sau khi nhận dữ liệu, liền sau đó Master phát STOP để kết thúc cuộc gọi hoặc phát đi một REPEAT START nếu nó muốn tiếp tục gọi các Slaves khác. Hình dưới mô tả một quá trình Master nhận dữ liệu, các khả năng có thể xảy ra và giá trị code tương ứng của thanh ghi TWSR. Ý nghĩa các code trong thanh ghi TWSR trong lúc Master truyền dữ liệu có thể tham khảo thêm datasheet của chip.

Từ hình trên, trong quá trình Master nhận dữ liệu, dãy code 0x08 -> 0x40 -> 0x50 ->… -> 0x58 là dãy code thành công nhất. Code 0x08 báo rằng START codition được truyền thành công, code 0x40 báo địa chỉ + R đã được truyền thành công và đã có Slave xác nhận bằng ACK, code 0x50 báo dữ liệu được Master nhận thành công và Master cũng đã phát một ACK bit sau khi nhận, code 0x58 xảy ra khi Master nhận dữ liệu thành công nhưng nó không phát ACK mà phát NOT ACK, báo cho Slave rằng Master không muốn nhận thêm dữ liệu, tiếp theo Master sẽ phát một STOP condition hoặc một REPEAT START. Các trường hợp khác chúng ta không khảo sát.

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

- Slave Receiver mode – Slave nhận dữ liệu:

Hình dưới mô tả một quá trình Slave nhận dữ liệu, các khả năng có thể xảy ra và giá trị code tương ứng của thanh ghi TWSR. Chế độ Slave nhận dữ liệu xảy ra khi Master thực hiện một cuộc gọi phát dữ liệu (SLA+W). Như quan sát trong hình 4, Slave chỉ nhận ra cuộc gọi này khi địa chỉ của nó trùng với địa chỉ của Master (Own address mode) hoặc khi Master thực hiện một cuộc gọi chung. Khi đó, bit TWINT của Slave sẽ được set lên 1. Nếu Slave cho phép ngắt TWI (bit TWIE trong thanh ghi TWCR được set từ lúc đầu) thì một ngắt xảy ra báo có một sự kiện TWI. Nếu code trong thanh ghi TWSR là 0x60 thì một cuộc gọi địa chỉ riêng được yêu cầu và Slave cũng đã đáp ứng lại Master bằng một ACK, Slave sau đó bắt đầu nhận dữ liệu từ đường SDA. Cứ sau một byte dữ liệu Slave phải xác nhận một ACK nếu nó còn muốn tiếp tục nhận. Nếu vì một lý do nào đó mà Slave không thể tiếp tục nhận nó có thể phát một NOT ACK sau một byte dữ liệu. Cuộc gọi kết thúc khi Slave nhận được STOP condition, tương ứng code 0xA0. Cuộc gọi chung cũng diễn ra hoàn toàn tương tự cuộc gọi địa chỉ riêng nhưng code có giá trị khác. Khi viết chương trình cho Slave trong chế độ nhận dữ liệu, chúng ta cần xét cả 2 trường hợp cuộc gọi địa chỉ riêng và cuộc gọi chung.

- Slave Transmitter mode – Slave truyền dữ liệu:

Đây là chế độ cuối cùng trong 4 chế độ của AVR TWI. Hình dưới mô tả một quá trình Slave truyền dữ liệu, các khả năng có thể xảy ra và giá trị code tương ứng của thanh ghi TWSR. Chế độ Slave phát dữ liệu xảy ra khi Master muốn nhận dữ liệu từ Slave, Master

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

thực hiện một cuộc gọi nhận dữ liệu (SLA+R). Như quan sát trong hình, Slave chỉ nhận ra cuộc gọi này khi địa chỉ của nó trùng với địa chỉ của Master (Own address mode). Khi đó, bit TWINT của Slave sẽ được set lên 1. Nếu Slave đáp lại bằng một ACK ở xung nhịp thứ 9, code trong thanh ghi TWSR sẽ là 0xA8, Slave sau đó bắt đầu phát dữ liệu lên đường SDA. Cứ sau mỗi byte dữ liệu, Master sẽ xác nhận một ACK nếu nó còn muốn tiếp tục nhận, code 0xB8 sẽ xuất hiện trong trường hợp này. Nếu Master không muốn tiếp tục nhận dữ liệu từ Slave, một NOT ACK sẽ được phát và code 0xC0 xuất hiện, Slave kết thúc quá trình phát dữ liệu. Một trường hợp đặc biệt khi bit TWEA (bit ACK) trong thanh ghi TWCR của Slave được reset về 0 trước khi Slave truyền dữ liệu, trường hợp Slave muốn báo rằng nó đã hết dữ liệu để truyền, byte tiếp theo cũng là byte cuối cùng. Sau khi Master nhận byte này, nó có thể xác nhận 1 ACK cho Slave (vì thật ra Master không hề biết Slave đang truyền byte cuối), code trên Slave trong trường hợp này là 0xC8 và Slave sẽ tự hết thúc quá trình truyền mà không cần chờ Master. Khi lập trình cho Slave trong chế độ phát, cần phải có sự “thỏa hiệp” với Master trước để tránh code 0xC8 vì code này không có nhiều ý nghĩa.

Kỹ thuật chính dùng cho Master khi truyền hay nhận cuộc gọi là hỏi vòng và chờ (polling and waiting). Ứng với mỗi code nhận về từ thanh ghi TWSR (hay ứng với mỗi trạng thái của cuộc gọi) mà Master set các bit tương ứng trong thanh ghi điều khiển TWCR và sau đó chờ bit TWINT được set (quá trình kết thúc) để tiếp tục đọc và xét code TWSR. Quá trình chờ và xét này lặp lại cho đến khi Master kết thúc cuộc gọi bằng STOP condition. Tuy nhiên Slave thì khác, Slave không chủ động thực hiện cuộc gọi mà nó phải chờ yêu cầu từ Master để phục vụ. Vì thế, nếu dùng “hỏi vòng” cho Slave thì sẽ tốn thời gian chờ vô ích và đôi khi còn bỏ lỡ các cuộc gọi. Đối với Slave, ngắt là phương pháp bắt cuộc gọi tối ưu nhất. Trong bài học này, việc truyền và nhận của Slave sẽ được thực hiện trong các trình phục vụ ngắt TWI.

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

Phần 2 . LẬP TRÌNH C CHO AVR

I. GIỚI THIỆU

1. Chip AVR ATmega16L

Sơ đồ chân

ATmega16L có đầy đủ tính năng của họ AVR

- 16K flash , 512 byte EEPROM, 1K SRAM

- Đóng vỏ 40 chân ( DIP ) và 44 chân ( TQFP )

- Có 32 I/O chia làm 4 port

- Giao tiếp SPI, I2C, …

- 8 kênh ADC 10 bit

- 1 bộ so sánh Analog – 4 kênh PWM

- 2 bộ timer/ counter 8 bit, 1 bộ timer/ counter 16 bit

- 1 bộ định thời Watchdog

- 1 bộ truyền nhận UART

2. Phần mềm lập trình Codevision

Đ}y l{ phần mềm được sử dụng rộng r~i được xây dựng trên ngôn ngữ lập trình C, được hỗ

trợ sẵn c|c thư viện từ cộng đồng,..

3. KIT thí nghiệm CREATIVE AVR BOARD

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

- Gồm c|c modul Led đơn, Led 7 đoạn,LED matrix, LCD, ma trận phím, loa BUZZER,

cảm biến nhiết độ LM35, biến trở RVAR, IrDA

- Hỗ trợ giao tiếp I2C, UART, MMC/SD

- Mạch được tích hợp sẵn mạch nạp nên thuận tiện cho việc sử dụng

- Nguồn cấp 5VDC từ cổng USB, hoặc 7-12VDC từ apdapter

II. ĐIỀU KHIỂN I/O VỚI LED ĐƠN

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

C|c led trêm board được nối }m chung nên để led s|ng ta đưa mức logic các chân IO của

AVR lên mức cao (5V), để led tắt ta đưa c|c ch}n IO của AVR xuống mức thấp

Thiết lập cổng v{o ra: khi xem xét đến cổng vào ra của AVR ta xét đến 3 thanh ghi bit DDxn,

PORTxn, PINxn

- DDxn để truy cập cho địa chỉ xuất nhập DDRx. DDxn trong thanh ghi DDRx dùng để

điều khiển hướng dữ liệu các chân của cổng này. Khi có giá trị logic “0” thì nó sẽ trở

thành lối v{o, còn ghi “1” thì nó l{ lối ra

- PORTxn để truy cập địa chỉ xuất nhập PORTx. Khi PORTx được ghi giá trị 1 khi các

chân có cấu tạo như cổng ra thì điện trở kéo là chủ động ( nối với cổng ). Ngắt điện

trở kéo ra, PORTx được ghi giá trị 0

- PINxn để truy cập tại địa chỉ xuất nhập PINx . PINx là các cổng chỉ để đọc, các cổng

này có thể đọc trạng thái logic cảu PORTx. PINx không phải là thanh ghi, việc đọc

PINx cho phép ta đọc giá trị logic trên các chân của PORTx

Các cổng của AVR đều có thể đọc, ghi. Để thiết lập 1 cổng l{ v{o, ra thì ta t|c động tới các bit

DDxn, PORTxn, PINxn. Ta có thể thiết lập để từng bit làm cổng vào, ra

VD:

Để thiết lập PORTA làm cổng ra thì ta có thể xuất dữ liệu ra từ PORTA: PORTA=0xAA (

10101010 )

Mở chương trình Codevision. Màn hình làm việc:

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

Để tạo Project mới : File -> New

Chọn project -> OK . Chọn Yes trong cửa sổ hiện ra để sử dụng CodeWinzardAVR

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

Chọn chip là ATmega16L, tân số thạch anh l{ 8 MHz. Để khởi tạo các cổng IO ta chọn thẻ

Port

Các chân IO của AVR mặc định là trạng thai IN, muốn chuyển th{nh OUT để đưa ra c|c mức

logic ta click chuột v{o c|c nút IN để chuyển thành OUT

Chọn File -> Generate, Save and Exit

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

Chọn nơi lưu v{ tên của 3 file .c, .prj, .cwp ta được cửa số làm việc:

Để led nhấp nháy chúng ta cần sử dụng h{m delay_ms(). Do đó ta thêm thư viện delay.h

bằng cách thêm dòng lệnh sau bên dưới dòng lệnh #include<mega16.h>:

#include<delay.h>

Để định nghĩa biến LED l{ PORTA ta khai b|o như sau:

#define LED PORTA

Trong hàm main có vòng while(1) – vòng lặp vô hạn, chúng ta soạn đoạn code v{o đó:

Để dịch chương trình ấn F9 hoặc chọn : Project -> Compile

Ta được cưa sổ thông báo sau

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

Nếu chương trình có lỗi phải quay lại chỉnh sửa code , ở đ}y b|o không có lỗi ta chọn OK

Để nạp chương trình lên KIT. Ta mở chương trinh AVR PROG lên ( kết nối với KIT trước khi

mở chương trình )

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

Tab Browse chọn đường dẫn đến file Hex được tạo ra trong project đ~ tạo ở codevision

Chọn chip ATmega16 ở thẻ Divice. Chọn Program để tiến hành nạp chương trình lên chip

( Xem thêm phần hướng dẫn sử dụng mạch nạp AVR USB 910 v{ chương trình nạp

AVRProg để hiểu rõ hơn )

III. ĐIỀU KHIỂN VÀO RA VỚI LED 7 ĐOẠN

1. Mô tả

Trên KIT có 6 LED 7 thanh Anode chung, 4 ch}n anode chung được nối với 4 transistor

khuếch dòng. Để có thể quét led ta sửu sụng 6 chân của PORT A, c|c ch}n điều khiển sáng

các thanh còn lại được nối song song nhau v{ đưa v{o PORTB của AVR. Từ bit 0 -> 6 tương

ứng với A-> G. bit 7 là dấu chấm ( chân dp)

Có 6 led nên ta có thể hiển thị đến h{ng trăm nghìn. Do đầu vào của ta là 1 số bất kỳ lên tới

h{ng trăn nghìn nên ta phải tách lấy từng số h{ng trăm nghìn, chục nghìn, nghìn, trăm, chục,

đơn vị rùi đưa v{o 6 biến rồi tùy vào 6 biến số đó m{ ta đưa ra từng led. Quét led ta l{m như

sau: đưa PORTA.0 xuống o để bật nguồn cho led h{ng đơn vị, đẩy trị số h{ng đơn vị ra

PORTB, trễ 1 khoảng thời gian -> đưa PORTA.0 lên 1 để tắt nguồn led đơn vị, đưa PORTA.1

xuống 0 để bật nguồn cho led hàng chục, đẩy giá trị hàng chục ra PORTB, trễ 1 khoảng thời

gian,… cứ l{m như vậy cho đến h{ng trăm nghìn. Như vậy, tại 1 thời điểm chỉ có 1 led sáng,

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

nhưng do tần số bật tắt led nhanh , mắt người lưu ảnh nên vẫn thấy led s|ng như lúc n{o

cũng bật nguồn cho led

2. Thực hành

C|c bước khởi tạo như phần II. Chúng ta soạn code gồm 2 hàm như sau v{ đặt ngay phía

trên hàm main:

void daydulieu(unsigned char x)

{

switch(x)// tuy vao bien dau vao ma dua ra du lieu tu 0-9

{ //logic 1 tat led, 0 bat led

case 0: {PORTB=0xC0;break;} //so 0

case 1: {PORTB=0xF9;break;} //so 1

case 2: {PORTB=0xA4;break;} //so 2

case 3: {PORTB=0xB0;break;} //so 3

case 4: {PORTB=0x99;break;} //so 4

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

case 5: {PORTB=0x92;break;} //so 5

case 6: {PORTB=0x82;break;} //so 6

case 7: {PORTB=0xF8;break;} //so 7

case 8: {PORTB=0x80;break;} //so 8

case 9: {PORTB=0x90;break;} //so 9

}

}

void hienthi(int n)

{

int a,b,c,d,e,f;

//Lay cac so cac hang

a=n/100000; // lay hang tram nghin

b=(n-a*100000)/10000; //lay hang chuc nghin

c=(n-a*100000-b*10000)/1000; //lay hang nghin

d=(n-a*100000-b*10000-c*1000)/100; //lay hang tram

e=(n-a*100000-b*10000-c*1000-d*100)/10; //lay hang chuc

f=(n-a*100000-b*10000-c*1000-d*100-e*10); //lay hang don vi

//Quet led

PORTA=0xFE; //led dau tien

daydulieu(f); //day ra hang don vi

delay_ms(10);

PORTB=0xFF; //tat toan bo led

PORTA=0xFD; //led thu 2

daydulieu(e); //day ra hang chuc

delay_ms(10);

Nguyễn Ngọc Hà . ĐT : 0982969872. Mail : [email protected]

PORTB=0xFF; //tat toan bo led

PORTA=0xFB; //led thu 3

daydulieu(d); //day ra hang tram

delay_ms(10);

PORTB=0xFF;

PORTA=0xF7;

daydulieu(c);

delay_ms(10);

PORTB=0xFF;

PORTA=0XEF;

daydulieu(b);

PORTB=0xFF;

PORTA=0xDF;

daydulieu(a);

delay_ms(10);

PORTB=0xFF;

}

Trong vòng while(1) ta chỉ dùng 1 câu lệnh để hiển thị như sau:

to be continued …