[INTERFACE]/AVR_W5100_EVM2007. 12. 28. 01:34

[Mega128 EVM] TCP Test Program

사용자 삽입 이미지





Mega128 EVM의 이더넷 제어는 W5100를 이용하고 우선 간단히 테스트 하기 위해 속도는 좀 느리지만 SPI모드로 구동하여 테스트 해 보았다.

사용자 삽입 이미지















 

이더넷 제어 관련 파일은 ../mega128_evm/01_drv/wiznet 폴더에 있고 w5100.c, wiznet.c파일을 추가하면 된다.

사용자 삽입 이미지












네트웍 MAC, IP..등의 초기화 설정은 main에서 간단히 설정할 수 있다.

//-----------------------------------------------------------------------------
#define MY_NET_MAC   "\x00\x08\xDC\x00\x00\x00"  // MY Mac Address : 00.08.DC.00.00.00
#define MY_NET_SIP   0xC0A80003 // MY Source IP     : 192.168.0.3
#define MY_NET_GWIP   0xC0A80001 // MY Gateway IP    : 192.168.0.1
#define MY_CH_DESTIP  0xC0A80002 // MY Destination   : 192.168.0.2
      :

예제 소스코드

예제는 TCP Server로 구성하고 클라이언트로 부터 전송되는 데이들 받아서 그값에 따라 Mega128 EVM의 LED를 제어하도록 하였다. 자세한 설명은 추후에 계속....

void EthernetTest(unsigned char *pRcvBuffer, unsigned int len)

{

        unsigned int i;

        if(pRcvBuffer[0] == CMD_LED_OUT)

        {

                if(pRcvBuffer[1] & 1)Led1On();

                else Led1Off();

                if(pRcvBuffer[1] & 2)Led2On();

                else Led2Off();

        }

               

        DebugPrint("Read Data[%d]\r\n", len);

       

        for(i=0;i<len;i++)

        {

                //if(i%16==0)DebugPrint("\r\n");

                DebugPrint("%02X ", pRcvBuffer[i]);

        }

        DebugPrint("\r\nReceive OK!\r\n");

}

//TCP-Server 처리

void ProcessTcpSever(void)

{

        int len;                                                

        unsigned char data_buf[TX_RX_MAX_BUF_SIZE];

        uint16 port = MY_LISTEN_PORT;

       

        switch (getSn_SR(SOCK_TCPS))

        {

        case SOCK_ESTABLISHED:

                //check Rx data

                if((len = getSn_RX_RSR(SOCK_TCPS)) > 0)                 

                {

                        //if Rx data size is lager than TX_RX_MAX_BUF_SIZE

                        if (len > TX_RX_MAX_BUF_SIZE) len = TX_RX_MAX_BUF_SIZE;       

                        //read the received data

                        len = recv(SOCK_TCPS, data_buf, len);

                                               

                        EthernetTest(data_buf, len);

                }              

                break;

               

        case SOCK_CLOSE_WAIT:                                   

                //If the client request to close

                disconnect(SOCK_TCPS);

               

                m_SokStatus1 = 0;

                break;

               

        case SOCK_CLOSED:

                if(!m_SokStatus1)

                {

                        m_SokStatus1 = 1;

                        DebugPrint("Connect.");

                }

               

                //reinitialize the socket

                if(socket(SOCK_TCPS,Sn_MR_TCP, port,0x20) == 0)

                {

                        DebugPrint("Fail to create socket.");

                        m_SokStatus1 = 0;

                }

                else

                {

                        listen(SOCK_TCPS);

                }

               

                break;

        }

}

//-----------------------------------------------------------------------------



터미널 창의 제어 메세지

사용자 삽입 이미지














호스트 프로그램
호스트 프로그램은 VB를 이용하여 간단히 TCP클라언트로 구성하고 서버로 접속해서 LED를 제어하도록 작성하였다.

사용자 삽입 이미지


