'공부합시다/임베디드'에 해당되는 글 14건

  1. 2009.09.09 [ARM] 톨러런트
  2. 2009.09.07 소스 인사이트 include 파일 싱크 시키기와 ATmega128 용 프로젝트 생성하기
  3. 2009.06.10 [ARM] elf32-littlearm.lds 파일 분석
  4. 2009.06.10 [ARM] Boot Code(Startup Code)
  5. 2009.06.04 [ARM7] LCD 사용자 문자 출력
  6. 2009.05.28 [ARM7] H-JTAG와 Wiggler형 JTAG 인터페이스 OK-JTAG의 사용법
  7. 2009.05.26 [프로그램] GNU ARM 을 설치하자.
  8. 2009.05.26 [프로그램] cygwin 설치법
  9. 2009.04.28 [ATmega128] RS232 시리얼 통신 관련 레지스터 정리
  10. 2009.04.24 [ATmega1128] ATmega128은 Little endian일까 Big endian일까 2
2009. 9. 9. 09:47

[ARM] 톨러런트

톨러런트란?



ARM은 3.3V로 구동되지만 5V까지의 입력을 받아도 견딜 수 있게 되어 있다.

즉, ARM은 3.3V나 5V의 입력을 받아 3.3V로 구동된다.

이런 방식을 톨러런트라고 한다.
2009. 9. 7. 11:30

소스 인사이트 include 파일 싱크 시키기와 ATmega128 용 프로젝트 생성하기

먼저 새 프로젝트를 생성합니다.



상단의 입력 폼에는 프로젝트의 이름을 적습니다.
하단에는 include 할 헤더 파일들을 어디서 가져올 것인지를 정하는 것인데, browse를 클릭합시다.


win avr 이 설치된 디렉터리로 가서 avr/include 디렉토리를 선택해 줍니다. (만약, 다른 컴파일러용 프로젝트를 생성한다면 해당 컴파일러의 include 디렉토리를 선택해주면 됩니다.)

그러면, 새 프로젝트 설정창이 나옵니다.


프로젝트에 사용될 소스 파일이 있는 디렉토리를 선택해 줍니다.

그러면 다음과 같은 화면이 나오고, 이제 프로젝트에 참조할 include 파일들을 실제로 추가 시켜주는 작업이 남았습니다.


include 디렉토리를 선택하고 Add All을 선택합니다.


위와 같은 화면이 나오는데 첫번째 것을 선택하면 하위 디렉토리의 파일도 같이 포함시킨다는 것이고, 그 아래 것은 하위의 모든 하위까지 포함시킨다는 것인데, 이것을 선택하면 다른 칩들의 헤더파일까지 모두 포함시켜버리므로 두개의 체크를 풀어줍시다.



이제 하위 디렉토리를 포함시켜 줘야 하는데 Compat과 Util 디렉토리는 칩과는 상관없이 공통으로 필요한 헤더들이므로 모두 포함시켜 줍시다.



Avr 디렉토리에서는 위쪽의 Io1200.h 앞의 파일까지와 아래쪽 Iox64a3.h 아래쪽 파일들 역시 칩과 관계없이 공통으로 필요한 헤더들이므로 더블 클릭이나 Add 버튼으로 포함시켜 줍니다.


이제 사용하는 칩의 헤더파일을 포함시켜주면 끝입니다. ATmega128용 프로그램을 작성한다면, Iom128.h를 포함시켜주고 Close를 클릭합니다.

이제 프로젝트에 포함된 헤더파일들을 실제 소스에서 참조 할 수 있도록 동기화를 시켜 주어야 합니다.

Project - Synchronize Files 를 선택해 줍니다.



첫번째 것을 체크하게 되면 좀전에 디렉토리에는 있지만 포함시키지 않은 파일들이 다시 포함되어버립니다. 따라서 체크를 해제 해주고 두번째 것만 채크해 주면 동기화를 시작하고 프로젝트를 시작할 준비가 모두 끝납니다.


이제 소스에서 매크로 함수나 define 값등을 ctrl 을 누른 상태로 클릭하게 되면 해당 헤더 파일로 링크를 시켜줍니다. 다만 이것은 소스 인사이트 내에서 보여주는 것일 뿐이고 실제로 컴파일 할때는 소스에서 직접 include를 시켜줘야 참조하게 됩니다.
2009. 6. 10. 21:11

[ARM] elf32-littlearm.lds 파일 분석

