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

ARM

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


<ARM>









=회로도 


http://itsmart333.tistory.com/attachment/cfile7.uf@2439C14355AE048119F7F5.pdf








=





-소스인사이트 소스깨짐 방지

http://blog.naver.com/junyoung8934/90182483563


=LCD 연결










<AT91SAM7S256.h>




<<ARM>>


<MAIN.C>

#include <project.h> 

int main()
{  
  
  
while (1);
  
return 0;
}


<LCD.H>

#ifndef __LCD_H__
#define __LCD_H__
#include <AT91SAM7S256.h>

#define LCD_BUS  0x00FF0000  //MASK 16~23
#define LCD_RS  0x00000001  // 1 
#define LCD_RW  0x00000002  // 2
#define LCD_EN  0x00000004  // 3

#define LCD_CAL_INST(X)  ((LCD_BUS)&((X)<<16)) // INST만 넣기 

void LCD_Init(void);
#endif // __LCD_H__


<LCD.C>

#include "lcd.h"

void LCD_Inst(unsigned int uiInst) 
{
  
volatile unsigned int uiCnt;  
  
  *AT91C_PIOA_CODR 
= LCD_BUS | LCD_RS | LCD_RW | LCD_EN;  // LOW  
  *AT91C_PIOA_SODR = LCD_CAL_INST(uiInst);  
  
for(uiCnt = 0 ; uiCnt <100000; ++uiCnt);  // ALL INIT
  for(uiCnt = 0 ; uiCnt <100000; ++uiCnt);  // RS = LOW
  *AT91C_PIOA_SODR = LCD_EN; 
  
for(uiCnt = 0 ; uiCnt <100000; ++uiCnt);  // EN = HIGH
  for(uiCnt = 0 ; uiCnt <100000; ++uiCnt);  // BUS = DATA
  for(uiCnt = 0 ; uiCnt <100000; ++uiCnt);  // BUS = VALID DATA  
  *AT91C_PIOA_CODR = LCD_EN; 
  
for(uiCnt = 0 ; uiCnt <100000; ++uiCnt);  // EN = LOW  
}

void LCD_Init(void)
{
  
//*PIO_PER = LCD_BUS | LCD_RS | LCD_RW | LCD_EN; // 0번지 X => ASSEM
  //AT91C_BASE_PIOA->PIO_PER = LCD_BUS | LCD_RS | LCD_RW | LCD_EN;   
  *AT91C_PIOA_PER = LCD_BUS | LCD_RS | LCD_RW |
 LCD_EN; 

  *AT91C_PIOA_PPUDR 
= LCD_BUS | LCD_RS | LCD_RW | LCD_EN;
  
  
return;
}

<MAKEFILE>

#-----------------------------
#
 2008 Mecha Cource - By CM WC, 2008.09.10.
#-----------------------------
ifndef ERASE_FCT
ERASE_FCT
=rm -rf
endif
ifndef WCCROSS_COMPILE
WCCROSS_COMPILE
=arm-elf-
endif

WCTOOL
=gcc

WCOUTFILE_SRAM
=at91sam7s_sram_wc
WCOUTFILE_FLASH
=at91sam7s_flash_wc

WCTARGET
=AT91SAM7S256

WCINCL
=./include

# Debug Mode
OPTIM
=-Os

ifeq ($(WCTOOL), gcc)

AS
=$(WCCROSS_COMPILE)gcc
CC
=$(WCCROSS_COMPILE)gcc
LD
=$(WCCROSS_COMPILE)gcc

OBJCOPY
=$(WCCROSS_COMPILE)objcopy
OBJDUMP
=$(WCCROSS_COMPILE)objdump

NM
= $(WCCROSS_COMPILE)nm
SIZE
=$(WCCROSS_COMPILE)size

CCFLAGS
=-g -mcpu=arm7tdmi $(OPTIM) -Wall -I$(WCINCL) -D$(WCTARGET)
ASFLAGS
=-D__ASSEMBLY__ -D$(WCTARGET) -g -mcpu=arm7tdmi -c $(OPTIM) -Wall -I$(WCINCL)

LDFLAGS+
=-nostartfiles -Wl,--cref
LDFLAGS+
=-lc -lgcc
LDFLAGS+
=-T elf32-littlearm.lds

OBJS
=cstartup.o
endif

OBJS+
= lowlevel.o \
       main.o \
       lcd.o


all: sram flash

rebuild: clean all

sram: $(OBJS)
  $(LD) $(LDFLAGS) -Ttext 
0x201000 -Tdata 0x200000 -n -o $(WCOUTFILE_SRAM).elf $(OBJS)
  $(OBJCOPY) --strip-debug --strip-unneeded $(WCOUTFILE_SRAM).elf -O binary $(WCOUTFILE_SRAM).bin

flash: $(OBJS)
  $(LD) $(LDFLAGS) -Ttext 
0x100000 -Tdata 0x200000 -n -o $(WCOUTFILE_FLASH).elf $(OBJS)
  $(OBJCOPY) --strip-debug --strip-unneeded $(WCOUTFILE_FLASH).elf -O binary $(WCOUTFILE_FLASH).bin

main.o: main.c
  $(CC) -c $(CCFLAGS) main.c -o main.o

lcd.o: lcd.c
  $(CC) -c $(CCFLAGS) lcd.c -o lcd.o

  
lowlevel.o: lowlevel.c
  $(CC) -c $(CCFLAGS) lowlevel.c -o lowlevel.o

cstartup.o:  cstartup.S
  $(AS) $(ASFLAGS) cstartup.S -o cstartup.o

clean:
  $(ERASE_FCT) *.o *.bin *.elf *.map
  



<<AVR -<LCD.C>- LCD INST>>

