打印
[AVR单片机]

mega88 连续读不同端口输入,返回值不正确。

[复制链接]
2299|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sflfw|  楼主 | 2007-7-17 10:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
是 MLF 封装 M88 ,编译环境 icc713pro

#define DATA_IN  ((PINC&(0x0f))<<4)|(PIND &(0x0f)) 

C口 和 D口 低4位都为输入 并上拉, 内部 1Mhz 

程序 调用 value =DATA_IN  时C口读出结果对,D口全为1为; 

改为  
#define DATA_IN  PIND &(0x0f)) | ((PINC&(0x0f))<<4) 

D 口对,C 全1;  注意是先读的对! 

然后改为  

value =PIND &(0x0f)) ; 
for(i=0;i<10;i++); 
value=value  + ((PINC&(0x0f))<<4); 

就全对了, 难得 不能连续读吗?? 

汇编  (不太懂,好像没错) 
;    //for(i=0;i<10;i++); 
;    value=DATA_IN1; 
   in R24,0x6 
   andi R24,15 
   andi R24,#0x0F 
   swap R24 
   mov R10,R24 
   .dbline 76 
;    //for(i=0;i<10;i++); 
;    value=value+DATA_IN2; 
   in R24,0x9 
   andi R24,15 
   add R10,R24 
   .dbline 77

value = ((PINC&(0x0f))<<4)|(PIND &(0x0f)); 
这句的汇编码贴一下

;value = ((PINC&(0x0f))<<4)|(PIND &(0x0f)); 
   in R24,0x9 
   andi R24,15 
   in R25,0x6 
   andi R25,15 
   andi R25,#0x0F 
   swap R25 
   mov R10,R25 
   or R10,R24 


前面一个 输入口没问题,后面一个 读取为全1 。有 条件的 朋友测试测试 。 

这条命令的前一条是 把两个口设置为输入并上拉。速度为 内部 8M 8分频(1MHZ)

然后改为  

value =PIND &(0x0f)) ; 
for(i=0;i<10;i++);  
value=value  + ((PINC&(0x0f))<<4); 

就全对了,加NOP() 应该是可以的。


问题在:

value = ((PINC&(0x0f))<<4)|(PIND &(0x0f)); 

先读的 端口数据正确,而 后读 的不行了?

在连续几个时钟周期内不能连续读 端口输入吗?

上面提供的 汇编代码 说明语句还是正确的。

相关帖子

沙发
sflfw|  楼主 | 2007-7-17 10:38 | 只看该作者

跪求 高手 解惑!

使用特权

评论回复
板凳
dadodo| | 2007-7-17 10:45 | 只看该作者

这样试试

不要加for(i=0;i<10;i++); ,就加一个nop试试结果如何 

使用特权

评论回复
地板
sflfw|  楼主 | 2007-7-17 10:49 | 只看该作者

问题是我想知道为什么 不延时不行。

for(i=0;i<10;i++);  小于 5次时不行。
即 for(i=0;i<5;i++);   i为 unsigned char

使用特权

评论回复
5
zhiwei| | 2007-7-17 20:31 | 只看该作者

输入上拉

比较弱以前看等效电阻20k,现在好像变成30k了,加上脚上的电容影响和同步延迟立即读是会出错俄,建议加外部上拉。

使用特权

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

本版积分规则

3

主题

79

帖子

2

粉丝