Microchip
直播中

李玲

7年用户 1209经验值
私信 关注
[问答]

为什么这个循环在执行256次之后会停止?

大家好,我刚刚问了一个关于装配程序的问题,我在初学者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)

李天竹

2019-9-25 14:14:43
如果将DELAY1初始化为零,则第一次由DEFSFZ处理,它将溢出到255。然后进行255次循环,最后达到0次。总共有256个,因为循环结束时是0,下一次循环运行时,它将是0,所以它将再次运行256个循环。
举报

张蕾

2019-9-25 14:28:08
Hi.使用显示的代码,循环将在第一次执行“MainLoop”时计算随机的循环数,然后自初始化为“0”,如NorthGuy所指出的。
举报

沈艳丽

2019-9-25 14:43:39
嗯,我明白了,谢谢大家。我不确定为什么他们在教程中没有初始化它,我想是错误的。以下是教程中的所有代码:******************************************************************************************************************************;造成延迟的一种方法是花时间递减一个值。**********************************************************************************************在汇编中,定时可以被精确编程,因为用户将直接控制如何执行代码。在?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。
举报

卢表镜

2019-9-25 15:04:20
Manual说它不是强制初始化代码中的变量,但是对于好的编码实践来说,初始化变量是必要的。为什么有必要?因为它是潜伏的虫子。稍后,您可以扩展代码并获得疯狂输出。如果第三个人希望阅读来修改或保留代码,他将花费更多的时间来完成您应该轻松完成的工作。
举报

更多回帖

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