static void LCD_Inst(unsigned char ucInst)
{
  
volatile unsigned int uiCnt;
  
  
//DB INST SET (ENABLE 전 셋팅)
  LCD_BUS = ucInst;
  
  
//Write Mode Timing Diagram
  LCD_CTL = (0<<LCD_PIN_RS)|(0<<LCD_PIN_RW)|(0<<LCD_PIN_EN);    // RS : LOW / RW : LOW / EN : LOW => 쓰레기값 (Don't Care)
  DELAY(DNUM_1);  
  LCD_CTL 
= (0<<LCD_PIN_RS)|(0<<LCD_PIN_RW)|(1<<LCD_PIN_EN);    // EN : HIGH
  DELAY(DNUM_2);
  LCD_CTL 
= (0<<LCD_PIN_RS)|(0<<LCD_PIN_RW)|(0<<LCD_PIN_EN);    // EN : LOW
  DELAY(DNUM_3);  
  
  
return;
}



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

20150727  (0) 2015.07.27
20150724  (0) 2015.07.26
20150722  (0) 2015.07.23
20150721  (0) 2015.07.22
20150720  (0) 2015.07.21
Posted by ahj333
,

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

NETWORK

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


<NETWORK>



=TCP 








=

http://www.ktword.co.kr/abbr_view.php?nav=&m_temp1=2437&id=1103


. CODE BITS
  URG (1 bit) – URGENT POINTER 필드가 유효
  ACK (1 bit) – ACKNOWLEDGMENT필드를 유효
  PSH (1 bit) – 세그먼트 PUSH를 요청
  RST (1 bit) – 즉시 연결을 끊음(비정상적인 종료)
  SYN (1 bit) – sequence numbers 동기화
  FIN   (1 bit) – 정상적인 종료






=print_Ip()삭제



=SYN / ACK출력




=윈도우 <-> 리눅스 => 계속 패킷 생성

==> 채팅PORT만 보이도록 수정




=

<PACKET.C>

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

#define PORT 7777

int main(void)
{
  
char*           cpNICName;
  
char           caErrMSG[PCAP_ERRBUF_SIZE];
  
int           iCnt;
  
unsigned char const *   ucpData;
  pcap_t*         stpDS;
  
struct pcap_pkthdr     stInfo;
  
struct tcphdr *     stTcp;
  
struct ip *        stpIp;  


  cpNICName 
= pcap_lookupdev(caErrMSG);

  
if(0 == cpNICName)
  {
    printf(
"ERRMSG  : [%s]\n",caErrMSG);
    
return 100;
  }

  stpDS 
= pcap_open_live(cpNICName, ETH_DATA_LEN, 10, caErrMSG);

  printf(
"Packet Monitoring Start....\n");
  getchar();

  
while(1)
  {
    ucpData 
= pcap_next(stpDS, &stInfo);

    
if(ETH_P_IP != ntohs(*(unsigned short*)(ucpData+12))) // 2byte 주소
    {
      
continue;
    }

    
if(IPPROTO_TCP != *(ucpData+23))
    {
      
continue;
    }
  

    
stpIp = (struct ip *) (ucpData + sizeof(struct ether_header));
    stTcp 
= (struct tcphdr *)(ucpData + sizeof(struct ether_header) 
        + ((*(ucpData+ 
sizeof(struct ether_header)) & 0x0F) * 4));

    
if(PORT != ntohs(stTcp -> source))
    {
      
if(PORT != ntohs(stTcp -> dest))
      {
        
continue
;
      }
    }

    printf(
"=============================================\n");
    printf(
"[%s:%d] ---> ",
      
  inet_ntoa(stpIp -> ip_src)
        , ntohs(stTcp -
> source)
        );

    printf(
"[%s:%d]\n",
       
 inet_ntoa(stpIp -> ip_dst)
        , ntohs(stTcp -
> dest)
        );

    printf(
"SYN[%d] ACK[%d] Seq[%010u] Ack[%010u]\n"
        , stTcp -> syn
        , stTcp -
> ack

        , ntohl(stTcp -
> seq)
        , ntohl(stTcp -
> ack_seq)
        );
  }

  pcap_close(stpDS);

  
return 0;
}






=CLIENT










=CLIENT









=SERVER






=SERVER






=3HANDSHAKE


CONNECT <=> ACCEPT



=SERVER(클라이언트 : 접속 -> quit)







=DDOS - 3HANDSHAKE 이용 ( 구글 / 은행 )

-좀비PC - 텔레그램



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

20150724  (0) 2015.07.26
20150723  (0) 2015.07.23
20150721  (0) 2015.07.22
20150720  (0) 2015.07.21
20150717  (0) 2015.07.19
Posted by ahj333
,

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

ARM

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

<ARM>



=BOD - (brownout detect) - 일정전압 이하 리셋 = > 일정전압 이상 동작되도록 ( 안정적 동작)

=레지스터








=회로도 

http://itsmart333.tistory.com/attachment/cfile7.uf@2439C14355AE048119F7F5.pdf







- 레귤레이터(규칙적인) - 공급되는 전압이 변하더라도 일정한 전압 공급





-승압 X :

-나머지는 열로



=전보 -------- 릴레이(원래신호 원복) ------도착

=

ARM

1 - 3.3V

0 - 0V


MAX3232 - 처리 칩


RS232(편차 24V)

1 - (+12V)

0 - (-12V)


=



















-P20 - 기준 ADDR

-P1248 - OFFSET(차감/상쇄/벌충 하다)



-폰노이만 (한 영역에 다 있음)



=LED ON/OFF








=

at91sam7s_flash_wc.elf











-unlock ? yes

-lock ? no





=

PIN23(VCC3.3) - LED (+) LED(-) - PIO0


=

//#include "project.h" // 나중에..
//레지스터 직접 DEFINE
#define PIO_PER    (*((volatile unsigned int *)0xFFFFF400))
#define PIO_PDR    (*((volatile unsigned int *)0xFFFFF404))
#define PIO_PSR    (*((volatile unsigned int *)0xFFFFF408))

#define PIO_OER    (*((volatile unsigned int *)0xFFFFF410))
#define PIO_ODR    (*((volatile unsigned int *)0xFFFFF414))
#define PIO_OSR    (*((volatile unsigned int *)0xFFFFF418))

