You are on page 1of 7

Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.

ORG

CHƯƠNG 2: CẤU HÌNH CỨNG (FUSE BIT)


CHO
VI ĐIỀU KHIỂN AVR
Chương này tham khảo bài viết“Thiết lập Fuse Bits” của website
www.hocavr.com và có sửa đổi, bổ sung 1 số mục cho phù hợp với điều kiện
bài viết
I. Giới thiệu
AVR có sẵn một số mạch điện và các thiết bị hỗ trợ bên trong, việc
“điều khiển” các mạch điện này được thực hiện thông qua các Fuse bits. Ví dụ
bên trong các chip AVR có bộ tạo dao động cho chip, nếu muốn sử dụng hoặc
vô hiệu hóa bộ tạo dao động này chúng ta sẽ set các Fuse bits điều khiển nguồn
xung clock(cụ thể ở phần sau). Như thế, Fuse bits cũng giống như các “cầu chì”
hay các “công tắc cứng” nối AVR với các mạch điện hỗ trợ. Vì là các “công
tắc cứng” nên chúng phải được set riêng biệt, không set được bằng lệnh
"mềm".
Mỗi loại AVR có số lượng mạch điện hỗ trợ khác nhau và vì thế số lượng
Fuse bits sẽ khác nhau. Vị trí các Fuse bits cũng khác nhau trên mỗi dòng chip
tuy nhiên tên gọi thì như nhau. Tôi sẽ dùng chip ATmega32 làm minh họa.
Chip ATmega32 có 16 Fuse bits được bố trí trong 2 byte gọi là “Fuse High
Byte” và “Fuse Low Byte”. Vị trí các Fuse bits không quan trọng (vì chúng ta
dùng phần mềm hỗ trợ set từng Fuse bit) nhưng tên gọi và chức năng thì cần
khảo sát. Bảng 1 tóm tắt các bits trong Fuse High Byte và bảng 2 tóm tắt các
bits trong Fuse Low Byte.

Bảng 1. Fuse High Byte

Trần Thừa – 2010 22


Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG

Bảng 2. Fuse Low Byte

II. Lập trình fuse bit.


Hiện nay có rất nhiều phần mềm hỗ trợ FUSE BIT, có loại lặp trình trên
từng bit, có loại cấu hình bằng các thông số trên giao diện người dùng rất trực
quan. Bài này tôi xin giới thiệu một chương trình cấu hình trên giao diện và
hình ảnh các bit thực tế sau khi được cấu hình. Chương trình cấu hình Fuse bit
chính là chương trình nạp nằm trong bộ công cụ lập trình và biên dịch AVR
Studio 4 đã giới thiệu ở trên.
Nếu các bạn dùng một chương trình lập trình fuse bit khác thì chú ý là
đối với các Fuse bits, gán giá trị 0 cho một Fuse bit đồng nghĩa với Fuse bit đó
được lập trình (programmed), trong khi 1 nghĩa là không được lập trình
(unprogrammed).

Hình 1. Mục cấu hình Fuse bit Atmega32

Trần Thừa – 2010 23


Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG

Hình 1 là mục cấu hình sau khi kết nối với mạch nạp (phần hướng dẫn nạp chip
trang 16) và chọn thẻ Fuses.
Chúng ta sẽ lần lượt khảo sát các Fuse bit theo nhóm chức năng của chúng.
1. JTAGEN (JTAG Enable):
Trên AVR có tích hợp sẵn bộ JTAG, đó là một module giao tiếp với
phần cứng của chip. Nhìn chung, JTAG thường được dùng để kiểm tra hoạt
động của chip. Trên AVR, JTAG có thể được dùng để nạp chương trình nhưng
phổ biến hơn là dùng để debug lỗi chương trình (gỡ rối chương trình). Module
JTAG làm việc thông qua 4 chân TCK, TMS, TDO và TDI, trên chip
ATmega32 4 chân lần lần lượt là PC2, PC3, PC4 và PC5. Theo mặc định JTAG
được kích hoạt, bit JTAGEN=0 (programmed). Vì thế với các chip ATmega32
mới mua về, các chân PC2:5 trên PORTC có thể không sử dụng để xuất nhập
thông thường được. Nếu bạn không muốn sử dụng chức năng debug trực tiếp
trên chip thì hãy uncheck bit JTAGEN (uncheck tương đương unprogrammed,
tương đương JTAGEN=1) để dùng các chân JTAG như các chân xuất nhập
thông thường.

