Busan IT/ARM Controller2015. 7. 20. 17:34

================================ Outline ====================================

ARM 데이터시트 및 소스파일 분석

----------------------------------------------------------------------------

 

보드(board)를 사용할 때 우선적으로 해야 할 것은 보드에 대한 제어권을 얻는 것이다. 데이터 시트와 driver, 컴파일러를 다운 받아 설치한다.(개발 환경을 만든다.)

 

압축을 푼 폴더를 열어 index.html을 실행시킨다.

프로젝트 부분에 가면 몇가지 예제들이 소스 코드와 함께 나와 있다.. 무료 컴파일러인 GNU소스를 참조하면 된다.

ATmega를 사용할 때 WinAVR에서 make파일과 컴파일러를 링크 파일을 사용하여 연결해준다.

 

//Booting은 프로그램을 시작하기 위한 작업을 한다. 이 때 Boot Code를 사용한다. Boot Code는 기계어 또는 Asseble어를 사용하여 만든다.

 

예제 소스코드가 있는 폴더를 열어보자.

elf32-littlearm.lds 코드를 열어본다.




 

// 헤더 파일에는 본문의 형식이 적혀 있다.

.text 영역에는 code가 적혀있다. ‘.rodata’는 읽기 전용 데이터로써 변수가 적혀있다. ‘.data’형식에는 전역 변수가 적혀있다.

 

PE format(Portable Executable)은 마이크로소프트의 윈도우 3.1부터 지원하는 실행 파일의 형식을 말한다.

SECTIONS

{

/*** 코드 영역 ***/

.text : {

_stext = .;

*(.text)

*(.rodata)

*(.rodata*)

. = ALIGN(4); //4byte 단위로 최적화

_etext = . ;

}

/*** 데이터 영역 ***/

.data : AT ( ADDR (.text) + SIZEOF (.text) ) {

//코드 영역과 데이터 영역이 붙어있다.

_sdata = .;

*(.vectors)

*(.data)

_edata = .;

}

 

/* collect all uninitialized .bss sections that go into FLASH */

.bss (NOLOAD) : {

. = ALIGN(4);

_sbss = .;

*(.bss)

_ebss = .;

}

}

end = .;

 

 

지역변수(stack영역)는 파일을 실행할 때(메모리에 올릴 때) 크기를 차지한다. 전역변수(data, bss, code영역)은 컴파일 시 할당된다.

 

 

BSS영역의 데이터(값이 ‘0’인 전역변수) code영역에서 크기가 얼마나 되는지 기입만 해놓는다. 때문에 따로 load할 필요가 없다.




code 영역이 늘어나는 경우는 코딩의 양이 많거나 상수를 많이 쓰는 경우이다. 때문에 중복되는 상수를 사용할 경우에는 포인터를 사용하여 해당 상수를 출력해 주어야 한다.

 

lowlevel.ccstartup.S가 사용하는 코드이다.(cstartup.S의 일부이다.)

 

makefile의 내용은 아래와 같다.

all: sram flash 에서 사용하는 code영역(-Ttext)의 메모리 주소를 기억해 두자.

 

 

CDMA는 미국의 Qualcomm사가 만들어서 한국에서 1996년에 최초로 상용화하였다. 이 때 사용한 칩이 ARM사의 MSM이다.

 

과거에는 CPUCDMA가 일체형으로 들어있었지만 현재는 CPUCDMA가 분리되어 있다.

 

include 폴더에 있는 AT91SAM7S256.h 헤더파일은 ARM사에서 제공하는 메모리 값이 정의된 파일이다. 이것을 사용하지 않고 직접 작성하여 사용하기로 한다. -_

 

ARM7TDMI

 

ICE: core를 외부에서 조작할 수 있다.

 

JTAG: 외부에서 연결가능, 프로그램 동작 중 정지 시킬 수 있다. visual studiodebug 기능과 유사하다.

 

//block diagram에서 굵은 화살표는 bus를 가리킨다.

 

 

ARM 폰 노이만 구조를 띈다.

 

internal flash메모리가 첫 번째 메모리의 주소를 가지고 있다.

//메모리 위치를 바꾸는 것을 전문 용어로 remap이라 한다.

 

실제로 조작 가능한 메모리는 internal memories3mb만 사용하고 그 중에서도 실제로 사용하는 메모리는 260kb에 불가하다.

 

flash는 코드 영역이고 sram은 시스템 영역이다. heap은 동작 중에 사용 된다.

 

Peripheral mapping GPIO를 말한다. Internal PeripheralsSYSCPIOA의 주소를 찾아서 조작하여야 한다.






 

20150720.hwp


반응형

'Busan IT > ARM Controller' 카테고리의 다른 글

Interrupt  (0) 2015.07.29
AT91SAM7S256 데이터 시트, LCD 코딩  (0) 2015.07.23
AT91SAM7S254회로도, LED불켜기  (0) 2015.07.21
ARM Compiler/Cygwin 설치  (0) 2015.07.17
AT91SAM7S256 데이터시트, 드라이버 설치  (0) 2015.07.16
Posted by newind2000
Busan IT/공장내 Network2015. 7. 17. 17:36

================================ Outline ====================================

TCP analyzer(진행 중)

----------------------------------------------------------------------------

Source port 부터 Acknowledgment number까지 tcphdr 구조체 포인터를 사용하여 출력해 보자.

 

TCP이외에 필요 없는 정보들을 제외하고 IP주소, Port 번호, Sequence 번호만 출력해보자.




/*** 소스 ***/

#include <stdio.h>
#include <pcap/pcap.h>
#include <net/ethernet.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>

void printIP(const void *vp);
void printEther(const void *vp);
void hexaview(const void *vp, unsigned int uilen);

int main(void)
{
  char *cpNICNAME;
  char caErrmsg[PCAP_ERRBUF_SIZE];
  pcap_t *stpDS;
  const unsigned char *ucpData;
  struct pcap_pkthdr stInfo;
  struct tcphdr * stTcp;


  cpNICNAME = pcap_lookupdev(caErrmsg);
  if0 == cpNICNAME )
  {
    printf("caErrmsg   : [%s] \n", caErrmsg);
    return 100;
  }
  printf("cpNICNAME   : [%s] \n", cpNICNAME);


  stpDS = pcap_open_live( cpNICNAME , 1500 , 1 , 0 , caErrmsg );

  while(1)
  {
    ucpData = pcap_next(stpDS, &stInfo);
    if(ETH_P_IP != ntohs(*((unsigned short *)(ucpData + 12)) ))
    {
      continue;

    }
    if(IPPROTO_TCP != *(ucpData + 23))
    {
      continue;
    }
    //printf("Packet Length  : %d\n",stInfo.len);

    //printEther(ucpData);

    if( ETH_P_IP == ntohs( *((short *)(ucpData + 12) ) )  )
    {
      printIP(ucpData + sizeof(struct ether_header));
    }

    if(*(ucpData+23== IPPROTO_TCP )
    {
      stTcp = (struct tcphdr*)(ucpData 
          + sizeof(struct ether_header) 
          + (*(ucpData + sizeof(struct ether_header)) & 0x0F ) * 4  );

      printf("Source Port  : %d\n", ntohs(stTcp->source));   
      printf("Dest Port  : %d\n", ntohs(stTcp->dest));   
      printf("Sequence  : %08X\n", ntohl(stTcp->seq));   
      printf("Ack. Sequence  : %08X\n", ntohl(stTcp->ack_seq));  






      printf("------------------------------------------------------\n");
    }


  }
  pcap_close(stpDS);
  return 0;
}

void printIP(const void *vp)
{
  const struct ip *v = vp;
  //printf("IP version  : %d \n", v->ip_v);
  //printf("Header Length  : %d byte \n", v->ip_hl * 4);
  //printf("Type of Service  : 0x%02X \n", v->ip_tos);
  //printf("Total Length  : %d byte \n", ntohs(v->ip_len));
  printf("Src IP     : %s \n", inet_ntoa(v->ip_src));
  printf("Dst IP     : %s \n", inet_ntoa(v->ip_dst));
  /*printf("Protocol   : ");

    switch(v->ip_p)
    {
    case IPPROTO_IP:
    printf("IDummy protocol for TCP");
    break;
    case IPPROTO_ICMP:
    printf("Internet Control Message Protocol");
    break;

    case IPPROTO_IGMP:
    printf("Internet Group Management Protocol");
    break;

    case IPPROTO_IPIP:
    printf("IPIP tunnels (older KA9Q tunnels use 94");
    break;

    case IPPROTO_TCP:
    printf("Transmission Control Protocol");
    break;

    case IPPROTO_EGP:
    printf("Exterior Gateway Protocol");
    break;

    case IPPROTO_PUP:
    printf("PUP protocol");
    break;

    case IPPROTO_UDP :
    printf("User Datagram Protocol");
    break;
    }
    putchar('\n');
   */

}

void printEther(const void *vp)
{
  int iCnt;

  printf("Dest MAC   : ");
  for(iCnt = 0; iCnt < ETH_ALEN; iCnt++)
  {
    printf("%02X", ((struct ether_header *)vp)->ether_dhost[iCnt]);
    printf(":");
  }
  printf("\b \n");

  printf("Src  MAC   : ");
  for(iCnt = 0; iCnt < ETH_ALEN; iCnt++)
  {
    printf("%02X", ((struct ether_header *)vp)->ether_shost[iCnt]);
    printf(":");
  }
  printf("\b \n");

  printf("Next Layer   : ");

  switch( ntohs( ((struct ether_header *)vp)->ether_type ))
  {
    case ETH_P_LOOP : 
      printf("Ethernet Loopback packet");
      break;
    case ETH_P_PUP : 
      printf("Xerox PUP packet");
      break;
    case ETH_P_PUPAT : 
      printf("Xerox PUP Addr Trans packet");
      break;
    case ETH_P_IP : 
      printf("Internet Protocol packet");
      break;
    case ETH_P_X25 : 
      printf("CCITT X.25");
      break;
    case ETH_P_ARP : 
      printf("Address Resolution packet");
      break;
    case ETH_P_BPQ : 
      printf("G8BPQ AX.25 Ethernet Packet  [ NOT AN OFFICIALLY REGISTERED ID ]");
      break;
    case ETH_P_IEEEPUP : 
      printf("Xerox IEEE802.3 PUP packet");
      break;
    case ETH_P_IEEEPUPAT : 
      printf("Xerox IEEE802.3 PUP Addr Trans packet");
      break;
    case ETH_P_DEC : 
      printf("DEC Assigned proto");
      break;
    case ETH_P_DNA_DL : 
      printf("DEC DNA Dum");
      break;
    case ETH_P_DNA_RC : 
      printf("DEC DNA Remote Console");
      break;
    case ETH_P_DNA_RT : 
      printf("DEC DNA Routing");
      break;
    case ETH_P_LAT : 
      printf("DEC LAT");
      break;
    case ETH_P_DIAG : 
      printf("DEC Diagnostics");
      break;
    case ETH_P_CUST : 
      printf("DEC Customer use");
      break;
    case ETH_P_SCA : 
      printf("DEC Systems Comms Arch");
      break;
    case ETH_P_TEB : 
      printf("Trans Ether Bridging");
      break;
    case ETH_P_RARP : 
      printf("Reverse Addr Res packet");
      break;
    case ETH_P_ATALK : 
      printf("Appletalk DDP");
      break;
    case ETH_P_AARP : 
      printf("Appletalk AARP");
      break;
    case ETH_P_8021Q : 
      printf("802.1Q VLAN Extended Header");
      break;
    case ETH_P_IPX : 
      printf("IPX over DIX");
      break;
    case ETH_P_IPV6 : 
      printf("IPv6 over bluebook");
      break;
    case ETH_P_PAUSE : 
      printf("IEEE Pause frames. See 802.3 31B");
      break;
    case ETH_P_SLOW : 
      printf("Slow Protocol. See 802.3ad 43B");
      break;
    case ETH_P_WCCP : 
      printf("Web-cache coordination protocol defined in draft-wilson-wrec-wccp-v2-00.txt");
      break;
    case ETH_P_PPP_DISC : 
      printf("PPPoE discovery messages");
      break;
    case ETH_P_PPP_SES : 
      printf("PPPoE session messages");
      break;
    case ETH_P_MPLS_UC : 
      printf("MPLS Unicast traffic");
      break;
    case ETH_P_MPLS_MC : 
      printf("MPLS Multicast traffic");
      break;
    case ETH_P_ATMMPOA : 
      printf("MultiProtocol Over ATM");
      break;
    case ETH_P_LINK_CTL : 
      printf("HPNA, wlan link local tunnel");
      break;
    case ETH_P_ATMFATE : 
      printf("Frame-based ATM Transport over Ethernet");
      break;
    case ETH_P_PAE : 
      printf("Port Access Entity (IEEE 802.1X)");
      break;
    case ETH_P_AOE : 
      printf("ATA over Ethernet");
      break;
    case ETH_P_8021AD : 
      printf("802.1ad Service VLAN");
      break;
    case ETH_P_TIPC : 
      printf("TIPC");
      break;
    case ETH_P_8021AH : 
      printf("802.1ah Backbone Service Tag");
      break;
    case ETH_P_1588 : 
      printf("IEEE 1588 Timesync");
      break;
    case ETH_P_FCOE : 
      printf("Fibre Channel over Ethernet");
      break;
    case ETH_P_TDLS : 
      printf("TDLS");
      break;
    case ETH_P_FIP : 
      printf("FCoE Initialization Protocol");
      break;
    case ETH_P_QINQ1 : 
      printf("deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ]");
      break;
    case ETH_P_QINQ2 : 
      printf("deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ]");
      break;
    case ETH_P_QINQ3 : 
      printf("deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ]");
      break;
    case ETH_P_EDSA : 
      printf("Ethertype DSA [ NOT AN OFFICIALLY REGISTERED ID ]");
      break;
    case ETH_P_AF_IUCV : 
      printf("IBM af_iucv [ NOT AN OFFICIALLY REGISTERED ID ]");
      break;
    case ETH_P_802_3 : 
      printf("Dummy type for 802.3 frames");
      break;
    case ETH_P_AX25 : 
      printf("Dummy protocol id for AX.25");
      break;
    case ETH_P_ALL : 
      printf("Every packet (be careful!!!)");
      break;
    case ETH_P_802_2 : 
      printf("802.2 frames");
      break;
    case ETH_P_SNAP : 
      printf("Internal only");
      break;
    case ETH_P_DDCMP : 
      printf("DEC DDCMP: Internal only");
      break;
    case ETH_P_WAN_PPP : 
      printf("Dummy type for WAN PPP frames");
      break;
    case ETH_P_PPP_MP : 
      printf("Dummy type for PPP MP frames");
      break;
    case ETH_P_LOCALTALK : 
      printf("Localtalk pseudo type");
      break;
    case ETH_P_CAN : 
      printf("Controller Area Network");
      break;
    case ETH_P_PPPTALK : 
      printf("Dummy type for Atalk over PPP");
      break;
    case ETH_P_TR_802_2 : 
      printf("802.2 frames");
      break;
    case ETH_P_MOBITEX : 
      printf("Mobitex (kaz@cafe.net)");
      break;
    case ETH_P_CONTROL : 
      printf("Card specific control frames");
      break;
    case ETH_P_IRDA : 
      printf("Linux-IrDA");
      break;
    case ETH_P_ECONET : 
      printf("Acorn Econet");
      break;
    case ETH_P_HDLC : 
      printf("HDLC frames");
      break;
    case ETH_P_ARCNET : 
      printf("1A for ArcNet :-)");
      break;
    case ETH_P_DSA : 
      printf("Distributed Switch Arch.");
      break;
    case ETH_P_TRAILER : 
      printf("Trailer switch tagging");
      break;
    case ETH_P_PHONET : 
      printf("Nokia Phonet frames");
      break;
    case ETH_P_IEEE802154 : 
      printf("IEEE802.15.4 frame");
      break;
    case ETH_P_CAIF : 
      printf("ST-Ericsson CAIF protocol");
      break;
  }
  putchar('\n');

}



 

 