#define PIO_IFER  (*((volatile unsigned int *)0xFFFFF420))
#define PIO_IFDR  (*((volatile unsigned int *)0xFFFFF424))
#define PIO_IFSR  (*((volatile unsigned int *)0xFFFFF428))

#define PIO_SODR  (*((volatile unsigned int *)0xFFFFF430))
#define PIO_CODR  (*((volatile unsigned int *)0xFFFFF434))
#define PIO_ODSR  (*((volatile unsigned int *)0xFFFFF438))
#define PIO_PDSR  (*((volatile unsigned int *)0xFFFFF43C))
#define PIO_IER    (*((volatile unsigned int *)0xFFFFF440))
#define PIO_IDR    (*((volatile unsigned int *)0xFFFFF444))
#define PIO_IMR    (*((volatile unsigned int *)0xFFFFF448))
#define PIO_ISR    (*((volatile unsigned int *)0xFFFFF44C))
#define PIO_MDER  (*((volatile unsigned int *)0xFFFFF450))
#define PIO_MDDR  (*((volatile unsigned int *)0xFFFFF454))
#define PIO_MDSR  (*((volatile unsigned int *)0xFFFFF458))

#define PIO_PUDR  (*((volatile unsigned int *)0xFFFFF460))
#define PIO_PUER  (*((volatile unsigned int *)0xFFFFF464))
#define PIO_PUSR  (*((volatile unsigned int *)0xFFFFF468))

#define PIO_ASR    (*((volatile unsigned int *)0xFFFFF470))
#define PIO_BSR    (*((volatile unsigned int *)0xFFFFF474))
#define PIO_ABSR  (*((volatile unsigned int *)0xFFFFF478))
#define PIO_OWER  (*((volatile unsigned int *)0xFFFFF4A0))
#define PIO_OWDR  (*((volatile unsigned int *)0xFFFFF4A4))
#define PIO_OWSR  (*((volatile unsigned int *)0xFFFFF4A8))

int main()
{
  
volatile unsigned int iCount = 0;
  
PIO_PER = 0x00000001// PIN ENABLE PA0
  PIO_OER = 0x00000001// OUTPUT ENABLE PA0

  
  
while (1)
  {
    
PIO_SODR = 0x00000001// AVR : PORTA = PORTA | 0X01;

    for(iCount=0;1000000 >= iCount; ++iCount);
    
PIO_CODR = 0x00000001// AVR : PORTA = PORTA &~(0X01);
    for(iCount=0;1000000 >= iCount; ++iCount);
  }

  
while (1);
  
return 0;
}


=결과





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

20150723  (0) 2015.07.23
20150722  (0) 2015.07.23
20150720  (0) 2015.07.21
20150717  (0) 2015.07.19
20150716  (0) 2015.07.17
Posted by ahj333
,

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

ARM

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

<ARM>



==DATASHEET 확인

0. 자료확보(보드 홈페이지-드라이버-개발환경 구축)

1. ARM보드 제어권

(펌웨어 라이브러리는 직접 만들어야 함)





-시동 파일




:초반에 구동 시키는 boot code 필요

booting(실제 일을 하기 위한 준비 작업 ( - 신발 끈 매기))

=bootstrap ( 기계어, 어셈블러)

:winavr ( 소스코드 공개 - 빌드되어 obj형태로 (ctr*.o)들어 있음. 컴파일시 붙임)


<boot code>

----

call low_level_init

call main





=linker script파일




(pe파일 - 어셈블러)-window 실행파일 구조-window 해킹 관련 책

=ARCH 구조

=ENTRY (진입점)


=칩제작사에서 제공






=stack 보통 4k까지 허용




#include <stdio.h>

int main()
{
  
//int a[1024*1024*100]={0,}; // 4Kb => 4M => 
  int a[1024*500]={0,}; // 4Kb => 4M => 
  printf("안녕하세요\n");
  
return 0;
}







