본문 바로가기
AVR

[AVR] ATmega8 브레드 보드에서 사용하기 - 퓨즈Fuse 비트를 잘못 변경하면 생기는 일

by hseoy 2020. 6. 10.
반응형

[ATmega8 브레드 보드에서 사용하기 - 퓨즈Fuse 비트를 잘못 변경하면 생기는 일]

최근에 프로젝트를 하나 진행하고자 ATmega8 외 기타 주변회로를 구성하기 위한 부품 + 프로젝트 부품들을 구매했다.

ATmega8의 경우, 완성된 보드 가격이 12000원에 달하는 것에 비해 ATmega8-PU 칩 가격은 1700원밖에 하지 않는다. 여기서 주변회로에 사용한 부품들까지 합해도 절대 12000원이 되지 않을 것이다라는 계산을 했고, 직접 ATmega8 보드를 만들어서 사용하기로 했다. 

일단 브레드보드에서 ATmega8을 사용하기 위해 필요한 부품은 아래와 같다. 총 가격은 2080원으로 이는 가장 기본적인 것만 계산한 결과이다. 기타 전원부 회로라던가, 기타 등등을 추가하게 되면 더 늘어날 것이다. 하지만 이 글에서 다룰 내 경험기에서는 ATmega8을 사용하기 위해서 아래의 부품만 사용했다. 

- ATmega8-PU x 1 => 1700원

- X-TAL 16M (ATS Type) Fundamental x 1 => 190원

- 1/4W 1% Axial Resistor 103F(10K옴) x 2 => 40원

- KLT-1105AT(TACT 스위치) x 1 => 70원

- 3파이 원통평면 고휘도 반투명-녹색 LED x 1 => 50원

- Ceramic 20pF, 50V x 2 => 30원

먼저 내가 참고한 블로그의 링크를 공유하고자 한다. ATmega8에 주변회로를 구성하기 위한 회로도는 이 블로그를 참고하면 좋을 듯하다. 구성한 회로도의 경우 이와 거의 동일하니 따로 설명하지는 않도록 하겠다.

일단 아래는 브레드 보드에 위 회로를 구성하고, LED를 500ms마다 껐다 키는 테스트용 코드를 ATmega8에 업로드한 영상이다.

#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>


int main(void)
{
	DDRB = 0xFF;
	PORTB = 0x00;
	
	while (1)
	{
		PORTB = 0x01;
		_delay_ms(500);
		PORTB = 0x00;
		_delay_ms(500);
	}
}

 

그러면 이제 여기까지 오기까지의 여정을 소개하려고 한다. 일단 나는 ISP의 6핀 커넥터를 ATmega8에 알맞게 연결하는 데에서 막혔다. AVR ISP Mk2를 6핀 커넥터로 연결하여 사용하려고 하는 데 이 핀맵을 해석하는 데 있어 어려운 점이 있었다. 공식적으로 제공하는 6핀 커넥터에 대한 핀맵은 아래와 같다. 여기서 정확하게 아래 핀맵대로 선을 배선을 했음에도 계속해서 ISP를 사용하는 데 있어 오류가 발생했다. 그래서 AVR ISP Mk2의 내부를 까보게 되었고, 공식적으로 제공하는 핀맵은 커넥터를 연결하기 전 내부 핀을 기준으로 제공되고 있음을 알게 되었다. 다만 6핀 커넥터를 연결했을 때 커넥터 상에서는 어떻게 핀을 연결해야 할지 잘 몰랐다.

 

 

사실 처음에는 이 핀맵대로 했는 데 VCC로 보이는 핀과 GND로 보이는 핀을 이용해서 LED를 연결해봤는 데 켜지지 않았었다. 여기서 극성이 잘못되었을 것이라 생각하고 VCC로 보이는 핀과 GND로 보이는 핀을 거꾸로 연결했더니 정상적으로 LED가 켜졌다. 

나는 여기서 커넥터를 연결하는 과정에서 좌우가 바뀌었을 것이라 생각했고, 핀을 아래와 같이 좌우를 바꿔 재배치했다. 아래 사진에서 하단 검은색 사각형은 커넥터의 톡 튀어나온 부분을 의미한다. 

 

 

여기서 전원 연결 확인을 위한 녹색 LED가 켜지는 것을 보고 전원이 연결 되었을 거이라 생각했다. 그래서 위에서 작성한 샘플 코드를 Atmel Studio 7.0 IDE에서 빠르게 작성하고 업로드했는데 나오는 것은... 지우기 실패....

