목차
마이크로프로세서 응용 및 실험 - ADC & UART
1. 설계과제의 목표 및 제한조건
◎ 제목
2. 서론
- ADC -
◎ ADC란?
◎ 관련 레지스터
- USART -
◎ USART 직렬통신
◎ 통신속도 결정
◎ 관련 레지스터
◎ ASCII 코드
3. 본론
◎ 회로도
◎ 코드 입력 및 설명
◎ 결과
4. 결론
◎ 고찰
1. 설계과제의 목표 및 제한조건
◎ 제목
2. 서론
- ADC -
◎ ADC란?
◎ 관련 레지스터
- USART -
◎ USART 직렬통신
◎ 통신속도 결정
◎ 관련 레지스터
◎ ASCII 코드
3. 본론
◎ 회로도
◎ 코드 입력 및 설명
◎ 결과
4. 결론
◎ 고찰
본문내용
1;
}
}
}
}
SIGNAL(SIG_ADC)
{
adc_result = ADCH;//ADC 변환값 save
}
SIGNAL(SIG_OVERFLOW0)
{
if(usart_count%2==0)
{
timer_count--;
if(!timer_count)
{
timer_count=100;
c++;
}
c1=c%10;
c2=c/10;
if(c==60) c=0;
TX1_Byte(c2+48); TX1_Byte(c1+48); TX1_Byte('\r');
TCNT0 = 100;
}
}
int main(void)
{
DDRB = 0x1f;
initialize_adc();
timer_count=100;
USART_Init(103);//9600
do{
led_count = adc_result/51;
PORTB = led[led_count];
}while(1);
}
void initialize_adc(void)
{
ADMUX = 0x66;// ADLAR = 1 /
ADCSRA = 0xef;//
TIMSK = 0x01;//Timer/Counter0 overflow interrupt enable
TCNT0 = 100;//(0xff - x + 1) = 15.625
TCCR0 = 0x4d;//fast PWM, clk1024
sei();
}
void TX1_Byte(unsigned char data)
{
while(!(UCSRA & 0x20));//wait for empty transmit buffer(UDRE)
UDR = data;//put data into buffer, send the data
}
unsigned char RX1_Byte(void)//receive a character by USART1
{
while(!(UCSRA & 0x80));//data received (RXC1)
return UDR;
}
void USART_Init(unsigned int baud)
{
UBRRH = (unsigned char)(baud >> 8);
UBRRL = (unsigned char)baud;
UCSRA = 0x00;//asynchronous normal mode
UCSRB = 0x98;//Rx complete Interrupt Enable/Rx(Bit4)/Tx(Bit3) enable
UCSRC = 0x86;//no parity, 1 stop, 8 data
}
만약 's' 입력을 받으면 usart_count값이 1씩 커지게 하고 만약 usart_count값이 홀수이면 해당 값이 더 이상 증가하지 않고 멈추게 설정한다. 멈춘 상태에서 ADC의 변환값이 128초과, 즉 2.5V초과일 때 0~5까지의 입력값을 십의 자리수에 넣는다. ADC변환값이 128이하, 즉 2.5V 이하일 때 0~9의 값을 일의 자리수에 넣는다.
adc_result의 변수에 ADC변환값을 저장한다. 여기서 ADC변환값을 ADCH를 사용한다.
오버플로우 인터럽트 발생은 지난 timer 과제의 것을 그대로 가져와서 1초를 설정한다.
DDRB에서 LED 5개를 출력으로 설정하고, USART_Init을 103으로 설정하여 9600bps의 통신속도를 설정한다.
ADC결과값(총 256)을 5등분하기 위해 51로 나눠준 값을 led_count라는 변수에 저장하고 그에 대해 LED의 출력값을 설정한다.
ADMUX = 0x66 : ADLAR = AVCC 설정, 1로 설정함으로써 ADCH를 사용하도록 한다.
ADCSRA = 0xef : ADC enable, start conversion, auto trigger enable을 설정하고 adc 인터럽트를 사용가능하게 하며 Prescaler를 128로 설정한다.
TIMSK, TCNT0, TCCR0은 저번 주 timer 과제를 그대로 사용하여 1초를 설정한다.
UCSRA = 0x00 : 노말 모드.
UCSRB = 0x98 : RX Complete Interrupt 사용가능, RX, TX 허용.
UCSRC = 0x86; : 패리티모드 사용X, 1 스톱비트, 8 데이터비트 사용.
◎ 결과
4. 결론
◎ 고찰
교수님께서는 이번 내용이 간단하다고 하셨지만 이번 내용이 가장 어려웠다. 이전 내용인 timer와 이번에 배운 ADC와 USART를 동시에 이용하여 사용해야 하는 레지스터의 수가 늘어나고 각 레지스터에 설정해야할 수가 이전보다 많아졌다. 또, 변수를 많이 설정해야 해서 코딩하기가 복잡했다. 또, PDF파일의 연습문제를 붙여넣기해서 사용한 부분이 많아 이해가 잘 가지 않는 부분들도 많았다.
}
}
}
}
SIGNAL(SIG_ADC)
{
adc_result = ADCH;//ADC 변환값 save
}
SIGNAL(SIG_OVERFLOW0)
{
if(usart_count%2==0)
{
timer_count--;
if(!timer_count)
{
timer_count=100;
c++;
}
c1=c%10;
c2=c/10;
if(c==60) c=0;
TX1_Byte(c2+48); TX1_Byte(c1+48); TX1_Byte('\r');
TCNT0 = 100;
}
}
int main(void)
{
DDRB = 0x1f;
initialize_adc();
timer_count=100;
USART_Init(103);//9600
do{
led_count = adc_result/51;
PORTB = led[led_count];
}while(1);
}
void initialize_adc(void)
{
ADMUX = 0x66;// ADLAR = 1 /
ADCSRA = 0xef;//
TIMSK = 0x01;//Timer/Counter0 overflow interrupt enable
TCNT0 = 100;//(0xff - x + 1) = 15.625
TCCR0 = 0x4d;//fast PWM, clk1024
sei();
}
void TX1_Byte(unsigned char data)
{
while(!(UCSRA & 0x20));//wait for empty transmit buffer(UDRE)
UDR = data;//put data into buffer, send the data
}
unsigned char RX1_Byte(void)//receive a character by USART1
{
while(!(UCSRA & 0x80));//data received (RXC1)
return UDR;
}
void USART_Init(unsigned int baud)
{
UBRRH = (unsigned char)(baud >> 8);
UBRRL = (unsigned char)baud;
UCSRA = 0x00;//asynchronous normal mode
UCSRB = 0x98;//Rx complete Interrupt Enable/Rx(Bit4)/Tx(Bit3) enable
UCSRC = 0x86;//no parity, 1 stop, 8 data
}
만약 's' 입력을 받으면 usart_count값이 1씩 커지게 하고 만약 usart_count값이 홀수이면 해당 값이 더 이상 증가하지 않고 멈추게 설정한다. 멈춘 상태에서 ADC의 변환값이 128초과, 즉 2.5V초과일 때 0~5까지의 입력값을 십의 자리수에 넣는다. ADC변환값이 128이하, 즉 2.5V 이하일 때 0~9의 값을 일의 자리수에 넣는다.
adc_result의 변수에 ADC변환값을 저장한다. 여기서 ADC변환값을 ADCH를 사용한다.
오버플로우 인터럽트 발생은 지난 timer 과제의 것을 그대로 가져와서 1초를 설정한다.
DDRB에서 LED 5개를 출력으로 설정하고, USART_Init을 103으로 설정하여 9600bps의 통신속도를 설정한다.
ADC결과값(총 256)을 5등분하기 위해 51로 나눠준 값을 led_count라는 변수에 저장하고 그에 대해 LED의 출력값을 설정한다.
ADMUX = 0x66 : ADLAR = AVCC 설정, 1로 설정함으로써 ADCH를 사용하도록 한다.
ADCSRA = 0xef : ADC enable, start conversion, auto trigger enable을 설정하고 adc 인터럽트를 사용가능하게 하며 Prescaler를 128로 설정한다.
TIMSK, TCNT0, TCCR0은 저번 주 timer 과제를 그대로 사용하여 1초를 설정한다.
UCSRA = 0x00 : 노말 모드.
UCSRB = 0x98 : RX Complete Interrupt 사용가능, RX, TX 허용.
UCSRC = 0x86; : 패리티모드 사용X, 1 스톱비트, 8 데이터비트 사용.
◎ 결과
4. 결론
◎ 고찰
교수님께서는 이번 내용이 간단하다고 하셨지만 이번 내용이 가장 어려웠다. 이전 내용인 timer와 이번에 배운 ADC와 USART를 동시에 이용하여 사용해야 하는 레지스터의 수가 늘어나고 각 레지스터에 설정해야할 수가 이전보다 많아졌다. 또, 변수를 많이 설정해야 해서 코딩하기가 복잡했다. 또, PDF파일의 연습문제를 붙여넣기해서 사용한 부분이 많아 이해가 잘 가지 않는 부분들도 많았다.
키워드
추천자료
마이크로파 실험
마이크로파광학실험 결과
길이,두께 및 구면의 곡률반경측정(버니어캘리퍼,마이크로미터,구면계)
[물리실험] 마이크로 웨이브(Microwave) 실험 예비레포트
[X선][엑스선][X선회절실험][엑스선회절실험][X선회절][엑스선회절][실험]X선(엑스선)의 성질...
병원미생물학실험_report_3_(단순염색 및 그람염색)
물리학 실험보고서 - 길이 및 곡률반경 측정 /실험목적, 기구 및 장치, 실험 방법
[물리실험] 길이의 측정 (버니어 캘리퍼스, 마이크로미터)
길이 및 곡률반경 측정 예비보고서 : 버니어 캘리퍼, 마이크로미터, 구면계를 이용하여 작은 ...
[일반물리학실험] 버니어캘리퍼(Vernier Calliper)와 마이크로미터(micrometer)를 이용하여 ...
SS 분석과 SVI30침강 및 F/M비 환경공학과 발표자료 (실험 결과).ppt
마이크로컴퓨터 7세그먼트 실험 보고서 - 작시를 이용한 두 자리 7-세그먼트 LED 디스플레이
[무기화학 및 분석화학 실험] 04[예비]. MCM-41 합성 및 분석 : Mesoporous Material중 하나...
[생화학,약대실험] 제한효소 처리 및 전기영동을 통한 plasmid DNA 확인 그리고 UV-visible s...
소개글