mega8a 省电模式下T2唤醒有奖求助
mega8a 省电模式下T2异步时钟唤醒有奖求助------------------------目标:板子使用内部晶振8M,外接32.768手表晶振,T2作为省电模式下的唤醒源,5秒led闪烁一次。调试通过的话奖一块MSP430的利尔达开发板,如图所示,MSP430开发板自带有仿真器 哪位大侠帮忙一下 LZ好多飞币呀{:titter:} 楼主有什么问题? lcw_swust 发表于 2015-3-10 11:18楼主有什么问题?
发现外部的异步时钟幅度非常小,虽然有起振 /*#pragma interrupt_handler timer2_ovf_isf:5
void timer2_ovf_isf(void)
{
static uchar bflag;
bflag++;
//TCNT2 = 0X83;//初值
//if(time_flag2<5000) time_flag++;
bflag &=1;
if(bflag)
{
clr_red;
}
else
{
set_red;
}
} shower.xu 发表于 2015-3-10 11:16
LZ好多飞币呀
头像不错 http://www.eet-china.com/ARTICLES/2003APR/PDF/2003APR04_MPR_EMS_AN5.PDF?SOURCES=DOWNLOAD
AVR有份文档,你看看有没有帮助 howmoney 发表于 2015-3-10 11:54
http://www.eet-china.com/ARTICLES/2003APR/PDF/2003APR04_MPR_EMS_AN5.PDF?SOURCES=DOWNLOAD
AVR有份文档 ...
感谢,我下来看看 lnso 发表于 2015-3-10 11:44
发现外部的异步时钟幅度非常小,虽然有起振
幅度小对功能有影响吗?
看看晶振旁的电容是否合适,单片机内好像也有电容。
还要考虑示波器探头的影响,一般要用10倍衰减档测量。 lcw_swust 发表于 2015-3-10 11:59
幅度小对功能有影响吗?
看看晶振旁的电容是否合适,单片机内好像也有电容。
还要考虑示波器探头的影响, ...
我没有外接电容, 楼主直接Timer2设置1024分频;5/(1024/32768)=160;TCNT2=256-160=96;
Timer2工作周期为5s中断一次,进入中断翻转引脚;其余时间CPU直接进入SLEEP好了,感觉这样好点 省电模式下io口等模块是不工作,只有少数几个模块工作,要退出省电模式,灯灭后再进入省电模式, 贴上代码,各位高手分析一下//外部中断涉及三个寄存器:MCUCR GICR GIFR
void en_int(void)//外部中断1,此程序只用到一个外部中断,即键盘输入检测
{
GICR = 1<<INT0;
//GICR = (1<<INT1);
//MCUCR = 0xa0;//外部中断1为低电平触发方式 源程序掉电模式
MCUCR = 0xb0;//省电模式
}
void dis_int(void)
{
GICR = 0;
MCUCR = 0;
}
//定时计数器0涉及个4寄存器:TCCR0 TIMSK TIFR TCNT0
void en_timer0(void)
{
TCCR0 = 0x05; //1024分频 周期: 1/8000000*1024=0.000128S
TCNT0 = 0x4b; //(0X100-0X4B)*0.000128=0.023168S发生一次中断
TIFR = (0<<TOV0); //溢出标志
TIMSK = (1<<TOIE0); //溢出中断使能
}
void dis_timer0(void)
{
TCCR0 = 0x05;
TCNT0 = 0x4b;
TIMSK = (0<<TOIE0);
}
void timer2_init(void)
{
TCCR2 = 0x60;
ASSR= 1<<AS2; //异步时钟
TCNT2 = 0xff; //定时时间1秒
TCCR2 = (1<<CS22)|(1<<CS21)|(1<<CS20); //分频比1024,0x07
}
#pragma interrupt_handler timer2_ovf_isr:iv_TIMER2_OVF
void timer2_ovf_isr(void)
{
TCNT2 = 0x60;
i++;
if(i==2){PORTC ^= BIT0 ;i=0;}
}
void main (void)
{
uchar i,j;
//op_flag = 0;
//uint flagpasswordgroup=0;
uchar TmpBuff;
//uchar TmpShare;
dis_int();
CLI();
i=0;
delay_ms(130);
beep1();
E2prom_Read(0x0b, TmpBuff, 9);//
close_flag=0x01;
errfp_flag=0x00;
wakeinit_ports();
clr_red;clr_green; clr_leden;
beep1();
set_leden;set_red; set_green;
//至此,初始化完毕
//en_time2();
for (;;) //上电后的大循环
{
sleepinit_ports();
dis_timer0();
en_int();
SEI();
//en_time2();
POWERDOWN();//进入休眠模式,等持INT1触发中断
wait;wait;
dis_int();
wakeinit_ports();
en_timer0();
while(1)
{
//
}
} 不知道你的具体问题,从程序上初步看没有找到延时,我用M48时用过这种方法,外接32K,没有用电容,效果很好;
芯片中有一个小缺点,就是在使用异步时钟的时候,睡觉之前一定要等上一个时钟周期,芯片用这一段时间处理内部的定时器,因此,分频在可用的范围要用最小分频,减少这个等待的时间; AS6.2平台谁用谁知道,挺好的,就是大了点;
/*
* vs_proj_atmega8.c
*
* Created: 2015-3-10 11:17:57
*Author: keliang.yao
*/
#include "../src/user_config.h"
void SysControlCPU(BOOL cpu_status)
{
set_sleep_mode(SLEEP_MODE_PWR_SAVE);
cli();
if(cpu_status == true)
{
sleep_enable();
sei();
sleep_cpu();
sleep_disable();
}
sei();
}
int main(void)
{
Init_System();
for(uint8_t i=0; i<10; i++)
{
_delay_ms(200);
}
SysControlCPU(true);
while(true)
{
//TODO:: Please write your application code
SysControlCPU(true);
_BIT_XOR(PORTC, 0);
#if 0
_BIT_SET(PORTC, PORTC4);
_delay_ms(500);
_BIT_CLR(PORTC, PORTC4);
_delay_ms(500);
#endif
}
return (0);
}
ISR(INT0_vect)
{
cli();
_BIT_SET(PORTC, PORTC0);
sei();
}
ISR(INT1_vect)
{
cli();
_BIT_CLR(PORTC, PORTC0);
sei();
}
ISR(TIMER2_OVF_vect)
{
cli();
TCNT2 = 96;
sei();
}
写了个楼主自己看看,有没有问题楼主自己验证啊 lcw_swust 发表于 2015-3-10 11:59
幅度小对功能有影响吗?
看看晶振旁的电容是否合适,单片机内好像也有电容。
还要考虑示波器探头的影响, ...
硬件的问题,换了一块板子后T2可以在省电模式下唤醒,但是问题又来了,就是我唤醒后,如何保证只有我的外部中断触发,单片机才响应呢?现在是T2唤醒后,我没有外部触发他,按键也会相应的动作 lnso 发表于 2015-3-17 11:17
硬件的问题,换了一块板子后T2可以在省电模式下唤醒,但是问题又来了,就是我唤醒后,如何保证只有我的外 ...
楼主的意思是外中断引脚电平未变化,却进入了外中断函数?
不会吧,是否休眠前改变了引脚? 是不是唤醒后,立即就去读按键?
手册好像说唤醒后要等一段时间,系统稳定后再工作吧
对,唤醒后,我按按键是有反应的,我要做的是只有外部中断触发了按键才会工作,现在就是T2唤醒后,我按按键依然会有工作,而且省电模式电流在25uA左右
for (;;) //上电后的大循环
{
sleepinit_ports();
dis_timer0();
en_timer2();
en_int();
SEI();
POWERDOWN();//进入休眠模式,等持INT0触发中断
wait;wait;
TCCR2 = 0x00; //stop
//clr_red;
delay_ms(250);
delay_ms(250);
// TIMSK &= 0x3F;//关闭T/C2中断
// TIFR &= 0X3F;//清零T/C2的中断标志
dis_int();
//TIMSK= 0<<TOIE2;
// TIMSK= 0<<TOIE2;
//dis_timer2();
wakeinit_ports();
en_timer0();
// en_timer2();
//set_red;
//set_green;
delay_ms(250);
delay_ms(250);
//timer2_init();
if(wake_flag==0x02)
{
while(1)
{
//
}
}
} 唤醒后,T0也开始工作了,T0有做按键超时退出处理 估计代码处理多半也有问题 yklstudent 发表于 2015-3-17 21:59
估计代码处理多半也有问题
在线吗?发源码给你,帮我看看
页:
[1]