Tải bản đầy đủ (.doc) (94 trang)

Đồ án Thiết kế bộ chuông báo giờ học dùng vi điều khiển

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

LỜI NÓI ĐẦU
Ngày nay với sự phát triển của khoa học kỹ thuật và công nghệ trên thế giới ở
nhiều lĩnh vực khác nhau đang diễn ra. Đặc biệt là sự phát triển như vũ bão của khoa
học máy tính là công cụ hỗ trợ đắc lực và quan trọng trong các ngành công nghệ
thông tin và tự động hóa. Nó giúp con người lưu trữ xử lý thông tin, tính toán, điều
khiển và đo lường. Hơn nữa cùng với sự phát triển mạnh mẽ của vi điều khiển, việc
kết hợp giữa máy tính và Vi điều khiển đã có nhiều nhiều ứng dụng to lớn trong thực
tế.
Đề tài: “Thiết kế bộ chuông báo giờ học dùng vi điều khiển” do cô giáo
Phạm Thanh Loan đưa ra nhằm giúp cho việc nghiên cứu và phát triển các ứng
dụng của Vi điều khiển và Máy tính trong đo lường và điều khiển thuận lợi hơn.
Công việc chính phải thực hiện trong đề tài này là xây dựng bộ hiển thị thời
gian thực trên LCD. Lập trình điều khiển rơle đóng ngắt chuông điện theo giờ đã
được cài đặt sẵn. Đề tài bao gồm những nội dung sau:
Chương I. Giới Thiệu Chung Về Họ Vi điều khiển AVR.
Chương II. Giới Thiệu Về VĐK AVR ATMEGA16.
Chương III: Giới Thiệu IC thời gian thực DS1307.
Chương IV: Thiết Kế Mạch Chuông Báo Giờ Học.
Trong quá trình thực hiện đề tài, mặc dù có sự cố gắng, nhưng em cũng không
tránh khỏi những thiếu sót. Em rất mong nhận được những ý kiến đóng góp từ quý
Thầy Cô và các bạn sinh viên.
Hà nội, ngày 08/ 02/ 2010
Trần Văn Lực: Lớp LTTĐH - K1 Page 1
MỤC LỤC
LỜI NÓI ĐẦU 1
MỤC LỤC 2
NHẬN XÉT CỦA GIÁO VIÊN 3
1/ Tổng quan về họ vi điều khiển AVR 5
1.1/ Giới thiệu 5
1.2/ Phân loại AVR 5
2./ Tổ chức của AVR. 5


3/ Cấu trúc tổng quát bên trong của AVR 9
3.1/ Stack Pointer (Con trỏ- Ngăn xếp) 11
3.2/ Thanh ghi trạng thái - SREG (STATUS REGISTRY) 12
3.3/ Quản lý ngắt 13
3.4/ Macro và chương trình con 19
3.5/ Giao Tiếp Truyền Thông Nối Tiếp TWI – I2C 20
Chương 2: 25
2/ Các đặc tính của của ATMEGA16 26
Chương 3: 42
1/ Giới thiệu chung về DS1307 42
2/ Chế độ hoạt động và chức năng của DS1307 43
Chương 4: 50
THIẾT KẾ MẠCH CHUÔNG BAO GIỜ HỌC 50
1/ Sơ Đồ Nguyên Lý 50
2/ Nguyên lý hoạt động của mạch 54
3/ Thiết bị phần cứng 56
4/ Phần mềm thiết kế và lập trình 59
4.1/ Phần mềm thiết kế phần cứng 59
4.2/ Mạch nạp cho AVR. 60
4.3/ Phần mềm mô phỏng 62
Hình 4.5 sơ đồ mạch mô phỏng 63
Trần Văn Lực: Lớp LTTĐH - K1 Page 2
4.4/ Phần mềm lập trình CodeVisonAVR 63
5/ Lưu đồ thuật toán và chương trình 65
6/ Kết quả mô phỏng 89
7/ Kết luận 92
TÀI LIỆU THAM KHẢO 93
NHẬN XÉT CỦA GIÁO VIÊN




Trần Văn Lực: Lớp LTTĐH - K1 Page 3





















Chương 1:
GIỚI THIỆU TỔNG QUAN VỀ HỌ VĐK AVR
Trần Văn Lực: Lớp LTTĐH - K1 Page 4
1/ Tổng quan về họ vi điều khiển AVR.
1.1/ Giới thiệu.
Vi điều khiển AVR (Atmel Norway design) thuộc họ vi điều khiển Atmel, nó
là họ vi điều khiển mới trên thị trường cũng như đối với người sử dụng. Đây là họ vi

