max232_rs232_pic

1
RS232 CON PIC 16F84 Y MAX232 TESTED RS232 CON PIC 16F84 Y MAX232 www.pesadillo.com FUENTE: 1 Version: ej5.DSN Revisado: 11/09/2010 www.pesadillo.com // 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 información 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) #use delay(clock=4000000) //Especifico que utilizo "reloj" de 4MhZ #define RS232_RCV PIN_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 SEÑALES //CON EL COMANDO "INVERT" #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"); puts("Pulsa '3' para encender o apagar el led 3"); 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" while(true) // Repetir indefinidamente -| if(kbhit()) // Si se recibe datos a través del puerto serie... -| valor=getc(); //Recoger valor (cadena) en la variable "valor" 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" 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; 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 : mensaje();// Carga "mensaje" break; |- |- |- |-//Fin programa void mensaje () //Define mensaje por defecto -| puts("ERROR"); //Enviar mensaje al puerto. |- RS232 CON PIC 16F84 Y MAX232 Codigo programado en el pic "C" NOTA: Sustituya los caracteres "-|" por comienzo de llave y los caracteres "|-" por fin de llave. OSC1/CLKIN 16 RB0/INT 6 RB1 7 RB2 8 RB3 9 RB4 10 RB5 11 RB6 12 RB7 13 RA0 17 RA1 18 RA2 1 RA3 2 RA4/T0CKI 3 OSC2/CLKOUT 15 MCLR 4 U1 PIC16F84A 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 pequeña 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. VCC R22 10k R23 100 RESET X1 CRYSTAL C1 33pF C2 33pF D1 R1 330 ERROR TXD 3 RXD 2 CTS 8 RTS 7 DSR 6 DTR 4 DCD 1 RI 9 P1 COMPIM T1IN 11 R1OUT 12 T2IN 10 R2OUT 9 T1OUT 14 R1IN 13 T2OUT 7 R2IN 8 C2+ 4 C2- 5 C1+ 1 C1- 3 VS+ 2 VS- 6 U2 MAX232 C3 1uF C4 1uF C5 1uF C6 1uF D2 R2 330 D3 R3 330 D4 R4 330 www.pesadillo.com www.pesadillo.com www.pesadillo.com

Upload: jean-baptiste-solis

Post on 12-Aug-2015

25 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: MAX232_RS232_PIC

RS232 CON PIC 16F84 Y MAX232

TESTED

RS232 CON PIC 16F84 Y MAX232www.pesadillo.comFUENTE:

1Version:

ej5.DSNRevisado: 11/09/2010

www.pesadillo.com

// 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 información 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)#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 SEÑALES//CON EL COMANDO "INVERT"#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 programaset_tris_a(0x00); //Ponemos la puerta A al completo a 0void 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");puts("Pulsa '3' para encender o apagar el led 3");puts("Pulsa '4' para encender o apagar el led 4");

//Enviamos texto al puerto serieled0=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"

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

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" 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;

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 : mensaje();// Carga "mensaje" break; |- |- |-

|-//Fin programa

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

RS232 CON PIC 16F84 Y MAX232Codigo programado en el pic "C"

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

OSC1/CLKIN16

RB0/INT 6RB1 7RB2 8RB3 9RB4 10RB5 11RB6 12RB7 13

RA0 17RA1 18RA2 1RA3 2

RA4/T0CKI 3

OSC2/CLKOUT15

MCLR4

U1

PIC16F84A

Cuando el PIC en cuestion no tiene UART fisica, como es el caso del 16F84A, CCSpuede 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 pequeña variacion, logramos controlar las salidas del pica traves del puerto serie y recibir informacion de si esta activada o no la salidaen el PC.Los leds se encienden o apagan segun el numero pulsado y el Pc recibe el informe de estado del led pulsado.

VCC

R2210k

R23100

RESET

X1

CRYSTAL

C133pF

C233pF

D1

R1330

ERROR

TXD3RXD2

CTS8RTS7DSR6

DTR4

DCD1

RI9

P1

COMPIM

T1IN11R1OUT12T2IN10R2OUT9

T1OUT 14R1IN 13

T2OUT 7R2IN 8

C2+

4

C2-

5

C1+

1

C1-

3

VS+ 2VS- 6

U2

MAX232

C31uF

C4

1uF

C51uFC6

1uF

D2

R2330

D3

R3330

D4

R4330

www.pesadillo.com

www.pesadillo.com

www.pesadillo.com