Programando la RS-232 en el PIC 16F873A


Para programar la USART del PIC se deben configurar varios registros en la siguiente secuencia
Los Bit
SPEN (RCSTA<7>) y TRISC<7:6> deben ser configurados. El primero habilita transmisión serial
y el segundo habilita el bit de transmisión de datos (
RC6/TX/CK) y el bit recepción de datos (RC7/RX/DT)

Se generan los baudios a transmitir usando el registro

Para baja velocidad

Baud Rate = FOSC/(64(X+1))

 

 



//------------------ Programa test RS232 -----------------------

// El PIC envia un mensaje se saludo el cual se puede visualizar

// a través del Hiperterminal de Windows

//---------------------------------------------------------------

char data[20];
void enviar_msg()

{

    char j;

    data[0]=0x48; // H

    data[1]=0x4f; // O

    data[2]=0x4c; // L

    data[3]=0x41; // A

    data[4]=0x0d; // CR - control de carro

    data[5]=0x0a; // LF - line feed

    j=0;

    while(1)

    {

        while(1) // Espera a que se vaya el dato

        {

            if(TXIF==1) break; // Cuando TXIF=1 se fue

        }

        TXREG=data[j]; // Envia el dato almacenado en data[j]

        j++;

        if(j==5) break; // Despues de enviar el ultimo parte de cero
        TXIF=0;

    }

}

void main()
{

// Se programan los bit correspondientes, el de TX y RX

// corresponden la PORTC.B7 y PORTC.B6 respectivamente

// el primero como salida y el segundo como entrada.

TRISC=0x80; // 10 00 0000
SPBRG=255; // 1200 8 N 1

TXSTA=0x20;

RCSTA=0x90;

PIR1= 0x30; //HABILITA LA BANDERA QUE INFORMA QUE REGISTRO DE TX ESTA VACIO!!!

while(1)
    {

    enviar_msg();

    }

}

 


Recibiendo y enviando datos via polling

 

//------------------- Test 2 ----------------------
// Recibe un dato del hiperterminal y contesta OK
//-------------------------------------------------

char data[10];
void enviar_ok() // Envia el mensaje OK

{
char j;

data[0]=0x4f; // O

data[1]='K'; // K

data[2]=0x0d; // CR

data[3]=0x0a; // LF

data[4]=0x00; //

j=0;
while(j<5)

{

  while(1)
 
  {

   if(TXIF==1) break;
  }

 TXREG=data[j];
 j++;

}

}

void main()
{

 TRISC=0x80; // 10 00 0000
 SPBRG=255; // 1200 8 N 1
 TXSTA=0x20;
 RCSTA=0x90;

 PIR1= 0x30; //HABILITA LA BANDERA QUE INFORMA QUE REGISTRO DE TX ESTA VACIO!!!

 while(1) // Lee el bit de estado de RX de datos
 {
     // Si RCIF=1 llego dato

     // Si el dato recibido es un ´1´ ASCII (0x31)

      // Envia el OK

    if (RCIF==1)
     {

       if (RCREG==0x31)enviar_ok();

     }

 }
}

 




Programa espejo

//-------------- Test 3 ------------------------------
// El carácter rx por el PIC es re-enviado hacia el PC
//-----------------------------------------------------


void enviar(char d)

{

  while(1)
  {

    if(TXIF==1) break;

  }

  TXREG=d;

  TXIF=0;

}

void main()
{

  TRISC=0x80; // 10 00 0000

  SPBRG=255; // 1200 8 N 1

  TXSTA=0x20;

  RCSTA=0x90;

  PIR1= 0x30; //HABILITA LA BANDERA QUE INFORMA QUE REGISTRO DE TX ESTA VACIO!!!
  while(1) // Lee el bit de estado de RX de datos

  {

   // Si RCIF=1 llego dato
   // El dato recibido en RCREG se manda

   // a través de enviar()

   if (RCIF==1)

    {

       enviar(RCREG);

          // enviar(0x0d); // Opcional

          // enviar(0x0a); // Opcional

    }

  }

}