2. OCDEN (On Chip Debug Enable):


Như đã trình bày ở trên, AVR cho phép chúng ta gỡ rối chương trình
trực tiếp trên chip thông qua module JTAG. Trong khi bit JTAGEN cho phép
kích hoạt JTAG thì bit OCDEN cho phép thực hiện debug trên chip (Nghĩa là
cho dù đã kích hoạt JTAG bạn chưa thể dùng chức năng debug nếu chưa kích
hoạt OCDEN). Nếu bạn có một mạch Debug cho AVR như mạch JTAG ICE
của Atmel (xem bài Debug với JTAG ICE) và bạn muốn debug chương trình
thì hãy set bit OCDEN bằng 0 (check vào ô OCDEN). Bạn cần nhớ rằng, khi
lập trình cho bit OCDEN thì AVR sẽ hoạt động trong mode debug, trong mode
này chip sẽ ở trong trạng thái “ngủ” (Sleep mode), bạn chỉ có thể thực hiện
debug mà không thể chạy chương trình thật. Theo mặc định, OCDEN không
được lập trình và chế độ debug được vô hiệu hóa. Lời khuyên là bạn nên để bit
này unprogrammed(uncheck) trước khi đưa chip vào sử dụng. (đừng đụng vào
bit này nếu bạn không có ý định debug trên chip).
3. BODEN (Brown-OutDetection Enable) và BODLEVEL(BOD
Level):
AVR có sẵn một mạch điện Brown-Out Detection, hiểu đơn giản là
mạch phát hiện sự sụt điện áp nguồn. Nếu fuse BODEN được lập trình thì
mạch BOD được kích hoạt, khi đó fuse bit BODLEVEL chọn mức điện áp của
BOD (mức điện áp dùng so sánh sụt nguồn). Nếu BODLEVEL=1
(unprogrammed) thì mức điện áp BOD mặc định là 2.7V, ngược lại nếu
BODLEVEL được lập trình thì mức điện áp BOD là 4.0V. Với AVR Studio, ta
có thể chọn 1 cách trực quan bằng trị số BODLEVEL và check(lập trình) hoặc
uncheck(không lập trình) BODEN. Khi đó các fuse bit sẽ tự động cập nhật.

Trần Thừa – 2010 24


Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG

Khi mạch BOD được sử dụng, nếu điện áp VCC giảm xuống thấp hơn
mức điện áp BOD thì 1 Reset BOD xảy ra. Nếu không thật sự cần thiết hãy để
các bit này không được lập trình như mặc định. Hình 2 mô tả một sự kiện BOD
trên AVR.

Hình 2. Sự kiện BOD trên AVR.


4. EESAVE (EEPROM Erase SAVE):
Nếu bit EESAVE được lập trình (bằng 0 hay check), thì bộ nhớ
EEPROM sẽ không bị xóa khi xóa chip, ngược lại EESAVE =1 (uncheck) thì
EEPROM sẽ bị xóa theo chip.
6. BOOT LOADER:
Đây là một tính năng rất hay trên các chip AVR mới (chú ý không phải
dòng AVR nào cũng có Boot Loader), Boot Loader là phần bộ nhớ chương
trình được kích hoạt đầu tiên khi khởi động chip. Boot Loader trên các chip
AVR được bố trí phía dưới của bộ nhớ chương trình (xem lại trang 4). Boot
Loader thường được sử dụng để ghi hoặc đọc nội dung bộ nhớ chương trình, vì
thế ứng dụng phổ biến nhất của nó là cập nhật (update) chương trình cho chip
một một cách nhanh chóng mà không cần mạch nạp.
Cơ chế như sau:
-Trước hết chúng ta cần có 1 chương trình Boot Loader được nạp sẵn
trong phần bộ nhớ Boot Loader (phía dưới bộ nhớ chương trình). Chương trình
này có khả năng giao tiếp với máy tính (thông qua UART chẳng hạn) và đọc,
ghi bộ nhớ chương trình của chip.
-Khi cần update chương trình mới cho AVR, trên máy tính có 1 chương
trình giao tiếp với Boot Loader, kết nối AVR với máy tính, chương trình trên
máy tính sẽ gởi nội dung cần update cho AVR, chương trình Boot Loader sẽ
đọc nội dung này và ghi vào bộ nhớ chương trình của AVR. Bằng cách này
chúng ta đã “nạp” chương trình cho AVR mà không cần dùng mạch nạp.

