打印

两个单片机同步

[复制链接]
4300|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
21ID|  楼主 | 2010-1-30 21:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
21ID|  楼主 | 2010-1-30 21:41 | 只看该作者
RC单片机发送程序
void switch0(void)
{unsigned char n;
unsigned char tmp = 0;
tmp = status0;           
TRISB  = 0x00;
for(n=0; n<8; n++)
    {if((tmp&0x80)==0x80)
       {comm = High;
        delay_mS(2);
        comm = Low;
        delay_mS(1);
       }
     else
       {comm = High;
        delay_mS(1);
        comm = Low;
        delay_mS(2);
       }
     tmp = tmp << 1;
    }

if(key_reg == 0xff)//key_reg中为键值,0xff为没有键按下
   {comm = High;
    delay_mS(2);
    comm = Low;
    delay_mS(1);

    comm = High;
    delay_mS(2);
    comm = Low;
    delay_mS(1);
    }
else
   {comm = High;
    delay_mS(1);
    comm = Low;
    delay_mS(2);

    comm = High;
    delay_mS(1);
    comm = Low;
    delay_mS(2);
    }
comm = Low;
asm("nop");
}

4M单片机接受程序

void checkin(void)
{unsigned char tmp = 0;
unsigned char n= 0;
unsigned char Err_F =0;
ErrTime = 0;
TMR0 = 0;
while(RB2 == High)
      {asm("clrwdt");
       if(TMR0>=0xff)
         {TMR0 = 0;
          Err_F = 1;
          dog++;
         }
       if(dog >= 20)
         {dog = 0;
          Warm1_Pin=0;
                  Warm2_Pin=0;
                  Lignt_Pin=0;
                  CuiFen_Pin=0;
                  PaiQi_Pin=0;
                  Back1_Pin=0;
                  Back2_Pin=0;
         }
      }
if(Err_F == 0)
   {TMR0 = 0;
    for(n=0; n<8; n++)
       {TMR0 = 0;
        tmp = tmp<<1;
        while(TMR0 <= CheckTMR0)
             {asm("clrwdt");
             }
        if(RB2 == 1)
          {tmp |= 0x01;}
        else
          {tmp &= 0xfe;}
        TMR0 = 0;
        while(RB2 == Low)
             {asm("clrwdt");
              if(TMR0>=0xff)
                {ErrTime++;
                 if(ErrTime >=10)
                   {Err_F = 1;
          Warm1_Pin=0;
                  Warm2_Pin=0;
                  Lignt_Pin=0;
                  CuiFen_Pin=0;
                  PaiQi_Pin=0;
                  Back1_Pin=0;
                  Back2_Pin=0;
                    break;
                   }
                }
             }
        TMR0 = 0;
        while(RB2 == High)
             {asm("clrwdt");
              if(TMR0>=0xff)
                {ErrTime++;
                 if(ErrTime >=10)
                   {Err_F = 1;
          Warm1_Pin=0;
                  Warm2_Pin=0;
                  Lignt_Pin=0;
                  CuiFen_Pin=0;
                  PaiQi_Pin=0;
                  Back1_Pin=0;
                  Back2_Pin=0;
                    break;
                   }
                }
             }
       }
   }
status0 = tmp;
}

这个接受和发送程序,受温度影响,具体是用手摸到RC时,接受不正确

使用特权

评论回复
板凳
NE5532| | 2010-1-30 22:21 | 只看该作者
懒得看程序,直接说你用的什么通讯接口吧

使用特权

评论回复
地板
chunyang| | 2010-1-31 13:22 | 只看该作者
仅同步的话,若二者在一起,直接用一个本振信号即可,若不在同一线路板上,也可将本振信号经缓冲后送给另一MCU。如果是通讯中的“同步”,采用SPI、I2C等模式即可,资源不足还可用FSK或定周期变占空比法来通讯,方法很多,只是楼主应先清晰、准确、完整的描述自己的问题。

使用特权

评论回复
5
21ID|  楼主 | 2010-1-31 18:02 | 只看该作者
4# chunyang 现在的情况是两个MCU不在一块电路板上,是通讯中的同步,MCU两个都是PIC16F54。可以用什么方法同步?

