打印
[AVR单片机]

ATMEGA1280的RS485遇到难题了

[复制链接]
1084|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huangjie032414|  楼主 | 2015-3-31 10:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通信是通了  但是上位机收到的数据不对  用的是USART1  方向控制是PD1  485芯片是MAX485  中间的隔离光耦已经去掉   就单片机和485芯片直连  软件是这样的
#include <iom1280v.h>
#include <macros.h>
void IO_init(void)
{
  DDRA =0X00;
  PORTA=0XFF;
  DDRB =0XFF;
  PORTB=0XFF;
  DDRC =0X00;
  PORTC=0XFF;
  DDRD|=0X0A;
  DDRD&=0XFB;      //RXD输入,TXD输出
  PORTD=0XFF;
  
}


void Usart_init(void)
{
  //UCSRA=0X02;  //倍速选择
  UCSR1B=(1<<RXEN1)|(1<<TXEN1);  //使能接收,发送
  UCSR1C=(1<<UCSZ11)|(1<<UCSZ10);//8bit,异步,无奇偶校验,1个停止位
  UBRR1L=71; //9600波特率                                                                                                                                           
  UBRR1H=0;
}

void Usart_Transmit(unsigned char i)
{
  while(!(UCSR1A&(1<<UDRE1)));  //判断UDR是否为空
  UDR1=i;                      //发送数据
}

unsigned char Usart_Receive(void)    //定义返回值类型,否则出错
{
  while(!(UCSR1A&(1<<RXC1)));  //判断是否有数据未读出
  return UDR1;                //获取并返回接收数据
}
void main(void)
{
  unsigned char temp;
  IO_init();
  Usart_init();
  DDRD|=0X02;
  PORTD&=0XFD;   
        temp=Usart_Receive();  //接收来自PC的数据
       
         PORTD|=0X02;
       
        Usart_Transmit(temp);  //将收到的数据发回PC
}


上位机就用的那种串口调试助手
上位机发送数据 但接受到的数据不对
发送 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
接受 77 3B 76 1D 75 3A 74 0E 73 39 72 1C 71 38 70

问问高手们问题出在哪里  手上没有示波器 没法看

相关帖子

沙发
my8804| | 2015-3-31 17:16 | 只看该作者
波特率对不对? 设置跟fos是否匹配?
可以先调试uart单元

使用特权

评论回复
板凳
war3mars| | 2015-4-1 14:09 | 只看该作者
//**************************************************************************************
//中断发中断收     11.0592     19200    熔丝位至少是高速 1K的
//****************************************************************************************
#include <iom128v.h>
#include <macros.h>
#include <string.h>


#define uchar unsigned char      //定义无符号字符为 uchar
#define uint  unsigned int       //定义无符号整型
#define Crystal 11059200   //晶振
#define Baud 19200        //波特率



volatile uchar data_temp;
//volatile uchar data=';';//‘;’="59"号的ASCII码



//函数声明
void port_init(void);
void uart0_init(void);
void init_devices(void);
void usart0_char_send(uchar i);
void usart0_str_send(char *s);
void usart0_str_sendArray(uchar *p,uchar len);



//****************发送一个字符******************************
void usart0_char_send(uchar i)
{
while(!(UCSR0A&(1<<UDRE0)));
UDR0=i;
}
//******************发送一个字符串*************************
void usart0_str_send(char *s)
{
while(*s)
{
usart0_char_send(*s);
s++;
}
}
//*********************发送一个字符串**********************
void usart0_str_sendArray(uchar *p,uchar len)
{
  uchar i;
  for(i=0;i<len;i++)  //控制字符个数
  {
    usart0_char_send(*p);
    p++;
  }
}




//******************端口初始化*******************************
void port_init(void)
{
  
PORTE = 0xFF;   //设置RXD0和TXD0
DDRE  = 0x02;

}
//*****************串口初始化*********************************
void usart0_init(void)
{
UCSR0B = 0x00;                     //禁止发送和接收
UCSR0A = 0x02;                     //倍速异步模式U2X0=1
UCSR0C = 0x06;                     //0000 0110,UCSZ01=1,UCSZ00=1;8位字符,1位停止位
UBRR0L=(Crystal/8/Baud-1)%256;   //若为正常异步模式U2X0=0则位(Crystal/16/(Baud+1))%256
UBRR0H=(Crystal/8/Baud-1)/256;   //参见ATMAGE128使用手册(Crystal/8/(Baud+1))/256;
UCSR0B=0xD8 ;        //允许发送和接收,接收和发送结束中断使能
}
//******************初始器件**************************************
void init_devices(void)
{
port_init();
usart0_init();
}
//****************中断接收服务处理子程序*******************************
#pragma interrupt_handler usart0_RX_interrupt:iv_USART0_RX  //  19
void usart0_RX_interrupt(void)
{
        UCSR0B=0x00;                         //禁止发送和接收
        data_temp = UDR0;                    //从数据缓冲器中接收数据
           UCSR0B=0xD8 ;                        //允许发送和接收,接收和发送结束中断使能 1101 1000
// if(data_temp=='0') //如果接收到的字符为'0'
  //  UDR0 = data;             //将数据data放入缓冲器,发送数据
//else
    UDR0=data_temp;       //否则将接收到的数据返回

}  

//*********************中断发送服务处理子程序**************************
#pragma interrupt_handler usart0_TX_interrupt:iv_USART0_TX  //  21
void usart0_TX_interrupt(void)
{
  _NOP();
UCSR0A |= (1<<6);                      //发送结束清零

}  
//*******************主程序****************************
void  main(void)
{
   uchar i=0;
  CLI();                         //总中断禁止         
  init_devices();
  SEI();                              //总中断允许
    while(1)                          //循环等待中断处理
     {

     }                                    
}     

我这是可以用的

使用特权

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

本版积分规则

13

主题

55

帖子

0

粉丝