当前位置:首页 > 单片机 > 单片机
[导读] /* Title: Interrupt driven serial example(RS-485).* Author: Daidai Hu* Date: 06/2003* Purpose: Template for RS-485 slave communICation program.* Needed*SOFtware: AVR-GCC3.3 to compile* Ne

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

* Needed
*SOFtware: AVR-GCC3.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. */

#defineUART_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 deaLEDover. */
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();
}
}


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

通过应用R&S CMW500和R&S CMX500宽带无线通信测试仪,Cooper General Global Services(简称“Cooper General”)现已可以提供4G/LTE和 5G设备的支持和维修服...

关键字: rs 5G

罗德与施瓦茨近期签订了新的合同,将为菲律宾海岸警卫队的两艘94米多用途快速反应艇(MRRV)提供安全通信和无线电测向系统服务。

关键字: rs ntt

罗德与施瓦茨公司生产的ARDRONIS系统能够检测和识别无人机遥控信号,并且能够测量无人机遥控信号的来波方向并阻断该信号,从而阻止无人机悄无声息的抵近目标区域。

关键字: rs ardronis

  中国 北京,2015年8月27日 – 服务于全球工程师的分销商Electrocomponents plc (LSE:ECM)集团旗下的贸易品牌RS Components (RS)

关键字: rs

  中国北京,2015年10月22日-服务于全球工程师的分销商Electrocomponents plc (LSE:ECM)集团旗下的贸易品牌RS Components (RS)公司宣布,推出W

关键字: rs 物联网 6lowpan网

  中国北京,2016年1月6日- 服务于全球工程师的分销商Electrocomponents plc (LSE:ECM)集团旗下的贸易品牌RS Components (RS)公司宣布推出Arr

关键字: rs 物联网

  中国北京,2016年2月23日 - 服务于全球工程师的分销商Electrocomponents plc (LSE:ECM) 集团旗下的贸易品牌RS Components (RS)公司推出最新

关键字: rs 微控制器 物联网

尽管无线网络越来越普及,有线串行网络依然是最可靠、鲁棒性最好的通信方式,特别是在恶劣环境下。对于工业和楼宇自动化等要求具备较高的抗干扰、抗静电能力,以及高压故障保护的应用环境,这类网络能够提供更

关键字: rs

训练专项网络 还记得我们在开始时丢弃的70%的培训数据吗?结果表明,如果我们想在Kaggle排行榜上获得一个有竞争力的得分,这是一个很糟糕的主意。在70%的数据和挑战的测试集中,我们的模

关键字: rs 通信协议

什么是新型毫米波雷达传感器技术?它有什么特点?测试与测量领域的先行者罗德与施瓦茨(Rohde & Schwarz)为脉冲相干雷达(PCR)和物联网领域的先行者Acconeer提供了R&S FSW85信号和频谱分析仪。Ac...

关键字: acconeer rs 雷达传感器
关闭
关闭