请选择 进入手机版 | 继续访问电脑版
搜索
查看: 252|回复: 1

mega128 485通讯,无论数据帧还是地址帧,RXB8 位始终是0

[复制链接]
发表于 2018-4-18 17:54:33 | 显示全部楼层 |阅读模式
本帖最后由 小猫-2016240 于 2018-4-19 10:29 编辑

求助各位大侠,我在mega128 485通讯时,无论主机发送的是数据帧还是地址帧,从机接收到的RXB8 位始终是0,也就是从机读到的始终是数据帧,这个怎么解决
ICCAVR
主机程序
/*********************************包含头文件********************************/
#include<iom128v.h>
#include<macros.h>

/***********************************宏定义**********************************/
#define fosc 8000000 //晶振8MHZ
#define baud 9600         //波特率
#define RXC_BUFF_SIZE 64   //接受缓冲区字节数
#define TXC_BUFF_SIZE 64   //发送缓冲区字节数

#define LED_ON PORTC &= ~BIT(3);
#define LED_OFF PORTC |=  BIT(3);

unsigned char temp0;

unsigned char RXC_BUFF1[RXC_BUFF_SIZE];   //定义接受缓冲区
unsigned char TXC_BUFF1[TXC_BUFF_SIZE];   //定义发送缓冲区
unsigned char RXC_RD1;   //接受缓冲区读指针
unsigned char RXC_WR1;   //接受缓冲区写指针
unsigned char TXC_RD1;   //发送缓冲区读指针
unsigned char TXC_WR1;   //发送缓冲区写指针

//RS232
unsigned char RXC_BUFF0[RXC_BUFF_SIZE];   //定义接收缓冲区
unsigned char TXC_BUFF0[TXC_BUFF_SIZE];   //定义发送缓冲区
unsigned char RXC_RD0;   //接收缓冲区读指针
unsigned char RXC_WR0;   //接收缓冲区写指针
unsigned char TXC_RD0;   //发送缓冲区读指针
unsigned char TXC_WR0;   //发送缓冲区写指针
unsigned char tab_ctl[16];//单条指令数组
unsigned char tab_ctl_WR;//单条指令写指针
unsigned char tab_ctl_RD;//单条指令读指针
//unsigned char local;

/********延时函数********/
void delay_us(unsigned int microsecond)
{      
    do
        {
        microsecond--;
        }         
    while (microsecond>1);
}

void delay_ms(unsigned int millisecond)
{      
    while (millisecond--)
        {
        delay_us(999);
        }  
}

