[HARMAN] 세미콘 아카데미/Embedded

[Harman 세미콘 아카데미] Day_92(Embedded)

uiop1716 2025. 6. 24. 09:00

오늘은 어제 과제로 진행한 Dotproduct 출력을 교수님과 함께 해 보았습니다.

 

FND에 출력될 decoder에 dp = 0x80과 off = 0x00을 추가하였습니다. 

Digit set

 

 

이를 아래의 FND_WriteDp를 통해 DP의 값을 1 또는 0으로 바꿀 수 있는 함수를 만들어 줍니다. 이 함수는 switch case문에 추가 되어, FND의 특정 위치에 Dotproduct를 제어할 수 있게 설계하였습니다.

FND.c

 

아래의 TimeWatch_Excute에는 0.05초 간격으로 DotProduct가 깜빡이도록 하고, Watch_Excute의 경우에는 100의 자리 점은 0.005초 간격, 10의 자리 dotproduct는 0.05초 간격으로 깜빡이도록 합니다. 또한, dotproduct를 켤 부분의 FND 자리만 키고 나머지는 꺼주어 모드가 변경될 때 LED가 겹치는 것을 방지합니다.

TimeWatch.c
StopWatch.c

 

ap_main 코드에서는 각 state에 맞춰 execute를 실행합니다.

ap_main.c

 

 

코드 :

https://github.com/Heeju99/embedded/tree/main/250624_TimeWatch_StopWatch_copy/Core/ap

 

embedded/250624_TimeWatch_StopWatch_copy/Core/ap at main · Heeju99/embedded

Contribute to Heeju99/embedded development by creating an account on GitHub.

github.com

 

 

동작 영상:

 

 

 

 

 

교수님의 말씀입니다. 지금까지 저희가 짠 코드는 결합력이 강한 코드여서 다양한 application이 가능한 코드로 만들어 보겠습니다.

좋은 코드란 ?

 

 

그래서 아래의 그림과 같이 구성하려고 합니다. 간단하게 생각하면, 각각의 단계들은 각자의 일만 하도록 설계하여, 만약 출력부가 LCD, Monitor로 변경되어도 시계, stopwatch의 값이 출력될 수 있도록 하고, 입력부는 입력 data만 처리부에 던져 알아서 처리하도록 합니다. 각 단계별 결합력을 약화시켜 변화 발생 시 유연하게 수정할 수 있도록 합니다.

각 Process 분리

 

아래와 같은 Sequence를 작성합니다.

Listener는 버튼의 입력을 받아 Controller에 전달을 합니다. Controller는 버튼 입력을 받고 mode 설정에 대한 값과 시간 Data를 전송합니다. 이를 받은 Presenter는 FND 또는 LCD 또는 모니터 등의 여러 매체를 통해 출력을 하게 됩니다.

 

 

 

Listener : 전체 시스템에서 입력을 담당하는 부분으로, 현재는 Button 입력을 받고 있습니다.

Button_GetState로 버튼의 입력에 대한 id와 data를 저장합니다. 버튼을 통해 Mode를 변경하고, StopWatch 모드에서는 Run/ Stop/ Clear에 대한 정보를 가지고 있기 때문에 id에 버튼에 대한 동작의 정보를, data에는 activate(기능 활성)에 대한 정보를 담아 Controller에 전달합니다. 각 기능들이 id와 data 라는 동일한 정보들을 Controller에 전달하기 때문에 Controll.h에 구조체를 선언하여 데이터 관리를 쉽게 합니다. (Controll.h에 저장하는 이유는, 받는 입장에서도 정보의 구조에 대해 알아야 하기 때문)

Listener : Button Check Code

 

Listener -> Controller에 id와 data를 구조로 묶어 보내기 위함

 

 

Listener : 기능을 처리하는 부분으로, 현 상황에서는 버튼 입력에 대한 기능들을 수행하고 Watch와 StopWatch에서 각각 활용하는 시간 Data를 생성하여 Processer에 전달하는 역할을 합니다.

아래의 코드는 Listener와 마찬가지로 controlData라는 저장소에 id와 data를 저장해 놓고, 각 기능들을 제어하기 위해 사용됩니다. 그래서, 전체 과정을 보게되면 버튼 입력에 대한 정보부터  Mode, Run, Stop, Clear에 대한 정보 + 시계 정보를 생성하게 되었습니다.

Controller : SetData code

 

아래의 코드는, StopWatch와 Watch의 모드를 변경하는 부분으로, controlData.id에 저장되어 있는 모드 변경 버튼 입력에 대해 stopwatch의 시간 정보와 watch의 시간 정보를 출력하도록 합니다.

Controller : State Mode code

 

 

Presenter : Lisetner의 입력 + Processor의 기능 을 출력만 해주는 역할을합니다. 플랫폼을 뭘로 선택할지에 대해 FND, Monitor, UART 등으로 출력할 수 있습니다.

 

아래의 코드는 stopwatch, watch를 FND에 출력하기 위한 함수입니다. Stopwatch는 FND 4자리에 시간(2) + 분(2)를 출력하고, Watch는 FND 4자리에 분(1) + 초(2) + 밀리초(1)를 출력하도록 합니다. 또한 FND를 각각 0.5밀리초 0.05 밀리초 동안 점멸하도록 합니다. 

Presenter : FND output code

 

 

이렇게 Listener, Controller, Processor의 Sequence의 절차로 코드를 구현하였습니다. Sequence에 따라 분할하여 만들어 놓는다면, 출력을 다른 display에 하고 싶거나 입력을 버튼 말고 다른 매체로 하고 싶을 때 쉽게 변환하여 사용할 수 있습니다.

 

 

 

 

UART 설정 : 

Connectivity  -> USART2 -> Asynchronous Mode(비동기) -> default 조건

UART 설정

 

 

위의 방식대로 UART에 대한 header파일을 만들면, HAL_UART_Transmit 함수를 사용하여 모니터에 출력을 할 수 있습니다. 아래의 코드는 Mode에 대한 정보와 현재 시간 정보를 출력하도록 Presenter에 설계하였습니다.

Presenter : UART 출력 Code

 

 

결과 :

sprintf를 통해 설정한 출력문이 각각의 모드와 시간을 출력하는 모습을 확인할 수 있습니다.

Watch UART 결과
StopWatch UART 결과

 

 

 

출력을 봤으면, 입력도 확인을 해봐야 겠죠? 그래서, 입력을 담당하는 Listener에 HAL_UART_Recieve 함수를 이용하여 rx_data라는 값이 'm'이 입력되면 모드 변경, 's'가 입력되면 Run/Stop, 'c'가 입력되면 Clear 될 수 있도록 id, data 정보를 생성하여 Controller에 전달합니다. 그리하여, 최종적으로 UART 값을 통해 변경이 가능합니다.

Listener : UART 통신에 대한 기능 정보 생성

 

 

.c 코드 : 

https://github.com/Heeju99/embedded/tree/main/250624_TimeWatch_StopWatch_SequenceStructure/Core/ap/src

 

embedded/250624_TimeWatch_StopWatch_SequenceStructure/Core/ap/src at main · Heeju99/embedded

Contribute to Heeju99/embedded development by creating an account on GitHub.

github.com

 

 

 

동작 영상 :

'm' 입력시 모드 변경 (StopWatch -> Watch -> StopWatch)

StopWatch 모드 시, 's' 입력 : Start , 다시 's' 입력 : Stop

'c' 입력 시, Clear