điều khiển được chế tạo theo cấu trúc RISC (Reduced Intruction Set Computer) có
cấu trúc khá phức tạp. Ngoài các tính năng như các họ vi điều khiển khác, nó còn tích
hợp nhiều tính năng mới rất thuận tiện cho người thiết kế và lập trình. Sự ra đời của
AVR bắt nguồn từ yêu cầu thực tế là hầu hết khi cần lập trình cho vi điều khiển,
chúng ta thường dùng những ngôn ngữ bậc cao HLL (Hight Level Language) ngay cả
với loại chíp xử lý 8 bit trong đó ngôn ngữ C là phổ biến nhất. Tuy nhiên khi biên
dịch thì kích thước đoạn mã sẽ tăng nhiều so với dùng ngôn ngữ Assembly. Từ những
yêu cầu đó hãng Atmel đã phát triển một cấu trúc đặc biệt cho ngôn ngữ C để giảm
thiểu sự chênh lệch kích thước mã nói trên. Kết quả là họ vi điều khiển AVR ra đời
với việc làm giảm kích thước đoạn mã khi biên dịch và thêm vào đó là thực hiện lệnh
đúng chu kỳ máy với 32 thanh ghi tích luỹ và đạt tốc độ nhanh hơn các họ vi điều
khiển khác từ 4 đến 12 lần. Vì thế nguyên cứu về AVR là một đề tài mới mẻ và lý thú
giúp cho sinh viên biết thêm về một họ vi điều khiển mới hiện nay.
1.2/ Phân loại AVR.
+ AT90S8535: không có lệnh nhân và chia trên thanh ghi.
+ ATMEGA 8, 16, 32 (AVR loại 8 bit, 16 bit, 32 bit) là loại AVR tốc độ cao,
tích hợp sẵn ADC 10 bit.
+ AVR tích hợp sẵn LCD driver: Atmega 169, 329.
+ AVR có tích hợp SC (Power stage controller): AT90PWM thường dùng
trong các ứng dụng điều khiển động cơ hay chiếu sáng nên gọi là lighting AVR.
+ Attiny 11, 12, 15: AVR loại nhỏ.
2./ Tổ chức của AVR.
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ị
Trần Văn Lực: Lớp LTTĐH - K1 Page 5
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. Hình 1 mô tả cấu trúc bộ nhớ của AVR.
Bộ nhớ chương trình (Program memory): Là bộ nhớ Flash lập trình được,
trong các chip AVR mới chúng ta có thêm phần Boot Flash setion. Khi nói về bộ nhớ

chương trình, chúng ta tự hiểu là Application section.Thực chất, 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.
Chức năng chính của bộ nhớ chương trình là chứa instruction.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 chíp.
Hình 1.1 Tổ chức bộ nhớ của AVR.
Bộ nhớ dữ liệu (data memory): Đâ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. Bộ nhớ dữ liệu
trên các chip AVR có độ lớn khác nhau tùy theo mỗi chip, tuy nhiên về cơ bản phần
bộ nhớ này được chia thành 5 phần:
Trần Văn Lực: Lớp LTTĐH - K1 Page 6
Phần 1: Là phần đầu tiên trong bộ nhớ dữ liệu, như mô tả trong hình 1, phần
này bao gồm 32 thanh ghi có tên gọi là register file (RF), hay General Purpose
Rgegister – GPR, hoặc đơn giản là các Thanh ghi. Tất cả các thanh ghi này đều là các
thanh ghi 8 bits như trong hình 2.
Hình 1.2 Thanh ghi 8 bits.
Thanh ghi chức năng chung.
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. Các thanh ghi này có các đặc điểm sau:
• Đượ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 – CPU của chip.

