본문 바로가기

분류 전체보기839

C++ ] 교통사고 통계자료 필터 프로그램 (2) - vector 사용 , 파입입출력 깃허브 주소 : https://github.com/joeteo/CarAccident main.cpp #include #include "AccidenData.h" #include "AccidentList.h" #include enum { PRINTLIST = 1, SUBTOTAL, EXIT }; using namespace std; int main() { AccidentList handler; handler.readListFromFile(); while(1) { system("cls"); int select; handler.DispMenu(); cin >> select; switch(select) { case PRINTLIST: handler.searchList(); break; case SUBTOTAL:.. 2022. 6. 28.
C++ ] 2021 교통사고 통계자료 필터 프로그램 (1) + 파일 입출력 부분합 기능까지 구현하였다. main.h #pragma once #define COLUMN_NUMBER 13 #define ROW_NUMBER 229 enum { PRINTLIST=1, SUBTOTAL, EXIT }; main.cpp #include #include "AccidenData.h" #include "AccidentList.h" #include "main.h" #include using namespace std; int main() { AccidentList list; list.readListFromFile(); while(1) { system("cls"); int select; list.DispMenu(); cin >> select; switch(select) { case PRINTLIST:.. 2022. 6. 28.
C++ ] 상속을 이용한 주차타워 이전에 사용한 동물호텔과 코드가 거의 같다. main.cpp #include #include "Parking.h" #include using namespace std; int main(void) { Parking parkingHandler; while (true) { int select; system("cls"); parkingHandler.DispMenu(); cout > select; switch (select) { case INBOUND: parkingHandler.InBound(); break; case OUTBOUND: parkingHandler.OutBound(); break; case VIEW: parkingHandler.ViewList(); break; case EXIT: cout 2022. 6. 24.
C++ ] 상속/가상함수를 이용한 동물호텔 main.h #include #include "Hotel.h" #include using namespace std; int main(void) { Hotel hotelHandler; while(true) { int select; system("cls"); hotelHandler.DispMenu(); cout > select; switch (select) { case CHECKIN: hotelHandler.CheckIn(); break; case CHECKOUT: hotelHandler.CheckOut(); break; case VIEW: hotelHandler.ViewList(); break; case EXIT: cout 2022. 6. 24.
CISC 와 RISC CISC (Complex Instruction Set Computer) 연산에 처리되는 복잡하고 기능이 많은 명령어 집합을 수백 개 이상 탑재하고 있는 프로세서 과거에는 PC 메모리 용량이 크지 않아서 소프트웨어의 용량을 줄이기 위해 하나의 명령어로 여러 작업을 수행하도록 CISC를 많이 사용하였다. 가변 길이 명령어 형식이어서 명령어를 먼저 해석한 후에 실행한다, 명령어 해석에 필요한 회로가 복잡해 병렬 처리가 쉽지 않다 트랜지스터 집적에 있어서 효율성이 떨어지기 때문에, 전력 소모가 크고, 속도가 느리고, 가격이 비싸다는 등의 단점이 있다. 복합적이고 기능이 많기 때문에 하위 호환성이 좋다. 호환성이 필요한 범용 컴퓨터, intel 사의 프로세서에 주로 사용된다. RISC (Reduced Instru.. 2022. 6. 23.
STM32 ] Datasheet 첫 장에 나오는 DMIPS 란 MIPS: Million Instructions Per Second, CPU가 1초 동안 처리할 수 있는 명령어의 수, Million 단위 1MIPS : 1초에 100만개의 명령어를 수행한다는 의미 DIMPS : Dhrystone Millon instructions Per Secone, Dhrystone(드라이스톤) 벤치마크 테스트 결과를 정수화해서 하중한 값. 프로세서의 성능 비교에 이용됨 2022. 6. 23.
Memory mapped I/O 와 I/O mapped I/O CPU가 메모리와 주변장치를 인터페이스 하는 방식에는 아래와 같은 대조적인 2가지 방법이 있다. Memory Mapped I/O 마이크로프로세서(CPU)가 입출력 장치를 액세스할 때, 입출력과 메모리의 주소 공간을 분리하지 않고 하나의 메모리 공간에 취급하여 배치하는 방식. 메모리와 I/O가 연속된 어드레스 영역에 할당되기 때문에 I/O가 차지하는 만큼 메모리 용량은 감소한다. CPU의 입장에서는 메모리와 I/O가 동일한 외부기기로 간주되므로 이들을 액세스하기 위한 제어신호는(read)와(write) 신호뿐이다. 소프트웨어적으로도 메모리에 대한 데이터의 액세스나 I/O에 대한 데이터의 입출력이 동일한 것으로 간주되므로 load나 store 명령에 의해 수행된다. 컴파일러의 최적화를 방지를 위해 I/O 영.. 2022. 6. 23.
Fritzing ] 부품 라이브러리 추가하는 법 Fritzing은 회로도를 그릴 수 있는 툴로 현재 유료화 되었기는 하지만 공식 사이트에서 회원가입하고 다운로드 하면 무료로 받을 수 있는 방법이 있다. https://fritzing.org/download/ Fritzing Fritzing is an open-source hardware initiative that makes electronics accessible as a creative material for anyone. We offer a software tool, a community website and services in the spirit of Processing and Arduino, fostering a creative ecosystem that allo fritzing.org Fr.. 2022. 6. 23.
STM32 ] __IO , volatile 타입 한정자 (Qualifier) 이에 대한 정의는 Drivers - CMSIS - Include _ core_cm4.h 파일 내에서 찾을 수 있다. /* IO definitions (access restrictions to peripheral registers) */ /** \defgroup CMSIS_glob_defs CMSIS Global Defines IO Type Qualifiers are used \li to specify the access to peripheral variables. \li for automatic generation of peripheral register debug information. */ #ifdef __cplusplus #define __I volatile /*!< Defines 'read onl.. 2022. 6. 23.
전자회로 ] OrCAD Capture 사용법 직접 만들어본 STM32F429ZI 보드의 회로도 일부 OrCAD Capture 설치 방법 https://www.npit.co.kr/html/dh_board/lists/support102 위 링크에서 다운로드 후 설치한다. 개인평가용 Demo(Lite) 버전은 라이센스 없이 사용 가능하다. 설치 후 시작 페이지 OrCAD Capture 뒤에 붙는 CIS는 Component Information System으로 협업을 위한 부품정보 통합지원을 의미한다. File - New - Project 프로젝트명과 경로 지정 후 OK 프로젝트 파일 아래, 스키매틱 아래의 페이지를 눌러 편집 가능하다. Option - Schematic Page Properties 를 통해 페이지 크기를 조절할 수 있다. 소자를 추가하기.. 2022. 6. 21.
STM32 ] 블루투스 모듈 MLT-BT05 사용하기 / 메시지 주고받기 , AT 커맨드 USART3 핀 설정 USART2 핀, 블루투스 모듈에 연결 보드-PC간 보드레이트 115200bps 블루투스-보드간 보드레이트 9600bps MLT-BT05 4.0 모듈의 공장출고 시 default 보드레이트가 9600bps이다. 둘다 NVIC Settings에서 인터럽트를 켜준다. 일단 전역변수 선언 구간에 따로 uart 데이터를 받을 변수를 선언해준다. /* USER CODE BEGIN PV */ uint8_t rx3_data; uint8_t rx2_data; /* USER CODE END PV */ USER CODE BEGIN 2 에서 인터럽트를 enable 한다. /* USER CODE BEGIN 2 */ HAL_UART_Receive_IT(&huart3, &rx3_data, sizeof(rx3.. 2022. 6. 19.
STM32 ] RTC 와 LCD 모듈을 사용한 알람시계 구현 (2) - 더블클릭 기능 추가 일단 한번 클릭한 것과 2초 이상 클릭한 것과 구별되어 더블클릭이 아주 잘 인식된다. 더블클릭한 경우 벨소리 선택모드로 넘어가게 끔 하고 벨소리 선택모드에서 한번 클릭하면 다시 노멀모드로 돌아오게끔 했다. 핵심코드 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if(GPIO_Pin == GPIO_PIN_13){ if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13)){ user_pulled_flag=0; user_pressed_flag=1; old_tick=HAL_GetTick(); current_tick=HAL_GetTick(); if(mode==NORMAL){ interval_chk[0]= HAL_GetTick(); interval=interv.. 2022. 6. 19.
STM32 , UART 통신으로 4 digit 7 segment FND 실시간 제어하기 2편 커맨드 조건 [0x02] [CMD] [DATANUM] [DATA] [CHECKSUM] [0x03] 1. CMD - ‘LED’ - ‘FND’ 2. DATANUM : 2바이트 [DATA] 길이 3. DATA : 가변 - ‘LED’ : DATANUM = 2 [LEDNUM][STATE] 예) ‘01’ - 1번 LED ON ‘10’ - 2번 LED OFF - ‘FND’ : DATANUM = 4 [DISPCOUNT] 예) ‘1234’ ‘4567’ 4.CHECKSUM : 1바이트 - CHECKSUM = CMD + DATANUM + DATA 5. Example - [0x02] [‘LED’] [‘02’] [‘01’] [CHECKSUM] [0x03] - [0x02] [‘FND’] [‘04’] [‘1234’] [CHECKS.. 2022. 6. 18.
STM32 ] Timer 인터럽트를 사용하여 ADC 값 받기 + 그래프 보면서 디버깅하는 팁 ADC : Analogue to Digital Converter, 아날로그 신호를 디지털 신호로 변환하는 것으로 샘플링(Sampling), 양자화(Quantizing), 부호화(Coding) 과정을 거친다. 샘플링 : 아날로그 파형을 디지털 형태로 변환하기 위해 표본을 취하는 것 양자화 : 표본화된 각 점을 어느 정도 resolution 으로 표현할지 정해 변환하는 것. 예를들어 8비트면 256단계로 세분화 부호화 : 앞의 단계를 거친 디지털 정보를 2진수로 표현하는 것 ADC를 인터럽트방식으로 사용하면 끊임없이 인터럽트가 트리거되어 다른 부분에 문제를 일으킨다. Timer 인터럽트와 ADC 폴링방식을 사용하여 ADC의 샘플링 주기를 조절하는 방법을 소개한다. 먼저 테스트를 위해 사용할 것은 아두이노에 .. 2022. 6. 17.
C++ ] 입력 버퍼 비우기 , 문자를 입력하면 무한루프에 빠지는 문제 해결 / cin.clear() , cin.ingnore() 정수형 값이 입력되어야 하는데 문자나 문자열이 들어왔을 때 무한루프에 빠지는 문제를 해결하는 방법은 다음과 같다. 대략 아래와 같이 추가해주면 된다. cin.clear() 는 현재 입력이 성공인지 실패인지 나타내는 내부 플래그를 초기화시키는 함수이고 cin.ignore() 가 입력 버퍼를 비우는 함수이다. 두번째 매개변수인 '\n' 문자가 나올때까지 비우는 것(해당 문자 포함)이고, 첫번째 매개변수는 byte 단위로 무시할 문자의 최대 개수를 뜻한다. 정석은 std::numeric_limits::max()을 쓰는 것인데 너무 기니까 INT_MAX를 쓰거나 적당히 큰 값을 입력해주면 된다. cin.clear(); cin.ignore(1000,'\n'); 문자가 입력된 경우를 예외처리 하지 않았을 때 아래와.. 2022. 6. 16.
C++ ] 클래스를 활용한 자판기 (2) VendingMachine.h #define DRINKNUM 4 #define MAXSTOCK 4 struct _DRINK { const char* name; int price; int stock; }; class VendingMachine { private: _DRINK drink[DRINKNUM]; int MyMoney; int MinPrice; public: VendingMachine(const char* name1, int price1, const char* name2, int price2, const char* name3, int price3, const char* name4, int price4); void showList(); void chkMinPrice(); int GetMoney() c.. 2022. 6. 16.
C++ ] 자판기 (1) main.h #ifndef __MAIN_H__ #define __MAIN_H__ typedef struct { char name[20]; int price; int stock; } _DRINK; namespace VendingMachine { int DecideDrinkNum(void); int SettingDrink(_DRINK* drink, const int& num); bool Menu(_DRINK* drink, const int& num, int& money, int min); int MoneyInput(void); } #endif namespace를 사용하여 관련된 함수를 묶었다. main.cpp #include #include #include #include "main.h" using name.. 2022. 6. 16.
STM32 ] RTC 와 LCD 모듈을 사용한 알람시계 구현 (1) 처음 실행시 타임세팅 모드. 업/다운/라이트/레프트 버튼으로 시간 설정. 00분에서 다운버튼 누르면 59분, 59분에서 업버튼 누르면 00분으로 변함. 해당부분 할 드라이버 매크로함수 사용하였음 시간설정 후 유저버튼 한번 누르면 노멀모드 진입하고 시계 돌아감. 노멀 모드에서 유저버튼을 2초이상 누르고 있으면 바로 알람세팅 모드 진입 현재시간에서 커서가 깜빡거리고 버튼으로 알람시간을 설정한 후 유저버튼을 한번 누르면 다시 노멀모드로 돌아온다. 영상은 10초 뒤로 알람맞춘것. 알람설정 시간인 PM 02:25:26 가 되면 "삐삐삐삐" 하면서 알람이 울리는데 소리가 작아서 키워야 들린다. 알람울리는 중간에 mute interval을 주는 건 HAL_Delay를 사용하지 않았기 때문에 알람이 울리는 중간에도 시.. 2022. 6. 11.
STM32 ] RTC , GetTime / GetDate 함수로 시간 값 확인 시 주의사항 HAL_RTC_GetTime 함수를 따라 들어가보면 다음과 같은 주의사항이 나온다. 반드시 HAL_RTC_GetTime() 함수를 사용한 뒤에 HAL_RTC_GetDate() 를 호출해주어야 한다. 예를 들면, HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN); HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN); 이렇게 해야지. 반대순서로 호출하면 오류가 난다. 그리고 시계를 만들기 위해 시간만 필요하다고 해서 RTC_DateTypeDef 변수를 안만들고 HAL_RTC_GetDate()을 안해줘도 오류가 난다. 둘은 항상 세트로 호출해야 된다고 생각하자. 2022. 6. 11.
STM32 , RTC 와 FND 로 시계 만들기 + UART로 시간 제어 (FND 라이브러리 공유) RTC를 사용하기 위해서 외부에 장착된 32.768KHz의 LSE 클락소스를 사용한다. 먼저 CubeMX 설정 RTC (Real Time Clock) 설정 위와같이 Activate 하고 일단 알람기능은 사용하지 않는다. Hourformat 12를 선택하면 12:00:00 부터 11:59:59 까지 표시되며 AM/PM value를 갖는다. Hourformat 24를 선택하면 12:00:00 부터 23:59:59 까지 표시되는 것 같다. Data Format은 BIN 와 BCD 중에 선택할 수 있는데 BCD를 선택했다. 그리고 UART 커맨드로 시간을 재설정해줄 예정이기 때문에 보드에 업로드시 적용되는 초기 시간값은 크게 신경쓰지 않았다. + usart3 인터럽트모드로 설정해준다. main.c의 전역변수 구.. 2022. 6. 9.
STM32 , printf 디버깅에 사용 & 변수 값 그래프로 출력하기 2편 ( SWV / ITM ) 이번엔 SWV (Serial Wire Viewer) / ITM (Instrumentation Trace Macrocell 를 통한 printf 사용방법에 대해 소개한다. 이전글 참고 : 2022.06.06 - [MCU/STM32 (ARM Cortex-M)] - STM32 , printf 디버깅에 사용하기 1편 ( UART 통신 ) 1. CubeMX에서 클락설정 먼저 해준다. 2. 표준입출력 헤더파일을 포함한다. /* USER CODE BEGIN Includes */ #include /* USER CODE END Includes */ 3. _write 함수를 ITM에 리다이렉션하는 것으로 재정의 해준다. /* USER CODE BEGIN PFP */ int _write(int file, char* p, i.. 2022. 6. 6.
STM32 , printf 디버깅에 사용하기 1편 ( UART 통신 ) STM32CubeIDE에서는 표준출력함수인 printf 를 사용하기 위해서는 표준 출력 대상인 콘솔창이 없으니 리다이렉션하여 써야하는데 이번엔 그 중 UART를 통해 printf 함수를 쓰는 방법을 소개한다. SWV / ITM 통해 printf 사용하는 버전 링크 : 2022.06.06 - [MCU/STM32 (ARM Cortex-M)] - STM32 , printf 디버깅에 사용 & 변수 값 그래프로 출력하기 2편 ( SWV / ITM ) 1. 먼저 CubeMX에서 UART 설정을 해준다. 2. 코드에 표준입출력 헤더파일을 포함한다. /* USER CODE BEGIN Includes */ #include /* USER CODE END Includes */ 3. main함수 들어가기전에 _write 함수.. 2022. 6. 6.
STM32 , I2C 통신 오실로스코프로 확인하기 I2C Inter-Integrated Circuit의 약자, 아이투씨 또는 아이스퀘어씨라고 읽음 Data선(SDA)과 Clock선(SCL) 2개로만 통신이 가능 통신속도는 표준모드에서 100KHz, Fast모드에서 400KHz로 비교적 저속이라 GPIO로도 구현가능하다. (내가 사용하는 보드에는 3개의 I2C컨트롤러가 내장되어 있다. 하지만 GPIO로 굳이 구현한다면 마스터는 GPIO output, 슬레이브는 GPIO input으로 설정하면 된다.) 아래 사진과 같이 SDA, SCL 라인에 여러 디바이스가 연결될 수 있다. SDA, SCL 라인은 각각 풀업저항으로 연결되어있어 통신을 하지 않을 때는 HIGH 상태를 유지하고 하나의 마스터가 통신을 시작하면 LOW레벨로 떨어진다. 버스에 물려있는 누구나 마.. 2022. 6. 6.
npn, pnp 트랜지스터 정리 왼쪽이 순방향 결선. p형이 +극 n형이 -극에 연결된 상황 오른쪽이 역방향 결선. npn : 전원이 컬렉터에 연결. 베이스와 이미터가 순방향. 그래서 베이스에서 이미터 방향으로 화살표. pnp : 전원이 이미터에 연결. 베이스가 이미터가 역방향. 그래서 이미터에서 베이스 방향으로 화살표. npn형 : 베이스에서 이미터로 작은 전류가 흐르면 콜렉터에서 이미터로 더 큰 전류가 흐르고 pnp형 : 이미터에서 베이스로 작은 전류가 흐르면 이미터에서 콜렉터로 더 큰 전류가 흐르게 됨 출처 : https://www.youtube.com/watch?v=1WC9h1pWApY 2022. 6. 5.
GPIO output mode , Push-Pull 과 Open drain 의 차이 출처 : Push-Pull 일때 인풋이 1이면 아웃풋이 1이 나오고 인풋이 0이면 아웃풋이 0이 나온다. Open Drain 일때 단순히 Push-Pull에서 위의 PMOS 트랜지스터가 disabled 된 형태이다. 인풋이 0일때 아웃풋이 0이다. 인풋이 1일때는 아웃풋이 플로팅 상태이다. 이러한 회로는 외부 전원과 풀업저항을 연결해서 사용해야하는데, MCU의 출력레벨인 3.3V가 아닌 레벨이 다른 전원 소스를 사용할 수 있게끔하여 유연성을 제공한다. 또한 오픈드레인은 I2C버스를 구성하는데도 쓰인다. SCL, SDA 라인에는 풀업저항이 달려있고 다수의 디바이스가 연결된 형태로, 통신을 하지 않을 때는 라인이 HIGH상태를 유지하다가 어떤 마스터가 신호를 LOW로 당기고 통신을 시작했을 때 다른 마스터가.. 2022. 6. 5.
STM32CubeIDE , 프로젝트 복사 붙여넣기 하는법 / clone or duplicate a project for reuse STM32CubeIDE 에서는 프로젝트를 복붙해 재사용하는 방법 그냥 아무렇게나 복붙했다가는 오류가 나서 컴파일이 안되거나 혹은 복사한 프로젝트를 수정했는데 원본까지 같이 수정되는 경우가 생긴다. copy 라는 프로젝트를 복사해 paste 라는 프로젝트명으로 재사용 해본다. 카피할 프로젝트 우클릭 - Copy Project Explorer 빈 곳 우클릭 - Paste 프로젝트명을 써주고 Location 위치도 직접 써준다. 프로젝트를 저장하는 곳은 아래 STM32CubeIDE의 기본 workspace 외 다른곳을 사용하는 것이 좋다. C:\Users\[user_name]\STM32CubeIDE\workspace_1.10.1 .ioc 파일을 프로젝트명과 동일하게 수정해준다. Debug 폴더와 -Debug... 2022. 6. 4.
STM32 , UART 통신으로 4 digit 7 segment FND 실시간 제어하기 1편 ( 2가지 방법 ) UART 수신 인터럽트를 통한 4자리의 FND 실시간 제어 명령어 예시 FND38 : 3번째 FND에 숫자 8을 켠다. FNDA4 : 모든 FND를 4로 켠다. FND4X : 0-9 값이 아닌 다른 값을 입력하면 4번째 FND가 꺼진다. 이 글에 나오는 다른 함수는 이전글과 동일하다. 이전글 : 2022.06.02 - [MCU/STM32 (ARM Cortex-M)] - STM32 , 74HC595 시프트 레지스터로 FND 제어하기 , 카운터 / 시계 ( SysTick 타이머 사용) 테라텀 설정 New connection으로 포트를 제대로 잡은 후 보드레이트 115200으로 잡아주고 Setup - Terminal 설정에서 new-line 시 라인피드(\n)가 전송될 수 있도록 하고 내가 터미널에 친 글자가.. 2022. 6. 3.
STM32 , 74HC595 시프트 레지스터로 FND 제어하기 , 카운터 / 시계 ( SysTick 타이머 사용) 시프트 레지스터 두개로 4개의 FND를 제어할 수 있는 아두이노 호환보드를 사용하여 카운터 및 시계를 만들어 보겠습니다. 0부터 9999 까지 세는 카운터 시계, 왼쪽 두자리가 분이고 오른쪽 두자리가 초 확장보드의 회로도 직렬입력-병렬출력 시프트레지스터인 74595칩이 두 개가 달렸다. 왼쪽 칩의 SDI가 아두이노 8번핀과 연결되어 있고 Shift Clock 과 Latch Clock은 각각 7번핀 4번핀에서 두 칩에 동시에 들어간다. FND에 표시할 숫자를 결정하는 부분은 오른쪽 74595 칩이고 그 숫자를 4개중에 어디에 표시할 지는 왼쪽 74595 칩에 의해 결정된다. 예를 들어 왼쪽 74595칩의 QA, QB, QC, QD가 모두 HIGH라면 같은 숫자가 들어간다. 그리고 delay 없이 1번, 2.. 2022. 6. 2.
STM32 프로젝트 , 팩맨 게임 ( ADC in DMA mode 로 조이스틱 이용한 방향제어 , I2C LCD , Timer 인터럽트 및 PWM 사용 ) 개인 프로젝트제작기간 : 3일보드 : STM32F429ZITool : STM32CubeIDE I2C LCD 모듈, 조이스틱, 수동부저 사용  https://github.com/joeteo/Pacman GitHub - joeteo/Pacman: STM32 Pacman game with LCD and JoystickSTM32 Pacman game with LCD and Joystick. Contribute to joeteo/Pacman development by creating an account on GitHub.github.com        회로도핀 연결과 설정은 아래표를 참고해주세요. I2C interface 16x2 LCDGNDGNDVCC5VSCLSCL (PB8)SDASDA (PB9)     Dua.. 2022. 5. 31.
STM32 , UART 통신으로 피아노 연주하기 , PWM Frequency 제어 ( Passive Buzzer ) STM32F429 보드와 수동부저를 사용하여 멜로디를 연주해 보았다. 인터럽트 방식 UART 통신으로 시리얼 모니터에 숫자를 입력하는 해당하는 음계가 연주된다. 회로와 timer 설정은 지난번에 올린글과 동일하다. 거기서 uart3 설정만 켰다. 2022.05.27 - [MCU/STM32 (ARM Cortex-M)] - STM32 , PWM 주기 변경으로 수동 부저 ( Passive Buzzer ) 제어 , 실시간으로 ARR 변경시 동작 멈추는 현상 해결 , 멜로디 출력 소스코드 전역변수 구간 /* USER CODE BEGIN PV */ typedef enum { N = 0, C = 956, D = 852, E = 758, F = 716, G = 638, A = 568, B = 506, C6 = 478 .. 2022. 5. 27.