AVRGCC RS-485示范程序

发布者:Joyful888Life最新更新时间:2017-12-18 来源: eefocus关键字:AVRGCC  RS-485 手机看文章 扫描二维码
随时随地手机看文章

/* Title: Interrupt driven serial example(RS-485).
* Author: Daidai Hu
* Date: 06/2003
* Purpose: Template for RS-485 slave communICation program.

* Needed
SOFtware: AVR-GCC 3.3 to compile
* Needed
* Hardware: ATMega103 board with serial 0 connected to RS-485 bus. */

#include
#include
#include
#include
#include
#include
#include PACe.h>
#include

#define F_CPU 6000000 /* 6MHz. */
#define MAX_RCV_LEN 128 /* Maximal receive message length. */
#define MAX_SND_LEN 128 /* Maximal send message length. */

#define UART_BAUD_SELECT(bps) (F_CPU/((bps)*16L)-1)

#define TICK 2 /* System tick(ms). */
#define SRL_TOUT 20 /* Idle time between serial frames(ms). */

/* D7-D2: Reserved(0).
* D1-D0: Baud rate select, 0=19200, 1=9600..., 3=2400. */
uint8_t ucBaud_g;

/* Const table for baud rate register. */
prog_char aucBdTbl_c[]=
{
UART_BAUD_SELECT(19200),
UART_BAUD_SELECT(9600),
UART_BAUD_SELECT(4800),
UART_BAUD_SELECT(2400),
};

/* Global flag. */
volatile uint8_t ucFlag_g;
#define RECV_ERR 0x01
#define RECV_FRM 0x02
#define SEND_MSG 0x04

#define RS485_TX_ON sbi(PORTC, 0)
#define RS485_TX_OFF cbi(PORTC, 0)

/* Serial buffer. */
uint8_t aucRcvBuf_g[MAX_RCV_LEN], aucSndBuf_g[MAX_SND_LEN];
/* Receive length, send length and now send position. */
volatile uint8_t ucRcvLen_g, ucSndLen_g, ucSndPos_g;
volatile uint8_t ucSrlTout_g; /* Frame time out counter. */

static void Deal_Recv_Msg(void);