• Chúng là nguồn chứa các số hạng trong các phép toán và cũng là đích chứa 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. Hình 3 mô tả các chức năng phụ của các thanh
ghi.
Trần Văn Lực: Lớp LTTĐH - K1 Page 7
Hình 1.3 Register file.
Tóm lại 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 ngay sau register file, phần này bao gồm 64 thanh ghi
được gọi là 64 thanh ghi nhập/xuất (64 I/O register) hay còn gọi là vùng nhớ I/O (I/O
Memory). Vùng nhớ I/O là cửa ngõ giao tiếp giữa CPU và thiết bị ngoại vi. Tất cả
các thanh ghi điều khiển, trạng thái…của thiết bị ngoại vi đều nằm ở đây. 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.
Trần Văn Lực: Lớp LTTĐH - K1 Page 8
Xét ví dụ instruction OUT dùng xuất giá trị ra các thanh ghi I/O, lệnh này sử
dụng địa chỉ kiểu thanh ghi, cấu trúc của lệnh như sau: OUT A, Rr, trong đó A là địa
chỉ của thanh ghi trong vùng nhớ I/O, Rr là thanh ghi RF, lệnh OUT xuất giá trị từ
thanh ghi Rr ra thanh ghi I/O có địa chỉ là A. Giả sử chúng ta muốn xuất giá trị chứa
trong R6 ra thanh ghi điều khiển hướng của PORTD, tức thanh ghi DDRD, địa chỉ

tính theo vùng I/O của thanh ghi DDRD là 0x0011, như thế câu lệnh của chúng ta sẽ
có dạng: OUT 0x0011, R6. Tuy nhiên trong 1 trường hợp khác, nếu muốn truy xuất
DDRD theo dạng SRAM, ví dụ lệnh STS hay LDS, thì phải dùng địa chỉ tuyệt đối
của thanh ghi này, tức giá trị 0x0031, khi đó lệnh OUT ở trên được viết lại là STS
0x0031, R6.
Chúng ta dùng khái niệm “địa chỉ I/O” cho các thanh ghi trong vùng nhớ I/O
để nói đến địa chỉ không tính phần Register File, khái niệm “địa chỉ bộ nhớ” của
thanh ghi là chỉ địa chỉ tuyệt đối của chúng trong SRAM. Ví dụ thanh ghi DDRD có
“địa chỉ I/O” là 0x0011 và “địa chỉ bộ nhớ” của nó là 0x0031, “địa chỉ bộ nhớ” =
“địa chỉ I/O” + 0x0020.
Phần 3: RAM tĩnh, nội (internal SRAM), 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 (external SRAM), các chip AVR cho phép người sử dụng
gắn thêm các bộ nhớ ngoài để chứa biến, vùng này thực chất chỉ tồn tại khi nào người
sử dụng gắn thêm bộ nhớ ngoài vào chip.
Phần 5: EEPROM (Electrically Ereasable Programmable ROM) là một phần
quan trọng của các chip AVR mới, vì là ROM nên bộ nhớ này không bị xóa ngay cả
khi không cung cấp nguồn nuôi cho chip, rất thích hợp cho các ứng dụng lưu trữ dữ
liệu. Như trong hình 1, phần bộ nhớ EEPROM được tách riêng và có địa chỉ tính từ
0x0000.
3/ Cấu trúc tổng quát bên trong của AVR.
Hình 4 biểu diễn cấu trong bên trong của 1 AVR. Bạn thấy rằng 32 thanh ghi
trong Register File được kết nối trực tiếp với Arithmetic Logic Unit -ALU (ALU
Trần Văn Lực: Lớp LTTĐH - K1 Page 9
cũng được xem là CPU của AVR) 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.
Hình 1.4 Cấu trúc bên trong AVR.
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.
Trần Văn Lực: Lớp LTTĐH - K1 Page 10
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.
3.1/ Stack Pointer (Con trỏ- Ngăn xếp).
Stack được sử dụng để chứa dữ liệu tạm thời cho việc lưu trữ các biến địa
phương và cho việc lưu trữ địa chỉ trở về sau khi gọi các chương trình và các ngắt.
Đây 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. Có địa chỉ trong các thanh ghi chức năng đặc biệt là $3E (Trong
bộ nhớ RAM là $5E). Có nhiệm vụ trỏ tới vùng nhớ trong RAM chứa ngăn xếp.
Hình 1.5 Thanh ghi con trỏ ngăn xếp
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 (Last In First Out – vào sau ra trước). Hình 6 thể hiện cách truy cập dữ liệu của
stack.
Trần Văn Lực: Lớp LTTĐH - K1 Page 11
Hình1.6 Stack Pointer.
Khái niệm và cách thức hoạt động của stack có thể được áp dụng cho AVR,
bằng cách khai báo một vùng nhớ trong SRAM là stack ta có thể sử dụng vùng nhớ
này như một stack thực thụ.
Để khai báo một vùng SRAM làm stack chúng ta cần xác lập địa chỉ đầu của
stack bằng cách xác lập con trỏ stack-SP (Stack Pointer). SP là 1 con trỏ 16 bit bao
gồm 2 thanh ghi 8 bit SPL và SPH (SPL chỉ thanh ghi mang giá trị byte thấp của SP,
SPH byte cao), SPL và SPH nằm trong vùng nhớ I/O. Giá trị gán cho thanh ghi SP sẽ

