페이지

글목록

2016년 1월 5일 화요일

[PSOC] PSOC4 Timer Interrupt Test

PSOC4 로 Timer Interrupt 를 회사에서 만든 보드로 테스트를 해 봤습니다.

역시 PSOC은 쉽네요.^^

UART는 기본으로 넣었고, 나중에 추가할 I2C도 일단은 H/W 콤포넌트로 추가했습니다.
PSOC4는 UART,SPI,I2C 등의 Serial 통신 모듈은 3 중에 1개를 써도, Serial 통신 모듈 총 2개 중 1개씩 감소합니다. 물론 UDB로 더 만들 수 있지만 UDB가 많이 들어갑니다.
저는 UART 1개, I2C 1개 기본 serial 통신 모듈을 2개 다 사용했네요.

PSOC4에서 타이머 인터럽트 사용하는 내용이 카페에 없어서, 자료를 만들어서 놓습니다.

프로그램시 타이머는 기본으로 사용하는 요소지요.

PSOC4는 타이머를 기본으로 4개를 지원합니다. 더 필요하면 UDB를 사용해서 만들어 넣으면 되는데, UDB가 4개 밖에 없어서 꼭 필요할 때를 위해서 아껴서 쓰는 것이 좋습니다.


<프로그램 테스트 계획>
- 타이머 인터럽트에 의해 주기적(100ms)으로 LED를 토글함.


1. 먼저 TopDesign.cysch 파일에 UART,I2C,Timer 콤포넌트를 추가합니다.


안보여서, 콤포넌트 쪽을 자세히 볼 수 있는 그림을 올립니다.

PSOC Creator 에서 컴파일을 해 보면 우측 옆 태에 Resource Meter를 보면 메모리나 콤포넌트, UDB 의 사용량이 나옵니다.


2. 다음은 Timer 의 설정입니다.
10KHz 의 클럭을 넣었으니 1 주기를 100ms로 맞출려면 1000 번 카운트해야 하므로 Timer 콤포넌트의 period 를 1000으로 수정합니다.

3. Interrupt 는 On terminal count 에 체크하는데, 타이머 끝에서 Interrupt가 발생된다는 의미입니다. Run Mode 는 Continuous 로 계속 반복됩니다. (위 그림 보시면 이해 되겠죠?)

4. System 의 Interrupt 콤포넌트를 Timer Interrupt 출력에 붙입니다.

5. 핀을 회로도에 맞게 지정합니다.
제가 사용하는 보드에는 PSOC4와 다음과 같이 연결되어 있습니다.

- UART RxD=P.4 , TxD=P0.5
- I2C SCL=P4.0 , SDA=P4.1
- LED_1=P2.4 , LED_2=P2.5 , LED_3=P2.6

[회로도] - 잘 안보이지만 연결은 위의 내용처럼 되어 있습니다.

cydwr 파일에서 핀을 위의 내용 처럼 지정합니다.



여기까지 H/W 구성은 마무리 되었습니다.

6. 이제 프로그램을 수정합시다.
먼저 Main() 함수에서 Timer 인터럽트 함수를 지정합니다. 나중에 설정된 주기마다, 이 인터럽트 함수가 실행됩니다.
    /* Enable the Interrupt component connected to interrupt */
    TC_CC_ISR_StartEx(Timer_INT_Handler);

7. Timer 인터럽트 함수를 정의합니다.
매 주기 마다 LED 1,2,3 을 토글합니다.

CY_ISR(Timer_INT_Handler)
{

    uint32 InterruptHpn;
    static uint8_t LED_1_stat=0,LED_2_stat=0,LED_3_stat=0;
    /* Check interrupt source and clear Inerrupt */
    InterruptHpn = Timer_1_GetInterruptSourceMasked();
    if (InterruptHpn == Timer_1_INTR_MASK_CC_MATCH)
    {
        Timer_1_ClearInterrupt(Timer_1_INTR_MASK_CC_MATCH);
    }
    else
    {
        LED_1_stat = 1-LED_1_stat;   // Toggle
        LED_2_stat = 1-LED_2_stat;   // Toggle
        LED_3_stat = 1-LED_3_stat;   // Toggle
        LED_1_Write(LED_1_stat);
        LED_2_Write(LED_2_stat);
        LED_3_Write(LED_3_stat);
        Timer_1_ClearInterrupt(Timer_1_INTR_MASK_TC);
    }
}

8. Main() 함수에서 Timer 를 시작하면, 다음처럼 주기적으로 LED 3개가 토글되어 깜박입니다.

main()
{
     :
    Timer_1_Start();
     :
}




9 이 프로그램의 압축된 파일은 다음 링크에 올려놓습니다.

댓글 없음:

댓글 쓰기