질문게시판 > 답변 : atmega328p에서 uart를 이용한 데이터 수신(데이터포멧)

TODAY928 TOTAL272,650
사이트 이용안내
Login▼/회원가입
포럼 동영상강좌 회원가입


▼ BASIC4MCU 후원업체 최신 정보 ▼

▲ BASIC4MCU 후원업체 최신 정보 ▲

BASIC4MCU | 질문게시판 | 답변 : atmega328p에서 uart를 이용한 데이터 수신(데이터포멧)

페이지 정보

작성자 master 작성일2018-02-12 16:30 조회595회 댓글0건

본문

	

thumb-1794624852_mVyNFWR4_0c05cba654ff72ea46beacab0de67a136412f4ee_600x659.png 

 

 

 

"+003\r\n"
"-003\r\n"

"\r\n" = #13#10 = 0x0d,0x0a


<정해진 바이트수>
  부호 + 숫자(문자열)3자리 + "\r\n" 

 

 

//#define LATCH(1<
//#define DATA(1<
//#define CLOCK(1<
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
//
char Font[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//
int main(void){
  unsigned char data;
  UCSR0B=0x18UBRR0L=103// boudrate 9600
  DDRB=0x2C;   PORTB|=0x04;
  SPCR=(1<<SPE)|(1<<MSTR);
  while(1){
    while(!(UCSR0A&0x80)); data=UDR0;
    while(!(UCSR0A&0x20)); UDR0=data;
    PORTB&=~0x04;
    SPDR=Font[0]; while(!(SPSR&(1<<SPIF))); // 0
    SPDR=Font[0]; while(!(SPSR&(1<<SPIF))); // 0
    if(data>99){ // 99가 넘으면 fnd 에 9900 표시
      SPDR=Font[9]; while(!(SPSR&(1<<SPIF))); // 9
      SPDR=Font[9]; while(!(SPSR&(1<<SPIF))); // 9
    }
    else{
      SPDR=Font[data%10]; while(!(SPSR&(1<<SPIF))); // 1의 자리
      SPDR=Font[data/10]; while(!(SPSR&(1<<SPIF))); // 10의 자리
    }
    PORTB|=0x04;
  }
}

 

질문 소스는 1바이트만 받아서 출력하는 상태라서 FND에서 제대로 값을 출력하지 못합니다.

 

 

//#define LATCH (1<
//#define DATA  (1<
//#define CLOCK (1<
//
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
//
char Font[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
volatile char rx_xnt=0,r0,flag=0,rx[20],fnd[4];
volatile int  val=0,rx[20];
//
ISR(USART0_RX_vect){
  r0=UDR0;
  UDR0=r0// to PC
  if     (r0==0x0d){}               // 처리안함
  else if(r0==0x0a){                // 종료문자
    if(rx_xnt==6){                  // 수신 갯수가 맞으면
      if(rx[0]=='-')fnd[0]=0x40;    // '-' 음수
      else          fnd[0]=0x00;    // ' ' 양수
      fnd[1]=Font[rx[1]&0x0F];
      fnd[2]=Font[rx[2]&0x0F];
      fnd[3]=Font[rx[3]&0x0F];
      flag=1;                       // 수신완료
    }
    rx_xnt=0// 버퍼인덱스 크리어
  }
  else{
    if(rx_xnt<10){     // 버퍼 범위를 넘지 않으면
      rx[rx_xnt++]=r0// 버퍼에 저장
    }
  } 
}
//
int main(void){
  UCSR0B=0x98UBRR0L=103// boudrate 9600
  DDRB=0x2C;   PORTB|=4;
  SPCR=(1<<SPE)|(1<<MSTR);
  SREG=0x80;
  while(1){
    if(flag){ flag=0;
      PORTB&=~4;
      SPDR=fnd[0]; while(!(SPSR&(1<<SPIF))); // 부호
      SPDR=fnd[1]; while(!(SPSR&(1<<SPIF))); // 1000
      SPDR=fnd[2]; while(!(SPSR&(1<<SPIF))); // 10
      SPDR=fnd[3]; while(!(SPSR&(1<<SPIF))); // 1
      PORTB|=4;
    }
  }
}

 

추가된 것이 많지 않아도

인터럽트 코드를 작성 해본 적이 없다면 분석이 쉽지는 않겠습니다.

 

  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기

댓글 0

조회수 595

등록된 댓글이 없습니다.

질문게시판HOME > 질문게시판 목록

MCU, AVR, 아두이노 등 전자공학에 관련된 질문을 무료회원가입 후 작성해주시면 전문가가 답변해드립니다.

ATMEGA128PWMLED초음파
아두이노AVR블루투스LCD
UART모터적외선ATMEGA
전체 스위치 센서
게시물 검색

Privacy Policy
MCU BASIC ⓒ 2017