안녕하세요.

강좌가 늦었네요. 죄송합니다.

어제 낮에 회사에서 틈틈히 적어두고 집에가서 마무리 하려고 했습니다.

근데 퇴근이 너무 늦었네요. 집오니 11시가 넘어서 그냥 잠들어버렸습니다 ㅠ





드디어 10번째 강좌까지 진행했네요.

 


어제까지 매크로 회로의 회로도와 패턴도를 알아보았습니다.

 

직접 회로를 조리하는 모습은 다음번 강좌에서 다루기로 하구요.

오늘은 매크로 만드는 프로그램에 대해서 간단히 소개하려고 합니다.

 


PIC마이컴의 프로그램을 작성할 땐 컴파일러가 필요합니다.

PIC용 컴파일러로 유명한게 HITEC과 CCS-C가 있습니다.

저는 CCS-C의 컴파일러로 진행을 합니다.

왜냐면 쓰기 쉬우니까요..


회사 개발실에선 HITEC, CCSC는 물론 MPASM도 쓰는데 전 C만 다룰줄 아니까요. 그중에 쉬운 CCSC..

 


CCSC를 구매하려면 전자부품 판매하는 여러곳에서 판매하는데 키트코리아, 네오칩, MCU마트에서 팝니다.



사진은 네오칩에서 무단으로 퍼온겁니다

가격은 이정도하네요.

 


하드웨어 개발용 프로그램치고는 가격이 참 착한 것 같습니다.

개인도 구매가능할 정도네요.

 

 

아무리 그래도, 매크로 조이스틱 하나 만들겠다고 이것 까지 구입하시는 건 사치라는 생각이 듭니다.

 


이번 강좌에서는 이런 프로그램도 있구나 하고 보기만 하셔두 됩니다(물론 구글을 잘 살펴보면 여러분도 방법이 있긴 있어요.... 이런 민감한 이야기는 여기까지만... 흠흠흠).

이번 강좌에서는 매크로가 PIC칩에 들어가는 프로그램으로 만들어지는 원리와 과정에 대해서만 알아보아요.

 

 


강좌 초반부에 알려드렸죠.

PIC16F54의 핀에 각각 매크로의 스위치와 조이스틱의 구동부가 대입된다는 것에 대해서 말입니다.

 

위 핀 다이어그램을 잘 살펴보세요.

매크로 회로를 여러번 만들어보았더니 이제 핀 다이어그램 정도는 그냥 달달 외울정도가 되었네요.


만약에 매크로 버튼들에 각각 초풍신과, 무족초풍신을 설정한다면 코드는 어떻게 될까요?

일단 전체적인 이해를 하고 세세한 부분 설명을 해드릴게요.

전체 코드는 다음과 같습니다.


#include<16f54.h> #fuses hs,nowdt,noprotect	//퓨즈 설정  #use delay(clock=4000000)	//4MHz를 사용한다면 clock=4000000로 쓰면 됨  #byte porta = 0x05		//PIC16F54 DATASHEET 16페이지를 참조하면 포트의 주소가 적혀있다 #byte portb = 0x06             void main() {    set_tris_a(0x0f);		//PORT A를 INPUT포트로 설정한다. 매크로 스위치 검출을 하기 위해서    set_tris_b(0x00);		//PORT B를 OUTPUT포트로 설정한다. 매크로를 구현하는 부분        porta=0;    for(;;){	//끊임 없이 스위치의 눌림 상태를 검출.       portb=0;			//레버중립, 버튼 안눌림으로 설정하는 과정                 if(bit_test(porta,0)==0){		//RA0과 연결된 스위치가 눌렸을 때, 2P 무초          portb=0b00100000;		//<=2p          delay_ms(45);			//레버 유지          portb=0;			//레버 중립          delay_ms(20);			//레버 중립 유지          portb=0b01100010;		//2P무족초. 3+RP          delay_ms(90);			//3+RP유지. 무족초 발동 중인 상태          portb=0;			//레버 중립          delay_ms(530);			//딜레이.       }              if(bit_test(porta,1)==0){		//RA1 스위치 눌리면, 2p자리 초풍          portb=0b00100000;		//<=2p          delay_ms(45);			//레버유지          portb=0;			//레버 중립          delay_ms(20);			//레버 중립 유지          portb=0b01000000;		//레버2방향          delay_ms(20);			//레버2방향 유지          portb=0b01100010;		//2p초풍          delay_ms(90);			//딜레이          portb=0;			//레버 중립          delay_ms(530);			//딜레이.       }              if(bit_test(porta,2)==0){ 	//RA2 스위치 눌리면, 1P자리 초풍          portb=0b00010000;		//=>1p          delay_ms(45);			//레버 유지          portb=0;			//레버 중립          delay_ms(20);			//레버 중립 유지          portb=0b01000000;		//레버 2방향          delay_ms(20);			//레버 2방향 유지          portb=0b01010010;		//1p초풍          delay_ms(90);			//딜레이          portb=0;			//레버 중립          delay_ms(530);			//딜레이.       }              if(bit_test(porta,3)==0){		//RA3 스위치 눌리면, 1p자리 무초          portb=0b00010000;		//=>1p          delay_ms(45);			//레버 유지          portb=0;			//레버 중립          delay_ms(20);			//레버 중립 유지          portb=0b01010010;		//1pP 무족초          delay_ms(90);			//딜레이. 무족초 발동 중인 상태          portb=0;			//레버 중립          delay_ms(530);			//딜레이.       }    } } 

(잉?? 근데 왜 신택스 하이라이트가 안되지?;;;;)






매크로 회로를 잘 보면 PIC16F54에 5볼트 전원이 연결된 곳이 5군데가 있습니다.

