BASIC4MCU | 질문게시판 | 인터럽트질문입니다(소스첨부)
페이지 정보
작성자 ff2sadf 작성일2018-12-16 17:46 조회6,764회 댓글0건본문
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>volatile unsigned int s0[10]={0x13,0x13,0x13,0x11,0x13,0x11,0x11,0x17,0x17,0x13};
void sound(int receive);
volatile unsigned int k=1;
volatile unsigned int n=0;
volatile unsigned int i=0;
volatile unsigned int q=0;
int j,p;int random1()
{
j = rand()%3+1;return j;
}
int delay_ran()
{
p = (rand()%5+2)*250;
return p;
}
int main(void)
{
cli();
TIMSK=(1<<TOIE1);
TCCR0=(1<<WGM01)| (0<<WGM00)|(0<<COM01)|(1<<COM00)|(1<<CS02)|(1<<CS01)|(1<<CS00); // tcc모드 뭐 쓸지 골른다.fast PWM
TCCR1A = 0x00;
TCCR1B = 0x05;
TCNT1H = 0xFF;
TCNT1L = 0xFE;
sei();
do{
}while(1);
return 0;
}
ISR(TIMER1_OVF_vect)
{
cli();
TCNT1H = 0xF0;
TCNT1L = 0xBD;
k=random1();
if(n<=k)
{DDRB=0xFF;
sound (i);
n++;
}
else
{
n=1;
i++;
if((i==3)||(i==5))
{k=random1();
q=delay_ran();
PORTB = 0x00;
_delay_ms(q);
}if(i==10)
{
i=0;
q=delay_ran();
PORTB = 0x00;
_delay_ms(q);}
}
sei();
}
void sound(int receive){
OCR0 = s0[receive];
}
ISR(TIMER1_OVF_vect)이 함수안에 현재 배열로 인한 주파수 배열이 재생되고있습니다.
이 함수안에 또다른 OCR0 주파수 배열을 넣고싶은데(이게 A음계입니다.)
A음계는 최초 1번만 재생시킨후 그다음에 인터럽트가 발생하면 A음계는 무시가 되고 B음계만 재생되게 하고싶습니다.
B음계는 현재 제가 ISR(TIMER1_OVF_vect)안에 들어가있는 주파수 배열입니다.
switch(i)함수를 써도 최초
switch(i)
case 0 : A음계
default : B음계
i++ 를해도 결국 인터럽트가 끝나고 메인함수로가면 i=0을만나서 또다시 인터럽트 벡터안에는 i=0값이 들어가게 됩니다.
댓글 0
조회수 6,764등록된 댓글이 없습니다.