历史上的今天

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

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

发布者:qazwsx007 来源: zhihu关键字:RS485  网络协议  测试程序  PIC16F873 手机看文章 扫描二维码
随时随地手机看文章

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

// 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; cc++ ) LcdWrite( cTest[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

}


关键字:RS485  网络协议  测试程序  PIC16F873 引用地址:RS485网络协议的测试程序

上一篇:HD44780模块LCD接口例程
下一篇:最后一页

推荐阅读

12月25日,由华科精准(北京)医疗科技有限公司研发的神经外科手术机器人正式通过国家药品监督管理局(NMPA)审批准产,成为首款获得国家创新审评通过的神经外科手术机器人,标志着我国神经外科手术机器人达到国际领先水平。此款产品也是我国首款同时适用于儿童和成人的神经外科手术机器人,不仅填补了我国在此领域的空白,也成为具有国际竞争力的创新医疗...
据外媒报道,特斯拉(TSLA.US)发布声明表示,在 2019 年 12 月 18 日与中国借贷方签订了高达 90 亿元人民币的担保定期贷款协议。 同时,特斯拉称与中国借贷方签署了高达 22.5 亿元人民币的无担保循环贷款协定。两项贷款协议均将用于在上海的超级工厂。监管文件显示,借贷方包括中国建设银行、中国农业银行、中国工商银行和上海浦发银行。 特斯拉...
近期包括参考消息等多家媒体报道指美国空军采购了57架大疆无人机,这是大疆从去年以来在美国市场遭遇了诸多不利消息之后的最大利好,意味着它在美国市场似乎将打开局面。去年以来,由于众所周知的原因,大疆面临着华为的类似遭遇,不过大疆的态度颇为强硬,美国增加了大疆无人机进入美国市场的关税口,大疆就提高了在美国市场的售价,将关税成本转移至美国消费者身...
3153绝缘/耐压测试仪是全规格的绝缘耐压测试仪,搭载了所有耐压试验、绝缘电阻试验中必需的功能的全规格测试仪:●全远程控制●AC耐压试验。最大5kV●DC耐压试验。最大5kV●绝缘电阻试验。最大1200V●变压器电容500VA产品特点:●使用扫描选件可进行多点的自动测试;●通过PWM方式,产生不依存电源电压的正确的测试电压;●可在任意时间上升/下降耐压测试...

史海拾趣

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

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved