|
我最近最做单片机低功耗设计,需要用到AVR的休眠与唤醒。我用ICC编写的程序如下
#include<iom16v.h>
#include <macros.h>
#progma interrupt_handler int1_isr:3
#define uchar unsigned char
#define uint unsigned int
uchar n;cnt=0;
//======================
void delay_ms(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<1140;j++);
}
}
//=======================延时子程序
void main(void)
{
DDRB=0xff;
PORTB=0xff;
DDRD=0x00;
PORTD=0xff;
DDRA=0x00;
PORTA=0xff;
DDRC=0x00;
PORTC=0xff;
MCUCR=0x60;
GICR=0x80;
SREG=0x80;
PORTB=0xaa;
delay_ms(5000);
PORTB=0x55;
delay_ms(5000);
PORTB=0xff;
while(1)
{
delay_ms(10);
MCUCR|=0x70;
asm("sleep");
NOP();
NOP();
NOP();
MCUCR&=0x2f;
delay_ms(2);
// asm("nop");
do
{
cnt--;
delay_ms(2);
}
while(cnt!=0); }
PORTB=0xff;
}
void int1_isr(void)
{
MCUCR&=0x2f;
PORTB=0X00;
cnt=5000;
}
中断唤醒后,好像复位中断一样,没有执行中断程序。而且也没有执行sleep的下一条指令,这与AVR单片机的描述不对应啊。而用IAR编写的程序可以执行中断程序,中断返回后执行sleep下一条指令,这是怎么回事,求解答。又可以解答的可以与我联系。 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|