【发布时间】:2020-01-07 14:25:10
【问题描述】:
我正在使用 Microchip 的 PIC 18F 微控制器来连续生成矩形信号。信号本身的代码位于label5。
我需要生成这个信号的 255*20 个脉冲。所以基本上,我需要将标签 5 的前 4 行的指令重复 255*20 次。因为我不能有大于 2^8 的数字,所以我需要这样写数字。
label5 BSF portd,5
call timer1
BCF portd,5
call timer2
在下面的代码中,我试图实现这种行为。我给variable1 的值是255,然后我从这个值递减,直到variable1 为零,在这种情况下,我返回label2 并重新启动程序。每次我减少variable1 时,我都会打电话给label4。类似的事情发生在label4。这里我有另一个变量variable2,它也会递减,直到它达到零(这里是主信号生成程序,每次递减操作都重复),在这种情况下,程序返回。
有人可以告诉我我是否走在正确的轨道上吗?
label2 movlw .255
movwf variable1
label3 call label4
decfsz variable1,1
goto label3
goto label2
; """"""""""""""
label4 movlw .20
movwf variable2
label5 BSF portd,5
call timer1
BCF portd,5
call timer2
decfsz variable2,1
goto label5
return
end
```
【问题讨论】:
-
如果我正确理解了您的问题,也许我没有正确理解,但是您在这里要做的是有两个循环,一个在另一个循环中,例如 255/256 限制,您可以用一个计数循环来包装该循环到 20 有效地给出 20*256。
-
@old_timer。是的,这就是我要找的。抱歉,英语不是我的母语。
-
嗯,这就是你要做的有一个内部循环变量/寄存器,如果需要,这将是一个紧密的循环,也许是一个 nop。然后是一个外循环。您经常会看到内部循环初始化为零,因此它递减到 0xFF,然后递减到 0x00,因此您通过循环获得 256 次,不超过作为 decfsz 一部分的比较。然后是一个包裹那个的外循环。如果你真的需要长计数,你可以继续包装。使用计时器也很好,但是对于图片和其他一些指令执行时间非常可预测的情况,这很常见。
-
@old_timer 非常感谢您的帮助!真的帮助我理解了。我会接受你的回答,但我不能,因为你在 cmets 上发布了这个。
标签: loops assembly pic microchip