Giới Thiệu
Đối với avr, có một tính năng đặc biệt là fuse bit. Fuse bit cơ bản có thể hiểu là những mạch điện đặc biệt dùng để thiết lập các tính năng ban đầu cho chip VĐK, ví dụ như thiết lập nguồn xung clock, kích thước bootloader, kích hoạt chức năng phát hiện sụt áp cho...
Tùy vào từng loại VĐK AVR cụ thể mà sẽ có những fuse thiết lập các tính năng khác nhau, tuy nhiên chỉ cần để giá trị fuse bit theo mặc định của nhà sản xuất là đã đáp ứng được nhu cầu sử dụng cơ bản. Khi cần sử dụng chip với một tính năng đặc biệt nào đó thì mới quan tâm đến các giá trị cụ thể của tính năng đó. Sau đây là ví dụ fuse bit cho atmega8, các loại khác phần lớn có các bit tương tự, nếu quan tâm có thể tham khảo trong tài liệu hướng dẫn sử dụng của nhà sản xuất (datasheet).
Ví Dụ
Fuse bit của atmega8 có 16 bit, chia là 2 byte, byte cao và byte thấp.
Fuse bit atmega8
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
Byte cao
|
RSTDISBL
|
WDTON
|
SPIEN
|
CKOPT
|
EESAVE
|
BOOTSZ1
|
BOOTSZ0
|
BOOTRST
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
Byte thấp
|
BODLEVEL
|
BODEN
|
SUT1
|
SUT0
|
CKSEL3
|
CKSEL2
|
CKSEL1
|
CKSEL0
|
Bây giờ giả sử thiết lập fuse bit cho atmega8 với giá trị 0xC19F thì tính năng của thiết lập cho VĐK như sau:
Đối với byte cao 0xC1
C1 = 1100_0001
|
CHỨC NĂNG
|
7
|
1
|
RSTDISBL
|
Kích hoạt chân reset.
|
6
|
1
|
WDTON
|
Watchdog không luôn mở.
|
5
|
0
|
SPIEN
|
Cho phép lập trình nối tiếp.
|
4
|
0
|
CKOPT
|
Tần số thạch anh tối đa là 16Mhz.
|
3
|
0
|
EESAVE
|
Không xóa epprom khi xóa chip.
|
2
|
0
|
BOOTSZ1
|
Thiết lập bootloader size: 1024 words.
|
1
|
0
|
BOOTSZ0
|
0
|
1
|
BOOTRST
|
Khởi động chương trình tại địa chỉ 0x0000.
|
Byte thấp 0x9F
9F = 1001_1111
|
CHỨC NĂNG
|
7
|
1
|
BODLEVEL
|
Phát hiện sụt áp khi dưới 2.7V.
|
6
|
0
|
BODEN
|
Mở tính năng phát hiện sụt áp.
|
5
|
0
|
SUT1
|
Crystal osc, BOD enabled.
|
4
|
1
|
SUT0
|
3
|
1
|
CKSEL3
|
Thạch anh > 8Mhz.
|
2
|
1
|
CKSEL2
|
1
|
1
|
CKSEL1
|
0
|
1
|
CKSEL0
|
v Điều đầu tiên cần quan tâm khi làm việc với fuse bit là giá trị dùng để thiết lập nguồn xung clock mà VĐK sẽ sử dụng, VĐK có thể hoạt động bằng nguồn xung clock nội bên trong hay sử dụng mạch thạch anh tạo xung clock bên ngoài, và nó cũng có thể chạy với nhiều tần số khác nhau. Vì là việc quan trọng nên phải có đến 7 bit tham gia vào quá trình này: CKSEL3, CKSEL2, CKSEL1, CKSEL0, SUT1, SUT0 và bit CKOPT.
o Khi CKOPT = 0 thì tần số tối ta mà VĐK chạy được là 16Mhz, còn khi CKOPT = 1 tần số tối đa chip có thể hoàn động là 8Mhz, nếu cao hơn thì mạch sẽ hoạt động không chính xác nữa.
o CKSEL[3:0] = 1111 nghĩa là sử dụng thạch anh ngoài, hỗ trợ hoạt động với tần số cao nhất mà VĐK đáp ứng được (là 16Mhz với atmega8).
o SUT[1:0], thiết lập thời gian trễ từ lúc cấp nguồn hay reset đến khi thực hiện lệnh đầu tiên. Mục đích là để cho các mạch điện, nguồn xung clock cấp cho VĐK ổn định trước khi nó hoạt động thật sự. Trong hầu hết các ví dụ được trình bày, thời gian này không ảnh hưởng đến hoạt động của mạch nên có thể làm lơ 2 bit này.
o Thiết lập nguồn xung clock để VĐK hoạt động là phần được thực hiện thường xuyên nhất, về cách tính cụ thể như thế nào sẽ được trình bày ở phần bên dưới.
v Tính năng phát hiện sụt áp. Để vi điều khiển có thể hoạt động tốt thì chức năng phát hiện sụt áp nên được bật lên, vì khi dưới ngưỡng điện áp cho phép thì chip VĐK sẽ được tắt, tránh trường hợp chạy sai hay không kiểm soát được. Có 2 bit tham gia vào việc thiết lập tính năng này là: BODEN và BODLEVEL.
o BODLEVEL thiết lập mức điện áp mà khi dưới giá trị đó vi điều khiển sẽ được dừng hoạt động. Với BODLEVEL = 1 thì điện áp mức là 2.7V.
o BODEN, bit cho phép tính năng phát hiện sụt áp có hoạt động hay không. Nếu BODEN = 0 thì sẽ mở tính năng này và dĩ nhiên lúc này bit BODLEVEL mới phát huy tác dụng.
v Tính năng bootlooder (xem thêm về bootloader tại đây), 3 bit để cài đặt tính năng bootloader: BOOTRST, BOOTSZ0 và BOOTSZ1.
o BOOTRST có nhiệm vụ nói cho VĐK biết là khi khởi động thì chương trình lưu ở đâu trong bộ nhớ chương trình sẽ được thực thi. Nếu BOOTRST = 1 thì khi khởi động hay reset thì chương trình tại địa chỉ 0x0000 sẽ chạy. Còn nếu BOOTRST = 0 thì chương trình tại địa chỉ khác địa chỉ 0x0000 (gọi là địa chỉ bootloader) sẽ được thực thi, địa chỉ bootloader phụ thuộc vào kích thước của bootloader.
o BOOTSZ[0:1] quy định kích thước cho bootloader. Tùy vào độ lớn của chương trình bootloader mà ta sẽ chọn kích thước của bootloader cho phù hợp (xem thêm về bộ nhớ avr).
BOOTSZ1
|
BOOTSZ0
|
Boot size
|
Boot reset address start
|
1
|
1
|
128 words
|
0xF80
|
1
|
0
|
256 words
|
0xF00
|
0
|
1
|
512 words
|
0xE00
|
0
|
0
|
1024 words
|
0xC00
|
v EESAVE, bit này nếu bằng 0 thì lúc xóa VĐK eepprom của chip sẽ không bị xóa. Đặc điểm của epprom là thông tin lưu trong epprom không bị xóa khi bị mất điện hay bị reset, khi sử dụng epprom thì cần lưu ý đến bit này, một vài mạch nạp sẽ xóa chip khi nạp code vậy vậy cần cho EESAVE = 0 để dữ liệu lưu trong epprom không bị mất.
v SPIEN, đây là bit rất quan trọng nếu nạp code bằng các mạch nạp nối tiếp (USBASP, STK500-ISP). Muốn nạp được code bằng các mạch nạp nối tiếp thì SPIEN phải bằng 0 nếu không sẽ không nạp được. Một điểm cần lưu ý là lúc thiết lập fuse bit bằng các mạch nạp nối tiếp thì phải để mắt đến bit SPIEN, phải chắc chắn rằng bit này luôn luôn là 0. Nếu vô tình cho SPIEN bằng 1 thì lần nạp code tiếp theo sẽ thất bại.
v WDTON = 1: Watchdog không luôn mở, xem thêm bài về watchdog.
v RSTDISBL = 1 nghĩa là chân reset sẽ được dùng để reset chip !!!. Đối với Atmega8 thì chân số 1 ngoài tính năng dùng để reset ra thì nó nhận luôn nhiệm vụ là chân I/O của PORTC (PC6). Vì vậy bit RSTDISBL xác định xem chân này dùng vào reset hay I/O. Tôi khuyên là nên để bit này bằng 1 để có thể reset chip và nạp code bằng các mạch nạp nối tiếp (mạch nạp nối tiếp cần reset trước khi nạp code), không nên can thiệp vào bit này trừ khi cần thiết sử dụng nó như là một chân I/O để nhập xuất.
Tính Fuse Bit & Nạp Fuse Bit
Fuse bit là các mạch điện đặc biệt nên cần phải được thiết lặp ban đầu thông qua các mạch nạp bên ngoài. Có thể sử dụng mạch nạp song song hay nối tiếp để nạp, khi sử dụng mạch nạp nối tiếp thì phải chắc là bit SPIEN đã được thiết lập (SPIEN = 0) như đã trình bày ở trên.
Với từng loại VĐK khác nhau sẽ có các fuse bit và tính năng khác nhau, khi cần thiết có thể tham khảo trang web tính fuse bit online cho avr tại đây hoặc dùng phần mền atmel studio để tính giá trị fuse bit và sau đó nạp giá trị fuse vừa tính được vào chíp bằng các mạch nạp mà bạn có. Xem thêm bài mạch nạp.
Tôi ví dụ với phần mền atmel studio.
Ở phần xung clock nếu dùng thạch anh tần số từ 8Mhz thì phải chọn vào CKOPT.
Có thể thấy SUT_CKSEL (là SUT và CKSEL) phần mền thiết lập cùng một lúc, ở trên là: EXTHIFXTALRES_16KCK_64MS có nghĩa chọn thạch anh ngoài, tần số cao và sau 64ms khi được cấp nguồn thì VĐK mới hoạt động.
* Khởi động almel studio, mục Tools – Device Programming (phím tắt mặc định: Ctrl + Shift + P)
** Nếu không có mạch nạp để phần mền có thể nhận thì ở của sổ Device Programing trong mục Tool chọn Simulator. Sau khi có giá trị fuse bit thì nạp vào vi điều khiển bằng những mạch nạp cho avr mà bạn có.
Tóm Lại
Fuse bit là những mạch điện đặc biệt dùng để thiết lập những tính năng đặc biệt: nguồn xung clock, thời gian khởi động, cho phép nạp code bằng mạch nạp nối tiếp, ngăn epprom bị xóa, thiết lập các tính năng của bootloader...
Khi thiết lập fuse bit cần quan tâm đến việc sử dụng nó như thế nào:
§ Có dùng mạch nạp nối tiếp?
§ Dùng thạch anh ngoài hay xung clock nội bên trong.
§ Clock tối đa là bao nhiêu? Có sử dụng epprom, bootloader không?
§ ...
Sau đó là tính bằng phần mền atmel studio hay trên website.
Cần chú ý đến các bit: CKSEL, CKOPT, SUT, BOOTRST, RSTDISBL và SPIEN.
Từ Viết Tắt Nên Nhớ.
TÊN
|
VIẾT TẮT CỦA
|
MÔ TẢ BẰNG TIẾNG ANH
|
CKSEL
|
Clock Select
|
Set Clock source
|
SUT
|
Start Up Time
|
Set start-up time
|
BODEN
|
Brown Out Dectection Enable
|
Brown out dectector enable
|
BODLEVEL
|
Brown Out Dectection Level
|
Brown out dectector level
|
BOOTRST
|
Boot Reset
|
Slelect Reset Vector
|
BOOTSZ
|
Boot Size
|
Slelect Boot Size
|
EESAVE
|
Epprom Save
|
EEPROM memory is preserved through the Chip Erase
|
SPIEN
|
Serial Program Enable
|
Enable Serial Program and Data Downloading
|
CKOPT
|
Clock Option
|
Oscillator options
|
WDTON
|
Watch-Dog ON
|
WDT always on
|
RSTDISBL
|
Reset Disable
|
Select if PC6 is I/O pin or RESET pin
|