Microchip
直播中

韩俊

8年用户 183经验值
私信 关注
[问答]

可能的勘误频繁重新映射外围设备,错误地启动了次级振荡器

我有一个似乎带有OSCCON寄存器的未记录的错误。PIC24EP512GU810Windows 10MPLAB X v3.50XC16v1.31我有一个以大约120/小时的速率连接到汽车传感器的板。硬件被配置为接受多种类型的传感器。因此,该代码也被写入以适应多种类型的传感器。我广泛使用可重新映射的外围设备,因为有些传感器需要边缘中断,而有些则需要输入捕获中断。每当传感器接通电源或断电时,外围设备都会重新映射。每当接通电源时,我就触发外部A2D芯片对传感器的各个部分(工作电压、电流消耗等)进行采样。A2D芯片通过管脚73触发,管脚73也是SOSCI(次级振荡器In)。我的问题是硬件偶尔会返回无效的A2D读数。在排除了A2D芯片的问题之后,我开始用示波器跟踪板上的信号。我发现当硬件返回坏值时,A2D触发线在~1V。将管脚设置为输入会导致管脚浮动到0V(即使设置为高输出并更改为输入)。设置上拉或下拉电阻的任何组合都会导致中间电压值(不是0V或3.3V),但最接近我的是1.7伏而不是~1伏。我注意到,断电部分会导致线路下降到0伏。它将恢复正常功能,直到下次发生情况。当传感器断电时,不使用A2D。坏状态也可能发生在断电期间,但我没有可靠的方法来检测它。当我在调试器中运行时,我突然决定当线路处于这种状态(1伏)时检查OSCCON寄存器的值。令我惊讶的是,OSCCon的下字节读取0xE2,表明启用了二次振荡器!!!!在代码中的任何时候,我都不写OSCCon的0到1位。它是如何设置的?我有下面所示的开机和关机功能的关键部分。作为临时修复,我修改了如下代码:在任何人声明显而易见的之前,我知道我有一个没有超时的while循环。我需要一个快速解决方案来确认这个问题。我将在将来实现某种超时。第二个可能显而易见的问题是。一个中断会改变这个寄存器吗?首先,我禁用这段代码周围的中断。第二,没有中断接触OSCCon寄存器。我有什么遗漏吗?

回帖(18)

杨叶

2020-3-18 07:25:14
嗨,你的系统里有32千赫兹的XAL吗?你能显示你的配置位吗?你使用ICD3还是真正的冰?(pickit3上不存在以下特性)如果是这样,我将在OSCCON寄存器上放置一个数据断点,以便在写入字节或单词时中断。
举报

刘锦

2020-3-18 07:53:58
我在ReabppEnable外围设备的手册中找到了示例代码。它显示了解锁序列与第三写Beung-BuuthTiNnRead eSCONCOL(OSCCONLL(1和lt;lt;6))。锁序列与第三写是类似的,SuxBuiTiNnRead EsCONCOL(OSCCONL&P;(~(1 & lt;& lt;6)))。换句话说,他们的代码只写入和清除位6,剩下的其他位单独。当我使用那个代码时,微芯片会进入这个模式(比特1设置),并且它永远不会清除。它需要一个软复位来清除钻头。通过阅读OSCCON位的功能,写入位5-0到0的唯一危险是它可能隐藏时钟故障。这个代码最初是用2015编写的,从那时起就被大量使用了。在过去的几个月里,它以每小时120个部件的速度使用。以前,它以每天10-20的速度使用。以前的不便(只是偶尔失败时重试)已经变成了生产问题。RISC,我正在使用ICD3。我会把一个断点写在OSCCon上,因为这是函数代码的一部分。请原谅我的无知,但是有可能为寄存器的特定数据值设置断点吗?
举报

黄飞高

2020-3-18 08:01:38
在我的经验中,如果在增加操作频率时出了差错,它是由中断行为引起的,例如中断行为,但只能用低频率,或者根本就不这样做(也许当几次)。具有不同优先级的RAPTS在接近同一时间发生火灾。当增加你的操作频率时,错误事件发生的概率增加了,这就是为什么你发现它的原因。这就是为什么我认为问题是我是代码,而且在我的经验中,最有可能是中断。/ Ruben
举报

杨叶

2020-3-18 08:11:19
嗨,这正是ICD3/Real-Ice能做的:在SFR/global variable中的特定值上设置断点。因此,只要SFR的变量中有一个非期望值,就可以得到一个断点来停止,并分析执行了哪些代码来导致寄存器更改。NT(数据断点)比地址断点强大得多,因为它在任何发生的数据上都会停止。在数据***纵的程序中不需要到处寻找。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分