'클럭'에 해당되는 글 2건

  1. 2015.06.04 ATmega8(A)의 클럭 소스 설정 (2)
  2. 2015.05.29 아두이노 TWI(I2C) 통신 클럭 주파수 변경하기

 클럭 신호(clock signal, 이하 clk)란 일정한 주기로 0/1을 단순 반복하는 톱니파 신호로서 이 신호에 AVR의 거의 모든 부분이 동기화되어 동작된다. 일반적으로 다음 그림과 같은 파형을 가지며 1(0)이 시작되는 지점부터 0(1)이 끝나는 지점까지를 한 주기라고 한다.


[그림 1] 클럭 신호


예를 들면 더하기 한 번하는데 클럭 하나가 소요되고, 곱셈 한 번에 네 개의 클럭 신호가 필요하다든가, 또는 클럭신호가 0에서 1로 변하는 순간 어떤 동작을 수행한다거나 하는 등 거의 모든 동작이 클럭 신호를 기준으로 수행되는 것이다. 마치 사람들이 시간이라는 기준에 의해서 생활이 되므로 시계를 자주 보면서 어떤 일을 수행하는 것과 유사하다. 당연한 이야기지만 클럭의 주파수가 높을수록 uC의 동작은 빨라질 것이고 주파수가 낮아지면 동작 속도도 떨어질 것이다. 보통 AVR에는 1MHz ~ 20MHz 주파수의 클럭이 사용되며 16MHz라면 한 주기 파형이 1초에 16x106 개가 발생한다.


 따라서 AVR을 동작시키려면 전원과 함께 반드시 인가하여야 하는 것이 이 클럭 신호이며 클릭 신호를 인가하기 위해서 XTAL1, XTAL2 핀이 사용된다. AVR은 보통 클럭 신호를 외부에서 인가하는 방법, 그리고 내부에서 발생시키는 방법으로 구분할 수 있다. 그리고 클럭 선택과 관련이 있는 퓨즈비트는 CKOPT,와 CKSEL0, CKSEL1,CKSEL2, CKSEL3이 있다.


[표 1] ATmega8(A)의 클럭 소스와 관련 퓨즈비트 설정

구분

클럭소스

주파수

CKOPT

CKSEL3:0

비고

내부

발생

내부 RC 오실레이터

1.0 MHz

1

0001 (a)

(b)

2.0 MHz

0010

4.0 MHz

0011

8.0 MHz

0100

외부

인가

외부 RC 오실레이터

0.1~0.9 MHz

X (c)

0101

0.9~3.0 MHz

0110

3.0~8.0 MHz

0111

8.9~12 MHz

1000

외부 저주파 크리스탈

32.768 KHz

X (c)

1001

32.768

KHz

외부 크리스탈/세라믹 레조네이터

0.4~0.9 MHz

1

101X

(d)

0.9~3.0 MHz

1

110X

12~22pF

3.0~8.0 MHz

1

111X

12~22pF

8.0≤ MHz

0 (e)

101X,110X,111X

12~22pF

외부 클럭

X (c)

0000

※ X는 0과 1 모두 사용가능하다는 의미임.

(a) 공장 출하시 기본값.

(b) 이 경우 CKOPT는 반드시 unprogrammed(1)이어야 한다.

(c) CKOPT=0(program)으로 설정하면 XTAL1과 XTAL2에 36pF의 내부 커패시터가 GND와 연결되므로 외부에서 이들을 따로 연결할 필요가 없음

(d) 이 옵션은 세라믹레조네이터에만 사용됨. (크리스탈은 이 옵션으로 사용불가)

(e) CKOPT가 0임에 주의할 것.

크리스탈오실레이터

 크리스탈 오실레이터는 클럭 인가시 가장 보편적으로 사용되는 소자이다.

[그림 1] 크리스털 오실레이터 사용 회로도


[표 1] 클리스털 오실레이터 설정

CKSEL0

SUT0:1

기동

시간

리셋으로부터의 추가적인 시간지연(vcc=5V)

권장 사용처

비고

0

00

258CK

4.1ms

세라믹레조네이터,

빠른 기동 전원

(1)

0

01

258CK

65ms

세라믹레조네이터,

느린 기동 전원

0

10

1000 CK

-

세라믹레조네이터,

BOD enabled

(2)

0

11

1000 CK

4.1ms

세라믹레조네이터,

빠른 기동 전원

1

00

1000 CK

65ms

세라믹레조네이터,

느린 기동 전원

1

01

16000 CK

-

