이번 프로젝트에서 사용하는 LCD 모듈은 WaveShare사에서 만든 3.3V용 파란색 LCD모듈이다. 제조사 홈페이지에서 해당 모듈을 검색하면 LCD모듈에 사용된 드라이버 칩이 SUNPLUS사의 SPLC780D을 사용하였다고 나온다.1602 LCD는 히타치사에서 만든 HD44780 드라이버 칩을 사용하는것이 거의 표준처럼 되어 있다. 따라서 SPLC780D도 HD44780과 호환 제품이다.인터넷에서 HD44780 데이터쉬트 문서를 검색하면 다운 받을수 있다.문서를 다운 받았으면 서너번 정도 대충 읽어본다. SPLC780D 문서는 48페이지로 되어 있는데 이것 저것 빼고 나면 실제로 드라이버 코드를 만드는데 필요한 정보는 몇페이지 되지 않으므로 크게 부담없이 읽어 볼 수 있다. 문서 분석이 어느정도 되었..
LCD1602 프로젝트는 한줄에 16개의 글자를 표시할 수 있는 두줄짜리 LCD 표시장치를 이용하여 프로그래머가 원하는 글자를 표시해보는 것이다. LCD 모듈에서 제공하는 기본적인 글자뿐 아니라 사용자가 직접 글자를 만들어 쓸수 있는 기능을 이용하여 약간의 그래픽 데이터를 표시해보는 기능도 직접 구현해 볼것이다. 실제 모습은 위의 그림과 같다. 자세히 보면 16개의 핀이 연결되는것을 알 수 있다. 각각의 핀에 대한 설명은 다음과 같다. LCD1602는 MCU와 8비트 데이터로 연결 할 수도 있고, 4비트 데이터로도 연결할 수 있다. 첫번째 프로젝트에서는 8비트 데이터 버스를 이용한 방법을 적용해 보고, 다음 프로젝트에서는 4비트 버스를 이용하여 원하는 데이터를 출력해 보도록 하겠다. AVR과 1602 L..
C언어가 처음 만들어진 때가 1970년대 초반이므로 지금으로부터 40년도 더 되었다. 그 당시에 사용되었던 많은 프로그래밍 언어들이 거의 사라졌고, 끊임 없이 새로운 프로그래밍 언어들이 생겨나고 있지만, C언어는 아직까지도 가장 많은 프로그래머가 사용하는 언어중 하나이다. 특히 임베디드 시스템 소프트웨어 개발에는 거의 절대적이라고 할 수 있을 정도로 C언어가 사용되고 있다. 이렇게 오랜 시간동안 다양한 분야에서 C언어가 사용되는 이유는 여러가지가 있겠지만 그 중에서도 가장 중요한 이유는 아마도 포인터 때문일 것이다. 어느정도 C로 프로그램을 구현해 본 경험이 있는 프로그래머라면 포인터가 무엇인지 이미 잘 알고 있을 것이다. 그러나 실제로 포인터를 효과적으로 적절히 사용하는 것은 생각처럼 쉽지 않다. 그 ..
임베디드 프로젝트를 진행하다 보면 가끔 난수(random number)를 발생 시킬 필요가 생긴다. 이를 위하여 C언어에서는 rand() 함수를 사용하여 난수를 발생 시킨다. rand() 함수를 부를때 마다 임의의 결과값을 받을 수 있는 것이다. 그러나 엄밀히 말해서 C에서 제공하는 rand()함수는 완전한 random값을 생성하지는 않는다. 이말이 무슨 뜻인지는 다음과 같은 코드를 작성하여 확인할 수 있다.#include #include #include "uart.h" int main(void) { int i, num; uart_init(); printf("\nRandom Number Generator. [%s %s]\n",__DATE__,__TIME__); for (i=0; i
AVR용 어플리케이션을 개발하는 프로그래머라면 대부분 C언어를 주로 사용할 것이다. AVR이외에 ARM이나 다른 CPU를 가지고 개발할 때는, 특히 리눅스를 포팅하거나 boot code를 만들때에는 C언어 뿐만 아니라 어셈블 프로그램도 같이 개발 하여야 한다. 하나의 컴퓨터 언어를 사용하여 개발 할때는 전혀 고려 대상이 아니었지만, 서로 다른 언어를 사용하여 프로그램을 개발할 때에는 각각의 언어에서 사용하는 함수와 변수, 입력 인자(input argument)와 리턴 값을 어떤식으로 전달할 것인지 미리 약속을 하여야 한다. 이러한 약속을 ABI(Application Binary Interface)라고 하고, 특히 임베디드 시스템에서 사용하는 약속을 EABI(Embedded Application Binar..
이번 글에서는 엔디안(Endian)에 대해서 간단히 설명하도록 하겠다.이미 엔디안이 무엇인지 알고 있을 수도 있고, 들어본적은 있지만 정확히 무엇인지 모르고 있을 수도 있고, 첨 들어보는 경우도 있을수 있겠다.엔디안이라는 단어는 "걸리버 여행기"에서 처음 나왔다. 소인국 사람들 중에 달걀을 깰때 뭉툭한 곳(Big-Endian)부터 깨는 사람들이 있는 반면, 뾰족한 곳(Little-Endian)부터 깨는 사람들이 있어서 서로 자신의 방법이 맞다고 주장하는 글에서 유래되었다.이런 상황이 컴퓨터 분야에서도 재현 되었다.그럼 컴퓨터에서의 엔디언이 무엇인지 예를 들어 설명하도록 하겠다.wxyz라는 숫자가 있다고 가정하자. 이 숫자가 십진수라면 w는 천의 자리 수가 되고, x는 백의 자리, y는 십의 자리, z는 ..
이전 글에서 예제로 나온 코드들에서 'loop_count'가 프로그램 안에서는 어디에 존재하고 어떻게 접근하는지 하나씩 분석해 보도록 하겠다. 변수를 어디에 정의해서 어떻게 사용하든지 원하는 동작만 하면 되는거 아닌가? 라고 생각할 수도 있겠지만 프로그램의 구조를 알고 있어야 문제가 발생했을 때 훨씬 쉽게 그 문제를 해결할 수 있는 지름길로 갈수 있기 때문이다. C로 만든 코드를 보드에서 실행 하였을 때, 절대로 눈에 보이는 c코드대로 CPU가 동작되지 않는다. 정확한 동작을 이해하기 위해서는 반드시 어셈블 코드를 분석하여야 한다. 어셈블 코드를 분석할 때 map 파일을 참조하면 많은 도움을 받을 수 있다. 이번 글에서는 각각의 코드를 빌드한 후 생성되는 .lss 파일과 .map 파일을 열어서 'loop..
이번에는 시스템 클럭(System clock)에 대해서 설명하도록 하겠다. 블로그에서는 마지막 부분에서 시스템 클럭에 대한 설명을 하지만, 실제 프로젝트에서는 가장 먼저 확인해야 할 것이 보드의 전원과 클럭이 어떻게 설정되어 있는가이다. AVR과 같은 마이크로 컨트롤러가 사용되는 보드는 보통 단일 전원에 단일 시스템 클럭이 사용되지만, 고성능 CPU를 사용하는 보드의 경우에는 전원도 몇가지로 나누어서 공급되고, 클럭도 부품마다 다르게 공급된다. 임베디드 시스템 프로그래머라면 부품마다, 혹은 CPU 내부에 들어있는 각각의 블럭들에 인가되는 클럭이 몇 Hz인지 반드시 확인하여야 한다. 보드가 제대로 동작되지 않는 많은 경우가 클럭 설정이 제대로 안되어 있는 경우가 많기 때문이다. 보드내에 인가되는 클럭은 소..
이번에는 주로 디바이스간의 정보를 주고 받기 위한 방법중 하나인 TWI에 대해서 설명하도록 하겠다. TWI는 Two-Wire Serial Interface의 약자로써 TWSI라고도 부른다. 원래는 필립스사에서 만든 IIC(Inter Integrated-Circuit)라는 규격을 일반적인 용어로 다르게 부르는 것이다. 그러나 아직까지 많은 개발자들이 TWI 대신 I2C라고 부르는 것을 더 편하게 생각하고 있다. TWI는 이미 이름에서 알수 있듯이 두개의 선을 이용하여 데이터를 주고 받는다. 하나는 SDA라는 데이터를 주고 받는 선이고, 또 다른 하나는 SCL이라는 클럭 정보를 제공하는 선이다. 데이터 선이 하나 밖에 없으므로 반이중(half-duplex) 통신을 할 수 밖에 없고 SPI와 마찬가지로 마스터..