6167|9

64

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

atmega128 485接收发送问题,无相应 但是串口两个RXD TXD端接能个接收数据 [复制链接]


#define FRAMING_ERROR (1< #define PARITY_ERROR (1< #define DATA_OVERRUN (1< #define DATA_REGISTER_EMPTY (1< #define RX_BUFFER_SIZE1 64
#define TX_BUFFER_SIZE1 64
#define RevEnble()  PORTD|=(1<<4)   //发送
#define SendEnble()  PORTD&=(~(1<<4)) //接收
#define  Mul_Address UCSR1B=UCSR1B|0x01
#define  Mul_Data    UCSR1B=UCSR1B&0xfe


char rx_buffer1[RX_BUFFER_SIZE1];
char tx_buffer1[TX_BUFFER_SIZE1];
unsigned char rx_wr_index1,rx_rd_index1,rx_counter1;
unsigned char tx_wr_index1,tx_rd_index1,tx_counter1;




/********************************************************************************
* 函数名称:usart1_rx_isr
* 功    能:
* 入口参数:
*返回值:   
* 设计者:   
* 日    期:
* 说    明:
********************************************************************************/
#pragma vector=USART1_RXC_vect
__interrupt void Usart1_Rx_ISR(void)
{
    char status,data;

    status=UCSR1A;
    data=UDR1;
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
    {
           USART0_Transmit(data);   //addtional
           
           rx_buffer1[rx_wr_index1]=data;
           if (++rx_wr_index1 == RX_BUFFER_SIZE1) rx_wr_index1=0;
           if (++rx_counter1 == RX_BUFFER_SIZE1)
            {
                 rx_counter1=0;
            }
     }
}

/********************************************************************************
* 函数名称: unsigned char Usart1ReceiveByte(void)
* 功    能: 从串口1 接收一字节函数
* 入口参数: 无
*返回值:   接收的一字节
* 设计者:   
* 日    期:
* 说    明:
********************************************************************************/

unsigned char Usart1ReceiveByte(void)
{
        char data;

      Timer1_Begin();
      while (rx_counter1==0)
      {
           if(Timer1_Flag)
            {
                Timer1_Flag=0;              
                Timer1_Stop();
                return 0xff;
            }
      }
      Timer1_Stop();
         data=rx_buffer1[rx_rd_index1];
         if (++rx_rd_index1 == RX_BUFFER_SIZE1) rx_rd_index1=0;
              
      // _CLI();
       --rx_counter1;
     //  _SEI();
    return (0x00ff&data);
}

/*********************************************************************
** 函数名称:        void Usart1_Tx_ISR(void)
** 函数功能:        多机通讯串口1 中断发送
** 入口参数:        无
** 返回值:      无
** 设计人:      
** 日 期 :
**说  明:
**********************************************************************/
#pragma vector=USART1_UDRE_vect
__interrupt void Usart1_Tx_ISR(void)
{
    if (tx_counter1>0)
       {
          BIT_LED_WORK = 0;
         --tx_counter1;
         UDR1=tx_buffer1[tx_rd_index1];
         
       if (++tx_rd_index1 == TX_BUFFER_SIZE1)
         tx_rd_index1=0;
       }
    else
      {
         BIT_LED_WORK = 1;
//         RS485_R;
         RevEnble();
      }

}
/*********************************************************************
** 函数名称:        void Uart1SendByte(char data)
** 函数功能:        多机通讯串口1 发送一字节
** 入口参数:        无
** 返回值:      无
** 设计人:      
** 日 期 :
**说  明:
**********************************************************************/
void Uart1SendByte(char data)
{
    SendEnble();   
    if(MulModeFlag==1)
      {
        Mul_Address;
        UDR1=data;
      }
    else if(MulModeFlag==0)
    {
       // RS485_S;
      
        Mul_Data;
        while (tx_counter1 == TX_BUFFER_SIZE1);
        //if (tx_counter1 || ((UCSR1A & DATA_REGISTER_EMPTY)==0))
          tx_buffer1[tx_wr_index1]=data;
           if (++tx_wr_index1 == TX_BUFFER_SIZE1) tx_wr_index1=0;
           ++tx_counter1;
          UCSR1B |= (1<     }

    _SEI();  
}

高手帮我看看,我在接收发送使能设置。  我怀疑是接收、发送使能端问题。  单独串口是能够使用的。。。。。

最新回复

问题已经解决  多谢!  详情 回复 发表于 2010-5-11 17:09
点赞 关注

回复
举报

72

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
串口初始化设置。
UCSR1A=0x00;
        UCSR1B=0xDC;
        UCSR1C=0x06;
        UBRR1H=0x00;//9600
        UBRR1L=0x5F;
        RevEnble();

从机  采用9600 N 9 1
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
具体说说现象吧,看了你的题目,还是不理解。。。
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

4
 
9600 N 9 1?
支持这种格式吗
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
将485芯片的发送接收使能端接到一起,给高低电平控制收发,要延时一段时间再收发数据!
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

6
 
发送完立刻置为接收!发送之前才置发送!
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

7
 
else
  {
  BIT_LED_WORK = 1;
  RevEnble();
  }
判断发送计数器是否为零,如果为零发送完成,置接收使能。
void Uart1SendByte(char data)
{
  SendEnble();   
在发送一字节函数,我置发送使能了啊。   
我先发送地址,之后发送数据。
我觉得逻辑没有错误,但是就是不知道问题出在哪里?   高手帮我看看代码吧。。。 十分感谢!
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

8
 
我是用示波器,查看波形,发现在发送端数据已经发送出去,发送使能也置高电平。对方也已经接收到数据。
但我测试接收使能端电平时,发现没有置低电平,一直维持到2伏电平左右。   485 A\B端都有数据。  接收中断进不去。  遇到这种情况的大侠,请多帮忙。!
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 gaowei_7743 的回复:
我是用示波器,查看波形,发现在发送端数据已经发送出去,发送使能也置高电平。对方也已经接收到数据。
但我测试接收使能端电平时,发现没有置低电平,一直维持到2伏电平左右。 485 A\B端都有数据。 接收中断进不去。 遇到这种情况的大侠,请多帮忙。!

485是检测A B 之间的差值来判断高低的,所以都有数据不一定就对了!
看看你的RXD TXD的io端口的方向有没有错!!!!
如果使用0号则PE0 置为输入,PE1置为输出 DDRE&=0XFE; DDRE|=0X02;
如果使用1号则PD2 置为输入,PD3置为输出 DDRD&=0XFB; DDRD|=0X08;


 
 
 

回复

51

帖子

0

TA的资源

一粒金砂(初级)

10
 
问题已经解决  多谢!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表