BASIC4MCU | 질문게시판 | atmega128 스위치 질문입니다.
페이지 정보
작성자 으아어려워 작성일2022-12-16 06:42 조회681회 댓글0건본문
온도가 30도 이상 넘어가면 부저와 led가 켜지고, 30도 이상이 아니라도 스위치를 사용해 스위치를 한번 눌렀을 때 부저와 led가 켜지고, 한번 더 누르면 부저와 led가 꺼지도록 만들어 보고 있습니다.
제 코드가 이상해서 그런지 한번 누르면 부저와 led 둘 다 켜지는데, 스위치를 한번 더 눌러도 아무런 변화가 없습니다.. 그리고 스위치를 한번 눌렀을 때 부저와 led가 켜지고나서, 30도 이상으로 갔다가 30도 이하로 떨어졌을 때 led와 부저가 꺼지지 않아 어떻게 고쳐야 할지 모르겠습니다..ㅠㅠ
그리고 가끔 온도가 30도 이상이 되는 시점에 led는 들어오는데 FND 불이 나가버리는 현상이 있습니다.. 꼭 이때가 아니라도 가끔가다 기계가 꺼져버리는데, 이러한 현상이 제 코드때문에 그런 것 같습니다.. 어디 문제가 있을까요.??
#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
#define ON 1
#define OFF 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); }
}
void buzzer(int hz) {
int ms = (int)(500 / (float) hz);
PORTB = 0x10;
_delay_ms(ms);
PORTB = 0x00;
_delay_ms(ms);
}
//
int main(void){
int temperature=0,temp=0, state=OFF;
DDRA=0xff; DDRB=0x10; PORTD=3; DDRE=0x00; DDRC=0xff; DDRG=0xff;
temp_init();
_delay_ms(100);
while(1){
temperature=temp_read();
display_FND(temperature);
temp=temperature>>8;
if ((PINE & 0x10) == 0x00) {
if(state == OFF){
state = ON;
while(state=ON){
temperature=temp_read();
display_FND(temperature);
PORTA = 0xff;
buzzer(500);}
} else {
state = OFF;
while(state=OFF){
temperature=temp_read();
display_FND(temperature);
PORTA = 0x00;
PORTB = 0x00;
_delay_ms(1);}
}
}
if(temp>=30){
PORTA=0xff;
buzzer(500);
} // LED 모두 ON
else{
PORTA=0x00;
PORTB=0x00;
_delay_ms(1);
} // LED 모두 OFF
}
}
댓글 0
조회수 681등록된 댓글이 없습니다.