/****************************************************************************
STRETCH.C Pulse stretcher to drive Rx and Tx LED's on RS232
Bit times are short at 9600-baud and above, making it difficult to observe status
by LED's, unless you stretch the bits. This code stretches serial Rx/Tx pulses to
25mS for display on LED's.
---------
| 12C509 |
| |
+5V ---1-|Vdd |
Gnd ---8-|Vss |
| |
Rx LINE IN ---6-|GP1 GP0|-7------ Rx LED
Tx LINE IN ---4-|GP3 GP2|-5------ Tx LED
| |
---------
External oscillator = 4MHz
Cycle time = 1uS
In the CCS PCB compiler: CHAR and INT are 8-bit values
LONG is a 16-bit value
SHORT is a 1-bit value
Jon Fick 02/26/99
***************************************************************************/
#include < 12C509.h >
#fuses INTRC, NOPROTECT, NOMCLR, NOWDT
#use delay ( clock = 4000000 )
#use fast_io ( B )
#byte GPIO = 6
#bit RX_LED = GPIO.0
#bit RX_IN = GPIO.1
#bit TX_LED = GPIO.2
#bit TX_IN = GPIO.3
void main ( void )
{
UCHAR cRxCount, cTxCount, cX;
#asm
movlw 0b11000000
option
#endasm
set_tris_b ( 0b11111010 );
TX_LED = LOW;
RX_LED = LOW;
cRxCount = 0;
cRxCount = 0;
for ( cX = 0; cX < 10;cX++ )
{
TX_LED = HIGH;
delay_ms ( 50 );
TX_LED = LOW;
RX_LED = HIGH;
delay_ms ( 50 );
RX_LED = LOW;
}
/* END OF INITIALIZATION ****************************************************************/
while ( TRUE ) /* do forever */
{
if ( RX_IN == LOW ) /* if Rx active */
{
cRxCount = 250; /* restart count */
}
if ( cRxCount > 0 )
{
RX_LED = ON;
cRxCount--;
delay_us ( 100 );
}
else
{
RX_LED = OFF;
}
if ( TX_IN == LOW ) /* if Tx active */
{
cTxCount = 250; /* restart count */
}
if ( cTxCount > 0 )
{
TX_LED = ON;
cTxCount--;
delay_us ( 100 );
}
else
{
TX_LED = OFF;
}
}
}