반응형

'Busan IT > 공장내 Network' 카테고리의 다른 글

Three-way Handshake, fork 함수, execl 함수  (0) 2015.07.24
TCP analyzer  (0) 2015.07.22
TCP 추출(진행중)  (0) 2015.07.16
Echo Server/Client  (0) 2015.07.15
Echo Server, Echo Client(진행 중)  (0) 2015.07.14
Posted by newind2000
Busan IT/ARM Controller2015. 7. 17. 16:55

================================ Outline ====================================

ARM Compiler 설치

Cygwin 설치

----------------------------------------------------------------------------

 

ARM compiler 설치

 

http://www.doc.ironwoodlabs.com/gnuarm/gnuarm-distribution/web/www.gnuarm.com// 에 접속하여,

요놈을 다운 받는다. 다운 받은 후 별도의 조작 없이 설치한다.

 

 

도스를 실행 시켜서 아래와 같이 나와야 컴파일러가 정상적으로 설치된 것이다.

 

경로는 C:\Program Files\GNUARM 이다.

 

다운받은 소스파일이 있는 폴더에서 도스 명령어창을 실행하여 'make'를 입력한다.

make clean명령어를 입력하면 오류가 뜨는데 makefile을 띄워서 맨 아래 clean 부분을 다음과 같이 수정해 준다.

 

clean:

$(ERASE_FCT) *.o *.bin *.elf

 

Cygwin 설치


https://www.cygwin.com/ 에 접속하여 Windows에 맞는 setup파일을 다운로드 받아 설치한다. 리눅스 명령어를 윈도우 도스 창에서도 사용 가능하도록 만들어주는 프로그램이다.

 

별 다른 조작 없이 설치해주고 다운로드 받을 적당한 서버를 선택한 후 select packages 창이 뜨면 ‘Base’ 값을 Default에서 'Install'로 바꿔준다.




 

 

반응형
Posted by newind2000
Busan IT/모터제어2015. 7. 17. 12:38

================================ Outline ====================================

스테핑 모터

SE-SM243 사양

----------------------------------------------------------------------------

 

스테핑 모터(Stepping Motor)

 

서브모터와 함께 가장 많이 쓰이는 모터 중에 하나가 스테핑 모터이다.

수업은 스테핑 모터를 소프트웨어적으로 조절하는데 중점을 두겠다.




우리는 2(1.8)인 스테핑 모터를 사용할 것이다.

highlow가 한번씩 발생하는 것을 1pulse라 한다.

주파수와 스테핑 모터의 속도는 비례한다.

 

회전속도(pulse rate)torque값은 반비례한다.


사용할 스테핑 모터의 필요 암페어는 2A이다. 

 

 










우리가 사용할 스테핑 모터는 유니폴라 방식이다.





1상 여자방식은 하나의 상에만 전류를 흐르게 하는 방식이다. 2상 여자방식은 2개의 상에 전류를 흘러 회전자를 제어하는 방식이다. 전류가 인가 되었을 경우 상은 S로 바뀐다.










 

 

2014_shmotor.pdf


LK-SMC 메뉴얼.pdf


SE-SM243.pdf


스텝핑모터.ppt

반응형
Posted by newind2000
Busan IT/공장내 Network2015. 7. 16. 17:43

================================ Outline ====================================

TCP 추출(진행중)

----------------------------------------------------------------------------



 

Acknowledgement number에 집중한다.


/*** 소스 ***/


#include <stdio.h>
#include <pcap/pcap.h>
#include <net/ethernet.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>

void printIP(const void *vp);
void printEther(const void *vp);
void hexaview(const void *vp, unsigned int uilen);

int main(void)
{
  char *cpNICNAME;
  char caErrmsg[PCAP_ERRBUF_SIZE];
  pcap_t *stpDS;
  const unsigned char *ucpData;
  struct pcap_pkthdr stInfo;
  struct tcphdr * stTcp;


  cpNICNAME = pcap_lookupdev(caErrmsg);
  if0 == cpNICNAME )
  {
    printf("caErrmsg   : [%s] \n", caErrmsg);
    return 100;
  }
  printf("cpNICNAME   : [%s] \n", cpNICNAME);


  stpDS = pcap_open_live( cpNICNAME , 1500 , 1 , 0 , caErrmsg );

  while(1)
  {
    ucpData = pcap_next(stpDS, &stInfo);
    printf("Packet Length  : %d\n",stInfo.len);

    printEther(ucpData);

    if( ETH_P_IP == ntohs( *((short *)(ucpData + 12) ) )  )
    {
      printIP(ucpData + sizeof(struct ether_header));
    }

    if(*(ucpData+23== IPPROTO_TCP )
    {
      stTcp = (struct tcphdr*)(ucpData 
          + sizeof(struct ether_header) 
          + (*(ucpData + sizeof(struct ether_header)) & 0x0F ) * 4  );

      printf("Source Port  : %d\n", ntohs(stTcp->source));   //source
    }

  }
  pcap_close(stpDS);
  return 0;
}

void printIP(const void *vp)
{
  const struct ip *v = vp;
  printf("IP version  : %d \n", v->ip_v);
  printf("Header Length  : %d byte \n", v->ip_hl * 4);
  printf("Type of Service  : 0x%02X \n", v->ip_tos);
  printf("Total Length  : %d byte \n", ntohs(v->ip_len));
  printf("Src IP     : %s \n", inet_ntoa(v->ip_src));
  printf("Dst IP     : %s \n", inet_ntoa(v->ip_dst));
  printf("Protocol   : ");

  switch(v->ip_p)
  {
    case IPPROTO_IP:
      printf("IDummy protocol for TCP");
      break;
      /*
         case IPPROTO_HOPOPTS:
         printf("IPv6 Hop-by-Hop options");
         break;
       */

    case IPPROTO_ICMP:
      printf("Internet Control Message Protocol");
      break;

    case IPPROTO_IGMP:
      printf("Internet Group Management Protocol");
      break;

    case IPPROTO_IPIP:
      printf("IPIP tunnels (older KA9Q tunnels use 94");
      break;

    case IPPROTO_TCP:
      printf("Transmission Control Protocol");
      break;

    case IPPROTO_EGP:
      printf("Exterior Gateway Protocol");
      break;

    case IPPROTO_PUP:
      printf("PUP protocol");
      break;

    case IPPROTO_UDP :
      printf("User Datagram Protocol");
      break;
  }
  putchar('\n');
}

