完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
我在写一个室温调控的程序同时用到了定时器0和1。定时器1用的是工作方式1,定时器0用的是工作方式2,(初始化不启动定时器1,在程序后边在启动定时器1, ET1=1;TR1=1;)。可是定时器1,溢出时间变快了 ,好像是 TMOD=0x10; TMOD=0x02;冲突了?怎么回事啊?我把TMOD=0x10;删了,结果还是不变。
实在弄不明白了 请大神指教。 EA=1; TMOD=0x10;//定时器T1初始化 TH1=0x3c; TL1=0xb0; TMOD=0x02; TH0=0x00; //定时器T0初始化 TL0=0x00; ET0=1; TR0=1;
|
|
相关推荐
21个回答
|
|
|
请大家帮帮忙 ,这个问题纠结好几天了
|
|
|
|
|
|
TMOD=0x20;//定时器T1初始化
TH1=0x06; TL1=0x06; EA=1; TMOD=0x02; TH0=0x00; //定时器T0初始化 TL0=0x00; ET0=1; TR0=1; 。。。。。。。。。 void dsq_t1() interrupt 3 { TR1=0; us_250++; if(us_250==40000) { us_250=0; miao++; if(miao==60) { miao=0; fen++; } } TR1=1; } t1就变慢 的好多 不知道哪出了问题 |
|
|
|
|
|
新手发言,说错勿喷。
EA=1; TMOD=0x10;//定时器T1初始化 TH1=0x3c; TL1=0xb0; TMOD=0x02; TH0=0x00; //定时器T0初始化 TL0=0x00; ET0=1; TR0=1; 。。。。。。。。。。。。。。。 这个里面,在给TMOD第二次赋值的时候,是不是会把第一次幅值抵掉呢? 最后就发现定时器1其实也被设置成工作在方式0下了,从16位变成13位了,溢出明显会变快。 |
|
|
|
|
|
|
|
|
|
|
|
你刚入门的就别用方式0,用方式1,而且你要用到其他中断的时候别用赋值,会改变之前的赋值,TMOD = 0x20关于这个的都用TMOD |= 0x20写,这样不会改变你之前的设置 |
|
|
|
|
|
不说你程序问题,你这个定时器是1us加一次的吧,50000次一次中断就是50ms,50*250*40000=500000000us=500s,你500s加一次miao能不慢吗? |
|
|
|
|
|
本帖最后由 joinking 于 2015-3-5 14:27 编辑
joinking 发表于 2015-3-5 13:59 不是500s,还要加多两个0,50000s加一次miao。你能等到它加1是个奇迹。 |
|
|
|
|
|
本帖最后由 joinking 于 2015-3-5 14:28 编辑
你程序跟你标题不一样的,标题用的是定时器1方式1,下面又是用定时器1方式2,我看错了。方式2你的miao加一次都需要2^13 * 40000us |
|
|
|
|
|
本帖最后由 joinking 于 2015-3-5 14:26 编辑
主要是你的定时器1的工作方式你以为是你写的TMOD = 0X20工作方式2,其实在下面定时0那里TMOD=0x02你就把定时器1的工作方式改变了,TMOD第5位和第6位的值变成了0,定时器1的工作方式就被你改变为工作方式0,13位定时器了 |
|
|
|
|
|
本帖最后由 joinking 于 2015-3-5 14:33 编辑
下载了你的程序来看,没注释太难看下去了,你发的这个问题就是定时器工作方式被你改变了。 |
|
|
|
|
|
按你说的改了 ,可是t1变慢了 大概一分钟变成一分十几秒 了。 后来我发现是优先级问题 t1的优先级比t0和int0的低,所以才导致变慢的。加了PT1=1;后 t1倒是正常了 ,可t0,好像就不正常了,我的t0是红外遥控用的 ,现在遥控不好使了。 非常感谢您关注我的问题 ! |
|
|
|
|
|
本帖最后由 joinking 于 2015-3-5 16:12 编辑
优先级不是什么大问题,主要是你在中断服务函数里面处理数据,一般不会再中断里面处理数据的,建议你在中断服务函数里面给标志位,在主函数里面处理。除非一定要在中断服务函数处理数剧 |
|
|
|
|
|
外部中断里面处理这个hwchuli();肯定出现问题啦 |
|
|
|
|
|
中断函数里的东西不是很多。应该不会影响太大吧? |
|
|
|
|
|
本帖最后由 joinking 于 2015-3-5 17:03 编辑
32个数据处理,一句执行时间你给它5us的话在外部中断那里就用了至少160us,具体肯定比这个时间大,当出现外部中断还没处理完又来一个外部中断,你的红外发射解码就出问题了。如果你要看到底用了多长时间,你新建一个工程仿真一下,测试一下这个外部中断处理函数到底用了多长时间, |
|
|
|
|
|
弄明白了 ,t1应该就是 TMOD |= 0X10;优先级问题加上PT1=1;就好使了 红外遥控是因为有一条语句为我误删了,所以错了。 现在一切正常。 的确学单片机的非常的细心啊 ,要不一个小失误可能就会纠结很久。 非常感谢了。本人菜鸟一个,希望大神以后多多指点啊 |
|
|
|
|
|
你把你改过的定时器1那里发给我看一下 |
|
|
|
|
|
那就OK了。不客气,我也可以当复习一下。 |
|
|
|
|
|
TMOD |= 0X10;//定时器T1初始化 TH1=0X3c; TH1=0Xb0; ET1=1; PT1=1; TMOD |= 0x02;//定时器T0初始化 TH0=0x00; TL0=0x00; TR0=1; ET0=1; EX0=1; //外部中断INT0初始化 IT0=1; EA=1; while(1) { g=e+f; start_18b20(); T=read_wendu(); worke(); tiaokong(); hwtiaokong(); jiuzheng(); for(i=0;i<20;i++) display(); } } void dsq_t1() interrupt 3 { TH1=0x3c; TL1=0xb0; ms_50++; if(ms_50==20) { ms_50=0; miao++; if(miao==60) { miao=0; fen++; led=~led; } } } void dsq_t0() interrupt 1 { hwtime++;//255 } void int0() interrupt 0 { if(qidong==1) { if(hwtime>32)//检测到引导码 { bitnum=0; } hwdata[bitnum]=hwtime; hwtime=0; bitnum++; if(bitnum==33) { bitnum=0; hwjsok=1; } } else { qidong=1; hwtime=0; } if(hwjsok) { hwchuli(); hwjsok=0; } if(hwtqok) { hwtqok=0; } } |
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
265 浏览 0 评论
【原创】【RA4M2-SENSOR开发板评测】低功耗+USB综合测试
789 浏览 0 评论
1306 浏览 2 评论
787 浏览 0 评论
【RA4M2-SENSOR开发板评测】Analogue+Timers综合测试
1587 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
16899 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 22:49 , Processed in 1.410804 second(s), Total 108, Slave 89 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3810