본문 바로가기
코스웨어/10년 스마트폰BSP

[BSP]업무일지-서동준-20100713

by 알 수 없는 사용자 2010. 7. 15.
728x90
반응형
[ARM] 미니 프로젝트

프로젝트 명 : 도서 관리 미니 프로젝트

기능 :
1. ARM과 하이퍼 터미널의 통신 - DBGU 활용
2. ARM에 LCD 모듈 장착하여 도서관리 메뉴 및 리스트 출력 - PIO 활용
3. ARM에 조도센서를 연결하여 주위가 어두워질 경우 자동으로 LCD 백라이트 점등 - ADC 활용
4. PID2 인터럽트로 메뉴 조작
5. PIT로 일정시간 입력이 없을 경우 초기화면으로 이동

구현 :
1. 하이퍼 터미널 통신 - DBGU
DBGU는 한 번에 문자 하나만 송수신할 수 있기 때문에 문자열을 송수신하려면 특정값('\n')이 입력될 때까지 버퍼에 이전 문자열을 저장해 두어야 한다.
따라서 아래와 같은 함수 구조를 만들어 문자열을 송수신할 수 있게 하였다.

[수신]
char dbgu_read(void)
{
    char ch;
    while (!(DBGU_SR & 1<<0));
    ch = DBGU_RHR;
    return ch;
}

void dbgu_read_str(const char* str)
{
    unsigned int len = strlen(str);
    for (int i = 0; i < len; ++i)
    {
    	dbgu_read(str[i]);
    }
}

[송신]
void dbgu_write(char ch)
{
    while (!(DBGU_SR & 1<<1));
    DBGU_THR = ch;
}

void dbgu_write_str(const char* str)
{
    unsigned int len = strlen(str);
    for (i = 0; i < len; ++i)
    {
    	dbgu_write(str[i]);
    }
    dbgu_write('\n');
}

2. LCD 모듈 출력
정해진 설정을 해주면 기본적인 입출력은 가능하지만 정교한 입출력을 하려면 역시 고려해야 할 사항이 맣다.
화면을 모두 지운 후 값을 쓸 지, 한 줄만 지운 후 값을 쓸 지를 잘 결정해야 하며, 그 외에도 덮어쓰기 될 때 이상한 문자가 출력되기도 한다.
//LCD 기능 설정
void LCD_Instruction(unsigned int ucSData)
{
    PIO_CODR = EN;                //LCD 비활성화
    PIO_CODR = RS;                //명령모드 레지스터 선택
    PIO_CODR = RW;                //Write 선택

    Delayms(1);
    PIO_SODR = EN;              //Lcd Enable

    Delayms(1);
    PIO_CODR = D_BUS;            // d_bus clear
    PIO_SODR = ucSData;          // 버스에 8bit 씀 set dbus

    Delayms(1);
    PIO_CODR = EN;              // EN을 H에서 L로 Lcd Disable

    Delayms(1);
}

//LCD 데이터 출력
void LCD_Data(const char* data, int Delaytime)
{
    int i;
    for(i=0; *(data+i)!=0; i++)
    {
        PIO_SODR = RS;
        PIO_CODR = RW;

    	Delayms(1);
    	PIO_SODR = EN;
        Delayms(1);
        PIO_SODR = data[i];
        Delayms(1);
    	PIO_CODR=EN;
    	Delayms(1);
    	PIO_CODR = data[i];

    	Delayms(Delaytime);
    }
}

3. 조도센서
ADC를 이용하여 빛의 밝기에 따라 LCD가 켜질 수 있도록 하였다. 어느 정도의 밝기가 되었을 때 켜질 수 있게 하는가가 중요하다.
void adc()
{
    ch = ADC_CDR[4];    //A/D변환된 데이터를 int 형 변수 ch 에 넣어준다.
    if(110<ADC_CDR[4])    	//조도센서가 밝은 상태면
    {
    	PIO_SODR = 1<<14;    	//CLCD 의 BACK LIGHT OFF
    }
    else    					//조도센서가 어두운 상태면
    {
    	PIO_CODR = 1<<14;    	//CLCD 의 BACK LIGHT ON
    	Delayms(500);
    	PIO_SODR = 1<<14;
    }
}

4. 5. 여러 기능과 인터럽트가 개별적으로는 잘 작동하지만 합칠 경우 고려해야 할 사항이 많아 제대로 동작되지 않는 경우가 있다.
4, 5 역시 제대로 동작되지 않아 코드 수정이 필요하다.

* ADS 1.2에 C++ 컴파일러가 있어서 C++ 프로젝트 파일을 그대로 적용해보려 했으나 아직 완벽히 C++을 지원하지 않아 부득이하게 C++코드와 C코드가 섞여 있다.
* 실험 결과 C++이 적용되지 않는 부분이다. (정확하지 않음.)
- using namespace : 아직 일부는 지원하지 않는다라는 경고 메시지가 나타난다.
- string 사용 불가 : C++의 string을 쓸  수가 없다. 대신 const char*를 사용해야 한다.
- new 연산자 사용 불가 : 동적 메모리는 운영체제가 할당해 주는데 운영체제가 없으므로 동적 할당이 되지 않는다.
728x90