학습    1

학습주제    1

예습내용    1

실습방법    1

        1

AVR PC 통신 (입출력제어)

학습목표

앞에서 학습한 내용을 입력과 출력을 종합하여 하나의 프로그램으로 만든다.

학습주제

아래 화면에서 스위치로 출력을 제어하고 입력의 상태를 화면에 표시한다.

통신 프로토콜

0x02(시작), B포트 상태, 0x03(통신 ) 차례로 3개의 문자를 보낸다. D포트 상태가 모두 Off 상태일 경는 0x00이고 이를 그대로 보내면 문장의 끝을 표시하는 ASII 코드와 혼동이 발생함으로 상의4개의 비트를 1 만든다. 이는 0xfo or (|) 연산을 하면 된다.

예습내용

 

실습방법

   

1. AVR 프로그램

 

 입력포트 D 상태가 변할 때만 PC 문자 메시지를 보낸다.

while (1)

      {

      // Place your code here

             inD = PIND;

                   inD |= 0xf0;

                   if(inD != ims) {

                          putchar(0x02);  // 송신 시작 표시

                          putchar(inD);   // D포트 상태 전송

                          putchar(0x03);  //송신 마침 표시

                   }

                   ims=inD;

                   delay_ms(1000);

      };

[AVR프로그램 보기]

2. PC 프로그램

송신되는 문자의 01 비트가 0인지 아닌지를 검사하여 화면의 LED 표시한다.

[소스 프로그램 내려받기]

처음

   

1. 앞에서 배운 프로그램을 종합하여 6개의 출력과 2개의 입력을 받을 있는 프로그램을 완성하시오.

[AVR프로그램 내려받기]

[PC 프로그램 내려받기]

2. Led 4개로 만들어 PC 프로그램을 완성하시오.

[PC 프로그램 내려받기]   [PC 셋업프로그램 내려받기]

3. 아래 그림과 같은 카운터를 만들고 마우스로 카운터를 누르면 값이 0으로 초기화 되도록 프로그램한다.

 

(1)   아래에 4개의 NumEdit 만든다. 그리고 ClassWizard에서 변수명을 m_nNo1, m_nNo2, m_nNo3, m_nNo4 지정한다.

   

    OnCommunication 함수에서 Led On 값이 1 증가되게 한다.

 

LONG CRs232Dlg::OnCommunication(UINT port, LONG lParam)

{

       char buff[2048]="";

       BYTE aByte;

 

       int size= (m_ComuPort.m_QueueRead).GetSize();

       for( int i=0; i< size; i++ )

       {

              (m_ComuPort.m_QueueRead).GetByte(&aByte);

              if( aByte!= NULL ) buff[i]= aByte;

              else { i--; size--; }

       }

 

       if(size > 0)

              m_Edit2.SetWindowText(buff);

 

       m_nIn0.Value = (int)CheckBit(buff[0],0);

       m_nIn1.Value = (int)CheckBit(buff[0],1);

       m_nIn2.Value = (int)CheckBit(buff[0],2);

       m_nIn3.Value = (int)CheckBit(buff[0],3);

 

       if(m_nIn0.Value==1)

              m_nNo1.Value += 1;

       if(m_nIn1.Value==1)

              m_nNo2.Value += 1;

       if(m_nIn2.Value==1)

              m_nNo3.Value += 1;

       if(m_nIn3.Value==1)

              m_nNo4.Value += 1;

 

       return 0;

}

 

 

 

아래 그림과 같이 NumEdit 박스를 마우스로 크릭하면 실행되는 함수를 만든다.

 

 

함수가 실행되면 값이 0으로 초기화 되게 한다.

 

 

 

void CRs232Dlg::OnClickCwnumedit1()

{

       // TODO: Add your control notification handler code here

       m_nNo1.Value = 0;

}

 

void CRs232Dlg::OnClickCwnumedit2()

{

       // TODO: Add your control notification handler code here

       m_nNo2.Value = 0;

}

 

void CRs232Dlg::OnClickCwnumedit3()

{

       // TODO: Add your control notification handler code here

       m_nNo3.Value = 0;

}

 

void CRs232Dlg::OnClickCwnumedit4()

{

       // TODO: Add your control notification handler code here

       m_nNo4.Value = 0;

}