打印

新手问题

[复制链接]
1859|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kusheng176|  楼主 | 2010-10-10 14:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想请问一下,我对8255的PA口和PB口上的数据进行采样的时候,是不是要进行什么过度或者兼容措施?因为我单独对PA口或者PB口采样时,数据是正确的。但是要是放在一起采集的话,就PA和PB就会有几个端口电平自动跳动。
或者这个问题跟采样周期有关么?

弄了好久,实在搞不清楚啊。

相关帖子

沙发
chunyang| | 2010-10-10 15:03 | 只看该作者
要分两次读,8255不是AD,不存在什么“采样周期”,读取时要求外部电平稳定,负责要加锁存。

使用特权

评论回复
板凳
kusheng176|  楼主 | 2010-10-10 18:32 | 只看该作者
2# chunyang

我设置了8个8位的数组,用来存贮这些数据的。
PA、PB口分别扫描4个,然后将PA口的值按顺序放入8个数组的低四位,将PB口的值按顺序放入8个数组的高四位。但是我每次测试的话,总是有误差。请问下是我这个程序的原因不
这是我的扫描程序:

void Turn_pa(unsigned char mask)  //对PA口数据进行存储
{
    unsigned char j;  
    for (j=0; j<8;j++)
    {
        if(num & 1)
        {
            buffer[j]|=1<<mask;
        }
        num >>= 1;
    }
}

void Turn_pb(unsigned char mask)    //对PB口数据进行存储
{
    unsigned char j;  
    for (j=0; j<8;j++)
    {
        if(num & 1)
        {
            buffer[j]|=1<<mask;
        }
        num >>= 1;
    }   
}

void caiyang()
{
    uchar j;
    Delay380us();
for(j=0;j<1;j++)  //扫描开始
{   
     PC=0xfe;  
  num=PA;      
     Turn_pa(j);  
}  
for(j=1;j<2;j++)
{
  PC=0xfd;
     num=PA;
     Turn_pa(j);   
    }
for(j=2;j<3;j++)
{
  PC=0xfb;
     num=PA;
     Turn_pa(j);   
    }  
for(j=3;j<4;j++)
{
  PC=0xf7;
     num=PA;
     Turn_pa(j);   
    }      
    for(j=4;j<5;j++)
{
  PC=0xef;
     num=PB;
  Turn_pb(j);
}
for(j=5;j<6;j++)
{
  PC=0xdf;
     num=PB;
  Turn_pb(j);
}      
for(j=6;j<7;j++)
{
  PC=0xbf;
     num=PB;
  Turn_pb(j);
}   
for(j=7;j<8;j++)               
{
  PC=0x7f;
     num=PB;
  Turn_pb(j);
}   
      
SendMsg();
for(j=0;j<8;j++)
    {
      buffer[j]=0;
    }   
}

使用特权

评论回复
地板
newjacket| | 2010-10-11 13:36 | 只看该作者
这不是跟你半个月前发的那个一样么……
unsigned char buffer[8];
void Sampling()
{
    unsigned char j;
    unsigned char num;
    for(j=0;j<8;j++)
    {
        PC=0xFF^(0x01<<j);    //port C output
        if(j<4)
            num=PA;   //reserve the value
        else
            num=PB;
        buffer[j]=num;  
    }
    SendMsg();
    for(j=0;j<8;j++)
        buffer[j]=0;         //clear buffer[]
}
赋值给num那一步不是必要的。
我是菜鸟,写错毋怪。:)

使用特权

评论回复
5
kusheng176|  楼主 | 2010-10-13 21:19 | 只看该作者
4# newjacket

谢谢你,我也把程序照你那样写了,你那样比我的简洁多了,谢谢你了。但是还是有这个问题:扫描第一次,理论上接收到的数值是 00 00 00 00 00 00 00 00(无数据变化),但是实际接收到的:01 00 00 00 01 00 00 10。硬件上我也换过芯片测试过,结果还是这样的。但是我只是单独测试PA或者PB的时候,结果就是对的。这个问题搞的我好烦躁的,无解。。。请问你还知道有什么原因么?

