이전 게시물에서 LED를 사용하는 GPIO OUT을 이미 테스트 했는데,
아무 설명을 하지 못해서 INPUT 테스트와 같이 다뤄 보겠습니다.
PSOC IC에 SW를 3개 달아서, 이전에 만들어 놓았던 타이머 인터럽트를 이용해서 50ms 마다 Switch 입력을 읽어서 값이 바뀔 때마다 스위치 값을 UART로 출력하는 내용입니다.
GPIO 출력은 이전에 해뒀던 내용인데, 100ms 마다 포트값을 토글하는 내용입니다.
먼저 OUTPUT을 설명드리겠습니다.
1. PSOC Creator 의 cysch 에서 Digital Output Pin [v2.10] 콤포넌트를 그려 넣습니다. 핀 이름은 적당하게 고치면 되는데 이름에 따라 함수가 자동으로 만들어집니다.
저는 LED_1,LED_2,LED_3 라고 정했는데, 출력 함수 이름은 자동으로 LED_1_Write() , LED_2_Write() , LED_3_Write() 으로 만들어 집니다.
2. OUTPUT PIN 콤포넌트를 마우스로 더블클릭하면 핀 설정이 나오는데, HW connection 체크를 해제 해 주십시요. 이것은 내부에서 다른 콤포넌트와 연결 하지 않을 경우에 해당되며, 이 옵션을 해제하지 않으면 에러가 납니다.
3. cydwr 파일에서 PSOC4 IC에 OUTPUT으로 사용할 핀을 지정
PSOC4 IC 와 연결된 출력 핀과 여기에 연결된 LED 회로도 그림을 아래 첨부합니다.
4. 소스 코드에서 포트 이름에 따라 자동 생성된 LED_x.c 안의 LED_x_Write() 함수로 비트를 ON(1),OFF(0) 하면 됩니다.
이전에 만든 타이머 인터럽트 코드 안에 있는 출력함수 예는 다음과 같습니다.
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
{
cnt_50ms++;
if (cnt_50ms > 49)
{
f_50ms = 1;
}
LED_1_stat = 1-LED_1_stat;
LED_2_stat = 1-LED_2_stat;
LED_3_stat = 1-LED_3_stat;
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);
}
}
댓글 없음:
댓글 쓰기