là địa chỉ khởi động của stack.
3.2/ Thanh ghi trạng thái - SREG (STATUS REGISTRY).
Nằm trong vùng nhớ I/O, thanh ghi SREG có địa chỉ I/O là 0x003F và địa chỉ
bộ nhớ là 0x005F (thường đây là vị trí cuối cùng của vùng nhớ I/O) là một trong số
các thanh ghi quan trọng nhất của AVR. Đây là thanh ghi trạng thái có 8 bit lưu trữ
trạng thái của ALU sau các phép tính số học và logic.
Thanh ghi SREG chứa 8 bit cờ (flag) chỉ trạng thái của bộ xử lí, tất cả các bit
này đều bị xóa sau khi reset, các bit này cũng có thể được đọc và ghi bởi chương
trình. Chức năng của từng bit được mô tả như sau:
Trần Văn Lực: Lớp LTTĐH - K1 Page 12
Hình 1.7 Thanh ghi trạng thái.
• Bit 0 – C (Carry Flag: Cờ nhớ): là bit nhớ trong các phép đại số hoặc logic
(Nếu phép toán có nhớ cờ sẽ được thiết lập).
• 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ờ này đượ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): cờ này sẽ
được thiết lập khi tràn số bù 2.
• Bit 4 – S (Sign Bit: Bit dấu): Bit S là kết quả phép XOR giữa 1 cờ N và V,
S=N xor 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, cờ này hiệu quả đối với các phép toán với số BCD.
• Bit 6 – T (Bit Copy Storage): được sử dụng trong 2 Instruction BLD (Bit
LoaD) và BST (Bit STorage). Làm nơi trung gian trong các lệnh về BLD và BST.
• Bit 7 – I (Global Interrupt Enable): Cho phép ngắt toàn bộ): Bit này phải được
set lên 1 nếu trong chương trình có sử dụng ngắt. Sau khi set bit này, bạn muốn kích
hoạt loại ngắt nào cần set các bit ngắt riêng của ngắt đó. Hai instruction dùng riêng để
Set và Clear bit I là SEI và CLI. (nếu bít này ở mức 0 thì không có ngắt nào được
phục vụ).

Chú ý: tất cả các bit trong thanh ghi SREG đều có thể được xóa thông qua các
instruction không toán hạng CLx và set bởi SEx, trong đó x là tên của Bit.
3.3/ Quản lý ngắt.
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 nhiệm vụ khẩn cấp nào đó, nhiệm vụ này gọi là trình phục vụ ngắt
Trần Văn Lực: Lớp LTTĐH - K1 Page 13
– isr (interrupt service routine). Sau khi kết thúc nhiệm vụ trong irs, 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ở. 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 xàng cho đổi dữ liệu của mình.
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ỏ 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 .Trong khi đang thực hiện ngắt mà xuất hiện ngắt mới thì sẽ xảy ra
hai trường hợp. Trường hớp ngắt này có mức ưu tiên cao hơn thì nó sẽ được phục vụ.
Còn nó mà có mức ưu tiên thấp hơn thì nó sẽ bị bỏ qua.
Hình 8 minh họa cách tổ chức ngắt thông thường trong các chip AVR. Số
lượng ngắt trên mỗi dòng chip là khác nhau, ứng với mỗi ngắt sẽ có vector ngắt,
vector ngắt là các thanh ghi có địa chỉ cố định được định nghĩa trước nằm trong phần
đầu của bộ nhớ chương trình. Ví dụ vector ngắt ngoài 0 (external interrupt 0) của chip
atmega AVR có địa chỉ là 0x00 (theo datasheet từ Atmel). Trong lúc chương trình
chính đang thực thi, nếu có một sự thay đổi dẫn đến ngắt xảy ra ở chân INT0 (chân
4), bộ đếm chương trình (Program Counter) nhảy đến địa chỉ 0x009, giả sử ngay tại
địa chỉ 0x001 chúng ta có đặt 1 lệnh RJMP đến một trình phục vụ ngắt (IRS1 chẳng
hạn), một lần nữa bộ đếm chương trình nhảy đến IRS1 để thực thi trình phục vụ ngắt,
kết thúc ISR1, bộ đếm chương trình lại quay về vị trí trước đó trong chương trình

