답변 : ATMEGA128A 질문있습니다 수정자료
페이지 정보
작성자 master 작성일18-12-16 08:04 조회9,166회 댓글2건본문
// MCU BASIC: https://www.basic4mcu.com
// DateTime : 2018-12-16 오전 8:07:00
// by Ok-Hyun Park
//
#include <io.h>
//
typedef enum{ra_1,si_1,do_2,re_2,mi_2,fa_2,sol_2,ra_2,high} melody_code; //high: 불가청 음역대 쉼표 표시
typedef enum{tf,f,sf,o,t} speed_code; // 1/4,1/2,3/4,1,2
//
const char clock_set[]={0x6F,0x6E,0x6E,0x6E,0x6E,0x6E,0x6E,0x6E,0x6A};
const char ocr0_set[] ={142,253,238,212,189,179,159,142,1};
const int timer[] ={188,375,563,750,1500}; // 단위: ms
const char led[] ={0x01,0x03,0x07,0x0f,0xff};
const char oct[] ={0x06,0x06,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x00};
const char scale[] ={0x77,0x39,0x06,0x4f,0x6d,0x7d,0x7f,0x77,0x00};
//
typedef struct{ melody_code melody; speed_code speed;} MUSIC_CODE;
//
#define LENGTH 99
//
const MUSIC_CODE musicCode1[LENGTH]={
{sol_2,o},{mi_2,o},{do_2,o},{high,o},{re_2,sf},{mi_2,tf},{fa_2,f},{re_2,f},{si_1,o},{high,o}, // 즐겁게 춤을추다가
{do_2,o},{do_2,f},{do_2,f},{mi_2,o},{mi_2,o},{sol_2,f},{high,f},{high,o},{high,t}, // 그대로 멈춰라
{sol_2,o},{mi_2,o},{do_2,o},{high,o},{re_2,sf},{mi_2,tf},{fa_2,f},{re_2,f},{si_1,o},{high,o}, // 즐겁게 춤을추다가
{ra_1,o},{ra_1,f},{ra_1,f},{si_1,o},{si_1,o},{do_2,f},{high,f},{high,o},{high,t}, // 그대로 멈춰라
{ra_2,o},{ra_2,o},{ra_2,f},{ra_2,f},{ra_2,f},{ra_2,f}, // 눈도 감지말고
{sol_2,o},{sol_2,f},{sol_2,f},{sol_2,o},{sol_2,o}, // 웃지도 말고
{fa_2,o},{fa_2,f},{fa_2,f},{fa_2,o},{fa_2,o}, // 울지도 말고
{mi_2,f},{mi_2,f},{fa_2,f},{fa_2,f},{sol_2,f},{high,f},{high,o}, // 움직이지마
{sol_2,o},{mi_2,o},{do_2,o},{high,o},{re_2,sf},{mi_2,tf},{fa_2,f},{re_2,tf},{si_1,o},{high,o},// 즐겁게 춤을추다가
{do_2,o},{do_2,tf},{do_2,f},{mi_2,o},{mi_2,o},{sol_2,f},{high,f},{high,o},{high,t}, // 그대로 멈춰라
{sol_2,o},{mi_2,o},{do_2,o},{high,o},{re_2,sf},{mi_2,tf},{fa_2,f},{re_2,f},{si_1,o},{high,o}, // 즐겁게 춤을추다가
{ra_1,o},{ra_1,f},{ra_1,f},{si_1,o},{si_1,o},{do_2,f},{high,f},{high,o},{high,t} // 그대로 멈춰라
};
//
int ms=0;
//
interrupt[TIM2_COMP]void isr_timer2_comp(){
ms++;
}
//
void main(){
int k;
DDRB=0x10; DDRA=0XFF; DDRC=0xFF; DDRG=0x0F;
TCCR2=0x0B; OCR2=249; TIMSK=0x80; //16000000/64/(1+249),1ms
SREG=0x80;
while(1){
for(k=0;k<=98;k++){
ms=0;
while(timer[musicCode1[k].speed]>ms){ // 박자 조절
OCR0=ocr0_set[musicCode1[k].melody];
TCCR0=clock_set[musicCode1[k].melody];
PORTA=led[musicCode1[k].speed]; // led 박자 길이 표시
if(ms&1){ PORTC=oct[musicCode1[k].melody]; PORTG=8; } // 옥타브 표시
else { PORTC=scale[musicCode1[k].melody]; PORTG=1; } // 음계 표시
}
}
}
}
몇가지 오류를 체크 했지만 정상동작할런지는 모르겠습니다.
원본 소스 출처에서 정상동작하는 소스인지 확인 해보세요
16비트 타이머로 만든 멜로디 예제를 공부해서 만드는 것이 빠를 수도 있겠습니다.
https://www.basic4mcu.com/bbs/board.php?bo_table=gesiyo9&wr_id=138
게시판에 몇개의 글이 더 있습니다.
댓글 : 2
조회수 : 9,166
헤헿헿님의 댓글
헤헿헿 작성일
감사합니다 드디어 해결됬네요 ㅠ
if(ms & 1) 에서 &가 어떻게 동작하는지만 마지막으로 설명해주실 수 있나요
master님의 댓글
master
ms&1
ms가 1이면 결과는 1
ms가 0이면 결과는 0
if(ms&1){ PORTC=oct[musicCode1[k].melody]; PORTG=8; } // 옥타브 표시
else { PORTC=scale[musicCode1[k].melody]; PORTG=1; } // 음계 표시
ms가 홀수면 옥타브표시
짝수면 음계표시