BASIC4MCU | 질문게시판 | ATEMEGA JKIT 이용하여 스위치 부저 코딩
페이지 정보
작성자 2상호 작성일2023-05-18 16:51 조회48회 댓글1건본문
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#define __DELAY_BACKWARD_COMPATIBLE__
#include <util/delay.h>
#define DO 0
#define RE 1
#define MI 2
#define FA 3
#define SOL 4
#define REST 5
#define EOS -1 // END OF SONG 표시
#define BUZZER_PLAY 1
#define BUZZER_STOP 0
#define ON 0 // 버저 ON
#define OFF 1 // 버저 OFF
#define R 1 // 묵음 연주 시간, 1(ms)
#define N2 1250 // 2분 음표 연주시간, 60*1000/96*2 (ms)
#define N4 (N2/2) // 4분 음표 연주시간, 60*1000/96* (ms)
#define N8 (N2/8) // 8분 음표 연주시간, 60*1000/96/2 (ms)
volatile int state, tone;
volatile int BUZZER_STATE = BUZZER_STOP;
char f_table[] = {17,43,66,77,97}; // 도레미파솔에 해당하는 TCNTO 값
int song[] = {MI, RE, DO, RE, MI, MI, MI, RE, RE, RE, MI, MI, MI, REST , MI, RE, DO, RE, MI, MI, MI, RE, RE, MI, RE, DO, EOS}; // 비행기 음계
int time[] = {N4, N8, N4, N4 ,N4,N4 ,N2, N4, N4 ,N2, N4, N4, N2, R,N4, N8, N4, N4, N4, N4, N4, N4,N4,N4,N4 ,N2, N4}; // 비행기 박자
ISR(TIMER0_OVF_vect) // Timer/Counter0 오버플로우 인터럽트 서비스 루틴=-
{
TCNT0 = f_table[tone]; // TCNT0 초기화 (주어진 음을 만들기 위해)
if(state == OFF)
{
PORTB |= 1 << 4; // 버저 포트 ON
state = ON;
}
else
{
PORTB &= ~(1<<4); // 버저 포트 OFF
state=OFF;
}
}
ISR(INT4_vect)
{
if(BUZZER_STATE == BUZZER_STOP)
{BUZZER_STATE = BUZZER_PLAY;}
else
{
BUZZER_STATE = BUZZER_STOP;
}
}
int main()
{
int i=0;
DDRB |= 0x10; // 버저 포트 연결 포트 출력 설정
TCCR0 = 0x03; // 프리스케일러 32분주
TIMSK = 0X01; //오버플로우 인터럽트 활성화
TCNT0 = f_table[song[i]]; // TCNT0 초기화
sei(); // 전역인터럽트 활성화
while(1)
{if(BUZZER_STATE == BUZZER_PLAY)
{
i=0; // 노래 반복 초기화
do{
tone = song[i]; // 현재 음계
_delay_ms(time[i++]); // 한 계명당 지속시간
}while(song[i] != EOS); // 노래 마지막 음인지 검사
}else{TCNT0 = BUZZER_STOP;}
}
}
JKIT를 연결하여 스위치를 눌렀을 경우에 비행기 노래가 나오도록 코딩을 해봤는데 이러니 계속 삐 소리만 나고 비행기 노래는 안 나와서 어느 부분이 틀린지 궁금합니다 !
댓글 1
조회수 48master님의 댓글
master 작성일
부저는 발진회로가 내장된 능동부저가 있고
발진회로가 없는 수동부저가 있습니다.
멜로디를 연주하려면 수동부저를 사용해야 하는데
능동부저를 사용하고 있는지 체크 해보세요
5V 전원에 부저를 연결해서 소리가 난다면 능동부저이고, 새로 구입하셔야 합니다.