크리스탈오실레이터,

BOD enabled

1

10

16000 CK

4.1ms

크리스탈오실레이터,

빠른 기동 전원

1

11

16000 CK

65ms

크리스탈오실레이터,

느린 기동 전원

(1) 최대주파수에 근접한다면 이 옵션은 사용하지 말아야 한다. 또한 기동 직후의 안정성이 중요한 계통이라면 역시 사용하지 말아야 한다.

(2) 이 옵션은 세라믹 레조네이터를 위한 것이다. 크리스탈에도 사용가능하나 최대주파수에 가깝거나 기동 직후의 안정성이 중요한 계통이라면 사용하지 말아야 한다.

저주파 크리스탈 오실레이터

 실시간을 측정하는데 사용되는 클럭(32.768KHz)를 사용하려면 이 옵션을 선택해야 한다. 이 경우에 최적화된 내부 커패시터(36pF)이 XTAL1과 XTAL2에 GND사이에 내장되어 있으며 이것을 연결하려면 CKOPT를 프로그램(0)하면 된다. 따라서 외부에 커페시터를 별도로 연결할 필요가 없다.


[그림 2] 저주파 크리스털 오실레이터 회로도


[표 2] 저주파 오실레이터 설정

SUT0:1

기동

시간

리셋으로부터의 추가적인 시간지연(vcc=5V)

권장 사용처

비고

00

1000 CK

4.1ms

빠른 기동 전원

(1)

01

1000 CK

65ms

느린 기동 전원

10

32000 CK

65ms

기동시 안정적인 주파수

11

reserved

(1) 기동시 주파수 안정도가 중요치 않은 시스템에서만 사용 가능.


외부 RC오실레이터

 클럭의 주파수가 정확할 필요가 없는 시스템이라면 다음 그림과 같이 XTAL1핀에 저항(R)과 캐패시터(C)를 연결하는 간단한 회로만으로도 클럭 신호를 발생시킬 수 있다. 발생되는 클럭의 주파수의 근사치는 다음 식과 같이 계산할 수 있다.

여기서 C값은 22pF 이상이어야 한다. 퓨즈비트 CKOPT를 프로그램(0)하면 내부 캐패시터 (36pF)을 XTAL1과 XTAL2 핀에서 GND에 연결할 수 있다. 이 경우에는 외부에서는 XTAL1과 Vcc사이에 저항만 연결하면 된다.


[그림 3] 외부 RC오실레이터 회로도


[표 3] RC오실레이터 설정

SUT0:1

기동

시간

리셋으로부터의 추가적인 시간지연(vcc=5V)

권장 사용처

비고

00

18CK

-

BOD enables

01

18CK

4.1ms

빠른 기동 전원

10

18 CK

65ms

느린 기동 전원

11

6 CK

4.1ms

빠른 기동 전원 혹은

BOD enables

(1)

(1) 최대주파수에 근접한다면 이 옵션은 사용하지 말아야 한다.

