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