=실행 제대로 안됨("안녕하세요“출력 안됨)










#include <stdio.h>
int b[1024*1024*100]={10,}; // 4Kb => 4M 

int main()
{
  
//int a[1024*1024*100]={0,}; // 4Kb => 4M => 
  //int a[1024*500]={0,}; // 4Kb => 4M => 
  printf("안녕하세요\n");
  
return 0;
}











#include <stdio.h>
//int b[1024*1024*100]={10,}; // 4Kb => 4M 
int c[1024*1024*100];//={10,}; // 4Kb => 4M BSS

int main()
{
  
//int a[1024*1024*100]={0,}; // 4Kb => 4M => 
  //int a[1024*500]={0,}; // 4Kb => 4M => 
  printf("안녕하세요\n");
  
return 0;
}






=실행파일 용량 체크


#include <stdio.h>
//int b[1024*1024*100]={10,}; // 4Kb => 4M 
//int c[1024*1024*100];//
={10,}; // 4Kb => 4M BSS

int main()
{
  
//int a[1024*1024*100]={0,}; // 4Kb => 4M => 
  //int a[1024*500]={0,}; // 4Kb => 4M => 
  char * t1 = "1234567890";
  printf(
"안녕하세요\n");
  
return 0;
}




=

#include <stdio.h>
//int b[1024*1024*100]={10,}; // 4Kb => 4M 
//int c[1024*1024*100];//
={10,}; // 4Kb => 4M BSS

int main()
{
  
//int a[1024*1024*100]={0,}; // 4Kb => 4M => 
  //int a[1024*500]={0,}; // 4Kb => 4M => 
  char * T[] =   {  "1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
        ,"1234567890"
      };

  printf(
"안녕하세요\n");
  printf(
"%08X\n", T[0]);
  printf(
"%08X\n", T[1]);
  
return 0;
}



=FLASH 의 용량에 맞게 (상수, 전역 줄여야 함)

=STACK의 사용량 줄여야 함(재귀함수 X)



=SECTION ( CODE(TEXT) + DATA )

=어셈블러 중에 C로 작성가능 한 것 (수정 쉽도록 )


<PROJECT.H>




<MAKEFILE>







=ARM사의 칩을 사용(ATMEL, 삼성...)(DATASHEET 불친절)


=CDMA((ARM + CDMA MODEM) => 폴더폰)

-MSMXXXX

-퀄컴

-ETRI-CDMA칩을 우리나라에서 만들어줌



=(CDMA MODEM) + (CPU) => 스마트폰






=ICE - Core 모니터링( ARM7TDMI )

=JTAG - 외부와 중계 ( 삼바를 안거치고 프로그램 넣을 수 있음(PC에 프린트포트 필요함))

(-Trace32, OPENICE)

=PLL(주파수체배기)









=BOD - (brownout detect) - 일정전압 이하 리셋 = > 일정전압 이상 동작되도록 ( 안정적 동작)

=레지스터










=PIOA 주소 DEFINE

<MAIN.C>

//#include "project.h" // 나중에..
//레지스터 직접 DEFINE
#define PIO_PER    (*((volatile unsigned int *)0xFFFFF400))
#define PIO_PDR    (*((volatile unsigned int *)0xFFFFF404))
#define PIO_PSR    (*((volatile unsigned int *)0xFFFFF408))

#define PIO_OER    (*((volatile unsigned int *)0xFFFFF4010))
#define PIO_ODR    (*((volatile unsigned int *)0xFFFFF4014))
#define PIO_OSR    (*((volatile unsigned int *)0xFFFFF4018))

#define PIO_IFER  (*((volatile unsigned int *)0xFFFFF4020))
#define PIO_IFDR  (*((volatile unsigned int *)0xFFFFF4024))
#define PIO_IFSR  (*((volatile unsigned int *)0xFFFFF4028))

#define PIO_SODR  (*((volatile unsigned int *)0xFFFFF4030))
#define PIO_CODR  (*((volatile unsigned int *)0xFFFFF4034))
#define PIO_ODSR  (*((volatile unsigned int *)0xFFFFF4038))
#define PIO_PDSR  (*((volatile unsigned int *)0xFFFFF403C))
#define PIO_IER    (*((volatile unsigned int *)0xFFFFF4040))
#define PIO_IDR    (*((volatile unsigned int *)0xFFFFF4044))
#define PIO_IMR    (*((volatile unsigned int *)0xFFFFF4048))
#define PIO_ISR    (*((volatile unsigned int *)0xFFFFF404C))
#define PIO_MDER  (*((volatile unsigned int *)0xFFFFF4050))
#define PIO_MDDR  (*((volatile unsigned int *)0xFFFFF4054))
#define PIO_MDSR  (*((volatile unsigned int *)0xFFFFF4058))

#define PIO_PUDR  (*((volatile unsigned int *)0xFFFFF4060))
#define PIO_PUER  (*((volatile unsigned int *)0xFFFFF4064))
#define PIO_PUSR  (*((volatile unsigned int *)0xFFFFF4068))

#define PIO_ASR    (*((volatile unsigned int *)0xFFFFF4070))
#define PIO_BSR    (*((volatile unsigned int *)0xFFFFF4074))
#define PIO_ABSR  (*((volatile unsigned int *)0xFFFFF4078))
#define PIO_OWER  (*((volatile unsigned int *)0xFFFFF40A0))
#define PIO_OWDR  (*((volatile unsigned int *)0xFFFFF40A4))
#define PIO_OWSR  (*((volatile unsigned int *)0xFFFFF40A8))

int main()
{
  
volatile unsigned int iCount = 0;

  
while (1)
  {
    
for(iCount=0;1000000 >= iCount; ++iCount);

    
for(iCount=0;1000000 >= iCount; ++iCount);

  }

  
while (1);
  
return 0;
}



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

AVR

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

<AVR2560>


=ULN2803APG - 스테핑모터 드라이버용 칩

http://itsmart333.tistory.com/attachment/cfile26.uf@2743114E55AC7F3D1F3198.pdf



==개발 제안서(중간 프로젝트) - 8월 28일 발표

EX)

http://wowcat.tistory.com/889

http://wowcat.tistory.com/search/%ED%84%B0%EC%B9%98%EC%8A%A4%ED%81%AC%EB%A6%B0


-회로도(블럭다이아그램)


http://itsmart333.tistory.com/attachment/cfile30.uf@2308A04B55AC979A09C62D.pdf


-온도센서

-LM30 /Pt 100Ω

http://itsmart333.tistory.com/search/PT%20100






=

1. 제안서 제출 일자 : 2013년 05월 13일 월요일


2. 제안서 작성자 : 진종영


3. 프로젝트 명 : 4족 보행 로봇


4. 4족 보행 로봇을 만들고자 하는 계기

  • 모터(스텝 모터 또는 서보 모터) 제어능력 향상 

  • ARM 또는 AVR의 제어 능력 향상

    (PWM, 타이머/카운터, 인터럽트, ADC 등...)


5. 주요 구현 기술

  • 모터(스텝 모터 또는 서보 모터)를 이용한 로봇 관절

    구현 및 제어

  • 센서(초음파 또는 적외선)를 이용한 장애물 감지

  • 마이크로 컨트롤러 프로젝트 수행능력


6. 프로젝트 사양

  • 총 소요 기간 : 20일, 4주

  - 1주 : 역할분담, 기술 검토, 모터와 센서 테스트 및 코드 작성

  - 2주 : 코딩 및 회로구성과 바디제작, 중간보고서 작성

  - 3주 : 코딩 및 동작 테스트, 중간보고서 제출

  - 4주 : 테스트 및 디버깅, 최종 마무리 구현

  - 프로젝트 종료 1주일 내 결과 보고서 제출 및 발표

  • 개발 인원 : 3명

  - ARM(AVR)으로 모터와 센서 제어 : 2명

  - 회로와 바디설계 및 제작 : 1명





1. 제안서 제출 일자 : 2013년 05월 13일 월요일


2. 제안서 작성자 : 진종영


3. 프로젝트 명 : RC Car


4. RC Car를 만들고자 하는 계기

  • 모터(스텝 모터 또는 서보 모터) 제어능력 향상 

  • IR 센서를 이용한 적외선 신호 분석능력 향상

  • ARM 또는 AVR의 제어 능력 향상

    (PWM, 타이머/카운터, 인터럽트, ADC, UART 등...)


