求助高手:16F877A中断程序中的怪现象

[复制链接]
6622|21
 楼主| 无悔 发表于 2007-5-18 13:58 | 显示全部楼层 |阅读模式
求助:<br />在进行PWM设置的时候,T2中断,以调整占空比。中断程序开始运行正常,但是在中断程序的开始处添加两个以上的NOP指令后,下面的程序就运行不正常,请问为什么?<br />添加其他程序也会&nbsp;出现这个现象。但是PWM没有关闭
 楼主| 无悔 发表于 2007-5-18 19:10 | 显示全部楼层

可能不是程序问题(PIC16F877A)

今天晚上测试的时候发现时好时坏<br />中断程序至少能进一次,但是添加的测试程序多了又进不了了.<br />PIC和51不一样的是没有堆栈问题,所以我很迷茫,搞不明白怎么回事<br /><br />还有就是我用的是下载线烧录的程序,当我接下载线的时候还能正常运行,当只接电源的时候又不行了.其中我已经在编程最后写配置字的时候关断了低压编程.<br />看门狗也关了,但是也曾有出现周期性的复位<br />求高手们帮忙考虑一下都有可能是什么问题
ocon 发表于 2007-5-18 19:19 | 显示全部楼层

从你的描述来看是个新手。

单片机的调试有个原则:先从最简单的程序结构做起,确认没有BUG之后再添加别的功能。
 楼主| 无悔 发表于 2007-5-18 19:28 | 显示全部楼层

自学PIC没多久,没有人指导,很郁闷啊

我只是编了个PWM输出的程序,可是老是时好时坏,以为是硬件电路的事,但是查了查,自己没有找到毛病<br />我用的是RC振荡做时钟,R=4.1K,C=22pF<br />只是在T1的外部时钟端接有40KHZ的晶振,复位电路<br />没有了<br /><br />还有,从我手头的资料看,PWM好象不能直接产生中断,而是通过TMER2的中断来修改参数的,应该没有理解错误吧?
ocon 发表于 2007-5-18 19:44 | 显示全部楼层

如果你指的是内部的硬件PWM,它是自动运行的,不需要干预

在你需要的时候写新的占空比值进去即可。<br />当然,打开它会占用某些硬件资源,具体可查阅对应单片机的DATASHEET。
 楼主| 无悔 发表于 2007-5-18 19:58 | 显示全部楼层

我已经打开,而且也可以运行

只是出现了以上问题:中断中修改占空比的程序写好后,运行正常,又想添加几句指令,就出现了问题,甚至是添几个NOP都不行<br />后来就是出现了整个不稳定工作,所以猜测是硬件的问题,请OCON指教
xieyuanbin 发表于 2007-5-18 21:35 | 显示全部楼层

PWM占空比不需要在中断中改变

占空比是随时都可修改的,但新修改的值只有在下一个PWM工作周期中才能体现出来.<br />另外PWM本身没有中断,由TMR2中代替.平时也可不开.<br />我想你有可能是中断现场保护恢复工作没做好,或者中断占用的太多的时间,以至于无法退出中断.<br />你的单片机频率是多少?好像是4M左右.
 楼主| 无悔 发表于 2007-5-19 07:55 | 显示全部楼层

我的频率是1M,程序总共几十行

我的中断中没有现场保护程序,因为程序没有超过一页范围,主程序最后是一条:GOTO&nbsp;&nbsp;$<br />可能是这个原因吧,我试试
xieyuanbin 发表于 2007-5-19 09:02 | 显示全部楼层

程序没有超过一页的范围不等于不要现场保护

你的W,STATUS总有内容要保存的.
 楼主| 无悔 发表于 2007-5-19 12:19 | 显示全部楼层

早上又翻看了几遍资料,试着改了几次配置位,问题解决

原来是配置位设置有问题,877A的配置位有一个DEBUG(测试模式设置位吧),我之前无意中开了,现在关闭以后OK.<br />总结一下,这次PIC试用中出现和已经解决的问题有:<br />1.配置字的DEBUG位没有关闭,造成的程序不正常,暂时还不知道原因,希望高手指点;<br />2.低压编程使能位的设置:采用低压在线编程的时候,不能设置LVP配置字,只能接下拉电阻了,接上拉电阻也不行(实验出来的,还没有查证,望高手确认);<br />3.看门狗的设置和RA口的I/O初始化设置.
 楼主| 无悔 发表于 2007-5-19 12:20 | 显示全部楼层

谢谢楼上各位前辈的热心指教

  
yewuyi 发表于 2007-5-19 17:39 | 显示全部楼层

DEBUG模式下也不应该

否则DEBUG怎么用?
 楼主| 无悔 发表于 2007-5-20 18:31 | 显示全部楼层

我也不明白

在这个模式下的中断程序老是出问题,是不是在这个模式下需要什么特殊的硬件或时序要求啊?毕竟我用的是下载线才出的问题,而没有用仿真器.
yewuyi 发表于 2007-5-20 21:14 | 显示全部楼层

可能是是MPLAB设置项的

compile&nbsp;for&nbsp;MPLAB&nbsp;ICD没有正确配置造成的……
 楼主| 无悔 发表于 2007-5-21 08:21 | 显示全部楼层

我用的是51仿真器上附带的PIC在系统烧写功能

我用的是51仿真器上附带的PIC在系统烧写功能,编译软件用的是伟福,都没有见到楼上说的compile&nbsp;for&nbsp;MPLAB&nbsp;ICD配置。<br />请问:<br />&nbsp;&nbsp;&nbsp;&nbsp;compile&nbsp;for&nbsp;MPLAB&nbsp;ICD配置的是什么?将会影响到什么?
 楼主| 无悔 发表于 2007-5-21 08:31 | 显示全部楼层

以下是我在网上找的

Compile&nbsp;for&nbsp;MPLAB&nbsp;ICD:如果你准备用ICD&nbsp;调试C&nbsp;语言编译后的代码,那么此项就必须打钩选中。这样编译后的结果就能保证ICD&nbsp;本身使用的芯片资源(一小部分的程序和数据空间)不被应用程序所占用。<br /><br /><br />根据这句话,我认为问题应该是出在烧录器的软硬件设计上:可能是DEBUG模式下工作需要一定的时序控制要求吧,要不DEBUG模式和正常工作模式不分开,那不是更有问题了?
yewuyi 发表于 2007-5-21 08:35 | 显示全部楼层

请注意:WAVE不支持PIC16F877型号……

请使用MPLAB……
xieyuanbin 发表于 2007-5-21 08:51 | 显示全部楼层

DEBUG模式需要占用单片机的一些资源.

除两个IO和MCLR之外,还需要占用几个内存单元,两级堆栈等.做汇编一定要注意内存单元的空出,做C要保证编译时将该选的选项打钩.
 楼主| 无悔 发表于 2007-5-21 08:53 | 显示全部楼层

必须么?

WAVE的vw版本支持PIC16F877<br />对了,我没有说明:我用的是汇编编程的(C不是很熟),所以编译器能支持PIC中挡产品应该是够用了吧?毕竟编译器产生的只是可烧录的机器代码
 楼主| 无悔 发表于 2007-5-21 08:56 | 显示全部楼层

麻烦xieyuanbin说的在清楚点

DEBUG模式都占用那些内存单元<br />另外两级堆栈是否会造成中断不正常?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

49

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部