chính, quá trình ngắt kết thúc. Không mang tính bắt buộc nhưng tôi khuyên bạn nên
tổ chức chương trình ngắt theo cách này để tránh những lỗi liên quan đến địa chỉ
chương trình.
Trần Văn Lực: Lớp LTTĐH - K1 Page 14
Hình 1.8 Ngắt.
Bảng 1 Các Vector Ngắt và Reset.
Trần Văn Lực: Lớp LTTĐH - K1 Page 15
3.3.1/ Ngắt ngoài (External Interrupt).
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.
Trên chip AVR có 2 ngắt ngoài có tên là INT0 và INT1 tương ứng với chân (PD2) và
(PD3). Khi làm việc với các thiết bị ngoại vi của AVR, hầu như chúng ta chỉ thao tác
trên các thanh ghi chức năng đặc biệt - SFR (Special Function Registers) trên vùng
nhớ IO, mỗi thiết bị bao gồm một tập hợp các thanh ghi điều khiển, trạng thái, ngắt
khác nhau, điều này đồng nghĩa chúng ta phải nhớ tất cả các thanh ghi của AVR. Có
Trần Văn Lực: Lớp LTTĐH - K1 Page 16
3 thanh ghi liên quan đến ngắt ngoài đó là MCUCR, GICR và GIFR. Cụ thể các
thanh ghi được trình bày bên dưới.
Thanh ghi điều khiển MCU – MCUCR (MCU Control Register) là thanh ghi
xác lập chế độ ngắt cho ngắt ngoài.
Hình 1.9 Kết nối ngắt ngoài
Giả sử chúng ta kết nối các ngắt ngoài trên AVR như hình 9, các button dùng
tạo ra các ngắt. Có 4 khả năng (tạm gọi là các MODES) có thể xảy ra khi chúng ta
nhấn và thả các button. Nếu không nhấn, trạng thái các chân INT là HIGH do điện trở
kéo lên, khi vừa nhấn 1 button, sẽ có chuyển trạng thái từ HIGH sang LOW, chúng ta
gọi là cạnh xuống -Falling Edge, khi button được nhấn và giữ, trạng thái các chân
INT được xác định là LOW và cuối cùng khi thả các button, trạng thái chuyển từ
LOW sang HIGH, gọi là cạnh lên – Rising Edge. Trong những trường hợp cụ thể, 1
trong 4 MODES trên đều hữu ích, ví dụ trong các ứng dụng đếm xung (đếm encoder
của servo motor chẳng hạn) thì 2 MODE “cạnh” phải được dùng. 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. Dưới

đây là cấu trúc thanh ghi MCUCR.
Hình 1.10 Cấu trúc thanh ghi MCUCR
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:
Trần Văn Lực: Lớp LTTĐH - K1 Page 17
ISC10 dùng cho INT1 và 2 bit ISC01: ISC00 dùng cho INT0. Chức năng của các bit
xem bảng 2, đây là bảng “chân trị” của 2 bit ISC11, ISC10. Bảng chân trị cho các bit
ISC01, ISC00 hoàn toàn tương tự.
Bảng 2: INT1 Sense Control
Thanh ghi điều khiển ngắt chung – GICR (General Interrupt Control Register)
(chú ý trên các chip AVR cũ, như các chip AT90Sxxxx, thanh ghi này có tên là thanh
ghi mặt nạ ngắt thông thường GIMSK, tham khảo thêm datasheet của các chip này).
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, cấu trúc thanh ghi như bên dưới.
Hình 1.11 Thanh ghi GICR
Bit 7 – INT1 gọi là bit cho phép ngắt 1(Interrupt Enable), set bit này bằng 1
nghĩa là 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. Cấu
trúc thanh ghi GIFR được trình bày trong hình 12.
Trần Văn Lực: Lớp LTTĐH - K1 Page 18
Hình 1.12 Thanh ghi GIFR
Sau khi đã xác lập các bit sẵn sàng cho các ngắt ngoài, cuối cùng ta cần set 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 (thanh ghi
SREG). Một chú ý khác là vì các chân PD2, PD3 là các chân ngắt nên bạn phải set

