디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

유리한과 함께하는 AVR로 임베디드 개념쌔우기 - #7. 시리얼 통신 !!

유리한갤로그로 이동합니다. 2007.07.28 03:00:24
조회 3513 추천 0 댓글 7













유리한과 함께하는 AVR로 임베디드 개념쌔우기 - #7. 시리얼 통신 !!




아..정말 미안하다.

귀차니즘이 극에 달해서 조낸 오래 쉰것같다..

쥐도새도 모르게 싸려고 했는데..

밑에 햏햏횽 때문에 쌀수가 없었다. 제기랄.


날이 갈수록 소스가 길어진다.

이해해주길 바래.

오늘 할것은 PC와 avr간의 통신이야.
USART / UART 라는 놈이지.

usart는
The Universal Synchronous and Asynchronous serial Receiver and Transmitter
되시겠다.
직렬 동기/비동기화 통신 되시겠고..

uart는
The Universal Asynchronous serial Receiver and Transmitter
비동기 직렬되시겠다.

stop, start 비트가 존재해서
먼저 비트 보내주면 수신대기상태로 들어가고
레지스터 셋팅된대로 데이터 받아들여서 처리해주는 놈 되시겠다.

쉽게 생각하면.. 모뎀이랑 비슷하다.ㅋ



언제나 말하지만 개념쌔우기지 avr 심화 강좌가 아니야.

인터럽트는 RX 인터럽트만 사용할거고..
UART0만 사용할거다.


바로 소스랑 주석 나간다.


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


#define F_CPU   16000000UL      //16MHz


void uart0_init(unsigned long BaudRate);
int putch(char ch);
void putstr(char* str);


int main(void)
{
    cli();                  // clear interrupt. sei()와 더불어 사용. 크리티컬섹션의 역할.
    uart0_init(38400);      // uart0 initialize. baudrate = 38400
    fdevopen(putch, NULL);  // 반드시 함수의 return형은 int, arg는 char형이어야 함
    DDRA=0xFF;              // PORTA 출력핀으로 설정
    PORTA=0x01;
    sei();                  // set enable interrupt


    while(1);


    return 0;
}


void uart0_init(unsigned long BaudRate)
{
    // Not Double mode, Not multi_communication
    UCSR0A=0x00;
    // 0b 1001 1000 RXCIE,TXCIE,UDRIE,RxEN,TxEN,xxx
    UCSR0B=0x98;
    UCSR0C=0x06;
    // Setting BaudRate
    UBRR0H=0x00;
    UBRR0L=(F_CPU/BaudRate/16 - 1);
}


