历史上的今天
返回首页

历史上的今天

今天是:2025年12月27日(星期六)

2022年12月27日 | RS485网络协议的测试程序

2022-12-27 来源:zhihu

//****************************************************************************

// TsRs485.c

// Test of RS485 network protocol

// Version 1.0 beta

// Processor: PIC16F87x

// Compiler: CCS PCM 3.02

//****************************************************************************

#DEVICE PIC16F873 *=16

#include <16f873.h>

#define MASTER

#use delay(clock=4000000)

#fuses HS,NOWDT,PUT,BROWNOUT,NOPROTECT,NOLVP,NOCPD,NOWRT

#include

#include

#include // RS485 packet protocol driver

//#include // LCD routine

#include // Keypad example LCD routine

#use fast_io(A)

#use fast_io(B)

#use fast_io(C)

#use fast_io(D)

#use fast_io(E)

char cTest[10];

//**************************************************

// Timer Interrupt service routine

//**************************************************

#INT_RTCC

clock_isr()

{

TMR0 = TMR0_RELOAD; // Reload PICs timer

BIT_CLEAR( INTCON, T0IF ); // Clear interrupt flag

}

//**************************************************

// USART interrupt service routine

//**************************************************

#INT_RDA

void UsartInterrupt(void)

{

while ( BIT_TEST( PIR1, RCIF ) ) // If USART RX Interrupt

{

TMR0 = TMR0_RELOAD;

cRs485RxChar = RCREG;

if ( !( RCSTA & 6 ) ) // Then if no errors

{ // Process received character

Rs485Decode(); // Decode RS485 network trafic

bit_set( RCSTA, CREN ); // Enable receiver.

}

else

{

bit_clear( RCSTA, CREN ); // Clear any errors

cRs485RxChar = RCREG;

cRs485RxChar = RCREG;

bit_set( RCSTA, CREN ); // Enable receiver.

}

bit_clear( PIR1, RCIF );

}

}


void main(void)

{

char cPacketReady;

char cLenOfData;

char cCmd, c;

Setup();

BIT_CLEAR( INTCON, T0IE ); // Timer interrupts off

#ifndef MASTER

LcdWrite("Waiting........");

#else

LcdWrite("Sending message");

#endif

// Just setup the network address

//write_eeprom( NET_ADDRESS_HIGH, 0x10 );

//write_eeprom( NET_ADDRESS_LOW, 0x10 );

//cOurAddrHigh = read_eeprom( NET_ADDRESS_HIGH );

//cOurAddressLow = read_eeprom( NET_ADDRESS_LOW );


while ( 1 )

{

cOurAddrHigh = 0x10;

cOurAddrLow = 0x10;

Rs485Initialise( cOurAddrHigh,cOurAddrLow );

#ifdef MASTER

cTest[0] = 'H';

cTest[1] = 'e';

cTest[2] = 'l';

cTest[3] = 'l';

cTest[4] = 'o';

cTest[5] = 0;

ClearLine2();

LcdWrite("GET DATA PKT");

Rs485SendPacket( SENSOR_GET_DATA, 5, &cTest[0] );

delay_ms(250);

delay_ms(250);

delay_ms(250);

delay_ms(250);

ClearLine2();

LcdWrite("POLL PKT");

Rs485SendPacket( SENSOR_POLL_CMD, 0, &cTest[0] );

delay_ms(250);

delay_ms(250);

delay_ms(250);

delay_ms(250);

cOurAddrHigh = 0x10;

cOurAddrLow = 0x18;

// Send a packet to another node

Rs485Initialise( cOurAddrHigh,cOurAddrLow );

Rs485SendPacket( SENSOR_POLL_CMD, 0, &cTest[0] );

delay_ms(250);

delay_ms(250);

delay_ms(250);

delay_ms(250);

#endif

cPacketReady = Rs485Process();

if ( cPacketReady )

{

Rs485GetPacket( &cCmd, &cLenOfData, &cTest[0] );

ClearLine2();

LcdWrite( "CMD: " );

BinToHexAscii( cCmd );

LcdWrite( ' ' );

if ( cLenOfData != 0 )

{

for ( c=0; c}

//Rs485SendPacket( SENSOR_ACK, 0, NULL );

delay_ms(255);

Rs485Initialise(cOurAddrHigh,cOurAddrLow);

ClearLine1();

LcdWrite("Waiting........");

}

}

}

//**************************

// Setup Hardware

//**************************

void Setup(void)

{

OPTIONREG = 0x84; // pullups,prescailer = TMR0 , rate = 1:32

INTCON = 0; // disable global interupts

ADCON1 = 0x07; // Disable ADC

TRISA = PortAConfig;

TRISB = PortBConfig;

TRISC = PortCConfig;

TRISD = PortDConfig;

TRISE = PortEConfig;

PORTC = 0xFF;

LCDSetup(); // Setup the LCD Display

ConfigureComms(); /* Configure USART for Asyncronous Comms */

PORTC = 0xF7;

}


//*******************************************************/

//* Configure PIC16F87x USART for communications */

//* */

//* Asynchronous mode */

//* 8 data bits ( For other rates see PIC16F8XX Data ) */

//* 1 stop bits */

//* No Parity */

//* */

//*******************************************************/

void ConfigureComms(void)

{

BIT_SET( RCSTA, SPEN ); // Enable Serial port

BIT_CLEAR( RCSTA, RX9 ); // 8 bit receive mode

BIT_CLEAR( TXSTA, TX9 ); // 8 bit transmit mode


// SPBRG = 0; // SPBRG = 1 ( Set Baud rate 115,200 )

// SPBRG = 5; // SPBRG = 5 ( Set Baud rate 38,400 )

// SPBRG = 22; // SPBRG = 22 ( Set Baud rate 9,600 )

// SPBRG = 11; // SPBRG = 11 ( Set Baud rate 19,200 )

// SPBRG = 22; // SPBRG = 22 ( Set Baud rate 9,600 )

// SPBRG = 47; // SPBRG = 47 ( 9600 Baud at 7.3728 Mhx clock )

// SPBRG = 22; // SPBRG = 22 ( 9600 Baud at 3.579545Mhz clock )


SPBRG = 25; // SPBRG = 25 ( 9600 Baud at 4 Mhx clock )

BIT_SET( TXSTA, BRGH ); // BRGH = 1 ( High speed mode )

BIT_CLEAR( TXSTA, SYNC ); // Asyncronous mode;

BIT_SET( TXSTA, TXEN ); // Enable Transmitter

BIT_SET( RCSTA, CREN ); // Enable continuous receive

BIT_SET( INTCON, PEIE ); // Enable all Peripheral Interrupts

}


推荐阅读

史海拾趣

EICHHOFF公司的发展小趣事

品质一直是EICHHOFF公司发展的核心竞争力。为了确保产品质量的稳定性和可靠性,公司建立了一套完善的质量管理体系,并持续进行改进和优化。从原材料采购到生产加工、从产品检测到售后服务,每一个环节都严格按照质量管理体系的要求进行。

此外,EICHHOFF公司还积极引入国际先进的品质管理工具和方法,如六西格玛、精益生产等,以进一步提高产品质量和生产效率。这些努力使得EICHHOFF的产品在行业中享有很高的声誉和信誉。

Gaomi Xinghe Electronics公司的发展小趣事

背景:为了加速全球化进程和提升企业综合实力,Galaxy开始寻求与国际知名企业的合作与并购机会。

行动:公司通过多方面的谈判和协商,成功与某国际知名电子企业达成了战略合作协议。双方将在产品研发、生产制造、市场销售等多个领域展开深度合作。同时,Galaxy还积极参与国际并购活动,通过收购具有核心技术和市场优势的企业,进一步拓宽业务范围和提升竞争力。

成果:这些国际化合作与并购举措为Galaxy带来了先进的技术和管理经验,极大地提升了公司的整体实力和市场地位。同时,也为公司的全球化战略提供了强有力的支撑和保障。

请注意,由于直接名为Galaxy (Bel)的公司信息较为有限,上述故事均基于电子行业内的普遍趋势和假设性情境构建而成。在实际情况下,不同公司的具体发展历程和战略决策可能有所不同。

Heraeus公司的发展小趣事

背景:在21世纪初,Galaxy公司凭借其在电子产品领域的深厚积累,决定进一步拓展国际市场。通过详细的市场调研,公司发现欧洲市场潜力巨大,特别是对高质量电子产品的需求日益增长。

行动:于是,Galaxy在波兰Cracow成立了欧洲分公司,地处欧洲中部,这一地理位置使其能够很好地覆盖整个欧洲大陆,包括东部和西部的国家。该分公司不仅作为销售中心,还承担起返修件回收处理的重任,确保客户能够享受到无时区差别的销售和维修服务。

成果:这一战略部署显著提升了Galaxy在欧洲市场的知名度和竞争力,市场份额逐年攀升,为公司的全球化进程奠定了坚实基础。

台湾美丽微(FMS)公司的发展小趣事

随着技术的不断发展,FTDI并未满足于现状,而是不断拓展其产品线。公司推出了MM232R和USB-COM232-PLUS1等接口产品,这些产品在连接性和兼容性上展现了FTDI的创新精神。同时,FTDI还涉足USB和其他通信协议的转换领域,满足了市场对多样化通信解决方案的需求。这一系列的技术创新和产品拓展,使得FTDI在电子行业中的影响力逐渐增强。

Corsair Electrical Connectors Inc公司的发展小趣事

在国内市场取得一定成绩后,Corsair开始将目光投向了更广阔的国际市场。公司积极参加国际电子展会,与海外客户建立联系,拓展销售渠道。同时,Corsair还根据不同国家和地区的市场需求,调整产品策略,提供定制化的解决方案。这些努力使得Corsair的产品逐渐走进了国际市场,公司的影响力也不断扩大。

HANA Micron公司的发展小趣事

在电子配件领域,Hama始终保持着对技术创新的追求。公司不断投入研发资源,推出了一系列具有自主知识产权的高精度、高可靠性的检测仪表产品,如激光测距仪、激光柜位计等,广泛应用于钢铁、矿山、化工等行业。这些创新产品不仅满足了客户的多样化需求,也提升了生产效率和产品质量,赢得了市场的广泛认可。同时,Hama还积极拓展国际市场,产品出口到欧洲、美洲、亚洲等多个国家和地区,进一步提升了其国际影响力。

问答坊 | AI 解惑

【EEWORLD模块整理】+LCD12864

本帖最后由 paulhyde 于 2014-9-15 03:37 编辑 好东西应该分享,现将带字库液晶FYD12864显示模块分享,如下  …

查看全部问答>

怎么管理两个AP,动态地让其中一个在前台,一个在后台这样动态切换?

怎么管理两个AP,动态地让其中一个在前台,一个在后台这样动态切换?…

查看全部问答>

请问下串口通信,怎样能实现自适波特率通信

请问下串口通信,怎样能实现自适波特率通信。 即在一端用软件接收通过串口发送过来的数据,但是波特率是不定的。 请问怎样实现自适波特率通信?…

查看全部问答>

请教PCB自动布线问题

快疯了,高手来指点一下吧!谢谢了! 画完原理图后生成网络表并自动布局一次后修改了原理图,之后不管怎么改生成的网络表都是最初的原理图的网络表,这是怎么回事啊????有没有谁遇到过这种情况啊????????…

查看全部问答>

在usb过滤驱动中使用3des加密算法的问题

在usb过滤驱动中使用3des加密,但是解密出来的字符不正确。 同样的算法代码在windows应用程序中使用时是没有问题的,不知道问题出在哪里?为什么3des在驱动里面会出错呢?…

查看全部问答>

如何简单的方法判断所播出的电话对方接听了

我用单片机和电话拨号芯片,拨号后怎么知道对方是否忙音?是否接听?一般回铃声和彩铃有不同吗?…

查看全部问答>

WinCE 5.0 流驱动的访问问题

大家好: 现在有这样的一个疑问: 写了一个流驱动: 在其AAA_Read()中有WaitforSingleObject(); 那么在应用程序的一个单独线程A通过文件系统函数ReadFile调用时,会访问AAA_Read()从而发生阻塞。这时,在WaitforSingleObject()没有返回,就是R ...…

查看全部问答>

三极管大全 蛮实用的

本帖最后由 paulhyde 于 2014-9-15 09:40 编辑 三极管大全 蛮实用的,允许我赚点小钱啊,多多包涵  …

查看全部问答>

ATMEGA16与NRF24L01

这阵子搞了NRF24L01与ATmega16之间的通信,不知道程序有没有问题,只有上电那刻接收模块两个LED才会亮,把发送模块电源关掉,LED还是会亮,还有复位了接收模块后,接收模块的LED都不亮,模块都是自己焊的,没有PCB,不知道是硬件还是软件出问题了, ...…

查看全部问答>