소켓 생성


socket() 함수는 소켓을 생성하여 반환합니다.

헤더#include <sys/types.h> 
#include <sys/socket.h>
형태int socket(int domain, int type, int protocol);
인수
int domain

: 인터넷을 통해 통신할 지, 같은 시스템 내에서 프로세스 끼리 통신할 지의 여부를 설정합니다.

 
domaindomain 내용
PF_INET, AF_INET

IPv4 인터넷 프로토콜을 사용합니다.

PF_INET6

IPv6 인터넷 프로토콜을 사용합니다.

PF_LOCAL, AF_UNIX같은 시스템 내에서 프로세스 끼리 통신합니다.
PF_PACKETLow level socket 을 인터페이스를 이용합니다.
PF_IPX

IPX 노벨 프로토콜을 사용합니다.

int type: 데이터의 전송 형태를 지정하며 아래와 같은 값을 사용할 수 있습니다. 
typetype 내용
SOCK_STREAM

TCP/IP 프로토콜을 이용합니다.

SOCK_DGRAMUDP/IP 프로토콜을 이용합니다.
int protocol: 통신에 있어 특정 프로토콜을 사용을 지정하기 위한 변수이며, 보통 0 값을 사용합니다.
반환
-1 이외: 소켓 식별자
-1: 실패

TCP/IP 소켓 프로그램을 작성해 보겠습니다.

TCP/IP 통신 함수 사용 순서

domain : 소켓이 사용되는 네트워크의 영역을 정의

다른프로그램끼리 통신하는 것을 IPX 흔히 스타크래프트 할 때 사용된다.


type & protocol

type : 통신에 사용할 패킷의 타입을 지정

protocol : 통신에 사용할 프로토콜 지정

type에 따라서 protocol이 정해짐


SOCK_STREAM & IPPROTO_TCP : TCP기반의 통신에 사용

SOCK_DGRAM & IPPROTO_UDP : UDP기반의 통신에 사용

SOCK_RAW & (원하는 프로토콜) : RAW Socket으로 저수준에서 프로토콜을 직접 다룰 때 사용


socket 함수 반환 값

성공적으로 소켓을 만들면 0보다 큰 int 값을 반환

소켓지정번호, socket descriptor(소켓 서술자, 소켓의 정보를 담고 있다.)라고 부른다.

소켓을 지시하며, 이를 이용해서 소켓을 제어한다.

일반적으로 소켓을 생성하지 못하면 0보다 작은 값을 반환한다.


IP주소 : IP -> 아파트 위치

Port번호 : TCP -> 호실        = TCP/IP

통신하려면 포트번호와 보관용 메모리 필요 이를 구조체로 선언




INET : TCP/IP 를 이용한 인터넷 주소 패밀리

데이타 연결지향의 신뢰성이 높은 Stream(흔히 TCP 라고 하는)

서버-클라이언트 환경을 만들기 위한 과정을 서버측에서 보자면 다음의 과정을 거치게 된다.

    Socket 생성 -> Socket 에 이름연결 (bind)
    -> 클라이언트의 연결을 기다림(listen)
    -> 클라이언트를 받아들임 (Accept)
    -> 클라이언트의 명령을 받아서 적절한 서비스를 수행

클라이언트측에서 서버에 접근하기 위해서는 단순히 소켓을 생성후 서버에 연결(connect) 하기만 하면 된다.

    Socket 생성 -> 서버에 연결 시도(connect) -> 서버에 각종 명령을 전달가장 먼저 소켓을 생성해야 하는데 이는 socket(2) 함수를 이용하게 된다. 여기에는 3개의 매개 변수가 전달되는데, 각각 통신 도메인의 종류, 통신타입, 사용할 프로토콜을 지원하게 된다. 일반적인 인터넷 어플리케이션의경우 도메인종류로 AF_INET, 그리고 연결지향의 신뢰성 있는 통신을 위해서 SOCK_STREAM 타입을 사용한다.프로토콜은 특별히 지정된게 없으며, 그냥 0을 사용하도록 한다. socket 를 만들었으면 통신 환경에 맞게, sockaddr_in 구조체를 체워주게 된다. 이 구조체의 내용은 다음과 같다.
struct in_addr  
{           
    short int           sin_family;
    unsigned short int  sin_port;
    struct in_addr      sin_addr;
}           
sin_family 는 소켓타입이며, sin_port 는 연결에 사용되는 port(:12) 번호이고, sin_addr 은 연결을 받아들일 IP 어드레스이다. 예제에서는 INADDR_ANY 를 사용했는데, 이는 모든 IP에 대해서 연결을 받아들이라는 뜻이다.

socket() 이용해서 만든 소켓에 이름을 할당하여 실지로 어플리케이션이 사용가능한 상태로 만들어 줘야 하는데 이를 "소켓에 이름을 할당한다" 라고 하며 bind(2) 함수를 이용해서 구현한다. <br> 그다음에 listen(2)를 이용해서 연결을 기다리고, accetp(2) 를 이용해서 연결을 받게 된다. accept 를 이용해서 연결이 완성되면 accept(2) 는소켓과 연결되는 "파일 지시자"를 돌려주고 이 "파일 지시자" 를 통해서 클라이언트와 서버간의 메시지를 주고 받게 된다.

