목차
1. 실험 목표
2. 실험이론
3. 회로도
4. 프로그램해석
5. 실험 결과 및 결론
2. 실험이론
3. 회로도
4. 프로그램해석
5. 실험 결과 및 결론
본문내용
/결정한 숫자를 디스플레이하기 위해 출력되는 값을 배열로 선언
volatile unsigned long req[NUM_REQ] = {0, 0}; // REQ 초기화
double ms_ov_cycle; // 1회 오버플로에 소요되는 시간 저장
// 타이머/카운터0 인터럽트 서비스 루틴
SIGNAL(SIG_OVERFLOW0)
{ int i;
timer0++;// 오버플로마다 1씩 증가
PORTC = (timer0 % 2 == 0) ? led[(number % 100) / 10] : led[number%10]; // 오버플로 횟수가 짝수일 때 10자리, 홀수일 때 1자리 디스플레이
PORTD = (PORTD |0xC0) & ~(1<<((timer0 % 2 == 0) ? PD7 : PD6)); // 짝수일 때 PD7->1(십의 자리), 홀수일 때 PD6->1(일의 자리)선택
for(i=0; i
if( req[i] > 0)// REQ 요청이 있을 때 만¸
req[i]--;// 시간 지연 경과 응답
}
// ms_interval초 시간 지연을 위한 오버플로 횟수 계산 함수
unsigned long ms_req_timer0(unsigned long ms_interval)
{return ( ms_interval <= 0) ? 0 : \
+ (unsigned long)(ms_interval / ms_ov_cycle);
}
intmain(void)
{
DDRC = 0xFF;
DDRD |= 1<
DDRB |= 1<
DDRB &= ~(1<
PORTB |= 1<
TCCR0 = 1<
TCCR0 |= 1<
TCCR0 |= 1<
TIMSK |= 1<
timer0 = 0;
sei();
ms_ov_cycle= MS_OVERFLOW_CYCLE;
OCR0 = 0;
number = OCR0*100/256;// OCR0 값과 number 값을 일치
while(1){
if( (req[REQ_UP]==0) && !(PINB & (1<
req[REQ_UP] = ms_req_timer0(DEBOUNCE_CYCLE);
OCR0 = (OCR0 == 255) ? 255 : OCR0 + 1; //OCR0값이 0이 아니면 계속 1씩 증가시킴.
}
if( (req[REQ_DOWN]==0) && !(PINB & (1<
req[REQ_DOWN] = ms_req_timer0(DEBOUNCE_CYCLE);
OCR0 = (OCR0 == 0) ? 0 : OCR0 - 1; //OCR0값이 0이 아니면 계속 1씩 빼줌.
}
number = OCR0 * 100/256;
}
return 0;
}
고속 PMW를 이용한 응용실험
#include
#include
#include "lcd.h"
#include "usart.h"
#define OC0 PB4
volatile unsigned int number;
static FILE usart1_stdio = FDEV_SETUP_STREAM(USART1_send, USART1_receive, _FDEV_SETUP_RW);
// main 함수
int main(void)
{ char lcd_string[2][MAX_LCD_STRING];
int x;
LCD_init();
USART_init(USART1, 25); // USART1 보오레이트 : 38400(UBRR=12), 8MHz
DDRC = 0xFF;
DDRB |= 1<
TCCR0 = 1<
TCCR0 |= 1<
TCCR0 |= 1<
sprintf(lcd_string[0], "USART1_Motor"); // LCD에 출력
LCD_str_write(0, 0, lcd_string[0]);
stdin = stdout = stderr = &usart1_stdio;
printf("%s", lcd_string[0]); // USART1에 테스트문자 출력
OCR0 = 0;
while(1){
printf("\r\nMotor Control 0-255, OCR0=?.?");
scanf("%d", &x); // 정수 x 입력
OCR0=x;
number=OCR0*100/256;
sprintf(lcd_string[1], "\r\nDuty Ratio=%-4d ", number);
printf("%s", lcd_string[1]); // 상대방에 문자 *로 되돌려 줌
LCD_str_write(1, 0, lcd_string[1]);
}
return 0;
}
5. 실험 결과 및 결론
이번 실험은 PC와 ATmega128 혹은 ATmega128 두개를 연동시킨 후 폴링을 이용하여 문자 송신, 수신을 해보는 실험이었다. 폴링이란 통신에서 폴링은 한 프로그램이나 장치에서 다른 프로그램이나 장치들이 어떤 상태에 있는지를 지속적으로 체크하는 전송제어 방식이다. 우리 조는 PC와 ATmega128을 연결하였는데 하이퍼 터미널이 처음에 뜨지 않았다. 실험자체가 굉장히 생소하고 이해가 잘되지 않았지만 회로를 살펴보고 rx와 tx를 바꿔 끼우니 제대로 나왔다. 고속 PMW를 이용한 모터 응용 실험도 하였는데 소스에 따라서 하이퍼 터미널과 LCD에도 값이 잘 나왔다.
volatile unsigned long req[NUM_REQ] = {0, 0}; // REQ 초기화
double ms_ov_cycle; // 1회 오버플로에 소요되는 시간 저장
// 타이머/카운터0 인터럽트 서비스 루틴
SIGNAL(SIG_OVERFLOW0)
{ int i;
timer0++;// 오버플로마다 1씩 증가
PORTC = (timer0 % 2 == 0) ? led[(number % 100) / 10] : led[number%10]; // 오버플로 횟수가 짝수일 때 10자리, 홀수일 때 1자리 디스플레이
PORTD = (PORTD |0xC0) & ~(1<<((timer0 % 2 == 0) ? PD7 : PD6)); // 짝수일 때 PD7->1(십의 자리), 홀수일 때 PD6->1(일의 자리)선택
for(i=0; i
req[i]--;// 시간 지연 경과 응답
}
// ms_interval초 시간 지연을 위한 오버플로 횟수 계산 함수
unsigned long ms_req_timer0(unsigned long ms_interval)
{return ( ms_interval <= 0) ? 0 : \
+ (unsigned long)(ms_interval / ms_ov_cycle);
}
intmain(void)
{
DDRC = 0xFF;
DDRD |= 1<
sei();
ms_ov_cycle= MS_OVERFLOW_CYCLE;
OCR0 = 0;
number = OCR0*100/256;// OCR0 값과 number 값을 일치
while(1){
if( (req[REQ_UP]==0) && !(PINB & (1<
OCR0 = (OCR0 == 255) ? 255 : OCR0 + 1; //OCR0값이 0이 아니면 계속 1씩 증가시킴.
}
if( (req[REQ_DOWN]==0) && !(PINB & (1<
OCR0 = (OCR0 == 0) ? 0 : OCR0 - 1; //OCR0값이 0이 아니면 계속 1씩 빼줌.
}
number = OCR0 * 100/256;
}
return 0;
}
고속 PMW를 이용한 응용실험
#include
#include
#include "lcd.h"
#include "usart.h"
#define OC0 PB4
volatile unsigned int number;
static FILE usart1_stdio = FDEV_SETUP_STREAM(USART1_send, USART1_receive, _FDEV_SETUP_RW);
// main 함수
int main(void)
{ char lcd_string[2][MAX_LCD_STRING];
int x;
LCD_init();
USART_init(USART1, 25); // USART1 보오레이트 : 38400(UBRR=12), 8MHz
DDRC = 0xFF;
DDRB |= 1<
LCD_str_write(0, 0, lcd_string[0]);
stdin = stdout = stderr = &usart1_stdio;
printf("%s", lcd_string[0]); // USART1에 테스트문자 출력
OCR0 = 0;
while(1){
printf("\r\nMotor Control 0-255, OCR0=?.?");
scanf("%d", &x); // 정수 x 입력
OCR0=x;
number=OCR0*100/256;
sprintf(lcd_string[1], "\r\nDuty Ratio=%-4d ", number);
printf("%s", lcd_string[1]); // 상대방에 문자 *로 되돌려 줌
LCD_str_write(1, 0, lcd_string[1]);
}
return 0;
}
5. 실험 결과 및 결론
이번 실험은 PC와 ATmega128 혹은 ATmega128 두개를 연동시킨 후 폴링을 이용하여 문자 송신, 수신을 해보는 실험이었다. 폴링이란 통신에서 폴링은 한 프로그램이나 장치에서 다른 프로그램이나 장치들이 어떤 상태에 있는지를 지속적으로 체크하는 전송제어 방식이다. 우리 조는 PC와 ATmega128을 연결하였는데 하이퍼 터미널이 처음에 뜨지 않았다. 실험자체가 굉장히 생소하고 이해가 잘되지 않았지만 회로를 살펴보고 rx와 tx를 바꿔 끼우니 제대로 나왔다. 고속 PMW를 이용한 모터 응용 실험도 하였는데 소스에 따라서 하이퍼 터미널과 LCD에도 값이 잘 나왔다.
추천자료
- 정보처리기능사 기출문제 암기요약
- 반도체 메모리 종류와 기능
- 가부장적 성윤리가 성매매에 미치는 영향
- 가설공사, 토공사, 기초공사의 신공법의 조사
- [ADSL]ADSL(비대칭디지털가입자회선)의 특징, ADSL(비대칭디지털가입자회선)의 추진배경, ADS...
- 미래사회와 조직 - 미래사회의 과학기술과 영향력
- 안드로이드 음성인식을 이용한 ATmega RC카 제어(블루투스 통신)
- 챗봇의 개념 활용사례 및 시장전망 [챗봇인공지능4차산업chatbot음성비서챗봇사례왓슨]
- [e-비즈니스 공통] 1 인터넷 주소 체계 중에서 도메인 네임(Domain Name)은 통상 네 묶음의 ...
소개글