void system_init()
{
PORTD=0x7d;
DDRD=0x70;
PORTC=0XFF;
DDRC=0XFF;
PORTG=0XFF;
DDRG=0XFF;
// PORTA=0XBF;
// DDRA=0XFF;
}
void interrupt3_init()//外部中断3初始化
{
EIMSK|=0x08;//使能外部3中断
EICRA=0x80; //INT3下降沿触发中断
MCUCSR=0X00;
}
void djfz() //电机反转
{
uchar a,b,k;
for(k=n;k>0;k--)//转动10圈
{
if(motorstop==1)
{
break;
}
for(b=0;b<50;b++)//逆时针转一圈
{
if(motorstop==1)
{
break;
}
for(a=0;a<4;a++)
{
if(motorstop==1)
{
break;
}
PORTC=table0[a];
delay_ms(5);
}
}
// if(motorstop==1)
// break;
}
}
void djzz()//电机正传
{
uchar a;
uchar b;
uchar k;
//for(m=10;m>0;m--)
//{
for(k=5;k>0;k--)
{
if(flag2==1)
break;
for(b=0;b<50;b++)
{
if(flag2==1)
break;
for(a=0;a<4;a++)
{
if(flag2==1)
{
break;
}
PORTC=table1[a];
delay_ms(5);
}
}
}
//}
}
ISR(INT3_vect)
{
SREG|=0X00;
motorstop=1;
SREG|=0X80;
}
void interrupt1_init()
{
EIMSK|=0x02;//使能外部1中断
EICRA=0x0c; //INT1上升沿触发中断
MCUCSR=0X00;
}
ISR(INT1_vect)//电机寻零位
{
SREG|=0X00;
flag2=1;
SREG|=0X80;
}
int main()
{
system_init();
SREG|=0X00;
interrupt1_init();//开INT1中断
SREG|=0X80;
flag2=0;
djzz();//电机寻零位
flag2=0;
EIMSK|=0x00;//关INT1中断
SREG|=0X00;
interrupt3_init();
SREG|=0X80;
motorstop=0;
n=10;
djfz();
}
为什么中断1可以用,中断3 不能用,电机无法反转,软件仿真显示的结果是电机正传过后执行外部中断3初始化,然后就一直在服务程序里循环跳不出来,导致电机反转程序无法执行,软件仿真单步运行时,执行到中断3服务程序时提示的错误是AVR Simulator: Stack pointer below start of RAM,为什么会这样,大家别只看不给解答啊,拜托拜托。。。。 |