Thiết lập Fuse bit cho AVR
Chào các bạn hôm nay chúng ta sẽ tìm hiểu về cách thiết lập fuse bits cho vi điều khiển AVR. Trong AVR được thiết kế sẵn một số mạch điện và các thiết bị hỗ trợ bên trong,chúng có tác dụng điều khiển, debug, cấp xung clock, lưu trữ.... Để điều khiển các mạch điện này khi nạp chip chúng ta phải cấu hình Fuse bit cho chúng, hiểu nôm na là đóng cầu dao điện hoặc mở cầu dao điện. VD như ta thiết lập nguồn xung clock cho AVR: Vì trong AVR có tích hợp một mạch điện tạo dao động cho chip lên đến 8Mhz khi sử dụng mạch này các bạn không cần phải mắc thạch anh cho chip.
Mỗi loại chip avr đều có một cấu hình fuse khác nhau, ở đây ta sẽ lấy ví dụ cho một số chip hay dùng: ATmega8, ATmega16, ATmega32, .... Phần mềm nạp Progisp:
Chú ý: Khi cấu hình Fuse bit là bit 0 sẽ là kích hoạt, còn 1 là không kích hoạt
Ta sẽ set một số Fuse của các chip trên:
1. BODLEVER là bit chọn mức điện áp tham chiếu sụt áp nguồn, khi ta cấu hình kích hoạt BODEN. BODLEVER=0 tức chọn mức điện áp 4.0V, còn nếu BODLEVER=1 là chọn mức điện áp 2.7V
Khi điện áp nguồn VCC mà bị sụt xuống mức giới hạn trên CHIP sẽ tự động được RESET không như 8051 treo luôn :)
2. BODEN là bit cho phép mạch phát hiện sụt áp nguồn hoạt động.
3. JTAGEN là bit cho phép module JTAG hoạt động, có tác dụng kiểm tra hoạt động trên chip và gỡ lỗi...
Lưu ý fuse này với chip ATmega32 khi mới mua về các PIN: TCK, TMS, TDO và TDI lần lượt PC2, PC3, PC4 và PC5 không thể sử dụng được, nếu ta không có việc gì cần đến cái này thì hãy vô hiệu hóa bằng cách set JTAGEN=1 để có thể sử dụng các chân trên như các PIN khác vì nếu ta để cấu hình JTAGEN=0 sẽ không sử dụng được các chân trên.
4. OCDEN là bit cho phép Debug, nếu ta không khai báo fuse này thì JTAGEN vô nghĩa khi JTAGEN=0. Không dùng Debug thì ta set OCDEN=1, nếu set OCDEN=0 thì chip sẽ chạy ở chế độ sleep mode (ngủ đông) và quá trình debug bắt đầu, ta không thể làm gì với chip
Tốt nhất ko sờ vào cái này không lại cứ tưởng con chip của mình vừa mới mua về sao đã tèo rồi thì mệt.
5. EESAVE là bit cho phép để lại (lưu lại) dữ liệu EEPROM trong mỗi lần nạp lại chip hay không, nếu EESAVE=0 thì toàn bộ dữ liệu trong EEPROM sẽ không bị xóa khi nap chip hoặc ngược lại.
6. BOOT LOADER là chương trình cho phép nạp chip không cần mạch nạp, VD như nạp qua UART.... cho phép khách hàng của mình có thể tự cập nhật phần mềm. Để làm được việc này ta phải cấu hình fuse cho 3 bit sau:
- BOOTRST là fuse cho phép chạy chương trình bootloader trong vùng lưu trữ bootloader. BOOTRST=1 thì địa chỉ của chương trình sẽ bắt đầu từ địa chỉ 0x0000, còn BOOTRST=0 thì ô nhớ bắt đầu là vị trí đầu tiên của bootloader tức ctr bootloader được thực thi.
- BOOTSZ1 và BOOTSZ0 là 2 bit chọn phân vùng bộ nhớ cho bootloader ta xem bảng sau:
BOOTSZ1 | BOOTSZ0 | Boot Size (words) | Page | Địa chỉ |
1 | 1 | 256 | 4 | 0x3F00 - 0x3FFF |
1 | 0 | 512 | 8 | 0x3E00 - 0x3FFF |
0 | 1 | 1024 | 16 | 0x3C00 - 0x3FFF |
0 | 0 | 2048 | 32 | 0x3800 - 0x3FFF |
Trong các ứng dụng không đòi hỏi phải cập nhật phần mềm thì ta để mặc định, để dành bộ nhớ cho code.
7. RSTDISBL là bit cho phép sử dụng chân reset hay không trên một số chip như ATmega8 có tích hợp chung với PINC.6. Để sử dụng chân này làm chân RESET ta thiết lập fuse RSTDISBL=1 và ngược lại nếu ta muốn sử dụng chân này làm port xuất nhập.
8. WTDON cho phép WTD
9. SPIEN cho phép giao tiếp SPI
10. Set xung nhip cho chip, gồm 7 fuse: CKSEL3:0 (chọn xung nhịp), CKOPT (chọn chế độ khuêch đại) và SUT1:0 (thời gian khởi động- ko dùng, mặc định như nào để đó SUT1:0=10 )
CKSEL3:0 | Xung nhịp | Nguồn xung nhịp | CKOPT |
0001 | 1Mhz | Onchip | |
0010 | 2Mhz | Onchip | |
0011 | 4Mhz | Onchip | |
0100 | 8Mhz | Onchip | |
1010 | 1-16Mhz | Thạch anh ngoài | 0 |
1111 | 1-16Mhz | Thạch anh ngoài | 0 |
1010 | 1-8Mhz | Thạch anh ngoài | 1 |
1111 | 1-8Mhz | Thạch anh ngoài | 1 |
Hướng dẫn set fuse dùng xung nhịp RC onchip và thạch anh ngoài
Cuối cùng sau khi cấu hình xong nhớ nhấn nút Write để ghi cấu hình vào chip nha!
Qua bài viết này các bạn có thể yên tâm khi nạp chương trình cho AVR không sợ bị set nhầm fuse.