完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
我有一个似乎带有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个回答
|
|
|
嗨,你的系统里有32千赫兹的XAL吗?你能显示你的配置位吗?你使用ICD3还是真正的冰?(pickit3上不存在以下特性)如果是这样,我将在OSCCON寄存器上放置一个数据断点,以便在写入字节或单词时中断。
|
|
|
|
|
|
我在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上,因为这是函数代码的一部分。请原谅我的无知,但是有可能为寄存器的特定数据值设置断点吗?
|
|
|
|
|
|
在我的经验中,如果在增加操作频率时出了差错,它是由中断行为引起的,例如中断行为,但只能用低频率,或者根本就不这样做(也许当几次)。具有不同优先级的RAPTS在接近同一时间发生火灾。当增加你的操作频率时,错误事件发生的概率增加了,这就是为什么你发现它的原因。这就是为什么我认为问题是我是代码,而且在我的经验中,最有可能是中断。/ Ruben
|
|
|
|
|
|
嗨,这正是ICD3/Real-Ice能做的:在SFR/global variable中的特定值上设置断点。因此,只要SFR的变量中有一个非期望值,就可以得到一个断点来停止,并分析执行了哪些代码来导致寄存器更改。NT(数据断点)比地址断点强大得多,因为它在任何发生的数据上都会停止。在数据***纵的程序中不需要到处寻找。
|
|
|
|
|
|
这是推荐的方式。在这种情况下,我建议代码不是上面写的。还有第#1位是LPOSCEN(辅助(LP)振荡器启用),并且应该没有理由不能使用宏清除该位。您能否在找到的第一个引号中提供手册的参考资料,但是它是错误的?如果它是一个最新的微芯片,那么它可能需要支持票。XC16用户指南(DS50002071F)将_u builtin_write_OSCCONL宏的扩展为:(其中“value”是宏参数)。正如Ruben上面所说,您需要确保这个宏没有中断。
|
|
|
|
|
|
我从微芯片页面中取出了PIC24EP512GU810的解锁序列,在第10节中。I/O端口”http://ww1.micro..com/downloads/en/DeviceDoc/70000598c.pdfon第15页显示:没有显示解锁OSCCON本身的过程。只有在OSCCon解锁之后才能解锁IOLKOD位。这是在第13页上显示的。当我使用微芯片推荐的指令时,我仍然会偶尔得到1位。然而,由于该代码只设置并清除位6,所以位1仍然存在。程序永远不会恢复,我必须重置PIC。这就是为什么我总是写0x80或0xC0到OSCCon低字节。
|
|
|
|
|
|
我不清楚你是否改变了你发布的原始代码?这将发送后续的OSCCONL46,57, 4646, 57,5746, 57,80与锁和解锁,我算是4次!
|
|
|
|
|
|
我认为你误解了整个OSCCON解锁过程。首先,这里发生了两个“解锁”。OSCCON寄存器(作为一个16位寄存器或者作为高/低8位寄存器)在提供解锁序列之后只能对单个CPU指令进行解锁。这就是为什么宏扩展执行解锁序列值的2次连续写入,然后立即将该值写入OSCCONL字节-3连续执行的CPU指令。这也是为什么提到禁用中断等(为了确保)作为CPU在这3个指令序列期间执行的*ANY*其他指令将无法解锁OSCCON寄存器的原因。他设置/清除IOLOCK位,该位将解锁/锁定PPS寄存器,它们对于多个指令保持锁定/解锁,直到您改变锁定状态。您在#8后显示的代码(用于PPS解锁和锁定序列)是完全正确的,并且所有需要编程的。
|
|
|
|
|
|
对不起,我之前错过了你的邮件!我忘了在代码中显示,我在解锁前使用DISI(#0x3FF),解锁后使用DISI(#0x000)。对于锁序列也是如此。我的确有一个优先级7中断运行,它只递增一个变量并清除标志。DISI不禁用优先级7中断,所以我在这里可能有一个漏洞。未熔合的我使用了我原来发布的代码。我把它改为微芯片推荐的方式,我有问题的代码,所以我改变了回来。我从来没有直接发布更改过的代码。我只是张贴我从哪里得到的。你怎么想的?我发46, 57, 80。不是46, 57, 46,46, 57, 57,46, 57, 80。苏珊,我完全理解解锁的先例。在三个连续的指令中,我需要写0x47、0x57、0x_(其中_u表示设置/清除我希望设置/清除的位)。指令“_builtin_write_OSCCONL()”专门设计用于确保写入成为原子,而不是“OSCCONL=u.”的C代码指令。“该指令”“SuxBuffTyNoRead EsCONLL(OSCCon and ~(1 & lt and lt;6)””分解为1汇编指令吗?它看起来像是一个读、修改和写,都在一条线上。AKA 3指令。我必须检查分解以确定。即使它被编码为单个汇编指令,我的“u builtin_write_OSCCONL(0x80)”的代码也会满足要求。微芯片代码与我的代码之间的唯一区别是我明确地清除0-6i位。不要只清空位6。如果错误地设置了位1,微芯片代码将永远不会清空它,但我的代码会清空它。我可以将我的代码改为“_builtin_write_OSCCONL(OSCCON& ~(0x42))”用于解锁,而“_builtin_write_OSCCONL((OSCCON|(0x40))和amp;0x8D”用于锁定。需要尝试RISC建议的基于数据的断点。我可能对我的优先级7中断有问题。但是,中断解释对我来说没有意义。如果寄存器只对1条指令解锁,那么被中断应该导致我写“_builtin_write_OSCCONL(0x)”。因为寄存器不再解锁,所以失败。它不应该导致设置额外的位。除非中断可能导致通常的错误行为。
|
|
|
|
|
|
这是我的配置位。
|
|
|
|
|
|
嗨,你的系统中真的有一个外部时钟吗?外部时钟意味着50/50平方的信号只进入OSC1引脚。如果您有一个外部XTAL,那么这个设置是不正确的,它应该是HS或XT,这取决于XTAL频率。
|
|
|
|
|
|
您显然不明白的是.u builtin_write_OSCCONL(无符号字符值)已经生成这个指令序列:
|
|
|
|
|
|
嗨,为了避免混淆或误解,我建议简单地看一下拆解列表文件:窗口& gt;调试& gt;输出& gt;反汇编列表FielIT,将显示生成的装配线的每一行C。
|
|
|
|
|
|
在这种情况下,不需要查看反汇编列表,除非您想证明编译器错误或文档错误。XC16文档清楚地说明了实际上是什么。除非您想避免编译器错误或文档错误,否则绝对不能将0x80写入OSCCONL寄存器。
|
|
|
|
|
|
你必须清除IOLKOK,做一些事情,然后设置IOOKOK。
|
|
|
|
|
|
没有像0x80这样的神奇数字,使用宏,所以其他人可以阅读它,包括你几周后。
|
|
|
|
|
|
如果IOLCOK以前设置的话,这是唯一正确的。
|
|
|
|
|
|
IOL1WORD只允许一个解锁,我总是保持清除。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
454 浏览 0 评论
5793 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3529 浏览 3 评论
1121浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1094浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
872浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
460浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 16:23 , Processed in 1.228673 second(s), Total 106, Slave 89 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
514