솔직히 말하겠다. 여기서 몇 시간은 소모한 듯하다. 몇 번을 회로를 분해하고 재구성하기를 여러번. 아침을 먹고 시작했던 일이 저녁을 먹을 때쯤에도 계속하고 있을 때쯤 이유를 알았다. 그 이유는 칩의 VCC와 GND에 AVR ISP의 VCC와 GND를 연결 안했었던 것이다. .... 나는 AVR ISP Mk2의 내부 점퍼핀을 연결해서 USB 전원을 연결해서 사용하고 있었는 데, 이때 브레드보드 상에서 빨간색과 파란색으로 보이는 부분에 USB 전원의 VCC와 GND를 연결했다. 그런데 이것을 다른 부분에는 전부 연결했는 데 칩의 VCC와 GND에는 연결하지 않았다. 이게 일단 실패한 이유였다.

 

 

이것까지 문제를 해결하고 나니 코드를 업로드하는 것이 가능해졌다. 그리고 나는 크리스탈을 16MHz짜리를 사용했기에 당연하게도 F_CPU의 값을 16000000UL로 설정해줬고, 나는 이상한 결과를 목격했다. 분명히 16MHz로  설정하고 delay값을 500ms만큼 설정했는데 체감상으로 delay 시간이 8초 정도 되는 결과가 나왔다. 왜 이런 것일까 고민하면서 F_CPU값을 0을 하나 뺀 1600000UL로 설정했다. 그랬더니 느낌상으로는 500ms 정도 나오는 듯했다. 하지만 나는 정확한 이유와 정확한 결과를 알고 싶어서 검색을 했고 그 이유를 알게 되었다. 

퓨즈 비트라는 게 있고, 이것이 기본적으로는 내부 클럭 1MHz를 사용하도록 설정되어 있다는 것이다. 그러니까 1600000UL, 1.6MHz로 설정했을 때 500ms 정도 나오는 듯한 느낌은 16MHz짜리 외부 크리스탈에서 오류가 발생해서 나온 결과가 아니라 내부 클럭 1MHz를 사용한 결과에서 받았다는 것이다.  결론만 말하자면 퓨즈 비트의 Low 비트를 바꿔줘야 했다. 외부 클럭을 사용할 수 있도록.

여기서 내 치명적인 실수가 발생했다. 퓨즈 비트의 값은 공장에서 나올 때 이미 정해져 있는 것이고 내 예상으로는 가능한 값이 있을 것인데, 이것을 변경할 때 ATmega328에서 외부 클럭을 사용하기 위해 퓨즈 비트를 변경하는 블로그를 보고 변경했고 그 결과 ATmega328에서는 올바른 값이지만 ATmega8에서는 오류가 발생하는 퓨즈 비트 값을 설정했고, 나는 하나의 ATmega8을 떠나보내야만 했다. 

검색을 해본 결과 살릴 수는 있지만 오실레이터 라는 부품을 사용해야 하고 이 부품의 가격은 1100원이였다. 칩 가격의 50%가 넘는 다는 점과 배송비만 2500원이라는 점에서 새로 칩을 쓰는 것이 낫다고 생각했고, 구매하면서 예비용으로 같이 구매한 ATmega8 칩을 쓰기로 했다. 

퓨즈 비트의 Low 비트는 0xE7로 바꿔서는 안된다. 0xEF가 올바른 값이다. 이게 중요하다..... 칩이 하나밖에 없다면 칩 가격 + 배송비라는 큰 비용이 추가적으로 지출될 것이며 시간은 3일이나 버려질 것이다... (퓨즈 비트 설정값에 대해서는 여기를 참고했다.)
※※퓨즈비트 설정값은 내 글을 믿지 말고 공식적인 메뉴얼에 따르기를 바란다.

 

 

추가적으로 이 퓨즈 비트를 변경하기 위해서는 Program을 클릭하면 되는 데 기본적으로 경고창이 발생하게 될 것이다. 이는 그 만큼 신중하게 변경해야 함을 의미하며 나처럼 1700원짜리 칩을 버리고 싶지 않다면 잘 생각하고 클릭하는 것을 권장한다.

칩을 변경하고 나니 정상적인 결과가 나오기 시작한다. 여기까지 왔다면 이제 ATmega8을 ATmega128처럼 데이터시트에 따라 사용하면 된다. 나는 기본적인 것만 구성시킨 이 회로에서 전원 회로 등을 추가하여 만능 기판에 납땜할 예정이다. 

반응형

댓글