zsp06312222 发表于 2017-6-28 20:10:05

N76E003 串口中断接受程序问题

本帖最后由 zsp06312222 于 2017-6-28 20:14 编辑

新塘最新的单片机N76E003,配置好时钟串口定时器,就是接受不了DMX512通讯协议的数据。仿真能进中断。
程序如下:(欢迎大侠指点赐教)
void SerialPort0_ISR(void) interrupt 4   //4
{
   UINT8 rece_data;
    if(RI)      
    {                                       /* if reception occur */
         clr_RI;                           /* clear reception flag for next reception */                        
                          if(RB8==0)//RB8
                                {
                                        rec_ok = 1;
                                        dmx_channel = 0;
                                        Adr = Address - 1;//Address    = dmx;
                                        Point = 100;   //3ms*250
                                }
                                else
                                {
                                        if(rec_ok)//bit rec_ok;
                                        {
                                                if(Adr == 0) //uint Adr,Address;
                                                {
                                                        recbuf = SBUF;//½ÓÊÜ
                                                        dmx_channel ++;
                                                        if(dmx_channel > RECCHANNEL) //RECCHANNEL = 2;
                                                        {
                                                                rec_ok = 0;
                                                                dmx_recok = 1;//
                                                        }
                                                }
                                                elseAdr--;
                                        }
                                }

      
    }       
}


void InitialUART0_Timer1(UINT32 u32Baudrate)    //T1M = 1, SMOD = 1
{
          P05_PushPull_Mode; //P05
                P06_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit
                P07_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit
          
          TIMER1_MODE2_ENABLE;   //
/*0x70*/       
    SCON = 0x70;           //UART0 Mode1,REN=1,TI=1
    TMOD |= 0x20;            //Timer1 Mode2   
   
    set_SMOD;              //UART0 Double Rate Enable
    set_T1M;          //
    clr_BRCK;              //Serial port 0 baud rate clock source = Timer1
   
    TH1 = 256 - (1000000/u32Baudrate+1);               /*16 MHz */
   
          clr_ET1;         
          set_TR1;                 
          set_RB8;                                        //This bit is for setting the stop bit 2 high/low status
               
    set_ES;         //enable UART interrupt   
    set_EA;         //enable global interrupt   

}

zsp06312222 发表于 2017-6-30 09:34:31

都不用这个N76E003芯片呀{:dizzy:}

freshuman 发表于 2017-6-30 11:25:43

zsp06312222 发表于 2017-6-30 09:34
都不用这个N76E003芯片呀

同行,也是作灯饰上的DMX512,现在用的就是新唐003,二个月不到用了15K,很好用的,没有问题,商业行业人家是不会多指点的。

freshuman 发表于 2017-6-30 11:28:09

多看N76E003 PDF,他与标准51一些寄存器还是有一些不一样的。

zsp06312222 发表于 2017-7-3 15:08:58

freshuman 发表于 2017-6-30 11:28
多看N76E003 PDF,他与标准51一些寄存器还是有一些不一样的。

都想放弃这个单片机了,看到你的回答又去看了下PDF,遇到2个问题:
1:用内部的高速时钟16MHZ,配置的250000波特率达不到,控制没放应,不知大侠怎么配置的;那个SM2位要置1处理还是0;
2:配置后,控制的灯一直亮,仿真接受到错误的数据。

zsp06312222 发表于 2017-7-3 15:35:47

freshuman 发表于 2017-6-30 11:28
多看N76E003 PDF,他与标准51一些寄存器还是有一些不一样的。

不知道我的配置有问题没:串口0模式3    定时器1模式2
void InitialUART0_Timer1(UINT32 u32Baudrate)    //SMOD = 1
{
          P05_PushPull_Mode; //P05   ÍÆÍìÊä³öTR
                P06_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit
                P07_Quasi_Mode;                //Setting UART pin as Quasi mode for transmit
       
    clr_UART0PX;   //clr_UART0PX AUXR1   &= ~SET_BIT2
          P06=1;P07=1;   //
          TIMER1_MODE2_ENABLE;   //

                clr_SMOD0;      //
    SCON = 0xF0;           //UART0 Mode1,REN=1,TI=1//SCON = 0xD0; //0x50
    TMOD|= 0x20;            //Timer1 Mode2   //
   
//    set_SMOD;              //UART0 Double Rate Enable//
          clr_SMOD;

    set_T1M;          //
    clr_BRCK;              //Serial port 0 baud rate clock source = Timer1//´®¿Ú0²¨ÌØÂÊʱÖÓԴΪ¶¨Ê±Æ÷1
   
    TH1 = 256 - (1000000/u32Baudrate+1);               /*16 MHz */

          clr_ET1;          //¹Ø±ÕTimer1ÖжÏ
          set_TR1;          //ʹÄܶ¨Ê±Æ÷1TCON
       
          set_RB8;                                        //This bit is for setting the stop bit 2 high/low status, //ÉèÖýÓÊܵĵھÅλÊý¾Ý =1; //SCON               
    set_ES;         //enable UART interrupt   //
    set_EA;         //enable global interrupt   //

}

