怪了,关了总中断它还进中断!

[复制链接]
3105|5
 楼主| cruby 发表于 2007-7-19 22:21 | 显示全部楼层 |阅读模式
AD, dc, ADC, se, BLE
看书上说如果你进入AD中断后,那么这时总中断也应该被关了吧,如果你不在这个中断服务程序里开总中断的话,那么以后就永远不会进入中断了吧?<br /><br />今天我调程序dsp2407时,写了下面代码:<br />interrupt&nbsp;void&nbsp;ADCInt(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;//Get&nbsp;ADC&nbsp;result<br />&nbsp;&nbsp;&nbsp;&nbsp;Disable();&nbsp;//关中断<br />&nbsp;&nbsp;&nbsp;&nbsp;count++;<br />&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;&nbsp;clrc&nbsp;SXM&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;=&nbsp;RESULT0;<br />&nbsp;&nbsp;&nbsp;&nbsp;adcResult[i++]&nbsp;=&nbsp;(*j)&nbsp;&gt&gt&nbsp;6;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(i&nbsp;==&nbsp;22)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;//*ADCTRL2&nbsp;|=&nbsp;0x4000;<br />&nbsp;&nbsp;&nbsp;&nbsp;SocADC();<br />&nbsp;&nbsp;&nbsp;&nbsp;//*IFR&nbsp;=&nbsp;*IFR&nbsp;|&nbsp;0x0001;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(count&gt65534)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;//Enable();<br />}<br />结果一运行,发现count能不断地增加,意思是它不止一次地进入中断,不知有谁知道是怎么回事?<br /><br /><br />程序的全部代码如下:#include&nbsp;&quot;DSP2407A.h&quot;<br /><br />/*********&nbsp;Declare&nbsp;Functions&nbsp;******/<br /><br />typedef&nbsp;unsigned&nbsp;int&nbsp;uint;<br /><br />//Global&nbsp;functions<br />inline&nbsp;void&nbsp;Disable(void);<br />inline&nbsp;void&nbsp;Enable(void);<br />void&nbsp;SysInit(void);<br />void&nbsp;nothing(void);<br /><br />//ADC&nbsp;functions<br />void&nbsp;ADCInit(void);<br />interrupt&nbsp;void&nbsp;ADCInt(void);<br />inline&nbsp;void&nbsp;SocADC(void);<br /><br />//Global&nbsp;variables<br />volatile&nbsp;uint&nbsp;*j;<br />static&nbsp;uint&nbsp;adcResult[22];<br />static&nbsp;uint&nbsp;i&nbsp;=&nbsp;0;<br />static&nbsp;uint&nbsp;count&nbsp;=&nbsp;0;<br />/************&nbsp;End&nbsp;********************/<br /><br /><br />/*************&nbsp;main&nbsp;******************/<br />int&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Disable();<br />&nbsp;&nbsp;&nbsp;&nbsp;SysInit();<br />&nbsp;&nbsp;&nbsp;&nbsp;ADCInit();<br />&nbsp;&nbsp;&nbsp;&nbsp;Enable();<br />&nbsp;&nbsp;&nbsp;&nbsp;SocADC();<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br />/*************&nbsp;End&nbsp;of&nbsp;main&nbsp;************/<br /><br /><br />/*************&nbsp;Implement&nbsp;of&nbsp;functions&nbsp;*******************/<br />inline&nbsp;void&nbsp;Disable(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;&nbsp;setc&nbsp;INTM&quot;);<br />}<br /><br />inline&nbsp;void&nbsp;Enable(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;&nbsp;clrc&nbsp;INTM&quot;);<br />}<br /><br />void&nbsp;ADCInit(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;*ADCTRL1&nbsp;=&nbsp;0x0000;<br />&nbsp;&nbsp;&nbsp;&nbsp;*ADCTRL2&nbsp;=&nbsp;0x0600;<br />&nbsp;&nbsp;&nbsp;&nbsp;*MAXCONV&nbsp;=&nbsp;0x0000;&nbsp;//one&nbsp;channel&nbsp;to&nbsp;be&nbsp;converted<br />&nbsp;&nbsp;&nbsp;&nbsp;*CHSELSEQ1&nbsp;=&nbsp;0x0000;&nbsp;//Channel&nbsp;0<br />&nbsp;&nbsp;&nbsp;&nbsp;*CHSELSEQ2&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;*CHSELSEQ3&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;*CHSELSEQ4&nbsp;=&nbsp;0;<br />}<br /><br />interrupt&nbsp;void&nbsp;ADCInt(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;//Get&nbsp;ADC&nbsp;result<br />&nbsp;&nbsp;&nbsp;&nbsp;Disable();<br />&nbsp;&nbsp;&nbsp;&nbsp;count++;<br />&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;&nbsp;clrc&nbsp;SXM&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;=&nbsp;RESULT0;<br />&nbsp;&nbsp;&nbsp;&nbsp;adcResult[i++]&nbsp;=&nbsp;(*j)&nbsp;&gt&gt&nbsp;6;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(i&nbsp;==&nbsp;22)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;//*ADCTRL2&nbsp;|=&nbsp;0x4000;<br />&nbsp;&nbsp;&nbsp;&nbsp;SocADC();<br />&nbsp;&nbsp;&nbsp;&nbsp;//*IFR&nbsp;=&nbsp;*IFR&nbsp;|&nbsp;0x0001;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(count&gt65534)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;//Enable();<br />}<br /><br />void&nbsp;SysInit(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;&nbsp;setc&nbsp;SXM&quot;);&nbsp;//符号扩展位有效<br />&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;&nbsp;clrc&nbsp;OVM&quot;);&nbsp;//累加器结果正常溢出<br />&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;&nbsp;clrc&nbsp;CNF&quot;);&nbsp;//B0被配置成数据存储空间<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*SCSR1&nbsp;=&nbsp;0x81fe;<br />&nbsp;&nbsp;&nbsp;&nbsp;*WDCR&nbsp;=&nbsp;0x0e8;<br />&nbsp;&nbsp;&nbsp;&nbsp;*IMR&nbsp;=&nbsp;0x0001;&nbsp;//enable&nbsp;INT1<br />&nbsp;&nbsp;&nbsp;&nbsp;*IFR&nbsp;=&nbsp;0x0ffff;&nbsp;//clear&nbsp;all&nbsp;interrupt&nbsp;flag:&nbsp;write&nbsp;a&nbsp;1&nbsp;clears&nbsp;these&nbsp;bits<br />}<br /><br />inline&nbsp;void&nbsp;SocADC(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;*ADCTRL2&nbsp;|=&nbsp;0x2000;&nbsp;//set&nbsp;SOC&nbsp;SEQ1<br />}<br /><br />void&nbsp;nothing(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;return;<br />}<br />/*****************&nbsp;End&nbsp;********************************************/<br /><br />
 楼主| cruby 发表于 2007-7-20 11:59 | 显示全部楼层

新发现

程序进入中断时会关总中断,但是出了中断服务程序后就清了标志位,又可以进入中断了;不过我将中断服务程序的代码改成<br />interrupt&nbsp;void&nbsp;ADCInt(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;//Get&nbsp;ADC&nbsp;result<br />&nbsp;&nbsp;&nbsp;&nbsp;Disable();&nbsp;//关中断<br />&nbsp;&nbsp;&nbsp;&nbsp;count++;<br />&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;&nbsp;clrc&nbsp;SXM&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;j&nbsp;=&nbsp;RESULT0;<br />&nbsp;&nbsp;&nbsp;&nbsp;adcResult[i++]&nbsp;=&nbsp;(*j)&nbsp;&gt&gt&nbsp;6;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(i&nbsp;==&nbsp;22)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;*ADCTRL2&nbsp;|=&nbsp;0x4000;&nbsp;//复位通道<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(count&gt65534)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;SocADC();<br />&nbsp;&nbsp;&nbsp;&nbsp;Enable();&nbsp;//加了这句话使程序跑飞了<br />}<br />后,发现程序会跑飞,我不就是在最后加了个Enable吗?怎么会造成这么严重的后果呢?
 楼主| cruby 发表于 2007-7-20 17:28 | 显示全部楼层

继续等待......

  
haibian826 发表于 2007-7-20 21:34 | 显示全部楼层

用485了吗?

如果用了MAX485芯片,建议换一个485芯片<br /><br /><br /><br /><br /><br />
nxy825715 发表于 2007-7-23 09:20 | 显示全部楼层

个人见解:

如果是你所说的AD转换太快,那你可以算算AD转换一次的时间,以及中断服务程序运行一次的时间呀。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

64

帖子

0

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