www.pudn.com > rs485(full).rar > tstrs485.c


//********************************************************************************* 
// TsRs485.c 
// 
//                      Test of RS485 network protocol 
// 
// 
// Version 1.0 beta  
// 
// Processor: PIC16F87x 
// Compiler: CCS PCM 3.023 
// 
// 
// By: J.Winpenny 
// j.winpenny@ukonline.co.uk 
// 
// 
// 
//********************************************************************************* 
#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