BASIC4MCU | 질문게시판 | ATMEGA 광센서 부저
페이지 정보
작성자 코딩 작성일2023-05-23 14:44 조회2,510회 댓글2건본문
ATMEGA J-KIT 128 이 코드를 실행하면 빛의 광량에 따라 자동차 후방 감지 시스템 처럼 부저가 울리도록 코드를 짰는데 부저가 울리지 않아서 어떤 부분을 수정을 해야 빛의 광량에 따라 부저가 울릴까여??
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#define __DELAY_BACKWARD_COMPATIBLE__
#include <util/delay.h>
#define CDS_VALUE1 600 // 광량 최저
#define CDS_VALUE2 871 // 광량 중간
#define CDS_VALUE3 1024 // 광량 최대
unsigned short read_adc();
void buzzer(int ms);
void danger(unsigned short value);
int main()
{
unsigned short value;
DDRB = 0xFF;
ADMUX = 0x00;
ADCSRA = 0x87;
sei(); // interrupt enable;
TCCR0 = 0x03; // prescaler 32분주
TIMSK = 0x01;
while(1)
{
value = read_adc();
danger(value);
}
}
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 buzzer(int ms)
{
PORTB = 0x10;
_delay_ms(ms);
PORTB = 0x00;
_delay_ms(ms);
}
void danger(unsigned short value)
{
if(value < CDS_VALUE1)
{
buzzer(0);
}
else if((value >= CDS_VALUE1) && (value <= CDS_VALUE2))
{
buzzer(500);
}
else if(value > CDS_VALUE3)
{
buzzer(1000);
}
}
댓글 2
조회수 2,510master님의 댓글
master 작성일
부저는 두 종류가 있습니다.
1. 발진회로가 내장된 부저로서 전원만 연결하면 고정된 주파수의 소리가 납니다.
2. 발진회로가 없는 부저로서 포트에 펄스를 출력해서 부저를 구동해야 합니다. 멜로디 연주 할 때 이 부저를 사용합니다.
코드를보면 1번(능동부저,액티브부저) 부저를 구입해야 하는데 2번 부저를 구입한 것이 아닌가 생각됩니다.
//
코드에도 문제가 있군요
TIMSK = 0x01;
인터럽트 이네이블 시켰으면 인터럽트 함수가 있어야합니다.
함수없이 이네이블 시키면 오동작하거나 먹통됩니다.
master님의 댓글
master 작성일
#include <avr/io.h>
#define F_CPU 16000000UL
#define __DELAY_BACKWARD_COMPATIBLE__
#include <util/delay.h>
//
int main(){
int i;
DDRB=0x10;
while(1){
for(i=0;i<2000;i++){ PORTB^=0x10; _delay_us(500); } // 1KHz 1초동안
for(i=0;i<4000;i++){ PORTB^=0x10; _delay_us(250); } // 2KHz 1초동안
for(i=0;i<6000;i++){ PORTB^=0x10; _delay_us(166); } // 3KHz 1초동안
}
}
발진회로가 없는 부저 테스트용 코드입니다.
#include <avr/io.h>
#define F_CPU 16000000UL
#define __DELAY_BACKWARD_COMPATIBLE__
#include <util/delay.h>
//
int main(){
DDRB=0x10;
while(1){
PORTB^=0x10; _delay_ms(1000); // 1초 ON, 1초 OFF
}
}
발진회로가 있는 부저 테스트용 코드입니다.