int putch(char ch)
{
    if (ch == \'\\n\')                     //개행문자..
        putch(\'\\r\');
    while((UCSR0A&0x20)==0x00);         // 스트림 버퍼가 비면
    UDR0=ch;                            // 데이터 날려줌
    return 0;
}


void putstr(char* str)
{
    while(*str) putch(*str++);
}


ISR(USART0_RX_vect)
{
    char buf;
    buf=UDR0;


    switch(buf)
    {
        case \',\' :
            PORTA=PORTA<<1;
            if(!PORTA)PORTA=0x80;
            break;
        case \'.\' :
            PORTA=PORTA>>1;
            if(!PORTA)PORTA=0x01;
            break;
        case \'a\' :
            putstr("Hell\'o World!!\\n");
            break;
        case \'s\' :
            printf("Now PORTA is %#04x\\n",PORTA);
            break;
        default :
            break;
    }
}


뭐 필요한 사람은 첨부된 소스 / makefile 가져가라. 컴파일은 make all 하면 되시겠다.

프로그램을 설명하자면.. 터미널로 ,랑.을 찍으면 LED가 한칸씩 왔다리 갔다리 하고..

a를 누르면 터미널상에 Hell\'o World!! 가 찍히고..
s를 누르면 터미널상에 현재 PORTA의 값을 출력해주는 놈이다.



일단 실행 화면.

d0052452_04070420.jpg
원래는 TeraTerm을 주로사용하지만..

실행 동영상. 내방이다.ㅋ




이 소스에서 중요한곳은 딱 두군데.

void uart0_init(unsigned long BaudRate);
ISR(USART0_RX_vect);
겠지?

지금까지 착실하게 공부했으면 ISR(USART0_RX_vect)가 뭐하는 놈인지는
벌써 감이 팍!! 올게다.
ISR(USART0_RX_vect)는 데이터 수신이 완료되면 호출되는 인터럽트 서비스 루틴이다.

(혹시나 꼬꼼화를 위해 사족을 붙이자면.. RX는 수신 TX는 송신 되시겠다.)


void uart0_init(unsigned long BaudRate)
{
    // Not Double mode, Not multi_communication
    UCSR0A=0x00;
    // 0b 1001 1000 RXCIE,TXCIE,UDRIE,RxEN,TxEN,xxx
    UCSR0B=0x98;
    UCSR0C=0x06;
    // Setting BaudRate
    UBRR0H=0x00;
    UBRR0L=(F_CPU/BaudRate/16 - 1);
}

일단 USART에 대해 데이터 시트를 먼저 펴보는 기민함을 보여라.

172~198페이지니까 잘 보도록 해라. 귀찮아서 캡쳐는 생략한다.

UCSR은 USART Control and Status Register. 감이 오지?
A,B,C 세가지가 있다.
A는 거진 status 레지스터라 리드 전용이라고 봐도 무방하다.

double 모드랑 multi processor 설정하는게 있는데..
나도 잘 모르니 패스.

UCSRnB는 좀 중요하다.
// 0b 1001 1000 RXCIE,TXCIE,UDRIE,RxEN,TxEN,xxx
라고 친절히 주석도 달려있지?
인터럽트 관련 셋팅이다.

MSB 수신완료인터럽트/송신완료인터럽트/버퍼엥꼬 인터럽트/Rx활성화/
         Tx활성화/캐릭터사이즈/rx data bit/tx data bit                                LSB

인데.. 자세한건 역시 데이터 시트 찾아봐라.
뒷쪽 세개는 주석에도 xxx라고 표시했듯이 별로 중요치 않다.

우리는 송수신 다쓰고 수신 인터럽트를 사용한다.

UCSR0C=0x06;

0x06은 0b0000 0110 이지?
데이터 시트 뒤져봐라.
캐릭터 사이즈 8bit로 셋팅한거다.
더이상의 자세한 설명은 생략한다?

UBRR 은 baudrate. 즉, 통신속도 설정이다.
(보통 1200 2400 4800 9600 14400 19600 38400 59600 129600 bps(bit per sec)다..)

데이터 시트에 클럭별 속도설정에 관한 내용이 좌악~ 나와있다.
간단하게 식으로 요약하면
UBRR0L=(F_CPU/BaudRate/16 - 1);
되시겠다.

모르겠으면 닥치고 외우자.

근데 보통 저렇게 해서 라이브러리로 만들어놓고 함수 불러다 쓴다.


뭐 이정도로 정리하자.



uart는 방식이 이렇다.

먼저 start bit 로 1비트를 날려주면 그걸 받고 대기모드로 들어간다.
그다음 통신속도 맞춰서 한비트씩 순서대로 날려준다. (FIFO방식으로 기억한다.)

그리고 끝난다는 표시로 stop bit 날려주고..

레지스터 셋팅으로 데이터 비트의 갯수도 바꿀수 있고,
뒤에 패리티비트도 추가시킬수 있다.(오류검증) odd,even 원하는대로..

비동기 통신 보다보면
rs-232네 rs-485네 뭐네 하는 말들이 자주 나오는데..

컴퓨터 시리얼 포트는 rs-232를 쓴다.
뭐 크게 다를건 없고.. 전압이 다르다.
그래서 그냥 uart보다는 232가 멀리가고
232보다는 485가 멀리가는거다.

485부터는 멀티드랍이라고 1대n 통신도 가능하다.

자세한건 각자 검색해보도록!




자, 다음으로 넘어가서..

PORT의 입출력은 어떻게 한다고 했지?

PORTx=data 로 출력하고
data=PINx; 로 입력받는다고 했다.

근데 uart는 더 단순하다.

UDRn..막강하다.(우린 uart0를 사용하니 UDR0다. ATMega128은 2개의 포트를 제공한다,)

수신은 data=UDR0;
송신은 UDR0=data;

위치따라 달라진다. 웃기는 놈이다.ㅋ

UDR0를 얘기하는데 (UCSR0A&0x20) 를 무시하고 지나갈수는 없겠지?

UCSRnA의 5번째 비트는 버퍼가 비어있으면 0, 차있으면 1이다.
쉽게 말해서 수신완료되면 0되고
송신 완료되면 0으로 떨어지는 놈이다.

수신은 몰라도 송신할때는 꼭 신경써줘야 된다.

int putch(char ch)
{
    if (ch == \'\\n\')                     //개행문자..
        putch(\'\\r\');
    while((UCSR0A&0x20)==0x00);         // 스트림 버퍼가 비면
    UDR0=ch;                            // 데이터 날려줌
    return 0;
}

에서 처럼 빌때까지 기다려줘야 된다.

안그러면 데이터가 깨져서 날라가겠지?

fdevopen(putch, NULL);  // 반드시 함수의 return형은 int, arg는 char형이어야 함

는 printf를 사용하기 위해서 쓴건데..

인자로 함수를 넘겨준다.

저걸 잘 이용하면 간단하게 printf로 LCD에 출력할수도 있단거다.
참 편한 세상이지.

어쨌든 a누르면 문자열이 그냥 날라가고
s누르면 printf 호출해서 날라간다.

그냥 보여주려고 다르게 만든거니 신경쓰지 말자.


일단은 졸리니..

정리를 하게될지 그냥 닥치고 이대로 냅둘지는 모르겠지만..

수정은 나중에..


그럼 다음시간에 봐요~





p.s 혹시 무협 좋아하는 횽 없어?
      난 취미생활로 무협드라마를 본다..
      짱께들 스케일이 커서 그런지 무협드라마 만들었다 하면 기본 40부작이라 ㅎㄷㄷ해.
      06 신조협려 41부작중에서.. 40화는 내가 대본/싱크작업한건데..(자막에 내 닉 나온다.)
      무미랑전기도 한편인가 두편은 내가 싱크작업한거고..
      뭐 그냥 그렇다고.


추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 주류 모델하면 매출 폭등시킬 것 같은 아이돌 스타는? 운영자 26/01/05 - -
AD 집에서 즐기는 Fresh 미식회 운영자 25/12/22 - -
공지 프로그래밍 갤러리 이용 안내 [98] 운영자 20.09.28 49233 65
2910162 여긴 그냥 방구석 찐따들이 어디서 주워들은 개발지식가지고 떠드는데임? [6] ㅇㅇ(218.154) 13:55 26 0
2910161 [대한민국] 트럼프 행정부 - 인천 송도서 사무실 뺀다 ㅇㅇ(121.172) 13:54 9 0
2910160 잠실이 넥도리아(223.38) 13:51 7 0
2910159 추워 오줌 화장실이 없다. [1] 넥도리아(223.38) 13:46 9 0
2910158 2010년중반 문돌이도 국비 6개월로 개발자 취업한애들 프갤러(121.140) 13:30 11 0
2910157 (스압주의) 흑백요리사 그새끼 논란 정리해봄 디바123(14.36) 13:14 13 0
2910156 프로그래밍 파이썬으로 입문하려면 [2] 프갤러(220.121) 13:07 21 0
2910155 휴지 잔뜩챙겨서 닦으러 간다. 넥도리아(223.38) 12:59 14 0
2910154 Kt 광매설 지역 브레이버갤로그로 이동합니다. 11:49 34 0
2910153 음란물 규제 전면 철폐 하는 이유 5 ㅇㅇ(121.172) 11:42 17 0
2910152 장기이식에 대해서 어떻게 생각함??? [5] 야옹아저씨갤로그로 이동합니다. 11:34 44 5
2910151 줄끊어졌다 반려견 넥도리아(223.38) 11:08 29 0
2910150 파이차트를 생성하는 파이썬 라이브러리 [1] 프갤러(1.235) 10:55 30 0
2910149 프로그래밍으로 5행시 간다 [2] 노력갤로그로 이동합니다. 10:46 45 0
2910148 나 잔다 ㅇㅅㅇ [1] ㅇㅅㅇ(106.102) 10:28 20 0
2910145 태연 / 구름 ㅇㅅㅇ [2] 헤르 미온느갤로그로 이동합니다. 08:31 48 0
2910144 하루 한 번 헤르미온느 찬양 [15] 헤르 미온느갤로그로 이동합니다. 08:20 88 0
2910143 요즘은 배민,쿠팡이츠 안쓰고 요기요 씀 [3] 야옹아저씨갤로그로 이동합니다. 08:18 41 0
2910142 프붕이 지금 실베 올라옴 [7] 나트륨찡갤로그로 이동합니다. 08:15 54 0
2910141 ai 이놈 지피티 쓰는거좋은거빼곤 재앙그자체네 ㅇㅇ갤로그로 이동합니다. 07:58 30 0
2910140 아버지한테 개인적으로 붙힌돈 받을 수 있을까요? 넥도리아(220.74) 06:51 35 0
2910138 씽크대 바닥 청소 완료 [3] 브레이버갤로그로 이동합니다. 05:32 71 0
2910136 직접 청소중 씽크대 브레이버갤로그로 이동합니다. 04:42 33 0
2910134 주인이 월세 25만원 받는 조건으로 수리 보일러 교체랑 빼고 별루 안해줘 넥도리아(220.74) 04:04 25 0
2910133 씽크대 가 무너졌습니다. 어떻해요. 브레이버갤로그로 이동합니다. 04:00 67 0
2910131 씽크대가 무너져 내렸습니다. (예고편) 후속있음 넥도리아(220.74) 04:00 22 0
2910129 반복문에서 벽느끼면 재능 없는거임? [2] 프갤러(119.66) 03:03 47 0
2910126 나경원 이어 장동혁 '댓글 국적표시' 주장, 문제 없나 [2] 발명도둑잡기(118.216) 00:59 40 0
2910125 1222 [1] 134(211.36) 00:22 38 0
2910124 4791 134(106.102) 00:03 20 0
2910123 언급된 JPEGMAFIA란 이름 듣고 생각나는 예전 글 발명도둑잡기(118.216) 00:00 17 0
2910121 병신 프갤 새끼들 [1] 134(106.102) 01.10 56 2
2910120 터무니 없는 도시, 터무니 없는 사회 ㅇㅇ(211.216) 01.10 40 1
2910119 오늘을 산다. 나갑니다. 넥도리아(220.74) 01.10 19 0
2910117 트럼프 나쁜 새끼 테러리스트 넥도리아(220.74) 01.10 26 0
2910115 형님들 핸드폰의 핀 새는거 어떻게 해요 디스플레이 배터리 핀 넥도리아(220.74) 01.10 21 0
2910114 C++ 너무 재밋오 [3] 루도그담당(58.233) 01.10 78 0
2910112 [고승우 박사] 주한미군 비밀작전 존재 은폐는 위헌 발명도둑잡기(118.216) 01.10 19 0
2910111 [고승우 박사] K-세대의 자존감과 한미동맹 종속성의 충돌 발명도둑잡기(118.216) 01.10 15 0
2910110 숙련된 개발자는 커밋메시지를 이런 식으로씀 ㅇㅅㅇ [3] 따당갤로그로 이동합니다. 01.10 157 0
2910109 https://gall.dcinside.com/board/view/?id 프갤러(125.133) 01.10 33 0
2910107 정리해준다 프갤러(120.50) 01.10 30 0
2910106 알고보니 어렸을 때 치파오 입고 있었고 프갤러(120.50) 01.10 25 0
2910105 화교의 속마음 프갤러(120.50) 01.10 38 0
2910104 머스크 “의대 가지 마라, 3년 내 대체된다” 인터뷰 영상 보니② 발명도둑잡기(118.216) 01.10 36 0
2910103 대만 혐한 정서보이며 한국남자 음해하고 한국여자 빼갈려는 나라입니다 [1] ㅇㅇ갤로그로 이동합니다. 01.10 167 1
2910102 C언어 공부 질문 [1] Bear123갤로그로 이동합니다. 01.10 43 0
2910101 "작곡은 끝났다" 현직 음대 교수의 충격 발언 발명도둑잡기(118.216) 01.10 26 0
2910100 ai 로인해서 영어 못해도 개발문서 보기 좋아진게 특혜임 ㅇㅇ(118.235) 01.10 25 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2