打印

LED7SEG模块有bug

[复制链接]
2831|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lyce|  楼主 | 2009-2-24 16:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
器件为CY8C21534_24PVXI
放置LED7SEG with MPX Timer 七段数码管模块,
设置P2口为segment port;
P0.0,P0.1为Digit Drive pin 片选,两位数码管显示
segment port与Digit Drive Pin都设成Low active
另设P0.7为stdCPU,输出,strong模式
代码如下

void main()
{
   LED7SEG_Start();             // Enable display  
   M8C_EnableGInt;   
   
   LED7SEG_DispInt(16, 1, 2); // Display "16" 
   
   PRT0DR = PRT0DR | 0x80;     // P0.7 set to "1",已更正

   while(1);

}

运行时发现无法将P0.7置高。

LED7SEG模块定时刷新数码管的中断程序中,会将P0口的其他未使用到的管脚一并置0,导致这些IO口无法正常使用。

软件版本是PSOC designer 5.0,
不知道除了自己改Lib中的asm代码之外,有没有什么好的解决办法,望各位高人指点。
沙发
lyce|  楼主 | 2009-2-24 16:23 | 只看该作者

把project文件传上来,大家有空帮忙看看

使用特权

评论回复
板凳
NI_LABVIEW| | 2009-2-24 23:15 | 只看该作者

P07置高应该是PRT0DR = PRT0DR | 0x80吧

PRT0DR = PRT0DR | 0x80;     // P0.7 set to "1"

使用特权

评论回复
地板
lyce|  楼主 | 2009-2-25 09:12 | 只看该作者

谢谢NI_LABVIEW 兄提醒

我的程序中写的就是PRT0DR = PRT0DR | 0x80;     // P0.7 set to "1".
昨晚用cma的PSOC_kit上的CY8C29466试了一下,结果也是一样。

查看了Lib中的LED7SEG.asm,其中刷新数码管的部分程序如下:

; Turn digit back on

   mov   A,X                                     ; Copy index into A
   index LED7SEG_DigitPortMask                   ; Digit mask into A

IF(0)                                            ; Active High Digit Drive
   or   [Port_0_Data_SHADE],A
ELSE                                             ; Active Low Digit Drive
   and  [Port_0_Data_SHADE],A                    ;似乎没有对PRT0DR作应有的处理
ENDIF
   mov  A,[Port_0_Data_SHADE]
   mov  reg[LED7SEG_DigitPortDR],A


使用特权

评论回复
5
ni_labview| | 2009-2-26 13:03 | 只看该作者

可以放置一个LED模块到P07上,就不受影响了

我以前碰到问题时这么解决的,当时是软I2Cm影响了我的继电器驱动,后来放了个LED模块解决的

使用特权

评论回复
6
lyce|  楼主 | 2009-2-27 11:55 | 只看该作者

问题已解决,谢谢ni_labview兄

我之前尝试修改了LED7SEG.asm中的相关程序,勉强可以正常工作,但总觉得不是个好的解决办法。
根据ni_labview兄的意见,加了个LED模块在IO口上,才将问题彻底解决。

仔细读了一下LED模块的datasheet和相关的底层代码,和LED7SEG模块以及其他许多模块一样,LED模块也是通过“系统影子寄存器”来对IO口进行操作的,这样可以避免IO口操作冲突。看来直接使用PRTxDR对IO口进行读写操作是很危险的。

谢谢ni_labview!!!

使用特权

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

本版积分规则

5

主题

33

帖子

0

粉丝