[PIC®/AVR®/dsPIC®产品] 遇到一个奇怪的问题。

[复制链接]
2074|10
 楼主| nemogg 发表于 2014-1-15 14:49 | 显示全部楼层 |阅读模式
最近遇到一个比较奇怪的问题,我用p18lf46k22 写了一段程序,RD0,RD1,RD2接到一个74LS138的芯片的地址线。所以每次改变74LS138的输出时都要修改这三个输出。开始用单片机内部的16MHZ晶震输出都是正常的。但奇怪的是当我吧PLL打开的时候(FOSC X4 ,也就是说内部时钟工作在64MHZ)RD0怎么都没有输出,RD1,RD2,工作正常,用示波器观察RD0一直是低电平,奇怪的是把这一段程序去掉,单独把RD0置1的时候输出又是正常的。

.......
case 1:{LATD2=0;
        LATD1=0;
        LATD0=1;
        LED_EN=1;break;}(这段程序大概每3ms调用一次)。

查了半天,发现只要把LATDx=x的指令重复几次就可以实现想要的功能了。也就是:
case 1:{LATD2=0;
        LATD2=0;
        LATD2=0;
        LATD1=0;
        LATD1=0;
        LATD1=0;
        LATD0=1;
        LATD0=1
        LATD0=1
        LED_EN=1;break;}
请问有人知道这是神马原因呢。。。。难道是端口根本就不能工作在64MHZ的时钟下,中间需要插点延迟?
leehp 发表于 2014-1-15 15:51 | 显示全部楼层
你把74LS138换成74HC138试试。
yewuyi 发表于 2014-1-15 20:14 | 显示全部楼层
去掉外部挂的一切电路和元件再测。
 楼主| nemogg 发表于 2014-1-16 11:02 | 显示全部楼层
leehp 发表于 2014-1-15 15:51
你把74LS138换成74HC138试试。

74HC138的延迟跟74LS138比几乎慢了一个数量级,HC的大概是150~200纳秒,LS最不会超过20多纳秒。而单片机的本身的指令周期就是62nS左右的(64Mhz),所以HC的芯片可能还没响应过来单片机可能已经跑到下面的使能指令了。

在我的程序里在修改完138的输入之后马上就会打开138的使能端子,所以如果延迟太大可能会导致会有短暂的错误输出。

 楼主| nemogg 发表于 2014-1-16 11:09 | 显示全部楼层
yewuyi 发表于 2014-1-15 20:14
去掉外部挂的一切电路和元件再测。

我好像试过断开所有线试了以下。但是RD0始终是0.所以后面线重新接回去了。

后面用示波器去看发现RD0会有非常窄的脉冲,感觉是刚打开又关上的。。。但是查来查去都找不到有置0的地方,晕死了:dizzy:
frank303 发表于 2014-1-16 12:20 来自手机 | 显示全部楼层
用pll吗?设置有木问题。
 楼主| nemogg 发表于 2014-1-16 13:22 | 显示全部楼层
frank303 发表于 2014-1-16 12:20
用pll吗?设置有木问题。

没问题,我用示波器观察RA7输出内部时钟波形,频率是正确的。
yewuyi 发表于 2014-1-16 17:25 | 显示全部楼层
nemogg 发表于 2014-1-16 11:09
我好像试过断开所有线试了以下。但是RD0始终是0.所以后面线重新接回去了。

后面用示波器去看发现RD0会有 ...

检查RD0的相关数据手册描述,看看是否有复用模块
 楼主| nemogg 发表于 2014-1-19 12:36 | 显示全部楼层
yewuyi 发表于 2014-1-16 17:25
检查RD0的相关数据手册描述,看看是否有复用模块

RD0是有复用模块的,但是TRIS,ANSEL都应该设置正确了,唯一不明白是这个输出优先级的功能是怎么配置,DATASHEET的意思好像是会由PERIPHERAL控制,但是查不到到底是怎么控制的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
lnulibin 发表于 2014-1-19 19:54 | 显示全部楼层
个人认为LATD寄存器和PORTD寄存器还是有区别的。
RD0

LATD0
也有不同。仔细理解一下这个问题或许有用。
shuidi_wangdan 发表于 2014-1-21 07:54 | 显示全部楼层
我觉得是延时不够,加段延时!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

48

帖子

0

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