关于2138的T0的问题,求教于各位

[复制链接]
2464|4
 楼主| northerns 发表于 2007-8-7 19:28 | 显示全部楼层 |阅读模式
用中断方式和查询方式如下:<br />在中断方式出现了问题:程序返回main的开头从新执行,可能和“T0MR0=Fpclk/2;//1uS”和“VICIntEnable=(1&lt&lt0x04);//使能定时器0”这两<br /><br />句有关,可是百思不得其解<br /><br />中断方式:<br /><br /><br />/*********定时器中断函数***************************************************/<br />void&nbsp;__irq&nbsp;interrupt_timer0(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T0IR=0x01;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清除中断标志<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr=0x00;&nbsp;&nbsp;&nbsp;//通知VIC中断处理结束<br />}<br /><br /><br />void&nbsp;initialize_t0(void)<br />{<br />&nbsp;&nbsp;&nbsp;T0TC=0;<br />&nbsp;&nbsp;&nbsp;T0PR=0;<br />&nbsp;&nbsp;&nbsp;T0MCR=0x0003;<br />&nbsp;&nbsp;&nbsp;T0MR0=Fpclk/2;//1uS<br />&nbsp;&nbsp;&nbsp;T0TCR=0x00;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;//IRQEnable();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//IRQ中断使能&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />//&nbsp;&nbsp;&nbsp;&nbsp;/*设定定时器0中断*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICIntSelect=0x00;//所有中断通道设置为IRQ中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICVectCntl0=0x20|0x40;//设置定时器0中断通道分配最高优先级<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICVectAddr0=(uint32)interrupt_timer0;//设置中断服务程序地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VICIntEnable=(1&lt&lt0x04);//使能定时器0<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}<br /><br />int&nbsp;main(void)<br />{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BEER&nbsp;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;initialize_t0();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T0TCR=0x01;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(time&gt1000)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />return(0);<br />}<br /><br />×××××××××××××××××××××××××××××××××××××××××××××××××××8<br />查询方式:<br />int&nbsp;main(void)<br />{<br /><br />&nbsp;&nbsp;&nbsp;IO0CLR=BEEP;<br />&nbsp;&nbsp;&nbsp;PINSEL0=0x00000000;<br />&nbsp;&nbsp;&nbsp;IO0DIR=BEEP;<br />&nbsp;&nbsp;&nbsp;T0TC=0;<br />&nbsp;&nbsp;&nbsp;T0PR=0;<br />&nbsp;&nbsp;&nbsp;T0MCR=0x03;<br />&nbsp;&nbsp;&nbsp;T0MR0=3333;//1uS<br />&nbsp;&nbsp;&nbsp;T0TCR=0x01;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((T0IR&0x01)==0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T0IR=0x01;i++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((i%2)==0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{IO1SET=BEEP;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IO1CLR=BEEP;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}<br /><br /><br />return(0);<br /><br /><br /><br /><br />}
 楼主| northerns 发表于 2007-8-7 20:19 | 显示全部楼层

在线等,急啊!!!!

各位给点意见啊,在线等,急啊!!!!
newstary 发表于 2007-8-8 09:02 | 显示全部楼层

我的看法

VICVectCntl0=0x20|0x40;//设置定时器0中断通道分配最高优先级?<br />再看下数据手册,<br />0x20表示将IRQslot_en位置1,4:0位放置的是中断号,T0的中断号应为4,故该初始化语言应该改为:<br />VICVectCntl0=0x20|0x4;<br /><br />此外IRQEnable();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//IRQ中断使能<br />这句保留,进如main函数后默认IRQ是关闭的
 楼主| northerns 发表于 2007-8-8 09:38 | 显示全部楼层

太感谢了,我愿与你烧做兄弟呀!真是太感谢了

<br />我是新手,非常感谢!!!!<br /><br />作如下改动就OK了,^_^<br />VICVectCntl0=0x20|0x04;
newstary 发表于 2007-8-8 11:02 | 显示全部楼层

多看看数据手册

出问题最好先看数据手册,呵呵。<br />东西是人家造的^_^
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

33

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部