본문 바로가기
기술정보 및 자료/EBM300

EBM300 이미지 가져오기


EBM300을 통하여 이미지를 가져오는 방법을 알아 보겠습니다.
기본적인 순서는 다음과 같습니다.
1. 이미지센서 초기화
2. READY
3. START
4. COMPLETE 검출
5. READY
6. 데이타읽기(READ)

(NEXT 이미지 2~6반복)

1. 이미지센서 초기화
EBM300 RESET후 이미지 센서의 초기화를 합니다.
초기화는 SIO_D, SIO_C핀을 사용합니다. SCCB(Serial Camera Control Bus)라는 프로토콜을 이용하며, 각 레지스터 값을 설정 할 수 있습니다. SCCB는 I2C 인터페이스 방식과 거의 동일 합니다. 


SCCB를 사용하기 위해 첨부된 'sccb.zip'를 참고하시기 바랍니다.


정의된 포트와 delay함수 정도만 변경하여 쉽게 sccb 통신을 할 수 있습니다.

2. READY
READY핀은 EBM300의 내부 어드레스 포인터를 0번지로 위치시키는 역활을 합니다.
0번지 부터 이미지를 저장하기 위함 입니다.
READY핀은 MPU에서 평상시에 LOW로 유지하고 있어야 합니다.
HIGH후 LOW로 전환 하면 Ready가 됩니다.

3. START
START핀은 이미지 한프레임을 EBM300 내부 메모리에 저장시키는 역활을 합니다.
평상시 LOW로 유지하고 있어야 하며, HIGH후 LOW로 Start기능이 동작합니다.

4. COMPLETE검출
COMPLETE는 출력 핀 입니다. 평상시 LOW를 유지하고 있다가 Start신호후 한프레임 이미지 저장이 완료 되면 HIGH로 됩니다.


5. READY
EBM300의 내부 어드레스 포인터를 0번지로 설정합니다.
0번지 부터 이미지 데이터를 읽어 오기 위함입니다.

6. 데이타읽기(READ)
READ는 이미지 데이터를 읽어 오기 위한 핀입니다.
평상시 LOW를 유지하고 있어야 하며, 이미지 데이터를 읽기 위해 HIGH로 변경합니다.
이때 D0~D7핀을 통해 이미지데이터 1byte가 출력됩니다.
이미지1byte를 읽은 후 READ핀을 LOW로 변경합니다.
이때 EBM300의 내부 어드레스 포인터는 자동으로 1씩 증가 됩니다.
다시 READ핀을 HIGH로 변경하여 다음 1byte를 읽어 옵니다.
이미지 사이즈 만큼 반복하면 됩니다.
SCCB로 설정한 이미지 포맷이 RAW_FORMAT에 320*240이라면 총 76,800번 읽으면 되겠습니다.



* 어드레스 포인터 변경하기
ADDR0, ADDR1, ADDR_DET 핀을 통하여 어드레스 포인터를 변경할 수 있다.
평상시 ADDR0, ADDR1, ADDR_DET 핀은 LOW를 유지 해야 한다.
어드레스는 총 (xx xx xx)h 번지 까지 설정 할 수 있다.
ADDR0 = HIGH , ADDR1 = LOW 로 변경후 D0~D7로 최하위byte 어드레스를 입력한다. 그리고 ADDR_DET를 HIGH후 LOW로 변경한다.
ADDR0 = LOW , ADDR1 = HIGH 로 변경후 D0~D7로 두번째byte 어드레스를 입력한다. 그리고 ADDR_DET를 HIGH후 LOW로 변경한다.
ADDR0 = HIGH , ADDR1 = HIGH 로 변경후 D0~D7로 세번째byte 어드레스를 입력한다. 그리고 ADDR_DET를 HIGH후 LOW로 변경한다.
어드레스 포인터 변경후 ADDR0 = LOW , ADDR1 = LOW 로 변경한다.


어드레스 포인터 변경을 통하여 Capture된 이미지를 Random Access 할 수 있습니다.
마찬가지로 1byte를 READ후 자동으로 어드레스 포인터는 1씩 증가 됩니다.

AVR에서 어드레스 포인터 변경 함수를 만든 예제 입니다.

void CmSetAddress(unsigned long addr)   // addr : 변경할 어드레스 입력

   DDRF=0xff;  // D0 ~ D7 출력속성으로 변경
   
   CmAddr1(0); CmAddr0(1);  // ADDR1 = 0, ADDR0 = 1
   PORTF=addr&0xff;  // 최하위 byte D0 ~ D7로 출력
   CmAddrClock(1);   // ADDR_DET = 1
   CmAddrClock(0);   // ADDR_DET = 0
                         
   CmAddr1(1); CmAddr0(0);  // ADDR1 = 1, ADDR0 = 0
   PORTF=(addr>>8)&0xff;   //두번째 byte D0 ~ D7로 출력
   CmAddrClock(1); // ADDR_DET = 1
   CmAddrClock(0); // ADDR_DET = 0

   CmAddr1(1); CmAddr0(1);   // ADDR1 = 1, ADDR0 = 1
   PORTF=(addr>>16)&0xff;    //세번째 byte D0 ~ D7로 출력
   CmAddrClock(1); // ADDR_DET = 1
   CmAddrClock(0); // ADDR_DET = 0

   CmAddr1(0); CmAddr0(0);           // ADDR1 = 0, ADDR0 = 0

   DDRF=0x00;    // 입력 속성으로 변경
   PORTF=0x00;
}

AVR과 같은 8bit 프로세서에서 unsigned long 변수를 써서 처리 속도가 떨어 지긴 하지만 어드레스 포인터 변경의 기능을 이해 하기 위해 적당한 함수 입니다.