BASIC4MCU | 질문게시판 | atmega128a 광센서
페이지 정보
작성자 동스타 작성일2019-05-25 13:05 조회7,586회 댓글1건첨부파일
본문
부저가 끝남과 동시에 cds센서를 이용해 LED포트가 출력이 되야합니다.
코드를 보시면 while(tone!=EOS)에서 부저가 끝남과 동시에 밑에 value=read_adc(); show_adc(value); 이런 코드가 있어 cds센서가 작동해야 한다고 저는 봅니다.
그러나 동영상을 보시면 그렇지 않았습니다. 여기까지 공부를 하다가 도저히 안되어 master님께 질문해봅니다.
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#include <util/delay.h>
//
#define DO 0
#define RE 1
#define MI 2
#define FA 3
#define SOL 4
#define RA 5
#define SI 6
#define DDO 7
#define EOS -1
//
#define STOP 0
#define GO 1
//
#define CDS_VALUE 871
unsigned char digit[10] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67};
char f_table[8]={17,43,66,77,97,114,117,137};
int song[] ={SOL,MI,MI,SOL,MI,DO,RE,MI,RE,DO,MI,SOL,DDO,SOL,DDO,SOL,DDO,SOL,MI,SOL,RE,FA,MI,RE,DO,EOS};
//
volatile int tone,run=STOP;
//
ISR(INT4_vect)
{
if(run==STOP)
run=GO;
}//
ISR(TIMER0_OVF_vect)
{
if(run==STOP)
{
PORTB=0x00;
run=GO;
}
else
{
PORTB=0x10;
run=STOP;
}
TCNT0=f_table[tone];
}
//
void display_fnd(int i)
{
PORTC=digit[i/1000%10];
PORTG=1;
_delay_us(2500);
PORTC=digit[i/100 %10];
PORTG=2;
_delay_us(2500);
PORTC=digit[i/10 %10];
PORTG=4;
_delay_us(2500);
PORTC=digit[i %10];
PORTG=8;
_delay_us(2500);
}
//
void init_adc()
{
ADMUX=0x00;
ADCSRA=0x87;
}
//
unsigned short read_adc()
{
unsigned char adc_low,adc_high;
unsigned short value;
ADCSRA|=0x40;
while((ADCSRA&0x10)!=0x10);
adc_low=ADCL;
adc_high=ADCH;
value=(adc_high<<8)|adc_low;
return value;
}
//
void show_adc(unsigned short value)
{
if(value < CDS_VALUE)
{
PORTA=0xff;
}
else
{
PORTA=0x00;
}
}
//
int main()
{
int i=0;
unsigned short value;
init_adc();
DDRA=0xff;
PORTC=digit[0];
PORTG=0x0f;
DDRB=0x10;
DDRC=0xff;
DDRE=0xcf;
DDRG=0x0f;
//
for(i=500; i>=0; i--)
{
display_fnd(i);
value=read_adc();
show_adc(value);
}//
TCNT0=f_table[song[i]];
TCCR0=0x03;
TIMSK=0x01;
EICRB=0xAA;
EIMSK=0x0;
sei();
//
while(1)
{
if(run)
{
while(tone !=EOS)
{
tone=song[i++];
if(tone==EOS)
{
i=0;
run=STOP;
}
_delay_ms(500);
value=read_adc();
show_adc(value);
}
value=read_adc();
show_adc(value);
}
}}
댓글 1
조회수 7,586master님의 댓글
master 작성일
//EIMSK=0x0;
EIMSK=0x10;
INT4가 동작하기 위해서는 EIMSK가 올바르게 설정되어야합니다.