2011년7월13일_CLCD(16216D-4-B102A)와 ARM Board(AT91SAM7S256)의 결선 후 I/O포트세팅

 

● BUS만 연결한 상태


DSCN3626DSCN3629

어제(7월12일) 브레드보드상 ARM보드위치와 CLCD의 크기, 버스선의 MSB LSB의 방향 등을 고려하여 CLCD의 위치를 정하고,
ARM보드와 CLCD간 전원 연결과 데이터버스선 8가닥과 백라이트전원을 연결하였다.
CLCD에 제어선들(E, RS, RW)이 연결되어 있지 않으나 전원을 넣으면 백라이트의 불이 들이 올 것이니...
USB선을 꽂아보자.

 

DSCN3636DSCN3637

좌측사진은 3번 핀을 VCC에 연결하여 백라이트만 환하게 빛을 발하는 모습이고,image
우측사진은 3번 핀을 GND에 연결하여 초기화되지 않은 CLCD의 출력문자들이다.

CLCD모듈의 3번 핀과 GND사이에 가변저항을 연결하여 CLCD에 표시되는 문자들의 진하기를 변화시킬 수 있다. GND쪽으로 돌리면 글자들이 진하게 표시되고,
Vo(3번 핀)쪽으로 돌리면 글자들이 연하게 표시된다.
(다른 데이터시트에는 VCC와 GND를 분압한 전압을 Vo에 공급하는데 이 문서는 다르다.)

검게 칠해진 네모가 16개 있는데 이 네모도 문자를 저장하는 메모리(CGROM)에 있는 문자 중 하나이다.

아래의 CGROM표를 확인하여 보니..
image

초기값은 8bit의 데이터레지스터의 값이 모두 High인 상태일 때 표시되는 문자라는 것을 알 수 있다.
보통 초기값으로 Low상태를 주는 것이 아니라 High상태로 세팅한다.
※다른 디바이스에서는 이와 다르게 초기값이 Low인 경우도 있으므로 꼭 High라는 생각도 버리자.



DSCN3640DSCN3642

선생님께서 알려 주신대로, ARM Board의,
PA8단자를 CLCD의 레지스터선택입력 4번 핀에 연결하고,
PA9단자를 CLCD의 레지스터 읽기/쓰기 선택입력 5번 핀에 연결하고,
PA10단자를 CLCD의 활성입력에 연결하자.

CLCD의 4번 ~ 6번 핀은 모두 제어입력으로 ARM Board입장에선 출력하여 제어해야 하는 단자들이다.
그러므로 LCD를 제어하듯이 모두 출력으로 설정하여 High level신호와 Low level신호를 주면 되겠다.
(쉽게 설명하자면 스위치 ON/OFF)



                     Source Insight 3.5에서 소스코드 편집                      

image <— 아이콘을 클릭하여 실행

 

image

이렇게 전에 열어 두었던 프로젝트가 있다면,


image 

Menu – Project – Close Project를 클릭하거나 단축키 Alt+Shift+W키를 눌러 프로젝트를 닫자.




image

다시 Project메뉴로 가서 New Project를 클릭하여 프로젝트를 생성한다.

 

image

프로젝트이름을 기입하고 OK버튼을 클릭한다.

 

image

디렉토리를 만들꺼냐고 묻는다. 당연히 만들어야 하니 ‘예’를 클릭한다.

 

image

프로젝트 세팅에서 Browse..버튼을 클릭하여 프로젝트 폴더를 바꾸자.


image

디렉토리를 선택하고 확인을 클릭하자.
여기까지 와서 이상한 점을 발견하였다. 아까 만든 디렉토리는 도대체 무엇인가? (스크린샷의 디렉토리는 다른 것이다.)

그래서 다시 처음부터 진행하였다.

 

image

아래의 프로젝트 데이터 파일이 저장될 디렉토리를 지정해보자.

 

image

프로젝트폴더를 선택하고 확인...

 

image

D:\내장형하드웨어과정\_프로젝트파일\ARM_project\20110713_CLCD
로 바뀌었다. 제대로 되었으니 OK버튼을 클릭하자.

 

image

프로젝트세팅은 건들 필요 없이 OK버튼을 클릭하자.


image

알고 있는 문서타입만 보는 옵션을 체크해제하자.


image

아래의 목록에 있는 파일들만 더블클릭하여 추가하자.
1. Makefile
2. main.c
3. lowlevel.c
4. Elf32-littlearm.lds
5. Cstartup.S

다음에 하위 폴더인 include에 들어가서,

image

6. AT91SAM7S256.h
7. Project.h

두 개의 헤더파일을 모두 추가하기 위해 Add All버튼을 클릭하고 Close를 클릭하여 닫자.


image

추가한 파일들의 이름이 Project Window에 표시되고,
파일크기와 갱신일자도 표시된다.



image

우리는 main.c가 주 프로그램이므로 main.c를 더블 클릭하여 열어 작성하자.

실습에 사용될 회로도와 도식은 아래와 같다.

image
[그림] 허접한 회로도