int main(void)
{
volatile uint16_t unDelay;

/* Power on delay. */
for (ucBaud_g=0; ucBaud_g<10; ucBaud_g )
{
for (unDelay=0; unDelay<60000; unDelay )
continue;
}

/* Set timer 1 capture interrupt as system tick. */
TCCR1A=0x00;
TCCR1B=0x09;
OCR1AH=((F_CPU*TICK/1000) & 0xFF00)>>8;
OCR1AL=(F_CPU*TICK/1000) & 0xFF;
sbi(TIMSK, OCIE1A); /* Enable interrupt. */

ucBaud_g=eeprom_rb(0x10);

/* Default baud rate=9600. */
if (ucBaud_g>3)
ucBaud_g=1;
/* Set baud rate. */
UBRR=PRG_RDB(&aucBdTbl_c[ucBaud_g]);
/* Enable RxD/TxD and ints. */
UCR=(1<
sei(); /* Enable interrupts. */

while (1)
{
if (ucFlag_g & RECV_FRM)
{
Deal_Recv_Msg();
cli();
ucRcvLen_g=0;
ucFlag_g &= ~(RECV_FRM | RECV_ERR);
sei();
}
}
}

/* Signal handler for receive complete interrupt. */
SIGNAL(SIG_UART_RECV)
{
uint8_t ucFromUart;

ucFromUart=UDR; /* Read the Rx data first. */

/* Check if last command not deaLED over. */
if ((ucFlag_g & RECV_FRM) || ucRcvLen_g>=MAX_RCV_LEN)
ucFlag_g |= RECV_ERR;
else if (!(ucFlag_g & SEND_MSG))
aucRcvBuf_g[ucRcvLen_g ]=ucFromUart;

ucFromUart=USR;
if (ucFromUart & ((0x01<ucFlag_g |= RECV_ERR;

ucSrlTout_g=SRL_TOUT/TICK; /* Reset the timeout counter. */ 
}

/* Signal handler for uart data buffer empty interrupt. */
SIGNAL(SIG_UART_DATA) 
{
/* Write byte to data buffer. */
UDR=aucSndBuf_g[ucSndPos_g ];

if (ucSndPos_g>=ucSndLen_g) /* If buffer is empty: */
{
cbi(UCR, UDRIE); /* DISAble UDRIE interrupt. */
sbi(UCR, TXCIE);
}
}

SIGNAL(SIG_UART_TRANS)
{
cbi(UCR, TXCIE);
RS485_TX_OFF;
ucFlag_g &= ~SEND_MSG; /* Last message was dealed. */
}

SIGNAL(SIG_OUTPUT_COMPARE1A) /* Timer 1 output compare. */
{
if (ucSrlTout_g && !(--ucSrlTout_g))
ucFlag_g |= RECV_FRM;
}

static void Deal_Recv_Msg(void)
{
/* TODO: deal with receive message here. */
if (ucFlag_g & RECV_ERR)
return;
mEMCpy(aucSndBuf_g, aucRcvBuf_g, ucRcvLen_g);
ucSndLen_g=ucRcvLen_g;

if (ucSndLen_g>=5)
{
ucSndPos_g=0;

cli();

ucRcvLen_g=0;

ucFlag_g &= ~(RECV_FRM | RECV_ERR);
ucFlag_g |= SEND_MSG;

RS485_TX_ON;

sbi(UCR, UDRIE);

sei();
}
}


关键字:AVRGCC  RS-485 引用地址:AVRGCC RS-485示范程序

上一篇:SD卡接口程序(AVR)
下一篇:AVR串口多机通讯模式的应用

推荐阅读最新更新时间:2024-03-16 15:49

RS-485在多功能电能表中的防雷电路设计
   智能电表系统已经广泛地应用到工业和生活的领域。在电表中使用自动抄表技术通过通信端口读取数据,而且大部分情况采用远程读数方式。对于电表应用来说既安全又节省了时间和金钱。实现该技术的关键是确保通信链路安全可靠。由于RS-485标准具有长距离传输(1200米以上),最大传输数率可以达到10Mbps,且高信号噪声印制。同时,RS-485电路具有控制方便,成本低等优点,使多点连接成为可能。因此,RS-485成为智能电表的标准通信接口。但RS-485口传输线通常暴露于户外,因此极易因为雷击等原因引入过电压。而RS-485收发器工作电压较低(5V左右),其本身耐压也非常低(-7V~+12V),一旦过压引入,就会击穿损坏。在有强烈的浪涌能量
[嵌入式]
构建更加智能的电能计量系统
具备双向通信功能的高级电表架构(AMI)被视为智能电网的核心基础。分析数据表明,未来5年,随着智能电网部署的增长,智能电表在全球安装的数量将高达2亿块。 在中国,与智能电网相关的经济刺激计划正在实施过程中,预计在未来3至5年内将部署1.7亿块智能电表。与传统的机械式电表不同,智能电表可以根据每天的时段来确定用电量,并且能够监测出每个地方的用电量。 目前自动抄表技术在电表应用中越来越流行,该技术为电表提供通信端口读取数据,而且大部分情况下采用远程读数方式。实现该技术的关键是确保通信链路安全可靠,RS-485是一种简单、廉价而且可靠的通信规范,可理想用于自动抄表系统。本文讨论Maxim RS-485收发器的各种特性,这些特性使RS-
[测试测量]
工业远距离通信使用的RS-232至RS-485转换器
要求远距离或者在多个RS-232应用之间实现RS-232数据传输的一些工业用数据链路,通常都使用RS-232到RS-485转换器。尽管存在高达±13V的高信号摆幅,但RS-232仍然是一种非平衡或单端接口,而且本身极易受噪声影响。它的总线最大长度被限定在20米(60英尺)左右。尽管允许进行全双工数据传输(通过一些单独的信号导线同时发送和接收数据),但是RS-232并不支持在同一条总线上连接多个节点。 与之形成鲜明对比的是,RS-485是一种使用差分信号传输的平衡接口,从而让其拥有较高的共模噪声抗扰性。因此,延长RS-232数据链路传输距离和实现多总线节点连接,要求通过接口转换器将其转换为RS-485信号(参见图1)。  
[嵌入式]
串口、COM口、TTL、RS-232、RS-485区别详解
1、串口、COM口是指的物理接口形式(硬件)。而TTL、RS-232、RS-485是指的电平标准(电信号)。 2、接设备的时候,一般只接GND RX TX。不会接Vcc或者+3.3v的电源线,避免与目标设备上的供电冲突。 3、PL2303、CP2102芯片是 USB 转 TTL串口 的芯片,用USB来扩展串口(TTL电平)。 4、MAX232芯片是 TTL电平与RS232电平的专用双向转换芯片,可以TTL转RS-232,也可以RS-232转TTL。 5、TTL标准是低电平为0,高电平为1(+5V电平)。RS-232标准是正电平为0,负电平为1(±15V电平)。 6、RS-485与RS-232类似,但是采用差分信号负逻
[嵌入式]
工业远距离用RS-232至RS-485转换器
  要求远距离或者在多个RS-232应用之间实现RS-232数据传输的一些工业用数据链路,通常都使用RS-232到RS-485转换器。尽管存在高达±13V的高信号摆幅,但RS-232仍然是一种非平衡或单端接口,而且本身极易受噪声影响。它的总线最大长度被限定在20米(60英尺)左右。尽管允许进行全双工数据传输(通过一些单独的信号导线同时发送和接收数据),但是RS-232并不支持在同一条总线上连接多个节点。   与之形成鲜明对比的是,RS-485是一种使用差分信号传输的平衡接口,从而让其拥有较高的共模噪声抗扰性。因此,延长RS-232数据链路传输距离和实现多总线节点连接,要求通过接口转换器将其转换为RS-485信号(参见图1)。
[嵌入式]
利用RS-485实现多路温度测量
  引言   在孵化设备的科研过程中,常常用多路温度测试仪来对孵化机器内部的温度场进行测量,而我们以前用的多路温度测试仪是用两片16选1的模拟开关来完成对32路温度的测量, 温度的采样时间受模拟开关开通关断时间的限制,开关信号对温度采样也造成了一定的干扰。在实际使用过程中还常受到温度采样路数(如8路、20路、64路、70路,128路等)的限制,为能更灵活的应用该多路温度测试仪,我们采用了主从机RS-485通讯的模式来完成多路温度的测量。每个从机采样8路温度并作为一个模块,每个从机有独立的地址,这样我们就可以在主机通讯负载能力范围内灵活的配置从机模块的数量,并且能提高温度采集的及时性和准确性,为科研实验提供便利工具。   硬
[嵌入式]
RS-232,RS-485总线标准
      在数据通信,计算机网络以及分布式工业控制系统当中,经常需要使用串行通信来实现数据交换。目前,有RS-232,RS-485,RS-422几种接口标准用于串行通信。RS-232是最早的串行接口标准,在短距离( 15M),较低波特率串行通信当中得到了广泛应用。其后针对RS-232接口标准的通信距离短,波特率比较低的状况,在RS-232接口标准的基础上又提出了RS-422接口标准,RS-485接口标准来克服这些缺陷。下面详细介绍RS-232,RS-422,RS-485接口标准。   RS-232串口标准是种在低速率串行通讯种增加通讯距离的单端标准。RS-232采取不平衡传输方式,即单端通讯。其收发端的数据信号都是相对于地信号的。
[嵌入式]
RS-232转RS-485网络的通信
  1 引言   目前工业控制现场大量使用了各种智能仪表用于生产过程检测,把智能仪表检测出来的数据传送到监控计算机供显示和分析是非常必要的环节,虽然智能仪表的通信协议种类繁多,但是很多智能仪表都具备RS-232 和RS-485 两种通信接口类型。   RS-232 是美国EIA(Electronic Ingustry Association) 与BELL 等公司一起开发的1969 年公布的通信协议,也是工业控制中应用最广泛的一种串行接口,采取不平衡传输方式,即所谓单端通讯,但是它的传输距离短,最大约为30 米,传输速率低,最高速率为20kb/s,共模抑制能力差,抗噪声干扰性弱的缺点,所以RS-232 只适合本地设备之间的通信。
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved