마하전자기술연구소 LOGO

제품검색 고객센터053-604-2355
기술자료실

Home > 기술자료실 기술자료실

제 목 10. PC와의 패러렐 통신 접속
첨부파일


PC와의 패러렐 통신 접속  

【PC와 접속】

PIC와 PC를 접속해 통신을 할 수 있게 되면, 여러가지
응용범위가 생각되어 즐거움도 배증합니다.
여기에서는, PC와 프린터 인터페이스에 의해 접속하는 방법
(을)를 설명합니다.
이 송수신에는핸드쉐이크 통신 방식이라고 하는 방법도 있습니다만,
여기에서는 좀 더 간단한 방법을 사용하고 있습니다.

【프린터 인터페이스 접속】

PC의 프린터 인터페이스는, DOS/V기의 경우, 패러렐
의 쌍방향 통신을 할 수 있게 되어 있습니다. (최근의 PC98xxNX도)
거기서, 이 프린터 인터페이스를 사용해 8비트 패러렐로 PIC
(와)과 쌍방향 통신을 하는 방법을 설명합니다.


우선 PC측의 프린터 인터페이스의 상세한 것에 대하여는, 다른
핸드쉐이크의 프린터 인터페이스에 상세가 있으므로 그 쪽을
참조해 주세요.
여기서 주의가 필요한 (일)것은, STROBE와 BUSY의 논리 반전에 관한
일로,

  PC측은 STROBE는 정론리로 출력되어 BUSY는 부논리
  그리고 입력되지만, PIC측의 신호는 모두 정론리로 그대로
  입출력된다.

그렇다고 하는 것입니다.

따라서, 밑그림과 같이 PIC와 PC를 접속했을 때에는, 이 논리의
정부를 의식하고 생각하지 않으면 안됩니다.


【신호와 타이밍】

상기 접속에서의 신호의 타이밍은 밑그림과 같이 합니다.
PC로부터 데이터를 송신할 경우에는, 8비트 데이터를 우선 출력
하고 나서, STROBE 신호를 「1」으로 합니다.
그리고, PIC 측에서의 BUSY 신호(PIC의 STROBE 출력)를 기다려, BUSY
하지만 원래로 돌아오면(자) STOROBE도 「0」에 되돌려 완료해, 다음의 데이터로 옮겨
.




PC가 수신할 경우에는, PIC로부터의 BUSY 신호(PIC의 STROBE
출력)을 먼저 기다립니다.
그리고, BUSY를 받아들이면(자), STROBE를 「1」으로 하고 나서 데이터를 입력
해, 계속되어 STROBE를 「0」에 되돌립니다. 그리고 PIC 측에서의 BUSY가 바탕으로
돌아온 것을 확인해 완료입니다.


【PC측 프로그램】

PC측의 패러렐 입출력의 프로그램은 직접 입출력 명령을 실행
하기 위한(해), Visual C++를 사용해 Dynamic Link Library(DLL) 형식으로 합니다.
이 DLL 프로그램의 익는 방법의 자세한 것은, 「DLL 프로그램을 만드는 방법
의 페이지를 참조해 주세요.

프로그램은 상기 타임 차트를 그대로 플로우로 한 형태가 되어
있습니다.


/*************************************************
* Parallel Interface Drive Program.
* This Driver includes below function by Dynamic Link
* Library(DLL) Program.
* 1. RecvD  Input one Byte data by handshake protocol
* 2. SendD  Output one Byte data by handshake protocol
***************************************************/

#define DllExport _declspec(dllexport)    //DLL 선언
#define NOERR 0
#define BUSY -1

//Input Function by Handshake Protocol (RecvD)
DllExport short _stdcall RecvD(unsigned short port)
{unsigned databyte; unsigned state_busy;
  while(state_busy ! =0) {      //STROBE 대기
    state_busy = _inp(port+1) & 0x80;
  }
  
  _outp(port+2, 0x21);        //Busy 출력, 입력 모드
  databyte = _inp(port);      //데이터 입력(Dumy)
  databyte = _inp(port);      //데이터 입력
  _outp(port+2, 0);         //Busy 해제, 출력 모드
   
  while(state_busy ==0) {      //STROBE reset 대기
    state_busy = _inp(port+1) & 0x80;
  }
  return databyte;         //입력 데이터 반환
}


//Output Function by HandShake Protocol (SendD)
DllExport short _stdcall SendD(unsigned short port, unsigned short databyte)
{unsigned state_busy; unsigned i;
  for (i=0;i<1000;i++) {      //레이디 대기
    state_busy = _inp(port+1) & 0x80;
    if (state_busy ! = 0){
      break;
    }
  }
  if (state_busy == 0){       //타임 아웃 에러
    return(BUSY);
  }
  _outp(port, databyte);         //데이터 출력
  _outp(port+2, 1);            //스트로브 출력
  while(state_busy ! = 0) {        //Busy 대기
    state_busy = _inp(port+1) & 0x80;
  }
  while(state_busy ==0) {         //Busy 해제 대기
    state_busy = _inp(port+1) & 0x80;
  }
  _outp(port+2, 0);            //스트로브 해제
  return(NOERR);
}




【PIC측 프로그램】

이 PC와 접속해 통신하기 위한 PIC측의 프로그램도, 상기
의 플로차트(flow chart) 인 채의 흐름이 되고 있습니다.
송신과 수신에 알 수 있고 있습니다만, 기본적인 (일)것은, 모두 PC측이
주도권을 갖고 있다고 하는 것입니다.
즉, PC측으로부터, 커멘드를 수신하고 나서 밖에, PIC측으로부터는
데이터를 송신할 수가 없다고 하는 것입니다.

(1) 포토 초기화
  우선은 포토의 입출력의 설정입니다.

;**************************************
; 포토 초기화 부분
;  PORT A RA3 :STROBE output
;      RA4 :BUSY input
;  PORT B all input/output changable
;**************************************
INITA
    BSF   STATUS, RP0   ;Set Page 1
    MOVLW  017H      ;Set PortA to receive mode
    MOVWF  TRISA
    MOVLW  0FFH
    MOVWF  TRISB      ;Set Portb to all input
    BCF   STATUS, RP0   ;Set Page 0
  이후에의 처리에


(2) 수신 프로그램
  PC 측에서의 커멘드의 수신 부분에서, 이 커멘드를 수신
  하고 나서 다음의 처리로 옮겨, 송신할 수가 있습니다.


;********************************
; 수신 써브루틴 프로그램
; 데이터는 CMND에 격납되어 돌아온다
;********************************
RCVSUB
    BSF   STATUS, RP0   ;Set Page 1
    MOVLW  0FFH      ;get FF
    MOVWF  TRISB      ;Set Portb to all input
    BCF   STATUS, RP0   ;Set Page 0
    BCF   PORTA, 3     ;reset STROB
;***** BUSY 대기 ****
RCVLP
    BTFSC  PORTA, 4     ;RA4 BUSY input
    GOTO  RCVLP
    BTFSC  PORTA, 4     ;확인을 위해 재입력
    GOTO  RCVLP
    BSF   PORTA, 3     ;set STROB as BUSY on
    MOVF  PORTB, W     ;get command data
    MOVWF  CMND      ;COMMAND save
    NOP           ;펄스폭의 확보용
    NOP
    BCF   PORTA, 3     ;reset STROB as BUSY off
    RETURN


(3) 송신 프로그램
  1바이트의 데이터를 PC에 송신하기 위한 프로그램
  입니다.


;************************************
; 1바이트 송신 써브루틴 프로그램
; During send mode RA3=STORBE output
; and RA4=BUSY input, PORTB is output
;************************************
SNDSUB
    MOVWF  TEMP      ;save send data
    BSF   STATUS, RP0   ;Set Page 1
    CLRF  TRISB      ;Set PORTB to all output
    BCF   STATUS, RP0   ;Set Page 0
;**** check busy ******
CKBSY
    BTFSS  PORTA, 4     ;Test BUSY
    GOTO  CKBSY      ;busy case
;*** Send data ***
    MOVF  TEMP, W     ;get send data
    MOVWF  PORTB      ;data out
    NOP           ;delay
    BSF   PORTA, 3     ;set STROB
;**** wait PC input ****
WTBSY
    BTFSC  PORTA, 4     ;wait BUSY on
    GOTO  WTBSY

WTRDY
    BTFSS  PORTA, 4     ;wait BUSY off
    GOTO  WTRDY
    BCF   PORTA, 3     ;reset STROB
    RETURN

목록보기

www.1chip.com, www.1chip.co.kr
www.micom114.com
자료실바로가기

대구광역시 북구 산격2동 1629 산업용재관 10동 13호 (2층) / Tel. 053-604-2355 / Fax. 053-383-2354 / E-mail. maha@paran.com