打印

DMX512问题

[复制链接]
5825|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Dillheng|  楼主 | 2013-12-6 11:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  最近在弄DMX512协议,用单片机串口通讯,Boss说模拟DMX512协议里面要求的波形跟持续时间,波形模拟出来了,但是时间对不上,求各位前辈指教下!
还有就是,单片机串口发送数据,有没有默认的起始位跟停止位,有的话是什么,能不能给个资料!
小弟先谢谢各位前辈了!

相关帖子

沙发
hopewise| | 2013-12-6 11:58 | 只看该作者
//*****************UART中断子函数********************
//***************************************************
void uart_int0(void) interrupt 4
{   
          if(f_dmx==1)                                                 //如果是dmx模式,则执行下面内容
          {
             uchar iv;
             databuff=SBUF;
             RI=0;
             if(RB8==0)                                       
             {
                    CHK_SIGN=0;                  //清接允许接收数据标志位   
                    if(databuff==0)              //接收到的数据为0时,说明接收到起始信号
                        {
                               DMX_SIGN=0;           //允许接收起始代码(低电平有效)
                               ADDR_CON=0;           //地址位记数器复位
                               RECDAT=0;             //数据接收个数控制 起始后清零
                               return;                            
                         }
                         else                        //没有接收到起始信号,则
                         {
                               DMX_SIGN=1;           //暂停接收起始代码
                               return;
                         }
                  }
              else
              {
                        if(CHK_SIGN==0)                          
                        {
                               if(DMX_SIGN==0)
                               {
                                         DMX_SIGN=1;
                                         if(databuff==0)                                
                                         {
                                               CHK_SIGN=1;                                     //收到起始代码  CHK_SIGN=1表示可以接受下面的数据
                                               return;
                                         }
                                   }
                                   return;                                                     //没有接收到起始代码
                            }
                    if(CHK_SIGN==1)                                                                                                            //收到起始代码后,则
                        {
                                   ADDR_CON++;                                                  //地址计数器加1
                                   if(ADDR_CON>=address)                                        //判断当前地址号计数器是否属于本机地址
                                   {
                                          Dmxdata_temp[RECDAT]=SBUF;                            //接收数据
                                          RECDAT++;                                             //准备接收下一个数据
                                          if(RECDAT>=7)      
                                          {
                                                 CHK_SIGN=0;                                    //接收完毕暂停,等待下一个启动信号                                       
                                                 iv=0;
                                                 for(iv=0;iv<7;iv++)                                                         //iv的大小限制了后面的非本地址的内容无效
                                         {
                                               if(Dmxdata[iv]!=Dmxdata_temp[iv])             //把接收到的所有DMX数据copy给数组Dmxdata[iv]
                                                                           {
                                                                                 Dmxdata[iv]=Dmxdata_temp[iv];
                                                                                     f_dmx_update=1;                     //DMX数据更新标志位
                                                                           }
                                             }
                                           }

                                     }
                                    return;

                             }

                      }

           }
           else
           {
                      if((f_dimming==1)|(f_change==1)|(f_fade==1)|(f_sound==1))          
                          {
                               RI=0;
                                   return;                               //要是调光或者彩变或者渐变或者声控的话,则不接受
                          }          
                      else  receive_data_from_master();             //本机处于从功能模式,则接收主机的内容(注:不是DMX512控制台内容)       

           }

}

使用特权

评论回复
板凳
hopewise| | 2013-12-6 11:59 | 只看该作者
//******发送DMX数据(主机发送,从机接收)*********
//*********************************************
void SendBytes(void)
{

           SCON=0xC0;                                        //串口UART工作于方式3(即9位UART),TB8=0,并禁止串行接收.
           PCON=0;
       SBUF=0xff;                                       
       while(!TI){;}                //要是TI=0,则等待
       TI=0;
       SCON=0xD8;                                    //串口UART工作于方式3(即9位UART),TB8=1
       SBUF=0xff;                                        //发送OXFF(起始码)
       while(!TI){;}
       TI=0;
       SBUF=tab01_master_to_slave[0];
       while(!TI) {;}
       TI=0;
       SBUF=tab01_master_to_slave[1];
       while(!TI){;}
       TI=0;
       SBUF=tab01_master_to_slave[2];
       while(!TI){;}
       TI=0;
       SBUF=tab01_master_to_slave[3];
       while(!TI) {;}
       TI=0;
       SBUF=tab01_master_to_slave[4];
       while(!TI){;}
       TI=0;
       SBUF=tab01_master_to_slave[5];
       while(!TI){;}
       TI=0;
       SBUF=tab01_master_to_slave[6];
       while(!TI){;}
       TI=0;
           SBUF=tab01_master_to_slave[7];
       while(!TI){;}
       TI=0;
           SCON=0xD0;                         //发送内容后,允许uart串行接收产生中断
           //PCON=PCON&0x7f;
}
//**********从机接收来自主机的DMX数据*********&
//*********************************************
void  receive_data_from_master()
{
        databuff=SBUF;
        RI=0;
        if(RB8==0)                                                   //RB=0,SBUF=0;启动信号
        {
                   CHK_SIGN=0;                                       //清接允许接收数据标志位  
                   if(databuff==0xff)                                //接收到的数据为0xff时,说明接收到起始信号
                       {
                                DMX_SIGN=0;                              //允许接收起始代码
                                RECDAT=0;                                //数据接收个数控制 起始后清零
                                return;                                         //收到起始代码返回
                       }
                       else                                              //没有接收到起始信号,则
                       {
                               DMX_SIGN=1;                               //暂停接收起始代码
                               return;
                      }
             }
       else
       {
                      if(CHK_SIGN==0)                        
                      {
                               if(DMX_SIGN==0)
                               {
                                            DMX_SIGN=1;
                                            if(databuff==0xff)               //判断是否为起始代码(0xff)
                                            {
                                                    CHK_SIGN=1;              //收到起始代码  CHK_SIGN=1表示可以接受下面的数据
                                                     return;
                                            }
                                   }
                                   return;                                   //没有接收到起始代码退出中断
                          }
                  if(CHK_SIGN==1)
                      {
                                   tab02_slave_from_master[RECDAT]=SBUF;     //接收数据
                                   RECDAT++;                                 //准备接收下一个数据
                                   if(RECDAT>=8)                  
                                   {
                                            CHK_SIGN=0;                       //接收完毕暂停,等待下一个启动信号
                                                                        //if(tab02_slave_from_master[7]==2)   PWM_init();
                                            return;
                                   }
                         }
           }
}

