티스토리 뷰

입문

시스템 클럭

Just4Fun 2016. 4. 18. 21:59

이번에는 시스템 클럭(System clock)에 대해서 설명하도록 하겠다.  블로그에서는 마지막 부분에서 시스템 클럭에 대한 설명을 하지만, 실제 프로젝트에서는 가장 먼저 확인해야 할 것이 보드의 전원과 클럭이 어떻게 설정되어 있는가이다.

AVR과 같은 마이크로 컨트롤러가 사용되는 보드는 보통 단일 전원에 단일 시스템 클럭이 사용되지만, 고성능 CPU를 사용하는 보드의 경우에는 전원도 몇가지로 나누어서 공급되고, 클럭도 부품마다 다르게 공급된다.

임베디드 시스템 프로그래머라면 부품마다, 혹은 CPU 내부에 들어있는 각각의 블럭들에 인가되는 클럭이 몇 Hz인지 반드시 확인하여야 한다.  보드가 제대로 동작되지 않는 많은 경우가 클럭 설정이 제대로 안되어 있는 경우가 많기 때문이다.

보드내에 인가되는 클럭은 소프트웨어로 변경 가능한 경우가 있고, 하드웨어적으로 설정되는 경우가 있다.

AVR의 경우 xMega CPU는 소프트웨어로 클럭 설정이 가능하다.  하지만 지금까지 주로 설명되었던 mega CPU는 Fuse bit를 설정하여 클럭 설정을 할수밖에 없다.  Fuse 비트는 소프트웨어로 변경할 수 없다.

지금까지는 ATmega328P를 가지고 프로젝트를 해 왔는데 외부의 별도 크리스털을 사용하지 않고 내부에 있는 RC 오실레이터를 이용하였다.  이번에는 외부에 16MHz 크리스털 오실레이터를 달아서 CPU가 16MHz로 동작 될 수 있도록 시스템 클럭을 변경하도록 하겠다.

먼저 전체적인 클럭 구성도를 알아보겠다.

위의 그림이 AVR 내부에 있는 클럭 구성도이다.  클럭 소스를 여러개 사용할 수 있고, 클럭 소스들은 Clock Multiplexer로 들어가도록 되어 있다.   Clock Multiplexer에서 그 중에 하나의 클럭을 소스로 선택하게 된다.  선택된 클럭은 System Clock Prescaler로 들어가 알맞은 속도의 클럭으로 동작될 수 있도록 클럭 속도를 조절한다.

Prescaler에서 조정된 클럭은 Clock Control Unit으로 공급되어 CPU 클럭을 비롯하여 I/O, ADC 등으로 공급된다.

부연하자면 지금까지는 위의 그림 오른쪽 하단에 있는 Calibrated RC Oscillator에서 클럭을 공급 받았다.  RC 오실레이터는 8MHz로 동작되도록 설정되어 있고, Prescaler에서 8분주시켜 CPU를 비롯하여 주변 장치로는 최종적으로 1MHz로 공급되는 것이다.  외부 크리스털 오실레이터를 사용하려면 위의 그림 가운데 있는 Crystal Oscillator를 클럭 소스로 설정하면 되고, Prescaler는 bypass 되도록 설정해주면 된다.

위의 표가 클럭 소스를 선택하기 위한 CKSEL3:0 비트 설정값이다.  이 중에서 외부 Full Swing Crystal Oscillator를 선택한다.  즉 CKSEL3:0의 값을 0111이 되도록 한다.

SUT1:0은 10으로 선택한다.

클럭 설정을 위한 Fuse Byte는 Fuse Low byte 값으로 변경 가능하므로 Fuse Extended byte와 Fuse High byte는 건드리지 않아도 된다.

위의 표를 참조하여 Fuse low byte 최종값을 11100111로 설정하면 된다.

Fuse byte 값을 변경하기 위하여 Atmel Studio 프로그램에서 Device Programming 창을 연다.  Device Programming 창을 여는 방법은 AVR에 실행 파일 다운로드를 참고하기 바란다.

위의 그림이 공장에서 제조될 때 설정된 Fuse byte 값을 보여주는 것이다.  Extended는 0xFF, High byte는 0xD1, Low byte는 0x62로 되어 있다.  위의 창에서 Low byte 값만 0xE7으로 변경한뒤 "Program" 버튼을 눌러 칩안에 Fuse byte 값이 적용 되도록 한다.

위의 창을 닫고 다시 창을 새로 열면 이제는 Fuse byte 값이 읽히지 않을 것이다.  외부 오실레이터를 사용하려고 설정하였는데 아직 외부 오실레이터를 연결하지 않았기 때문이다.

위의 회로도처럼 9번과 10번 핀에 크리스털을 연결하고 양쪽에 커패시터를 GND 와 연결한다.  커패시터 용량은 12~22pF이 적당하다.

위와 같이 연결한 다음 다시 Atmel Studio의 Device Programming 창을 열어 Fuse bit 설정을 확인해 본다.  Fuse low byte값이 0xE7로 설정되어 있는것을 볼 수 있을 것이다.

실제로 16Mhz로 동작 되는지 확인해 본다.

먼저 PB0에 LED를 연결하고 _delay_ms(500)을 사용하여 1초 주기로 점멸 되는지 확인해 본다.  프로젝트에서 사용되는 F_CPU 값을 16000000으로 설정하는것을 잊지 말아야 한다.

LED 점멸이 1초 주기로 동작 되는것을 확인하였으면, UART를 115200bps로 동작 시켜 보도록 하겠다.

uart.h 파일을 다음과 같이 수정한다.

#define UART_BAUDRATE   BAUD_115200

그리고 setup() 함수를 다음과 같이 수정한 후 프로그램을 실행 시켜서 115200bps로 동작되는지 확인해 본다.  컴퓨터의 UART 터미널 설정도 115200bps로 변경하는 것을 잊지 말아야 한다.

실행 결과 예상과 다르게 글자가 깨져 나온다.

이유는 AVR의 UART 설정하는 코드에서의 보이지 않는 에러가 발생하기 때문이다.

Datasheet에서 UBRR 구하는 공식은 이미 UART 글에서 얘기한것처럼 다음과 같이 설명되어 있다.

위의 공식에 대입해 보면 UBRR = 16000000/(16*115200) - 1 = 7.68 이 된다.  7.68에 가장 가까운 정수는 7이 아니고 8이 된다. 그러나 위의 공식대로 프로그램을 하게 되면 8이 아닌 7이 UBRR 값으로 설정되게 된다.  그러므로 이 부분에서의 에러로 인하여 글자가 깨져 나오는 것이다.  Datasheet문서에도 Fosc가 16Mhz 일때 115200bps의 UBRR의 값은 8이라고 나와 있다.

위의 표를 보면 115.2k 일때의 UBRR의 값이 8이고 이때 에러 율이 -3.5%이다.  UBRR 값으로 7을 입력하면 +8.5% 정도의 에러가 발생하게 된다.  어쩔수 없이 코드에서 -1하는 부분을 삭제하거나 아예 UBRR의 값을 8로 하드코딩하는수 밖에 없다.

여기에서는 공식에서 -1 부분을 삭제하는것으로 에러를 보정하는것으로 할것이다.

코드를 수정한 결과 정상적으로 UART가 동작되는 것을 볼수 있게 되었다.


심화 과정에서는 AVR CPU가 16MHz로 동작되고 UART는 115200bps로 설정하는것을 기본값으로 할 예정이다.



main.c


uart.c


uart.h


입문 과정 목차

'입문' 카테고리의 다른 글

TWI(I2C)  (13) 2016.04.16
SPI  (6) 2016.04.16
ADC(Analog to Digital Converter)  (0) 2016.04.14
타이머/카운터 - PWM(Phase Correct PWM Mode)  (0) 2016.04.12
타이머/카운터 - PWM(Fast PWM Mode)  (2) 2016.04.12
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함