본문 바로가기

AVR(ATmega128)로 장난하기

AVR(ATmaga128) 기초지식(6)_시스템 클록과 슬립 모드


1. 클록 분배


  [그림1]에 보여진 것처럼 ATmega128은 다양한 소스에 의해 클록을 발생시키고 분배가 가능하다. 또한 내부의 각 부분은 모두 동시에 클록이 필요치 않아 소비 전력을 절약시키기 위해 개별적으로 공급을 차단할 수도 있다.


● CPU 클록(clkcpu ) : 범용레지스터, 상태레지스터, 데이터 메모리와 같은 AVR 핵심적인 동작과 관련된 클록으로 공급을 차단하면 이들의 동작을 멈추게 한다.

● I/O 클록(clkI/O ) : 타이머, SPI, USART 등 I/O모듈 대부분에서 사용되는 클록이다. 외부인터럽트 모듈에서도 사용되나 일부 외부인터럽트는 I/O 클록의 공급이 차단되어도 인터럽트 처리가 된다.

● 플래쉬 클록(clkFLASH ) : 플래쉬롬과의 인터페이스를 제어하며 보통 CPU 클록과 동시에 사용된다.

● 비동기 타이머 클록(clkASY) : 외부 32kHz 수정 발진기를 소스로 하는 비동기 타이머용 클록이다.

● AD변환기 클록(clkADC) : AD변환기용의 클록으로 CPU와 I/O클록을 정지시키고 AD변환을 이루어지도록 하여 노이즈를 줄일 수 있도록 한다.


그림1 ATmega128의 클록 분배


2. 클록 발생과 선택


5가지의 클록발생원이 존재하며 CKSEL3~0와 SUT1~0, XDIV레지스터를 이용하여 클록발생원과 주파수를 설정한다.


(1) 내부 RC(디폴트 클록)발진기


● XTAL1, XTAL2 단자의 연결 : 내부 발진기를 사용하므로 XTAL1, XTAL2에는 아무 것도 연결하지 않는다.

● CKOPT의 설정 : 퓨즈 하이 바이트의 비트4 CKOPT를 1로 설정해야 한다.

● CKSEL3~0의 설정 : 퓨즈 로우 바이트의 비트3~0(CKSEL3~0)의 값들을 0001로 하면 1MHz, 0010으로 하면 2MHz, 0011로 하면 4MHz, 0100으로 하면 8MHz의 클록을 사용한다. 디폴트 상태로는 0001의 값을 갖고 있어 디폴트 상태로는 1MHz의 내부 RC발진기를 통한 클록을 사용하도록 설정되어 있다.

 SUT1~0의 설정 : 퓨즈 로우 바이트의 비트5~4(SUT1~0)의 값들을 11로 설정하는 것은 유보되어 있고 나머지 값들(00,01,10)으로 하면 기동시간이 6클럭으로 설정된다. 또한 00로의 설정은 BOD(Brown Out Detector)사용에 권장되고, 01로 하면 리셋의 경우 추가적으로 4.1 ms의 지연이 발생하고 Fast rising power 사용에 권장되고, 10로 하면 리셋의 경우 추가적으로 65ms의 지연이 발생하고 slowly rising power 사용에 권장된다.

 내부 발진기를 통해 발생되는 클럭은 주파수가 부정확하므로 확장된 I/O레지스터인 OSCCAL(OSCillator CALibration)레지스터를 조정해서 사용한다. OSCCAL의 값이 0x00이면 CKSEL3~0으로 설정한 값의50%~100%의 주파수값이 클록으로 사용되며, 0x7F이면 75%~150%, 0xFF이면 100%~200%의 주파수값이 클

록으로 사용된다.


(2) 외부 RC 발진기


 XTAL1, XTAL2 단자의 연결 : [그림2]와 같이 연결하고 커패시터의 값은 적어도 22pF 이상으로 한다.