/*********串口初始化*************/
/****************************************************************************
函数功能:uart0初始化程序
入口参数:
出口参数:
****************************************************************************/
void uart0_init(void)  //初始化COM0
{
UCSR0B = 0x00;
UCSR0A = 0x00;
UCSR0C =(1<<UCSZ01)|(1<<UCSZ00);//8bit+1bit stop
UBRR0L=((fosc/16/baud)-1)%256;
UBRR0H=((fosc/16/baud)-1)/256;
UCSR0B =(1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
}

void putchar0(unsigned char c)
        {         
     TXC_BUFF0[TXC_WR0]=c;
         if(TXC_WR0<(TXC_BUFF_SIZE-1))   //TXC_BUFF_SIZE  发送区数据大小
            TXC_WR0++;
         else  
            TXC_WR0=0;
         UCSR0B|=(1<<UDRIE0);          //开启UDRE中断
        }
        #pragma interrupt_handler uart0_udre_isr:iv_USART0_UDRE   
void uart0_udre_isr(void)
{
         UDR0=TXC_BUFF0[TXC_RD0];
         if(TXC_RD0<(TXC_BUFF_SIZE-1))
                 TXC_RD0++;
         else
                 TXC_RD0=0;
         if(TXC_RD0==TXC_WR0)   //读指针==写指针,停止中断
                 UCSR0B&=~(1<<UDRIE0);
}
/****************************************************************************
函数功能:uart1初始化程序
入口参数:
出口参数:
****************************************************************************/
void uart1_init(void)  //初始化COM0
{
UCSR1B = 0x00;
UCSR1A = 0x00;
UCSR1C =(1<<UCSZ11)|(1<<UCSZ10);//8bit+1bit stop
UCSR1B =(1<<UCSZ12);  //9个数据位
UBRR1L=((fosc/16/baud)-1)%256;
UBRR1H=((fosc/16/baud)-1)/256;
UCSR1B =(1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1);
UCSR1A |= BIT(0);
DDRD &=~(BIT(2)|BIT(3));
PORTD &=~(BIT(2)|BIT(3));
}

/****************************************************************************
函数功能:uart0发送单字节数据
入口参数:c
出口参数:
****************************************************************************/
void putchar1(unsigned char c)
        {         
     TXC_BUFF1[TXC_WR1]=c;
   LED_ON;
         if(TXC_WR1<(TXC_BUFF_SIZE-1))   //TXC_BUFF_SIZE  发送区数据大小
            TXC_WR1++;
         else  
            TXC_WR1=0;
         UCSR1B|=(1<<UDRIE1);          //开启UDRE中断
        }
       
/****************************************************************************
函数功能:初始化单片机
入口参数:
出口参数:
****************************************************************************/
void init_devices(void)   
{
CLI(); //关闭所有中断
XDIV  = 0x00; //分频关闭
XMCRA = 0x00; //外部寄存器清零
MCUCR = 0x00; //电源管理
EICRA = 0x00; //外部中断INT0~INT3 关闭 电平中断控制
EICRB = 0x00; //外部中断INT4~INT7 关闭 电平中断控制
EIMSK = 0x00; //外部中断INT0~INT7屏蔽器
TIMSK = 0x00; //定时器中断屏蔽器 关闭
ETIMSK = 0x00; //扩展定时中断屏蔽器
DDRE |= BIT(0)|BIT(1);
DDRD |= BIT(4);
DDRC |=BIT(3);
RXC_RD1=0;   //接受缓冲区读指针
RXC_WR1=0 ;   //接受缓冲区写指针
TXC_RD1= 0;   //发送缓冲区读指针
TXC_WR1=0 ;   //发送缓冲区写指针
}

/****************************************************************************
函数功能:uart0接收中断
入口参数:
出口参数:
****************************************************************************/       
#pragma interrupt_handler uart1_rx_isr:iv_USART1_RXC   
void uart1_rx_isr(void)
{      
        RXC_BUFF1[RXC_WR1]=UDR1;
        if(RXC_WR1<(RXC_BUFF_SIZE-1))
                RXC_WR1++;
        else
                RXC_WR1=0;
}

/****************************************************************************
函数功能:uart0数据寄存器空中断
入口参数:
出口参数:
****************************************************************************/
#pragma interrupt_handler uart1_udre_isr:iv_USART1_UDRE   
void uart1_udre_isr(void)
{         
UCSR1B &= ~BIT(0); //发送位TXB8置0
UDR1=TXC_BUFF1[TXC_RD1];
         if(TXC_RD1<(TXC_BUFF_SIZE-1))
                 TXC_RD1++;
         else
                 TXC_RD1=0;
UCSR1B&=~(1<<UDRIE1);
}

void main(void)
{

  init_devices();
  DDRD |=BIT(4);
  PORTD |=BIT(4);
    uart0_init();
  uart1_init();
  SEI();
  while(1)
  {
  //UCSR1B |= BIT(0);//地址帧
  delay_ms(10);
  putchar1(0XAA);
  delay_ms(20);

   //UCSR1B &= ~BIT(0);//地址帧
  putchar1(0XBB);
  delay_ms(800);
  }
}


从机程序
/*********************************包含头文件********************************/
#include<iom128v.h>
#include<macros.h>

/***********************************宏定义**********************************/
#define fosc 8000000 //晶振8MHZ
#define baud 9600         //波特率
#define RXC_BUFF_SIZE 64   //接受缓冲区字节数
#define TXC_BUFF_SIZE 64   //发送缓冲区字节数

#define LED_ON PORTC &= ~BIT(3);
#define LED_OFF PORTC |=  BIT(3);

unsigned char RXC_BUFF[RXC_BUFF_SIZE];   //定义接受缓冲区
unsigned char TXC_BUFF[TXC_BUFF_SIZE];   //定义发送缓冲区
unsigned char RXC_RD;   //接受缓冲区读指针
unsigned char RXC_WR;   //接受缓冲区写指针
unsigned char TXC_RD;   //发送缓冲区读指针
unsigned char TXC_WR;   //发送缓冲区写指针
//unsigned char local;


unsigned char RXC_BUFF0[RXC_BUFF_SIZE];   //定义接收缓冲区
unsigned char TXC_BUFF0[TXC_BUFF_SIZE];   //定义发送缓冲区
unsigned char RXC_RD0;   //接收缓冲区读指针
unsigned char RXC_WR0;   //接收缓冲区写指针
unsigned char TXC_RD0;   //发送缓冲区读指针
unsigned char TXC_WR0;   //发送缓冲区写指针
unsigned char tab_ctl[16];//单条指令数组
unsigned char tab_ctl_WR;//单条指令写指针
unsigned char tab_ctl_RD;//单条指令读指针
unsigned char t0=0,t1=0,t2=0,t3=0;
unsigned temp;
//unsigned char local;

/********延时函数********/
void delay_us(unsigned int microsecond)
{      
    do
        {
        microsecond--;
        }         
    while (microsecond>1);
}

void delay_ms(unsigned int millisecond)
{      
    while (millisecond--)
        {
        delay_us(999);
        }  
}

/*********串口初始化*************/


/****************************************************************************
函数功能:uart0初始化程序
入口参数:
出口参数:
****************************************************************************/
void uart0_init(void)  //初始化COM0
{
UCSR0B = 0x00;
UCSR0A = 0x00;
UCSR0C =(1<<UCSZ01)|(1<<UCSZ00);//8bit+1bit stop
UBRR0L=((fosc/16/baud)-1)%256;
UBRR0H=((fosc/16/baud)-1)/256;
UCSR0B =(1<<RXEN0)|(1<<TXEN0)|(1<<RXCIE0);
}

void putchar0(unsigned char c)
        {         
     TXC_BUFF0[TXC_WR0]=c;
         if(TXC_WR0<(TXC_BUFF_SIZE-1))   //TXC_BUFF_SIZE  发送区数据大小
            TXC_WR0++;
         else  
            TXC_WR0=0;
         UCSR0B|=(1<<UDRIE0);          //开启UDRE中断
        }
        #pragma interrupt_handler uart0_udre_isr:iv_USART0_UDRE   
void uart0_udre_isr(void)
{
         UDR0=TXC_BUFF0[TXC_RD0];
         if(TXC_RD0<(TXC_BUFF_SIZE-1))
                 TXC_RD0++;
         else
                 TXC_RD0=0;
         if(TXC_RD0==TXC_WR0)   //读指针==写指针,停止中断
                 UCSR0B&=~(1<<UDRIE0);
}
/****************************************************************************
函数功能:uart1初始化程序
入口参数:
出口参数:
****************************************************************************/
void uart1_init(void)  //初始化COM0
{
UCSR1B = 0x00;
UCSR1A = 0x00;
UCSR1C =(1<<UCSZ11)|(1<<UCSZ10);//8bit+1bit stop
UCSR1B =(1<<UCSZ12);  //9个数据位
UBRR1L=((fosc/16/baud)-1)%256;
UBRR1H=((fosc/16/baud)-1)/256;
UCSR1B =(1<<RXEN1)|(1<<TXEN1)|(1<<RXCIE1);
UCSR1A |= BIT(0);  //多机模式,只能读取地址帧
}

/****************************************************************************
函数功能:uart0发送单字节数据
入口参数:c
出口参数:
****************************************************************************/
void putchar(unsigned char c)
        {         
     TXC_BUFF[TXC_WR]=c;
         
   LED_ON;
         if(TXC_WR<(TXC_BUFF_SIZE-1))   //TXC_BUFF_SIZE  发送区数据大小
            TXC_WR++;
         else  
            TXC_WR=0;
         UCSR1B|=(1<<UDRIE1);          //开启UDRE中断
        }
       
/****************************************************************************
函数功能:初始化单片机
入口参数:
出口参数:
****************************************************************************/
void init_devices(void)   
{
CLI(); //关闭所有中断
XDIV  = 0x00; //分频关闭
XMCRA = 0x00; //外部寄存器清零
MCUCR = 0x00; //电源管理
EICRA = 0x00; //外部中断INT0~INT3 关闭 电平中断控制
EICRB = 0x00; //外部中断INT4~INT7 关闭 电平中断控制
EIMSK = 0x00; //外部中断INT0~INT7屏蔽器
TIMSK = 0x00; //定时器中断屏蔽器 关闭
ETIMSK = 0x00; //扩展定时中断屏蔽器
DDRE |= BIT(0)|BIT(1);
DDRD |= BIT(4);
DDRD &=~(BIT(2)|BIT(3));
PORTD &=~(BIT(2)|BIT(3));
DDRC |=BIT(3);
RXC_RD=0;   //接受缓冲区读指针
RXC_WR=0 ;   //接受缓冲区写指针
TXC_RD= 0;   //发送缓冲区读指针
TXC_WR=0 ;   //发送缓冲区写指针
}

/****************************************************************************
函数功能:uart0接收中断
入口参数:
出口参数:
****************************************************************************/       
#pragma interrupt_handler uart1_rx_isr:iv_USART1_RXC   
void uart1_rx_isr(void)
{   
delay_ms(1);
t0=UCSR1B;
delay_ms(1);
putchar0(t0);
putchar0(UCSR1B);
putchar0(UCSR1A);
putchar0(UDR1);
putchar0(UCSR1A);
putchar0(0XFF);
}

/****************************************************************************
函数功能:uart0数据寄存器空中断
入口参数:
出口参数:
****************************************************************************/
#pragma interrupt_handler uart1_udre_isr:iv_USART1_UDRE   
void uart1_udre_isr(void)
{         

         //UCSR1B |= BIT(0);  //发送地址帧
         UCSR1B &= ~BIT(0);
         
         UDR1=TXC_BUFF[TXC_RD];
         PORTE &= ~BIT(0);
         delay_ms(100);
         PORTE |=BIT(0);
         if(TXC_RD<(TXC_BUFF_SIZE-1))
                 TXC_RD++;
         else
                 TXC_RD=0;
               
         if(TXC_RD==TXC_WR)   //读指针==写指针,停止中断
                         UCSR1B&=~(1<<UDRIE1);
}

void main(void)
{
PORTD &=~BIT(4);
  init_devices();
  uart1_init();
uart0_init();
  SEI();
  while(1)
  {
  }
}


uart0  用于回馈 监测的UCSR1B的数据,实际测量的RXB8  一直是0  ,按说从机MPCM位是1时,是不会收到数据帧的,但是他能,
回复

使用道具 举报

发表于 2018-4-25 14:25:20 | 显示全部楼层
你用ICCAVR 配置下软件看,老的avr 用这个很方便的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /5 下一条

facebook google plus twitter linkedin youku weibo rss
©2018 Microchip Corporation

小黑屋|手机版|Archiver|Microchip技术社区

GMT+8, 2018-10-23 00:11 , Processed in 0.042488 second(s), 7 queries , MemCache On.

快速回复 返回顶部 返回列表