void printEther(const void *vp)
{
  int iCnt;

  printf("Dest MAC   : ");
  for(iCnt = 0; iCnt < ETH_ALEN; iCnt++)
  {
    printf("%02X", ((struct ether_header *)vp)->ether_dhost[iCnt]);
    printf(":");
  }
  printf("\b \n");

  printf("Src  MAC   : ");
  for(iCnt = 0; iCnt < ETH_ALEN; iCnt++)
  {
    printf("%02X", ((struct ether_header *)vp)->ether_shost[iCnt]);
    printf(":");
  }
  printf("\b \n");

  printf("Next Layer   : ");

  switch( ntohs( ((struct ether_header *)vp)->ether_type ))
  {
    case ETH_P_LOOP : 
      printf("Ethernet Loopback packet");
      break;
    case ETH_P_PUP : 
      printf("Xerox PUP packet");
      break;
    case ETH_P_PUPAT : 
      printf("Xerox PUP Addr Trans packet");
      break;
    case ETH_P_IP : 
      printf("Internet Protocol packet");
      break;
    case ETH_P_X25 : 
      printf("CCITT X.25");
      break;
    case ETH_P_ARP : 
      printf("Address Resolution packet");
      break;
    case ETH_P_BPQ : 
      printf("G8BPQ AX.25 Ethernet Packet  [ NOT AN OFFICIALLY REGISTERED ID ]");
      break;
    case ETH_P_IEEEPUP : 
      printf("Xerox IEEE802.3 PUP packet");
      break;
    case ETH_P_IEEEPUPAT : 
      printf("Xerox IEEE802.3 PUP Addr Trans packet");
      break;
    case ETH_P_DEC : 
      printf("DEC Assigned proto");
      break;
    case ETH_P_DNA_DL : 
      printf("DEC DNA Dum");
      break;
    case ETH_P_DNA_RC : 
      printf("DEC DNA Remote Console");
      break;
    case ETH_P_DNA_RT : 
      printf("DEC DNA Routing");
      break;
    case ETH_P_LAT : 
      printf("DEC LAT");
      break;
    case ETH_P_DIAG : 
      printf("DEC Diagnostics");
      break;
    case ETH_P_CUST : 
      printf("DEC Customer use");
      break;
    case ETH_P_SCA : 
      printf("DEC Systems Comms Arch");
      break;
    case ETH_P_TEB : 
      printf("Trans Ether Bridging");
      break;
    case ETH_P_RARP : 
      printf("Reverse Addr Res packet");
      break;
    case ETH_P_ATALK : 
      printf("Appletalk DDP");
      break;
    case ETH_P_AARP : 
      printf("Appletalk AARP");
      break;
    case ETH_P_8021Q : 
      printf("802.1Q VLAN Extended Header");
      break;
    case ETH_P_IPX : 
      printf("IPX over DIX");
      break;
    case ETH_P_IPV6 : 
      printf("IPv6 over bluebook");
      break;
    case ETH_P_PAUSE : 
      printf("IEEE Pause frames. See 802.3 31B");
      break;
    case ETH_P_SLOW : 
      printf("Slow Protocol. See 802.3ad 43B");
      break;
    case ETH_P_WCCP : 
      printf("Web-cache coordination protocol defined in draft-wilson-wrec-wccp-v2-00.txt");
      break;
    case ETH_P_PPP_DISC : 
      printf("PPPoE discovery messages");
      break;
    case ETH_P_PPP_SES : 
      printf("PPPoE session messages");
      break;
    case ETH_P_MPLS_UC : 
      printf("MPLS Unicast traffic");
      break;
    case ETH_P_MPLS_MC : 
      printf("MPLS Multicast traffic");
      break;
    case ETH_P_ATMMPOA : 
      printf("MultiProtocol Over ATM");
      break;
    case ETH_P_LINK_CTL : 
      printf("HPNA, wlan link local tunnel");
      break;
    case ETH_P_ATMFATE : 
      printf("Frame-based ATM Transport over Ethernet");
      break;
    case ETH_P_PAE : 
      printf("Port Access Entity (IEEE 802.1X)");
      break;
    case ETH_P_AOE : 
      printf("ATA over Ethernet");
      break;
    case ETH_P_8021AD : 
      printf("802.1ad Service VLAN");
      break;
    case ETH_P_TIPC : 
      printf("TIPC");
      break;
    case ETH_P_8021AH : 
      printf("802.1ah Backbone Service Tag");
      break;
    case ETH_P_1588 : 
      printf("IEEE 1588 Timesync");
      break;
    case ETH_P_FCOE : 
      printf("Fibre Channel over Ethernet");
      break;
    case ETH_P_TDLS : 
      printf("TDLS");
      break;
    case ETH_P_FIP : 
      printf("FCoE Initialization Protocol");
      break;
    case ETH_P_QINQ1 : 
      printf("deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ]");
      break;
    case ETH_P_QINQ2 : 
      printf("deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ]");
      break;
    case ETH_P_QINQ3 : 
      printf("deprecated QinQ VLAN [ NOT AN OFFICIALLY REGISTERED ID ]");
      break;
    case ETH_P_EDSA : 
      printf("Ethertype DSA [ NOT AN OFFICIALLY REGISTERED ID ]");
      break;
    case ETH_P_AF_IUCV : 
      printf("IBM af_iucv [ NOT AN OFFICIALLY REGISTERED ID ]");
      break;
    case ETH_P_802_3 : 
      printf("Dummy type for 802.3 frames");
      break;
    case ETH_P_AX25 : 
      printf("Dummy protocol id for AX.25");
      break;
    case ETH_P_ALL : 
      printf("Every packet (be careful!!!)");
      break;
    case ETH_P_802_2 : 
      printf("802.2 frames");
      break;
    case ETH_P_SNAP : 
      printf("Internal only");
      break;
    case ETH_P_DDCMP : 
      printf("DEC DDCMP: Internal only");
      break;
    case ETH_P_WAN_PPP : 
      printf("Dummy type for WAN PPP frames");
      break;
    case ETH_P_PPP_MP : 
      printf("Dummy type for PPP MP frames");
      break;
    case ETH_P_LOCALTALK : 
      printf("Localtalk pseudo type");
      break;
    case ETH_P_CAN : 
      printf("Controller Area Network");
      break;
    case ETH_P_PPPTALK : 
      printf("Dummy type for Atalk over PPP");
      break;
    case ETH_P_TR_802_2 : 
      printf("802.2 frames");
      break;
    case ETH_P_MOBITEX : 
      printf("Mobitex (kaz@cafe.net)");
      break;
    case ETH_P_CONTROL : 
      printf("Card specific control frames");
      break;
    case ETH_P_IRDA : 
      printf("Linux-IrDA");
      break;
    case ETH_P_ECONET : 
      printf("Acorn Econet");
      break;
    case ETH_P_HDLC : 
      printf("HDLC frames");
      break;
    case ETH_P_ARCNET : 
      printf("1A for ArcNet :-)");
      break;
    case ETH_P_DSA : 
      printf("Distributed Switch Arch.");
      break;
    case ETH_P_TRAILER : 
      printf("Trailer switch tagging");
      break;
    case ETH_P_PHONET : 
      printf("Nokia Phonet frames");
      break;
    case ETH_P_IEEE802154 : 
      printf("IEEE802.15.4 frame");
      break;
    case ETH_P_CAIF : 
      printf("ST-Ericsson CAIF protocol");
      break;
  }
  putchar('\n');

}



 

 

 

 