일단 연결이 이루어진다음에 서버가 하는일은 간단하다. 클라이언트의 문자열을 읽어들이고(지역이름), 파일에서 이 지역을 포함한 주소가 있는지 확인해서, 이를 클라이언트측에 전송해주면 된다. 주소검색이 모두 끝났다면 "end" 문자열을 클라이언트에 돌려줌으로써, 모든 검색이 끝났음을 클라이언트에게 알려준다.







connect 함수 메뉴얼



connect 함수의 사용 예

struct socketaddr_in_serveraddr


server_sockfd = socket(AF_INET, SOCK_STREAM, 0);

serveraddr.sin_family = AF_INET;

serveraddr.sin_addr.s_addr = inet_addr("218.234.19.87");

serveraddr.sin_port = htons(8080);

//htons -> (host to network) int    (s) short

//ntohs -> (network to host) int    (s) short

client_len = sizeof(serveraddr);

connect(server_sockfd, (struct sockaddr *)&serveraddr, client_len);


Internet TCP/IP 통신

218.234.19.87 주소로 연결 요청

8080 포트에 연결된 프로그램을 요청

메모리의 크기도 알고있어야 한다.


연결 해보기!!!!


htons에 대한 메뉴얼

여러 가지가 나와 있는데 우리는 지금 htons를 쓰기 때문에 

//htons -> (host to network) int    (s) short

//ntohs -> (network to host) int    (s) short

자세한 설명은 나중에 하도록 하겠다.


inet_addr에 대한 메뉴얼

원래 stAddr.sin_addr.s_addr의 주소를 넣을 때 192.168.10.19 주소를 넣는다면 문자를 16진수로 바꿔서 넣기 때문에 


socket에 대한 메뉴얼



      1 #include <stdio.h>

      2 #include <sys/types.h>

      3 #include <sys/socket.h>

      4 #include <arpa/inet.h>

      5 #include <linux/types.h>

      6 #include <netinet/in.h>

      7 int main()

      8 {

      9         struct sockaddr_in stAddr;

     10         int iSoc;

     11         int iRet;

     12         iSoc = socket(AF_INET, SOCK_STREAM, 0);

     13         if(-1==iSoc)

     14         {

     15             printf("소켓을 생성할 수 없습니다.\n");

     16             return 0;

     17         }

     18         stAddr.sin_family = AF_INET;

     19 //소켓의 첫 번째 인자를 넣는다.

     20         stAddr.sin_port = htons(4000);

     21         stAddr.sin_addr.s_addr = inet_addr("192.168.10.19");

     22         iRet=connect(AF_INET,(struct sockaddr *)&stAddr,sizeof(stAddr));

     23         if(iRet!=0)

     24         {
     25             printf("연결에 실패하였습니다.\n");
     26             close(iSoc);
     27             return 0;
     28         }
     29         printf("iSoc : %d\n iRet : %d \n",iSoc, iRet);
     30         close(iSoc);
     31         return 0;
     32 }      

네트워크 서버에 접속이 되었음!!!!!!!(클라이언트 성공!!!!)

20140612 - 초음파 센서

ATMega256 2014. 6. 12. 13:54 Posted by Owen.K


초음파 센서

ATMega1280에서 소스를 그대로 가져와서

ATMega2560에 맞게 수정하였다.

 

- usonic.h







- usonic.c






요것만 바꾸고 실행하면 된다.



그런데 ATMega128 때에도 거리 측정 값이 좀 이상했다.

눈 대중으로만 봐도 20Cm 는 넘는 거리인데, 10Cm 밖에 안나온다는 것...

ATMega128 때는 그냥 넘어갔지만 이번엔 자세히 살펴보았다.


여러 Reg 를 살펴보고 값도 바꾸어 보았지만

알수가 없었는데 normal mode는 이중 버퍼가 안된다는 것을 대충 보았다.

뭔말인지 이해할 수 없었지만 혹시 TCNT0 값에 문제가 있는가 보았다.


usonic.c 소스에 아래 코드를 추가하여 값을 확인해 본 결과,



TCNT0 값이 118을 넘겼을 때에 0으로 초기화되는지 알았는데

118에 도달했을때? 인터럽트만 발생시키고 계속 값이 차올랐다.

그러니 비교방식을 써봐야 별 의미가 없었다.


그래서 0으로 초기화 시켜주는 소스를 추가하고 나니

그나마 근사치?로 나왔다.


네트워크 기본 개념


IP주소

- 인터넷에 존재하는 호스트(종단 시스템, 라우터)를 유일하게 구별할 수 있는 식별자

- IPv4는 32비트, IPv6는 128비트 사용

- 8비트 단위로 구분하여 10진수로 표기(IPv4)

ex) 147.46.114.70


포트 번호

- 통신 종착지(하나 혹은 여러 개의 프로세스)를 나타내는 식별


도메인 이름(Domain Name Service)

- IP주소에 대한 (기억하기 쉬운) 별명

- 실제통신을 하기 위해서는 IP 주소로 변환해야 함.


클라이언트/서버 모델

- 두 개의 애플리케이션이 상호 작용하는 방식을 나타냄

서버가 먼저 실행하여 대기

클라이언트가 서버에게 요청을 하면 서버는 요청을 받아서 처리


여기까지 이론...;;


기본 네트워크 프로그래밍



소켓 생성

기본형 int socket(int domain, int type, int protocol)

domain - AF_INET = 인터넷으로 연결된 프로세스들 간에 통신한다.

   AF_UNIX = 한 시스템 내의 프로세스들 간에 통신한다.


type - SOCK_STREAM =  TCP 방법을 이용해 통신한다.

    SOCK_DGRAM =  UDP 방법을 이용해 통신한다.


protocol





20140611 - TWI(I2C) 통신 한방 복습!!!

ATMega256 2014. 6. 11. 12:49 Posted by Owen.K

TWI(I2C) 통신


TWI(2 Wire Interrupt)에 대해서 다시 한번 복습해보쟈!!

4.7.1 TWI(I2C) 통신의 이해


TWI(Two-Wire Serial Interface)는 일반적인 마이크로 컨트롤러 응용 제품에게 이상적이다. 

하나의 클럭(SCL) 과 하나의 데이터(SDA) 선으로 구성된 두 개의 버스 선으로 128개의 서로 다른 디바이스를 제어할 수 있다. 외부 하드웨어는 각 버스 선에 독립적인 pull-up 저항만 있으면 된다. 아래 그림은 TWI를 사용하여 연결된 디바이스들이다.


주요 특징은 다음과 같다.


- 단지 두 개의 버스 선을 사용하는 간단하고 효율적인 통신 방식

- 마스터(master)와 슬레이브(slave) 동작을 모두 지원

- 디바이스에서 송수신이 모두 가능

- 7비트 주소를 이용하여 128개의 다른 슬레이브 주소가 가능

- 400kHZ 데이터 속도 까지 지원


4.7.2 TWI 통신의 활용



위 그림과 같이 DK128-MAIN에서는 25번 핀이 SCL이고 26번 핀이 SDA이다. 그리고 아래는 DK128-EXT 보드인데 DK128에서는 TWI 통신을 지원하는 디바이스로 EEPROM인 AT24C16을 선택하였다. AT24C16을 선택하였다. AT24C16의 회로도는 아래와 같다. DK128-EXT 보드의 J18 헤더 핀의 1번 핀이 SCL이고 2번 핀이 SDA이다. 


ATMega128에서는 TWI 통신을 위한 레지스터를 제공하고 있는데 여기서는 제공된 TWI 관련 레지스터를 사용하기 때문에 그에 대해 설명을 하기로 한다.

1)TWBR(TWI Bit Rate Register)


TWBR은 TWI의 전송속도를 설정하는 레지스터이다. 전송 속도는 다음과 같이 계산한다.


AT24C16의 데이터시트에 나와 있는 것과 같이 5V에서는 400kHz로 동작을 하므로 SCL frequency는 400k이다. DK128은 16MHz의 크리스털을 사용하기 때문에 CPU Clock Frequency는 16M가 된다. TWPS는 TWI Status Register에서 설정하는 값이다. 여기서는 TWPS를 00으로 설정할 것이기 때문에 여기서 정해지는 TWBR 값이 계산된다.


2) TWCR(TWI Control Register)


Bit 7 - TWINT : TWI Interrupt Flag

이 비트는 현재 작업이 끝났을 때 하드웨어에 의해서 1로 설정된다. SREG의 I비트와 TWCR의 TWIE가 1로 설정되었다면, MCU가 TWI 인터럽트 벡터로 점프시킨다. TWINT 플래그는 해당 비트를 1로 쓰는 것으로 소프트웨어에 의한 클리어를 해야만 한다. 이 비트는 하드웨어에 의해 자도이으로 클리어 되지 않는다. 그래서 TWI 연산을 하기 위해 처음에 클리어 되어야만 한다.

Bit 6 - TWEA : TWI Enable Acknowledge Bit

TWEA 비트는 ACK 신호를 만들어 준다. TWEA 비트가 1로 되어 있고 다음 조건을 만족하면 TWI 버스에 ACK 신호를 실어준다.

- 디바이스가 자신의 슬레이브 주소를 받았을 때

- 수신 모드에서 데이터를 한 바이트 수신했을 때

일반적으로 ACK 신호는 위와 같은 경우에 상대방에게 자신이 잘 수신했다는 것을 알려주기 위해 사용된다. 아래 그림은 ACK 신호의 실제 파형이다. SCL이 9번째 High가 되었을 때 데이터 즉, SDA를 Low로 만드는 것이 ACK 신호가 된다.


Bit 5 - TWSTA : TWI START Condition Bit

TWI 마스터로 동작할 때 버스가 비어 있다면 START 조건을 만들어 준다. 비어있지 않다면 STOP 조건이 될 때 까지 기다린다. START 조건이 만들어 지면 소프트웨어에 의해 클리어 되어야 한다.

START 조건과 아래에 나올 STOP 조건의 실제 파형은 아래 그림과 같다. START 조건은 SCL이 High에 있을 때 SDA가 하강 엣지를 만드는 것이고 STOP 조건은 SCL이 High에 있을 때 SDA가 상승 엣지를 만드는 것이다. 시간 간격에 대한 자세한 것은 해당 디바이스의 데이터시트를 참조.



Bit 4 - TWSTO : TWI STOP Condition Bit

TWSTA와 같이 TWI 마스터로 동작할 때 STOP 조건을 만들어 준다. 실행되고 나면 자동으로 클리어 된다.


Bit 2 - TWEN : TWI Enable Bit

TWI 동작을 활성화 시키기 위해 1로 설정해야 한다. 0으로 설정되면 TWI의 모든 동작이 멈추게 된다.


Bit 0 - TWIE : TWI Interrupt Enable Bit

이 비트가 1로 설정되고 SREG의 I비트가 1로 설정되면 TWINT 플래그가 High가 되었을 때 TWI 인터럽트가 발생한다.


3)TWSR(TWI Status Register)



Bits 1..0 - TWPS : TWI Prescaler Bits

TWI 속도를 설정하기 위해 분주비를 설정하기 위한 비트이다. 여기서 설정된 값을 참조하여 위에서 설명했던 TWBR에 설정할 수 있는 값이 결정된다. 여기서는 분주를 하지 않고 00으로 설정하여 사용한다.



4) TWDR(TWI Data Register)


TWDR은 송수신용 데이터를 담고 있는 레지스터이다. 송신 모드에서는 TWDR에는 전송할 다음 바이트 데이터가 있고, 수신 모드에서는 마지막에 받은 바이트 데이터가 있다.


위 그림은 ATMega2560 datasheet에 나와 있는 TWI동작 순서이다. 아래 부분은 하드웨어가 처리하는 부분이므로 소프트웨어에서는 응답을 기다리는 동작을 구현하면 된다. 각 번호 별로 설명을 하면 다음과 같다.


우선 AT24C16은 5V에서 400kHz로 동작을 하며 16K의 메모리 저장 공간을 가지고 있다. 100만 번의 쓰기를 지원하며 저장된 데이터는 100년 정도 보관이 된다. 아래 그림은 디바이스 주소로 사용되는 데이터 포맷이다.


데이터는 8비트 씩 읽어오게 되므로 AT24C16의 16K 메모리에 필요한 주소의 개수는 2048개이다. 이를 표현하기 위해서는 11비트가 필요한데 상위 3비트는 디바이스 주소의 뒷부분을 사용하여 해당 번지를 지정한다. 하위 8비트는 그 뒤의 데이터 공간에 저장되어 전송된다. 아래는 바이트 단위로 저장할 경우의 데이터 포맷을 보여준다. 


먼저 START 조건을 만들어 준다. 주고 난 후 디바이스 주소를 전달해야 하는데 위 그림에서 보는 것과 같이 AT24C16의 디바이스 슬레이브 주소는 0xA0이다. 다만 보낼 때 WORD 단위의 주소의 상위 3비트를 포함하고 R/W 여부를 마지막 비트로 하여 전달한다. 쓰기의 경우에는 해당 비트를 0으로 만들어야 한다. 전송이 성공하여 ACK 신호를 받은 후에 나머지 8비트 주소 값을 전달하고 실제로 저장할 데이터를 전송한다. 데이터가 보내진 후에는 다시 ACK 신호를 받는다. ACK 신호는 ATmega2560이 처리를 해주기 때문에 사용자가 신경을 쓰지 않아도 된다. 다 전송이 끝나면 STOP 조건을 보내주어 전송을 종료한다. AT24C16에 데이터 시트에는 쓰는 시간의 최대값을 10ms로 정하고 있다. 쓰기가 완료될 때까지 이 시간만큼 대기한다. 



20140610 - 네트워크 개념

네트워크 2014. 6. 10. 17:23 Posted by Owen.K

네트워크 개념


네트워크란 무엇인가? 먼저 단어를 살펴보면 Net + Work이다 Net는 본래 뜻이 '그물'이고 Work는 작업이므로 그대로 직역한하면 '그물일'이 될 것이다. 그러나 우리가 다루려는 네트워크는 정확히 말하면 'Computer Networking'으로서 컴퓨터를 이용한 '그물작업'이 될 것이다. 부드럽게 번역한다면 '컴퓨터를 이용한 협동작업'쯤 될 것이다.

필자는 네트워크의 정의를 이렇게 내린다. '어떤 연결을 통해 컴퓨터의 자원을 공유하는 것'. IEEE(Institute of Electrical and Electronics Engineers:국제 전기 전자 공학회)에서는 네트워크, 그중에서도 LAN을 다음과 같이 정의 하였다. "몇 개의 독립적인 장치가 적절한 영역내에서 적당히 빠른 속도의 물리적 통신 채널을 통하여 서로가 직접 통신할 수 있도록 지원해 주는 데이타 통신 체계". 차이는 있어도 요지는 통신을 한다는 것이다.

이제부터 네트워크에 대해 좀더 구체적인 개념을 잡기 위해 역사를 살펴보겠다. 모든일은 그 원리, 개념을 파악하면 훨씬 더 빨리, 명확하게 이해하고 자기것으로 만들 수 있다. 


 

네트워크의 개념
  1. 모뎀이나 랜, 케이블 또는 무선 매체 등의 통신 설비를 갖춘 컴퓨터를 이용하여 서로 연결시켜 주는 통신망을 의미
  2. 단 두대의 컴퓨터를 연결하든, 그 이상의 컴퓨터를 연결하는 것이든지 상관없이 필요에 의한 컴퓨터들의 연결을 말한다.

  • 네트워크의 이점
  1. 데이터 동시 접근 : 다수의 사용자가 같은 데이터에 동시에 접근하는 경우가 종종 발생하는 것을 데이터 동시 접근이라 한다.
읽기전용 : 공유장치에 저장된 데이터를 읽기만 할 수있는 권한을 가진 것
읽기/기록 : 네트워크 서버로부터 공유된 파일을 읽고 수정할 수 있고, 사용자들의 공유된 파일의 읽기 / 기록 권한을 갖는다.
        2.  주변장치 공유 : 연구실이나 사무실에서 단일 네트워크로 컴퓨터들을 연결하는 것 (값비싼 주변장치들을 공유함으로써 얻는 이점)

 -장점 : 하나의 레이저프린터를 네트워크 연결하여 공유함으로써 비용절약

스풀링(spooling)이라는 프로세스를 이용하여 다수의 사용자들은 하나의 프린터에 여러가지 작업을 보낼 수 있다.

-단점 : 같은 연구실 / 사무실 내에서 모든 사용자가 프린터를 하나씩 소유한다면 비용 면에서 효율적이지 못하다.
중복된 여러개의 프린터를 구입하는 비용을 배제하여도 운용이나 소모품에 들어가는 비용은 소유자들에게 부담

        3. 능률적인 통신 (ex : e - mai)

        4. 손쉬운 백업





  • 광역 네트워크 : 두 개 이상의 근거리 네트워크가 넓은 지역에 걸쳐 연결되어 있는 것    
       
 -게이트웨이 : 서로다른 통신망, 프로토콜을 사용하는 네트워크간의 통신을 가능하게하는 소프트웨어를 일컫는용어.
                                      게이트웨이를 지날 때마다 트래픽이 증가하기 때문에 속도가 느려질 수 있음.
                (ex : 해외로 나가기 위해 꼭 통과해야하는 공항과 같은 개념)
               



 - Ethernet - LAN을 위해 개발된 컴퓨터 네트워크 기술 / 가장 광범위하게 설치된 근거리통신망 기술.
 - LAN - 가까운 지역을 한데 묶는 컴퓨터 네트워크를 LAN이라 한다.

  • 인트라넷
          



  • 통식방식
               -단방향 통신
               -양방향 통신
                    1.반이중
                         -어느 한 쪽이 데이터를 송신하면 상태편은 수신만 가능한 방식
                         -하나의 통신 채널을 이용하여 교대로 데이터 송수신
                         -휴대용 모뎀과 무전기를 이용한 데이터 통신
                         


                    2.전이중
                         -두 대의 단말기들 간에 동시에 데이터를 송수신하는 통신방식
                         -두 개의 통신 채널을 이용하여 양방향으로 동시에 송수신 가능
                         










TCP / IP 프로토콜
     - 인터넷의 핵심 프로토콜인 TCP와 IP를 포함한 각종 프로토콜
     - 운영체제에서 구현을 제공
     - 일반 애플리케이션은 운영체제가 제공하는 TCP/IP 프로토콜의 서비스를 사용하여 통신을 수행




TCP/IP 프로토콜 구조

   
- 위쪽 계층으로 갈수록 S/W에 가깝고 아래 계층으로 올수록 H/W에 가깝다
   - 네트워크 액세스 계층 
      ▷ 역할 : 물리적 네트워크를 통한 실제적인 데이터 전송
      ▷ 구성 요소 : 네트워크 하드웨어 + 디바이스 드라이버
      ▷ 주소 지정방식 : 물리주소
   - 인터넷 계층
      ▷ 역할 : 네트워크 액세스 계층의 도움을 받아, 전송 계층이 내려 보낸 데이터를 종단 시스템까지 전달
      ▷ 구성 요소 : 논리 주소 + 라우팅
      ▷ 주소 지정방식 : IP주소
      ▷ 라우팅(routing) : 목적지까지 데이터를 전달하기 위한 일련의 작업
   - 전송 계층
      ▷ 역할 : 최종적인 통신 목적지(프로세스)를 지정하고 오류 없이 데이터를 전송
      ▷ 주소 지정방식 : 포트번호
   - 애플리케이션 계층
      ▷ 역할 : 전송 계층을 기반으로 한 다수의 프로토콜과 이 프로토콜을 이용하는 애플리케이션을 포괄