các chân này là Input (set thanh ghi DDRD). Quá trình thiết lập ngắt ngoài được trình
bày trong hình 13.
Hình 1.13 Thiết lập ngắt ngoài.
Ngắt ngoài với C: Avr-libc hỗ trợ một thư viện hàm cho ngắt khá hoàn hảo, để
sử dụng ngắt trong chương trình viết bằng C (avr-gcc) ta cần khai báo thư viện
include file “interrupt.h” nằm trong thư mục con “avr”. File header 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.
3.4/ 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 đó mà 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 đó. Lập trình ASM cho AVR cho phép sử
dụng Macro.
Chương trình con cũng là 1 đoạn code thực hiện 1 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 nhảy
đến chương trình con đề thực thi chương trình con và sau đó quay về chương trình
Trần Văn Lực: Lớp LTTĐH - K1 Page 19
Set mode với
MCUCR
Enable Interupt
Với GICR
Enable bit I
Trong SREG
chính. Như thế chương trình con chỉ được biên dịch 1 lần và có thể sử dụng nhiều lần,
nó làm giảm dung lượng chương trình. Đây là ưu điểm và cũng là điểm khác biệt lớn
nhất giữa chương trình con và Macro. Tuy nhiên cần chú ý là 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, đây là nhược điểm của chương trình con so với macro.
Chương trình con cho AVR luôn được bắt đầu bằng 1 nhãn (Label), đó cũng là
tên và địa chỉ của chương trình con. Chương trình con thường được kết thúc với câu
lệnh RET (Return).

Để gọi chương trình con từ 1 vị trí nào đó trong chương trình, chúng ta có thể
dùng lệnh CALL hoặc RCALL (Relative CALL). Mỗi khi các lệnh này được gọi, bộ
đếm chương trình được tự động được PUSH vào stack và khi chương trình con kết
thúc bằng lệnh RET, bộ đếm chương trình được POP trở ra và quay về chương trình
chính. Lệnh CALL có thể gọi 1 chương trình con ở bất kỳ vị trí nào trong khi RCALL
chỉ gọi trong khoảng bộ nhớ 4KB, nhưng RCALL cần ít chu kỳ xung clock hơn khi
thực thi.
Hai instruction khác có thể được dùng để gọi chương trình con đó là JMP
(Jump) và RJMP (Relative Jump). Khác với các lệnh call, các lệnh jump không cho
phép quay lại vì không tự động PUSH bộ đếm chương trình vào Stack, để sử dụng
các lệnh này gọi chương trình con ta cần một số lệnh jump khác ở cuối chương trình
con.
3.5/ Giao Tiếp Truyền Thông Nối Tiếp
TWI – I2C.
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. Tìm hiểu TWI của AVR không chỉ giúp
ta giao tiếp giữa các AVR với nhau mà có thể dùng TWI để điều khiển bất kỳ một
thiết bị nào theo chuẩn I2C (các chip nhớ, bộ chuyển đổi ADC, DCA, đồng hồ thời
gian thực…).
TWI (I2C) là một truyền thông nối tiếp đa chip chủ (multi-master serial
computer bus). Được hiểu là trong trên cùng một bus có thể có nhiều hơn một thiết bị
Trần Văn Lực: Lớp LTTĐH - K1 Page 20
làm Master, đồng thời một Slave có thể trở thành một Master nếu nó có khả năng.
TWI (I2C) được thực hiện trên 2 đường SDA (Serial DATA) và SCL (Serial Clock)
trong đó SDA là đường truyền/nhận dữ liệu và SCL là đường xung nhịp. Căn cứ 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ở” (open-
drain hoặc open-collector), nghĩa là cần có các “điện trở kéo lên” (pull-up resistor)
cho các đường này. Ở trạng thái nghỉ (Idle), 2 chân SDA và SCL ở mức cao. Hình 14