상기의 회로도는 부품배치와 결선을 어떻게 할 것인지 참고할 때만 보고 자세한 정보는 아래의 그림을 보면,



image

LCD와 MCU를 연결할 때 어떻게 연결하면 되는지 나와 있다.
PIO관련 레지스터들은 PA0 ~ PA31까지 1:1 매칭되어 있고 아래와 같이 레지스터를 정의하면 된다.


● PIOA관련 레지스터 정의와 CLCD핀 정의와 I/O port초기화 함수

   1:  #define PIOA_PER    (*(volatile unsigned int *)0xFFFFF400)
   2:  #define PIOA_OER    (*(volatile unsigned int *)0xFFFFF410)
   3:  #define PIOA_PPUDR    (*(volatile unsigned int *)0xFFFFF460)
   4:  #define PIOA_CODR    (*(volatile unsigned int *)0xFFFFF434)
   5:  #define PIOA_SODR    (*(volatile unsigned int *)0xFFFFF430)
   6:   
   7:  //오늘 추가
   8:  #define    CLCD_RS    (1 << 8)
   9:  #define    CLCD_RW    (1 << 9)
  10:  #define    CLCD_EN    (1 << 10)
  11:  #define    CLCD_BS    (0xFF << 16)
  12:   
  13:   
  14:  void OUT_INIT(void)
  15:  {
  16:      // Configure the pin in output
  17:      PIOA_OER    = CLCD_BS | CLCD_RS | CLCD_RW | CLCD_EN;
  18:      // Set the PIO controller in PIO mode instead of peripheral mode
  19:      PIOA_PER    = CLCD_BS | CLCD_RS | CLCD_RW | CLCD_EN;
  20:      // Disable pull-up
  21:      PIOA_PPUDR    = CLCD_BS | CLCD_RS | CLCD_RW | CLCD_EN;
  22:  }



1행 ~ 5행은 PIOA(병렬 I/O Port A)의 관련 레지스터들의 주소를 (unsigned int *)으로 캐스팅하여,
               절대번지를 포인터로 정의하여 사용하는 법이 되겠다. (포인터가 아니면 *를 왼쪽에 붙일 수 없다.)
               이런 방식의 단점은 사용자가 사용할 레지스터를 정의해야 한다는 것이다. 
               이 방식 외에,
                   ① Atmeal사에서 제공하는 lib_AT91SAM7S256.h 헤더파일을 사용하는 방법
                   ② Atmeal사에서 제공하는 AT91SAM7S256.h 헤더파일을 사용하는 방법
                   ③ AT91SAM7S256.h 헤더파일의 구조체 포인터 정의를 사용하는 방법

8행 ~ 11행은 CLCD의 제어입력핀과 데이터버스핀들이 연결된 ARM Board의 Port상 위치를 나타낸 것으로,
                 1을 8번 시프트 하면 PA8핀 위치에 1이 위치하고,   0x100
                 1을 9번 시프트 하면 PA9핀 위치에 1이 위치하고,   0x200
                 1을 10번 시프트 하면 PA10핀 위치에 1이 위치하고, 0x400
                 0xFF를 16번 시프트 하면 PA16 ~ PA23핀 위치가 모두 1로 세트 된다. 0xFF0000
                 (AT91SAM7S256 MCU는 PIOA관련 레지스터의 값이 1로 세트 되면 그 위치의 I/O를 활성/ON/OFF등등을 할 수 있다.)

14행 : OUT_INIT( )
            PIOA_OER레지스터는 Output Enable Register로 말 그대로 출력 활성 설정 레지스터다.
             PIOA_PER레지스터는 PIO Enable Register로 Port를 사용할 것인지 설정하는 레지스터다.
             PIOA_PPUDR레지스터는 Pull-up Disable Register로,
                                            I/O Port핀과 VCC사이에 연결된 저항을 연결해제설정을 하는 레지스터
             우리는 CLCD에 출력할 것이니 모두 출력이고 모두 사용하고 풀업 저항은 필요 없다.
             (CLCD의 전원과 ARM MCU의 전원전압이 차이가 나므로 풀업 저항을 쓰면 높은 곳에서 낮은 곳으로 흘러 들어온다.)

             레지스터관련 정보: 데이터시트 p.248 27.6 Parallel Input/Output Controller (PIO) User Interface
                                                  Table 27-2. Register Mapping

             PIOA관련 레지스터에 CLCD핀 위치를 모두 OR연산하여 대입을 하는데,
             총 11개의 제어선이 필요하고 모두 사용하기 위해 1로 무조건 세트 시키는 OR연산을 한 것이다.


오늘은 I/O관련 레지스터 정의와 CLCD핀 위치 정의와 초기화 함수까지만 하였으므로 컴파일하여 실행할 수 없어,
타이밍도에 자세한 시간을 기록하여 프로그래밍할 때 편하게 해보자.

● 쓰기모드 타이밍도

image

10ns같이 작은 지연시간보단 500ns, 230ns와 같이 큰 값을 주의해야 하지 않을까?



● 읽기모드 타이밍도

image