실행 동영상
호스트 측의 LED버튼을 클릭하여 EVM보드의 LED를 제어하고 있다.

Posted by nexp

댓글을 달아 주세요

[INTERFACE]/AVR_W5100_EVM2007. 12. 27. 20:14

[Mega128 EVM] Usb2Serail Test

[Mega128 EVM] Usb2Serail Test

사용자 삽입 이미지


ex03_serial.zip

 

CP2012 칩의 드라이버 파일은 아래 링크에서 최신파일을 받을 수 있다.

  CP210x_VCP_Win2K.exe

 http://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx



[Mega128 EVM]의 USB2Serial은 UART1에 연결되어 있고 [/mega128_evm/00_hal/config.h]파일에 시리얼 출력 관련 정의가 되어 있다.


//UART1을 사용하기 위해
#define _UART1_ENABLE
#define _HAL_MEGA128_UART
//#define _UART0_ENABLE

//-----------------------------------------------------------------------------
#if 0
#define U0_printf      printf
#define DebugPrint      U0_printf
#define DebugInit      U0_Init
#define DebugGetByte     U0_GetByte
#define DebugIsByte      U0_IsGetByte
#endif


#if 1
#define DebugPrint      printf
#define DebugInit      U1_Init
#define DebugGetByte     U1_GetByte
#define DebugIsByte      U1_IsGetByte
#endif
//-----------------------------------------------------------------------------


예제 소스

//-----------------------------------------------------------------------------<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><?xml:namespace prefix = o />

// Main Routine

//-----------------------------------------------------------------------------

int main(void)

{

             SystemInit();

             //Serial Init

             DebugInit(BAUD_115200);

             DebugPrint("Mega128 EVM Serial Test Program.\r\n");

             //Init LED

             Led1Init();

             while(1)

             {

                           if(DebugIsByte())

                           {

                                        switch(DebugGetByte())

                                        {

                                                     case '1':

                                                                  Led1On();

                                                                  DebugPrint("LED1 On\r\n");

                                                                  break;

                                                    

                                                     case '2':

                                                                  Led1Off();

                                                                  DebugPrint("LED1 Off\r\n");

                                                                  break;

                                        }

                           }

             }

}

//-----------------------------------------------------------------------------


Posted by nexp
TAG ATMEGA128, AVR

댓글을 달아 주세요

  1. 참고 : C#을 이용한 시리얼 포트 제어 - Mega128 LED제어( http://nexp.tistory.com/272 )

    2008.04.29 00:41 신고 [ ADDR : EDIT/ DEL : REPLY ]

[INTERFACE]/AVR_W5100_EVM2007. 12. 26. 21:10

[Mega128 EVM]스위치 제어

[Mega128 EVM]스위치 제어
사용자 삽입 이미지

환경 설정 및 드라이버 파일
참고




[Mega128 EVM]의 OnBoard Switch는 PD0/INT0에 연결되어 있어 간단한 스위치 On/Off테스를 할 수 있고 외부 인터럽트 테스트에도 사용될 수 있다.



#define SW1_BIT    BIT0
#define SW1_PORT   PORTD
#define Sw1Init()   Cbi(DDRD, SW1_BIT)
#define GetSw1()   !(PIND&SW1_BIT)
#define WaitForSw1()  while(GetSw1())

//-----------------------------------------------------------------------------<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

// Main Routine

//-----------------------------------------------------------------------------

int main(void)

{

             //Init System

             SystemInit();

             //Init LED

             Led1Init();

             Led1Off();

            

             //Switch Init

             Sw1Init();

             while(1)

             {

                           if(GetSw1())

                           {

                                        Led1On();

                                        Delay(200);

                           }

                           else

                           {

                                        Led1Off();

                           }

             }

}

//-----------------------------------------------------------------------------

Posted by nexp
TAG ATMEGA128, AVR

댓글을 달아 주세요

[INTERFACE]/WIZNET_EVM2007. 12. 11. 18:54

