이 튜토리얼에서는 퓨즈에 대해 이야기 할 것입니다. 대학에 다닐 때 전자 공학의 모든 멋진 것들에 대해 배웠을 때 처음으로 AVR에서 퓨즈라는 용어를 들었습니다. 주제에 대한 초기 생각은 오! AVR 내부에 뭔가 잘못하면 날아갈 무언가가 있습니다. 그 당시에는 인터넷에서 사용할 수있는 리소스가 많지 않았습니다. 이 퓨즈 가 AVR 마이크로 컨트롤러 내부의 일부 특수 비트를 참조한다는 것을 알아 내기 위해 꽤 많이 검색했습니다. 이 비트는 AVR 내부의 작은 스위치와 같으며이를 켜거나 끄면 AVR의 일부 특수 기능을 켜거나 끌 수 있습니다. 켜고 끄는 것은 설정 및 재설정을 의미합니다.
이 기회를 빌어 AVR 의 퓨즈 비트에 대한 모든 것을 논의 할 것입니다. 간단하게하기 위해 인기있는 ATmega328P 마이크로 컨트롤러 를 수용하는 Arduino 보드의 예를 살펴 보겠습니다. 여기에서는 실제 응용 프로그램에서 실제로 유용한 이러한 기능 중 일부를 설정 및 해제하기 위해 이러한 퓨즈를 설정하는 방법을 배웁니다. 자, 바로 시작합시다.
이전 게시물에서 우리는 AVR 마이크로 컨트롤러가있는 인터페이싱 GSM 모듈 및 AVR 마이크로 컨트롤러가있는 인터페이싱 HC-05와 같은 많은 AVR 마이크로 컨트롤러 프로젝트를 구축했습니다. 해당 프로젝트에 대해 더 자세히 알고 싶다면 확인하세요.
AVR의 퓨즈는 무엇입니까-세부 설명
앞서 논의했듯이 마이크로 컨트롤러의 퓨즈는 AVR 마이크로 컨트롤러의 다양한 기능을 활성화 및 비활성화하기 위해 켜고 끌 수있는 작은 스위치와 같습니다. 이것이 우리의 다음 질문이 발생하는 부분입니다. 그렇다면 이러한 퓨즈를 어떻게 설정하거나 재설정합니까? 이 질문에 대한 답은 간단합니다. 퓨즈 레지스터를 사용하여 수행합니다.
ATmega328P IC에는 총 19 개의 퓨즈 비트가 있으며 3 개의 퓨즈 바이트로 나뉩니다. 이들은 "확장 퓨즈 바이트", "높은 퓨즈 바이트" 및 "낮은 퓨즈 바이트"로 정의됩니다.
ATmega328 / P 데이터 시트 Rev: 7810D–AVR–01 / 15의 표 -27을 보면 퓨즈 비트에 대한 모든 세부 정보를 확인할 수 있습니다. 그러나 아래 이미지는 데이터 시트의 퓨즈 비트 섹션에 대한 더 나은 아이디어를 제공합니다.
이제 퓨즈 비트에 대해 조금 배웠으므로 데이터 시트를 살펴보고이 IC에 대해 필요한 모든 세부 정보를 찾아 보겠습니다.
확장 퓨즈 비트:
퓨즈 비트 탭을 클릭하고 조금 아래로 스크롤하면 일반적으로 " EFUSE" 로 알려진 "확장 퓨즈 바이트"에 대한 표를 보여주는 표 27-5를 찾을 수 있습니다. 아래 이미지는 정확히 그것을 보여줍니다.
이 테이블에는 사용 가능한 비트가 3 개만 있고 나머지 3 개는 예약되어 있습니다. 이 세 비트는 브라운 아웃 감지 수준을 다룹니다. Note에서 볼 수 있듯이 표 28-5를 보면 이에 대한 자세한 내용을 찾을 수 있습니다.
위의 표에서 볼 수 있듯이 브라운 아웃 감지에 대한 표가 있습니다. 브라운 아웃 감지는 공급 전압이 특정 전압 수준 아래로 떨어질 때 마이크로 컨트롤러를 재설정하는 기능입니다. ATmega328P IC에서 브라운 아웃 감지를 완전히 비활성화하거나 위 표에 표시된 수준으로 설정할 수 있습니다.
높은 퓨즈 바이트:
아래 이미지에서 볼 수 있듯이 데이터 시트의 표 27-6: ATmega328P IC의 더 높은 퓨즈 비트를 보여줍니다.
높은 퓨즈 ATmega328 마이크로 컨트롤러 내부의 다양한 작업을 처리. 이 섹션에서는 더 높은 퓨즈 비트와 그 작동에 대해 설명합니다. BOOTRST, BOOTSZ0 및 BOOTSZ1 비트부터 시작하겠습니다. 이 세 비트는 부팅 크기 를 설정합니다. 부팅 크기는 부트 로더 설치를 위해 예약 된 메모리 양을 나타냅니다 .
부트 로더는 마이크로 컨트롤러 위에서 실행되고 다양한 작업을 관리하는 특별한 소프트웨어입니다. 그러나 Arduino의 경우 부트 로더는 마이크로 컨트롤러 내부의 Arduino 스케치를 업로드하는 데 사용됩니다. 이전 기사 중 하나에서 Arduino를 사용하여 ATmega328P에서 부트 로더를 굽는 방법을 보여주었습니다. 주제에 관심이 있으면 확인할 수 있습니다. 우리의 주제로 돌아와서, 상위 바이트의 다른 비트의 목적은 상당히 명확 해졌습니다. EESAVE 비트는 칩 삭제주기가 수행되는 동안 EEPROM 메모리를 보존하는 것입니다. WDTON 비트는 Watchdog Timer 를 활성화 또는 비활성화하는 것 입니다.
워치 독 타이머는 ATmega328P IC의 특수 타이머로, 별도의 클록이 있고 독립적으로 실행됩니다. 워치 독 타이머가 활성화 된 경우 일정 기간 동안 삭제해야합니다. 그렇지 않으면 워치 독 타이머가 마이크로 컨트롤러를 재설정합니다. 이것은 프로세서가 멈춘 경우 많은 마이크로 컨트롤러에서 제공되는 유용한 기능입니다. 워치 독은 최종 애플리케이션에 대한 손상을 방지하기 위해이를 재설정합니다.
DWEN 비트는 디버그 와이어 를 활성화하는 데 있습니다. 이것은 프로세서를 프로그래밍하고 디버그하는 데 사용되는 하드웨어 내부에 내장 된 준비 프로토콜입니다. 이 기능을 활성화하면 단일 와이어를 연결하여 프로세서를 플래시하고 디버깅 할 수 있습니다. 그러나 그것을 사용하려면 Atmel을 준비하는 특수 하드웨어가 필요합니다.
나머지 두 비트는 수행중인 작업을 정확히 알지 못하는 경우 피해야하는 비트입니다. 이들은 RSTDISBL 비트 -7 및 SPIEN 비트 -5입니다. 이름에서 알 수 있듯이 RSTDISBL (외부 리셋 비활성화)은 외부 하드웨어 리셋 핀을 비활성화하고 SPIEN 비트는 SPI 프로그래밍 인터페이스를 비활성화하는 데 사용됩니다. 이 두 비트 중 하나를 비활성화하면 AVR이 완전히 차단 될 수 있습니다. 그래서 그들을 내버려 두는 것이 좋은 생각입니다.
낮은 퓨즈 바이트:
아래 이미지에서 볼 수 있듯이 데이터 시트의 표 27-7은 ATmega328P IC의 하위 퓨즈 비트를 보여줍니다.
이 퓨즈 바이트는 AVR 내부의 클럭 소스 및 기타 클럭 매개 변수를 설정하는 역할을합니다. 이 섹션에서 우리는 모든 것에 대해 배울 것입니다.
7 번째 비트 또는 CKDIV8 플래그는 클럭 소스를 8로 나누도록 설정할 수 있습니다. 이것은 AVR을 직접 프로그래밍 해 본 적이있는 경우 이미 알고있을 수있는 매우 편리합니다. 다음 비트는 CKOUT 비트이며 로우 퓨즈 바이트의 6 번째 비트입니다. 프로그래밍하면 마이크로 컨트롤러의 PORTB0에 내부 클록 신호가 출력됩니다.
비트 -5 및 비트 -4 SUT1 및 SUT0은 마이크로 컨트롤러의 시작 시간을 제어합니다. 이는 공급 전압이 허용 가능한 최소 임계 전압 레벨에 도달하기 전에 발생하거나 발생하지 않을 수있는 시작 작업을 방지합니다. 마지막 4 개의 CKSEL0-4 비트는 마이크로 컨트롤러의 클럭 소스를 선택하는 데 사용됩니다. 아래 표는 클럭 소스 설정을 담당하는이 4 비트에 대한 이해를 제공합니다.이 표는 데이터 시트의 클럭 소스 섹션에서 찾을 수 있습니다.
이제 더 나아 가기 전에, 제가 살펴 봐야 할 것이 하나 더 있습니다. 오실레이터 시작 지연 테이블입니다. 시작 지연에 따라 하단 퓨즈 바이트의 비트 4와 5를 참조합니다. 지연은 회로가 작동하는 조건과 사용중인 발진기 유형에 따라 설정해야합니다. 기본값은 전원 공급 또는 전원 차단 시퀀스가 수행 될 때 6 클럭 사이클로 전력 상승을 느리게 설정합니다. 다음으로, 시작 후 65Ms의 지연과 함께 14 클럭 사이클의 또 다른 지연이 있습니다.
휴! 그것은 소화해야 할 많은 정보였습니다. 그러나 더 진행하기 전에이 섹션을 빠른 메모로 끝내겠습니다.
노트:
데이터 시트를주의 깊게 살펴 보셨다면, 퓨즈 비트를 프로그래밍하는 것은 포트를 높게 또는 낮게 만들기 위해 일반적으로 수행하는 작업과 반대 인 0 (영)을 낮게 설정하는 것을 의미합니다. 퓨즈를 구성하는 동안이를 염두에 두어야합니다.
Arduino의 퓨즈 비트
위 섹션에서 퓨즈에 대해 많이 이야기했지만이 섹션에서는 퓨즈를 구성하는 방법과 마이크로 컨트롤러에서 퓨즈를 작성하는 방법에 대해 이야기하겠습니다. 이를 위해서는 Avrdude 라는 도구가 필요합니다 . AVR 마이크로 컨트롤러에서 메모리를 읽고, 쓰고, 수정하는 데 사용할 수있는 도구입니다. SPI와 함께 작동하며 다양한 유형의 프로그래머를 지원하는 긴 목록이 있습니다. 아래 링크에서 도구를 다운로드 할 수 있습니다. 또한 우리가 가장 좋아하는 마이크로 컨트롤러 Arduino를 사용할 것입니다.
- Avrdude 버전 6.3 Windows-ming32 다운로드
이제 Avrdude가 있으므로 압축을 풀고 해당 폴더에서 명령 창을 열어야합니다. 또한 나중에 사용할 계획이라면 Windows 환경 변수 섹션에 폴더 경로를 추가 할 수 있습니다. 그러나 나는 그것을 내 데스크탑에 놓고 거기에서 명령 창을 열 것입니다. 이 작업을 마치면 USBasp 프로그래머 를 PC에 연결하고 USBasp 프로그래머 를위한 적절한 드라이버가 있는지 확인합니다. 일단 그렇게했다면, 우리는 가셔서 기본 퓨즈 값을 먼저 읽을 것입니다. 이렇게하려면 다음 명령을 실행해야합니다.
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
모든 것이 올 바르면이 명령은 퓨즈 바이트를 읽고 세 개의 개별 텍스트 파일에 넣습니다. 아래 이미지는 프로세스에 대한 더 나은 아이디어를 제공합니다.
보시다시피 Avrdude는 Arduino nano의 퓨즈 비트를 읽고 세 개의 개별 텍스트 파일에 저장했습니다. 이제 우리는 그것들을 열고 세 가지 값을 얻었습니다. 대한 에서부터 0xFD: 퓨즈 에 대한 HFUSE: 0XDA, 대한 LFUSE: 0xFF를. 이것은 우리가 Arduino nano에 대해 얻은 기본 퓨즈 값입니다. 이제이 비트를 바이너리로 변환하고 데이터 시트의 기본값과 비교해 보겠습니다. 아래 표는이를 정확히 보여줍니다.
편의를 위해 퓨즈 비트는 16 진수 값으로 작성되지만 이진 값으로 변환하고 데이터 시트와 비교하면 무슨 일이 일어나는지 알 수 있습니다. Lower Fuse Byte부터 시작하겠습니다. 위의 문자열에서 알 수 있듯이 0XFF 로 설정되고 바이너리 값은 0B11111111이됩니다.
Arduino와 Stock Lower Fuse Bytes 비교:
낮은 퓨즈 바이트 |
비트 번호 |
AVR의 기본값 |
Arduino의 기본값 |
CKDIV8 |
7 |
0 (프로그래밍 됨) |
1 (프로그래밍되지 않음) |
CKOUT |
6 |
1 (프로그래밍되지 않음) |
1 (프로그래밍되지 않음) |
SUT1 |
5 |
1 (프로그래밍되지 않음) |
1 (프로그래밍되지 않음) |
SUT0 |
4 |
0 (프로그래밍 됨) |
1 (프로그래밍되지 않음) |
CKSEL3 |
삼 |
0 (프로그래밍 됨) |
1 (프로그래밍되지 않음) |
CKSEL2 |
2 |
0 (프로그래밍 됨) |
1 (프로그래밍되지 않음) |
CKSEL1 |
1 |
1 (프로그래밍되지 않음) |
1 (프로그래밍되지 않음) |
CKSEL0 |
0 |
0 (프로그래밍 됨) |
1 (프로그래밍되지 않음) |
상위 퓨즈 바이트는 0B11011010 인 바이너리 에서 0XDA 로 설정됩니다 .
바이너리에서 더 높은 퓨즈 바이트:
높은 퓨즈 바이트 |
비트 번호 |
AVR의 기본값 |
Arduino의 기본값 |
RSTDISBL |
7 |
1 (프로그래밍되지 않음) |
1 (프로그래밍되지 않음) |
드웬 |
6 |
1 (프로그래밍되지 않음) |
1 (프로그래밍되지 않음) |
스피 엔 |
5 |
0 (프로그래밍 됨) |
0 (프로그래밍 됨) |
WDTON |
4 |
1 (프로그래밍되지 않음) |
1 (프로그래밍되지 않음) |
EESAVE |
삼 |
1 (프로그래밍되지 않음) |
1 (프로그래밍되지 않음) |
BOOTSZ1 |
2 |
0 (프로그래밍 됨) |
0 (프로그래밍 됨) |
BOOTSZ0 |
1 |
0 (프로그래밍 됨) |
1 (프로그래밍되지 않음) |
BOOTRST |
0 |
1 (프로그래밍되지 않음) |
0 (프로그래밍 됨)) |
확장 퓨즈 바이트에 대한 설정은 0XFD로 설정되며 이진수는 0B11111101입니다.
바이너리의 확장 퓨즈 바이트:
확장 퓨즈 바이트 |
비트 번호 |
AVR의 기본값 |
Arduino의 기본값 |
– |
7 |
1 |
1 |
– |
6 |
1 |
1 |
– |
5 |
1 |
1 |
– |
4 |
1 |
1 |
– |
삼 |
1 |
1 |
BODLEVEL2 |
2 |
1 (프로그래밍되지 않음) |
1 (프로그래밍되지 않음) |
BODLEVEL1 |
1 |
1 (프로그래밍되지 않음) |
0 (프로그래밍 됨) |
BODLEVEL0 |
0 |
1 (프로그래밍되지 않음) |
1 (프로그래밍되지 않음) |
이제이 섹션이 끝났습니다. 지금까지 우리는 AVR 마이크로 컨트롤러와 퓨즈 비트에 대해 많은 것을 배웠습니다. 따라서 Arduino Nano의 일부 퓨즈 비트를 변경하고 실험하여 이론을 테스트하여이 기사를 마무리하겠습니다.
AVR에서 퓨즈를 테스트하는 데 필요한 구성 요소
위의 부분에서 퓨즈에 대해 많이 이야기했습니다. 그러나 기사에서 더 진행하려면 하드웨어 구성 요소와 소프트웨어 도구가 필요합니다. 이 섹션에서는 이에 대해 설명합니다. 이미지가있는 필수 구성 요소 목록은 다음과 같습니다.
- 브레드 보드-1
- Arduino Nano-1
- USBasp AVR 프로그래머-1
- USB 케이블-1
- AVR 10 핀-6 핀 컨버터-1
- Avrdude (AVR 프로그래밍을위한 소프트웨어 도구)
- LED-1
- 330R 저항기-1
- 점퍼 케이블
AVR에서 퓨즈 비트 테스트를위한 회로도
하드웨어 테스트 설정은이 설정에서 아래에 표시됩니다. Arduino Nano를 USB 케이블로 PC에 연결했고 USBasp 프로그래머도 PC에 연결했습니다. 이 기사의 목적은 AVR에서 퓨즈 비트를 프로그래밍하는 것입니다. 그래서 우리는 USBasp 프로그래머와 Arduino를 연결했습니다. 아래 이미지는 설정에 대한 더 나은 아이디어를 제공합니다.
AVR에서 퓨즈 테스트
테스트 설정은 아래와 같습니다. 보시다시피 Arduino와 USBasp 프로그래머를 모두 내 노트북의 USB에 연결했습니다.
이제 Arduino IDE를 열고 기본 깜박임 스케치를 업로드하겠습니다. 기본 눈 깜박임 스케치의 내용은 자명하기 때문에 세부 사항을 입력하지 않았습니다.
비디오에서 13 번 핀의 LED가 정상적으로 깜박이는 것을 볼 수 있습니다. 이제 퓨즈 설정을 조정하고 기본값으로 설정하겠습니다. 이전에 데이터 시트에서 보았던 것처럼; 퓨즈는 0XFF이고; HFUSE는 D9입니다. LFUSE는 62입니다. 이제 Avrdude로 구성하고 플래시하고 어떤 일이 발생하는지 살펴 보겠습니다. 우리가 사용할 코드는
avrdude -c usbasp -p m328P -U lfuse: w: 0x62: m -U hfuse: w: 0xd9: m -U efuse: w: 0xff: m
이렇게하면 16Mhz 클럭의 값을 계산하고 프로그래밍했으며 이제 퓨즈를 태운 후에는 내부 RC 오실레이터가 1Mhz에 불과하기 때문에 LED가 매우 느리게 깜박이는 것을 볼 수 있습니다. 이것이 LED가 너무 느리게 깜박이는 이유입니다. 이제 다시 한 번 스케치를 업로드 해 봅시다. Arduino에서 오류가 발생하고 코드가 업로드되지 않는 것을 볼 수 있습니다. 퓨즈를 변경하여 부트 로더 설정도 엉망으로 만들었 기 때문입니다. 아래 이미지에서 볼 수 있습니다.
이 문제를 해결하고 Arduino를 이전과 같이 되돌리려면 Arduino에 대한 부트 로더를 다시 태워야합니다. 이를 위해 Tools-> Programmer- USBasp 로 이동 한 후 다시 도구로 이동하여 부트 로더 굽기 옵션을 클릭 할 수 있습니다. 이것은 다시 Arduino의 스톡 부트 로더를 태우고 모든 것이 이전과 같이 돌아갈 것입니다.
부트 로더가 Arduino로 다시 플래시 된 후 원래 상태로 돌아가고 마지막 이미지는 부트 로더가 다시 레코딩 된 후 깜박이는 LED를 보여줍니다.
그리고 이것으로이 기사가 끝났습니다. 기사를 즐겁게 읽고 새로운 것을 배웠기를 바랍니다. 기사에 대한 질문이 있으시면 주저하지 말고 아래에 의견을 남겨주세요.