使用特权

评论回复
6
ejack| | 2010-1-31 20:45 | 只看该作者
4# chunyang  现在的情况是两个MCU不在一块电路板上,是通讯中的同步,MCU两个都是PIC16F54。可以用什么方法同步?
21ID 发表于 2010-1-31 18:02


想让通讯同步就用同步通讯呗……哦也:victory:

使用特权

评论回复
7
chunyang| | 2010-1-31 22:24 | 只看该作者
前面不是已经说了么?
“用SPI…………”,非要用标准串口的话,先发一串定周期脉冲像55或AA之类,RC振荡器的MCU用定时器捕捉一下,然后校正波特率设置参数即可,自适应串口也是这么实现的。

使用特权

评论回复
8
21ID|  楼主 | 2010-2-1 11:38 | 只看该作者
前面不是已经说了么?
“用SPI…………”,非要用标准串口的话,先发一串定周期脉冲像55或AA之类,RC振荡器的MCU用定时器捕捉一下,然后校正波特率设置参数即可,自适应串口也是这么实现的。 ...
chunyang 发表于 2010-1-31 22:24
看起来我还没有描述清楚,我现在的产品是只有用2跟导线来通讯的

使用特权

评论回复
9
程序匠人| | 2010-2-1 12:18 | 只看该作者
自适应串口

春阳已经点题了

使用特权

评论回复
10
反质子| | 2010-2-1 12:40 | 只看该作者
跟不上牛人的思路啊 哈哈

使用特权

评论回复
11
xymxym| | 2010-2-1 13:06 | 只看该作者
你所用的波特率估计很高吧?否则RC与晶振误差不会差很多。如果要用RC,可以用F54内部的嘛。你所说的是单总线可以用半双工方式。通讯起始可以采用同步头方式或者0x55,0xAA等方式让从机计算bps也可。总是在软件上很容易可以实现同步。

使用特权

评论回复
12
21ID|  楼主 | 2010-2-1 13:57 | 只看该作者
有点乱了,我现在把问题重新描述一遍

现在的环境:
1,两块两路版,都用pic16f54单片机,资源很少

2,两电路板之间只用2根普通的导线连接,其中一根是用来共地的,也就是说只能用一根导线来传递信号

3,电路板A用4M晶振,电路板B用RC振荡

4,电路板B上的单片机机向A发送编码,A接受后识别是哪个按键,去执行相应的操作

问题:
RC振荡受温度影响,如用手去摸的时候A接受的是乱码。怎样让两个单片机的振荡频率一样?

使用特权

评论回复
13
chunyang| | 2010-2-1 14:11 | 只看该作者
前面已经讲的很清楚了,可以说涵盖了各种可能,单线通讯,用FSK或定周期可变占空比是最方便的同步通讯法,FSK用两个不同频率的脉冲表达0和1,不用关心这两个频率到底是多少,只要差别是预知的就可以;定周期可变占空比用不同的占空比来表达0和1,可以说是FSK的一种变形,同样不必关心周期是多少,判别占空比即可。

使用特权

评论回复
14
chunyang| | 2010-2-1 14:13 | 只看该作者
延伸:对于楼主这样的情况,利用前述方法不但可以实现同步通讯,而且还能借用这些方法校正本地RC时钟,单纯校正时钟的话,发定周期的方波即可,数据表现形式就是55或AA。

使用特权

评论回复
15
程序匠人| | 2010-2-1 16:43 | 只看该作者
纠正楼主的思维定势:两颗单片机通讯,不一定要工作频率同步。只要通讯同步就好了。解决通讯同步的方法有很多,应该从这个角度去解决你的问题

使用特权

评论回复
16
xuyaqi| | 2010-2-2 09:57 | 只看该作者
实际上楼主的问题是:电路板B上的单片机机向A发送编码,A接收后识别是哪个按键,去执行相应的操作,用手去摸B的时候A接收的是乱码。
问题是你是去摸B的哪个部位A接收的是乱码。

使用特权

评论回复
17
电子三极管| | 2010-2-2 10:22 | 只看该作者
出来买酱油的

使用特权

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

本版积分规则

157

主题

912

帖子

5

粉丝