BASIC4MCU | 질문게시판 | 답변 : atmega128 온도센서 질문입니다.
페이지 정보
작성자 master 작성일2022-12-10 06:46 조회424회 댓글1건본문
atemga 128 jkit 에 내장되어있는 aTS75 온도센서와 led를 이용해,30도가 넘으면 led가 켜지도록 만들고 싶습니다.
아래 코드는 온도를 감지해 fnd에 출력하는 코드인데,main 함수 내에서
temperature를 받아오는 것을 이용해 while문 안에 if문을 써서 만들고 싶은데,어떻게 써야할지 모르겠습니다.. 도와주실 수 있으실지요..
//
#define F_CPU 16000000UL
#include <avr/io.h>
#include <stdio.h>
#include <util/delay.h>
//
#define aTS75_CONFIG_REG 1
#define aTS75_TEMP_REG 0
//
void I2C_Init(void){
TWBR=12; // 16000000 /(16 +(2x12))x prescaler=400000Hz=400kHz
TWSR=(0<<TWPS1)|(0<<TWPS0); // prescaler=1
TWCR=0x04;
}
//
void I2C_start(void){
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); while(!(TWCR &(1<<TWINT)));
}
//
void I2C_write(unsigned char data){
TWDR=data;
TWCR=(1<<TWINT)|(1<<TWEN); while(!(TWCR &(1<<TWINT)));
}
//
unsigned char I2C_read(unsigned char ackVal){
TWCR=(1<<TWINT)|(1<<TWEN)|(ackVal<<TWEA); while(!(TWCR &(1<<TWINT)));
return TWDR;
}
//
void I2c_stop(void){
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
for(int k=0; k<100; k++); //wait
}
/*
* Pointer set followed by immediate write to the Configuration Register 데이터시트 참조
*/
void temp_init(void){
I2C_Init(); I2C_start(); I2C_write(0b10011000); I2C_write(aTS75_CONFIG_REG); I2C_write(0x00); I2c_stop();
}
/*
* Pointer set followed by immediate read from a 2-byte register 데이터시트 참조
*/
int temp_read(void){
char high_byte,low_byte;
I2C_start(); I2C_write(0x98); I2C_write(aTS75_TEMP_REG);
I2C_start(); I2C_write(0x98|1); high_byte=I2C_read(1); low_byte=I2C_read(0);
I2c_stop();
return((high_byte<<8)|low_byte);
}
//
void display_FND(int value){
char digit[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67,0x40,0x00};
char fnd_sel[4]={0x01,0x02,0x04,0x08};
char value_int,value_deci,num[4];
int i;
if((value&0x8000)==0)num[3]=11; // 양수면
else{ num[3]=10; value=-value; } // 음수면 양수로
value_int=(char)((value&0x7f00)>>8);
value_deci=(char)(value&0x00ff);
num[2]=value_int/10%10;
num[1]=value_int%10;
num[0]=((value_deci&0x80)==0x80)*5;
for(i=0;i<4;i++){ PORTC=digit[num[i]]; PORTG=fnd_sel[i]; if(i==1)PORTC|=0x80; _delay_ms(2); }
}
//
int main(void){
int temperature=0,temp=0;
DDRA=0xff; PORTD=3; DDRC=0xff; DDRG=0xff;
temp_init();
_delay_ms(100);
while(1){
temperature=temp_read();
display_FND(temperature);
temp=temperature>>8;
if(temp>=30){ PORTA=0xff; } // LED 모두 ON
else { PORTA=0x00; } // LED 모두 OFF
}
}
댓글 1
조회수 424으아어려워님의 댓글
으아어려워 작성일답변 너무 감사드립니다!