'임베디드'에 해당되는 글 5건

  1. 2009.06.04 [ARM7] LCD 사용자 문자 출력
  2. 2009.05.26 [프로그램] cygwin 설치법
  3. 2009.04.24 [ATmega1128] ATmega128은 Little endian일까 Big endian일까 2
  4. 2009.04.23 Volatile 한정자
  5. 2009.04.22 [avr] 확장형 데이터 타입
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. 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. 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방식으로 메모리에 저장하는 것을 알 수 있다.
2009. 4. 23. 12:03

Volatile 한정자

1. No-Cache Mode로 사용하기 위해서이다.
   보통 프로그램 실행시 속도를 위해 CPU에서 데이터를 메모리에서 직접 읽어오지 않고, 캐시(Cache)를 통해서 읽어오게 된다. 하지만, 하드웨어에 의해서 변경되는 값들은 캐시에서 바로 반영되지 않기 때문에 캐시를 통해 읽어오지말고, 직접 메모리에서 읽어와야한다.(속도는 조금 늦춰지긴 한다.)
    - 하드웨어가 사용하는 메모리는 volatile로 선언해 줘야 한다.

ex)
      #define rTEMP1     (*(volatile unsigned char *)0x30000028)
      #define rTEMP2     (*(volatile unsigned char *)0x30000032)


2. 컴파일러 최적화가 임의로 코드를 변경하는 것을 방지한다.
    단계별 최적화 옵션을 사용하게 되면 컴파일러에 따라 전체 코드상 사용되지 않는 DeadCode등은 아예 삭제되거나 무시되는 경우가 있다.  이러한 점은 프로그래머의 의도와는 다르게 기계적 해석에 따라 결과물이 나올 수도 있게 된다. 이러한 경우 프로그래머의 의도가 명확한 경우 volatile을 사용하여 컴파일 최적화를 하지 않게 지정할 수 있다.

출처: No Day But Today
2009. 4. 22. 18:16

[avr] 확장형 데이터 타입

      AVR 컴파일러의 확장 데이터형

가)    sfrb, srfw

     특수기능 레지스터(SFR)을 나타내는 지시어로 sfrb는 바이트 단위 레지스터를 sfrw는 워드단위의 레지스터를 나타낸다.

     srfb

#define sfrb_(x,x_) \

extern "C" volatile unsigned char x asm(#x_) 로 정의 되어있다.

     srfw

#define sfrw_(x,x_) \

extern "C" volatile unsigned int x asm(#x_) 로 정의 되어있다.

     사용법은 다음과 같다.

sfrb 심볼1 = IO레지스터주소값; sfrw 심볼2 = IO레지스터주소값;

나)    sfr 데이터형들의 용도

     헤더 파일에 sfr 데이터형들로 정의된 I/O 레지스터 이름들을 사용하여, 레지스터에 직접 값을 대입할 수 있다.

다)    헤더 파일에 정의된 레지스터

     DDR

데이터의 방향성을 지정해주는 레지스터. 해당되는 포트를 1로 정해주면 출력이 되고 0으로 지정해주면 입력이 된다. 기본적으로는 input으로 설정되어있다

) DDRA=0xff;  DDRF=0x00;

     PORT

       출력을 담당한다. 해당되는 핀에 1이나 0을 써주면 그 값이 핀으로 나가는 것이 PORT의 역할이다.

       ) PORTA = 0x01;   PORTF = 0xf0;

     PIN

       DDR 0으로 설정되었을 때 해당되는 핀의 값을 받아들이는 역할을 한다.