[W5100 EVM]Simple TCP-Client Example


[W5100 EVM]Simple TCP-Client 예제 - AVR128
사용자 삽입 이미지
[W5100 EVM]모듈을 이용하여 간단한 TCP-Client 예제를 작성해 보겠습니다.
 
 
코드구조
현제 예제는 AVR Studio(GCC)를 이용하여 작성되었지만 레이어를 두어 다른 CPU나 컴파이러에서도 쉽게 포팅 가능하도록 구성되어 있습니다.
전체 폴더 구조는
[00_hal] : 하드웨어 종속적인 데이터 파일
[01_drv] : 각종 드라이버 관련 파일
[ex0_..] : 사용자 Application
 
로 구성되어 있고 Wiznet칩 관련 드라이버는 [01_drv/wiznet/..]폴더에 있습니다.
사용자 삽입 이미지
 
 
 
 
버스모드 설정
W5100의 Access모드는 DIRECT_MODE, INDIRECT_MODE, SPI_MODE가 있고 자신의 하드웨어에 맞게 설정하면 됩니다.
DIRECT_MODE가 가장 속도는 빠르지만 Data-8, Address-14 Ctl-5 많은 제어핀이 필요하므로 하드웨어가 복잡해 집니다.
SPI_MODE는 속도는 느리지만 MOSI, MISO, SCLK, CS, INT의 5핀만으로 가능하므로 소형 마이컴에 적합 합니다.
INDIRECT_MODE는 Address핀을 사용하지 않아 핀을 좀더 줄인 모드로 동작할 수 있습니다. At91SAM7과 같이 포트가 적은 CPU는 이 방법을 쓰면 속도도 유지하면서 포트를 줄일 수 있는 방법입니다.
 
예제는 간단히 테스트 목적이므로 SPI방식으로 설정 했습니다.
 
[/01_drv/wiznet\mcu/types.h] 파일에서 버스모드를 설정할 수 있습니다.
 
//#define __DEF_IINCHIP_BUS__           __DEF_IINCHIP_DIRECT_MODE__
//#define __DEF_IINCHIP_BUS__           __DEF_IINCHIP_INDIRECT_MODE__

  #define __DEF_IINCHIP_BUS__            __DEF_IINCHIP_SPI_MODE__             //Enable SPI_mode
 
 
 
SPI방식 연결회로도
 
 /INT단자는 인터럽트 방식을 사용하지 않을때는 연결하지 않아도 됩니다. 간단히 폴링방식 테스트만 원한다면 인터럽트는 이용하지 않아도 되고 대부분의 예제는 폴링방식으로 가능합니다.
사용자 삽입 이미지
[ExpBoard]에서 AVR을 이용한 SPI방식으로 연결
 
사용자 삽입 이미지
 
 
 
 
DIRECT_MODE 연결 회로도
사용자 삽입 이미지
 
 
 
 
 
 
네트웍초기화
사용자 삽입 이미지
 
Source IP, Destiantion IP, Gateway ip등은 간단히 define으로 정의하여 자신의 네트웍 환경에 맞도록 설정해 줍니다.
 
 
클라이언트의 일은 접속되기를 수동적으로 기다는 서버와의 통신을 시작 하는 것이다.
TCP클라이언트가 수행하는 4가지 단계
1)socket()을 이사용하여 TCP소켓 생성
2)connect()함수를 이용하여 서버와의 연결을 설정
3)send(), recv()함수를 이용하여 데이터 송수신
3)close()함수로 연결 종료
 
 
메인 함수
프로그램 자체는 상당히 간단하게 작성 했습니다.
InitWiznet(), init_timer(), NetInit() 함수로 W5100을 초기화 하고
ProcessTcpClient()함수에서 이더넷을 수신되는 데이터를 감시 하다 데이터가 들어오면 recv()함수로 수신된 데이터 만큼 읽어올 수 있습니다.
len = recv(SOCK_MYTEST, data_buf, len);
 
