답변 : ATMEGA128A timer 관련 질문있습니다.
페이지 정보
작성자 master 작성일18-12-15 17:05 조회4,452회 댓글1건본문
// MCU BASIC: https://www.basic4mcu.com
// DateTime : 2018-12-15 오후 5:09:01
// by Ok-Hyun Park
//
#include <io.h>
//
#define LENGTH 99
//
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;
//
const char clock_set[]={7,6,6,6,6,6,6,6,2};
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;
//
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 timer2_flag;
int ms=0;
//
interrupt[TIM2_COMP]void isr_timer2_comp(){
timer2_flag=1;
if(++ms>1000)ms=0;
}
//
void main(){
int k;
DDRB.4=1; DDRA=0XFF; DDRC=0xFF; DDRG=0x0F;
TCCR0=0;
TCCR0|=(1<<WGM01)|(1<<COM00);
TCCR2|=(1<<WGM21)|(1<<CS20|(1<<CS21); OCR2=249; TIMSK=(1<<OCIE2); //1ms
SREG=0X08;
while(1){
if(timer2_flag){
timer2_flag=0;
for(k=0; k<=98; k++){
TCCR0=0; TCCR0|=(1<<WGM01); TCCR0|=(1<<COM00); TCCR0|=clock_set[musicCode1[k].melody];
OCR0=ocr0_set[musicCode1[k].melody]; // 여기까지 음정 관련 코드
PORTA=led[musicCode1[k].melody]; // led 박자 길이 표시
PORTC=8;
PORTG=oct[musicCode1[k].melody]; // 옥타브 표시
PORTC=1;
PORTG=scale[musicCode1[k].melody]; // 음계 표시
while(timer[musicCode1[k].speed]>ms); // 박자 조정
}
}
}
}
TCCR0|=(1<<WGM01)|(1<<COM00); TIMSK|=(1<<OCIE0);
인터럽트 이네이블 시키고 인터럽트 함수를 만들지 않으면 오류 발생합니다.
TCCR0|=(1<<WGM01)|(1<<COM00);
OCR0=ocr0_set[musicCode1[k].melody];
이렇게만 해도 소리가 나든가요?
댓글 : 1
조회수 : 4,452
헤헿헿님의 댓글
헤헿헿 작성일
아 실수가 있었네요
조금 더 고쳐보겠습니다.