[그림2] 외부 RC 발진기의 연결


 발진주파수 : 클럭의 주파수 값은 f = 1/3RC 로 결정된다.

 CKOPT의 설정 : 0으로 설정하면 내부의 36pF 커패시터가 사용되므로 [그림6]의 커패시터 C를 연결하면 안된다.

 CKSEL3~0의 설정 : 아래 표 참조

그림3 외부 RC 발진기의 연결

 SUT1~0의 설정 : 아래 표 참조.

그림4 외부 RC 발진기의 기동시간 선택


(3) 외부 수정발진기


XTAL1, XTAL2에 수정이나 세라믹 resonator를 연결하여 사용하는 경우이다.

 XTAL1, XTAL2 단자의 연결 : [그림5]와 같이 연결하고 커패시터의 값은 [그림6]을 참조한다.

[그림 5] 외부 수정 발전기의 연결


 CKOPT의 설정 : 아래 표 참조

[그림 6] 외부 수정 발진기 동작 모드


 CKSEL3~0의 설정 : [그림6]과 [그림7] 참조

[그림 7] 수정발진기의 기동시간 선택


 ● SUT1~0의 설정 : [그림 7]참조.


(4) 저주파 수정 발진기


XTAL1, XTAL2에 저주파수 수정을 연결하여 사용하는 경우이다.

 XTAL1, XTAL2 단자의 연결 : [그림 5]와 같이 연결하고 수정은 32.768kHz를 사용한다.

 CKOPT의 설정 : 0으로 설정하면 내부의 36pF 커패시터가 사용되므로 [그림 2]의 커패시터들을 연결하면 안 된다.

 CKSEL3~0의 설정 : 1001로 설정한다.

 SUT1~0의 설정 : [그림 7]참조.

[그림 7] 저주파수정발진기의 기동시간 선택


(5) 외부 클록


 XTAL1, XTAL2 단자의 연결 : 외부의 클럭 신호를 XTAL1 단자에 연결하고 XTAL2단자는 비워둔다.

 CKOPT의 설정 : 0으로 설정하면 내부의 36pF 커패시터가 사용된다.

 CKSEL3~0의 설정 : 0000으로 설정한다.

 SUT1~0의 설정 : 퓨즈 로우 바이트의 비트5~4(SUT1~0)의 값들을 11로 설정하는 것은 유보되어 있고 나머지 값들(00,01,10)으로 하면 기동시간이 6클럭으로 설정된다. 또한 00로의 설정은 BOD(Brown Out Detector)

사용에 권장되고, 01로 하면 리셋의 경우 추가적으로 4.1 ms의 지연이 발생하고 Fast rising power 사용에 권장되고, 10로 하면 리셋의 경우 추가적으로 65ms의 지연이 발생하고 slowly rising power 사용에 권장된다.

 유의점 : 클럭 주파수가 2%이상 변동하면 시스템의 동작이 불안정해지므로 변동이 없도록 해야 한다.


(6) XDIV레지스터를 이용한 클럭 주파수 조정


XDIV(Xtal DIVide)레지스터를 이용하여 클럭 발생원을 2~129로 분주한 주파수값을 시스템 클럭으로 사용할 수 있도록 설정할 수 있다.

 BIT7(XDIVEN:Xtal DIVide ENable) : 1로 설정되면 클럭발생원의 주파수 값(clk)을 XDIV6~0의 값으로 설정한 d값을 이용하여 다음의 공식에 따라 모든 클럭의 주파수값(f)으로 설정한다.

f = clk / (129-d)

 BIT6~0(XDIV6~0) : 클럭 주파수의 분주비를 설정한다.


3. Sleep 모드


  전원을 절약할 수 있는 6가지의 다양한 슬립모드가 제공된다. MCUCR 레지스터를 설정하여 모드를 선택하고 SLEEP명령을 실행하여 슬립모드에 돌입하도록 한다.


(1) MCUCR레지스터를 이용한 모드 설정


