Está en la página 1de 1

RS232 CON PIC 16F84 Y MAX232

Cuando el PIC en cuestion no tiene UART fisica, como es el caso del 16F84A, CCS puede crear "puertos virtuales", con la siguiente instruccion: #use rs232(baud=9600,parity=N,xmit=PIN_xx0,rcv=PIN_yy,bits=8, force_sw,invert) Donde PIN_xx y PIN_yy son los pines que quieres usar para transmitir y recibir. Utilizamos el comando "invert" con el MAX232 Con esta pequea variacion, logramos controlar las salidas del pic a traves del puerto serie y recibir informacion de si esta activada o no la salida en el PC. Los leds se encienden o apagan segun el numero pulsado y el Pc recibe el informe de estado del led pulsado.

RS232 CON PIC 16F84 Y MAX232


Codigo programado en el pic "C"
// Proyecto control de pines por comunicacion RS232 entre PIC y PC // Pagina del proyecto www.pesadillo.com // // El ejercicio permite encender un led escogido conectado en la puerta A, // Este, se enciende y se apaga segun combinacion de caracteres recibidos // en el Hiperterminal puerto COM1 configurado a 9600 // y control de flujo ninguno. // // Se permite la difusion de esta informacin mientras se mantengan // estas primera lineas intactas. #include <16f84A.h> //Incluimos la libreria para manejo del PIC #byte PORTA=0x05 //Apunto la puerta A a la posicion 0x05 (banco 0) #byte PORTB=0x06 //Apunto la puerta B a la posicion 0x06 (banco 0)

R1
330

R2
330

R3
330

R4
330

#use delay(clock=4000000) //Especifico que utilizo "reloj" de 4MhZ #define RS232_RCVPIN_B1 // Definimos pin que recibe transmission del PC #define RS232_XMIT PIN_B2 //Definimos pin que envia transmission del PC //Se utilizan los mismos pines que el 16f628 (equivalente a 16f84 con UART) #use rs232(baud=9600,parity=N,xmit=RS232_XMIT,rcv=RS232_RCV,bits=8, force_sw,INVERT) // Utilizo la emulacion de RS232 ya que 16f84 no tiene UART //En la linea anterior tambien asignamos PIN como TX y PIN comp RX //OBSERVESE QUE AL UTILIZAR UN MAX232 HEMOS DE INVERTIR LAS SEALES //CON EL COMANDO "INVERT"

D1

D2

D3

D4

#use fast_io(a) //Comando que mejora las capacidades de las comunicaciones #bit led0=porta.0 //Asigna el valor "bit" (1 o 0) a la variable "led" (Puerta A pin 0) #bit led1=porta.1 //Asigna el valor "bit" (1 o 0) a la variable "led" (Puerta A pin 1) #bit led2=porta.2 //Asigna el valor "bit" (1 o 0) a la variable "led" (Puerta A pin 2) #bit led3=porta.3 //Asigna el valor "bit" (1 o 0) a la variable "led" (Puerta A pin 3)

char valor; //Define la variable "valor" como carater. void mensaje(void); //Defino la funcion "mensaje para poder utilizarla luego //Comienzo del programa set_tris_a(0x00); //Ponemos la puerta A al completo a 0 void main()// Comienzo del programa -| puts("========== Control de 4 leds ==========="); puts("Pulsa '1' para encender o apagar el led 1"); puts("Pulsa '2' para encender o apagar el led 2");

C1
33pF

C2
33pF

puts("Pulsa '3' para encender o apagar el led 3");

www.pesadillo.com
1 6 2 7 3 8 4 9

P1
DCD DSR RXD RTS TXD CTS DTR RI

puts("Pulsa '4' para encender o apagar el led 4");

//Enviamos texto al puerto serie led0=0; //predefinimos el valor del led en "0" led1=0; //predefinimos el valor del led en "0" led2=0; //predefinimos el valor del led en "0" led3=0; //predefinimos el valor del led en "0"

X1
www.pesadillo.com
VCC CRYSTAL 16 15 4

while(true) // Repetir indefinidamente -| if(kbhit()) // Si se recibe datos a travs del puerto serie... -| valor=getc(); //Recoger valor (cadena) en la variable "valor"

U1
OSC1/CLKIN OSC2/CLKOUT MCLR RA0 RA1 RA2 RA3 RA4/T0CKI RB0/INT RB1 RB2 RB3 RB4 RB5 RB6 RB7 PIC16F84A 17 18 1 2 3 6 7 8 9 10 11 12 13

switch (valor) -| //Cual es el valor tecleado? case '1': //En el caso de que sea "1" led0=!led0; //Invertir el estado de la variable "led" if(input(PIN_A0)==1) -| //Si el pin RA0, est a 1. puts("P1ON"); // Mando Pulsador 1 ON (P1on) |ELSE -| //Si el pin RA0, est a 1. puts("P1OF"); // Mando Pulsador 1 OFF (P1of) |break; case '2': //En el caso de que sea "2" led1=!led1; //Invertir el estado de la variable "led"

R22
10k 100

R23

C4
ERROR 1 1uF 3

RESET

if(input(PIN_A1)==1) -| //Si el pin RA2, est a 1. puts("P2ON"); // Mando 0x01 por RS232. (numero 1) |ELSE -| // si no... puts("P2OF"); // Mando 0x01 por RS232. (numero 1) |break;

U2

COMPIM

C1+ 11 12 10 9 T1IN R1OUT T2IN R2OUT

C1T1OUT R1IN T2OUT R2IN VS+ VS14 13 7 8 2 6

case '3': //En el caso de que sea "3" led2=!led2; //Invertir el estado de la variable "led" if(input(PIN_A2)==1) -| //Si el pin RA2, est a 1. puts("P3ON"); // Mando 0x01 por RS232. (numero 1) |ELSE -| // si no... puts("P3OF"); // Mando 0x01 por RS232. (numero 1) |break; case '4': //En el caso de que sea "4" led3=!led3; //Invertir el estado de la variable "led" if(input(PIN_A3)==1) -| //Si el pin RA2, est a 1. puts("P4ON"); // Mando 0x01 por RS232. (numero 1) |ELSE -| // si no... puts("P4OF"); // Mando 0x01 por RS232. (numero 1) |break; default :

www.pesadillo.com
C2+

C2-

C5
1uF MAX232

C3
1uF
||-

mensaje();// Carga "mensaje" break; |-

C6
1uF

|-//Fin programa

void mensaje () //Define mensaje por defecto -| puts("ERROR"); //Enviar mensaje al puerto. |-

NOTA: Sustituya los caracteres "-|" por comienzo de llave y los caracteres "|-" por fin de llave.

RS232 CON PIC 16F84 Y MAX232


www.pesadillo.com
FUENTE:
www.pesadillo.com TESTED

Version: 1 Revisado: 11/09/2010 ej5.DSN

También podría gustarte