/****************************************************************************
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;
            }
        }
    }