hello,在调试28377S时如下问题:
ADC中断,运行一段时间后无法进入。卡死时间是随机的,30分钟~几个小时都出现过。
pwm1a触发adc的SOC,EOC0触发adc int1。
在adc int1卡死的状态下,timer0,xint,sci等中断都是能够正常进入的。
在卡死状态下,在线debug发现:
1、对应的PIEIFR未置为1,PIEIER正常
2、ADCINTFLG中的ADCINT1为1,ADCINTOVF中的ADCINT1为1
3、ADCINTSEL1N2中的INT1E为1,INT1CONT为0
4、ADCCOUNTER一直有累加
请教下,在这种情况下,解决思路是?大概可能的原因是?
Green Deng:
你好,我需要一点时间分析一下这个问题,会尽快回复你。
,
Green Deng:
你好,有可能存在溢出情况。首先,我们要检查程序中是否执行了以下语句,确保没有中断溢出:
1.)如果使用了ADCISR,请确保在PIE中确认了该中断,以便将来可能发生中断。
2.)确保在检测到ADCINTFLG时也将其清除
另外,如果在相对较长的时间后发生卡死,可以尝试稍微增加S/H时间。 当转换/中断发生时,可以延长等待时间。 ADC时序设置可能处于某个状态,在该状态下会发生溢出。 稍微增加时序(如修改SH)可能足以使ADC脱离溢出条件。
,
fei xiao1:
Green Deng 说:你好,有可能存在溢出情况。首先,我们要检查程序中是否执行了以下语句,确保没有中断溢出:1.)如果使用了ADCISR,请确保在PIE中确认了该中断,以便将来可能发生中断。2.)确保在检测到ADCINTFLG时也将其清除另外,如果在相对较长的时间后发生卡死,可以尝试稍微增加S/H时间。 当转换/中断发生时,可以延长等待时间。 ADC时序设置可能处于某个状态,在该状态下会发生溢出。 稍微增加时序(如修改SH)可能足以使ADC脱离溢出条件。
感谢您回复!
关于1&2,我在中断函数结尾处有以下代码,是否是您所述的内容:
Green Deng 说:另外,如果在相对较长的时间后发生卡死,可以尝试稍微增加S/H时间。 当转换/中断发生时,可以延长等待时间。 ADC时序设置可能处于某个状态,在该状态下会发生溢出。 稍微增加时序(如修改SH)可能足以使ADC脱离溢出条件。
这个您是指AdcaRegs.ADCSOC0CTL.bit.ACQPS寄存器的值吗?我现在设定值是19,需要提高到多少?
另外:目前我尝试将ADC的中断触发模式AdcaRegs.ADCINTSEL1N2.bit.INT1CONT修改为连续模式(值修改为1),看上去好像解决了该问题,这个方式是否合理?
,
Green Deng:
你提供的代码段中的语句都是正确的。说明标志被清除,中断被确认。
将INT1CONT位设置为1基本上会忽略中断/溢出标志是否被清除,因此在这种情况下它会起作用。不过溢出的原因以及对应用程序的影响还不清楚。
也可以尝试将ADCPS增加几个steps,比如增加1或2,查看是否足以防止溢出。
,
fei xiao1:
Green Deng 说:你提供的代码段中的语句都是正确的。说明标志被清除,中断被确认。 将INT1CONT位设置为1基本上会忽略中断/溢出标志是否被清除,因此在这种情况下它会起作用。不过溢出的原因以及对应用程序的影响还不清楚。也可以尝试将ADCPS增加几个steps,比如增加1或2,查看是否足以防止溢出。
,
Green Deng:
USB数据传输和SCI通信发生的时间比50us(20kHz ADC中断频率)长,这可能会导致溢出。在USB和SCI ISR内部,是否可以轮询ADC溢出标志,以便在出现溢出标志时将其清除,或者停止此时的ADC转换,直到USB和SCI ISR任务完成为止?
,
fei xiao1:
感谢您的方案!
,
Green Deng:
客气了