MCUCR(MCU Control Register)의 비트5(SE), 비트4,3,2(SM1,SM0,SM2)를 이용해 모드를 설정한다.

 BIT5(SE:Sleep Enable) : 디폴트는 0으로 1로 세트되면 SLEEP 명령시 슬립모드의 돌입이 허용한다.

 BIt4,3,2(SM1,SM0,SM2) : [그림 8]과 같은 형태로 값을 조절하여 모드를 설정할 수 있다.

[그림 8] 슬립모드의 설정

(2) Idle모드

CPU의 동작은 멈추지만 SPI, USART, 아날로그 비교기, ADC, TWI, 타이머, 워치독, 인터럽트의 동작은 유지된다. clkCPU, clkFLASH 클럭은 차단되지만 나머지 클럭은 공급된다.


(3) ADC noise reduction 모드

CPU의 동작은 멈추지만 ADC, TWI, 타이머0, 워치독, 인터럽트의 동작은 유지된다. clkCPU, clkFLASH, clkI/O 클럭은 차단되지만 나머지 클럭은 공급된다. ADC가 잡음에 영향을 덜받아서 정밀하게 동작할 수 있도록 하는 모드로 ADC의 동작이 활성화된 경우 ADC noise reduction모드로의 돌입은 ADC 변환이 자동으로 시작된다.


(4) Power-down 모드

외부 수정 발진기 또는 세라믹 resonator의 동작이 정지되며 TWI, 워치독, 인터럽트의 동작은 유지된다. 모든 클럭이 차단되어 비동기 모듈의 동작만이 가능하다. 이 모드가 해제될 때는 클럭이 안정적으로 되기 위해 충분한 여유 기동시간이 필요한데 이를 사용자가 지정할 수 있다.


(5) Power-save 모드

Power-down모드와 유사하나 ASSR 레지스터의 AS0비트를 1로 설정하여 타이머0을 TOSC1, TOSC2 단자로 입력되는 외부 클럭에 의하여 비동기로 동작시킬 때 사용하는 것이 다른 점이다. clkASY 클럭을 제외한 모든 클럭이 차단된다.


(6) Standby 모드

외부 수정 발진기 또는 세라믹 resonator을 클럭 발생원으로 한 경우에만 가능한 슬립모드로 Power-down모드 와 유사하나 발진기가 동작하는 것이 다르다. 해제되어 정상동작이 개시되는데 6개의 클럭 사이클만이 소요된다.


(7) Extended Standby 모드

외부 수정 발진기 또는 세라믹 resonator을 클럭 발생원으로 한 경우에만 가능한 슬립모드로 Power-save모드와 유사하나 발진기가 동작하는 것이 다르다. 해제되어 정상동작이 개시되는데 6개의 클럭 사이클만이 소요된다.

[그림9] 슬립모드의 동작 요약


(8) 슬립모드의 동작 요약

 동작 : MCUCR의 SE를 1로 세트하고 SM2~0을 그림 21에 따라 모드를 설정하고 SLEEP명령어를 실행 시킨다. 6개의 동작모드 Idle, ADC noise reduction, Power-down, Power-save, Standby, Extended Standby 동작 요약은 [그림 9]에 주어졌다.

 인터럽트에 의한 해제 : 슬립모드안에서 인터럽트를 만나면 MCU가 동작을 시작하고 슬립모드가 해제되는데 기동시간 이외에 4사이클이 더 경과한 후에 동작이 개시되고 인터럽트 서비스를 다 실행하고 슬립모드에 돌입하도록 한 이전의 SLEEP 명령의 바로 뒤에 이어지는 명령으로 복귀된다. 해제된 모든 레지스터와 메모리에 있는

내용은 슬립모드 이전의 값이 보존된다.

 리셋에 의한 해제 : 슬립모드에서 리셋이 발생하면 슬립모드가 해제되고 리셋동작이 수행된다.