Trần Thừa – 2010 25


Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG

Nạp chương trình bằng Boot Loader cho phép khách hàng của bạn tự
cập nhật các chức năng mới mà không cần trao chip cho bạn. Sử dụng hay
không sử dụng Boot Loader sẽ được xác lập thông qua các Fuse bits
BOOTRST, BOOTSZ1 và BOOTSZ0.
BOOTRST (Select Reset Vector) : Nếu Fuse bit BOOTRST không
được lập trình (bằng 1 - uncheck) thì khi vừa khởi động chip, con trỏ chương
trình sẽ nhảy đến vị trí đầu tiên trong chương trình (0x0000) để lần lượt thực
thi phần chương trình như thông thường. Nếu BOOTRST được lập trình (bằng
0- check) thì vị trí Reset là địa chỉ đầu của phần Boot Loader, không phải địa
chỉ 0x0000 như thường lệ. Khi đó phần chương trình trong Boot Loader sẽ
được thực thi thay cho chương trình chính phía trên (xem hình 3).

BOOTRST=1

RESET

BOOTRST=0

BOOTSZ1 và BOOTSZ0 (Select Boot Size – Chọn kích thước cho


boot section):
Kích thước phần bộ nhớ dành cho Boot Loader không cố định, nếu Boot
Loader không được kích hoạt (fuse BOOTRST=1) thì toàn bộ bộ nhớ chương
trình dành cho chương trình chính. Khi Boot Loader được kích hoạt, 2 Fuse
bits BOOTSZ1 và BOOTSZ0 sẽ quyết định kích thước Boot Loader. Bảng 3
tóm tắt các kích thước của phần Boot Loader phụ thuộc vào 2 bit BOOTSZ1:0.
Chú ý là kích thước tính theo INSTRUCTION WORD, với AVR 1
INSTRUCTION WORD = 2 bytes. Phải nhắc lại đối với Fuse bits, giá trị 1
nghĩa là không được lập trình (uncheck trong Avr Studio). Nếu bit BOOTRST
không được lập trình thì 2 bit BOOTSZ không có tác dụng.

Trần Thừa – 2010 26


Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG

Bảng 3. Kích thước Boot Loader.

Khi dùng AVR Studio, ta chọn trực tiếp các giá trị này thông qua menu
sổ xuống của mục BOOTSZ
Ví dụ: chọn boot flash size là 2048

Thì 2 bit BOOTSZ1 và BOOTSZ0 là 00


