==========================================================================================

AVR

==========================================================================================


<AVR2560>



=아날로그입력 사용 자동문제어

0x3AA : 4.58V  이상 => OPEN

                이하 => CLOSE

=ADCSRA


=ADCSRB


=ADMUX



=

<ADC.C>

#include "adc.h"

#if DADC
void ADC_Init(void)
{  
  
//DDRF = 0x80;
  //ACSR = (1<<ACBG) |(1<<ACIS1) |(1<<ACIS0); //0b01000011; // + 입력 = 1.1V
  ADMUX = 0b01000000;//(1<<REFS0)|(0<<MUX4)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0);//(1<<REFS1) | (1<<REFS0);   //-입력 : ADC4(JTAGEN X) => ADC1
  ADCSRA =  0b11100000;//(1<<ADEN) | (1<<ADSC) | (1<<ADATE);//0x00;      //ADEN : 0
  ADCSRB = 0x00;//(1<<ACME);//0b01000000; //ACME : 1
  
  
return;
}

#else
void ADC_Init(void//  비교기 
{
  ACSR 
= (1<<ACBG) |(1<<ACIS1) |(1<<ACIS0); //0b01000011; // + 입력 = 1.1V
  ADCSRA =   (1<<ADEN) | (1<<ADSC) | (1<<ADATE);      //ADEN : 0
  ADCSRB = (1<<ACME); //0b01000000; //ACME : 1
  ADMUX = (1<<REFS1);   //-입력 : ADC4(JTAGEN X) => ADC1
  
  
return;
}
#endif


<ADC.H>

#ifndef __ADC_H__
#define __ADC_H__
//#include "avr2560.h"
#include <avr/io.h>
//#include "lcd.h"
#define DADC 1

void ADC_Init(void);

#endif //__ADC_H__


<MAIN.C>

#include <avr/io.h>
#include <util/delay.h>
#include "usart.h"
#include "stepmotor.h"
#include "adc.h"


void Init(void)
{
  USART0_Init();  

  ADC_Init();

  return;
}

int main(void)
{

  Init();

  while(1)
  {

#if DADC  
    if(ADC > 0x03AA)  // 
    {
      Door_OpenClose(
299); // DOOR OPEN
      //while((1<<ACO) == (ACSR & (1<<ACO)));
    }
    
else
    {
      _delay_ms(
3000);
      Door_OpenClose(
0);  // DOOR CLOSE
    }
#else
    if( (1<<ACO) == (ACSR & (1<<ACO)))  
    {
      Door_OpenClose(
299); // DOOR OPEN
    }
    
else
    {
      _delay_ms(
5000);
      Door_OpenClose(
0);  // DOOR CLOSE
    }
#endif

  }

  
return 0;
}

=결과






==========================================================================================

ARM

==========================================================================================

<ARM>


-CHIP : AT91SAM7S256
























=

TDMI


Thumb(16bit)









=SAM-BA


-ROM에 삼바라는 프로그램이 내장

:아무 것도 없을 때 삼바 프로그램 구동

:PC와 통신할 준비를 함

:컴파일한 파일(프로그램) 받을 준비


-1. 처음 전원 ON시 원래 FLASH가 구동 ( FLASH에 SAMBA 있음 )

-2. 실행중 : SAMBA - SDRAM에 있음(FLASH -> SDRAM : LOAD)

-3. 컴파일한 프로그램 다운로드


=프로그램 다운로드 방법

0. 모두 OFF

1. TST ON

2. 전원 ON

-FLASH로 SAMBA복사(10초 정도)

3. 전원 OFF

4. TST OFF

5. 전원 ON

:삼바 구동(FLASH -> SDRAM)

:PC 장치관리자에서 인식 - PC와 통신

6. FLASH에 프로그램 다운로드

=> 전원 ON => 컴파일한 프로그램 구동


=다시 컴파일한 프로그램 다운로드 시 0 ~ 6 반복




=POWER ON ( 드라이버 설치)







=TOOL설치

http://www.atmel.com/tools/SAM7S-EK.aspx




-실행  :  CONNECT










==========================================================================================

NETWORK

==========================================================================================

<NETWORK>


==TCP 헤더 분석


=이더넷 / IP / TCP 헤더 구조 

-sizeof(struct ether_header) : 14

-if(*(ucpData+23)==IPPROTO_TCP) : +23 ( 0~13 / 14~23)

-((*(ucpData + sizeof(struct ether_header))) & 0x0F)*4) : IP HEADER LENGTH(LINE COUNT)






<TCP.C>

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

