이번에는 조금 고급 테크닉을 사용하여 LED를 제어해 보도록 하겠다. 앞에서 매크로를 사용해서 코드를 보기 좋게 만들었다. 앞의 코드는 Data memory 공간을 이용했다면, 이번에는 C코드에서 직접 I/O 메모리 공간을 바로 접근하는 방법에 대해서 설명하겠다. 이미 LED 제어 4에서 I/O 메모리 공간에 접근하기 위해서 "in", "out"명령을 사용해야 한다고 설명했었다. 그러나 I/O 주소를 직접 사용할 수 없고 0x20만큼 offset값을 더해서 사용해야된다고 했다. C프로그램을 하다보면 C코드로는 도저히 사용할 수 없는 명령어를 사용해야 되는 경우와 어셈블러로 구현하는게 훨씬 효율적인 경우가 생긴다. 이런 요구사항을 해결하기 위해서 inline assembler기능을 사용하면 된다. #def..
이번에는 앞에서 작성했던 코드를 매크로를 이용하여 좀더 깔끔하게 수정해 보도록 하겠다. 앞에서 어떤 레지스터에 값을 쓰기 위하여 포인터를 사용했는데 다음과 같은 코드를 사용하였다. *(unsigned char*)DDRB = (GREEN_LED|RED_LED); 위의 코드를 매크로를 사용하면 다음과 같이 수정할 수 있다. #define write8(addr, val) (*(volatile unsigned char *)(addr) = (val)) 전체 코드를 위의 매크로를 이용하여 정리하면 다음과 같은 모양으로 나온다. 훨씬 깔끔하게 보일 것이다. #define F_CPU 1000000 //#include #include #define IO_REG_OFFSET 0x20 #define PINB (IO_REG_..
이번글에서는 AVR에서만 사용가능한 방법이 아닌 일반적인 방법으로 LED를 점멸하는 기능을 구현해 보도록 하겠다. 이번 글은 아직 임베디드 시스템 프로그램에 익숙하지 않은 개발자에게는 다소 난해한 내용이 될 수도 있을것이다. 이미 앞의 글에서도 얘기 했지만, AVR 외부와 연결되는 I/O 핀을 제어하기 위해서는 PORT 레지스터를 이용하면 되고, PORT 레지스터에 접근하기 위하여 CPU에서는 주소를 이용한다고 설명하였다. 또한 C프로그램에서 특정 주소에 값을 쓰거나, 주소에서 값을 읽어 오기 위하여 포인터를 사용하면 된다고 하였다. 그럼, 포인터 기법을 사용하여 LED 제어 1에서 작성한 코드를 수정하도록 하겠다. #define F_CPU 1000000 //#include #include #define..
DDR, PORT, PIN 레지스터를 이용하여 초록색 LED와 빨간색 LED를 교대로 점멸하는 코드를 만들어 보았다. 그리고 실제로 보드에서 동작되는것도 확인해 보았다. 그러나 C언어를 조금이라도 배워본 경험이 있다면, 코드안에 있는 DDRB, PORTB, PINB라는것이 무엇인지, 갑자기 어디서 나왔는지 궁금할 것이다. 이번 글에서는 이 부분에 대한 설명과 어떻게 이들 레지스터에 접근할 수 있는 지 설명하겠다. 위의 그림은 사용하고 있는 AVR의 내부 블럭도이다. 우리가 만든 LED 제어 프로그램은 AVR CPU박스의 왼쪽 위에 연결된 Flash에 저장되어 있다. AVR 칩에 전원이 들어가면 AVR CPU는 Flash에서 수행하여야 할 명령어를 하나씩 읽어 들여 프로그램을 수행한다. 앞에서 설명했던 코..
앞에서 설명한 글에서처럼 빨간색 LED와 초록색LED가 서로 반대의 상태로 불이 켜지거나 꺼지는 것이 확인 되었으면, 최소한 하드웨어 구성이 제대로 되었을뿐 아니라 프로그램으로 코딩한대로 하드웨어가 제대로 동작되고 있다고 판단할 수 있다. 일반 컴퓨터에서 "hello, world" 프로그램을 이용해서 개발환경이 정상적으로 동작하는 것을 확인했다면, 임베디드 시스템에서는 LED 제어를 통해서 개발환경 확인과 더불어 프로그램을 이용해서 하드웨어를 제어하는 방법과 원리를 이해할 수 있게 된다. 따라서, LED 제어 방법을 이해하게 되면 AVR을 이용한 다른 기능들은 그 기능을 제어하는 레지스터의 주소와 그 안에 들어있는 내용만 다를뿐이지 방법은 별로 다르지 않다는 것을 알게 될 것이다. 다시한번 사용하고 있는..
쉽다고 생각했던 "hello, world" 출력이 생각보다 쉬운 프로그램이 아니라는 것을 알게 되었으므로 임베디드 시스템에서 해볼수 있는 가장 쉬운 프로젝트를 구현해 보도록 하겠다. 그 방법은 다름 아닌 LED를 켰다, 껏다 해보는 것이다. 사실 LED를 제어하는 코드는 단 한줄만으로도 확인할 수 있지만 왜 그렇게 동작이 되는지 확실히 이해하기 위해서는 상당히 많은 지식을 필요로 한다. 이러한 배경 지식은 하루 아침에 습득할 수 있는 내용이 아니므로 프로젝트를 진행해 나가면서 하나씩 하나씩 익혀 나가면 된다. 먼저 LED 제어를 위한 하드웨어부터 구성하도록 하겠다. 아래 그림과 같은 회로를 브레드 보드에 꾸민다. 이번 프로젝트에 사용될 부품은 빨간색 LED 하나와 초록색 LED하나가 필요하다. 물론 LE..
앞의 글에서 개발도구 설치와 더불어 'hello' 프로젝트를 작성하여 성공적으로 빌드하였다면, 이번에는 그 결과로 만들어진 실행 파일을 실제 AVR에서 동작시키는 방법에 대해서 설명하도록 하겠다. 첫번째로 해야 할 일은 하드웨어 준비 글에서 소개한 부품을 이용하여 회로부터 구성하는 것이다. 회로 구성을 위해서는 AVR의 외부로 나오는 핀들에 대한 설명을 보아야 한다. 핀 구성의 상세 내용을 알기 위해서 ATMEL사 홈페이지에서 ATmega328P의 데이터쉬트를 다운로드 받아서 열어 본다. 일단 파일을 다운로드 받았으면 데이터쉬트에 어떤 내용이 들어 있는지 처음부터 끝까지 전체적으로 대충대충 훑어본다. 그래야 나중에 필요한 내용을 빨리빨리 찾아볼 수 있기 때문이다. 데이터쉬트 앞 부분에서 다양한 칩 패키지..
프로젝트 요구사항에 맞는 CPU를 선정했으면, 그 CPU에서 수행되는 실행파일을 만들 수 있는 개발환경을 구축하여야 한다. CPU종류도 다양하게 있지만 개발도구도 CPU마다 여러가지가 있을 수 있다. 많은 자료와 기술 지원을 받을 수 있는 유료 개발 환경도 있을 것이고, 개발자가 필요한 파일들을 인터넷에서 다운로드 받아 스스로 개발환경을 구축해야 하는 무료 도구도 있다. 무료 개발 환경의 경우 프로젝트 개발중에 문제가 발생하면 개발자 스스로가 알아서 문제를 해결해야 되는 고충이 있다. 하드웨어 선정할때와 마찬가지로 개발 환경 구축할 때에도 여러가지 사항을 고려하여 선정하여야 한다. 이 블로그에서 사용하고자 하는 개발 도구는 ATMEL사에서 무료로 제공하는 Atmel Studio를 이용할 것이다. 심화과정..
임베디드 시스템을 개발 한다는 것은 특정 동작만을 수행하는 하드웨어와 소프트웨어를 개발한다는 말과 동일하다. 그러기 위해서는 그 목적에 맞는 최적의 하드웨어를 구성해야 하고 그 하드웨어를 동작시키기 위한 개발 환경을 구축하여야 한다.세상에는 셀수도 없을만큼 많은 종류의 임베디드용 CPU가 있다. 그 중에서 하나를 선택하는 것은 쉽지 않은 일이다. 기능, 성능, 소모전력, 가격, 납기 등등 여러가지 조건을 따져 보고 최종적으로 하나의 CPU를 선정하여야 하기 때문이다.이 블로그에서는 AVR CPU를 통해서 임베디드 시스템의 개념과 프로그램 개발에 필요한 내용을 설명하려고 하기 때문에 이미 어느 정도는 CPU가 정해진거나 다름없다. ATMEL사에서 생산되는 많은 CPU중에서 ATmega128이 가장 대중적으..
C언어를 배울 때 처음으로 작성해 보는 코드는 십중팔구 printf()를 이용하여 화면에 문자를 출력해보는 것으로 시작했을 것이다. 이때 printf() 안에 들어가는 내용은 "hello, world" 아니면 자기 이름이었을 것이다. C언어뿐만 아니라 대부분의 컴퓨터 프로그래밍 언어는 "hello, world"와 같이, 문자를 출력하는 몇줄의 간단한 예제 코드로 설명을 시작한다. 이렇게 간단한 코드를 첫번째 예제로 사용하는 이유는, 작성된 소스코드를 컴파일러가 제대로 해석하여 실행파일을 성공적으로 만드는지, 생성된 실행 파일이 제대로 동작되는지를 빠르고 쉽게 검증해 보고자 하는 것이다. 비록 두 단어를 출력하기 위하여 작성되는 코드는 단 몇줄에 불과하더라도, 작성된 소스코드를 분석하여 프로그래머가 의도한..