락 비트 (lock bit)
ATmega8(A)는 6개의 락 비트 (lock bit)가 있다. 락 비트은 플래시롬과 EEPROM을 다시 프로그램할 수 없도록 잠그는데 사용된다. 따라서 제품의 개발이 끝난 다음 다시 프로그램을 변경할 필요가 없거나, 혹은 외부인이 AVR내부의 프로그램을 읽어낼 수 없도록 막기 위해서 사용한다. 주의할 점은 ‘1’이 unprogrammed 이고 ‘0’이 programmed 이라는 것이다. 흔히 반대로 생각하기 쉬우니 주의해야 한다. (이것은 fuse byte에서도 동일하다.)
[표 1] 락 비트
Lock bits | bit | 기술 | 기본 설정 값 |
| 7 | - | 1(unprogrammed) |
| 6 | - | 1(unprogrammed) |
BLB12 | 5 | Boot lock bit 12 | 1(unprogrammed) |
BLB11 | 4 | Boot lock bit 11 | 1(unprogrammed) |
BLB02 | 3 | Boot lock bit 02 | 1(unprogrammed) |
BLB01 | 2 | Boot lock bit 01 | 1(unprogrammed) |
LB2 | 1 | Lock bit 2 | 1(unprogrammed) |
LB1 | 0 | Lock bit 1 | 1(unprogrammed) |
[표 2] 락 비트 설정
memory lock bit | 기능설명 |
LB모드 | LB2 | LB1 | |
1 | 1 | 1 | 아무런 제한 없음 |
2 | 1 | 0 | 플래시/EEPROM/퓨즈비트 프로그램 금지. (Fuse byte도 잠김) |
3 | 0 | 0 | 플래시/EEPROM/퓨즈비트 프로그램 및 확인(verify) 금지. (Fuse byte도 잠김) |
memory lock bit | 기능설명 |
BLB0모드 | BLB02 | BLB01 | |
1 | 1 | 1 | 아무런 제한 없음 |
4 | 0 | 1 | boot loader의 LPM명령이 application section을 읽기 불가. 인터럽트벡터가 boot loader에 있다면 application section 실행 중 인터럽트 불가. |
3 | 0 | 0 | SPM으로 application section에 쓰기 불가. boot loader의 LPM명령이 application section을 읽기 불가, 인터럽트벡터가 boot loader에 있다면 application section 실행중 인터럽트 불가 |
2 | 1 | 0 | SPM으로 application section에 쓰기 불가 |
memory lock bit | 기능설명 |
BLB1모드 | BLB12 | BLB11 | |
1 | 1 | 1 | 아무런 제한 없음 |
4 | 0 | 1 | application section에 위치한 LPM명령으로 부트로더 영영의 읽기 불가, 인터럽트벡터가 application section에 있다면 boot loader 실행 중 인터럽트 불가 |
3 | 0 | 0 | SPM으로 부트로더 영역에 쓰기 불가. application section 에 위치한 LPM명령이 부트로더 영역을 읽기 불가, 인터럽트벡터가 application section에 있다면 boot loader 실행 중 인터럽트 불가 |
2 | 1 | 0 | SPM으로 부트로더 영역에 쓰기 불가 |
락비트를 프로그램하면 퓨즈바이트가 잠기기 때문에 반드시 퓨즈 바이트를 먼저 프로그램 한 다음에 필요하다면 락비트를 프로그램해야 한다.
퓨즈 바이트 (fuse byte)
퓨즈 바이트는 AVR을 동작시키는데 있어서 전반적으로 설정해야 할 사항들을 선택하여 저장하는 내부메모리로서 ATmega8(A)의 경우에는 두 개의 바이트로 구성되어 있다. 각각의 퓨즈비트는 1 또는 0값을 가지게끔 설정할 수 있는데 한 가지 유의할 점은 datasheet상에서 사용하는 용어가 0으로 쓰는 경우를 programmed, 1로 쓰는 경우가 unprogrammed로 되어있다는 점이다. 보통은 반대로 생각하기 쉬우니 유의해야 한다.
상위 퓨즈 바이트와 하위 퓨즈 바이트와 각각의 비트의 기능을 다음 표에 정리해 놓았다.
[표 3] 상위 퓨즈 바이트 기능
비트명 | bit | 기능 | 기본설정값 |
RSTDISBL (4) | 7 | PB6핀을 RESET으로 사용할 것인지 포트핀으로 사용할 것인지 설정 | 1(PB6는 리셋핀) |
WDTON | 6 | Watch Dog Timer 사용 | 1(사용 안함) |
SPIEN (1) | 5 | SPI통신으로 ISP 가능 | 0(SPI 다운로드 가능) |
CKOPT (2) | 4 | 오실레이터 옵션 | 1(unprogrammed) |
EESAVE | 3 | 칩erase 수행시에 EEPROM의 내용 유지 | 1 (EEPROM도 지움) |
BOOTSZ1 | 2 | 부트 사이즈 설정 | 0 (3) |
BOOTSZ0 | 1 | 부트 사이즈 설정 | 0 (3) |
BOOTRST | 0 | 리셋벡터 설정 | 1 |
(1) 직렬통신 모드에서는 이 비트는 접근 불가임. (2) CKOPT 비트는 CKSEL3:0 의 설정에 따라 그 기능이 달라짐. (3) 기본설정값으로는 부트섹터가 최대로 설정된 것임. (4) 이 비트가 0(programmed)이면 병렬프로그램 모드를 사용해야 함. |
시중에 쉽게 구할 수 있는 ISP 기기들은 SPI 통신(직렬통신임)을 사용하고 있고 이러한 직렬 통신 프로그래밍은 리셋 모드일 때 진입할 수 있으며 리셋 핀이 하이(1)일 때 다운로드를 수행하므로 필수적으로 리셋 핀의 기능이 있어야 한다. 따라서 RSTDISBL 비트는 만약 직렬 통신 프로그래머를 사용한다면 1값을 계속 유지해야하며 만약 (실수로라도) 0으로 설정하면 그 다음부터는 SPI를 이용한 프로그래밍이 불가능해진다는 것에 유의하자.
워치독타이머(watch dog timer, WDT)라는 것은 uC가 예측 불가능한 외부요인(외부 잡음, 온도, 배터리의 소모 등등)으로 인해서 정상적인 동작을 수행하고 있는지 아닌 지를 감시하는 기능을 수행한다. 만약 WDT가 활성화 되어 있다면 여기에서 주기적으로 어떤 신호가 발생하게끔 되어 있으며 따라서 이 신호가 정상적으로 발생한다면 uC가 정상적으로 동작하는 것으로 판단하게 된다. 만약 어떤 요인에 의해서 uC가 오동작을 하게 되면 WDT에서 발생하던 신호가 끊기게 되고 이러한 경우에는 uC를 리셋시키거나 어떤 조치를 취하여 프로그램이 다시 정상적으로 수행하도록 할 수 있는 것이다. WDTON비트는 이러한 시스템 감시기능의 활성화 여부를 설정하는 비트이다.
SPIEN비트는 직렬통신모드로 ISP를 사용한다면 아예 접근할 수 없도록 막아져있다.
플래시메모리는 크게 응용프로그램영역과 부트로더영역으로 나뉜다는 것은 앞에서도 설명했었다. 부트로더 영역의 크기를 BOOTSZ1:0 비트를 이용해서 설정할 수 있으며 각각의 경우에 대해서 부트로더의 크기는 다음 그림과 같다.
그리고 BOOTRST비트는 리셋이 걸린 이후 맨 첨음 실행을 시작하는 번지가 응용프로그램의 최하위번지(0번지)인지 부트로더의 최하위번지(이경우는 BOOTSZ1:0의 설정에 따라 달라짐)를 설정하는 비트이다.
[표 4] 부트로더 사이즈 설정
BOOTSZ1 | BOOTSZ0 | 사이즈 | 페이지 | 응용프로그램영역 | 부트로더영역 |
1 | 1 | 128 word | 4 | 0x000~0xF7F | 0xF80~0xFFF |
1 | 0 | 256 word | 8 | 0x000~0xEFF | 0xF00~0xFFF |
0 | 1 | 512 word | 16 | 0x000~0xDFF | 0xE00~0xFFF |
0 | 0 | 1024 word | 32 | 0x000~0xBFF | 0xC00~0xFFF |
하위 퓨즈바이트는 크게 클럭소스선택, 기동시간 설정, 그리고 BOD관련 설정 비트들로 이루어져 있다. BOD(brown out detector)는 시스템의 전원전압이 일정레벨 이하로 떨어지는 지를 감시하는 장치이다. 건전지나 충전지로 구동되는 시스템의 경우에는 시간이 지나면 정상 전압 이하로 떨어지고 방치하면 전체 시스템이 오동작을 일으킬 수 있으므로 그 전에 이것을 감지하여 적절한 조치를 취하도록 할 수있다. BODEN은 이러한 감시기능을 활성화 시킬 것인지를 설정하는 비트이고 BODLEVEL은 전압레벨을 설정하는 비트이다.
[표 5] 하위 퓨즈 바이트의 기능
비트명 | 비트 번호 | 기능 | 내정값 |
BODLEVEL | 7 | Brown Out Detector Tirgger Level | 1 |
BODEN | 6 | Brown Out Detector enable | 1(BOD disabled) |
SUT1 | 5 | 기동 시간(start-up time) 설정 | 1(unprogrammed) |
SUT0 | 4 | 0(programmed) |
CKSEL3 | 3 | 클럭 소스 선택 (clock selection) | 0(programmed) |
CKSEL2 | 2 | 0(programmed) |
CKSEL1 | 1 | 0(programmed) |
CKSEL0 | 0 | 1(unprogrammed) |
클럭 소스 선택 비트 CKSEL3:0과 기동 시간 설정 비트 SUT1:0에 대해서는 다음 포스트에서 상세히 설명하도록 하겠다.