找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4716|回复: 3
打印 上一主题 下一主题
收起左侧

[求助]定时器1工作在模式1,计时不中断,定时器0也工作在模式1,100微秒定时中断,外部中断INT1下降沿触发,为何不能同时工作吗?

[复制链接]
跳转到指定楼层
楼主
ID:23515 发表于 2013-4-21 15:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

定时器1工作在模式1,计时不中断,INT1下降沿中断,实验证明运行正常。

初始化及中断代码如下:

void initime()
{
TMOD=0x10;
EA=1;
IT1=1;
EX1=1;
TH1=0;TL1=0;
TR1=1;

}

//=====================================================
void Time1() interrupt 2 //外部中断解码程序
{
 Tc=TH1*256+TL1;   //提取中断时间间隔时长
 TH1=0; TL1=0;         //定时中断重新置零
 if(Imin<Tc&&Tc<Imax){m=0; f=1; return;} //找到启始码
 if(f){
   if(Inum1<Tc&&Tc<Inum3){Im[m/8]=Im[m/8]>>1|0x80; m++;}//取1码
   if(Inum2<Tc&&Tc<Inum1){Im[m/8]=Im[m/8]>>1; m++;}//取0码
   if(m==32){m=0;f=0;
   if((Im[2]==~Im[3])&&(Im[0]==~Im[1]))
   {IrOK=1;laba=0;delay(1000);laba=1;}//取码完成后判断读码是否正确
   else IrOK=0;}
   }
}

定时器0工作在模式1,100微秒定时中断,实验证明运行正常。

初始化及中断代码如下:

//===================================
void Timer0_Init()  //定时0.1ms(100um),
{
 TMOD=0x01;
 IE=0x82;
 TH0=0xff;//65436/256;11.0592晶振
 TL0=0x9c;//65436%256
 TR0=1;
}
//======================================
void Time0() interrupt 1 //中断程序
{
TH0=0xff;
TL0=0x9c;
 
if(m1>jd1) pwm1=1;
else pwm1=0;

if(m2>jd2) pwm2=1;
else pwm2=0;
 
if(m3>jd3) pwm3=1;
else pwm3=0;
 
m1++; m1%=m;
m2++; m2%=m;
m3++; m3%=m;
// 根据io口及pwm需要情况可加m3,jd3,m4,jd4,m5,jd5……
}

 

现在我想实现用红外遥控调节三路LED亮度(定时器1工作在模式1,计时不中断,定时器0也工作在模式1,100微秒定时中断,INT1下降沿中断,)为啥不能同时工作呢?求指点。搞了几天了,找不到原因。

初始化及中断代码如下:

//========================
void initime()
{
TMOD=0x11;
EA=1;
IT1=1;
EX1=1;
TH1=0;TL1=0;
TR1=1;

TR0=1;
IE=0x82;
TH0=0xff;//65436/256;11.0592晶振
TL0=0x9c;//65436%256
}

//======================================
void Time0() interrupt 1 //中断程序
{
TH0=0xff;
TL0=0x9c;
 
if(m1>jd1) pwm1=1;
else pwm1=0;

if(m2>jd2) pwm2=1;
else pwm2=0;
 
if(m3>jd3) pwm3=1;
else pwm3=0;
 
m1++; m1%=m;
m2++; m2%=m;
m3++; m3%=m;
// 根据io口及pwm需要情况可加m3,jd3,m4,jd4,m5,jd5……
}

//=====================================================
void Time1() interrupt 2 //外部中断解码程序
{
 Tc=TH1*256+TL1;   //提取中断时间间隔时长
 TH1=0; TL1=0;         //定时中断重新置零
 if(Imin<Tc&&Tc<Imax){m=0; f=1; return;} //找到启始码
 if(f){
   if(Inum1<Tc&&Tc<Inum3){Im[m/8]=Im[m/8]>>1|0x80; m++;}//取1码
   if(Inum2<Tc&&Tc<Inum1){Im[m/8]=Im[m/8]>>1; m++;}//取0码
   if(m==32){m=0;f=0;
   if((Im[2]==~Im[3])&&(Im[0]==~Im[1]))
   {IrOK=1;laba=0;delay(1000);laba=1;}//取码完成后判断读码是否正确
   else IrOK=0;}
   }
}

[此贴子已经被作者于2013-4-21 15:53:42编辑过]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:7485 发表于 2013-4-21 16:33 | 只看该作者
100us的定时中断有点短了(多则是几行少则一行或几行指令就超过了)。外部中断还没处理完或定时器自己中断没处理完,就又中断了。中断优先权要设置好。几个中断源的中断信号丢失都会发生,所以不容易弄。
[此贴子已经被作者于2013-4-21 16:34:50编辑过]
回复

使用道具 举报

板凳
ID:23515 发表于 2013-4-21 19:23 | 只看该作者
我用11.0592晶体,在keil4上模拟,执行完需要66.28微秒,默认的优先级 定时器0中断 是高于  外部中断INT1的,用该不是中断被打断的问题吧,另外,我开始也靠路过你说的情况,把定时器0中断 里只留两条赋值语句也是不对的,我觉得问题还是初始化函数里有错误,但是我一直没有找到原因。
回复

使用道具 举报

地板
ID:7485 发表于 2013-4-22 13:21 | 只看该作者

void Time1() interrupt 2 //外部中断解码程序
上面一行的红字部分要对应!

 

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表