BASIC4MCU | 질문게시판 | ATMEGA128 buzzer(스피커) 질문입니다.
페이지 정보
작성자 XOXO 작성일2022-04-29 19:59 조회1,326회 댓글4건본문
주파수를 담은 배열을 만들고,
스위치를 누르는 동안 소리가 나고, 스위치를 다시 누르면 다음번 소리가 나게 하려고 합니다.
main문 출력에서 tone(500); 이나 tone(600); 등으로 입력하면 소리가 정상적으로 나오는데,
사진처럼 tone(freq[i]); 를 하면 소리가 이상하게 나옵니다...
원하는 결과를 얻으려면 어떻게 해야 할까요?
혹은 문제가 무엇인가요?
#include
#include
#define F_CPU 16000000UL
#define __DELAY_BACKWARD_COMPATIBLE__
#include
#define HALF_CYC 500000UL
#define M1 1<<1
#define M0 1<<0
void tone2(int fr, int duration){
uint32_t t_tot=HALF_CYC/fr;
int t_ms=t_tot/1000, t_us=t_tot % 1000, i;
for (i=0; i;>
PORTE |= M1;
_delay_ms(t_ms); _delay_us(t_us);
PORTE &= ~M1;
_delay_ms(t_ms); _delay_us(t_us);
}
}
void tone(int fr){
uint32_t t_tot=HALF_CYC/fr;
int t_ms=t_tot/1000, t_us=t_tot % 1000;
PORTE |= M1;
_delay_ms(t_ms); _delay_us(t_us);
PORTE &= ~M1;
_delay_ms(t_ms); _delay_us(t_us);
}
int main() {
DDRE |= M1;
unsigned int freq[]={523, 587, 659, 698,784, 880, 988, 1047};
// 도 레 미 파 솔 라 시 도
while(1){
for(unsigned int i=0;i<8;i++){
if ((PINE & M0)== 0){
tone(freq[i]);
}}}}
댓글 4
조회수 1,326master님의 댓글
master 작성일
for(unsigned int i=0;i<8;i++){
if ((PINE & M0)== 0){
tone(freq[i]);
}
}
스위치를 눌러도 for()문은 순식간에 8개의 루프문을 실행합니다.
스위치를 누르지 않아도 마찬가지죠
master님의 댓글
master 작성일
for(unsigned int i=0;i<8;i++){
while(PINE & M0); _delay_ms(50); // 누르지 않으면 누를 때까지 대기
tone(freq[i]);
while((PINE & M0)==0); _delay_ms(50); // 누르고 있는 동안 대기
}
딜레이는 채터링 방지용입니다.
XOXO님의 댓글
XOXO
작성해주신대로 프로그램 실행을 해보았는데,
소리가 다른 방식으로 이상하게 납니다. (정상적인 소리가 안납니다.)
master님의 댓글
master 작성일
for(unsigned int i=0;i<8;i++){
while(PINE & M0); _delay_ms(50); // 누르지 않으면 누를 때까지 대기
while((PINE & M0)==0)tone(freq[i]); _delay_ms(50); // 누르고 있는 동안 펄스 출력
}