unsigned char buffer[8]={0};
void caiyang()
{
    unsigned char j;
    for(j=0;j<8;j++)
    {
        PC=0xFF ^ (0x01<<j);    //PC=0xfe,左移直到PC=0x7f
        if(j<4)
                {
            num=PA;             //扫描PA口
                Turn_pa(j);
                }
                else
                {
            num=PB;                            //扫描PB口
                Turn_pb(j);
                }
    }

        SendMsg();                                //发送buffer
        for(j=0;j<8;j++)            //buffer清0
    {
      buffer[j]=0;
    }          
}

使用特权

评论回复
6
kusheng176|  楼主 | 2010-10-13 21:20 | 只看该作者
4# newjacket

谢谢你,我也把程序照你那样写了,你那样比我的简洁多了,谢谢你了。但是还是有这个问题:扫描第一次,理论上接收到的数值是 00 00 00 00 00 00 00 00(无数据变化),但是实际接收到的:01 00 00 00 01 00 00 10。硬件上我也换过芯片测试过,结果还是这样的。但是我只是单独测试PA或者PB的时候,结果就是对的。这个问题搞的我好烦躁的,无解。。。请问你还知道有什么原因么?

unsigned char buffer[8]={0};
void caiyang()
{
    unsigned char j;
    for(j=0;j<8;j++)
    {
        PC=0xFF ^ (0x01<<j);    //PC=0xfe,左移直到PC=0x7f
        if(j<4)
                {
            num=PA;             //扫描PA口
                Turn_pa(j);
                }
                else
                {
            num=PB;                            //扫描PB口
                Turn_pb(j);
                }
    }

        SendMsg();                                //发送buffer
        for(j=0;j<8;j++)            //buffer清0
    {
      buffer[j]=0;
    }          
}

使用特权

评论回复
7
kusheng176|  楼主 | 2010-10-13 21:22 | 只看该作者
2# chunyang

请问下这个锁存是芯片内的,还是我自己要加上的?(我的硬件已经做好了的)

使用特权

评论回复
8
kusheng176|  楼主 | 2010-10-13 21:22 | 只看该作者
6# kusheng176

谢谢你,我也把程序照你那样写了,你那样比我的简洁多了,谢谢你了。但是还是有这个问题:扫描第一次,理论上接收到的数值是 00 00 00 00 00 00 00 00(无数据变化),但是实际接收到的:01 00 00 00 01 00 00 10。硬件上我也换过芯片测试过,结果还是这样的。但是我只是单独测试PA或者PB的时候,结果就是对的。这个问题搞的我好烦躁的,无解。。。请问你还知道有什么原因么?
unsigned char buffer[8]={0};
void caiyang()
{
    unsigned char j;
    for(j=0;j<8;j++)
    {
        PC=0xFF ^ (0x01<<j);    //PC=0xfe,左移直到PC=0x7f
        if(j<4)
  {
            num=PA;             //扫描PA口
         Turn_pa(j);
  }
  else
  {
            num=PB;       //扫描PB口
         Turn_pb(j);
  }
    }
SendMsg();    //发送buffer
for(j=0;j<8;j++)     //buffer清0
    {
      buffer[j]=0;
    }   
}

使用特权

评论回复
9
newjacket| | 2010-10-14 13:59 | 只看该作者
定义buffer的时候 用for循环初始化一下试试
unsigned char buffer[8];
for(j=0;j<8;j++)     //buffer清0
    {
      buffer[j]=0;
    }

使用特权

评论回复
10
kusheng176|  楼主 | 2010-10-14 16:27 | 只看该作者
9# newjacket

这样定义是一样的吧,unsigned char buffer[8]={0};
我测试的时候,发现PA口和PB口的一些端口值自己跳动

使用特权

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

本版积分规则

0

主题

64

帖子

1

粉丝