PC에서 타겟으로 firmware 파일 등을 전송 시 시리얼 포트를 통하여 전송할 경우, 이들 파일은 대부분 바이너리 형식을 취하기 때문에, 시리얼통신의 제어문자와 바이너리 테이터와의 구별이 불가능 합니다. 따라서 제어 문자 와 구별이 가능 하면서도 바이너리코드를 전송할 수 있는 방법이 hex 파일 포맷 입니다. hex 파일의 포맷은 다양한 방식이 존재 합니다. 인텔, 모토롤라, S레코드 등 메이져 칩벤더의 고유의 방식이 있습니다.

hex 파일의 포맷은 바이너리 데이터와 제어문자의 충돌을 피하기 위해 바이너리 데이터의 코드값을 바이트 단위의 아스키문자로 변환하여 이를 텍스트화 시킨 것 이다.

 

MARK

Length

OffSet

Type

Data

CheckSum

:

1바이트

2바이트

1바이트

0~255바이트

1바이트



① MARK

HEX파일의 모든 레코드는 ":" 문자(아스키코드 "3A")로 시작해야 한다. 이를 레코드 마크(MARK)라고 한다.


② Length

각 레코드에 포함된 바이너리 데이터의 길이이다. Length 필드의 크기가 1바이트이므로 Data 필드는 0~255바이트의 문자를 지녀야 한다. 예컨데, 레코드의 Data 10개이면 10 = 0x0A 이므로 Length 필드에는 "0A"의 텍스트파일 형식으로 기입된다. 따라서, 실재 Length필드는 ASCII문자 2바이트를 필요로 한다. 이하, Offset, Type, Data, CheckSum 모두 마찬가지이므로 주의하도록 하자.

 ③ Offset

바이너리파일의 처음위치로부터 해당 레코드의 데이터가 위치하는 상대적 위치를 말한다. Offset 2바이트(=16비트)의 값을 가지므로 8, 16비트 CPU의 경우 어떠한 어드레스라도 OffSet 필드를 이용해서 직접 어드레싱이 가능하다. 그러나, 20, 32비트 CPU의 경우엔 16비트의 OffSet만으로는 직접 어드레싱이 불가능하므로 간접 어드레싱해야 하는데, 이를 구별하기 위해 필요한 필드가 Type필드이다.

 ④ Type

레코드타입을 뜻함. 00의 경우 데이터 어드레스, 01의 경우 HEX파일이 종료됨을 뜻하는 레코드를 의미한다. 8, 16비트 CPU HEX 파일은 이 두가지 경우만 필요하지만, 20, 32비트 CPU에서는 추가적인 레코드를 필요로 한다. 이들 추가 레코드 타입에 대해서는 첨부된 자료를 참고하도록 하자.


 ⑤ Data

바이너리 데이터이다. 하나의 레코드 안에 포함될 수 있는 데이터의 개수는 0 ~255개까지이다. 그보다 데이터 수가 많을 경우에는 적당한 개수만큼 분할하여 레코드를 생성해야 한다.


 ⑥ CheckSum

