- Cầu chì trong AVR là gì - Giải thích chi tiết
- Fuse Bits trong Arduino
- Các thành phần cần thiết để kiểm tra cầu chì trong AVR
- Sơ đồ để kiểm tra các bit cầu chì trong AVR
- Kiểm tra cầu chì trong AVR
Trong hướng dẫn này, chúng ta sẽ nói về cầu chì. Quay lại khi tôi còn học đại học và đang tìm hiểu về tất cả những thứ hay ho trong điện tử, lần đầu tiên tôi nghe thấy thuật ngữ cầu chì trong AVR, suy nghĩ ban đầu của tôi về chủ đề này là, ồ! có thứ gì đó bên trong AVR sẽ nổ tung nếu tôi làm sai điều gì đó. Hồi đó, không có nhiều tài nguyên trên Internet để xem qua. Tôi đã tìm kiếm khá kỹ để phát hiện ra rằng những cầu chì này tham chiếu đến một số bit đặc biệt bên trong Vi điều khiển AVR. Các bit này giống như các công tắc nhỏ bên trong AVR và bằng cách bật / tắt chúng, chúng ta có thể bật / tắt một số tính năng đặc biệt của AVR. Bật và tắt nó có nghĩa là thiết lập và đặt lại.
Chúng tôi sẽ nhân cơ hội này để thảo luận về tất cả những gì có về các bit Cầu chì trong AVR. Để đơn giản hơn, chúng ta sẽ lấy ví dụ về một bảng Arduino chứa Vi điều khiển ATmega328P phổ biến. Tại đây, bạn sẽ học cách đặt các cầu chì này để bật và tắt một số tính năng này thực sự hữu ích trong các ứng dụng đời thực. Vì vậy, chúng ta hãy bắt tay ngay vào nó.
Trong các bài viết trước của chúng tôi, chúng tôi đã xây dựng rất nhiều dự án vi điều khiển AVR như mô-đun Interfacing GSM với vi điều khiển AVR và Interfacing HC-05 với vi điều khiển AVR. Bạn có thể kiểm tra chúng nếu bạn muốn tìm hiểu thêm về các dự án đó.
Cầu chì trong AVR là gì - Giải thích chi tiết
Như chúng ta đã thảo luận trước đó, cầu chì trong vi điều khiển giống như các công tắc nhỏ có thể được bật và tắt để bật và tắt các tính năng khác nhau trong vi điều khiển AVR. Đây là phần mà câu hỏi tiếp theo của chúng ta đặt ra, vậy làm cách nào để đặt hoặc đặt lại các cầu chì này? Câu trả lời cho câu hỏi này rất đơn giản: Chúng tôi làm điều đó với sự trợ giúp của các thanh ghi cầu chì.
Trong vi mạch ATmega328P, có tổng cộng 19 bit cầu chì và chúng được chia thành ba byte cầu chì. Chúng được định nghĩa là "Byte cầu chì mở rộng", "Byte cầu chì cao" và "Byte cầu chì thấp".
Nếu bạn nhìn vào Bảng-27 của biểu dữ liệu ATmega328 / P Rev: 7810D – AVR – 01/15, bạn có thể tìm hiểu tất cả các chi tiết nhỏ về các bit cầu chì. Nhưng hình ảnh dưới đây sẽ cung cấp cho bạn ý tưởng tốt hơn về phần các bit cầu chì của biểu dữ liệu.
Bây giờ khi bạn đã tìm hiểu một chút về các bit cầu chì, chúng ta hãy đi qua biểu dữ liệu và tìm hiểu tất cả các chi tiết cần thiết về vi mạch này.
Các bit cầu chì mở rộng:
Khi bạn nhấp vào tab Fuse Bits và cuộn xuống một chút, bạn sẽ tìm thấy Bảng 27-5: hiển thị bảng cho “Extended Fuse Byte” thường được gọi là “ EFUSE”. Hình ảnh dưới đây cho thấy chính xác điều đó.
Trong bảng này, chỉ có ba bit có thể sử dụng, và ba bit còn lại được dành riêng. Ba bit này xử lý mức độ phát hiện Brownout. Như bạn có thể thấy trong Ghi chú nếu chúng ta nhìn vào Bảng 28-5, chúng ta có thể tìm thấy thêm chi tiết về nó.
Như bạn có thể thấy trong bảng trên, chúng ta có bảng để phát hiện Brownout. Phát hiện Brownout là một tính năng đặt lại bộ vi điều khiển khi điện áp cung cấp giảm xuống dưới một mức điện áp nhất định. Trong IC ATmega328P, chúng ta có thể vô hiệu hóa hoàn toàn tính năng phát hiện brownout hoặc chúng ta có thể đặt nó thành các mức được hiển thị trong bảng trên.
Các byte cầu chì cao:
Như bạn có thể thấy trong hình dưới đây, bảng 27-6: của biểu dữ liệu hiển thị các bit Cầu chì cao hơn của IC ATmega328P.
Các cầu chì cao thỏa thuận với nhiệm vụ khác nhau bên trong ATmega328 Vi điều khiển. Trong phần này, chúng ta sẽ nói về các bit cầu chì cao hơn và hoạt động của chúng. Hãy bắt đầu với các bit BOOTRST, BOOTSZ0 và BOOTSZ1. Ba bit này chịu trách nhiệm thiết lập kích thước khởi động; kích thước khởi động đề cập đến dung lượng bộ nhớ dành riêng để cài đặt bộ nạp khởi động.
Bootloader là một phần mềm đặc biệt chạy trên bộ vi điều khiển và quản lý các tác vụ khác nhau. Nhưng trong trường hợp của Arduino, bộ nạp khởi động được sử dụng để tải lên bản phác thảo Arduino bên trong vi điều khiển. Trong một trong những bài viết trước của chúng tôi, chúng tôi đã hướng dẫn bạn Cách ghi Bootloader trong ATmega328P bằng Arduino. Bạn có thể kiểm tra điều đó nếu bạn quan tâm đến chủ đề này. Quay trở lại chủ đề của chúng ta, mục đích của các bit khác trong byte cao được làm rõ ràng một cách hợp lý, bit EESAVE là để bảo toàn bộ nhớ EEPROM trong khi thực hiện chu trình xóa chip. Bit WDTON là để bật hoặc tắt Bộ định thời gian giám sát.
Bộ đếm thời gian cho cơ quan giám sát là một bộ định thời đặc biệt trong IC ATmega328P có đồng hồ riêng biệt và chạy độc lập. Nếu bộ đếm thời gian cơ quan giám sát được bật, thì bạn cần xóa nó trong một khoảng thời gian nhất định, nếu không, bộ hẹn giờ cơ quan giám sát sẽ đặt lại bộ vi điều khiển. Đây là một tính năng hữu ích có trong nhiều bộ vi điều khiển nếu bộ vi xử lý bị kẹt; cơ quan giám sát sẽ đặt lại nó để ngăn chặn bất kỳ thiệt hại nào cho ứng dụng cuối.
Bit DWEN ở đó để kích hoạt dây gỡ lỗi; đây là một giao thức chuẩn bị được tích hợp bên trong phần cứng của chúng, được sử dụng để lập trình và gỡ lỗi bộ xử lý. Với tính năng này được bật, bạn có thể flash và gỡ lỗi bộ xử lý bằng một sợi dây duy nhất được gắn vào. Nhưng để sử dụng nó, bạn sẽ cần phần cứng đặc biệt chuẩn bị cho Atmel.
Hai bit còn lại là những bit mà bạn cần tránh trừ khi bạn biết chính xác mình đang làm gì. Đây là RSTDISBL bit-7 và SPIEN bit-5. RSTDISBL (External Reset Disable) như tên của nó sẽ vô hiệu hóa chân thiết lập lại phần cứng bên ngoài và bit SPIEN được sử dụng để tắt giao diện lập trình SPI. Việc vô hiệu hóa bất kỳ bit nào trong số hai bit này có thể hoàn toàn gạch AVR của bạn; vì vậy, để chúng một mình là một ý kiến hay.
Các byte cầu chì thấp:
Như bạn có thể thấy trong hình dưới đây, bảng 27-7: của biểu dữ liệu hiển thị các bit Cầu chì dưới của IC ATmega328P.
Byte cầu chì này có nhiệm vụ thiết lập nguồn xung nhịp và một số thông số khác của xung nhịp bên trong AVR. Trong phần này, chúng ta sẽ tìm hiểu về tất cả những điều đó.
Bit thứ 7 hoặc cờ CKDIV8 có thể được đặt để chia nguồn xung nhịp cho 8, điều này rất hữu ích mà bạn có thể đã biết nếu bạn đã thử tự lập trình AVR. Bit tiếp theo là bit CKOUT và là bit thứ 6 trong Byte cầu chì thấp. Lập trình nó sẽ xuất ra tín hiệu đồng hồ nội bộ trên PORTB0 của vi điều khiển.
Các bit-5 và bit-4 SUT1 và SUT0 điều khiển thời gian khởi động của vi điều khiển. Điều này ngăn cản mọi hành động khởi động có thể xảy ra trước khi điện áp cung cấp có thể đạt đến mức điện áp ngưỡng tối thiểu có thể chấp nhận được. Và bốn CKSEL0 - 4 bit cuối cùng được sử dụng để chọn nguồn xung nhịp của vi điều khiển. Bảng hiển thị bên dưới cho bạn hiểu rõ hơn về bốn bit này chịu trách nhiệm thiết lập nguồn đồng hồ, bạn có thể tìm bảng này trên Phần Nguồn đồng hồ của biểu dữ liệu.
Bây giờ, trước khi chúng ta đi xa hơn, có một điều nữa mà tôi nên xem qua là bảng cho độ trễ khởi động bộ tạo dao động. Theo độ trễ khởi động, chúng tôi đang đề cập đến bit 4 và 5 của byte cầu chì thấp hơn. Độ trễ cần được thiết lập tùy thuộc vào điều kiện mạch sẽ hoạt động và loại dao động bạn đang sử dụng. Các giá trị mặc định được đặt thành công suất tăng chậm với 6 chu kỳ đồng hồ khi thực hiện trình tự tăng hoặc giảm nguồn. Tiếp theo, có một độ trễ khác là 14 chu kỳ đồng hồ với độ trễ 65 Ms sau khi khởi động.
Phù! Đó là rất nhiều thông tin để tiêu hóa. Nhưng trước khi tiếp tục, hãy kết thúc phần này bằng một ghi chú nhanh.
Ghi chú:
Nếu bạn đã xem xét kỹ biểu dữ liệu, bạn phải nhận thấy rằng, lập trình bit cầu chì có nghĩa là đặt nó ở mức thấp, tức là 0 (không), điều này ngược lại với những gì chúng ta thường làm để làm cho một cổng cao hoặc thấp. Bạn phải ghi nhớ điều đó trong khi định cấu hình cầu chì của mình.
Fuse Bits trong Arduino
Chúng ta đã nói nhiều về cầu chì trong phần trên, nhưng trong phần này, chúng ta hãy nói về cách cấu hình chúng và cách viết chúng trong vi điều khiển. Để làm được điều đó, chúng ta sẽ cần một công cụ có tên là Avrdude. Nó là một công cụ có thể được sử dụng để đọc, ghi và sửa đổi bộ nhớ trong vi điều khiển AVR. Nó hoạt động với SPI và nó có một danh sách dài hỗ trợ cho các kiểu lập trình viên khác nhau. bạn có thể tải xuống công cụ từ liên kết dưới đây. Ngoài ra, chúng tôi sẽ sử dụng vi điều khiển Arduino yêu thích của mình.
- Tải xuống phiên bản Avrdude 6.3 Windows-ming32
Bây giờ, bạn đã có Avrdude, bạn cần giải nén nó và mở một cửa sổ lệnh trong thư mục đó. Ngoài ra, nếu bạn định sử dụng nó sau này, bạn có thể thêm đường dẫn thư mục vào phần biến môi trường windows của mình. Nhưng tôi sẽ đặt nó trên màn hình nền của mình và mở một cửa sổ lệnh ở đó. Sau khi hoàn thành việc đó, chúng tôi sẽ kết nối bộ lập trình USBasp với PC của mình và chúng tôi sẽ đảm bảo rằng chúng tôi có trình điều khiển thích hợp cho bộ lập trình USBasp của mình. Một khi chúng tôi làm điều đó, chúng tôi đã sẵn sàng và chúng tôi sẽ đọc giá trị cầu chì mặc định trước. Để làm điều đó, bạn cần chạy lệnh sau.
avrdude.exe -c usbasp -p m328p -U lfuse: r: low_fuse_val.txt: h -U hfuse: r: high_fuse_val.txt: h -U efuse: r: ext_fuse_val.txt: h
Nếu mọi thứ đều đúng, lệnh này sẽ đọc các byte hợp nhất và đưa chúng vào ba tệp văn bản riêng biệt. Hình ảnh dưới đây sẽ cung cấp cho bạn ý tưởng tốt hơn về quy trình.
Như bạn có thể thấy, Avrdude đọc qua các bit cầu chì trên Arduino nano và lưu chúng thành ba tệp văn bản riêng biệt. Bây giờ, chúng tôi đã mở chúng và nhận được ba giá trị; cho EFUSE: 0xFD, cho HFUSE: 0XDA, cho LFUSE: 0xFF. Đây là giá trị cầu chì mặc định mà chúng tôi nhận được cho nano Arduino. Bây giờ, hãy chuyển các bit này thành nhị phân và so sánh chúng với giá trị mặc định của chúng từ biểu dữ liệu. Bảng dưới đây cho thấy chính xác điều đó.
Để thuận tiện, các bit cầu chì được viết bằng giá trị Hệ thập lục phân, nhưng nếu chúng ta chuyển đổi chúng sang giá trị nhị phân và so sánh chúng với biểu dữ liệu, chúng ta sẽ biết điều gì đang xảy ra. Hãy bắt đầu với Lower Fuse Byte. Như bạn có thể thấy từ chuỗi trên, nó được đặt thành 0XFF và Giá trị nhị phân sẽ là 0B11111111.
So sánh các byte cầu chì thấp hơn trong kho với Arduino:
Byte cầu chì thấp |
Số bit |
Giá trị mặc định trong AVR |
Giá trị mặc định của Arduino |
CKDIV8 |
7 |
0 (được lập trình) |
1 (chưa được lập trình) |
CKOUT |
6 |
1 (chưa được lập trình) |
1 (chưa được lập trình) |
SUT1 |
5 |
1 (chưa được lập trình) |
1 (chưa được lập trình) |
SUT0 |
4 |
0 (được lập trình) |
1 (chưa được lập trình) |
CKSEL3 |
3 |
0 (được lập trình) |
1 (chưa được lập trình) |
CKSEL2 |
2 |
0 (được lập trình) |
1 (chưa được lập trình) |
CKSEL1 |
1 |
1 (chưa được lập trình) |
1 (chưa được lập trình) |
CKSEL0 |
0 |
0 (được lập trình) |
1 (chưa được lập trình) |
Byte cầu chì cao hơn được đặt thành 0XDA ở dạng nhị phân là 0B11011010.
Byte cầu chì cao hơn trong nhị phân:
Cầu chì cao Byte |
Số bit |
Giá trị mặc định trong AVR |
Giá trị mặc định của Arduino |
RSTDISBL |
7 |
1 (chưa được lập trình) |
1 (chưa được lập trình) |
DWEN |
6 |
1 (chưa được lập trình) |
1 (chưa được lập trình) |
SPIEN |
5 |
0 (được lập trình) |
0 (được lập trình) |
WDTON |
4 |
1 (chưa được lập trình) |
1 (chưa được lập trình) |
LƯU |
3 |
1 (chưa được lập trình) |
1 (chưa được lập trình) |
BOOTSZ1 |
2 |
0 (được lập trình) |
0 (được lập trình) |
BOOTSZ0 |
1 |
0 (được lập trình) |
1 (chưa được lập trình) |
BOOTRST |
0 |
1 (chưa được lập trình) |
0 (được lập trình)) |
Cài đặt cho Byte cầu chì mở rộng được đặt thành 0XFD, trong hệ nhị phân, nó là 0B11111101.
Mở rộng Byte cầu chì trong nhị phân:
Mở rộng cầu chì Byte |
Số bit |
Giá trị mặc định trong AVR |
Giá trị mặc định của Arduino |
- |
7 |
1 |
1 |
- |
6 |
1 |
1 |
- |
5 |
1 |
1 |
- |
4 |
1 |
1 |
- |
3 |
1 |
1 |
BODLEVEL2 |
2 |
1 (chưa được lập trình) |
1 (chưa được lập trình) |
BODLEVEL1 |
1 |
1 (chưa được lập trình) |
0 (được lập trình) |
BODLEVEL0 |
0 |
1 (chưa được lập trình) |
1 (chưa được lập trình) |
Bây giờ, điều này đánh dấu sự kết thúc của phần này. Cho đến bây giờ, chúng ta đã tìm hiểu rất nhiều về vi điều khiển AVR và các bit cầu chì của nó. Vì vậy, hãy kết thúc bài viết này bằng cách đưa lý thuyết của chúng tôi vào thử nghiệm bằng cách thay đổi và thử nghiệm với một số bit cầu chì trong Arduino Nano.
Các thành phần cần thiết để kiểm tra cầu chì trong AVR
Chúng ta đã nói rất nhiều về các cầu chì trong phần trên. Nhưng để tiếp tục trong bài viết, chúng ta cần một số thành phần phần cứng và một số công cụ phần mềm. Trong phần này, chúng ta sẽ nói về những điều đó. Dưới đây là danh sách các thành phần cần thiết với hình ảnh.
- Breadboard - 1
- Arduino Nano - 1
- Bộ lập trình AVR USBasp - 1
- Cáp USB - 1
- Bộ chuyển đổi AVR 10 chân sang 6 chân - 1
- Avrdude (Công cụ phần mềm để lập trình AVR)
- LED - 1
- Điện trở 330R - 1
- Cáp nhảy
Sơ đồ để kiểm tra các bit cầu chì trong AVR
Thiết lập kiểm tra phần cứng được hiển thị bên dưới trong thiết lập này. Chúng tôi đã kết nối Arduino Nano với PC bằng cáp USB và chúng tôi cũng đã kết nối bộ lập trình USBasp với PC. Mục tiêu của bài viết này là lập trình các bit cầu chì trong AVR. Vì lý do đó, chúng tôi đã kết nối bộ lập trình USBasp với Arduino. Hình ảnh dưới đây sẽ cung cấp cho bạn ý tưởng tốt hơn về thiết lập.
Kiểm tra cầu chì trong AVR
Thiết lập thử nghiệm được hiển thị bên dưới. Như bạn có thể thấy, chúng tôi đã kết nối Arduino và bộ lập trình USBasp với USB của máy tính xách tay của tôi.
Bây giờ, hãy mở Arduino IDE và tải lên một bản phác thảo nhấp nháy cơ bản. Nội dung của bản phác thảo chớp mắt cơ bản là tự giải thích, vì vậy tôi không đưa ra bất kỳ chi tiết nào về nó.
Bạn sẽ thấy trong video rằng đèn led trên chân số 13 đang nhấp nháy như bình thường. Bây giờ chúng ta hãy tinh chỉnh cài đặt cầu chì và đặt nó thành các giá trị mặc định. Và như chúng ta đã thấy trước đây trong biểu dữ liệu; các EFUSE là 0xFF; HFUSE là D9; LFUSE là: 62. Bây giờ, hãy cấu hình nó với Avrdude, flash nó và xem điều gì sẽ xảy ra. Mã chúng tôi sẽ sử dụng là-
avrdude -c usbasp -p m328P -U lfuse: w: 0x62: m -U hfuse: w: 0xd9: m -U efuse: w: 0xff: m
Khi tôi làm điều này, bạn sẽ thấy đèn LED sẽ nhấp nháy cực kỳ chậm bởi vì chúng tôi đã tính toán và lập trình giá trị cho đồng hồ 16Mhz và bây giờ sau khi đốt cháy các cầu chì, nó chỉ là bộ dao động RC bên trong 1Mhz. Đây là lý do tại sao đèn LED nhấp nháy rất chậm. Bây giờ chúng ta hãy thử tải lên bản phác thảo một lần nữa. Chúng ta sẽ thấy rằng Arduino báo lỗi và mã không được tải lên. Bởi vì bằng cách thay đổi các cầu chì, chúng tôi cũng đã làm rối cài đặt bộ nạp khởi động. Bạn có thể thấy điều đó trong hình ảnh dưới đây.
Để khắc phục điều này và đưa Arduino trở lại như trước, chúng ta chỉ cần ghi lại bộ nạp khởi động cho Arduino. Để làm điều đó, hãy truy cập Công cụ -> Lập trình viên- USBasp , và khi chúng ta làm điều đó, chúng ta có thể lại vào công cụ và chúng ta có thể nhấp vào tùy chọn ghi bộ nạp khởi động. Thao tác này sẽ ghi lại bộ nạp khởi động gốc trên Arduino của bạn và mọi thứ sẽ trở lại như trước.
Sau khi bộ nạp khởi động được flash trở lại Arduino, nó trở lại trạng thái ban đầu và hình ảnh cuối cùng hiển thị cho bạn một đèn LED nhấp nháy sau khi bộ nạp khởi động được ghi lại.
Và điều này đánh dấu sự kết thúc của bài viết này. Tôi hy vọng bạn thích bài viết và học được điều gì đó mới. Nếu có bất kỳ câu hỏi nào liên quan đến bài viết, đừng ngần ngại đặt bình luận bên dưới.