링커 스크립트인 elf32-littlearm.lds 파일에 대한 분석이다.

링커 스크립트는 링커에게 코드배치를 이렇게 하라고 설명하는 파일이며, 더 자세한 내용은 다음의 포스트를 참조하자.



/* elf32-littlearm.lds 파일 */

//이 부분은 arm-linux-ld가 만들어 낼 최종 결과 파일의 포맷을 나타낸다.
//즉, little endian 포맷의 파일을 생성할 것인지,
//big endian 포맷의 파일을 생성할 것인지를 결정하는 역할을 한다.

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")

//이 부분은 최종 결과 파일이 동작할 CPU의 architecture를 나타낸다.
//즉, 이 파일은 ARM CPU 상에서 동작한다는 의미이다.

OUTPUT_ARCH(arm)

//최종 결과 파일의 시작 지점을 나타낸다.
//즉, 여기서 파일의 시작 지점은 reset_handler가 된다.
//reset_handler는 Cstartup.s 파일에 정의되어 있다.

ENTRY(reset_handler)

//SECTIONS{ ... }부분은 링커(arm-linux-ld)가 입력 파일들의 섹션들을
//결과 파일의 어떤 섹션들로 위치시킬지를 결정하는 역할을 한다.

SECTIONS
{
    .text : {          //프로그램의 코드영역
        _stext = .;      //코드영역의 시작주소를 makefile로 부터 가져온다.
        *(.text)        //모든 입력 파일들(*)의 .text 섹션을 결과 파일의 .text 섹션에 위치시킨다.
        *(.rodata)      //readonly 파일들을 .text 섹션에 위치시킨다.
        *(.rodata*)    //그외 모든 데이터들을 .text 섹션에 위치시킨다.
        . = ALIGN(4);  //현재의 위치에서 4 바이트 단위로 놓겠다는 의미이다.
                                 // 즉, 4바이트 단위로 메모리를 정렬한다.

         _etext = . ;    //코드영역의 끝을 현재 위치포인트로 하겠다는 의미이다.
    }

    //데이터 영역
     //코드영역 시작주소부터 코드영역의 크기만큼 더한다음 주소 즉, 코드영역 다음 주소
    .data : AT ( ADDR (.text) + SIZEOF (.text) ) { 
        _sdata = .;
        *(.vectors)    //모든 입력 파일의 벡터 테이블을 데이터 영역에 포함
        *(.data)       //모든 입력 파일의 초기화 된 데이터를 데이터 영역에 포함
        _edata = .;
    }

     //bss 영역
     //noload = 적재하지 않는다.
    .bss (NOLOAD) : {
        . = ALIGN(4);
        _sbss = .;
        *(.bss)         //모든 입력 파일의 bss영역을 출력파일의 bss영역에 포함한다.
        _ebss = .;
    }
}
end = .;


2009. 6. 10. 11:36

[ARM] Boot Code(Startup Code)

1. Reset (장치를 켜거나 리셋)
2. 0번지로 점프
3. reset handler
4. low level init 호출(하드웨어 초기화)
5. remap
6. 메모리 초기화
    6-1. Stack 영역 초기화
    6-2. Data 영역 초기화
    6-3. BSS 영역 초기화
//여기까지 boot code(or startup code)

7. main 호출
2009. 6. 4. 15:13

[ARM7] LCD 사용자 문자 출력

텍스트형 LCD 모듈에서 사용자 정의 문자를 보내는 방법에 대해 알아보자.

보통 기본적으로 텍스트형 LCD 모듈은 LCD 콘트롤러를 내장하고 있어서, 이것의 내부에 있는 CG ROM안에는 192개(일본어형) 또는 240개(유럽형)의 기본 문자 폰트를 가지고 있어서 사용자가 화면에 표시하고자 하는 문자 코드를 DD RAM에 써주기만 하면 이것에 해당하는 폰트가 자동으로 CG ROM에서 찾아져서 화면에 디스플레이 된다.

그러나 한글과 같이 정의되어 있지 않은 문자를 출력하려면, 사용자가 문자를 정의해서 사용해야 하는데, 이와 같이 사용자 정의문자를 지정하는데 사용하는 메모리가 CG RAM이며, 이 CG RAM에는 5x7 도트를 사용하는 경우에 최대 8문자까지 정의할 수 있고, 5x10도트의 경우에는 최대 4문자까지 정의하여 사용할 수 있다.

<5x8에서 '가'를 그린 모습>