void Print_Ip(const void *);
void Print_Ether(const void *);
void HexaView(const void * , unsigned int);
int main()
{
  
char * cpNICName;//network interface
  char caErrMsg[PCAP_ERRBUF_SIZE];
  pcap_t * stpDS;
  
const unsigned char *ucpData;

  
struct pcap_pkthdr stInfo;
  
struct tcphdr * stTcp;

  cpNICName 
= pcap_lookupdev(caErrMsg);
  
if(0 == cpNICName)
  {
    printf(
"ErrMsg  : [%s]\n", caErrMsg);
    
return 0;
  }
  printf(
"NICName      : [%s]\n", cpNICName);
  stpDS 
= pcap_open_live(cpNICName, 150010, caErrMsg);

  
while(1)
  {

    ucpData 
= pcap_next(stpDS,&stInfo);
    printf(
"Packet Length  : %d Bytes\n", stInfo.len);
    Print_Ether(ucpData);
    
if(ETH_P_IP == ntohs(*((short *)(ucpData+12))))
    {
      Print_Ip(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));                

    }

    
//HexaView(ucpData, 16 * 25);
  }
  pcap_close(stpDS);
  
return 0;
}

void Print_Ip(const void * vP)
{
  
struct ip const * v =vP;
  
int iCnt;

  printf(
"IP version        : %d\n",v->ip_v);
  printf(
"Header Lengh      : %d Bytes\n",v->ip_hl*4);
  printf(
"Type of Service      : 0x%02X\n", v->ip_tos);
  printf(
"Total Packet Length    : %d Bytes\n",ntohs(v->ip_len));
  printf(
"Fragment Identifier    : %d\n",ntohs(v->ip_id));
  printf(
"reserved fragment flag  : %d\n",(IP_RF == (IP_RF & v->ip_off)));
  printf(
"dont fragment flag    : %d\n", (IP_DF == (IP_DF & v->ip_off)));
  printf(
"more fragments flag    : %d\n", (IP_MF == (IP_MF & v->ip_off)));
  printf(
"Fragmentaion offset    : %d\n", (IP_OFFMASK & v->ip_off));
  printf(
"Time To Live      : %d\n",v->ip_ttl);
  printf(
"Protcol Identifie    : ");
  
switch(v->ip_p)
  {
    
//IPPROTO_HOPOPTS = 0,   /* IPv6 Hop-by-Hop options.  */
    case IPPROTO_IP :
      printf(
"Dummy 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');
  printf(
"Checksum        : %d\n",v->ip_sum);
  printf(
"Source IP Address    : %s\n", inet_ntoa(v->ip_src));
  printf(
"Destination IP Address  : %s\n", inet_ntoa(v->ip_dst));
#if 0
  printf("Source IP Address     : " );
  
for(iCnt = 0; iCnt < 4 ; ++iCnt)
  {
    printf(
"%d.",(char)(v->ip_src.s_addr >> (iCnt*8)));
  }
  printf(
"\b \n");

  printf(
"Destination IP Address: ");
  
for(iCnt = 0; iCnt < 4 ; ++iCnt)
  {
    printf(
"%d.",(char)(v->ip_dst.s_addr >> (iCnt*8)));
  }
  printf(
"\b \n");
#endif

  return;
}
void Print_Ether(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(
"\b \n");
  printf(
"Src  MAC        : ");
  
for(iCnt = 0; iCnt < ETH_ALEN ; ++iCnt)
  {
    printf(
"%02X:",((struct ether_header *)vP)->ether_shost[iCnt]);
  }
  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 IEEEBUP 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 Dump/Load");
      
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_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");
      
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_ATMFATE: 
      printf(
"Frame-based ATM Transport");
      
break;
    
case ETH_P_AOE: 
      printf(
"ATA over Ethernet");
      
break;
    
case ETH_P_TIPC:    
      printf(
"TIPC");
      
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;




  }
  putchar(
'\n');
  
return;
}

/*
   void HexaView(const void * vP, unsigned int uiLen)
   {
   unsigned int uiCnt;
   unsigned int uiLine;

   printf("
===============================================================================\n");
   printf("  Address                           Hexa                           ASCII       \n");
   printf("-------------------------------------------------------------------------------\n");
   for (uiLine 
= 0; uiLine < uiLen; uiLine = uiLine + 16)
   {
   printf(" %08d  ", uiLine);
//printf(" %08X  ", vP);
for (uiCnt 
= 0; uiCnt < 16; ++uiCnt)
{
printf("%02X ", *((unsigned char *)vP));
vP 
= (char *)vP + 1;
}
putchar(' ');
vP 
= (char *)vP - 16;
for (uiCnt 
= 0; uiCnt < 16; ++uiCnt)
{
if (32 
> *((unsigned char *)vP)) // ASCII 32 => SPACE // 제어문자 => '.'출력
{
putchar('.');               
}
else if ( 127 
< *((unsigned char *)vP)) // ASCII 128이상 (확장아스키) // 한글 => '.'출력
{
putchar('.');
}
else
{
printf("%c", *((unsigned char *)vP));
}
vP 
= (char *)vP + 1;
}
putchar('\n');
}
return;
}
 */
#if 0
pcap_t  *pcap_open_live(const char *, intintintchar *);
// NETWORK 
// MTU: maximum transmitter unit
// PROMISCUOUS:난잡한 :0- 가리지 않고 아무 패킷이나 다 들고옴
// INTERVAL : term
// void    pcap_close(pcap_t *);
const u_char* pcap_next(pcap_t *, struct pcap_pkthdr *);

struct pcap_pkthdr {
  
struct timeval ts;  /* time stamp */
  bpf_u_int32 caplen; /* length of portion present */읽은 패킷 길이
    bpf_u_int32 len;    
/* length this packet (off wire) */ 제공 길이
};

/* 10Mb/s ethernet header */
struct ether_header
{
  u_int8_t  ether_dhost[ETH_ALEN];  
/* destination eth addr */목적지 MAC
    u_int8_t  ether_shost[ETH_ALEN];  
/* source ether addr    */자기 MAC
    u_int16_t ether_type;             
/* packet type ID field */
} __attribute__ ((__packed__));

struct ip
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
  
unsigned int ip_hl:4;       /* header length */
  unsigned int ip_v:4;        /* version */
#endif
#if
 __BYTE_ORDER == __BIG_ENDIAN
  
unsigned int ip_v:4;        /* version */
  unsigned int ip_hl:4;       /* header length */
#endifㅁ
  u_int8_t ip_tos;            /* type of service */
  u_short ip_len;         /* total length */
  u_short ip_id;          /* identification */
  u_short ip_off;         /* fragment offset field */
#define IP_RF 0x8000            /* reserved fragment flag */
#define IP_DF 0x4000            /* dont fragment flag */
#define IP_MF 0x2000            /* more fragments flag */
#define IP_OFFMASK 0x1fff       /* mask for fragmenting bits */
  u_int8_t ip_ttl;            /* time to live */
  u_int8_t ip_p;          /* protocol */
  u_short ip_sum;         /* checksum */
  struct in_addr ip_src, ip_dst;  /* source and dest address */
};