freshuman 发表于 2017-7-4 01:04:10

zsp06312222 发表于 2017-7-3 15:08
都想放弃这个单片机了,看到你的回答又去看了下PDF,遇到2个问题:
1:用内部的高速时钟16MHZ,配置的2500 ...

内部16M时钟,串口250K错错有余。

freshuman 发表于 2017-7-4 01:07:18

zsp06312222 发表于 2017-7-3 15:35
不知道我的配置有问题没:串口0模式3    定时器1模式2
void InitialUART0_Timer1(UINT32 u32Baudrate)   ...

你有没有用别的51,如STC单片机作过同样的DMX512接收,如果成功了,配置都是一样的。

zsp06312222 发表于 2017-7-4 09:34:44

本帖最后由 zsp06312222 于 2017-7-4 10:39 编辑

freshuman 发表于 2017-7-4 01:04
内部16M时钟,串口250K错错有余。

我用示波器测试时波特率达到250000时发送,实测数据是4.96us;没用过51单片机的,用过STM32。

zsp06312222 发表于 2017-7-4 19:46:48

freshuman 发表于 2017-7-4 01:07
你有没有用别的51,如STC单片机作过同样的DMX512接收,如果成功了,配置都是一样的。 ...

单片机的串口能接收到波形,就是控制灯不亮,不知道是不是我的接受函数出错了。通过判断RB8位的。如上程序

freshuman 发表于 2017-7-4 19:57:57

zsp06312222 发表于 2017-7-4 19:46
单片机的串口能接收到波形,就是控制灯不亮,不知道是不是我的接受函数出错了。通过判断RB8位的。如上程 ...

sTM32上都能通过DMX512,51按理更简单才是哦!说句实话,你上面的DMX512接收程写得太低级了哦。

freshuman 发表于 2017-7-4 19:59:13

zsp06312222 发表于 2017-7-4 19:46
单片机的串口能接收到波形,就是控制灯不亮,不知道是不是我的接受函数出错了。通过判断RB8位的。如上程 ...

串口波特率设置有问题。

freshuman 发表于 2017-7-4 20:04:24

zsp06312222 发表于 2017-7-4 09:34
我用示波器测试时波特率达到250000时发送,实测数据是4.96us;没用过51单片机的,用过STM32。 ...

N76E003接收DMX512串口250K 绝对没有问题的。

freshuman 发表于 2017-7-4 20:08:04

zsp06312222 发表于 2017-6-30 09:34
都不用这个N76E003芯片呀

你野是抚丢的?

zsp06312222 发表于 2017-7-5 08:27:21

freshuman 发表于 2017-7-4 20:08
你野是抚丢的?

是呀,抚丢的

zsp06312222 发表于 2017-7-5 09:43:01

本帖最后由 zsp06312222 于 2017-7-5 17:46 编辑

freshuman 发表于 2017-7-4 20:08
你野是抚丢的?

公司的大神指导下我了,搞定了,能通讯了

90999 发表于 2017-7-5 13:43:50

串口正常收发没?仿真信不过的。

zsp06312222 发表于 2017-7-5 17:53:25

90999 发表于 2017-7-5 13:43
串口正常收发没?仿真信不过的。

仿真还是能发现自己的错误的

zsp06312222 发表于 2017-7-6 11:55:30

freshuman 发表于 2017-7-4 20:08
你野是抚丢的?

今天尝试了测试串口中断和定时器中断,却只能识别其中一个中断,关闭其中一个中断另一个就能正常工作,配置了中断优先级的,不知道什么原因。

one_for_good 发表于 2017-9-4 16:15:15

楼主,怎么解决的?能贴部分代码看看吗?

zhbc 发表于 2018-1-22 16:20:04

freshuman 发表于 2017-7-4 20:04
N76E003接收DMX512串口250K 绝对没有问题的。

内部16M晶振误差如何?DMX512 250K的波特率,会不会因为时钟精度不够导致丢数据?

freshuman 发表于 2018-1-26 10:36:48

zhbc 发表于 2018-1-22 16:20
内部16M晶振误差如何?DMX512 250K的波特率,会不会因为时钟精度不够导致丢数据? ...

误差较同期同行其它品牌的还是有一点大,串口接收允许有3%误差,所以没有什么问题。
页: [1]
查看完整版本: N76E003 串口中断接受程序问题