UART를 이용하여 패킷 통신이 제대로 수행되는지 검사하기 위해서는 전용 프로그램이 필요하다. 앞의 글에서도 언급했듯이 일반적인 UART 터미널 프로그램은 문자형 데이터만 처리할 수 있으므로 데이터 통신을 수행할 수 있는 전용 프로그램이 필요하다. PC용 프로그램은 다양한 툴을 사용하여 개발 가능하므로 각자 자신이 구현하기 쉬운 환경을 이용하여 개발하면 된다. 이 블로그에서는 Python을 이용하여 PC용 어플리케이션을 만드는 방법에 대해서 설명하도록 하겠다. 가장 먼저 해야 할 일은 UART를 통해서 데이터 수신이 제대로 되는지부터 확인하는 것이다. 위의 그림처럼 UART 터미널에서 보여졌던 내용과 동일하게 AVR에서 보낸 메시지를 제대로 출력하는것을 볼 수 있다. 일단, AVR과 UART 통신이 제대..
직렬 패킷 통신을 구현하기 위한 예제 프로젝트 회로 구성에 대하여 알아보도록 하겠다. 아래 그림은 ATAVRSBIN의 회로도이다. ATAVRSBIN1은 10핀 커넥트로 외부와 연결된다. TWI 통신을 위하여 1번 핀 SDA와 2번 핀 SCL이 사용된다. 3번 핀은 Compass의 DRDY 신호를 위하여 사용되고, 4번핀과 5번핀은 Accelerometer와 Gyroscope의 INT 핀에 각각 연결된다. 9번 핀을 GND에, 10번 핀을 VCC에 연결하게 되어 있다. AVR과 ATAVRSBIN1과의 연결은 TWI 핀 두개와 PC1,2,3을 이용해서 연결한다. UART 통신을 위하여 RXD와 TXD핀도 연결한다. 먼저 UART를 통하여 컴퓨터와 정상적인 통신이 되는지부터 확인한다. #include #inc..
위에 보이는 그림은 ATMEL에서 만든 ATAVRSBIN1이라는 센서 모듈이다. 그림에 표시되어 있는것처럼 AK8975라는 Compass와 BMA150이라는 Accelerometer와 ITG3200이라는 Gyroscope를 포함하는 세개의 센서가 실장되어 있다. 각각의 센서들은 모두 동일한 TWI버스에 연결되어 있기 때문에 MCU는 하나의 TWI를 이용하여 각각의 센서들과 통신할 수 있다. 일반적으로 임베디드 시스템은 다른 시스템과 연동없이 자체적으로 동작되는 경우도 있지만, 컴퓨터를 비롯해서 다른 임베디드 시스템과 연동하여 동작되는 경우도 많다. 특히, 최근들어 IoT라는 개념으로 인하여 다른 시스템과의 상호 연동되는 경우가 점점 더 기본 기능처럼 되어 가고 있는 추세다. 다른 시스템과 데이터를 주고 ..
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..
알고 있으면 좋은것들 변수는 어디에? 변수는 여기에! 엔디안(Endian) EABI(Embedded Application Binary Interface) random 함수 포인터(Pointer) - 개념 패킷 통신 패킷 통신 - Serial Packet Communication 패킷 통신 - 회로 구성 패킷 통신 - PC 프로그램 패킷 통신 - 바이너리 데이터(Binary data) 패킷 통신 - Start/Stop flag 패킷 통신 - CRC 패킷 통신 - Message ID 패킷 통신 - Request/Reply RTOS Linker Script - 링커 스크립트 crt0 startup.S ISR(Interrupt Service Routine) RTOS - Real Time Operating Sys..