데이터를 전송할 경우는 send()함수를 이용하여 데이터를 원하는 길이만큼 전송하면 됩니다.
send(SOCK_MYTEST, data_buf, len);
 
 
 
//-----------------------------------------------------------------------------
// Main Routine
//-----------------------------------------------------------------------------
int main(void)
{
   SystemInit();
 
   //Serial Init
   U0_Init(BAUD_115200);
   DebugPrint("Wiznet W5100 Test Program.\r\n");
 
   //W5100 Chip Initialize
   //----------------------------
   InitWiznet();
 
   NetInit();
   //----------------------------
 
   //Display Net Configuration
   GetNetConfig();
 
   while (1)
   {
      //TCP Client Process
      ProcessTcpClient();
   }  
}
//-----------------------------------------------------------------------------
 


실행결과

클라언트 모드로 동작하며 서버로 부터 데이터가 전송되면 시리얼 포트로 전송된 데이터를 출력하는 예제의 터미널 결과값 입니다.

사용자 삽입 이미지
Posted by nexp

댓글을 달아 주세요

[INTERFACE]/AVR_W5100_EVM2007. 11. 25. 20:40

[Mega128 EVM] LED Control - 개발환경 설정

[Mega128 EVM] LED Control


사용자 삽입 이미지



프로젝트 소스 :



프로젝트 파일 구조는 00_hal 하드웨어 의존 관련 파일, 01_drv의 하드웨어 독립의 Driver관련 파일,  ex01_led... application 파일 형태로 별도의 디렉토리가 구분된다.

mega128_evm.zip파일은 시스템 관련 파일로 00_hal, 01_drv로 구성이 되며 앞으로 드라이버 파일이 추가되거나  초기화 설정파일이 변경되면 추구 업데이트 되며... 모든 예제에 적용할 수 있도록 구성하였다.


프로젝트 환경은 AVR Strudio를 이용하였고, 하드웨어 시스템을 초기화하는 System.c를 반드시 포함해서 컴파일 해야 한다.

Serial을 사용한다면 Serial.c를 포함하면 된다.




[Mega128 EVM] 에는 보드 자체에 간단히 테스트 할 수 있는 LED가 PD6, PD7포트에 각각 연결되어 있다.
이 포트는 PWM기능이 있어 LED의 불 빛을 서서히 점등하는 등의 예제 테스트에도 사용될수 있다.

/00_hal/config.h 파일에 하드웨어 의존적인 LED제어 관련 포트를 설정하도록 되어 있다.

#define LED1_BIT   BIT6
#define LED1_PORT   PORTD
#define Led1Init()   Sbi(DDRD, LED1_BIT)
#define Led1On()   Cbi(LED1_PORT, LED1_BIT)
#define Led1Off()   Sbi(LED1_PORT, LED1_BIT)
#define Led1Toggle()  Tbi(LED1_PORT, LED1_BIT)

#define LED2_BIT   BIT7
#define LED2_PORT   PORTD
#define Led2Init()   Sbi(DDRD, LED2_BIT)
#define Led2On()   Cbi(LED2_PORT, LED2_BIT)
#define Led2Off()   Sbi(LED2_PORT, LED2_BIT)
#define Led2Toggle()  Tbi(LED2_PORT, LED2_BIT)



LED 회로도



소스코드
LED를 주기적으로 점등하는 예제로 가장 간단하게 구성해서 쉽게 테스트 해 보았다.

//-----------------------------------------------------------------------------

// Main Routine

//-----------------------------------------------------------------------------

int main(void)

{

        //Init System

        SystemInit();

        //Init LED

        Led1Init();

        Led2Init();

        Led2On();

        Led1Off();

        while(1)

        {

                Led1On();

                Led2Off();

                Delay(300);

                Led1Off();

                Led2On();

                Delay(300);

        }

}

//-----------------------------------------------------------------------------


실행 동영상

Posted by nexp

댓글을 달아 주세요