max232_rs232_pic
TRANSCRIPT
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