반응형

'Busan IT > 공장내 Network' 카테고리의 다른 글

TCP analyzer  (0) 2015.07.22
TCP analyzer(진행 중)  (0) 2015.07.17
Echo Server/Client  (0) 2015.07.15
Echo Server, Echo Client(진행 중)  (0) 2015.07.14
Server/Client socket 프로그램 만들기  (0) 2015.07.13
Posted by newind2000
Busan IT/ARM Controller2015. 7. 16. 17:40

================================ Outline ====================================

AT91SAM7S256 데이터시트

AT91SAM7S265 드라이버 설치

----------------------------------------------------------------------------

 

AT91SAM7S256 데이터시트

 

http://atmega.com/ 에 접속한다.

 

Product -> Smart ARM-based MCUs 선택

 

사용할 MCU의 정식 명칭은 AT91SAM7S64이다.

 

Full versionDatasheet를 받아서 내용을 살펴보자.

 

High-density 16bit instruction Set: 32bit지만 16bit를 사용할 경우 메모리를 절약하기 위해서 16bit체제로 명령을 처리한다.

 

PLL = 주파수 체배기

 

PIOA: 핀의 개수가 포트 당 32개가 할당되는데 해당 MCU는 단일 포트임으로 PIO'A'만 사용한다.

 

SAM-BABoot Assistant : Rom내부에 Samba프로그램이 내장되어 있다. TST키를 활용(ON)하여 Rom에 있던 Samba프로그램을 flash memory에 옮길 수 있다. 이 후 전원을 끄고 다시 켜면 flash memory에 있던 삼바 프로그램이 구동되면서 samba프로그램은 SD memory에서 실행되고 flash memory에 사용자가 만든 프로그램이 자리잡게 된다.

 

TST switch가 삼바를 flash memory에 복사하는 장치이다. 복사하는데 걸리는 시간은 10초 정도가 소요된다. 10초 후에 TST를 내린 후 다시 구동하면 flash에 저장된 프로그램이 실행된다.

 

 

 

 

 

 

 

/*** abbreviation ***/

 

MC = Memory Controller

RSTC = Reset Controller

Clock Generator (CKGR)

Clock Generator (CKGR)

Debug Unit (DBGU)

Periodic Interval Timer (PIT)

Windowed Watchdog (WDT)

Real-time Timer (RTT)

One Parallel Input/Output Controller (PIOA) == GPIO

One Synchronous Serial Controller (SSC)

One Master/Slave Serial Peripheral Interface (SPI)

One Two-wire Interface (TWI)

 

 

AT91SAM7S265 드라이버 설치

 

http://www.atmel.com/tools/SAM7S-EK.aspx 에서 아래의 파일을 받는다.

해당 파일을 실행 시켜 무난하게 다음 혹은 설치 버튼을 눌러 파일을 설치한다.

 

MCUusb를 연결하여 컴퓨터와 연결한다.

 

아래의 드라이버가 깔려야 정상이다.

** 윈도우에서 자동으로 설치한 드라이버가 잘못된 경우 이를 완전히 지우기 위해서는 window safe mode로 부팅해서 지워야 한다.

 

삼바 프로그램을 실행시킨다.

 

아래의 목록을 클릭하고 연결한다.

 



반응형

'Busan IT > ARM Controller' 카테고리의 다른 글

Interrupt  (0) 2015.07.29
AT91SAM7S256 데이터 시트, LCD 코딩  (0) 2015.07.23
AT91SAM7S254회로도, LED불켜기  (0) 2015.07.21
ARM 데이터시트 및 소스파일 분석  (0) 2015.07.20
ARM Compiler/Cygwin 설치  (0) 2015.07.17
Posted by newind2000
Busan IT/공장내 Network2015. 7. 15. 16:16

================================ Outline ====================================

Echo Server

Echo Client

makefile

----------------------------------------------------------------------------


Echo Server

/*** 소스 ***/

#include "smartsock.h"

int main(void)
{
    int iSock;   //소켓 함수의 반환 값을 받는 변수
  int icSock;   //accept의 반환 값을 받는 변수
    int iRet;
    struct sockaddr_in stAddr;
  socklen_t uiSockLen=sizeof(struct sockaddr);
  char cBuff[Buf_Size];
  const char * cP;

    iSock = socket(AF_INET, SOCK_STREAM, 0);    //AF_INET = 2, 
    if(0 > iSock)
    {
        perror("socket : ");
        return -1;
    }
    // stAddr구조체에 socket연결을 위한 필수 정보 입력  setting
    bzero(&stAddr, sizeof(stAddr));            //구조체 비우기(0으로 채우기)
    stAddr.sin_family = AF_INET;               //#define AF_INET 2 /* IP protocol family. */
    stAddr.sin_addr.s_addr = inet_addr(IP);    //IP와 PORT값은 헤더파일에 정의되어 있다.
    stAddr.sin_port = htons((PORT));

    iRet = bind(iSock, (struct sockaddr *)&stAddr,sizeof(stAddr));
    if(iRet < 0)
    {
        perror("bind : ");
        close(iSock);

        return -2;
    }
  iRet = listen(iSock, 5);
  if(iRet != 0)
  {
        perror("listen : ");
        close(iSock);

        return -3;
  }

  icSock = accept(iSock, (struct sockaddr *)&stAddr, &uiSockLen); //접속자의 정보가 stAddr에 입력된다.

  if(icSock < 0)
  {
        perror("Accept : ");
        close(iSock);

        return -4;
  }

  close(iSock);

  printf("Incoming Client \n");
  //cP = inet_ntoa(stAddr.sin_addr);
  printf("Client IP :%s\n", inet_ntoa(stAddr.sin_addr));
  printf("Client Port : %d\n", ntohs(stAddr.sin_port));  

  write(icSock, "Welcome :)"sizeof("Welcome :)"));

  while(1)
  {
    read(icSock, cBuff, MSG_Size);
    printf("[client]: [%s]\n", cBuff);

    write(icSock, cBuff, MSG_Size);
    if(0 == strncmp(MSG_END, cBuff, strlen(MSG_END) ) )
      break;
    
  }
  close(icSock);
    return 0;
}


Echo Client

/*** 소스 ***/


#include "smartsock.h"

