完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
嘿,大家,好吧,自从我搞砸PIC已经快20年了,我肯定我做了一些愚蠢和错误的事情,但是随着这些年发生了很多变化,我搞不清楚。所以我只是想闪一下LED(这是我教的数字电子课程,我出于多种原因,他们想从PIC开始,这样学生就可以提供一个1Hz的外部时钟,第一个程序就是RC3上的一个LED闪光灯。我已经尝试了多个代码,没有任何工作,你甚至可以看到,在这次最新的演出中,我刚刚把FFFF放到了LATC上。我还尝试用直接寻址(实际上是对LATC寄存器寻址,而不是用名称调用它)代替助记符。在模拟器中运行它,没有寄存器正在改变-甚至银行选择寄存器,甚至当我试图直接地址它。这只是一个示例代码,不幸的是,我已经尝试了十个不同的版本,显然我不打算发布每一个。所以这只是许多例子中的一个。但我会很高兴地输入关于地球认为我做错了什么的输入。tiAIanCODE:#include "p16F1455.inc"; CONFIG1; __config 0xFFFF __CONFIG _CONFIG1, _FOSC_ECH & _WDTE_ON & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _BOREN_ON & _CLKOUTEN_OFF & _IESO_ON & _FCMEN_ON; CONFIG2; __config 0xFFFF __CONFIG _CONFIG2, _WRT_OFF & _CPUDIV_CLKDIV6 &USBCLK_48MHz&;_PLLMULT_3x&;_PLPLLEN_启用&;_STVREN_ON&;_BORV_LO&;_LPBOR_OFF&;_LPBOR_OFOFF&;_LVP_ON org H'0000 0';确保闪存从00001开始;程序从银行H'0001'clrf H'008E'008E'008E'银行船H'0002'008E'0002H 008E'008E'H 008E'H 0002循环1活1活1活1活1活1活1活1活1活1活1活1活1活1活1活1活1活1活1活1活1H'010E'goto looPY1端
|
|
相关推荐
19个回答
|
|
|
我不了解模拟器如何处理外部时钟,但在现实世界中,使用1Hz时钟,您需要禁用WDT。附带说明,寄存器是8位,命令中的内存地址是7位。将16位值分配给学生会误导学生。
|
|
|
|
|
|
BANKSEL指令的操作数不是寄存器的银行号,而是您想要将银行更改为的寄存器的地址。关于配置位设置,请将设置关闭,直到您理解其操作。
|
|
|
|
|
|
最后。模拟器可能不是完美的…
|
|
|
|
|
|
我试过使用可重定位的代码,但是地址也没有变化。只有当我在共享内存中找到变量时,才会正确地查看它。或者只有选定存储库(BSR)中的变量才被正确显示。如果注释掉SHR_RAM udata_shr 0x70,变量就位于某个地方。hing就是这个程序看起来运行起来完全一样,即使我并不关心银行。例如,我的计数器变量的地址是0x300x320,但它只是使用了错误的位置(0x20)。PORTC避免RMW;-)
|
|
|
|
|
|
@ VLogi:您的代码将银行设置为LATC,但是“计数器”的银行可能不在与LATC相同的银行中。编辑时,当SRYRAM RAM行被注释掉时。&编辑/gt;
|
|
|
|
|
|
是的,这就是我上面想说的。不幸的是,一个角色迷失了
|
|
|
|
|
|
LATC位于BANG2中,因此BANG2中的数据存储位置0x120应该作为“计数器”增量而改变。
|
|
|
|
|
|
你是说0x220?是的,不过在开始和压缩时我有BANKSEL PORTC。首先我认为它是一个PIC16->.PORT然后我认为它并不重要,因为我写了整个端口。最后我意识到XOR是一个RMW指令;-)
|
|
|
|
|
|
不,它是BANG2的0x120。位置0x220是Bank4。对于BANKSEL PORTC,正在改变的是Bank0中的0x020。RMW在您的代码中并不重要,因为TRISC中只有一位被配置为输出。编辑& gt;见下文。&编辑/gt;
|
|
|
|
|
|
是的,你是对的;-正如我上面所说的,是的,在这个代码中没有。最好使用LAT(如果可能的话),因为不给坏的/危险的例子…
|
|
|
|
|
|
实际上,我认为在xorwf指令之前的长时间延迟可能使RMW效应的可能性无效,而不是仅仅改变一个I/O引脚的事实。长延迟将允许在下次读-修改-写之前稳定输出(希望如此),假设输出没有以这样的方式加载,即它永远不会达到适当的1或0电平。但更好地使用LATX反正说。
|
|
|
|
|
|
我不太确定我理解你。RMW效应只影响未被修改的PORTX输出位——在这种情况下没有。如果我正确理解了,写到LATX会有同样的效果,延迟会让输出稳定下来。编辑…假设你说PIN的切换速度比它能达到一个适当的水平快。&编辑/gt;
|
|
|
|
|
|
我不太确定我理解你。RMW效应只影响未被修改的PORTX输出位——在这种情况下没有。如果我正确理解了,写到LATX会有同样的效果,延迟会让输出稳定下来。编辑…假设你说PIN的切换速度比它能达到一个适当的水平快。没有RMA效果是在修改端口之前读取端口位的结果,或者它。如果端口位尚未被前一个输出指令所设置的适当的水平确定,那么错误的电平将被读取,然后被修改,然后被写回。这将影响通过使用任何RMA指令而改变的一个、两个或任意数量的端口位,在这种情况下是XORWF指令。RMW在不使用一个不受第一次读取PovVStand的影响的指令(如MOVWF指令)时写入整个端口。使用LATX寄存器避免了这一点,因为它读取锁存器而不是输入引脚状态。
|
|
|
|
|
|
好的,我明白你的意思。假设RC2 pin的初始状态是0,并且它的加载方式使得它在XOR切换期间不能达到适当的1级。XORWF PORTC指令从RC2 pin读取0,将其修改为1,并将1写入PORTC2。但是由于RC2管脚负载很大,在下一个XORWF PORTC指令中,它将再次读为0,并且再次将一个1写入PORTC2。因此,RC2引脚将明显达到1级。此时,在执行更多的XORWF PORTC指令之后,它显然将再次达到0级。XORWF LATC指令从LATC2读取0,将其修改为1,并将1写入LATC2。但是由于RC2 PIN负载很重,当执行下一个XORWF LATC指令时,它仍然处于0级。这一次,指令从LATC2读取1,将其修改为0,并将0写入LATC2。由于RC2引脚仍然处于0电平,所以写入0到LATC2将降低引脚状态。RC2引脚总是低的,甚至认为它的LATC2位正在切换。编辑& gt;见下文。所以,如果我没有错过任何东西,使用PORTC实际上会切换PIN,而使用LATC也不会。我认为,当引脚的初始状态为1时,这是类似的结果。无论如何,我同意最好使用LATX作为输出。
|
|
|
|
|
|
是的,寻址PORTC会切换,但速度比预期的要慢,会随温度、电源电压等各种模拟效应而变化。寻址LATC,它不会停留在零,它会逐步上升到半Vdd,然后在预期的频率上给出锯齿。UnTrices集中在VDD/2附近(假设负载为电容性的)。电阻负载对地或VDD将歪斜结果在那个方向。
|
|
|
|
|
|
但是如果引脚被加载了那么多,就没有办法让它在期望的频率下切换。在较低频率切换引脚或根本不切换它只是两种不同的故障模式。
|
|
|
|
|
|
两者都同意。:)
|
|
|
|
|
|
这就是为什么我说xorwf指令之前的延迟将消除rmw效应,引脚应该有时间上升或下降到适当的水平。RMW只在写入PORTx时发生,并且在执行NEXT rmw敏感指令之前,输出管脚不能够快速上升或下降到希望的水平。使用LATx寄存器可以避免这种影响,但是仍然不能在I/O管脚上产生期望的结果,但是I/O端口状态的内部表示将是正确的。
|
|
|
|
|
|
使用模拟器,以下代码既正确更新TISC和LATC寄存器:
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475 浏览 0 评论
5794 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3530 浏览 3 评论
1124浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1098浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
873浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
475浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 13:46 , Processed in 1.209349 second(s), Total 108, Slave 91 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2173