5. 주요 구현 기술

  • 모터를 이용한 2륜 자동차 동작(직진, 좌우 회전, 후진)

  • 일반 리모컨의 신호를 IR 센서로 받아 리모트 컨트롤 


6. 프로젝트 사양

  • 총 소요 기간 : 20일, 4주

  - 1주 : 역할분담, 기술 검토, IR 신호 분석, 모터 제어,

  - 2주 : RC 카 바디제작, 전원부 회로설계

        코딩 및 중간보고서 작성

  - 3주 : 코딩 및 중간보고서 제출

  - 4주 : 디버깅 및 최종 마무리

  - 프로젝트 종료 1주일 내 결과 보고서 제출 및 발표

  • 개발 인원 : 3명

  - 리모컨 & IR센서 : 1 명

  - 모터제어, 회로 및 전원부 담당 : 2명




< 제 안 서 >

1. 제안서 제출 일자 : 2015년 07월 20일 월요일


2. 제안서 작성자 : 안향진


3. 프로젝트 명 : 온도조절 팬


4. 온도조절 팬을 만들고자 하는 계기

  • 모터(스테핑모터 또는 서보 모터) 제어능력 향상 

  • AVR의 제어 능력 향상

    (PWM, USART, 인터럽트, ADC 등...)

  

5. 주요 구현 기술

  • 모터(스테핑모터 또는 서보 모터)를 이용한 팬 구동

  • Character LCD를 이용한 데이터 디스플레이

  • USART 통신으로 PC에서 구동할 온도, 모터ID 및 속도 설정

  • 마이크로 컨트롤러 프로젝트 수행능력


6. 프로젝트 사양

  • 총 소요 기간 : 20일, 4주

  - 1주 : 기술 검토, 모터와 센서 테스트 및 코드 작성

  - 2주 : 코딩 및 회로구성과 바디제작, 중간보고서 작성

  - 3주 : 코딩 및 동작 테스트, 중간보고서 제출

  - 4주 : 테스트 및 디버깅, 최종 마무리 구현

  - 프로젝트 종료 1주일 내 결과 보고서 제출 및 발표

  • 개발 인원 : 1명

  - AVR으로 모터와 센서 제어 : 1명



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

20150722  (0) 2015.07.23
20150721  (0) 2015.07.22
20150717  (0) 2015.07.19
20150716  (0) 2015.07.17
20150715  (0) 2015.07.16
Posted by ahj333
,

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

AVR

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

<AVR2560>


=DC모터UART로 제어


<USART.H>

#ifndef __USART_H__
#define __USART_H__
//#include "smart.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "stepmotor.h"

#define INTERRUPT 1

#define F_OSC  ((unsigned long)16000000)
#define BAUD    9600//115200
#define UBRR_H  ((unsigned long)((F_OSC/(16.0*BAUD)) - 0.5)>>8)
#define UBRR_L  ((unsigned long)((F_OSC/(16.0*BAUD)) - 0.5))

unsigned char cInChar;



void USART0_Init(void);
void USART0_Tx(unsigned char );

void USART1_Init(void);
void USART1_Tx(unsigned char );

void USART_Print(const unsigned char * , int );
void UBRR0_BaudChg(int);

unsigned char USART0_Rx( void );
unsigned char USART1_Rx( void );
unsigned char USART0_RX_Scan( void );
void ISR_Enable(void);
void __vector_25(void)__attribute__((signal,used, externally_visible));
//char * Get_ins(void);
int Get_detect(void);
void Copy_ins();
void Copy_ins2(char ** );
#endif //__USART_H__


=

<USART.C>

#include "usart.h"

