Home > Study > C Language > ARM System Programming > [ex27] 로봇 이동 시간 측정

[ex27] 로봇 이동 시간 측정
Study Language

문제 설명


다음 요구하는 기능을 만족하는 코드를 작성하라

[요구 사항]

  • 로봇이 이동을 시작할때 KEY0가 눌리고 목적지에 도달하면 KEY1이 눌린다고 가정하자
  • KEY0를 누르고 KEY1을 누르면 그 간격 시간을 UART로 인쇄하는 코드를 구현하라
  • 다만, KEY0를 누른 상태에서 다시 KEY0를 누르는건 무시한다.
  • 즉 KEY0를 눌린 뒤 그 때부터 KEY0가 여러번 눌려도 KEY1이 눌릴때 까지 시간만 측정 되면 된다
  • 시간은 100msec 단위(즉, 0.1초 단위로 측정하며 반올림하거나 버림하는 것은 무방하다)로 측정한다.
    (예를 들어 실제 시간이 3.45초 일 경우 인쇄 결과가 3.4 또는 3.5 어떤 값이든 다 상관없다)
  • 최대 측정 가능 시간은 거의 무제한으로 본다
  • 로직아날라이져를 KEY0와 KEY1에 연결하여 스위치 눌린 사이 시간을 확인할 수 있도록 연결한다.

[제출 요령]

  • 코드를 완성하면 반드시 동작 확인을 받은후 강사 지시에 의하여 코드를 업로드해야 함
  • 임의로 코드 제출시 해당 문항 0점 처리되므로 주의 바람
  • 다른 파일에 있는 수업때 제공 또는 작성한 코드를 사용한 경우는 복사하여 제출할 필요 없음 (예) LED_Display 함수 등
  • 작성 또는 기존 코드 변경한 파일의 내용(이 문제와 관련한 코드 부분만)을 모두 복사하여 제출해야 한다.
  • 제출시에는 main.c 내용을 제일 위에 놓고 그 아래에 다른 파일의 코드를 제출하되 main.c 이외 파일은 반드시 파일명을 코드 위에 적고 복사하여 제출할 것

정답 코드


#include "device_driver.h"

static void Sys_Init(void)
{
	Clock_Init();
	LED_Init();
	Uart_Init(115200);
	Key_Poll_Init();

	SCB->VTOR = 0x08003000;
	SCB->SHCSR = 0;
}

extern volatile int Key_Value;
extern volatile int TIM4_Expired;

# if 1
void Main(void)
{
	Sys_Init();
	Key_ISR_Enable(1);

	int state = 0;
	double t = 0;

	for(;;)
	{	
		if ((state == 0) && (Key_Value == 1))
		{
			TIM4_Repeat_Interrupt_Enable(1, 100);
			state = 1;
		}

		if ((state == 1) && TIM4_Expired)
		{
			t += 0.1;
			TIM4_Expired = 0;
		}

		if ((state == 1) && (Key_Value == 2))
		{
			TIM4_Stop();
			Uart1_Printf("%.1f\n", t);
			state = 0;
			Key_Value = 0;
			break;
		}
		
	}
}
# endif

메모


printf 내부의 \n 습관화 필요