使用特权

评论回复
地板
hopewise| | 2013-12-6 12:00 | 只看该作者
24MHZ

使用特权

评论回复
5
hopewise| | 2013-12-6 12:01 | 只看该作者
AUXR=0X40;                                                          //定时器0和UART都采用传统的12分频,不用1T功能,T1工作在1T模式*12   
        CLK_DIV=0;                                          //外接24MHZ晶振,不用分频
        TMOD = 0x22;                                      //T0,T1方式2:8位自动装载
        TH0 = 0x06;                                              //T0:(256-6)*1/2us=125us中断一次
    TL0= 6;
        IE |= 0x82;                                              //10000010:EA&T0
        TL1=0xFD;                                                                  //波特率20833*12=250K,加倍是0XFA.
        TH1=0xFD;
        SCON=0xD0;                                //UART工作于方式3  波特率为(1+SMOD)·(定时器1的溢出率)/32  REN=1接收允许
        PCON=0x0;                                 //不倍频,晶振24M

        PS=1;                                     //设置串口中断为最高优先级
    ES=1;                                     //开UART中断
        EA=1;                                     //打开总中断开关
        ET0=1;                                    //允许定时器0中断
        TR0=1;
        ET1=0;                                    //上电禁止定时器1中断
        TR1=0;                                                                          //关闭定时器1
        SN75176_en=1;                                                          //上电时关闭DMX通信功能

使用特权

评论回复
6
Dillheng|  楼主 | 2013-12-6 12:36 | 只看该作者
串口通讯得用中断么?

使用特权

评论回复
7
lisparking| | 2013-12-6 13:58 | 只看该作者
你用的是什么MCU。有什么问题可以加QQ22113314

使用特权

评论回复
8
hopewise| | 2013-12-6 14:27 | 只看该作者
STC12C5616AD

使用特权

评论回复
9
hopewise| | 2013-12-6 14:28 | 只看该作者
我的定时125us中断是整个系统用的,这个以前写的

使用特权

评论回复
10
Dillheng|  楼主 | 2013-12-6 14:45 | 只看该作者
我现在用的是STC15F408AD的单片机,然后测试出的波形都是1s左右,每一个最小字节的电平持续时间只能降到440us,请问怎么将时间缩短到DMX512要求的时间内?

使用特权

评论回复
11
dirtwillfly| | 2013-12-6 16:43 | 只看该作者
串口用中断更方便,更容易实现时序

使用特权

评论回复
12
eydj2008| | 2013-12-6 17:24 | 只看该作者
原理 基本上是这样的  不过发送程序不够优化 占CPU资源过多

使用特权

评论回复
13
Leeone| | 2013-12-6 20:42 | 只看该作者
直接搞个512的控制器就得了,还自己写不稳定吧

使用特权

评论回复
14
utopiaworld| | 2013-12-6 22:18 | 只看该作者
还是fpga好用 ,哈哈

使用特权

评论回复
15
Dillheng|  楼主 | 2013-12-9 10:06 | 只看该作者
Leeone 发表于 2013-12-6 20:42
直接搞个512的控制器就得了,还自己写不稳定吧

我现在的状况是boss指哪我打哪,前辈!我的想法只是参考!

使用特权

评论回复
16
Dillheng|  楼主 | 2013-12-9 10:09 | 只看该作者
现在是我想按照DMX512系统规定的时间设计指令,可是时间偏差有点大,用的是11.0592的晶振!请各位前辈指导下,如何按资料的要求计算硬件参数?
跪求资料!

使用特权

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

本版积分规则

26

主题

85

帖子

0

粉丝