打印

PIC单片机调试中,单步运行和连续运行结果不一样,WHY?

[复制链接]
4891|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jmdst|  楼主 | 2008-3-4 16:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   在调试PIC16LF876A过程中,在DEBUG模式下,按“F7”键单步运行和设定断点运行的结果完全不一样,前者的仿真结果是正常的,后者不对。
   请问大侠,这两者怎么会有这么大的区别了,原因何在?
   谢谢了!
沙发
jetson001| | 2008-3-4 16:37 | 只看该作者

有信号没捕捉到?

使用特权

评论回复
板凳
skygrow| | 2008-3-4 17:01 | 只看该作者

有对端口的操作么

注意读--修改--写

使用特权

评论回复
地板
jmdst|  楼主 | 2008-3-4 17:35 | 只看该作者

有对端口的读写

     就是一个4*10的键盘。我也怀疑是这方面的问题,但对PIC单片机接触的时间不长,不熟。我对某IO脚置高低电平采用BSF或BCF的命令。如
       BCF  PORTA,1
       BCF  PORTA,2
       BCF  PORTA,3
       BCF  PORTA,4
      
   请问这样可以吗?

   谢谢了!!!

使用特权

评论回复
5
xieyuanbin| | 2008-3-4 20:00 | 只看该作者

3楼正解

这样连续位操作是不行的.

使用特权

评论回复
6
谈的元| | 2008-3-4 20:08 | 只看该作者

为何 连续位操作是不行的?

使用特权

评论回复
7
jmdst|  楼主 | 2008-3-5 10:28 | 只看该作者

to xieyuanbin

   能否说的更详细一点,谢谢!!!

使用特权

评论回复
8
skygrow| | 2008-3-5 11:00 | 只看该作者

老生常谈了,转一个

摘自 http://www.pic16.com/cuxue/pic45.htm
“何谓读-修改-写,导致的问题及其解决之道

 何谓读-修改-写,导致的问题及其解决之道:
  只要PICmicro的命令,所处理的FILE (暂存器,内存,和I/O的统称),其最终的值,和命令处理前的值有关,那么,这种命令便是所谓的读-修改-写命令。因为这类命令的操作,可以再细分为三个小步骤,即是读(READ),修改(MODIFY),接著才是写(WRITE)。

如:ADDWF,DECF,IORWF,XORWF,BSF,BCF,‥‥等等皆是。

在使用这类命令的时候,如果所处理的FILE是I/O, 就必须要特别小心。因为,假设任务电压为5V;而您在PORTB的8支脚,没有串接电阻,分别接了8颗二极管(也许是LED)到地。如果,您在先前下了 "BSF PORTB,0"这条命令,使得PORTB第0脚上的LED亮了。当您再运行了”BSF PORTB,1"这条命令后,虽然PORTB第1脚上的LED亮了,但是,PORTB第0脚上的LED却会熄掉。原因是因为,运行”BSF PORTB,1”时,会先将整个PORTB的值往回读,而它读到的PORTB第0脚,却是相当於低电位(被二极管拉为0.7V)。当它再把整个PORTB 的值写出去的时候,PORTB第0脚就被写成低电位,自然灯就熄了。

解决之道是:串电阻,或者不要直接对I/O作读-修改-写命令。

另外还有一类要注意的状况是:如当您将”BSF PORTB,0”和”BSF PORTB,1”两条命令连在一起,没有空运行时,纵使您没有上一段所述线路设计不良之状况,有时候您也会发现PORTB, 0的高电位也会不见了。导致这个现象的原因是:因为也许您这两支脚的外面接了长导线,有相当大的电容、电感性会阻止电位的变化;而且,PIC命令运行是在最后1/4周期时”写出”,而在第一个1/4周期时”读入”,PORTB,0还来不及升至高电位,便被下一个命令读回去了。

解决之道是:通常在两道命令间插入个NOP命令就可以了。"

以前张教主的书还介绍了一方法就是设影子寄存器,如PORTA的影子寄存器PORTA_temp, 位操作对PORTA_temp进行,再把PORTA_temp赋给对应的PORTA。
顺提一下,对于PIC18或PIC的16位单片机的端口输出采用LAT锁存器就不会有类似问题

使用特权

评论回复
9
jmdst|  楼主 | 2008-3-5 11:42 | 只看该作者

十分谢谢skygrow!!!

  衷心谢谢大家的热情的帮助!!! 
  我的问题的确就是这样的,在诸如:
       BCF  PORTA,1
       BCF  PORTA,2
  之间加条 “NOP” 命令,就可以了。
  
  

使用特权

评论回复
10
xieyuanbin| | 2008-3-5 18:10 | 只看该作者

知道为什么?

关键是,是否明白这个道理?还有:skygrow可是个MM

使用特权

评论回复
11
jmdst|  楼主 | 2008-3-5 21:17 | 只看该作者

明白了.

   基本明白了skygrow转载的那段话的意思.

   skygrow乐于助人的精神让人感激,技艺上的水平更让人敬佩呵.
  做技术的MM,都是女人中的战斗机.
   

使用特权

评论回复
12
jmdst|  楼主 | 2008-3-11 22:27 | 只看该作者

还想问个问题

  关于将IO脚设为输入状态后高低电平的问题。
 
  有四个IO脚设为输入脚,接下拉电阻。
  
   在检测按键是否松开的时候,我将键盘的输出脚全部置为高电平后,事实上按键已经松开了,可输入线的电平在很长的一段时间内还是高电平,且电平逐渐减低到零。(没有接电容)

   在读键值时,每次只有一个输出脚为高电平,输入脚的电平检测很正常。
  
  请问,怎么会出现这样的情况了?  

  谢谢!!
 
  

使用特权

评论回复
13
skygrow| | 2008-3-12 14:58 | 只看该作者

端口复用的模拟功能关没?

876A的PORTA吗?
如果是,把A/D功能关掉

使用特权

评论回复
14
jmdst|  楼主 | 2008-3-12 22:11 | 只看该作者

是这样的

   4*10的键盘,输入口是RB7-RB4.一方面要利用其电平变化产生中断来唤醒CPU;另一方面在唤醒CPU后,要利用其作为输入口检测电平的高低。
   按照相关资料,输入脚的电平由外部电路决定,RB7-RB4都接有下拉电阻。当我将10根输出线全部置为高电平,按键都松开了的情况下,RB4和RB5上依然有高电平了???(RB7和RB6暂时不用做IO脚)


   另外我想问题一下,在按下按键后,输出脚如RA1,直接跟RB4会相连,这样可以吗??
  
   谢谢!!!

使用特权

评论回复
15
jmdst|  楼主 | 2008-3-17 17:24 | 只看该作者

问题已经解决了

   是这样的,有4个下拉电阻的阻值过大,有1M,导致下拉能力不够,所以出现了上面提到的问题。(电路不是我设计的,呵呵。)
   我相信肯定也会有人遇到类似的问题,希望能对大家有一点启发。

   多谢大家了!!!
   谢谢skygrow!!!

使用特权

评论回复
16
xieyuanbin| | 2008-3-19 08:28 | 只看该作者

晕死,上下拉电阻我一般的做法是不超过10K

在需要省电的地方,不要做到100K以上,实践证明100K以上就很容易收到干扰.

使用特权

评论回复
17
x512775199| | 2008-3-31 12:32 | 只看该作者

呵呵呵呵呵。。。不错不错

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

20

帖子

0

粉丝