mô tả một mô hình mạng TWI (I2C) cơ bản.
Hình 1.14 Mạng TWI (I2C) với nhiều thiết bị và 2 điện trở kéo lên cho SDA, SCL
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. Chú ý là trong
chuẩn I2C, 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 UART.
SCL – Serial Clock: Là đường giữ nhịp nối tiếp. TWI (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
Trần Văn Lực: Lớp LTTĐH - K1 Page 21
ở 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.
Hình 1.15 Điều kiện khởi động và điều kiện dừng
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 cao. Trạng thái này gọi là START Condition (gọi tắt là
S).
STOP Condition - Đ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ỉ hoặc dữ liệu đã được
truyền/nhận.
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. 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 Slaves.
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
Trần Văn Lực: Lớp LTTĐH - K1 Page 22
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. Tuy nhiên, có một số địa chỉ không được sử dụng như các địa chỉ có định dạng
1111xxx (tức 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” (General call). Bit READ/WRITE (R/W) được
truyền tiếp sau 7 bit địa chỉ là bit báo cho Slave biết Master muốn “đọc” hay “ghi”
vào Slave. Nếu bit này bằng 0 (gọi là W) 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 (gọi là R) thì Master muốn “đọc” dữ liệu từ
Slave về. Tám bits trên (SLA+R/W) được Master phát ra sau khi phát START
condition, nếu một 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 chính mình, nó sẽ “đáp 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 lại, nếu không có Slave đáp ứng lại, chân SDA vẫn ở mức cao trong xung giữ
nhịp thứ 9 thì gọi là tín hiệu “không xác nhận” – NOT ACK, lúc này Master cần có
những ứng xử phù hợp tùy theo mỗi trường hợp cụ thể, ví dụ Master có thể gởi STOP
condition và sau đó phát lại địa chỉ Slave khác…Như vậy, trong 9 bit của gói địa chỉ
thì chỉ có 8 bit được gởi bởi Master, bit còn lại là do Slave. Ví dụ Master muốn yêu
cầu “đọc” dữ liệu từ Slave có địa chỉ 43, nó cần phát đi một byte như sau trên đường
truyền: (43<<1)+1, trong đó (43<<1) là dịch số 43 về bên trái 1 vị trí vì 7 bit địa chỉ

nằm ở các vị trí cao trong gói địa chỉ, sau đó cộng giá trị này với “1” tức là quá trình
“đọc” được yêu cầu.
General call – Cuộc gọi chung: Khi Master phát đi gói địa chỉ có dạng 0 (thực
chất là 0+W) tức nó muốn thực hiện một cuộc gọi chung đến tất cả các Slave. Tất
nhiên, cho phép hay không cho phép cuộc gọi chung là do Slave quyết định. 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 Slaves.
Nếu 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 địa chỉ đã được phát đi,
Slave đã đáp lại Master bằng ACK thì quá trình truyề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
Trần Văn Lực: Lớp LTTĐH - K1 Page 23
theo hướng từ Master đến Slave hay từ Slave đến Master. Dù di chuyển theo hướng
nào, gói dữ liệu luôn bao gồm 9 bits trong đó 8 bits đầu là dữ liệu và 1 bit cuối là bit
ACK. Tám bits dữ liệu do thiết bị phát gởi và bit ACK do thiết bị nhận tạo ra. Sau đó
Master sẽ quyết định gợi tiếp byte dữ liệu khác hay không. 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 bên dưới mô tả định dạng
gói dữ liệu trong TWI (I2C).

Hình 1.16 Truyền dữ liệu trên I2C
Phối hợp gói địa chỉ và dữ liệu: một quá trình truyền/nhận TWI (I2C) thường
được bắt đầu từ Master, Master phát đi một START condition sau đó gởi gói địa chỉ
SLA+R/W trên đường truyền. Tiếp theo nếu có một Slave đáp ứng lại, dữ liệu có thể
truyền/nhận liên tiếp trên đường truyền (1 hoặc nhiều byte liên tiếp).
Multi-Master Bus –Đường truyền đa chip chủ: TWI (I2C) là chuẩn truyền
thông đa chip chủ, nghĩa là tại một 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”
(lost). Một Master bị lost 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.
Trần Văn Lực: Lớp LTTĐH - K1 Page 24
Chương 2:
GIỚI THIỆU VỀ VĐK AVR ATMEGA16L
1/ Sơ đồ khối.
ATmega16 là vi điều khiển 8 bit dựa trên kiến trúc RISC. Với khả năng thực
hiện mỗi lệnh trong vòng một chu kỳ xung clock, ATmega16 có thể đạt được tốc độ
1MIPS trên mỗi MHz (1 triệu lệnh/s/MHz).
Sơ đồ khối của ATmega16
Trần Văn Lực: Lớp LTTĐH - K1 Page 25

×