보정된 내부 RC오실레이터

 내부 RC오실레이터를 사용한다면 XTAL1, XTAL2 핀에는 클럭신호 발생을 위해서는 아무 외부소자도 연결할 필요 없으며 포트핀(PB6, PB7) 혹은 타이머 오실레이터 핀(TOSC1,TOSC2)으로 사용할 수 있다. 이 경우 1MHz, 2MHz, 4MHz, 8MHz의 정해진 주파수만이 사용되며 5V, 25˚C 환경에서 ±3% 오차 범위의 주파수를 발생한다. 하지만 내부 레지스터(OSCCAL)를 이용하여 오차 범위를 ±1%까지 줄일 수 있다.(datasheet 228페이지 “Calibration byte"참조)


[표 4] 내부 RC오실렝터 설정

SUT0:1

기동

시간

리셋으로부터의 추가적인 시간지연(vcc=5V)

권장 사용처

비고

00

6 CK

-

BOD enables

01

6 CK

4.1ms

빠른 기동 전원

10

6 CK

65ms

느린 기동 전원

(1)

11

reserved

(1) 공장 출고시 기본값

클럭 발생기

 클럭 발생기를 사용한다면 XTAL1핀에만 연결하면 되므로 XTAL2는 포트핀으로 사용가능하다. 또한 퓨즈비트 CKOPT를 프로그램(0)하여 내부 커패시터(36pF)을 연결할 수도 있다.

[그림 4] 클럭 발생기 회로도


[표 4] 클럭발생기 설정

SUT0:1

기동

시간

리셋으로부터의 추가적인 시간지연(vcc=5V)

권장 사용처

비고

00

6 CK

-

BOD enables

01

6 CK

4.1ms

빠른 기동 전원

10

6 CK

65ms

느린 기동 전원

(1)

11

reserved

(1) 공장 출고시 기본값



타이머/카운터 오실레이터 연결

 ATmega8A의 내부 타이머/카운터를 이용하여 실제시간을 측정하는 경우에는 시스템 클럭과 별도로 32.768 KHz의 외부 크리스탈을 TOSC1, TOSC2에 직접 연결하여 사용할 수 있다. 이 경우 CKOPT퓨즈비트를 프로그램(0)하여 내부에서 36pF을 GND에 연결하여 사용할 수 있도록 설계되어 있다. 데이터쉬트에 따르면 TOSC1에 클럭발생기를 연결하는 것은 권장되지 않는다.


전압 대 최대 클럭 주파수

 ATmega8(A)은 최대 클럭 주파수가 16MHz이지만 모든 동작 전압에 대해서 이 최대 주파수를 사용할 수 있는 것은 아니다. 다음 그림은 전압 대 최대 주파수의 그래프를 데이터쉬트에서 발훼한 것이다.


[그림 5] 동작 전압 - 최대 클럭 주파수 관계도


4.5V이상의 동작전압에서 16MHZ 최대 클럭 주파수를 사용할 수 있으며 만약 3.3V 동작 전압을 사용한다면 최대 12MHZ 정도의 클럭을 사용할 수 있음을 알 수 있다.




Posted by 살레시오

댓글을 달아 주세요

 아두이노의 TWI 통신 (I2C라고도 한다)은 두 가닥의 선(SDA, SCL)만으로 여러 개의 디바이스와 통신을 할 수 있다는 장점을 가진다. 이것의 통신 속도는 마스터 기기에서 발생시키는 클럭(SCL)신호를 기준으로 정해지며 보통 많이 사용되는 표준 주파수는 100kHz 와 400kHz 이다. 단순하게 이론적으로 계산하면 100kHz 의 주파수라면 초당 100k 비트(바이트 아님)를 전송할 수 있으며 초당 약 12.5k 바이트를 전송할 수 있다.


 아두이노의 I2C 통신에 사용되는 클럭 주파수는 100kHz로 맞추어져 있다. 아두이노에서 쓰이는 AVR은 400kHz 의 주파수도 지원을 하며 대부분의 I2C 통신 기기들이 이 주파수를 지원한다. 그런데 아두이노 API에서는 이 클럭 주파수를 조절하는 함수나 메쏘드가 없다. 이것을 400kHz로 상향시키기 위해서는 다음과 같이 약간 번거로운 과정을 거쳐야 한다.


 아두이노 IDE 1.5.5 와 윈도즈를 기준으로 설명하도록 하겠다. 먼저 다음 파일을 연다

C:\Program Files \ Arduino \ hardware \ arduino \ avr \ libraries \ Wire \ utility \ twi.h

이 코드의 윗 부분에 보면 다음과 같은 상수가 있다.


#ifndef TWI_FREQ
#define TWI_FREQ 100000L
#endif


이름에서 알 수 있듯이 TWI_FREQ 상수가 I2C 통신의 클럭 주파수를 정의한 상수이다. 이 상수를 400000L 로 바꾸면 된다.


#ifndef TWI_FREQ
#define TWI_FREQ 400000L
#endif

이렇게 변경하고 저장한 후 한 가지 과정을 더 거쳐야 한다. 현재 프로젝트의 (과거에 100kHz 상수 값으로 생성되었던)오브젝트 파일들인 wire.cpp.o , twi.c.o 파일들을 제거해야 하는데 이것을 제거하지 않으면 과거에 컴파일된 오브젝트파일을 가지고 링크를 하기 때문에 변경 사항이 적용되지 않는다.

다음의 폴더를 열어보자. (윈도7의 경우임)

C:\ Users \ [user id] \ AppData \ Local \ Temp

이 폴더 하위에 많은 build***********.tmp 폴더는 아두이노 프로젝트가 컴파일되면서 생성되는 임시파일들을 저장하는 폴더이다. 이것들을 모두 삭제한 다음 다시 컴파일하면 변경된 속도가 적용된다. 만약  위와 같이 오브젝트 (임시)파일을 삭제하는 절차가 번거로우면 아예 프로젝트를 새로 생성해서 코드를 붙여넣은 후 컴파일하면 된다.



Posted by 살레시오

댓글을 달아 주세요