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
{
j=0; if(TXIF==1) break;
}
void main()
TRISC=0x80; // 10 00 0000 while(1) // Lee el bit de estado de RX de datos
char j;
data[0]=0x4f; // O
data[1]='K'; // K
data[2]=0x0d; // CR
data[3]=0x0a; // LF
data[4]=0x00; //
while(j<5)
{
while(1)
{
}
TXREG=data[j];
j++;
}
{
SPBRG=255; // 1200 8 N 1
TXSTA=0x20;
RCSTA=0x90;
PIR1= 0x30; //HABILITA LA BANDERA QUE INFORMA QUE REGISTRO DE TX ESTA VACIO!!!
{
// 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
}
}
}