LCD 모듈의 CG RAM에 사용자 정의문자를 작성해 넣는 방법은 다음과 같다.

1. 가로가 5칸이므로 한바이트로 표현이 가능하다. 따라서 한줄을 한바이트로 정의하며, 총 8줄이므로 한글자는 8바이트가 된다.

2. 토트를 검게 표시하고 싶은 부분을 1로 하고 공백부분은 0으로 한다. 일반적으로 8번째 줄은 커서를 표시하기 위해 비우기도 한다.

3. 위의 '가'란 문자를 정의한다고 하면, 5칸으므로 8비트(1바이트)로 표시할 때 상위 3비트는 필요가 없다. 그리고 검게 표시된 부분은 2번째 비트이다. 따라서 이것을 2진수로 나타내면 xxx00010(x는 don't care)이고, 16진수로 나타내면 0x02가 된다.(don't care를 0이라 둔다면)

4. 이런식으로 8줄을 모두 정의한다.

5. 8줄을 묶어주기 위해 배열을 선언하는게 편하다. 소스로 나타내면 다음과 같을 것이다.

unsigned char font[8] = {0x02, 0x1A, 0x0A, 0x0A, 0x0B, 0x0A, 0x0A, 0x02};

이를 활용하여 한가인이라는 문자를 출력하는 프로그램을 작성하였다. (소스 일부임)

int main()
{
  InitLCD();
  SetFont();
  SendToLCD(10x80); //set ddram
  SendToLCD(00x03);  //하트
  SendToLCD(00x00);  //한
  SendToLCD(00x01);  //가
  SendToLCD(00x02);  //인
  SendToLCD(00x03);

  return 0;
}

void InitLCD()
{
  //LCD 제어 시작
  *PIO_PER = DBUS|RS|RW|EN|BL;        //병렬 입출력 활성화
  *PIO_OER = DBUS|RS|RW|EN|BL;       //  출력 활성화

  SendToLCD(10x3c);  //function set
  SendToLCD(10x06);  //Entry mode
  SendToLCD(10x1C);  //cursor shift
  SendToLCD(10x0C);  //Display On
  SendToLCD(10x01);  //Clear Display
  return;
}


void SetFont()
{
  int i;
  unsigned char font[] = {0x0a, 0x1e, 0x020x1b, 0x1a, 0x020x100x1e,  //한
                0x020x1a, 0x0a, 0x0a, 0x0b, 0x0a, 0x0a, 0x02,   //가
                0x090x150x150x150x090x000x080x0f,  //인
                0x000x0a, 0x1b, 0x1f, 0x1f, 0x0e, 0x040x00};   //하트

  SendToLCD(10x40);
  for(i=0; i<32; ++i)
  {
    SendToLCD(0, font[i]);
  }
  return;
}



결과 화면이다.


2009. 5. 28. 18:18

