Gabriel
Joined: 03 Aug 2009 Posts: 1067 Location: Panama
|
Self Sync Soft Serial - 4S |
Posted: Tue Nov 19, 2013 10:43 pm |
|
|
Hi All,
This was just an exercise/experiment I had always thought of doing.
It works, and I'm sharing.
*Take this with a grain of salt, it will not play well with interrupts, and there are several inherent flaws to this "protocol".
As the tittle describes "4S" is Regular software serial with a Sync prelude.
What this means is that you can communicate PIC-to-PIC using software serial without having to worry about missing data and lockups.*
Things are organized as Clients and Servers.
Servers do tasks that need to be reported to the client. Like reading a sensor, processing data and sending it to the Client.
Clients use the server data.
Clients are the "Masters" since they decide when to listen, which is important since this is all based on software serial which implies a lock up while waiting to receive something.
This keeps the waiting in GETC() to a minimum.
Servers however, they wait for the client for as long as it takes.
This is a one wire physical layer and unidirectional (+shared ground).
Must use a pullup on the line.
Server talks when Client wants to listen.
One wire per Server
Can be modified easily to handle several server with one client, but this version only does ONE server.
OPERATION:
Server keeps line low - No data to report
Server Releases line and waits for client - Data is ready
Client pulses line low for 100us - Client is ready to listen
Client starts software GETC()
Server proceeds Software PUTC()
Server keeps line low
Its not meant to be flawless, its just meant to make sending a byte form PIC-to-PIC easier or simpler with soft serial.
Remember this was only a late night experiment.
CLIENT:
Code: | //******************************************************************************
// Self Sync Soft Serial
// 4S Protocol
//******************************************************************************
// AUTHOR: GABRIEL BARRIOS
// DATE: 19/11/2013
// Panama, Rep. Panama.
//______________________________________________________________________________
//
//----------------------------------CLIENT--------------------------------------
#use RS232(STREAM=S4, BAUD=9600, RCV=COM_PIN)
void Init_4S()
{
input(COM_PIN); // Make sure pin is set as an input
output_float(COM_PIN); // Release the line
}
int Get_4S_Data()
{
if(input(COM_PIN)) // Check if line has been released
{
output_low(COM_PIN); // Bring line low for 100us
delay_us(100); // 100us Delay
output_float(COM_PIN); // Release the line
return(fgetc(S4)); // Wait for data
}
return(0); // Return 0 if line was not released
} |
SERVER:
Code: | //******************************************************************************
// Self Sync Soft Serial
// 4S Protocol
//******************************************************************************
// AUTHOR: GABRIEL BARRIOS
// DATE: 19/11/2013
// Panama, Rep. Panama.
//______________________________________________________________________________
//
//----------------------------------SERVER--------------------------------------
#use RS232(STREAM=S4, BAUD=9600, XMIT=COM_PIN)
void Init_4S()
{
output_low(COM_PIN); // Drive line low - No data to send
}
void Send_4S_Data(char data)
{
output_float(COM_PIN); // Release the line / Signal data is available
while(input(COM_PIN)){} // Wait till Client brings line low
while(!input(COM_PIN)){} // Wait Duration of low pulse
delay_us(100); // Allow the Client to set it self up
fputc(data,S4); // Send Data
output_low(COM_PIN); // Drive line low - No data to send
} |
TEST PROGRAM:
Code: | //******************************************************************************
// Self Sync Soft Serial
// 4S Protocol
//******************************************************************************
// AUTHOR: GABRIEL BARRIOS
// DATE: 19/11/2013
// Panama, Rep. Panama.
//______________________________________________________________________________
//
//--------------------------------TEST PROGRAM----------------------------------
#include <16f886.h>
#DEVICE adc=8
#DEVICE *=16
#DEVICE PASS_STRINGS=IN_RAM
#fuses HS,NOWDT,NOPROTECT,NOLVP,NOBROWNOUT,NODEBUG
#use delay(clock=20000000)
#use rs232(STREAM=STD, baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
#define COM_PIN PIN_B4 // Pin to XMIT/RCV
//#define CLIENT // Client or Server
#ifdef CLIENT
#include <4S - Client.c> // Include Client Code
#else // or
#include <4S - Server.c> // Include Server Code
#endif
int temp=0; // Just for Example purposes
//==========================
void main()
{
Init_4S(); //Initialize Harware - Call once
while(1)
{
#ifdef CLIENT
{
fprintf(STD,"Client says: %X \r",temp);
//DO STUFF
delay_ms(293); // Its a prime number to show operaration in mismatched loop times
delay_ms(211); // Same thing - Imagine these are functions
//
//
//Right at the end of the main while:
temp=Get_4S_Data();
}
#else
{
//DO STUFF
delay_ms(223); // Its a prime number to show operaration in mismatched loop times
delay_ms(317); // Same thing - Imagine these are functions
//
//
//Right at the end of the main while:
Send_4S_Data(0xAA); // Nice example value to send (10101010)
}
#endif
}
} |
_________________ CCS PCM 5.078 & CCS PCH 5.093 |
|