일단 PIC자체가 구동되기 위한 VDD전원핀(14번)이 기본적으로 연결되어 있구요.

매크로 스위치의 눌림 여부를 검출할 RA2,RA3,RA0,RA1(각각 1,2,17,18번 핀)에 연결되어 있습니다.


물론 RA핀들에는 저항이 연결되어있구요.

회로의 원리는 5V전원이 RA에 항상 들어옵니다. 그러다가 조이스틱 매크로 버튼을 눌러주면 그 전원들이 전부 버튼 부분의 스위치를 통해 접지(GND)로 빠지게 되는거죠.

그러면 RA는 전류가 없다는 걸 알게됩니다.

이 때 매크로로 정해진 동작을 수행하게 됩니다.

소스코드로 표현하면 다음과 같습니다.

      if(bit_test(porta,0)==0){		//RA0과 연결된 스위치가 눌렸을 때, 2P 무초

 

bit_test는 어떤 포트(여기선 port a)의 비트값이 값이 무엇인지 검사하는 겁니다.

port a는 입력용으로 이용하고 있으므로, 전기가 들어오면 1, 전기가 안들어오면 0입니다.

다시 해석을 해보면 "port a의 0번 비트가 0이면" 이란거죠

port a의 0번 비트가 0, 즉 전기가 안들어오려면 5v로 들어오던 전원을 어딘가로 빼야겠죠?

그걸 바로 스위치가 하는 겁니다.

스위치를 누르면 전원이 저항이 걸린 port a 대신 저항이 없는 GND로 빠지게 됩니다.

전기는 가기 쉬운데로 가는 성질이 있으니까요.




그러면 정해진 동작.. 즉 매크로는 어디를 통해서 구현이 되느냐.

바로 RB즉 PORT B를 통해서 구현이 되는 것 입니다.


이부분의 코드는 다음과 같습니다.

         portb=0b00100000;		//<=2p          delay_ms(45);			//레버 유지          portb=0;			//레버 중립          delay_ms(20);			//레버 중립 유지          portb=0b01100010;		//2P무족초. 3+RP          delay_ms(90);			//3+RP유지. 무족초 발동 중인 상태          portb=0;			//레버 중립          delay_ms(530);			//딜레이. 


이 자슥이 자기만 안다고 모르는 사람갖고 장난하나. portb=001100010; 이러면 이게 뭔지 안단말야? 라고 생각하실 수도 ㅎㅎㅎ 설명드릴게요

PORTB는 조이스틱에 커맨드를 구현시키는 부분이라고 말씀드렸죠?

숫자 0,1앞에 붙은 0b는 이 숫자를 바이너리, 즉 2진수(비트, bit)로 쓰겠다는 말입니다.

PORTB가 총 8핀(RB0,RB1,RB2, ... , RB7)으로 이루어져있는데 이걸 일일이 (portb,0) , (portb,1) 이런식으로 제어하려면 귀찮잖아요.

그래서 비트로 제어하는 겁니다.

비트는 가장 높은 자릿수부터 RB7, RB6, RB5, ... 으로 대응 되는데요.

저는 RB7, RB6, RB5, ... , RB0핀을 각각 조이스틱의 상,하,좌,우,왼팔,왼발,오른팔,오른발에 대응시켜두었습니다.

그래서 portb=0 (== portb=0b00000000)이면, 스틱은 중립이고, 버튼은 아무것도 누르지 않았다는 표시인 겁니다.

그럼 조이스틱의 오른팔을 구동시키려면??? RB1 핀에서 신호가 나와야겠죠? 그러면 portb는 값이 몇이 되야하죠?

네. 바로 portb=0b00000010; 이 됩니다.



브라이언의 도발 커맨드를 시전하려면, 왼팔, 왼발, 오른발을 동시에 눌러야죠? 그러면 핀은 RB3, RB2, RB0에서 신호가 나와야겠죠.

따라서 portb=0b00001101 가 됩니다.

참 쉽져????








결국 매크로의 작동원리는 PIC16F54라는 칩 안에 우리가 하고 싶은 저스트 프레임의 입력 기술을 미리 넣어두고(심지어 커맨드 사이의 딜레이까지도 입력해두고), 버튼 하나를 누르면 그걸 전부 풀어내게 하는 것입니다.


우리의 회로에 들어가는 크리스탈이 4.000MHz인데, 이정도면 초당 60프레임은 간단하게 나누어 계산할 수 있습니다. 그래서 기술 정확도가 매우매우 높아지는 것입니다.


저도 제가 만들었지만 참 뿌듯해요ㅋㅋ





요지는 PORT A에서 매크로 버튼이 눌리는지 안눌리는지 검출을 한 후에


PORT B를 통해 커맨드 들을 딜레이에 맞추어 입력한다는 것입니다.





다음 강좌에서는 부품을 실제로 조립하는 모습을 보여드리겠습니다.

최대한, 하나하나 따라가면서 만들 수 있도록 하진 않고 그냥 대강 따라가면서 만들 수 있게 할게요.

저도 사진 찍는게 귀찮아서.......




만들어보고 아는 놈은 참 쉬운데, 모르시는 분은 어려울지도 모르겠어요.

강좌 중에 모르겠다, 이해가 안된다 싶은 부분은 그 언제라도 괜찮습니다. 메일이나 리플주세요.

아이폰 푸시 알림 기능 켜놓고 있기 때문에 메일 주시면 거의 실시간으로 확인 가능합니다.

gongdol2pooh [at] gmail [dot] com




다음 강좌 예고 : 실제 부품 조립

그 다음 강좌 예고 : PIC16F54에 실제로 프로그램 넣는 방법

Posted by 공돌이pooh
,