BASIC4MCU | AVR | ADC | ADC 데이터 1채널 전송 포멧 - 수신 함수
페이지 정보
작성자 키트 작성일2017-08-29 10:08 조회2,322회 댓글0건본문
#include <mega128.h>
#include <delay.h>
//
int adc_value=0;//
interrupt [USART1_RXC] void usart1_rx_isr(void){char c;
c=UDR1;
if(c&0x80)adc_value=(adc_value&0x007F) | ((int)(c&7)<<7);
else adc_value=(adc_value&0x0380) | c;
}
//
void main(void){
DDRA=0xFF; // LED PORT
UCSR1B=0x90; UBRR1H=0; UBRR1L=103;
#asm("sei")
while (1){}
}//
adc_value에는 수신 받은 10비트 ADC 데이터가 들어갑니다.
LCD에 표시하든지 포트에 출력하면 되겠죠
//
설명을 조금 더 해드리죠
■□□□□▩▩▩ ■▩▩▩▩▩▩▩
■적색은 1이고 ■청색은 0입니다.
비트7을 체크해서 1■이면 상위바이트이고 0■이면 하위바이트입니다.
상위바이트에는 10비트 중 비트7~9가 들어 있습니다.하위바이트에는 10비트 중 비트0~6이 들어 있습니다.
두개를 합해야겠죠
if(c&0x80)adc_value=(adc_value&0x007F) | ((int)(c&7)<<7);
else adc_value=(adc_value&0x0380) | c;
이 문장을 분석해보죠
if(c&0x80) <-- 상위바이트이면
else <-- 아니면 하위바이트
(adc_value&0x007F) 원래 들어있는 값에서 비트7~15를 크리어 시키고 ( 값을 넣기 전에 크리어 시키기 위함)
(c&7) 비트0~비트2를 남기고 크리어 시킨 후
((int)(c&7)<<7) 좌로 시프트7 시켜서 비트7~비트9가 되도록 만든 후
adc_value=(adc_value&0x007F) | ((int)(c&7)<<7); OR(|) 시켜서 더해줍니다.
원래 데이터에서 상위 바이트로 전송된 비트로 교체하는 문장입니다.
else adc_value=(adc_value&0x0380) | c;
(adc_value&0x0380) 원래 값에서 비트0~비트6을 크리어시키고 ( 값을 넣기 전에 크리어 시키기 위함)
c(하위바이트)를 더해줍니다.
댓글 0
조회수 2,322등록된 댓글이 없습니다.