|
发表于 2013-4-13 23:18:59
|
显示全部楼层
本帖最后由 fanice 于 2013-4-13 23:25 编辑
使用内部晶振,经过CKDIV8分频后是1000000MHZ,再经过CLKPR分频256,频率是31250HZ,依然不能得到低功耗啊。 程序源码如下: #include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <avr/sleep.h>
#include <util/delay.h>
#define Setup_idle_mode() (SMCR=0,SMCR |= (1<<SE))
#define Setup_power_down_mode() (SMCR=0,SMCR |= (1<<SE)+(1<<SM1))
#define Setup_adc_noise_reduction_mode() (SMCR=0,SMCR |= (1<<SE)+(1<<SM0))
#define Setup_power_save_mode() (SMCR=0,SMCR |= (1<<SE)+(1<<SM1)+(1<<SM0))
#define Setup_standby_mode() (SMCR=0,SMCR |= (1<<SE)+(1<<SM2)+(1<<SM1))
#define Setup_ext_standby_mode() (SMCR=0,SMCR |= (1<<SE)+(1<<SM2)+(1<<SM1)+(1<<SM0))
/********************************************************
WatchDog初始化
********************************************************/
void WatchDog_init(void)
{
wdt_reset();
MCUSR &= ~(1<<WDRF);
WDTCSR |= (1<<WDCE)|(1<<WDE);
WDTCSR = (1<<WDIE)|(1<<WDP3)|(0<<WDP2)|(0<<WDP1)|(1<<WDP0); //8.0S WATCHDOG ENABLED - dont forget to issue WDRs
}
/********************************************************
WatchDog关闭
********************************************************/
void WatchDog_off(void)
{
wdt_reset();
WDTCSR |= (1<<WDCE)|(1<<WDE);;
WDTCSR = 0x00;
}
/********************************************************
WatchDog中断
********************************************************/
SIGNAL(WDT_vect)
{
WDTCSR |= (1<<WDIE);
wdt_reset();
}
int main(void)
{
WatchDog_init();
DDRB = 0x00;
PORTB= 0Xff;
DDRC = 0x08;
PORTC= 0X7f;
DDRD = 0x00;
PORTD= 0Xff;
sei();
while(1)
{
PORTC= 0X08;
_delay_ms(3000);
PORTC= 0X00;
wdt_reset();
MCUCR = (1 << PUD);
PRR |= (1 << PRTIM2)|(1 << PRTIM1)|(1 << PRSPI)|(1 << PRUSART0)|(1 << PRADC)|(1 << PRTWI)|(1 << PRTIM0);//(1 << PRTWI)|(1 << PRTIM0)|(1 << PRADC)
Setup_power_down_mode();
asm("sleep");
}
} |
|