BASIC4MCU | 질문게시판 | atmega 128 코드 합치기
페이지 정보
작성자 코딩응애 작성일2018-12-12 00:21 조회8,080회 댓글2건첨부파일
본문
조도 센서 이용하여 주위 밝기 따라 변하는 led 코드와
온도센서 쓰는 lcd코드를 제가 합치니 구동에 오류가 자꾸 납니다ㅠㅠ
코드 어떻게 합쳐야 하나요ㅜㅜ
댓글 2
조회수 8,080master님의 댓글
master 작성일코드를 이해 해야지 문제가 발생하지 않도록 합칠 수 있습니다.
코딩응애님의 댓글
코딩응애
adc 에서 다중채널을 사용하려면 채널 전환시 사이에 delay를 주어야 한다고 해서 바꾸었는데 온도센서는 작동하는데 조도센서는 작동하지 않습니다..ㅠ 도와주세요ㅜㅜ
#define F_CPU 16000000
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include "UART1.h"
FILE OUTPUT\
=FDEV_SETUP_STREAM(UART1_transmit,NULL,_FDEV_SETUP_WRITE);
FILE INPUT\
=FDEV_SETUP_STREAM(NULL,UART1_receive,_FDEV_SETUP_READ);
//
#define FUNCSET 0x28 //Function Set
#define ENTMODE 0x06 //Entry Mode Set
#define ALLCLR 0x01 //Clear Display
#define DISPON 0x0c //Display On
#define LINE2 0xC0 //Set DDRAM Address(0x40)
#define LINE3 0x94 //Set DDRAM Address(0x14)
#define LINE4 0xD4 //Set DDRAM Address(0x54)
//
#define PORT_DATA PORTC
#define DDR_DATA DDRC
//
#define Byte unsigned char
//
volatile Byte flag=0,sec=0,min=0,hour=0;
//
void ADC_init(unsigned char channel)
{
ADMUX|=(1<<REFS0); // AVCC를기준전압으로선택
_delay_us(100);
ADCSRA|=0x07; // 분주비설정
ADCSRA|=(1<<ADEN); // ADC 활성화
ADCSRA|=(1<<ADFR); // 프리러닝모드
_delay_us(100);
ADMUX|=((ADMUX&0xE0)|channel); // 채널선택
_delay_us(100);
ADCSRA|=(1<<ADSC); // 변환시작
_delay_us(100);
}
//
int read_ADC(void)
{
_delay_us(100);
while(!(ADCSRA&(1<<ADIF))); // 변환종료대기
return ADC; // 10비트값을반환
}
//
void LCD_CMD(unsigned char byte){
PORT_DATA=(byte&0xF0)|4; _delay_us(1); PORT_DATA&=0xFB;
PORT_DATA=(byte<<0x4)|4; _delay_us(1); PORT_DATA&=0xFB; _delay_ms(3);
}
//
void LCD_CHAR(unsigned char byte){
PORT_DATA=(byte&0xF0)|5; _delay_us(1); PORT_DATA&=0xFB;
PORT_DATA=(byte<<0x4)|5; _delay_us(1); PORT_DATA&=0xFB; _delay_us(50);
}
//
void LCD_STR(Byte*s){ while(*s)LCD_CHAR(*s++); }
//
void LCD_INIT(void){
DDR_DATA=0xFF; _delay_ms(15); LCD_CMD(0x20); LCD_CMD(0x20); LCD_CMD(0x20);
LCD_CMD(FUNCSET); LCD_CMD(DISPON); LCD_CMD(ALLCLR); LCD_CMD(ENTMODE);
}
//
ISR(TIMER1_COMPA_vect){
if(++sec>59){ sec=0;
if(++min>59){ min=0; if(++hour>23)hour=0; }
}
flag=1;
}
int dim=0;
void led(){
UART1_init();
ADC_init(5);
DDRB |= (1<<PB5);
TCCR1A |= (1<<WGM11);
TCCR1A |= (1<<COM1A1);
TCCR1B |= (1<<CS12);
}
void ledtwo(){
ADC_init(5);
int read;
OCR1A = dim;
_delay_ms(10);
read=read_ADC();
if(read<100)
{
dim=200;
}
else if(read>100)
{
dim=10;
}
}
int main(void){
int read,temperature;
float input_voltage;
Byte str1[]="Current Time"; Byte str2[]=" 00:00:00";
Byte str3[]="Temperature"; Byte str4[]=" 00C";
LCD_INIT();
LCD_STR(str1);
LCD_CMD(LINE2); LCD_STR(str2);
LCD_CMD(LINE3); LCD_STR(str3);
LCD_CMD(LINE4); LCD_STR(str4);
TCCR1B=0x0D; OCR1A=15624; TIMSK=0x10;
stdout=&OUTPUT;
stdin=&INPUT;
UART1_init();
void led();
SREG=0x80;
while(1){
if(flag){ flag=0;
LCD_CMD(LINE2);
LCD_CHAR(' '); LCD_CHAR((hour/10)+'0'); LCD_CHAR((hour%10)+'0'); LCD_CHAR(':');
LCD_CHAR((min /10)+'0'); LCD_CHAR((min%10)+'0'); LCD_CHAR(':');
LCD_CHAR((sec /10)+'0'); LCD_CHAR((sec%10)+'0');
ADC_init(3);
read=read_ADC(); // ADC 값읽기
// 0에서1023 사이의값을0V에서5V 사이값으로변환한다.
input_voltage=read*5.0/1023.0;
// 10mV에1℃이므로100을곱해서현재온도를얻는다.
temperature=(int)(input_voltage*100.0);
LCD_CMD(LINE4);
LCD_CHAR(' '); LCD_CHAR((temperature/10)+'0'); LCD_CHAR((temperature%10)+'0'); LCD_CHAR('C');
void ledtwo();
} // 1초에한번읽음
}
return 0;
}