프로젝트 내용은 다음과 같습니다.
구현범위 : 기본미션, 추가미션1,2,3,4
제가 코딩을 작성한 순서는 기본미션-> 추가미션1-> 추가미션2 ->추가미션3->추가미션4의 순서이나, 듣는사람의 입장에서 구현방법을 설명하기 위해선 추가미션4-> 기본미션-> 추가미션1->추가미션2->추가미션 3의 순서대로 설명하는 것이 좋을 것 같습니다.
우선, 미션들을 살펴보았을 때 다음단계로 넘어가기 위해 사용하는 버튼은 *, P1.1, P2.1세가지입니다. 그리하여 저는 각각의 버튼이 눌린 수를 count하는 변수 psw_cnt, sw_cnt, swt_cnt 세가지를 선언하였습니다.
추가미션 4는 psw_cnt(*)와 sw_cnt (P1.1)를 이용하여 구현하였습니다. 구체적인 기능은 아래의 표를 보시면 이해하실 수 있을겁니다.
| *버튼 | P1.1 | P2.1 | 내용 |
|---|---|---|---|
| Psw_cnt | Sw_cnt | Swt_cnt | |
| 0 | 0 | 0 | Re_pw에 encoderder의 회전수를 저장 |
| 0 | 1 | 0 | Psw[0]에 값을 저장, *을 눌러 다음상태로 넘어감 |
| 1 | 1 | 0 | Psw[1]에 값을 저장, *을 눌러 다음상태로 넘어감 |
| 2 | 1 | 0 | Psw[2]에 값을 저장, *을 눌러 다음상태로 넘어감 |
| 3 | 1 | 0 | Psw[3]에 값을 저장, *을 눌러 다음상태로 넘어감 |
| 4 | 1 | 0 | Re_pw와 psw[]에 저장된 값을 비교. |
| 값이 같다면 다음상태(psw_cnt=5, sw_cnt=0, swt_cnt =0)로 넘어가고, 값이 다르다면 (psw_cnt=0, sw_cnt=1, swt_cnt =0)의 상태로 되돌아간다. |
2)이때, swt_cnt(P2.1)는 눌러도 아무 기능이 작동되면 안되기에 항상 0으로 바꿔주었습니다.
3)또한, 추가미션4가 진행중일 때 p1.1을 한번 이상 눌러도 아무 작동도 되지않아야 하기 때문에 다음과 같은 코딩을 추가했습니다.
(psw_cnt=5, sw_cnt=1, swt_cnt =0)의 상태가 되면 기본미션과 추가미션1이 작동할 수 있습니다.
| *버튼 | P1.1 | P2.1 | 내용 |
|---|---|---|---|
| Psw_cnt | Sw_cnt | Swt_cnt | |
| 5 | 0 | 0 | 기본문제와 추가미션1의 작동준비가 완료되었다. |
| 5 | 1 | 0 | 첫번째 segment의 칸에 인코더로 값을 입력한다. |
| 5 | 2 | 0 | 두번째 segment의 칸에 인코더로 값을 입력한다 |
| 5 | 3 | 0 | 세번째 segment의 칸에 인코더로 값을 입력한다 |
| 5 | 4 | 0 | 입력받은 세기만큼 시계방향으로 모터가 회전한다. |
| 5 | 5 | 0 | 입력받은 세기만큼 반시계방향으로 모터가 회전한다. |
| 5 | 6 | 0 | 더 이상 모터가 회전하지 못하게 한다. |
| (psw_cnt=5, sw_cnt=1, swt_cnt =0)의 상태로 되돌아가게 하며, | |||
| 인코더로 입력된 segment(코딩에선 num[])의 값을 초기화시킨다. |
이때 p1.1(sw_cnt)의 값을 다시 0부터 카운트하기 시작합니다. num[ ]을 이용해 엔코더로 입력한 값을 받으며, segment에 그 값을 나타냅니다.
| *버튼 | P1.1 | P2.1 | 내용 |
|---|---|---|---|
| Psw_cnt | Sw_cnt | Swt_cnt | |
| 5 | 0 | 0 | 기본문제의 작동을 시작한다 |
| 5 | 0 | 1 | 네번째 segment의 칸에 가변저항으로 값을 입력한다 |
| 5 | 0 | 2 | 시계방향으로 모터를 네번째 segment에 나타난 숫자만큼만 회전시킨다.. |
| 회전한 후 (psw_cnt=5, sw_cnt=0, swt_cnt =3)으로 넘어간다. | |||
| 5 | 0 | 3 | 모터를 완전히 정지시킨다. |
| (psw_cnt=5, sw_cnt=0, swt_cnt =1)의 상태로 되돌아가게 한다. |