struct iphdr
{
#if __BYTE_ORDER == __LITTLE_ENDIAN
  
unsigned int ihl:4;
  
unsigned int version:4;
#elif __BYTE_ORDER == __BIG_ENDIAN
  
unsigned int version:4;
  
unsigned int ihl:4;
#else
#
 error "Please fix <bits/endian.h>"
#endif
  u_int8_t tos;
  u_int16_t tot_len;
  u_int16_t id;
  u_int16_t frag_off;
  u_int8_t ttl;
  u_int8_t protocol;
  u_int16_t check;
  u_int32_t saddr;
  u_int32_t daddr;
  
/*The options start here. */
};

# else /* !__FAVOR_BSD */
struct tcphdr
{
  u_int16_t source;
  u_int16_t dest;
  u_int32_t seq;
  u_int32_t ack_seq;
#  if __BYTE_ORDER == __LITTLE_ENDIAN
  u_int16_t res1:
4;
  u_int16_t doff:
4;
  u_int16_t fin:
1;
  u_int16_t syn:
1;
  u_int16_t rst:
1;
  u_int16_t psh:
1;
  u_int16_t ack:
1;
  u_int16_t urg:
1;
  u_int16_t res2:
2;
#  elif __BYTE_ORDER == __BIG_ENDIAN
  u_int16_t doff:
4;
  u_int16_t res1:
4;
  u_int16_t res2:
2;
  u_int16_t urg:
1;
  u_int16_t ack:
1;
  u_int16_t psh:
1;
  u_int16_t rst:
1;
  u_int16_t syn:
1;
  u_int16_t fin:
1;
#  else
#   error "Adjust your <bits/endian.h> defines"
#  endif
  u_int16_t window;
  u_int16_t check;
  u_int16_t urg_ptr;
};
# endif 
/* __FAVOR_BSD */

#endif






'2015 스마트 콘트롤러 > 업무일지' 카테고리의 다른 글

20150720  (0) 2015.07.21
20150717  (0) 2015.07.19
20150715  (0) 2015.07.16
20150714  (0) 2015.07.14
20150713  (0) 2015.07.14
Posted by ahj333
,