글
온도 센서이 값이 32도에 도달하게 되면 모터가 동작되었다가 28도까지 내려가면 모터의 동작이 멈추도록 하라.
일단 날씨와 환경상 22~30도 밖에 안나오므로
25도를 넘기면 돌아가게 바꿨다 그 미달이 되면 멈추게된다...
키트 명
DK128 - EXT2
핀연결
온도센서- 60번 핀 - J2 5번
59번 핀 - J2 6번
모터센서 - 52번 핀 - J3 5번
51번 핀 - J3 2번
50번 핀 - J3 1번
모터 연결 - J5번에 연결
헤더파일 ex5_1.h
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdlib.h>
#define CPU_CLOCK 16000000
#define BAUD_RATE 19200
#define BAUD_RATE_L (CPU_CLOCK / (16l * BAUD_RATE)) - 1
#define BAUD_RATE_H ((CPU_CLOCK / (16l * BAUD_RATE)) - 1) >> 8
///////////////////////////////////////////////////
// PA0:1은 51:50번 핀
#define DDR_MOTOR DDRA
#define PORT_MOTOR PORTA
#define PORT_PLUS 0
#define PORT_MINUS 1
//////////////////////////////////////////////////////
/**************************************************
사용 포트 : PF1(AD1:60번핀), PF2(AD2:59번핀)
연결상태 : PF1(AD1:60번핀) - TMP_OUT_1(J2:5번핀)
PF2(AD2:59번핀) - TMP_OUT_2(J2:6번핀)
**************************************************/
#include "ex5_1.h"
// 1 byte 전송 함수
void uart_send_byte(unsigned char byte)
{
// 전송 버퍼가 빌 때까지 기다린다.
while (!(UCSR1A & (1 << UDRE1)));
UDR1 = byte;
}
// return 문자 전송 함수
void uart_send_return(void)
{
uart_send_byte('\n');
uart_send_byte('\r');
}
// 공백문자(space) 전송 함수
void uart_send_space(void)
{
while (!(UCSR1A & (1 << UDRE1)));
UDR1 = 0x20;
}
// 문자열 전송 함수
void uart_send_string(unsigned char *str, unsigned char len)
{
int i;
for (i = 0; i < len; i++)
{
if (!(*(str + i)))
{
break;
}
uart_send_byte(*(str + i));
}
}
/////////////////////////////////////////////////
소스파일 ex5_1.c
/////////////////////////////////////////////////
// 딜레이 루틴
void m_delay(unsigned int m)
{
unsigned int i,j;
cli();
for(i=0;i<m;i++)
for(j=0;j<2650;j++); // 16MHz : 1msec
sei();
}
// 온도센서의 증폭되지 않은 값을 출력
void tmp_out_1(void)
{
unsigned char buf[5];
int int_buf = 0;
// ADMUX = (01 0 00001), AVCC를 레퍼런스로사용, 채널 1
ADMUX = (0<<REFS1) | (1<<REFS0) | (1<<MUX0); // 채널 1 선택
ADCSR |= 0x40; // ACD Start Conversion
while((ADCSR & 0x10) == 0); // ADC의 변환이 종료될때까지 대기
int_buf += ADCL + ADCH * 256; // 결과값을 int_buf 에 저장
itoa(int_buf, buf, 10);
uart_send_string(buf, sizeof(buf)); // 시리얼 통신상으로 출력
}
// 온도센서의 증폭 된 값을 출력
int tmp_out_2(void)
{
int temp;
unsigned char buf[5];
int int_buf = 0;
// ADMUX = (01 0 00010), AVCC를 레퍼런스로 사용, 채널 2
ADMUX = (0<<REFS1) | (1<<REFS0) | (1<<MUX1) |(0<<MUX0);
ADCSR |= 0x40; // ACD Start Conversion
while((ADCSR & 0x10) == 0); // ADC의 변환이 종료될때까지 대기
int_buf += ADCL + ADCH * 256; // 결과값을 int_buf 에 저장
temp = int_buf;
itoa(int_buf, buf, 10);
//buf[4] = buf[3];
//buf[3] = buf[2];
//buf[2] = '.';
uart_send_string(buf, sizeof(buf)); // 시리얼 통신상으로 출력
return temp;
}
// ADC 초기화
void adc_init(void)
{
DDRF &= 0x00; // F 포트 입력 설정
// ADMUX = (01 0 00001), AVCC를 레퍼런스로사용, 채널 1
ADMUX = (0<<REFS1) | (1<<REFS0) | (1<<MUX0);
// ADCSR = (1000 0 111), ADC enable, 128분주
ADCSR = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
}
// 시리얼 통신(UART) 초기화
void uart_init(void)
{
// baud rate 설정
UBRR1L = (unsigned char)BAUD_RATE_L;
UBRR1H = (unsigned char)BAUD_RATE_H;
// no parity, 1 stop bit, 8bit 설정
UCSR1C = (0 << UPM1) | (0 << UPM0) | (0 << USBS) |
(1 << UCSZ1) | (1 << UCSZ0);
// Tx, Rx Enable, 8bit 설정
UCSR1B = (1 << TXEN) | (1 << RXEN) | (0 << UCSZ2);
}
int main(void)
{
int a;
adc_init(); // ADC 초기화
uart_init(); // LED 포트 초기화
while(1){
m_delay(100);
tmp_out_1();
uart_send_space();
a = tmp_out_2();
/////////////////////////////////
DDR_MOTOR = 0xFF; // MOTOR 포트를 출력모드로 설정
PORT_MOTOR = 0x00; // MOTOR 포트 초기화
if(a<250)
{
//0000 0001
//**** **-+
//LED가 켜진다. DC모터를 연결하면 DC모터 역시 회전한다.
PORT_MOTOR |= ( 0 << PORT_MINUS) | ( 1 << PORT_PLUS );
} else {
//DC모터를 끈다.
PORT_MOTOR = 0;
}
///////////////////////////////////
uart_send_return();
m_delay(100);
}
return 1;
}
'컴퓨터 > c관련 숙제' 카테고리의 다른 글
c로 배우는 자료구조 연습문제 (0) | 2013.12.29 |
---|---|
DK128 EXT2 기본 메뉴얼 참조 구문 (0) | 2013.12.29 |
노드 입력 후 부자노드 찾기 (0) | 2013.12.29 |
DK128 -EXT2 온도센서 (0) | 2013.12.29 |
조도센서 부분작동 (0) | 2013.12.29 |
RECENT COMMENT