인터넷 계층(Internet layer)
역할
네트워크 액세스 계층의 도움을 받아, 전송 계층이 내려 보낸 데이터를 종단 시스템까지 전달
전송 계층(transport layer)
역할
최종적인 통신 목적지(프로세스)를 지정하고, 오류 없이 데이터를 전송

TCPTCP와 UDP






패킷(packet)
각각의 프로토콜에서 정의한 제어 정보(IP 주소, 포트 번호, 오류 체크 코드 등) + 데이터
제어 정보의 위치에 따라, 앞쪽에 붙는 헤더(header)와 뒤쪽에 붙는 트레일러(trailer)로 구분



패킷 패킷 전송형태

(송신측)



(수신측)


20140610 - TWI 동작 Write/Read 동작

ATMega256 2014. 6. 10. 15:30 Posted by Owen.K

TWI 동작 Write/Read 동작


--- TWI도 속도에 관한 분주비가 있다.

- 계산식









- ATMega2560, EEPROM의 TWI 통신 순서








- write

소스)









- Read

소스)





source

main.zip


TWI의 데이터 송신 및 수신 포맷



 마스터가 슬레이브에게 데이터를 송신할 때는 먼저 마스터가 7비트의 슬레이브 어드레스를 보내고, 이어서 송신(transmit or write)을 의미하는 Low 상태의 1비트를 보내며, 이에 대하여 지정된 어드레스를 가지고 있는 슬레이브는 Low 상태의 1비트 확인 신호로 응답한다. 그러면 마스터는 n 바이트의 데이터를 연속으로 송신하며 각 바이트를 송신할 때마다 해당 슬레이브로부터 확인 비트로 응답을 받는다. 

  마스터가 슬레이브로부터 데이터를 수신할 때는 먼저 마스터가 7비트의 슬레이브 어드레스를 보내고, 이어서 수신(receive or read)을 의미하는 High상태의 1비트를 보내며, 이에 대하여 지정된 어드레스를 가지고 있는 슬레이브는 Low상태의 1비트 확인 신호로 응답한다. 그러면 마스터는 n 바이트의 데이터를 연속으로 수신하며 각 바이트를 수신할 때마다 해당 슬레이브에게 확인 비트로 응답한다.

  이와 같이 마스터가 슬레이브에게 데이터를 송신할 때는 마스터가 송신측, 슬레이브가 수신측이 되고, 반대로 마스터가 슬레이브로부터 데이터를 수신할 때는 마스터가 수신측, 슬레이브가 송신측이 되지만, 클럭 신호 SCL이나 START, STOP 조건은 항상 마스터가 발생한다.


TWI 레지스터 사용


  TWINT(TWI Interrupt Flag)는 TWI가 현재의 동작을 완료하고 응용 소프트웨어를 사용한 적절한 조치가 필요한 경우에 1로 셋트되면서 인터럽트를 요청한다. 이 TWINT Flag가 1로 세팅되어 있는 동안에 SCL 클록 신호가 계속하여 Low상태로 유지된다. 따라서 이 TWINT Flag 비트는 인터럽트 처리가 시작되더라도 자동으로 클리어 되지 않으며, TWAR, TWDR, TWSR 레지스터를 클리어하려면 이 비트에 1을 write해야 한다.

  TWSTA(TWI START Condition Bit)는 1로 설정하면 TWI가 마스터로서 동작하고 TWI는 버스가 사용 가능한 상태인지를 체크하여 START 조건을 출력하며, 만약 버스가 동작 상태라면 STOP 조건이 검출될 때까지 기다렸다가 START 조건을 출력한다. START 조건이 출력되고 나면 이 비트는 응용 소프트웨어에 의해 클리어 되어야 한다.

  TWEN(TWI Enable Bit)은 TWI 통신 모듈이 동작하는 것을 가능하게 하며, SDA 및 SCL 핀을 유효하게 한다.

 

Device Address



20140605 - TWI(2-Wire Serial Interface)

ATMega256 2014. 6. 5. 14:42 Posted by Owen.K

2-Wire Serial Interface

 

 

  TWI(Two-Wire Serial Interface) 직렬통신 포트는 원래 필립스사에서 제안한 근거리용 표준 직렬통신 방식인 I^2C 버스로 통신하는 방식인데, 둘 다 같은 방식이다. 2선식 직렬통신 방식으로 항상 마스터와 슬레이브 사이에서 직렬로 데이터를 송수신할 수 있다. TWI 직렬통신 포트는 여러 가지의 제어 레지스터를 통하여 유연하고 강력한 I^2C 통신을 수행할 수 있으며, 마스터와 슬레이브로 임의 사용될 수 있다. 7비트의 어드레스 지정과 100KHz, 400KHz의 통신속도를 지원하며, 멀티 마스터 조정 기능을 가지고 있다. 또한 MCU가 슬립 모드에 있을 때 슬레이브로서 어드레스 지정이 되면 슬립 모드에서 벗어나는 wake-up 기능을 가지고 있다. 

 

Byte Oriented 2-Wire Serial Interface  ->  바이트를 지향하는 2선 TW I

스트리밍 방식 - 정해지지 않은(명확하지 않은 크기의) 데이터를 그때 그때  보낼 때
                   ↕
구조체 방식(블럭 방식) - 정해진 크기의 데이터를 보낼 때 



SDA(Serial DAta), SCL(Serial CLock) 2개의 선으로 양방향 직렬통신을 수행

(2.3V~5.5V의 전원 전압을 사용)

반드시 마스터와 슬레이브 사이에 직렬 동기식 양방향 데이터 통신을 수행 

마스터가 데이터를 송신 또는 수신을 하기 위하여 데이터 SDA는 양방향 신호

마스터가 데이터 송신 또는 수신하더라도 클록 신호 SCL은 항상 마스터가 발생

100Kbps, 400Kbps, 3.4Mbps의 3가지 전송속도를 지원

마스터가 슬레이브에게 7비트 또는 10비트 어드레스로 지정 가능

마스터가 전체호출 기능으로 전체 슬레이브를 동시에 지정하는 것이 가능 

멀티마스터 조정 기능 지원 


full up 저항 -> 명확한 High/Low를 정하기 위해서....

Device 여러 개를 사용할 수 있다. ID 고유번호로 식별할 수 있다.


SCL 주파수를 구하는 공식



 시리얼 통신에서 2선 통신 중에



  


TWI와 UART 방식이 있는데 차이는 UART 두개의 선으로 따로따로 송신과 수신을 하는 반면 TWI는 SDA하나로 송수신을 한다.


I²C(Inter-Intergrated Circuit)통신

 

1980년대 초에 필립스사에서 제안한 IC소자들을 연결하기 위한 던거리용 2선식 직렬통신 버스 

특징

-SDA,SCL 2개의 선으로 양방향 직렬통신을 수행

-반드시 마스터와 슬레이브 사이에 직렬 동기식 양방향 데이터 통신을 수행

-마스터가 데이터를 송신 또는 수신을 하기 위하여 데이터 SDA는 양방향 신호

-마스터가 데이터를 송신 또는 수신하더라도 클록 신호 SCL은 항상 마스터가 발생

-100Kbps,400Kbps,3.4Mbps의 3가지 전송속도 지원

-마스터가 슬레이브에게 7비트 또는 10비트 어드레스로 지정(어드레스=장치번호 or 장치ID)

-마스터가 전체호출 기능으로 전체 슬레이브를 동시에 지정하는 것이 가능

-멀티마스터 조정 기능 지원


전체 시스템의 구성을 보게 되면 장치는 여러개 연결이 가능하며 장치의 식별은 ID(고유번호)를 통하여 한다.

풀업저항은 연결함으로서 명확한 신호(H,L)를 보장한다.

ATmaga 2560 에서는 7비트의 어드레스를 지정하는데 이것은 장치의 ID를 의미 하고 0~127까지 지정할 수 있으며 총 128개 까지 장치연결이 가능하다.

전송속도는 400Kbps를 사용하여야 한다.

전송을 시작하고 클록을 발생하며 전송을 종료하는 모든 일을 주관하는 측의 장치를 마스터(master)
마스터에 의하여 주소가 지정되어 동작하는 측의 장치를 슬레이브(slave) 라고 한다.

원래는 시작조건과 정지 조건을 LCD처럼 상황에 따라 설정을 해 주어야 하나 있는 것들은 구지 설정할 필요가 없다.


데이터 송신 및 수신 포맷 

데이터 송신

①마스터가 슬레이브에게 데이터를 송신할 때는 먼저 마스터가 7비트의 슬레이브 어드레스를 보낸다.

②송신을 의미하는 L상태의 1비트를 보낸다.

③지정된 어드레스를 가지고 있는 슬레이브는 L상태의 1비트 확인신호로 응답한다.

④마스터는 n바이트의 데이터를 연속으로 송신하며 각 바이트를 송신할 때마다 해당 슬레이브로부터 확인 비트로 응답을 받는다.

 

데이터 수신

①마스터가 슬레이브로부터 데이터를 수신할 때는 먼저 마스터가 7비트의 슬레이브 어드레스를 보낸다.

②수신을 의미하는 H상태의 1비트를 보낸다.

③지정된 에드레스를 가지고 있는 슬레이브는 L상태의 1비트 확인 신호로 응답한다.

④마스터는 n바이트의 데이터를 연속으로 수신하며 각 바이트를 수신할 때마다 해당 슬레이브에게 확인 비트로 응답한다.




TWI 블럭도


빨간표시로 된 네모가 레지스터로 총 5개가 있다.

레지스터 중 TWBR(TWI Bit Rate Register) 을 보게 되면 TWI 비트속도 레지스터로 속도주파수를 계산하는 식이 있다.

 

TWPS를 1로 가정하고 계산해 보면 TWBR이 3이 나온다.

즉, 400Kbps 속도로 하기 위해서는 TWPS 1 이면 TWBR을 3으로 해주어야 한다.

 