[ARM7] H-JTAG와 Wiggler형 JTAG 인터페이스 OK-JTAG의 사용법

 ARM 개발에 있어 사용자 프로그램의 다운로드와 프로그램의 디버깅을 할 수 있게 해주는 JTAG 에뮬레이터는 수십만원에서 수백만원에 이르는 비교적 고가의 개발장비이며, 여기에 사용되는 디버거 소프트웨어가 수백만원이 하므로 아마추어들은 사용하기가 어렵다.

 이러한 이유로 좀더 저렴하고 쉽게 사용할 수 있는 Wiggler라는 저가형 간이 JTAG 인터페이스가 있는데 이를 개발한 Macraigor사(http://www.macraigor.com)는 현재 더 이상 이러한 Wiggler JTAG 인터페이스를 지원하지 않고 있어, 여러 가지의 변형된 Wiggler 호환형 제품들만이 널리 사용되고 있다.

<Wiggler 호환형 JTAG 인터페이스>

 이러한 Wiggler 호환형의 JTAG 인터페이스를 사용하려면 하드웨어뿐만 아니라 이를 구동할 수 있는 운용 소프트웨어도 무료로 쉽게 구할 수 있어야 한다. 아마추어도 쉽게 구할 수 있는 무료 소프트웨어로 H-JTAG이란 프로그램이 널리 알려져 있다.

 H-JTAG은 Wiggler 호환의 JTAG 인터페이스와 함께 사용할 수 있는 디버그 도우미(debug agent)용의 무료 소프트웨어로서 http://www.hjtag.com 사이트에서 제공하는 H-JTAG Server 및 H-Flasher 프로그램으로 구성된다.
홈페이지에 접속해서 프로그램을 설치하자.



빨간색으로 네모친 곳을 클릭하여 H-JTAG을 다운받고 설치파일을 실행하자.




약관에 동의하고 다음


설치될 경로를 지정해주고 다음



설치가 완료되었다.


H-JTAG Server 프로그램은 내부적으로 H-Flasher 프로그램과 연계하여 ARM 소자에 내장되거나 또는 외부에 확장 인터페이스된 플래쉬 메모리를 프로그래밍하는 기능을 가진다. 이를 이용하면 SAM-BA GUI프로그램을 대신하여 사용자 프로그램을 다운로드할 수 있다.


H-JTAG Server를 실행시켜보자.


현재 장치가 연결되어 있지 않으므로 UNKNOWN이라고 표시된다. JTAG 인터페이스로 PC와 ARM을 연결하자.


사진에는 잘 보이지 않지만 JTAG에 보면 선마다 GND, TDI, TDO, TCK, TMS, VCC가 써있으며 거기에 맞게 ARM의 해당핀에 연결해주면 된다.

연결해준뒤 H-JTAG Server의 Operations-Detect Target을 해주면 장치를 읽게 되고 다음과 같이 화면이 바뀌게 된다.

<ARM CORE가 감지된 모습>

다시 H-JTAG Server에서 Setting - LPT JTAG Setting(패러럴포트이면) 메뉴를 선택하여 아래의 그림과 같이 설정한다.



H-JTAG Server에서 Setting - LPT Port Setting 메뉴를 선택하여 아래 그림과 같이 설정해준다.



Setting - Target Setting 메뉴으로 가서 아래 그림과 같이 설정한다.



Option 메뉴를 선택하여 아래 그림과 같이 설정한다.


Flasher - Start H-Flasher 메뉴를 선택하여 H-Flasher프로그램을 실행하여 아래와 같이 설정해주자.


<자신의 해당하는 모델을 선택하자>

<설정을 저장한다.>



이제 사용자 프로그램을 SAM-BA가 아닌 JTAG을 이용해서 전송해보자.

H-Flasher를 살펴보면 좌측에 Programing이란 항목이 있다.


 Type에는 Hexa 파일을 전송할건지, 바이너리 파일을 전송할건지등을 결정할 수 있다. 보낼 데이터의 타입에 맞게 설정해준다.
 Dst Addr은 Flash Base Address로 설정해준다.
 Src File에는 ...을 클릭해 소스를 선택해주자. 경로를 직접 써줘도 된다.

그리고 Type 옆에 있는 Program을 클릭하면 전송을 하게 된다.

<이로서 전송완료>


SAM-BA를 이용할 경우 TST로 10초간 리셋을 시켜줘야하는 불편함이 있지만 JTAG을 이용하는 경우 바로 전송이 가능하다는 장점이 있으므로 자주 애용하자.
2009. 5. 26. 11:38

[프로그램] GNU ARM 을 설치하자.

GNU ARM 홈페이지에 접속한다.

http://www.gnuarm.org/


홈페이지 상단 프레임에 FILES를 선택하면 GNUARM 바이너리 파일과 소스 파일들이 있다. 소스파일은 컴파일을 해줘야하니 편하게 바이너리 파일(실행파일)을 받자.


설치파일을 실행시키자.


다음을 클릭


약관에 동의하고 다음


설치할 경로를 지정해주고 다음


설치할 패키지를 선택해주고 다음(full installation 권장)


시작메뉴에 등록될 이름을 선택하고 다음(시작메뉴에 등록되지 않길 원한다면 아래 체크박스 체크)


GNU ARM Tool-chain을 Cygwin에서 사용할 것이므로, “Install Cygwin DLLs”는 선택하선 말 것. 만약 이것을 선택했다면, GNU ARM Uninstall을 실행한 후 처음부터 다시 설치한다.

이제 다음부터 나오는 대화 상자들은 계속 진행하도록 하고 “Install” 여부를 묻는 대화 상자가 나오면 “Install”을 선택한다. 인스톨을 다 마치면, “Finish”를 묻는 대화 상자가 나오는데, 그냥 “Finish”를 눌러 설치를 끝내면 된다.

제대로 설치 됐는지를 확인하기 위해 cygwin을 실행시켜보자.


$ arm-elf-gcc -v 라고 쳐서 버전이 제대로 나온다면 설치 완료.


만약 아래와 같은 화면이 나온다면,
Cygwin에  C:\cygwin\bin 안의 cywin1.dll 파일을 C:\GNUARM\bin 로 복사하고
다시 명령을 실행하면 된다.


2009. 5. 26. 10:03

[프로그램] cygwin 설치법

cygwin이란 윈도우에서 gnu 프로그램들을 사용할 수 있게 해주는 한마디로 윈도우 상에서 돌아가는 리눅스라고 할 수 있다. 오늘은 이 cygwin의 설치법에 대해 알아보자.

먼저 cygwin 홈페이지에 접속한다.



홈페이지 중간쯤에 보면 위의 그림과 같은 곳을 클릭하면 설치 파일을 받을 수 있다. 실행시키자.

다음을 누르자.

설치 파일을 다운로드 받아야 하므로 인터넷으로부터 설치를 선택하고 다음.

설치될 경로를 지정해주고 다음(디폴트는 c:\cygwin).

설치 패키지를 임시저장할 장소를 지정해주고 다음.

인터넷 설정에 맞게 선택하고(일반적으로 직접연결하면 됨) 다음.

파일을 받을 서버를 선택하고 다음(daum이 가장 빠른듯).

다운로드가 끝나면 gnu 유틸리티를 어떤걸 설치할지 묻는데 기본적으로 모두 skip으로 되있다.

+Devel을 펼쳐보면 gcc나 cvs같은 개발도구들이 있고 +Editors를 펼쳐보면 vi와 emacs같은 편집기들이 있다.
원하는 패키지가 있다면 Default를 한번 클릭하면 install로 바뀐다(몇 초정도 걸릴 수도 있다.)
인스톨할 패키지를 선택해주고 다음.


패키지를 다운 받는다. (앞에서 모두 선택했다면 1시간 정도 걸린다.)


설치가 모두 끝났다. vi와 gcc가 제대로 설치됐는지 확인해보면 끝.


윈도우의 C드라이브를 찾으려면 /cygdrive에 가면 볼수 있다.

2009. 4. 28. 11:50

[ATmega128] RS232 시리얼 통신 관련 레지스터 정리

USARTn I/O Data Register - UDRn

 RXBn[7:0]
 TXBn[7:0]

n은 ATmega128에는 두개의 레지스터가 있으므로, 0과 1로 두개를 구별한다.(ex. UDR0, UDR1)
데이터를 쓸 때는 TXBn에, 읽을 때는 RXBn에서 읽는다.


USART Control and Status Register A - UCSRnA

 RXCn TXCn
UDREn
FEn
DORn
UPEn
U2Xn
MPCMn

7bit - 2bit : Status      1bit - 0bit : Control
RXCn : USART Receive Complete
 - 이 레지스터는 수신버퍼(UDRn)에 읽지 않은 데이터가 있으면 1, 수신버퍼가 비어있으면 0이 된다.
TXCn : USART Transmit Complete
 - 송신 시프트 레지스터에 있는 송신 데이터가 모두 송신되고 UDRn의 송신 버퍼에 아직 새로운 데이터가 Write되지 않은 상태이면 1이 된다. 즉, 시프트 레지스터와 송신 버퍼 둘다 비었을 때. 송신 완료 인터럽트를 발생시킬 때 사용.
UDREn : USART Data Register Empty
 - 송신버퍼에 새로운 데이터를 받을 준비가 되어 있으면 1로 set. 즉. 송신 버퍼가 비었을 때.
FEn : Frame Error
 - 수신 버퍼에서 데이터를 수신하는 동안 프레임 에러가 발생하면 1로 set.
DORn : Data OverRun
 - 수신 동작에서 오버런 에러가 발생하였음을 나타내는 상태 플래그.
 오버런 에러 : 수신 버퍼에 현재 읽지 않은 수신 문자가 들어와있는 상태에서 수신 시프트 레지스터에 새로운 데이터 문자가 수신 완료되고 다시 그 다음 수신 데이터인 3번째 문자의 스타트 비트가 검출되면 발생.(즉, 시프트 레지스터에서 데이터가 완전히 전송되지 않았는데 새로운 데이터가 덮어버릴 때)
UPEn : Parity Error
 - 수신 버퍼로 부터 데이터를 수신하는 동안 패리티 에러가 발생하였음을 알리는 플래그.
U2Xn : Double the USART Transmission Speed
 - 비동기 모드에서만 사용 가능하며, 클럭의 n분주비를 16에서 8로 1/2만큼 낮추어 전송속도를 2배 높이는 기능을 한다.
MPCMn : Multi-Processor Communication Mode
 - USARTn을 멀티 프로세서 통신모드로 설정하고, 멀티 프로세서 통신 어드레스 정보를 포함하지 않는 모든 수신 데이터는 수신부에 의해 무시된다.


USARTn Control and Status Register B - UCSRnB

 RXCIEn TXCIE
UDRIEn
RXENn
TXENn
UCSZn2
RXB8n
TXB8n

RXCIEn : RX Complete Interrupt Enable
 - 수신 완료 인터럽트를 발생시키는 플래그
TXCIE : TX Complete Interrupt Enable
 - 송신 완료 인터럽트를 발생시키는 플래그
UDRIEn : USART Data Register Empty Interrupt Enable
 - USARTn 데이터 레지스터가 비어있다는 인터럽트를 발생시키는 플래그
RXENn : Receiver Enable
 - 수신기를 활성화한다.
TXENn : Transmitter Enable
 - 송신기를 활성화한다.
UCSZn2: Character Size
 - UCSZn1~0 비트와 함께 전송 문자의 데이터 비트수를 설정하는데 쓰인다.
RXB8n : Receive Data Bit 8
 - 수신할 때 9번째 비트를 받을지를 결정하는 플래그
TXB8n : Transmit Data Bit 8
 - 송신할 때 9번째 비트를 보낼지를 결정하는 플래그


USART Control and Status Register C - UCSRnC

-
 UMSELn UPMn1
UPMn0
USBSn
UCSZn1
UCSZn0
UCPOLn

UMSELn : USART Mode Select
 - 0: 비동기 모드
 - 1: 동기 모드
UPMn1, UPMn0 : Parity Mode
 - 00: 패리티모드를 사용하지 않음
 - 01: 사용하지 않는 플래그
 - 10 : 짝수 패리티
 - 11 : 홀수 패리티
USBSn : Stop Bit Select
 - 정지 비트 설정
 - 0 : 1bit,    1: 2bit
UCSZn1, UCSZn0 : Character Size
 - UCSZn2와 함께 전송 문자의 데이터 비트수를 설정
 UCSZn2 UCSZn1
UCSZn0
Chacter Size
0
0
0
5-bit
0 0
1
6-bit
0
1
0
7-bit
0
1
1
8-bit
1
0
0
사용안함
1
0
1
사용안함
1
1
0
사용안함
1
1
1
9-bit
UCPOLn : Clock Polarity
 - 동기모드에서만 사용하는 플래그로 0이면 송신 데이터는 XCKn 클럭의 상승 에지에 새로운 값이 출력되고, 하강 에지에 수신데이터가 검출된다. 1이면 반대로 출력과 검출이 된다.


USART Baud Rate Registers - UBRRnL and UBRRnH

UBRRnH
7 - 4 bit reserved(사용안함)
UBRRn[11:8]
UBRRnL
                                                                    UBRRn[7:0]

 - UBRRn11 - 0 : USART Baud Rate Register
12비트를 이용하여 USARTn의 보울(Baud rate)을 결정하는데, UBRRnH 3비트와 UBRRnL의 8비트가 조합을 하여 사용한다.
2009. 4. 24. 17:50

[ATmega1128] ATmega128은 Little endian일까 Big endian일까

이를 확인하기 위해 다음과 같은 프로그램을 작성하였다.



 소스 코드를 보면 2바이트 int형 데이터를 선언하고(atmega128에서 int형은 2바이트),
1바이트 포인터로 주소값을 저장하였다.

 만약, Big endian이라면 0x12가 먼저 출력되고 3초뒤에 0x34가 출력될테고,
Little endian이라면 0x34가 먼저 출력되고 3초뒤에 0x12가 출력될 것 이다.

 키트를 연결시킨후 hex파일을 전송 시켜보았다.





 여기서 켜지는 것이 0이고, 불이 들어오지 않은 것이 1이다.
위의 사진에서 00110100으로 출력되고 3초뒤의 모습인 아래 사진에서 00010010으로 출력되는 것을 알 수 있다.
즉, 0x34 -> 3초뒤 ->0x12로 출력되는 것이다.

 따라서, 0x1234가 34, 12 의 순으로 역순으로 저장되어있기 때문에 Little endian방식으로 메모리에 저장하는 것을 알 수 있다.