HEX파일로 수신한 디바이스에서 올바른 바이너리 파일 변환을 위해 각 레코드가 오류없이 수신되었는지 체크하는 필드이다. CheckSum을 구하는 방법은 ② ~ ⑤의 필드를 바이트 단위로 쪼개어 모두 더한 다음 2의 보수(2's Complement)를 취하면 된다. 그 값이 1바이트를 넘을 경우 상위바이트의 값은 버리고 최하위 1바이트 부분만을 취한다.

 이제 바이너리 파일이 어떻게 HEX 파일로 변환되는지 실습해 보도록 하자.

 먼저, 바이너리 파일의 일부분을 열어봤다.

 02 01 55 78 7F E4 F6 D8

FD 75 81 16 02 00 84 8F

0C 8E 0B 8D 0A 8C 09 ...

 

이를 HEX 파일로 변환하면 다음과 같다.

 

:03000000020155A5
:
0C015500787FE4F6D8FD75811602008466
:
0800C2008F0C8E0B8D0A8C09D6

 

'AVR > S/W 이야기' 카테고리의 다른 글

megaboot 입니다.  (0) 2009.08.23
표준 CRC16 TABLE 입니다.  (2) 2009.08.23
AVR ATmega128 Rsgister 정리 입니다.  (0) 2009.08.23
AVR Calculate  (0) 2009.08.09
AVR 디버깅 방법론  (1) 2009.08.08

megaboot 입니다. AVR의 Bootloader 라 보시면 됩니다.

예전 프로젝트시 원격 업그레이드 기능이 필요하여 외주 처리를 하였는데 한 300 정도
든 것 같았습니다.
인터넷 서핑 을 하다 발견하여 열어보니 프로토콜 처리 부분 빼고 동일하더군요 ㅡㅡ;;;
저와같은 실수를 하지 마세요ㅜㅜ

'AVR > S/W 이야기' 카테고리의 다른 글

Intel Hex 파일의 이해  (0) 2009.08.27
표준 CRC16 TABLE 입니다.  (2) 2009.08.23
AVR ATmega128 Rsgister 정리 입니다.  (0) 2009.08.23
AVR Calculate  (0) 2009.08.09
AVR 디버깅 방법론  (1) 2009.08.08

//===========================================================================
// CRC 체크 표준
//===========================================================================
// KS초안_KSCIEC62056-61 에 정의된 표준 CRC 16 계산 테이블 입니다.
// 유용하게 사용하세요.

//---------------------------------------------------------------------------
// 계산식
#define SCrcCal(data) SCRC = ( (SCRC>>8) ^ Crc16Tbl[ (SCRC^data) & 0xFF ] )
U16 SCRC = 0xFFFF;

//---------------------------------------------------------------------------
// 표준 CRC 테이블
U16 Crc16Tbl[256] = {
    0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, 0xC601, 0x06C0, 0x0780,
    0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1,
    0xCE81, 0x0E40, 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841, 0xD801,
    0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, 0x1E00, 0xDEC1, 0xDF81, 0x1F40,
    0xDD01, 0x1DC0, 0x1C80, 0xDC41, 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680,
    0xD641, 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040, 0xF001, 0x30C0,
    0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501,
    0x35C0, 0x3480, 0xF441, 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
    0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840, 0x2800, 0xE8C1, 0xE981,
    0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1,
    0xEC81, 0x2C40, 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, 0x2200,
    0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041, 0xA001, 0x60C0, 0x6180, 0xA141,
    0x6300, 0xA3C1, 0xA281, 0x6240, 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480,
    0xA441, 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, 0xAA01, 0x6AC0,
    0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840, 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01,
    0x7BC0, 0x7A80, 0xBA41, 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
    0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, 0x7200, 0xB2C1, 0xB381,
    0x7340, 0xB101, 0x71C0, 0x7080, 0xB041, 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0,
    0x5280, 0x9241, 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440, 0x9C01,
    0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, 0x5A00, 0x9AC1, 0x9B81, 0x5B40,
    0x9901, 0x59C0, 0x5880, 0x9841, 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81,
    0x4A40, 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41, 0x4400, 0x84C1,
    0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100,
    0x81C1, 0x8081, 0x4040
};

/*
 SCRC = 0xFFFF;
 SCrcCal(0x30);
 SCrcCal(0x31);
 SCrcCal(0x32);
 SCrcCal(0x33);
 SCrcCal(0x34);
 printf("SCRC = 0x%02X%02X\n",(unsigned char)(SCRC>>8),(unsigned char)SCRC); // "SCRC = 0x10DE"
 SCrcCal(0xDE);
 SCrcCal(0x10);
 printf("SCRC = 0x%02X%02X\n",(unsigned char)(SCRC>>8),(unsigned char)SCRC); // "SCRC = 0x0000"
*/


'AVR > S/W 이야기' 카테고리의 다른 글

Intel Hex 파일의 이해  (0) 2009.08.27
megaboot 입니다.  (0) 2009.08.23
AVR ATmega128 Rsgister 정리 입니다.  (0) 2009.08.23
AVR Calculate  (0) 2009.08.09
AVR 디버깅 방법론  (1) 2009.08.08

'AVR > S/W 이야기' 카테고리의 다른 글

Intel Hex 파일의 이해  (0) 2009.08.27
megaboot 입니다.  (0) 2009.08.23
표준 CRC16 TABLE 입니다.  (2) 2009.08.23
AVR Calculate  (0) 2009.08.09
AVR 디버깅 방법론  (1) 2009.08.08

1. 콘덴서란?

콘덴서란 전기를 축적하는 기능을 가진 수동 소자 입니다.  하지만 일반적인 회로설계에서의 콘덴서는 전기를 축적하는 기능 이외에 직류 전류를 차단하고 교류전류를 통과시키려는 목적으로 사용이 됩니다.
콘덴서는 기본적으로 2장의 전극판을 대향시킨 구조로 되어 있습니다. 여기에 직류 전압을 걸면, 각 전극에 전하라고 하는 전기가 축적되고 축적하고 있는 도중에는 전류가 흐르게 됩니다. 하지만 축적이 완료된 상태에서는 전류는 흐르지 않게 됩니다.
100uF 정도의 전해콘덴서에 테스터기의 저항 측정 모드에 놓고 접속시키면 순간 전류가 흘러 테스터기의 바늘이 움직이는 것을 확인 할 수 있습니다. 그러나 축적이 끝난 직후 바로 0으로 되고 맙니다. 이처럼 직류전압이 콘덴서에 가해진 경우, 순간적으로 전류가 흐르지만 후에 흐르지 않기 때문에 직류를 통과시키지 않으려는 용도에도 사용이 되게 됩니다. 하지만 교류의 경우 전류가 흐르게 되어, 교류 전류는 흐르게 되는 것 입니다.
콘덴서는 전극간에 절연체의 재질에 따라 나눠지게 됩니다.
콘덴서의 용량을 나타내는 단위는 패러드(farad :F)가 사용되며 일반적으로 사용되는 콘덴서의 축적 전하용량은 매우 작기 때문에 uF이나 pF의 단위가 사용됩니다. 최근에는 슈퍼 케패시터라 불리우는 매우 코용량의 콘덴서도 등장하였습니다.

앞서 우리는 콘덴서에 대하여 알아보았습니다. 제 블로그의 데이터시트 부분을 보시면 몇몇가지의 콘덴서 데이터시트를 찾으실 수 있습니다. 국내의 전문 콘덴서 업체는 삼영전자공업과 석영전자 두군데의 업체가 있습니다. 홈페이지를 보시면 많은 종류의 콘덴서 종류와 스펙을 확인하실 수 있습니다.

2. 콘덴서의 종류

2.1 알루미늄 전해 콘덴서

단순히, 전해콘덴서 또는 케미콘(chemical condenser)이라고도 부릅니다.
이 알루미늄 전해 콘덴서는 유전체로 얆은 산화막을 사용하며 전극으로 알루미늄 소재를 사용합니다. 이 전해 콘덴서는 크기에 비해 매우 큰 용량을 얻을 수 있으며 가격이 저렴하고 유전체의 굵기를 매우 얆게 할 수 있습니다.
또 다른 특징으로는 극성을 갖고 있어 회로 설계 및 조립시 극성에 주의해야 합니다. 일반적으로 마이너스 극성의 리드를 표시하는 부분에 흰색 띠를 표시하며 리드의 길이에 따라서도 극성을 표시 합니다. 알루미늄 콘덴서의 용량 및 전압은 자재의 표면에 16V/100uF 이러한 형식으로 표기가 되며, 1uF 에서 수천uF, 수만uF의 큰 용량의 제품군이 있습니다. 주요 사용 용도는 전원의 리플 및 맥동 제거를 위한 평활회로, 저주파 바이패스(저주파 성분의 노이즈를 그라운드 등에 패스 시켜 회로 동작을 유연하게 해 준다) 등에 사용됩니다. 단 코일 성분이 많아 고주파에는 적합하지 않으며 이를 곧 주파수 특성이 나쁘다고 말합니다.

2.2 알루미늄 전해 콘덴서



'AVR > H/W 이야기' 카테고리의 다른 글

128 회로 설계시 주의 점!!  (0) 2009.06.22
푼수의 블로그 개설  (0) 2009.06.18

AVR 타이머 / UART 레지스트리 세팅의 계산을 편하게 해주는 툴 입니다.

'AVR > S/W 이야기' 카테고리의 다른 글

Intel Hex 파일의 이해  (0) 2009.08.27
megaboot 입니다.  (0) 2009.08.23
표준 CRC16 TABLE 입니다.  (2) 2009.08.23
AVR ATmega128 Rsgister 정리 입니다.  (0) 2009.08.23
AVR 디버깅 방법론  (1) 2009.08.08

AVR이나 ARM을 이용한 제품 개발시 디버깅을 할 수 있는 방법이 있느냐 없느냐는 매우 큰 차이를 가지게 됩니다.
(전 ARM쪽은 프로젝트를 그리 많이 해보지 않았기에 아직 기초적인 단계에 머물러 있습니다.
대충 이런이런 방법으로 개발하면 되겠구나 하는 것은 알겠지만 실제 구현에 있어서는 막막합니다.)

ARM은 ARM전용 디버깅 장비인 Multi ice 나 RealView ICE를 이용하여 디버깅을 합니다.
하지만 여타 8Bit Mcu의 디버깅 툴에 비해 매우 고가에 거래가 됩니다.
실 예로 avr jtag ice 구입시 약 55만원에 구입을 하였습니다. arm jtag ice 구입시에는 근 400만원이 넘는 돈을 주고 구입을 하였습니다. 이처럼 전용 디버깅 장비를 개인이 구매하기엔 매우 큰 돈을 사용하게 됩니다. 물론 많은 기능이 지원되고 다양한 플랫폼이 지원되기는 하지만 개인이 사용하기엔 큰 부담이 될 수 밖에 없는 것 같습니다.
그래서 전 다른 방법을 사용하여 개발시 디버깅에 사용을 합니다.
여기서는 AVR을 중점적으로 디버깅 하는 방법을 기술하고자 합니다.

1. 오실로 스코프를 이용한 펌웨어 디버깅
  가장 단순하면서도 그리 많은 디버깅이 필요치 않을 경우 사용하는 방법 입니다.
mcu를 사용하다보면 남는 포트가 몇몇개 있을 것 입니다. 전 그 포트에 TP를 뽑아 오실로스코프와 연결 한 후 펌웨어 작업시 알맞은 루틴에 정확히 로직대로 입력이 되는지 혹은 정확한 타이밍에 정확한 데이터가 출력이 되는지를 포트의 High / Low 를 이용하여 확인 합니다. 별다른 하드웨어 수정 없이도 가능한 방법이기에 간단한 디버깅용으로 사용하기엔 알맞춤입니다.

2. JTAG를 이용한 펌웨어 디버깅
 가장 이상적인 방법입니다만 문제는 돈이 든다는 것 입니다. 중국산의 저가 장비나 국내 업체의 저가 JTAG가 있긴 합니다. 하지만 atmel 사의 디버깅 장비에 비해 많은 chip을 지원하지는 않습니다.
국내 연구소 및 교육시설의 경우 atmel사의 디버깅 툴을 추천 하며 개인의 경우 많이 사용하는 mcu를 지원하는 저가 툴을 사용하는 것을 추천 합니다.
 디버깅 장비를 이용시 각 각 펌웨어의 포인트에 브레이크 포인트를 잡아 어느 변수에 무슨 값이 들어가는지 레지스터가 제대로 세팅 되었는지 확인이 가능합니다. 하지만 이러한 jtag를 이용한 디버깅에도 한가지 큰 단점이 있습니다. atmega 시리즈의 디버깅 툴 이용 방법은 두가지를 제공합니다. 적은 핀 수를 가진 칩을 위한 디버그 와이어 모드와 jtag 모드 입니다. 이 두가지 방법 모두 퓨즈 비트를 세팅시 프린터포트를 이용한 하이볼테이지 프로그래밍을 이용하지 않는 이상 다시는 isp를 이용하여 펌웨어를 다운로드 시키지 못합니다.

3.  UART / RS232를 이용한 펌웨어 디버깅
  제가 가장 추천하는 방법 중의 하나 입니다. 전 제품의 하드웨어 설계시 남는 uart 포트를 이용하여 max232 칩의 pad를 하나 만들어 둡니다. 제품의 샘플 단계에서는 232칩을 이용하여 pc와 통신하며 rprintf 기능을 이용하여 디버깅에 사용합니다. 제가 보고자 싶은 함수의 리턴 값이나 변수값을 uart 포트를 이용하여 pc와 통신하여 확인하며 사용합니다. 사용법도 간단하며 많은 돈을 들이지 않고도 쉽게 디버깅을 할 수 있어 매우 유용합니다. 제품 양산시에는 232 관련 부분은 pad만 남겨두고 부품은 실장하지 않아 제품의 mc에도 영향이 매우 미비합니다. 다음번 글은 uart / 232를 이용하여 디버깅을 하는법을 써보고자 합니다.^^

'AVR > S/W 이야기' 카테고리의 다른 글

Intel Hex 파일의 이해  (0) 2009.08.27
megaboot 입니다.  (0) 2009.08.23
표준 CRC16 TABLE 입니다.  (2) 2009.08.23
AVR ATmega128 Rsgister 정리 입니다.  (0) 2009.08.23
AVR Calculate  (0) 2009.08.09
전 대부분 mega162나 88 등을 많이 사용합니다.
제가 하는 프로젝트 대부분이 많은 포트를 필요로 하거나 많은 기능이 필요로 하지 않기에 소형이며 mc가 낮은 mcu를 주로 사용합니다.
하지만 이번 신규 제품은 128을 사용하기로 하였습니다. 포트가 많이 필요하고 128정도의 포트면 포트확장을 하지 않고 바로 mcu만으로도 구현이 가능하겠다 하여서 입니다.
기본 회로 설계 후 1차 샘플이 출고되어 간단한 쇼트 검사 후 테스트를 하였습니다. ( 신규 제품의 경우 샘플 제작시 오삽이나 미삽 역삽 같은 것이 많아 매우 조심합니다 -_- 눈앞에서 폭발할 경우 ㄷㄷㄷ 하죠 ㅎㅎ)
미리 제작해 놓은 펌웨어를 다운로드 하려 하였으나 아무리 해도 안되는 것 입니다.
isp부분 회로를 봐도 틀린점이 없습니다. RESET , VCC, GND, MISO, MOSI... 다 확인을 하여도 이상이 없는 것 입니다.. 128 데이터 시트를 뒤지지 시작하였습니다 ..
헉~! 128은 isp를 miso mosi 를 사용하지 않고 rxd1, txd1 을 사용하는 군요 ㅡㅡ;;;
몇달 전에도 똑같은 실수를 해놓고 또 반복하고야 말았군요 ㅠㅠ
128 사용시 꼭 isp 핀 확인 합니다!!!!


'AVR > H/W 이야기' 카테고리의 다른 글

콘덴서의 종류와 선정  (0) 2009.08.22
푼수의 블로그 개설  (0) 2009.06.18

일전에 운영하던 네이버 블로그를 떠니 티스토리에서 새로운 보금자리를 트려합니다.

낮은 글 실력과 미천한 엔지니어로서 도움이 많이 되는 정보를 드릴 순 없을 듯 합니다..

하지만 제가 겪었던 문제는 다른 사람도 많이 겪을 수 있는 문제라 생각이 듭니다.

해결되지 않은 문제에 밤샘을 밥먹듯 하시며, 월화수목금금금을 반복하는 우리 대한민국 엔지니어

여러분을 위해 조금이나마 도움이 되고자 싶어 블로그를 운영하며 또한 저 역시 제가 이전에 남겨놓은

여러 글에 의해 도움을 받을 때도 많았습니다. 이에 여러분들께서도 작으나마 응원 부탁드립니다. ^^

'AVR > H/W 이야기' 카테고리의 다른 글

콘덴서의 종류와 선정  (0) 2009.08.22
128 회로 설계시 주의 점!!  (0) 2009.06.22

+ Recent posts