Trong các ứng dụng lập trình thông thường, Boot Loader không được
quan tâm, vì thế tôi khuyên bạn nên để các Fuse bit BOOTRST, BOOTSZ1:0
như mặc định. Nếu các bạn thi công mạch nạp USB AVR-Lab thì sẽ dùng đến
BOOT LOADER khi đó, các bạn có thể xem video cấu hình chip Atmega8 của
mạch nạp trong bài viết đăng trên www.eeelabs.org
7. Chọn Nguồn Xung giữ nhịp và thời gian khởi động (start-up times):
Đây là phần rất được quan tâm khi set Fuse bits. Có đến 7 Fuse bits
tham gia vào việc này đó là 4 bits CKSEL3:0, 2 bit SUT1:0 và bit CKOPT.
Trong đó, 2 bit SUT1:0 chủ yếu dùng để chọn thời gian khởi động, phần này
không ảnh hưởng nhiều trong hầu hết các trường hợp (ít nhất là các ví dụ tài
liệu này) vì thế tôi sẽ bỏ qua (chọn mặc định là 64ms). Nếu start-up time thật
sự ảnh hưởng đến chương trình của bạn, bạn hãy tham khảo thêm phần
“System Clock and Clock Option” trong datasheet của chip. Phần này tôi chủ
yếu trình bày cách chọn nguồn xung giữ nhịp cho chip.
Có tất cả 5 loại nguồn xung giữ nhịp chính cho chip nhưng để đơn giản
chúng ta chỉ xét 2 trường hợp là dùng nguồn thạch anh ngoài và dùng xung giữ
nhịp được tạo bởi mạch RC trong chip.
Xung giữ nhịp trong chip (xung nội – internal clock): Hầu hết các chip
AVR mới sau này được trang bị 1 mạch tạo xung giữ nhịp RC bên trong, nếu
sử dụng nguồn xung giữ nhịp này chúng ta có thể bỏ qua mạch tạo xung bên
ngoài. Nguồn xung giữ nhịp được tạo ra bên trong chip được cố định ở 1 trong
4 mức : 1MHz, 2 MHz, 4 Mhz và 8 MHz. Các Fuse bits CKSEL3:0 quyết định

Trần Thừa – 2010 27


Lập trình vi điều khiển AVR với ngôn ngữ C WWW.EEELABS.ORG

việc chọn nguồn xung này. Bảng 4 tóm tắt cách phối hợp các Fuse bits CKSEL
để chọn nguồn xung nội.

Bảng 4. Chọn xung giữ nhịp nội bằng các Fuse bits CKSEL.

(Nomial frequency: tần số danh nghĩa, giá trị thực có thể khác do sai số)
Đối với chip ATmega32, nguồn xung nội 1MHz được set mặc định trên
các chip mới.
Xung giữ nhịp từ mạch bên ngoài (External - Clock): dùng xung nội có
nhược điểm là tấn số xung đã được giữ cố định trong 4 mức và tấn số cao nhất
có thể đạt là 8MHz trong khi AVR cho phép làm việc ở 16Mhz, mặt khác sai số
cũng tương đối lớn khi xùng xung nội. Do đó ta có thể dùng mạch tạo xung bên
ngoài bằng RC hoặc lý tưởng nhất là thạch anh ( xem lại sơ đồ trang 11).
Để “báo” cho AVR biết là chúng ta muốn sử dụng thạch anh ngoài làm
mạch tạo xung, hãy set các Fuse bits CKSEL3:0 thành 1 trong 2 giá trị: 1111
hoặc 1010 (nhị phân). Trong trường hợp này, Fuse bit CKOPT có tác dụng
chọn giữa 2 chế độ khuyếch đại, chế độ CKOPT = 0 (programmed- check)
thích hợp với thạch anh có tần số lớn nhất là 16MHz và CKOPT=1
(unprorgammed - uncheck) khi tần số thạch anh nhỏ hơn hoặc bằng 8MHz.
Việc chọn thời gian khởi động, nguồn xung nhịp cho chip và chế độ
khuếch đại thực hiện dễ dàng với AVR Studio qua 2 mục :
CKOPT : check hoặc uncheck
SUT_CKSEL : chọn từ menu sổ xuống.

Sau khi đã chọn các Fuse bits, việc cuối cùng và rất quan trọng là ghi
các Fuse bits này vào chip bằng cách nhấn nút Program.
Đối với các chương trình nạp chip khác, Fuse bits set dựa trên việc check
hoặc uncheck từng bit của 2 byte LOW và HIGH vì vậy ta cần nắm vững việc
chọn các bit này. Đối với AVR Studio, sau khi cấu hình trên phần giao diện, ta
có thể xem 2 byte LOW và HIGH thực tế ở phía dưới của cửa sổ :

Trần Thừa – 2010 28

You might also like