제법 규모가 있는 프로젝트의 경우 수많은 소스코드로 이루어져 있다. 비단 큰 프로젝트가 아니더라도 새로운 코드를 작성할 때 완전히 빈 화면에서부터 시작하여야 한다.이런 경우 그냥 빈화면 보다는 뭔가 미리 필요한 내용이 기본으로 들어가 있으면 전체적인 코드의 모양도 일관성 있게되고 여러명의 개발자가 공동으로 작업하게 되더라도 이질감 없이 코드를 공유하기가 쉬워진다.이번 글에서는 코드 확장자에 맞는 기본 템플릿 코드를 만드는 방법을 공유하고자 한다.위의 그림은 d:\work\c\tmp 디렉토리에 hello.h hello.cpp 파일을 생성해주는 경우이다. cpp의 경우 class까지 같이 생성해 주려면 class name도 입력해주면 된다.위와 같이 선택한 다음 Create 버튼을 눌러주면 다음과 같은 ..
임베디드 시스템 프로그램을 개발하다 보면 실제로 임베디드용 프로그램을 개발하는 머신과 빌드된 결과물이 동작되는 머신이 다름으로 인해서 생기는 문제가 가끔씩 발생한다.새로운 기능을 추가하거나 발견된 오류를 수정해서 타겟 보드에 실행시켰는데 예상대로 동작하지 않는 경우가 있다. 그럴때에 코딩이 잘못되었다고 판단해서 아무리 이리저리 수정해도 전혀 개선되지 않아서 고생하는 경우가 있는데 결국 그 원인이 수정된 결과물 파일과 보드에 내린 파일이 달라서 그랬던걸 한참 뒤에서야 발견하게 되는 경우이다.이번 글에서는 이런 문제를 조금이라도 줄여 볼 수 있는 방법에 대해서 알아본다.#include #include int main(int argc, char** argv) { if (argc [z]\n"); ..
주요 칩제조사들은 개발자들이 해당 칩에서 동작되는 프로그램을 쉽게 개발하도록 통합개발환경(IDE)을 무료로 혹은 일부 비용을 받고 전용 도구를 제공한다. 그러나 칩제조사에서 만드는 대부분의 칩을 지원하도록 하기위해서 개발도구의 프로그램도 커지고 컴퓨터의 자원도 많이 필요로한다. 무료로 제공되는 개발환경에 포함되는 컴파일러는 대부분 GCC 기반인 경우가 많기 때문에 전용도구 없이도 칩에서 동작되는 프로그램을 개발할수 있다.이번 글에서는 윈도우 OS에서 cmake를 사용해서 AVR 칩용 프로그램을 개발하는 환경을 구성하는 방법에 대해서 설명한다.필요한 파일은 AVR용 GCC toolchain과 make, cmake, git이다.먼저 gcc를 다운받아서 설치한다.설치하는 위치는 c:\tools 에 하는걸로..
앞에서 알아 본 TIMEUTC와 POSLLH 메시지를 분석하여 현재 시간과 위치를 출력해서 제대로 동작되는 프로그램을 만들어 볼 것이다. 위에 보이는 그림처럼 일정한 주기로 보내주는 시간과 위치 정보를 분석하여 콘솔화면에 출력해 보는 것이다. void setup() { uart0.init(); uart1.init(); stdout = std_inout; _delay_ms(500); printf("\x1B[2J\x1B[H GPS Test Program\n"); send_cfg_prt(); _delay_ms(100); gps.cfg_msg_utc(); _delay_ms(100); gps.cfg_msg_loc(); sei(); } 두개의 UART를 초기화 한다음 UART0로 디버깅 메시지를 출력해주기 위해서 ..
이전의 두개의 글에서 현재 시간을 가지고 오거나 현재 위치 정보를 가지고 오기 위해서는 매번 필요한 키를 입력해 주었다. GPS 모듈에 처음 전원이 들어왔을때 NMEA 메시지를 주기적으로 보내주는 것처럼 UBX 메시지도 주기적으로 보내주면 좋을것 같다. 이를 위해서 CFG-MSG 패킷을 이용하면 된다. CFG-MSG 패킷에 원하는 메시지에 해당하는 class ID와 message ID를 넣어주면 된다. void loop() { uint8_t ch; if (uart0.getchar(ch)) { if (ch == 'p') gps.cfg_prt(); if (ch == 'm') gps.cfg_msg(); if (ch == 'u') gps.nav_utc(); if (ch == 'l') gps.nav_loc(); ..
현재 위치 정보를 가지고 오기 위한 UBX 메시지는 NAV-POSLLH 이다 void loop() { uint8_t ch; if (uart0.getchar(ch)) { if (ch == 'p') gps.cfg_prt(); if (ch == 'u') gps.nav_utc(); if (ch == 'l') gps.nav_loc(); } if (uart1.getchar(ch)) { uart0.puthex(ch); } } void Gps::nav_loc() { make_header(CLASS_NAV, NAV_POSLLH, 0); chksum(0); uart1.send_data(gps_data, 8); } 'l' 키를 누르면 NAV-POSLLH request 메시지를 내 보낸다. 오렌지 색으로 보이는 영역이 경도 ..
현재 시간을 알려주는 UBX 패킷은 NAV-TIMEUTC이다. void loop() { uint8_t ch; if (uart0.getchar(ch)) { if (ch == 'p') gps.cfg_prt(); if (ch == 'u') gps.nav_utc(); } if (uart1.getchar(ch)) { uart0.puthex(ch); } } void Gps::nav_utc() { make_header(CLASS_NAV, NAV_TIMEUTC, 0); chksum(0); uart1.send_data(gps_data, 8); } 'u' 키를 누르면 UTC time을 가지고 오는 패킷을 내보낸다. request 메시지는 payload없이 class ID와 message ID만 보내주면 된다. 빨간색으로 ..
첫번째로 구현할 UBX 패킷은 CFG-PRT이다. GPS 모듈은 전원이 인가되면 기본적으로 몇개의 NMEA 메시지를 자동으로 송신하도록 되어 있다는 것은 앞에서 몇차례에 걸쳐서 얘기하였다. UBX 패킷을 이용하기 위해서는 자동으로 송신되는 NMEA메시지를 보내지 않도록 해주어야 한다. 이를 위해서 CFG-PRT 패킷을 사용하면 된다. 위의 그림은 CFG-PRT 패킷의 구조를 설명하고 있는데 여기에서 중요한 부분은 Proto Mask 부분이다. 그림에 표시되어 있는것처럼 NMEA 메시지와 UBX 메시지를 enable/disable 할수 있다. CFG-PRT메시지를 보낼때 UBX 메시지만 송수신 할수 있도록 해주면 된다. void loop() { uint8_t ch; if (uart0.getchar(ch))..
앞에 글에서 본 것처럼 GPS에서 보내는 데이터는 모두 $로 시작되는 문자열로 되어 있다. 콘솔창에 보이는 데이터는 NMEA protocol로 정해진 표준에따라 정의되어 있다. 위의 그림처럼 $로 하나의 프레임이 시작되고, 뒤이어 GP문자열이 나온다. 메세지 종류에 따라 세글자로 구분되어 진다. 예를 들어, 위치정보에 해당되는 메세지 코드는 GLL이며 다음과 같이 정의 된다. $GPGLL,다음에 위도에 해당되는 값이 나오고, 북위 혹은 남위를 나타내는 글자가 나온다. 다음으로는 경도값이 나오고 동경, 서경을 구분하기 위한 글자가 뒤따른다. 그 다음에는 시간정보도 같이 나온다. 예를 들어 위와 같이 4717.11364N, 00833.91565E와 같은 데이터가 들어 왔다면 아래와 같은 방법으로 변환 하면된..
프로젝트에 사용하는 GPS 모듈은 UART 통신을 사용하므로 UART 블럭이 2개 이상 지원되는 마이크로컨트롤러를 사용하는것이 프로그램 디버깅에 편리하다. 따라서 이번 프로젝트에서는 UART가 2개 들어있는 Atmega128A를 사용한다. Atmega128A 프로젝트를 생성하고 CPU 클럭을 위 그림처럼 보드에 맞게 설정해 준다. 참고로 C++ 프로젝트로 진행할것이기 때문에 AVR/GNU C++ Compiler에서 Symbols를 선택하였지만, 만약 C 프로젝트라면 AVR/GNU C Compiler에 있는 Symbols를 선택한 후 F_CPU값을 입력해 주어야 한다. 프로젝트 생성이 끝나면 UART0는 디버깅을 위하여 baudrate 값을 115200로 설정하고, UART1은 GPS와 연결하기 위하여 9..