대메뉴 바로가기 본문 바로가기

데이터 기술 자료

데이터 기술 자료 상세보기
제목 PSoC 프로젝트 : 나만의 미니 앨범 ①
등록일 조회수 5033
첨부파일  

PSoC 프로젝트

나만의 미니 앨범 ①



초등학교 때 방과 후 집에 오면 만화를 그리곤 했다. 중·고등학교 때는 학교 수업을 마치고 귀가해서 소설을 썼다. 펌웨어 프로그래머로 직장생활을 시작한 2~3년 동안은 ‘이렇게 재미있는 것을 하면서 돈을 벌 수도 있구나’라는 생각에 집에 가는 시간도 아까웠다. 원래 책상 위 나만의 작은 세상을 만드는 것에 흥미가 있었다.



회사 일을 하는 동안에도 한가하면 퇴근 뒤 이것 저것 만들어보곤 했다. 마이컴을 이용해 간단한 보드나 윈도우용 툴을 주로 만들었다. 2010년부터는 모바일 앱을 만들었다. 이번 호에 소개할 초소형 액자는 오랜만에 만들어본, 마이컴을 이용한 프로젝트였다.



프로젝트 소개

초소형 액자를 만들 때 처음엔 LCD만 연결해 RS232로 PC로부터 사진을 전송받아 LCD에 출력했다. 한동안<그림 1>처럼 사용하다가 플래시 메모리에 사진을 넣기 위해 만능 기판에 8메가바이트(Megabyte) 용량의 플래시 메모리를 붙여 PC로부터 RS232로 34장의 사진을 전송 받아 슬라이드 쇼를 하도록 수정했다.





그러다가 서브보드를 만들어 플래시 메모리와 LCD 를 달고 전원은 USB 로 받게 했다.



지금은 박스를 만들어 책상 옆에 놔두고 흐뭇하게 지내고 있다.



재료비는 각각 소개한다. LCD 7000원, 플래시(Flash) 2000원, PSoC(Programmable SoC)는 단품을 살 수 없어 선물 받은 키트(kit)를 사용했다. 하나에 4.99달러에 판매되고 있다. 전자액자를 사는 가격보다 비싸겠지만 직접 만들어서 하나씩 기능을 추가해 가는 재미로 만들었다. 마이컴은 편의상 두 개의 프로젝트로 나누어서 개발 중인데, 플래시 메모리에 사진을 RS232를 통해서 다운로드하는 프로젝트와, 플래시 메모리에 이미 다운로드되어있는 사진을 차례로 LCD에 디스플레이하는 프로젝트로 나뉘어져 있다. PC 쪽은 비주얼베이직(Visual Basic)의 최소 기능으로 만들었다. ‘미니액자 만들기 1, 2’에서는 현재까지 진행된 내용을 PSoC, 미니 앨범 프로젝트 구조, 플래시 메모리, LCD, RS232 프로토콜로 나눠 설명하겠다.

1. PSoC
오랜만에 마이컴으로 개인 프로젝트를 하게 된 이유는 PSoC라는 특별한 마이컴에 흥미가 생겨서다. 지난 3월 5일 삼성동 코엑스에서 사이프레스(Cypress)가 개최한 PSoC 워크숍에 참석할 기회가 있었다. 이 워크숍에 참여해 PSoC 관련 설명을 들은 뒤 PSoC로 개발이 가능할 것 같다는 생각이 들었고 실제로 1~2주 만에 개발이 가능했다.



PSoC의 재미있는 점은 마이컴에 내장된 페리페랄(peripheral,이하 주변장치)의 재배치가 가능하다는 점이다. 우선 SoC는 시스템온칩(System On Chip)의 약자인데 CPU와 주변장치가 함께 들어있다. 즉 시스템이 하나의 칩에 들어 있다는 의미다. <그림 6>은 A20이라는 SoC 인데 태블릿을 만들기에 최적화됐다. 태블릿에 필요한 LCD, 오디오, 카메라, 배터리 컨트롤러 등이 내장돼 있다.

SOC의 경우 내장 주변장치를 즉시 동작시킬 수 있는 수준의 소스를 SOC 업체에서 제공한다. 주변장치들이 외부에 있을 경우 호환되는 주변장치가 붙을지도 알 수 없고, 마이컴의 어느 포트에 붙을지 모르기 때문에 완성도 높은 소스를 제공하기가 사실상 불가능하다.



태블릿처럼 주변장치가 많고 수량이 많이 요구되는 경우 그 목적에 맞게 SOC 형태로 만들었다. 또 SOC 업체에선 주변장치를 제어할 수 있는 소프트웨어 개발 키트(SDK)를 제공하게 돼 SOC 업체별로 SDK의 통일성을 갖게 됐다. 그 SOC로 제품을 개발하는 회사 입장에서도 빠르고 안정적인 개발이 가능해졌다.

비교적 소스 양이 많지 않은 마이컴 시장도 SOC가 필요할까? SOC로 만들어지면 제품을 개발하는 회사 입장에서는 좋겠지만 시장이 크지 않으므로 비용 대비 효율이 맞지 않는다. 이때문에 SOC 업체에서는 만들지 않는데, 사이프레스가 만든 PSoC는 그 틈새를 차지하기 위해 만들어진 SOC로 보인다.

PSoC는 ARM core 중 저사양인 M0 core 를 사용하고, 운영체제 수준이 아닌 가벼운 펌웨어를 넣을 수 있도록 ROM:128M byte, RAM: 64K byte만 제공한다. 그런데 일반적으로 소형 컨트롤러를 사용하는 시스템은 태블릿과는 달리 주변장치가 정해져 있지 않다. 어떤 시스템에서는 버튼과 LED 몇 개로 구성되기도 하고 어떤 시스템에서는 I2C 와 SPI 가 필요하기도 하다. 이렇게 되면 소형 시스템 개발을 쉽게 하기 위해서는 모든 사용 가능성이 있는 주변장치를 고정시키고 SDK 를 제공하여 개발을 쉽게 해주어야 하는데 대부분의 주변장치를 사용하지 않을 것이기 때문에, 이런 SOC 를 만드는 것은 너무 비효율적이다.



PSoC가 이 문제를 해결했다. 사용가능한 주변장치를 모두 지원하되 개발자가 프로그램으로 CPU와 연결하게 했다. <그림 7>이 PSoC의 특성을 잘 보여준다. 레고처럼 주변장치를 시스템에 장착, 탈착할 수 있다. 시스템에 주변장치를 장착하면 그에 맞게 SDK를 자동으로 생성해준다. 프로그램할 수 있는 SoC라는 PSoC의 이름 그대로다.

그럼 간단하게 RS232를 출력하는 프로그램을 만들어 보면서 PSoC의 사용법을 살펴보자. PSoC에서는 펌웨어 작성 전에 주변장치 배치와 SDK 생성을 먼저 해야 한다. 사이프레스에서 PSoC 개발용으로 제공하는 통합 개발환경 ‘PSoC Creater’를 실행하면 <그림 8>과 같은 툴이 실행된다. <그림 8>에서 오른쪽에 보이는 ‘Component Catalog’에서 ‘UART’를 드래그 하여 배치하고 Build 버튼을 누르면 왼쪽에 보이는 ‘Generated Source’가 생기는데 이것이 SDK다. 가운데에 "RS232 component"를 더블 클릭하면 아래와 같이 쉽게 RS232 설정을 할 수 있고, "Data sheet 버튼"을 누르면 자세한 도움말을 볼 수 있다.





다음으로RS232 로 입력을 받아 입력 받은 문자를 그대로 되돌려 보내는 소스를 작성한다.



<리스트 1> PSoC Creator 의 소스 작성 화면 int main (void) { UART_Start(); UART_PutString("start - SPI flash proj "); while(1) { if ( UART_ReadRxStatus() == UART_RX_STS_FIFO_NOTEMPTY) { ch = UART_ReadRxData(); sprintf(buff, "%c ", ch); UART_PutString(buff); } } for(;;) { } }



작성된 소스 코드를 보면 RS232를 사용하기 위해 사용한 함수는 네 개다. 물론 이 함수는 모두 자동 생성된 SDK다.

void UART_Start(void) ; // UART 초기화
void UART_PutString(const char8 string[]); // 문자열 출력
uint8 UART_ReadRxStatus(void); // 수신 버퍼 상태 확인
uint8 UART_ReadRxData(void); // Data 수신

너무 간단해서 동작을 할지 의심스러울 정도지만 잘 동작한다. 그럼 미니 앨범의 전체 구조를 확인해 보자.



미니 앨범의 전체 구조
SPI는 Serial Peripheral Interface의 약자다. 데이터를 선 하나로 전달하기 위한 주변장치와의 통신방식이라는 의미다. 그럼 한번 생각해 보자. 한 선으로 데이터를 주고 받는다면 어떤 형태가 가능할까? 우선 마이컴과 주변장치의 한 포트씩 연결하면 High, Low 상태를 전달 할 수 있을 것이다. <그림 10>처럼 마이컴에서 High/Low로 포트를 제어하면 주변장치에서는 이 포트를 읽어서 High면 모터를 돌리고 Low면 모터를 멈춘다고 정의하면 마이컴은 주변장치에 달린 모터를 한선으로 제어할 수 있을 것이다.



그런데 주변장치에서도 마이컴으로 어떤 정보(예를 들면 모터의 위치를 나타내는 센서값)를 주고 싶다면 어떻게 할까? 역시 똑 같은 방법으로 한 포트를 할당하여 High, Low 로 신호를 정의하고 주변장치에서 이 포트를 제어하고 마이컴에서 읽도록 하면 될 것이다. 마이컴이 제어하는 신호를 Master Output Slave Input 의 약자로 MOSI 로 부르고 주변장치가 제어하는 신호를 Master Input Slave Output 의 약자로 MISO 라고 부르자. 이제 양방향 통신이 가능해졌다.



여기서 한걸음 더 나아가 많은량의 데이터를 주고받고 싶으면 어떻게 하면 될까? Clock 을 추가하여 매 Clock 마다 MOSI, MISO 의 신호값에 의미를 주면 될 것이다. 이 Clock 을 Serial Clock 의 약자로 SCLK 로 부르자. 예를 들어, High -High - High - Low 4bit 를 보내고 싶다면 <그림 12>처럼 하면 된다.



마지막으로 마이컴에 여러 개의 주변장치를 연결하고 싶다면 어떻게 하면 될까? Slave Select 신호(SS로 부른다)를 추가하여서 연결된 주변장치 중 사용하고 싶은 주변장치의 SS를 Low로 한다는 규칙으로 사용하면 된다. 일부러 간략하게 설명하였지만 지금까지 설명한 <그림 13>이 SPI 통신의 기본이다.





출처 : 마이크로소프트웨어 7월호

제공 : 데이터 전문가 지식포털 DBguide.net