完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
大家好,我刚刚问了一个关于装配程序的问题,我在初学者3的引导中。虽然我似乎理解decfsz指令以及bra指令,但我不明白为什么这个循环在执行256次之后会停止。Here is the code below:_____________________________________________________________________________________________; PIC: 16F1829; Assembler: MPASM v5.43; IDE: MPLABX v1.10;; Board: PICkit 3 Low Pin Count Demo Board; Date: 6.1.2012cblock 0x70 ;shared memory location that is accessible from all banksDelay1;为共享内存中的延迟循环定义两个文件寄存器Delay2 endc;--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------11000’;设置500KHz->对于OSCCON的每个指令移动,与(1/(500K/4))相关;将工作寄存器的内容移动到OSCCON bcf TRISC,0;使IO引脚C0成为DS1银行LATC的输出;bank2 clrf LATC;通过关闭所有LEDsMainLoop:bsf LATC,0;打开;DS1 OnDelayCouth:Defsz Delay1,f;浪费时间。bra OndelayLoop ;The Inner loop takes 3 instructions per loop * 256 loops = 768 instructions__________________________________________________________________________________________I know the highest value Delay1 can hold is 11111111 which is 255 but im not sure what this value starts out as if weDONT初始化它。从读取数据表来看,是否认为一旦f为0,它将执行无操作指令,从而可能导致循环停止?因此,除非延迟1是在255 IM初始化,不知道这个循环如何去256次。任何帮助都非常感谢!也可以在任何地方纠正我的错误。谢谢您!
|
|
相关推荐
7个回答
|
|
|
如果将DELAY1初始化为零,则第一次由DEFSFZ处理,它将溢出到255。然后进行255次循环,最后达到0次。总共有256个,因为循环结束时是0,下一次循环运行时,它将是0,所以它将再次运行256个循环。
|
|
|
|
|
|
Hi.使用显示的代码,循环将在第一次执行“MainLoop”时计算随机的循环数,然后自初始化为“0”,如NorthGuy所指出的。
|
|
|
|
|
|
嗯,我明白了,谢谢大家。我不确定为什么他们在教程中没有初始化它,我想是错误的。以下是教程中的所有代码:******************************************************************************************************************************;造成延迟的一种方法是花时间递减一个值。**********************************************************************************************在汇编中,定时可以被精确编程,因为用户将直接控制如何执行代码。在?C?编译器采用了?C?并将其编译成汇编;将文件创建到实际的PIC MCU(HEX文件)。因为这一点,很难准确地预测一条线需要多少指令。C?DS1以大约1.5秒的速度闪烁;;PIC:16F1829;汇编程序:MPASM v5.43;IDE:MPLABX v1.10;;板:PICkit 3低引脚计数演示板;日期:6.1.2012;;********************************************************************************************************************************参见低引脚计数演示板用户指南对于课程信息*************************************************************************************************************************************************************************************************************************************************************____包括&&<&&&<&&&&&<&&&&&< p p16F1616161616161F1829.ppppp16F1829.inc 969696969696969696969696&_CLKOUTEN_OFF&_IESO_OFF&_FCMEN_OFF);u CON._CONFIG2,(_WRT_OFF&_PLLEN_OFF&_STVREN_OFF&_LVP_OFF);错误级别-302;压缩“不在bank0”警告cblock 0x70;可从所有banksDelay1访问的共享内存位置;为共享内存Delay2结束符中的延迟循环定义两个文件寄存器;-----。----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ovwf OSCCON;将工作寄存器的内容移动到OSCCON bcf TRISC,0;使IO Pin C0成为DS1银行LATC的输出;bank2 clrf LATC;首先关闭所有LED MainLoop: bsf LATC,0;打开DS1 OndelayLoop:decfsz Delay1,f;浪费时间。bra OndelayLoop;内环每循环接受3个指令*256个循环=768个指令decfsz Delay2,f;外环每圈接受另外3个指令*256个循环;内环每秒=768+3)*256=197376个指令/125K指令=1.579秒。关闭LED C0-注意:因为bank2仍然被选择,所以不需要用“banksel”来切换银行:decfsz Delay1,f;与上面文胸OffayLoopdecfszDelay2,f文胸OffayLoop文胸MainLoop相同的延迟;再次这样做……最后,**************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************这就是为什么在递减之前不必给Delay1和Delay2变量赋值的原因。“我不认为Delay1和Delay2将自动地在0开始,而不指定一个值,所以Il只是把它分配给0。
|
|
|
|
|
|
Manual说它不是强制初始化代码中的变量,但是对于好的编码实践来说,初始化变量是必要的。为什么有必要?因为它是潜伏的虫子。稍后,您可以扩展代码并获得疯狂输出。如果第三个人希望阅读来修改或保留代码,他将花费更多的时间来完成您应该轻松完成的工作。
|
|
|
|
|
|
谢谢大家的帮助!还有一个问题,如何分配Delay1和延迟2到00000000?我知道这也许是个问题,但我在谷歌搜索之后找不到如何做到这一点。我看了一下数据表,找不到有关如何做这件事的任何说明。我试过BSF,那没用,也许是MOV命令?非常感谢您的帮助!
|
|
|
|
|
|
如果你把两个变量都设为延迟1和延迟2到“1”,则代码将直接通过。
|
|
|
|
|
|
看一下你的PIC数据表中的CRF、MOVLW和MOVWF指令。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
503 浏览 0 评论
5812 浏览 9 评论
2350 浏览 8 评论
2237 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3544 浏览 3 评论
1159浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1121浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
888浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
503浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-13 22:52 , Processed in 2.579700 second(s), Total 84, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
5390