完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
你好,我的项目很简单,但同时也很安静(至少对我来说)。我使用的是PIC18F14K22。在PORTB上是一个连接的电阻阵列(DAC类型)。现在在It2上有一个信号连接。我想做的是当INT2上的中断(负边)发生时,PORTB首先遵循一系列步骤,然后尽可能快地遵循LUT(16个步骤)给出的另一系列步骤。端口应该使用这个LUT重复这个序列,直到下一个中断到来,此时相同的步骤将重复,并且端口应该从LUT的第一个元素开始。第一个问题与执行速度有关。为了使用DO-while循环读取PORTB上的数组,每次迭代需要16个循环。理想情况下,我会像在ISR内部那样使用单个命令,但我不知道下一个中断何时到来。第二个问题与ISR的返回有关,所以我可以执行中断发生时没有完成的命令,而不是从头开始。有什么想法吗?
|
|
相关推荐
13个回答
|
|
|
我不太理解你的描述。你想在中断结束时SETI=15吗?如果是,您应该使它“易失性”,并且还要确保主循环中的i--是原子,它在一个decf指令中执行。
|
|
|
|
|
|
谢谢你的回答。你对波动性是正确的。我想做的是简单地一次又一次地运行附加的循环,并且当一个中断从LUT的最后一个(我在第一个post上犯了一个错误)元素开始直到第一个元素并再次循环时,再次运行该循环,直到下一个中断到来,以此类推。所以一般来说,我可以在ISR结束时使i=15。问题是,在中断返回之后,代码可能首先执行最后一个指令(在中断发生之前),并假设首先发送元素4,然后从元素15开始。OP本身。正如我所说的,每一次迭代完成大约15次循环。有没有办法以更快的速度编写代码?{{PurtB= SimeEnAlxAlx[i- ];如果(i和lt;0)i=15;}同时(触发器=1);
|
|
|
|
|
|
如果你需要那种速度,并且你正在使用编译器的免费版本,那么你需要付费版本。如果这不够快,你需要使用ASM。如果这不够快,你需要一个更快的照片。
|
|
|
|
|
|
也许使用指向数组的指针,而不是每次索引它。
|
|
|
|
|
|
在你做了4个元素之后,你可以继续旧的循环,或者你可以开始一个新的循环。你不能两者兼得,对吧?关于速度-如果回路被ISR中断,你会得到定时故障。你可能想让中断只发生在循环之间。如果你想要更快的汇编程序。
|
|
|
|
|
|
使用另一个微控制器是不可能的(空间限制),这已经是最快的微控制器和最小的封装。也许Assembly是一个解决方案,但是我想看看我对C的限制是什么。我使用了一个指向数组的指针,但是循环的执行时间仍然是samedo{PORTB=*(._p+i);i--;if(i<0)i=15;}.(.==1);在中断之后,我想从元素15开始(不是从最后一个元素开始);在发生冲突之前)尽可能快。
|
|
|
|
|
|
哦,不,当然不是这样的,我的意思是:do{PORTB=*myPo.++;i--;if(i<0){i=15;}}}}.(.==1);在循环结束时,您会有一些额外的开销,但是每次迭代都应该更好……
|
|
|
|
|
|
好的,谢谢,我少了2个周期…
|
|
|
|
|
|
如果(i<0)i=15;i&=0xf;编译器应该生成(无论如何)(假设i是一个寄存器)dec_i,_iand#0xf,_i if not register:dec_imov#0xf,w0和_i,那么可以加快速度。
|
|
|
|
|
|
如果在中断中SETI为15(或相应的指针),一旦中断结束,循环将切换到15。我不明白问题是什么?
|
|
|
|
|
|
例如,设想如果do在循环执行PORTB=sine_.;那么在i=15ISR返回之后发生中断,那么下一个命令将是i--并且我将是14,所以我们从14开始而不是15。
|
|
|
|
|
|
HIE中断可能发生在主回路的任何2个指令之间。因此,不可能避免由中断引起的值的减量运算的RISC。您可能需要使用ISR所设置的标志,以便在主回路的良好位置上检查和复位。
|
|
|
|
|
|
因此,如果在获取之后发生中断,但在减量之前发生问题。你只需要确保这个地方不会发生中断。如果你像Cinzia建议的那样使用指针,那么有一个汇编指令,它可以减少FSR并同时获取:为了利用这一点,你需要在FSR0寄存器中存储。这有点问题,因为C编译器将在进入ISR之前保存FSR0,然后在离开ISR之前恢复它的值,从而破坏您在ISR期间所做的更改。为了避免这种情况,您必须用汇编程序重新编写ISR。基于C的解决方案包括在获取之前禁用中断,在递减之后重新启用:但如果您已经缺少时间,这可能不是好事,这会使事情变慢。使用PASDEC)和中断(避免保存/恢复FSR)。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
478 浏览 0 评论
5799 浏览 9 评论
2338 浏览 8 评论
2229 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3534 浏览 3 评论
1132浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1106浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
876浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
480浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-4 11:14 , Processed in 3.170975 second(s), Total 98, Slave 81 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3139