//속도/UART 셋팅 
#if INTERRUPT // INTERRUPT RX
static volatile int ichcnt = 0;
static char ins[128= {0
};
static int detect=0;
static char data[128];
static char temp[10][10= {{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}};


void USART0_Init(void)
{
  
  
//UBRR0H = UBRR_H;
  //UBRR0L = UBRR_L;
  UBRR0 = ((unsigned long)((F_OSC/(16.0*BAUD)) - 0.5)); // 
  //UBRR0 = 0;
  UCSR0A = (0<<U2X0)|(0<<MPCM0);
  UCSR0B 
= (1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0)|(0<<UCSZ02);
  UCSR0C 
= (0<<UMSEL01)|(0<<UMSEL00)|(0<<UPM01)|(0<<UPM00)|(0<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00);
  ISR_Enable();
  
return
;
}

void UBRR0_BaudChg(int i)
{
  
if(0 == i)
    UBRR0 
= 0;
  
else
    UBRR0 = ((unsigned long)((F_OSC/(16.0*BAUD)) - 0.5));
}

void USART1_Init(void)
{
  DDRD 
= 0xFB;    //recommendation 11111011
  //DDRD = 0xFF;  // LED OUT
  
  UBRR1H 
= UBRR_H;
  UBRR1L 
= UBRR_L;

  UCSR1A 
= (0<<U2X1)|(0<<MPCM1);
  UCSR1B 
= (1<<RXCIE1)|(1<<RXEN1)|(1<<TXEN1)|(0<<UCSZ12);
  UCSR1C 
= (0<<UMSEL11)|(0<<UMSEL10)|(1<<UPM11)|(0<<UPM10)|(0<<USBS1)|(1<<UCSZ11)|(1<<UCSZ10);
  ISR_Enable();
  
return;
}

void ISR_Enable(void)
{
  SREG 
|= 0x80// setting => Global INT enable    
}
/*
char * Get_ins(void)
{
    detect 
= 0;
    return chtemp;
}
*/
int Calc_Ang(int val) // 각도 계산
{
  
unsigned long temp = (unsigned long)(val*(1023.0/300.0
));
  
//unsigned long temp = (val*3.41);

  //char c[4] ={0};
  
  
//c[0] = ((int)temp/100);
  //c[1] = (((int)temp%100)/10);
  //c[2] = (((int)temp%100%10));
  //USART_Print(c,4);

  return (int)temp;
}


char para[128]; // PACKET pata
void Make_Packet(char Id, char Inst, char Paralength) // 패킷 만들어 보냄 
{
  
char gbpTxBuffer[128]; 
  
char bCount,bCheckSum,bPacketLength;

   gbpTxBuffer[
0= 0xff;
   gbpTxBuffer[
1= 0xff;
   gbpTxBuffer[
2= Id;
   gbpTxBuffer[
3= Paralength+2;

  
//Length(Paramter,Instruction,Checksum)

   gbpTxBuffer[4= Inst;
    
   
for(bCount = 0; bCount < Paralength; bCount++)
   {
     gbpTxBuffer[bCount+
5= para[bCount];
   }

   bCheckSum 
= 0;
  bPacketLength 
= Paralength+4+2;

   
for(bCount = 2; bCount < bPacketLength-1; bCount++) //except 0xff,checksum
   {
     bCheckSum +
= gbpTxBuffer[bCount];
   }
  
   gbpTxBuffer[bCount] 
= ~bCheckSum; //Writing Checksum with Bit Inversion  RS485_TXD;
  /*
   for(bCount 
= 0; bCount < bPacketLength; bCount++)
   {
     sbi(UCSR0A,6);//SET_TXD0_FINISH;
     TxD80(gbpTxBuffer[bCount]);
   }
   while(!CHECK_TXD0_FINISH); //Wait until TXD Shift register empty   RS485_RXD;
  */
  USART_Print(gbpTxBuffer,bCount+1);
   
return;//(bPacketLength); 
}

void Copy_ins()
{
  
int ang = 0;
  
  
int i = 0;
  
int j = 0;
  
int cnt = 0;

  
while(1)
  {
    data[i] 
= ins[i];

    
if(';' == ins[i])
      
break;
    i++;
  }
  data[++i]
=0;
  i 
= 0;


  memset(para,
0,128);
  
while(1)
  {
    
    
if('|' == data[i])
    {    
      cnt++;
      i++;
      j 
= 0;
    }
    
    temp[cnt][j] 
= data[i];
    ++i;
    ++j;

    
if(';' == data[i])
      
break;
    
  }

  
// ID | INS | ADDR | VAL
  
  j 
= 0;
  
for(i = 0; i <= cnt-2; ++i,++j)
  {

    
if(( 0 == strcmp(temp[i+2], "PGP")) ||0 == strcmp(temp[i+2], "pgp")) )
    {

      para[j] 
= P_GOAL_POSITION_L;
      
continue;
    }
    
else if(( 0 == strcmp(temp[i+2], "PGS")) ||0 == strcmp(temp[i+2], "pgs")) )
    {
      para[j] 
= P_GOAL_SPEED_L;
      
continue;
    }

    
if(para[j-1== P_GOAL_POSITION_L)
    {
      USART_Print(
"aaaa"4);
      ang 
= Calc_Ang(atoi(temp[i+2]));
      para[j] 
= ang;
      para[++j] 
= ang>>8;
    }
    
else
    {
      para[j] 
= atoi(temp[i+2]);
    }
  }      


  
if(( 0 == strcmp(temp[1], "IW")) ||0 == strcmp(temp[1], "iw")) )
  {
    Make_Packet(atoi(temp[
0]), INST_WRITE, j);
  }
  
else if(( 0 == strcmp(temp[1], "IRW")) ||0 == strcmp(temp[1], "irw")) )
  {
    Make_Packet(atoi(temp[
0]), INST_WRITE, j);
  }
  
else if(( 0 == strcmp(temp[1], "IA")) ||0 == strcmp(temp[1], "ia")) )
  {
    Make_Packet(atoi(temp[
0]), INST_WRITE, j);
  }
  
else if(( 0 == strcmp(temp[1], "IR")) ||0 == strcmp(temp[1], "ir")) )
  {
    Make_Packet(atoi(temp[
0]), INST_WRITE, j);
  }
  
else if(( 0 == strcmp(temp[1], "ISW")) ||0 == strcmp(temp[1], "isw")) )
  {
    Make_Packet(atoi(temp[
0]), INST_WRITE, j);
  }
  
else if(( 0 == strcmp(temp[1], "ISRW")) ||0 == strcmp(temp[1], "isrw")) )
  {
    Make_Packet(atoi(temp[
0]), INST_WRITE, j);
  }

  _delay_ms(
1000);
  
  memset(temp,
0,10*10);
  memset(data,
0,128);
  memset(ins,
0,128);
  ichcnt 
= 0;

  
return
;
}

int  Get_detect(void)
{
  
int i = 0;

  
for(i = 0; i<128; ++i)
  {
    
if(ins[i] == ';')
    {      
      Copy_ins();
      ichcnt 
= 0;
      
return 1;
    }
  }
  
return 0;
}

void __vector_25(void
// TIMER0 COMPARE A
//ISR(USART_RX_vect)
{

    ins[ichcnt] = UDR0;
    ichcnt++;

  
return
;
}

#else
//속도/UART 셋팅 
void USART0_Init(void)
{
  
//UBRR0H = UBRR_H;
  //UBRR0L = UBRR_L;
  //UBRR0 = 0; // 1000000
  UBRR0 = ((unsigned long)((F_OSC/(16.0*BAUD)) - 0.5)); // 

/*
  UCSR0A 
= 0b00000000;//(0<<U2X0)|(0<<MPCM0);
  UCSR0B 
= 0b00001000;//(0<<RXEN0)|(1<<TXEN0)|(0<<UCSZ02); // 0100
  UCSR0C 
= 0b00000110;//(0<<UMSEL01)|(0<<UMSEL00)|(0<<UPM01)|(0<<UPM00)|(0<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00); //100
*/
  UCSR0A = (0<<U2X0)|(0<<MPCM0);
  UCSR0B 
= (0<<RXEN0)|(1<<TXEN0)|(0<<UCSZ02); // 0100
  UCSR0C = (0<<UMSEL01)|(0<<UMSEL00)|(0<<UPM01)|(0<<UPM00)|(0<<USBS0)|(1<<UCSZ01)|(1<<UCSZ00); //100

  /*
  UCSR0A 
= (0<<U2X)|(0<<MPCM);
  UCSR0B 
= (1<<RXEN)|(1<<TXEN)|(0<<UCSZ2);
  UCSR0C 
= (0<<UMSEL)|(1<<UPM1)|(0<<UPM0)|(0<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);
  */
  return;
}

void UBRR0_BaudChg(int i)
{
  
if(0 == i)
    UBRR0 
= 0;
  
else
    UBRR0 = ((unsigned long)((F_OSC/(16.0*BAUD)) - 0.5));
}

void USART1_Init(void)
{
  
//UBRR1H = UBRR_H;
  //UBRR1L = UBRR_L;
  //UBRR1 = 0;
  UBRR1 = ((unsigned long)((F_OSC/(16.0*BAUD)) - 0.5)); // 

  UCSR1A = 0b00000000;//(0<<U2X1)|(0<<MPCM1);
  UCSR1B = 0b00001000;//(0<<RXEN1)|(1<<TXEN1)|(0<<UCSZ12);
  UCSR1C = 0b00000110;//(0<<UMSEL11)|(0<<UMSEL10)|(0<<UPM11)|(0<<UPM10)|(0<<USBS1)|(1<<UCSZ11)|(1<<UCSZ10);

  return;
}
#endif


void USART0_Tx( unsigned char ucData )
{
  
//Wait for empty transmit buffer - polling 방식 
  while ( 0 == ( UCSR0A & (1<<UDRE0)) ); // write ok신호 까지 정지 : (1<<UDRE) : MASK - 특정 비트 추출
  
  
//Put data into buffer, sends the data
  UDR0 = ucData;

  
return
;
}

void USART1_Tx( unsigned char ucData )
{
  
//Wait for empty transmit buffer 
  while ( 0 == ( UCSR1A & (1<<UDRE1)) ); 
  
  
//Put data into buffer, sends the data
  UDR1 = ucData;

  
return;
}

void USART_Print(const unsigned char * ucString, int cnt) 
{
  
const unsigned char * temp = ucString;
  
int i=0;

  
for(i = 0; i < cnt ; ++i)
  {
    USART0_Tx(*temp);
    
//USART1_Tx(*temp);
    ++temp;
  }

  
return
;
}

unsigned char USART0_RX_Scan( void )
{
  
if ( 0 == (UCSR0A & (1<<RXC0)) ) // P184
    return 0x00;
  
else
    return UDR0;
}

unsigned char USART0_Rx( void )
{
  
// Wait for data to be received 
  while ( 0 == (UCSR0A & (1<<RXC0)) ); // P184
  
  
// Get and return received data from buffer 
  return UDR0;
}

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

=통신으로 제어



=결과





==스테핑 모터

=서보모터 : 정해진 위치(몇도)까지 동작


=스테핑 모터


극수에따라 지금상태에서 몇도씩 회전 (자동차 계기판 , 시계, )


(빛감지해서 주파수 알아냄 - 고속/ 저속 판단)

(실험실 데이터 테이블화로



=

-1920년 영국 군함에 처음 사용하기 시작하였으며,  어뢰, 포신의 방향 조정에 사용  step-by-step 모터 라 불리었다.-

-미국에서는 STEP MOTOR, STEPPER MOTOR, 또는 STEPPER, 펄스모터 , 보전전동기라 불리어짐. 그 후 세계적으로 STEPPING MOTOR 사용되어짐.

-스테핑 모터는 기계적 구조나 전자회로가 간단하고, 디지털 제어에 적합한 모터이다.  긴거리의 위치제어는 서보가 유리하지만 짧은 거리의 위치제어는 스테핑 모터가 빠른 응답특성을 나타낸다.  또한 가격이 저렴하기 때문에 저용량, 초고정밀도를 필요하지 않는 곳에 사용되어짐.

-1975년도 프린터, 플로터, 복사기, 전동타자기등  OA 기기등으로 인하여 사용처가 많아짐.

-현재 5상 모터의 2만 펄스로 구동하는 모터가 개발되어 사용되고 있음. (고속, 정밀도 향상, 스텝각 0.45도)



=2상 : 1.8 도/1 STEP - 6 PIN(VCC/GND/A/A'/B/B' ( 5상 : 0.72 도/1 STEP - 12 PIN)


-SETP 각


-Pulse


-각도제어 : 입력 펄스 수

-속도제어 : 주파수



-motor의 총 회전각은 입력 pulse수의 총 수에 비례하고, motor의 회전속도는 초(sec)당 입력 pulse 수(PPS)에 비례

-1 step 당 각도 오차가 ±3분(0.05°)이내이며 회전각 오차는 step마다 누적되지 않는다.§


-회전각 검출을 위한 feedback이 불필요하여, 제어계가 간단해서 가격이 상대적으로 저렴하다.

-DC motor등과 같이 brush교환 등과 같은 보수를 필요로 하지 않고 신뢰성이 높다.

-모터축에 직결하므로써 초저속 동기 회전이 가능하다.

-기동 및 정지 응답성이 양호하므로 servo motor로써 사용가능하다.

-어느 주파수에서는 진동, 공진 현상이 발생하기 쉽고, 관성이 있는 부하에 약하다.

-고속 운전시에 탈조하기 쉽다.

-보통의 driver로 구동시 권선의 인덕턴스 영향으로 권선에 충분한 전류를 흘리게 할 수 없기 때문에 pulse rate가 상승함에 따라 torque가 저하하며 DC motor에 비해 효율이 떨어진다.


(공진 - 공진 주파수( 다리 설계, ..유리잔 깨짐)


-증폭기 ( 3A까지 )


-(전용드라이버X)드라이버 만들어 사용 => 원가 절감


-

구동회로는 제어회로로부터 출력된 구동신호에 의해서 모터의 각상에 전류가 흐르도록 하는 회로이다. 주요 구성은 제어회로부터 정회전 혹은 역회전 구동펄스를 입력 받아 각상의 스위칭 소자에 각각의 여자방식에 따른 스위칭 패턴을 발생시키는 상여자구동부와 이러한 스위칭 패턴을 입력 받아 모터의 각 상을 순차적으로 여자시키는 전력변환부로 구성되어 있다. 여기서는 모터 각 상의 권선에 흐르는 전류의 방향에 따라서유니폴라(UNIPOLAR)구동방식과 바이폴라(BIPOLAR)구동방식으로 분류된다.


=4S42Q - H120 - 36 - S









=

-탈조현상 : 각 상의 권선전류에 의해서 발생되는 고정자측의 회전자계가 너무나 빠른 속도로 회전하기 때문에 특정한 관성을 갖고 있는 회전자가 이를 쫓아가지 못하게 되는 현상

-슬루우 영역 : 인입토오크곡선과 탈출토오크곡선 사이의 영역을 슬로우영역이라 한다. 최대자기동주파수 이상의 구동펄스를 스텝적(일시적)으로 인가하지 않고 서서히 증가시키면(또는 감소) 최대자기동주파수 이상의 구동주파수로도 탈조를 일으키지 않고 모터를 회전시킬 수 있다. 이와 같은 형태로 운전하게 되면 모터는 최대응답주파수 이하의 주파수 영역에서는 운전이 가능함을 알 수 있다.  이와 같이 최대자기동주파수 이상에서 최대응답주파수 미만의 운전 가능한 주파수 영역을 슬루우영역이라 한다.

-인입토오크 : 동기회전으로 인입할 때의 최대토오크를 나타낸다. 즉, 스텝입력에 의해서 나타낼 수 있는 최대토오크를 말한다.

-탈출토오크 : 자기동영역을 초과해서 스태핑모터가 동기를 잃지 않고, 발생할 수 있는 최대토오크를 말한다.

-여자시 최대정지토오크(홀딩토오크) : 정격전류를 유지하고, 출력측에 외부토오크를 가하여 각도의 변위가 생겼을 때에 발생하는 최대 토오크를 말한다.

-주파수 : 스테핑 모터를 구동하는 신호를 단위시간당의 펄스수로 표시한다    [PPS ; Pulse Per Second]

-자기동영역 : 외부에 부여되는 신호에 동기해서 탈조(동기이탈)현상이 일어나지 않으면서 기동, 정지, 역전을 할 수 있다. 즉, 순간적으로 구동펄스를 인가하여도 모터는 정확히 기동, 정지, 역전을 할 수 있는 주파수 영역을 나타낸다. 무부하 상태에서 이와 같이 자기동 할 수 있는 최대의 구동주파수를 “최대자기동주파수”라고 한다. 이러한 최대 자기동주파수 이상의 주파수를 갖는 구동펄스를 급격히 모터에 가해주면 탈조되어 모터는 정지상태를 유지하게 된다.







=에어컨 : 냉매 압축 응축 => 팽창 (열을 흡수) => 밸브 열고 닫을 때 스테핑 모터(Eev모터)


=


=



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

ARM

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


<ARM>


=GNU ARM


=컴파일러 설치

http://itsmart333.tistory.com/attachment/cfile30.uf@25564F4F55A89D6E2456BA.pdf



http://www.doc.ironwoodlabs.com/gnuarm/gnuarm-distribution/web/www.gnuarm.com//






=SETUP GNUARM


-ARM COMPILER 설치


=TEST









=cygwin1.dll 충돌








C:\Program Files\Atmel\AVR Tools\AVR Toolchain\bin

C:\WinAVR-20100110\bin


=cygwin1.dll change

http://itsmart333.tistory.com/attachment/cfile9.uf@2517494255A8989C13D455.dll

http://itsmart333.tistory.com/attachment/cfile2.uf@2469D54255A8989E2FD7B7.dll









=





=CYGWIN 설치 - 시그너스 회사 -리눅스프로그램을 WINDOWS에서 사용 가능하도록 (리눅스 명령어를 도스창에서 사용 가능)

https://www.cygwin.com/


-SETUP

BASE - INSTALL







=환경변수 추가

-path

C:\cygwin\bin


-C:\WinAVR-20100110\utils\bin

rm.exe => rm1.exe





=컴파일 

make / make clean





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

NETWORK

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

<NETWORK>



=TCP 







=










=필요한 정보만 출력

=IP/TCP만 선택


#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);
    
if(ETH_P_IP != ntohs(*((unsigned short *)(ucpData+12)))) // 2byte 
    {
      
continue;
    }
    
if(IPPROTO_TCP != *(ucpData+23))
    {
      
continue
;
    }

    printf(
"===========================================================================\n");
    
if(ETH_P_IP == ntohs(*((short *)(ucpData+12))))
    {
      Print_Ip(ucpData+
sizeof(struct ether_header));
    }

    
if(IPPROTO_TCP ==  *(ucpData+23))
    {
      stTcp   
= (struct tcphdr *)(ucpData
          + 
sizeof(struct ether_header)
          + ((*(ucpData + 
sizeof(struct ether_header))) & 0x0F)*4);
      printf(
"Src  Port  : %d\n", ntohs(stTcp->source));                
      printf(
"Dest Port  : %d\n", ntohs(stTcp->dest));                
      printf(
"Seq  Num  : %08X\n", ntohl(stTcp->seq));                
      printf(
"Ack  Num  : %08X\n", ntohl(stTcp->
ack_seq));                

    }
  }
  pcap_close(stpDS);
  
return 0;
}

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

  printf(
"Src  IP Addr  : %s\n", inet_ntoa(v->ip_src));
  printf(
"Dest IP Addr  : %s\n", inet_ntoa(v->
ip_dst));

  
return;
}


#if 0
   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;
}

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 스마트 콘트롤러 > 업무일지' 카테고리의 다른 글

20150721  (0) 2015.07.22
20150720  (0) 2015.07.21
20150716  (0) 2015.07.17
20150715  (0) 2015.07.16
20150714  (0) 2015.07.14
Posted by ahj333
,