BASIC4MCU | 질문게시판 | atmega128, 스위치 사용하여 저장된 노래 바꾸기
페이지 정보
작성자 ddd5588 작성일2021-04-06 15:06 조회48,382회 댓글6건본문
#include <avr/io.h> // ATmega128 register 정의
#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 RA 5
#define SI 6
#define DDO 7
#define REST 8
#define EOS -1
#define ON 0
#define OFF 1
#define N2 1250 // 60*1000/96*2
#define N4 625 // 60*1000/96
#define N8N16 469 //N8+N16
#define N8 313 //60*1000/96/2
#define N16 156 //60*1000/96/4
#define R 1 //묶음은 1ms
volatile int state,tone;
char f_table[] = {17,43,66,77,97,114,117,137,255};
//곰세마리
int song1[] = {DO,DO,DO,DO,DO,MI,SOL,SOL,MI,DO,SOL,SOL,MI,SOL,SOL,MI,DO,DO,DO,
SOL,SOL,MI,DO,SOL,SOL,SOL,SOL,SOL,MI,DO,SOL,SOL,SOL,SOL,SOL,MI,DO,SOL,SOL,SOL,RA,SOL,DDO,SOL,DDO,SOL,MI,RE,DO,EOS};
int time1[] = {N4,N8,N8,N4,N4,N4,N8,N8,N4,N4,N8,N8,N4,N8,N8,N4,N4,N4,N2,N4,N4,N4,N4,N4,N4,N2,N4,N4,N4,N4,N4,N4,N2,N4,N4,N4,N4,N8,N8,N8,N8,N2,N4,N4,N4,N4,N4,N4,N2};
//작은별
int song2[] = {DO,DO,SOL,SOL,RA,RA,SOL,FA,FA,MI,MI,RE,RE,DO,SOL,SOL,FA,FA,MI,MI,RE,SOL,SOL,FA,FA,MI,MI,RE,DO,DO,SOL,SOL,RA,RA,SOL,FA,FA,MI,MI,RE,RE,DO,EOS};
int time2[] = {N4,N4,N4,N4,N4,N4,N2,N4,N4,N4,N4,N4,N4,N2,N4,N4,N4,N4,N4,N4,N2,N4,N4,N4,N4,N4,N4,N2,N4,N4,N4,N4,N4,N4,N2,N4,N4,N4,N4,N4,N4,N2};
//산토끼
int song3[] = {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};
int time3[] = {N4,N8,N8,N8,N8,N4,N4,N8,N8,N8,N8,N4,N8,N8,N8,N8,N8,N8,N4,N4,N8,N8,N8,N8,N4};
char LED[] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00};
ISR(INT4_vect)
{
_delay_ms(100);
EIFR = 1<<4;
if((PINE & 0X10)==0x10)
{
return;
}
}
ISR(TIMER0_OVF_vect)
{
TCNT0=f_table[tone];
if(state == OFF)
{
PORTB |=1<<4;
state = ON;
}
else
{
PORTB &= ~(1<<4);
state = OFF;
}
}
int main()
{
int i=0;
DDRA = 0xff;
DDRB |= 0X10;
TCCR0 = 0x03;
TIMSK = 0x01;
TCNT0 = f_table[song[i]];
sei();
while(1)
{
i=0;
do{
tone = song[i];
PORTA = LED[tone];
_delay_ms(time[i++]);
}while(song[i]!=EOS);
}
}
노래를 3개 지정한 후 스위치를 누를 때 노래가 바뀌도록 코드를 짜야하는데 무엇이 문제인지 모르겠네요..알려주시면 감사하겠습니다.
댓글 6
조회수 48,382master님의 댓글
master 작성일
#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 RA 5
#define SI 6
#define DDO 7
#define REST 8
#define EOS -1
#define ON 0
#define OFF 1
#define N2 1250 // 60*1000/96*2
#define N4 625 // 60*1000/96
#define N8N16 469 // N8+N16
#define N8 313 // 60*1000/96/2
#define N16 156 // 60*1000/96/4
#define R 1 // 묶음은 1ms
//
volatile int state,tone,mode=0,i=0,flag=0;
//
char f_table[]={17,43,66,77,97,114,117,137,255};
//곰세마리
int song1[]={DO,DO,DO,DO,DO,MI,SOL,SOL,MI,DO,SOL,SOL,MI,SOL,SOL,MI,DO,DO,DO,
SOL,SOL,MI,DO,SOL,SOL,SOL,SOL,SOL,MI,DO,SOL,SOL,SOL,SOL,SOL,MI,DO,SOL,SOL,SOL,RA,SOL,DDO,SOL,DDO,SOL,MI,RE,DO,EOS
};
int time1[]={N4,N8,N8,N4,N4,N4,N8,N8,N4,N4,N8,N8,N4,N8,N8,N4,N4,N4,N2,N4,N4,N4,N4,N4,N4,N2,N4,N4,N4,N4,N4,N4,N2,N4,N4,N4,N4,N8,N8,N8,N8,N2,N4,N4,N4,N4,N4,N4,N2};
//작은별
int song2[]={DO,DO,SOL,SOL,RA,RA,SOL,FA,FA,MI,MI,RE,RE,DO,SOL,SOL,FA,FA,MI,MI,RE,SOL,SOL,FA,FA,MI,MI,RE,DO,DO,SOL,SOL,RA,RA,SOL,FA,FA,MI,MI,RE,RE,DO,EOS};
int time2[]={N4,N4,N4,N4,N4,N4,N2,N4,N4,N4,N4,N4,N4,N2,N4,N4,N4,N4,N4,N4,N2,N4,N4,N4,N4,N4,N4,N2,N4,N4,N4,N4,N4,N4,N2,N4,N4,N4,N4,N4,N4,N2};
//산토끼
int song3[]={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};
int time3[]={N4,N8,N8,N8,N8,N4,N4,N8,N8,N8,N8,N4,N8,N8,N8,N8,N8,N8,N4,N4,N8,N8,N8,N8,N4};
char LED[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x00};
//
ISR(INT4_vect){
_delay_ms(100);
EIFR=1<<4;
if((PINE & 0x10)==0x10)return;
if(++mode>3)mode=0;
flag=1;
}
//
ISR(TIMER0_OVF_vect){
TCNT0=f_table[tone]
if(state==OFF){ PORTB|=0x10; state=ON; } else{ PORTB&=~(0x10); state=OFF; }
}
//
int main(){
DDRA=0xff; DDRB|=0x10;
TCNT0=f_table[song[i]]; TCCR0=0x03; TIMSK=0x01; sei();
while(1){
if(flag){ flag=0;
i=0;
if(mode==1){ do{ tone=song1[i]; PORTA=LED[tone]; _delay_ms(time1[i++]); if(mode!=1)break; }while(song1[i]!=EOS); }
if(mode==2){ do{ tone=song2[i]; PORTA=LED[tone]; _delay_ms(time2[i++]); if(mode!=2)break; }while(song2[i]!=EOS); }
if(mode==3){ do{ tone=song3[i]; PORTA=LED[tone]; _delay_ms(time3[i++]); if(mode!=3)break; }while(song3[i]!=EOS); }
}
}
}
대충 이런식으로 작성하면 되지 않을까요?
ddd5588님의 댓글
ddd5588
master님께서 작성해주신대로 입력을 해보니 노래와 소리가 안들립니다.. 혹시 스위치 코딩에 대해서 설명해주실 수 있나요?
ddd5588님의 댓글
ddd5588 작성일해보았는데 실행이 안 되네요.. 노래 3 개를 어떻게 지정하면 되는지 궁금합니다.
master님의 댓글
master
원래 예제는 동작이 잘 되었는지 확인 하셨나요?
ddd5588님의 댓글
ddd5588
원래 예제도 동작이 잘 안되었습니다. 그 전 문제들은 노래를 한가지, 스위치 없이 작동하게 만드는 코딩이었기때문에 문제가 없었는데 이번 문제는 노래를 3곡으로 변수로 잡고 스위치를 작동해야해서 스위치 부분과 main 함수를 어떻게 고쳐야할지 모르겟어서 문의드렸습니다.
master님의 댓글
master
하드웨어 세트가 동일하게 갖춰져 있어야지 체크가 가능합니다.
즉, 타인은 문제를 찾기가 쉽지 않다는 것이죠
많은 부분을 스스로 해결하고, 혼자서 도저히 안되는 부분을 질문하셔야지 원하는 목표를 달성할 수 있을 것 같습니다.