회로 연결

 

 

DK128에서 J18번의 1번에는 ATmega 2560  43번에  2번은  44번에 연결해 준다.



20140603 - DK-128 EXT 배워보쟈

ATMega256 2014. 6. 3. 13:29 Posted by Owen.K










20140602 - DK128-EXT 박살내까??

ATMega256 2014. 6. 2. 14:52 Posted by Owen.K

DK128-EXT



기존에 쓰던 스위치와 LED 그리고 적정한 저항이 함께 연결되어 있는 보드이다. 


LED 회로도다. R32에서 VCC가 유입되고 있고 J15에 연결하여 사용할 수 있게  8핀의 포트가 있다. J15에서 1의 데이터가 유입되고 있다면 J15와 R32의 전압차가 없기 때문에 LED는 동작을 하지 않는 상태가 된다. 하지만 J15에서 0의 데이터가 유입된다면 J15와 R32의 전압차로 인해 LED가 동작하게 된다.



S/W 회로도다. R31에서 Vcc가 유입되고 있으며 J16 에 연결하여 사용할 수 있는 8핀의 포트가 있다. R31에서 유출되는 VCC는 스위치가 On 되지 않는 이상 J16쪽으로만 흐르게 된다. S/W가 Off 상태인 포트는 J16쪽으로 항상 Vcc 가 흐르게 된다. 하지만 S/W가 On 된다면 R31에서 유출되는 Vcc는 S/W를 지나 GND로 흐르게 되며 S/W와 연결된 J16의 포트는 0의 값을 받게 된다.

예를 들어 S/W6번이 On 된다면 R31 의 2번포트에서 J16 으로 가던 Vcc 는 GND 로 흐르게 된다. 



7-segment에 대한 회로도다. 보드의 J19부분으로 연결이 되고, 우선 자세한 설명은 차후에 하겠다.


ATMega2560과 DK128-EXT가 연결된 모습.



main.zip


smart.h

ATMega2560의 PORTJ로 쓸 포트이다. PCInterrupt로 스위치를 누를 때마다

7-segment에서 카운터 PLUS, MINUS, RESET, START, STOP등에 쓰일 것이다.


INT.c

PCICR(Pin Change Interrupt Control Register)의 PCIE1(Pin Change Interrupt Enable1)은 

PCINT의 (15:8)까지 활성화 시킴.

PCMSK1(Pin Change Mask Register1)은 PCINT의 (15:8)까지 열어준다.


smart.c

PCINT1_Init이 실행 될 때 벡터10이 자동으로 실행된다.

#define PINJ (*((volatile unsigned char *)0x103))

#define PIN_J ((~PINJ)&0x1F)

DK128-EXT는 Low일 때 동작하기 때문에 위처럼 PINJ를 틸드 시켜주었다.

여튼 위처럼 PORTJ가 열렸을 때 자동으로 PINJ가 열리게 된다. 이때 0번 비트에 1을 밀어준다.

스위치에 쓰일 PLUS를 열어준다.

ucSec1이 24가 아니면 +1증가 시켜주고, 24가 되면 0으로 초기화된 것을 

sevseg_Print1을 통해 seven-segment에 찍어준다.  


smart.c

PCINT1_Init이 실행 될 때 벡터10이 자동으로 실행된다.

#define PINJ (*((volatile unsigned char *)0x103))

#define PIN_J ((~PINJ)&0x1F)

DK128-EXT는 Low일 때 동작하기 때문에 위처럼 PINJ를 틸드 시켜주었다.

여튼 위처럼 PORTJ가 열렸을 때 자동으로 PINJ가 열리게 된다. 이때 0번 비트에 1을 밀어준다.

스위치에 쓰일 MINUS를 열어준다.

ucSec1이 0이 아니면 -1감소 시켜주고, 0이 되면 24로 초기화된 것을 

sevseg_Print1을 통해 seven-segment에 찍어준다. 


smart.c

  스위치에 쓰일 RESET을 세팅 후 ucSec1을 24로 초기화 시키고, 

TC0_Uims_Reset함수를 호출하여 uiMs를 초기화 시킨 후에 sevseg_Print1을 

호출하여 처음부터 다시 7-segment에 출력한다. 


  스위치에 쓰일 START를 세팅 후에 TIMSK0(Timer/Counter Interrupt Mask Register)에

TOIE0(Timer/Counter Overflow Interrupt Enable) 오버플로우가 발생하면 인터럽트가 발생하는

비트를 활성화 시킨다. 

이렇게 스위치를 누르게 되면 인터럽트가 발생하여 START를 하게 된다. 


  스위치에 쓰일 STOP를 세팅 후에 TIMSK0(Timer/Counter Interrupt Mask Register)에

TOIE0(Timer/Counter Overflow Interrupt Enable) 오버플로우가 발생하면 인터럽트가 발생하는

비트를 틸드를 이용하여 비활성화 시킨다. 

이렇게 스위치를 누르게 되면 인터럽트가 발생하여 STOP를 하게 된다. 


실행 동영상