아래의 내용은 "GXworks2"로 작업하였습니다.

그림 1

필자는 그림을 못그립니다... 이해좀 해주세요ㅋㅋ 전구입니니다.

 

위의 그림1을 보면 PB1을 눌렀을 때 전구가 빨간색 -> 노란색 -> 파란색 -> 녹색 -> 보라색 순으로 켜보려고 합니다.

각각의 전구들이 1초간 켜지고 꺼지면 바로 다음 전구가 켜지고 마지막 전구가 켜지면 다시 첫 번째 전구를 켜는걸 할겁니다. 

PB2는 정지버튼 입니다. 전구가 커져 있으면 전구가 꺼집니다.

 

제어 회로입니다.

그림 2

▶ PB1을 누르면 M1을 켜고 M1을 자기유지 시킵니다. 1번 빨간 네모를 보시면 M1으로 T0(타이머0번)을 K10(1초)가 지난뒤 T0가 ON이 되면 D0에 1의 값을 더해 줍니다. (D0는 초기값이 0입니다.) 그리고 T0가 켜지면 T0의 자기 자신을 B접점을 두어 T0를 초기화 시키고 M1이 켜져있기 때문에 다시 타이머를 켭니다.

결국 1초 간격으로 한번식 끊어주고 다시 타이머를 돌리는 원리가 됩니다.

 

▶ 2번 빨간 네모를 보시면 M1이 켜졌을 때 비교연산자를 사용하여 D0의 들어간 값들이랑 비교를 하여 M10 ~ M 14까지 순서대로 켜주게 됩니다.  M10~M14는 임의로 준 값이며 여기에선 M10(빨간 램프) , M11(노란 램프) , M12(파란색 램프) , M13(녹색 램프) , M14(보라색 램프)로 보시면 되겠습니다. 마지막 줄을 보면 [> D0 K4] ----[MOVP K0 D0] 보입니다. 이것은 D0 > 4보다 크다면 D0에 0을 넣겠다는 것입니다. 

그 말은 D0가 5가 될 때 D0에 0을 넣는다는 말입니다.

결론은 4 -> 5가 될때 1초가 지난 뒤에 1을 더해 주니까, M14(보라색 램프) 동작이 끝나고 M10(빨간 램프)로 다시 켜주게 됩니다.

 

▶ 3번 빨간 네모는 PB2가 정지 버튼이므로 정지를 했을 때 처음부터 시작을 하려면 D0의 값을 0으로 바꿔줘야 됩니다. 그래서 넣었습니다.

 

※ 이쯤하면 만들 수 없을까? 라고 생각이 드실수도 있을겁니다. 물론 아닌분들도 있지만... 그래도 해봐야 느니깐 한번 생각 해보시기 바랍니다. 생각이 안난다 싶으면 위의 방법으로 변형을 한번 해보시기 바랍니다. 한 2가지 방법을 더 적겠습니다.

 

첫 번째 방법

그림 3

▶ 1번 빨간 네모칸은 T0를 K50(5초) 동안 타이머를 진행시킵니다. 

아래 줄에 [> T0 K0] - [< T0 K10] 둘다 ON이 되면 M10(빨간 램프)이 켜집니다.

이말인 즉, T0가 0~1초 동안 M10(빨간 램프)를 ON 시킨다는 말입니다. 나머지도 똑같습니다 

0 ~ 1초동안 -> M10 ON

1 ~ 2초동안 -> M11 ON

2 ~ 3초동안 -> M12 ON

3 ~ 4초동안 -> M13 ON

4 ~ 5초동안 -> M14 ON

 

두 번째 방법

그림 4

▶ 위의 방법은 D0의 시작점이 0의 값부터 시작 했는데, 이 방법은 1부터 합니다. 1번 빨간 네모칸을 보면 PB1을 눌렀을 시 D0에 1의 값을 넣습니다. 

이유가 있습니다. 밑에서 설명 하겠습니다.

2번 빨간 네모칸을 보면 ROL이라는 명령어가 있습니다.  여기서 쓰인 명령어는 ROL , SFR , SFL을 썼습니다. 이걸 한번 짚어보고 가겠습니다. 추가로 ROR도 설명 하겠습니다.

 

D 메모리 크기(16Bit)

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

이렇게 표현을 할 수 있습니다. 2진수로 표현 됩니다. 저기 한칸 한칸이 1Bit입니다.

 

D메모리 안에 10진수 1을 넣어 보겠습니다.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

1을 2진수로 16Bit에 표현하면 위쪽처럼 됩니다. 

아까 D0에 10진수 1을 넣었으니 위와 같이 표현이 됩니다.

 

이때 , ROL K1을 하면

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0

이렇게 됩니다. 설명을 하자면 "왼쪽으로 1 Bit 움직여라." 라는 뜻이다. 

 

특징은 아래와 같이 설명 하겠습니다.

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

여기서 ROL K1을 하면 

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

0자리에 1이 올라간다. 생각해보자. 15번째 자리랑 0번째 자리랑 원모양으로 이어져 있다고 생각하면 왼쪽으로 1Bit만큼 밀었다면 0번째 자리에 1이 올라간다고 생각할 수 있다. 그래서 ROL은 Roate of left 라고 생각하고 해석하면 왼쪽으로 회전 요렇게 생각하면 된다. 그래서 ROL K1을 다시 설명 하자면 "왼쪽으로 1Bit만큼 움직이고 회전할꺼 있으면 회전해라" 라는 뜻이된다.

나머지도 해석을 할 수 있다. "ROR(Rotate of Right) -> 오른쪽으로 Bit를 움직이고 회전해라." 라고 생각할 수 있다.

 

그럼 SFL,SFR은 뭘까? 이것도 똑같다 비트 수 만큼 움직이는 명령어다.  SFL -> Shift left , SFR -> Shift Right 뜻이다. 그럼 다른점은 뭘까? 아래를 보자.

 

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

여기서 SFL K1을 하면

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

어떤가? 다 0이 된다. 아까는 회전해서 0번째 자리로 갔지만 이거는 옆으로 가면 아예 없어져 버린다. 

이정도 이해하면 된다. 더 알고 싶다면 C언어 중에 쉬프트 연산이있다. 그걸 참고하면 이해가 더 잘 될 것이다.

 

▶ 아까 위로 다시 가보면  3번 빨간 네모 칸에 D0.0 이 있습니다. 아까 위에서 봤듯이 D0의 메모리안에 0번째 자리를 쓴다는 이야기 입니다. D0.0가 A접점으로 쓰인걸로 보이죠? 네 맞습니다. 1Bit는 0 또는 1의 값을 가지는데 A접점으로 쓰고 D메모리에 0번째 자리에 1이 들어가면 커졌다고 생각할 수 있겠습니다. 그래서 D0.0이 켜지면 M10가 켜지고 ROL K1 한번식 Bit가 왼쪽으로 밀리면 D0.1, D0.2, D0.3... 요런식으로 커졌다 꺼졌다를 할 수 있습니다. 

4번 빨간 네모칸을 보면 SFR K5 오른쪽으로 밀었으니 다시 0번째 자리에 1이 있으므로 처음 상태값이 됩니다. 그래서 똑같은 결과가 됩니다.

5번 빨간 네모칸을 보면 SFL을 k15번 자리로 밀면 죄다 0의 값으로 채워지기 때문에 처음 아무것도 없는 상태가 되므로 [ MOVP K0 D0 ]와 똑같은 결과가 됩니다.

 

 

 

+ Recent posts