int main(void)
{
  struct sockaddr_in stAddr;
  int iSock;
  int iRet;
  char cBuff[Buf_Size];
  socklen_t uiSockLen=sizeof(struct sockaddr);

  iSock = socket(AF_INET, SOCK_STREAM, 0);
  if(0 > iSock)
  {
    perror("socket : ");
    return -1;
  }

  bzero(&stAddr, sizeof(stAddr));
  stAddr.sin_family = AF_INET;
  stAddr.sin_addr.s_addr = inet_addr(IP);
  stAddr.sin_port = htons((PORT));

  iRet = connect(iSock, (struct sockaddr *)&stAddr, uiSockLen);
  if(0 > iRet)
  {
    perror("connect : ");
    return -2;
  }

  read(iSock, cBuff, MSG_Size); 
  printf("[server]: [%s]\n", cBuff);
  
  while(1)
  {

    iRet = read(0, cBuff, MSG_Size);
    cBuff[iRet-1= 0;
    write(iSock, cBuff, MSG_Size);
    read(iSock, cBuff, MSG_Size);
    printf("[server]: [%s]\n", cBuff);

    if(0 == strncmp(MSG_END, cBuff, strlen(MSG_END)))
      break;
  }
  close(iSock);
  return 0;
}


smartsock.h


/*** 소스 ***/

#ifndef __SMARTSOCK_H__
#define __SMARTSOCK_H__
#include <stdio.h>
#include <sys/types.h>          
#include <sys/socket.h>
#include <sys/stat.h>
#include <unistd.h>             //read&write 함수
#include <netinet/in.h>         
#include <arpa/inet.h>          
#include <stdlib.h>
#include <string.h>             
#include <errno.h>              //error 출력
#include <strings.h>            //bzero 함수

#define PORT 7777
#define IP "192.168.0.173"
#define MSG_Size 255      //버퍼 사이즈 정의
#define Buf_Size (MSG_Size+1

#define MSG_END "quit"

#endif // __SMARTSOCK_H__


makefile


/*** 소스 ***/


CC = gcc

CTRG = client

STRG = server

SSRC = server.c

CSRC = client.c

CFLAGS = --save-temps

all: ser cli

rebuild: clean all

ser:
  @$(CC) $(CFLAGS) -o $(STRG) $(SSRC)

cli:
  @$(CC) $(CFLAGS) -o $(CTRG) $(CSRC)

clean:
  @rm -rf $(STRG) $(STRG).o $(STRG).i $(STRG).s
  @rm -rf $(CTRG) $(CTRG).o $(CTRG).i $(CTRG).s

  
  



Packet Analyzer를 만들어보자.

netinet/in.h에 있는 파일을 들어가서 0번부터 17번까지 스위치문으로 정의해보자.




반응형

'Busan IT > 공장내 Network' 카테고리의 다른 글

TCP analyzer(진행 중)  (0) 2015.07.17
TCP 추출(진행중)  (0) 2015.07.16
Echo Server, Echo Client(진행 중)  (0) 2015.07.14
Server/Client socket 프로그램 만들기  (0) 2015.07.13
소켓 연결  (0) 2015.07.07
Posted by newind2000
Busan IT/모터제어2015. 7. 15. 13:49

================================ Outline ====================================

아날로그 비교기/ADC를 활용한 자동문 코딩

----------------------------------------------------------------------------

 

아날로그 비교기를 사용하여 모터가 작동하도록 코드를 작성해 보자.

 

우선 아날로그가 비교기가 무엇인지 알아보자.

 



 

아날로그 입력기는 + 입력 전압과 - 입력 전압의 값을 비교하여 ACO로 출력하는 장치이다.

 

//AIN0 - 양극성 입력, AIN1 - 음극성 입력

 

아날로그 비교기 레지스터에 대한 설명은 http://newind2000.tistory.com/140 에서 참고하자.


// 코드


#include <avr/io.h>
#include <util/delay.h>

void USART0_init()
{
  /* BAUD Rate Set */
  UBRR0 = 0x00;

  /* USART Set */
  UCSR0A = 0b00000000;    //일반모드 
  UCSR0B = 0b00001000;    //인터럽트 사용 안함
  UCSR0C = 0b00000110;
}

void USART0_disable()
{  
  /* USART Set */
  UCSR0A = 0;   
  UCSR0B = 0;    
  UCSR0C = 0;
}


void USART1_init()
{
  /* BAUD Rate Set */
  UBRR1 = 0x67;

  /* USART Set */
  UCSR1A = 0b00000000;    //일반모드 
  UCSR1B = 0b00001000;    //인터럽트 사용 안함
  UCSR1C = 0b00000110;

}

void Data_Tx0( unsigned char data )
{
  /* Wait for empty transmit buffer */
  while ( !( UCSR0A & (1<<UDRE0)) );
  
  /* Put data into buffer, sends the data */
  UDR0 = data;    
}

unsigned char Data_Rx0()
{
  // Wait for data to be received
  while ( 0==(UCSR0A & (1<<RXC0)) );  //datasheet p/184
  
  // Get and return received data from buffer 
  
  return UDR0;
}
void Data_Tx1( unsigned char data )
{
  /* Wait for empty transmit buffer */
  while ( !( UCSR1A & (1<<UDRE1)) );
  
  /* Put data into buffer, sends the data */
  UDR1 = data;    
}

unsigned char Data_Rx1()
{
  // Wait for data to be received
  while ( 0==(UCSR1A & (1<<RXC1)) );  //datasheet p/184
  
  // Get and return received data from buffer 
  
  return UDR1;
}

void PacketTX_P1(unsigned char ID, unsigned char Length, unsigned char Instruction, unsigned char cmd, unsigned char para1)
{
    Data_Tx0(0xFF);  //ini
    Data_Tx0(0xFF);  //ini
    Data_Tx0(ID);  //ID
    Data_Tx0(Length);  //LENGTH = 2+ # of parameter
    Data_Tx0(Instruction);  //Instruction 
    Data_Tx0(cmd);  //command in control table
    Data_Tx0(para1);  //goal position(rear byte)
  
    Data_Tx0((unsigned char)(~(ID + Length + Instruction + cmd + para1)));
    _delay_ms(865);
}

void PacketTX_P2(unsigned char ID, unsigned char Length, unsigned char Instruction, unsigned char cmd, unsigned char para1, unsigned char para2)
{
    Data_Tx0(0xFF);  //ini
    Data_Tx0(0xFF);  //ini
    Data_Tx0(ID);  //ID
    Data_Tx0(Length);  //LENGTH = 2+ # of parameter
    Data_Tx0(Instruction);  //Instruction 
    Data_Tx0(cmd);  //command in control table
    Data_Tx0(para1);  //goal position(rear byte)
    Data_Tx0(para2);  //goal position(head byte)
  
    Data_Tx0((unsigned char)(~(ID + Length + Instruction + cmd + para1 + para2)));
    _delay_ms(865);
}

void Motor_Rotate(unsigned char ID, unsigned int ucAngle)
{
    unsigned char para1;
    unsigned char para2;
    ucAngle = 3.41 * ucAngle;
    para1 = (unsigned char)(ucAngle & 0b11111111);
    para2 = (unsigned char)(ucAngle >> 8);

  
    Data_Tx0(0xFF);  //ini
    Data_Tx0(0xFF);  //ini
    Data_Tx0(ID);  //ID
    Data_Tx0(0x05);  //LENGTH = 2+ # of parameter
    Data_Tx0(0x03);  //WRITE_DATA 
    Data_Tx0(0x1E);  //Goal Position
    Data_Tx0(para1);//goal position(rear byte)
    Data_Tx0(para2);//goal position(head byte)
  
    Data_Tx0((unsigned char)(~(ID + 0x05 + 0x03 + 0x1E + para1 + para2)));    
}

void Baud9600()
{
  //AX-10_ Baud Rate 9600으로 변경 
  PacketTX_P1(0x0C, 0x040x030x040xCF);   
   
  //ATmega2560 Baud Rate 9600으로 변경    
  USART0_disable();
  UBRR0 = 0x67;
                /* USART Set */
  UCSR0A = 0b00000000;    //일반모드 
  UCSR0B = 0b00001000;    //인터럽트 사용 안함
  UCSR0C = 0b00000110;
  _delay_ms(1000);  
}

void ADC_init(void)
{
  ADCSRA = 0b11100000// 7:컨버터 허용, 6:A/D변환 시작 0~2:분주비
  ADCSRA = 0b00000000// 
  ADMUX  = 0b01000000;  
}

void ADCompare_init(void)
{
  ACSR   = 0b00000000;
  ADCSRB   = 0b00000000;
}

int main(void)
{
  DDRA =     0xFF; //PORTA 출력 설정

  /* Analog 비교기  레지스터 설정 */
    ACSR =     0x43// +입력 = 1.1v
    ADCSRA =   0x00// ADEN =0
    ADCSRB =   0x40// ACME =1
    ADMUX =   0x01// -입력 = ADC1

  _delay_ms(1000);
  USART0_init();
  
  Baud9600();      //Baud Rate 9600으로 변경

  PacketTX_P2(0x0C, 0x050x030x200xCF, 0x01); //회전 속도 조절 -> 0x0A0
    
  ADC_init();

  while(1)
  {
    // 자동문, 문이 열리고 5초 대기 후 신호가 없으면 닫힌다.
    if(ADC > 0x01FF) //전압이 2.5v이상이면 문을 연다.
    {
      Motor_Rotate(0x0C,300);
      _delay_ms(5000);
    }
    else
    {
      Motor_Rotate(0x0C,0);
      _delay_ms(1000);
    }
  }
  /*
  ADCompare_init();
  while(1)
  {
    if((ACSR & 20) >> AC0)
    {    {
      Motor_Rotate(0x0C,300);
      _delay_ms(5000);
    }


    else if(!((ACSR & 20) >> AC0))
    {
      Motor_Rotate(0x0C,0);
      _delay_ms(1000);
    }
  }
  */


  return 0;
}


반응형
Posted by newind2000
Busan IT/공장내 Network2015. 7. 14. 17:36

================================ Outline ====================================

Echo Server

Echo Client(진행 중)

----------------------------------------------------------------------------

Echo Server

 

listen 함수 인자에 소켓 번호와 backlog(동시 접속자 대기수)를 지정해 준다.

 

 

accept 함수 인자에 소켓 번호와 사용자의 접속 정보를 담을 구조체, 그리고 그 구조체의 크기를 넣어준다.

 

accept함수는 scanf처럼 입력 값이 있을 때까지 프로그램의 흐름을 멈추게 한다.

 

accept함수까지 완성한 후에 실행시켜보자. accept함수를 통과했는지 확인하기 위해 printf를 사용하여 'Incoming Client'라는 문자열을 넣어주자.

 

프로그램을 실행 시킨 후 도스 커맨트 창을 띄워서 'telnet_IP_PORT#'를 넣어주면 프로그램이 accept함수를 수행하고 다음 단계로 넘어갔음을 알 수 있다.

client가 접속하여 accept가 되면 접속한 client의 IP와 PORT번호를 출력하고 입력하는 값이 그대로 다시 전송되게 하는 echo server를 만들어보자.

/*** 소스 ***/

#include "smartsock.h"

int main(void)
{
    int iSock;   //소켓 함수의 반환 값을 받는 변수
  int icSock;   //accept의 반환 값을 받는 변수
    int iRet;
    struct sockaddr_in stAddr;
  socklen_t uiSockLen=sizeof(struct sockaddr);
  unsigned char ucBuff;
  const char * cP;

    iSock = socket(AF_INET, SOCK_STREAM, 0);    //AF_INET = 2, 
    if(0 > iSock)
    {
        perror("socket : ");
        return -1;
    }
    // stAddr구조체에 socket연결을 위한 필수 정보 입력  setting
    bzero(&stAddr, sizeof(stAddr));            //구조체 비우기(0으로 채우기)
    stAddr.sin_family = AF_INET;               //#define AF_INET 2 /* IP protocol family. */
    stAddr.sin_addr.s_addr = inet_addr(IP);    //IP와 PORT값은 헤더파일에 정의되어 있다.
    stAddr.sin_port = htons((PORT));

    iRet = bind(iSock, (struct sockaddr *)&stAddr,sizeof(stAddr));
    if(iRet < 0)
    {
        perror("bind : ");
        close(iSock);

        return -2;
    }
  iRet = listen(iSock, 5);
  if(iRet != 0)
  {
        perror("listen : ");
        close(iSock);

        return -3;
  }

  icSock = accept(iSock, (struct sockaddr *)&stAddr, &uiSockLen); //접속자의 정보가 stAddr에 입력된다.

  if(icSock < 0)
  {
        perror("Accept : ");
        close(iSock);

        return -4;
  }

  close(iSock);
  write(icSock, "Go to hell..."sizeof("Go to hell..."));

  printf("Incoming Client \n");
  //cP = inet_ntoa(stAddr.sin_addr);
  printf("Client IP :%s\n", inet_ntoa(stAddr.sin_addr));
  printf("Client Port : %d\n", ntohs(stAddr.sin_port));  
  

  while(1)
  {
    /*** echo server ***/
    read(icSock, &ucBuff, 1);
    write(icSock, &ucBuff, 1);
    if('Q' == ucBuff)
    {
      break;
    }
  }

  close(icSock);
    return 0;
}

 

 

 

 

echo: telnet에서 읽어들인 문자를 다시 전송한다.

 


 

 

Echo Client

 

Server의 코딩을 참조하여 socket생성, sockaddr_in 구조체 세팅, connect 함수를 만들어보자.




/*** 소스 ***/

#include "smart_socket.h"

int main(void)
{
  struct sockaddr_in sockAddr;
  int iSock;
  int iRet;
  
  iSock = socket(AF_INET, SOCK_STREAM, 0);
  if(0 > iSock)
  {
    perror("socket : ");
    return -1;
  }

  bzero(&stAddr, sizeof(stAddr));
  stAddr.sin_family = AF_INET;
  stAddr.sin_addr.s_addr = inet_addr(IP);
  stAddr.sin_port = htons((PORT));

  iRet = connect(iSock, (struct sockaddr *)&stAddr, &uiSockLen);
  if(0 > iRet)
  {
    perror("connect : ");
    return -2;
  }
    return 0;
}

반응형

'Busan IT > 공장내 Network' 카테고리의 다른 글

TCP 추출(진행중)  (0) 2015.07.16
Echo Server/Client  (0) 2015.07.15
Server/Client socket 프로그램 만들기  (0) 2015.07.13
소켓 연결  (0) 2015.07.07
네트워크 연결  (0) 2015.07.06
Posted by newind2000
Busan IT/모터제어2015. 7. 14. 13:58

================================ Outline ====================================

AX-10+ 모터제어

- 각도 값을 입력하면 작동하는 함수 만들기

** 자동문 만들기

- 모터 속도 조절

----------------------------------------------------------------------------

 

각도 값을 입력하면 작동하는 함수 만들기

 

각도 값을 입력하면 그만큼 회전하게 만드는 함수를 만들어 보자.

0도이면 0x000, 300도이면 0x3FF이다. 표로 만들어 보자.

 

각도

Hexa

10진수

0

0x000

0

100

0x155

341

200

0x2AA

682

300

0x3FF

1023


 

각도 값과 10진수 값의 관계를 알아보자.

 

10진수 = 3.41 * 각도

 

para1은 각도 값에서 하위 1byte의 값이고 para2는 각도 값에서 오른쪽으로 1byte를 밀어준 값이다.

 

하여 int 값으로 받은 ucAngle(0~300) 값을 10진수로 변경해 주고 상위바이트와 하위바이트를 나누어 para1, 2에 넣어주는 작업을 하면 된다.

unsigned char para1;

unsigned char para2;

ucAngle = 3.41 * ucAngle;
para1 = ucAngle & 0b11111111;
para2 = ucAngle >> 8;


그 후 전에 만들어놓았던 para값이 2개인 함수를 사용하여 para1, 2을 제외한 값들은 상수로 바꾸고 함수로 만들면 된다.

 

** 자동문 만들기

 

 

자동문을 원리를 생각해보고 전원이 인가되면 자동적으로 모터가 돌아가고 딜레이 후 모터가 원위치로 돌아가도록 만들어보자.

 

전원을 인가할 포트는 B port이다.

 

//A port를 사용하였다가 port가 고장난 것을 모르고 1시간을 날렸다.

 

모터 속도 조절

 

회전문이 초고속으로 닫히면 사용자가 다칠 위험이 있음으로 모터의 회전 속도를 줄여보자.

WRITE_DATA를 사용하기 때문에 instruction0x03이고 Moving Speed를 제어하기 위해 control table에서 0x20 parameter의 개수가 2개임으로 Length5가 된다.

parameter의 값이 0일 경우 현재 인가 전압상 최대 속도임으로 속도를 줄이기 위해서는 0x001부터 0x3FF사이에서 값을 설정해 주어야 한다.


이미 만들어진 parameter2개를 입력하는 함수를 사용하여 속도 조절을 해보자.


PacketTX_P2(0x0C, 0x05, 0x03, 0x20, 0x40, 0x00); //회전 속도 조절 -> 0x040

 

 

코드는 간단하다.

 

/*** 코드 ***/

 

#include <avr/io.h>
#include <util/delay.h>

void USART0_init()
{
  /* BAUD Rate Set */
  UBRR0 = 0x00;

  /* USART Set */
  UCSR0A = 0b00000000;    //일반모드 
  UCSR0B = 0b00001000;    //인터럽트 사용 안함
  UCSR0C = 0b00000110;
}

void USART0_disable()
{  
  /* USART Set */
  UCSR0A = 0;   
  UCSR0B = 0;    
  UCSR0C = 0;
}


void USART1_init()
{
  /* BAUD Rate Set */
  UBRR1 = 0x67;

  /* USART Set */
  UCSR1A = 0b00000000;    //일반모드 
  UCSR1B = 0b00001000;    //인터럽트 사용 안함
  UCSR1C = 0b00000110;

}

void Data_Tx0( unsigned char data )
{
  /* Wait for empty transmit buffer */
  while ( !( UCSR0A & (1<<UDRE0)) );
  
  /* Put data into buffer, sends the data */
  UDR0 = data;    
}

unsigned char Data_Rx0()
{
  // Wait for data to be received
  while ( 0==(UCSR0A & (1<<RXC0)) );  //datasheet p/184
  
  // Get and return received data from buffer 
  
  return UDR0;
}
void Data_Tx1( unsigned char data )
{
  /* Wait for empty transmit buffer */
  while ( !( UCSR1A & (1<<UDRE1)) );
  
  /* Put data into buffer, sends the data */
  UDR1 = data;    
}

unsigned char Data_Rx1()
{
  // Wait for data to be received
  while ( 0==(UCSR1A & (1<<RXC1)) );  //datasheet p/184
  
  // Get and return received data from buffer 
  
  return UDR1;
}

void PacketTX_P1(unsigned char ID, unsigned char Length, unsigned char Instruction, unsigned char cmd, unsigned char para1)
{
    Data_Tx0(0xFF);  //ini
    Data_Tx0(0xFF);  //ini
    Data_Tx0(ID);  //ID
    Data_Tx0(Length);  //LENGTH = 2+ # of parameter
    Data_Tx0(Instruction);  //Instruction 
    Data_Tx0(cmd);  //command in control table
    Data_Tx0(para1);  //goal position(rear byte)
  
    Data_Tx0((unsigned char)(~(ID + Length + Instruction + cmd + para1)));
    _delay_ms(865);
}

void PacketTX_P2(unsigned char ID, unsigned char Length, unsigned char Instruction, unsigned char cmd, unsigned char para1, unsigned char para2)
{
    Data_Tx0(0xFF);  //ini
    Data_Tx0(0xFF);  //ini
    Data_Tx0(ID);  //ID
    Data_Tx0(Length);  //LENGTH = 2+ # of parameter
    Data_Tx0(Instruction);  //Instruction 
    Data_Tx0(cmd);  //command in control table
    Data_Tx0(para1);  //goal position(rear byte)
    Data_Tx0(para2);  //goal position(head byte)
  
    Data_Tx0((unsigned char)(~(ID + Length + Instruction + cmd + para1 + para2)));
    _delay_ms(865);
}

void Motor_Rotate(unsigned char ID, unsigned int ucAngle)
{
    unsigned char para1;
    unsigned char para2;
    ucAngle = 3.41 * ucAngle;
    para1 = (unsigned char)(ucAngle & 0b11111111);
    para2 = (unsigned char)(ucAngle >> 8);

  
    Data_Tx0(0xFF);  //ini
    Data_Tx0(0xFF);  //ini
    Data_Tx0(ID);  //ID
    Data_Tx0(0x05);  //LENGTH = 2+ # of parameter
    Data_Tx0(0x03);  //WRITE_DATA 
    Data_Tx0(0x1E);  //Goal Position
    Data_Tx0(para1);//goal position(rear byte)
    Data_Tx0(para2);//goal position(head byte)
  
    Data_Tx0((unsigned char)(~(ID + 0x05 + 0x03 + 0x1E + para1 + para2)));    
}

void Baud9600()
{
  //AX-10_ Baud Rate 9600으로 변경 
  PacketTX_P1(0x0C, 0x040x030x040xCF);   
   
  //ATmega2560 Baud Rate 9600으로 변경    
  USART0_disable();
  UBRR0 = 0x67;
                /* USART Set */
  UCSR0A = 0b00000000;    //일반모드 
  UCSR0B = 0b00001000;    //인터럽트 사용 안함
  UCSR0C = 0b00000110;
  _delay_ms(1000);  
}


int main(void)
{
  DDRB = 0xFE;    //PORTB 0번 핀입력

  _delay_ms(1000);
  USART0_init();
  
  Baud9600();      //Baud Rate 9600으로 변경

  PacketTX_P2(0x0C, 0x050x030x200x400x00); //회전 속도 조절 -> 0x040


  while(1)
  {
    // 자동문, 문이 열리고 5초 대기 후 신호가 없으면 닫힌다.
    if(PINB == 0x01)
    {
      Motor_Rotate(0x0C,300);
      _delay_ms(5000);
    }
    else if((PINB & 0x01== 0x00)
    {
      Motor_Rotate(0x0C,0);
      _delay_ms(1000);
    }
  }

  return 0;
}


반응형
Posted by newind2000