Estimado Lectores, el día de hoy les presento un Interfaz capaz de controlar el encendido de un grupo de 8 leds, el medio de comunicación que vamos a plantear sera el RS232, para tal fin debemos utilizar 3 programas (MPLAB XC8 IDE, VISUAL BASIC y PROTEUS)
Este sencillo ejercicio nos va a llevar a otro nivel, ya que al finalizar el proyecto terminaran como Roky en la playa muy felices, puesto que este proyecto les abrirá la puertas para poder diseñar interfaces HMI para el control de procesos.
Nuestro sencillo programa consiste en enviar instrucciones mediante un ordenador y mediante un interfaz desarrollado en Visual Basic esta enviara una letra ASCII "R", recordemos que en hexadecimal es 0x52h. de este modo y mediante una combinación de condicionales dentro MPLAB podemos indicar una acción.
Private Sub Command1_Click()
MSComm1.Output = "R"
End Sub
https://youtu.be/DLGjiVWJQjs
Por otro lado, recordemos que los sistemas embebidos y la programación, son temas de alta especialización, por eso muchos clientes no entienden nada de codigos C, Pascal, C++, Java, Etc y nos buscan.
Por lo tanto, nosotros debemos proporcionarles una herramienta interactiva un interfaz capas de cubrir sus necesidades en el control de un determinado proceso por ejemplo: el arranque de un motor, encendido de luz de emergencia mediante un protocolo de seguridad incorporado.
Así pues, poder visualizar el proceso de su planta en una sola pantalla facilita la toma de decisiones, ademas permite control remoto, esto nos lleva a una etapa superior que es el sistema SCADA.
El SCADA, acrónimo de Supervisory Control And Data Acquisition (Supervisión, Control y Adquisición de Datos) como dice su nombre es una aplicación para adquisición de datos en tiempo real, ya que de esta manera se puede monitoria y actuar en procesos de manera remota.
La ingeniera Mecatronica actualmente esta revolucionando la manera en que las maquinas electromecanicas realizan un procesa, ya que de el se puede extraer datos fundamentales como temperatura, presion, etc, ademas podemos activar sus actuadores, por ejemplo encender motores, mover pistones y todo desde la comodidad de una oficina al otro lado del mundo.
Volviendo al tema que nos ocupa, los material que debemos tener en cuenta son los siguientes:
* PLACA DE DESARROLO PARA PIC18F4550.
* Cable USB RS232 A USB.
*LCD16x2.
*Microcontrolador PIC 18F4550.
*PC.
PROGRAMA MPLAB XC8 IDE
Analicemos el codigo fuente para el microcontrolador PIC18F4550:
/*
* File: main.c
* Author: Guillermo Angulo Niquen
*
* Created on 23 de JULIO de 2017, 11:24
*/
* File: main.c
* Author: Guillermo Angulo Niquen
*
* Created on 23 de JULIO de 2017, 11:24
*/
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <plib/usart.h>
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <plib/usart.h>
#include <xc.h>
#define _XTAL_FREQ 20000000
#include "lcd_xc8.c"
#include "lcd_xc8.h"
volatile int Data, Kbhit=0;
#include "lcd_xc8.c"
#include "lcd_xc8.h"
volatile int Data, Kbhit=0;
//****************** Se discrimina el origen de la interrupción*************
void interrupt high_isr (void)
{
if (PIR1bits.RCIF==1){ // Discrimina la interrupción
Data=getcUSART(); // Se lee dato recibido
Kbhit=1; // Indica que se ha recibido un dato
PIR1bits.RCIF=0; // Borra bandera de interrupción
}
}
void interrupt high_isr (void)
{
if (PIR1bits.RCIF==1){ // Discrimina la interrupción
Data=getcUSART(); // Se lee dato recibido
Kbhit=1; // Indica que se ha recibido un dato
PIR1bits.RCIF=0; // Borra bandera de interrupción
}
}
//********************PROGRAMA PRINCIPAL******************************/
void main(void){
ADCON1=0x0F;
TRISD = 0x00;
TRISE = 0x00;
TRISB=0x00;
TRISA=0x00;
PORTEbits.RE1=0;
PORTDbits.RD0=0;
PORTDbits.RD1=0;
PORTDbits.RD2=0;
PORTDbits.RD3=0;
unsigned char base =1;
// Inicializa el USART y lo configura a 8N1, 9600 baud
OpenUSART (USART_TX_INT_OFF & // TX sin interrupción
USART_RX_INT_ON & // RX con interrupciónes
USART_ASYNCH_MODE & // Modo asincrónico
USART_EIGHT_BIT & // Modo alta velocidad
USART_CONT_RX & // Recepción continua
USART_BRGH_HIGH,129);// 9600 baudios a 20Mhz
RCONbits.IPEN = 0; // Deshabilitamos prioridades
INTCONbits.PEIE=1; // Habilitamos la interrupcion de perifericos
lcd_init();
//Delay1KTCYx(25);
lcd_putrs("USART PIC18F4550"); // Cartel inicial
INTCONbits.GIE=1; //Habilita interrupción global
while(1){ // BUCLE
if(Kbhit !=0){ // Indica que hay nuevos datos recibidos
Kbhit = 0; // Borra la marca de ISR
if(Data!=0x00){ // El dato es distinto de 0?
if(Data==0x49 & base > 0){ // Backspace & base son verdaderos?
base--;
lcd_gotoxy(base,2);
lcd_putc(" ");
PORTB=0x00;
__delay_ms(25);
}
else{
lcd_gotoxy(base,2);
lcd_putc(Data);// Muestra el dato en pantalla
putcUSART (Data);
base++;
switch(Data) {
case 0x52: // NUMERO ASCII "R"
PORTB=0x0F;
__delay_ms(25);
break;
case 0x4C: // NUMERO ASCII "L"
PORTB=0xF0;
__delay_ms(25);
break;
case 0x41: // NUMERO ASCII "A"
PORTB=0xFF;
__delay_ms(25);
break;
case 0x42: // NUMERO ASCII "B"
PORTB=0x00;
__delay_ms(25);
break;
}
}
}
}
}
}
void main(void){
ADCON1=0x0F;
TRISD = 0x00;
TRISE = 0x00;
TRISB=0x00;
TRISA=0x00;
PORTEbits.RE1=0;
PORTDbits.RD0=0;
PORTDbits.RD1=0;
PORTDbits.RD2=0;
PORTDbits.RD3=0;
unsigned char base =1;
// Inicializa el USART y lo configura a 8N1, 9600 baud
OpenUSART (USART_TX_INT_OFF & // TX sin interrupción
USART_RX_INT_ON & // RX con interrupciónes
USART_ASYNCH_MODE & // Modo asincrónico
USART_EIGHT_BIT & // Modo alta velocidad
USART_CONT_RX & // Recepción continua
USART_BRGH_HIGH,129);// 9600 baudios a 20Mhz
RCONbits.IPEN = 0; // Deshabilitamos prioridades
INTCONbits.PEIE=1; // Habilitamos la interrupcion de perifericos
lcd_init();
//Delay1KTCYx(25);
lcd_putrs("USART PIC18F4550"); // Cartel inicial
INTCONbits.GIE=1; //Habilita interrupción global
while(1){ // BUCLE
if(Kbhit !=0){ // Indica que hay nuevos datos recibidos
Kbhit = 0; // Borra la marca de ISR
if(Data!=0x00){ // El dato es distinto de 0?
if(Data==0x49 & base > 0){ // Backspace & base son verdaderos?
base--;
lcd_gotoxy(base,2);
lcd_putc(" ");
PORTB=0x00;
__delay_ms(25);
}
else{
lcd_gotoxy(base,2);
lcd_putc(Data);// Muestra el dato en pantalla
putcUSART (Data);
base++;
switch(Data) {
case 0x52: // NUMERO ASCII "R"
PORTB=0x0F;
__delay_ms(25);
break;
case 0x4C: // NUMERO ASCII "L"
PORTB=0xF0;
__delay_ms(25);
break;
case 0x41: // NUMERO ASCII "A"
PORTB=0xFF;
__delay_ms(25);
break;
case 0x42: // NUMERO ASCII "B"
PORTB=0x00;
__delay_ms(25);
break;
}
}
}
}
}
}
Con respecto al codigo se puede notar que he resaltado las partes mas importantes que considero lo integra.
Primeramente hablemos de la funcion OpenUSART (); ya que es una funcion de la libreria propia de MICROCHIP para microcontroladores PIC18F en codigo C, esta funcion permite configurar y establecer la forma en que se dara la comunicacion, indicando por que medio, la velocidad, entre otros, como se detalla a continuacion:
OpenUSART (USART_TX_INT_OFF & // TX sin interrupción
USART_RX_INT_ON & // RX con interrupciónes
USART_ASYNCH_MODE & // Modo asincrónico
USART_EIGHT_BIT & // Modo alta velocidad
USART_CONT_RX & // Recepción continua
USART_BRGH_HIGH,129);// 9600 baudios a 20Mhz
USART_RX_INT_ON & // RX con interrupciónes
USART_ASYNCH_MODE & // Modo asincrónico
USART_EIGHT_BIT & // Modo alta velocidad
USART_CONT_RX & // Recepción continua
USART_BRGH_HIGH,129);// 9600 baudios a 20Mhz
Ademas, cuenta con dos funciones importantes que lo complementa, getcUSART(); y putcUSART (Data); estas dos funciones son valiosas para recibir información y para enviar por el USART.
Nuestro programa recibe la información mediante la función getcUSART y se almacena en una variable int que hemos denominado DATA, esta variable ingresara al programa principal lo cual permitirá que se ejecuten las instrucciones, finalmente se devuelve la misma variable data por la función putcUSART generando un eco. por lo tanto, podemos visualizar nuestra información recibida por el LCD 16x2 y ademas mediante un Hiperterminal visualizar que hemos
el dato retrasmitido.
Por ultimo, mediante una SWITCH(), indicamos que dependiendo del dato que se reciba se ejecuta una acción predeterminada por el puerto B como se indica a continuación:
switch(Data) {
case 0x52: // NUMERO ASCII "R"
PORTB=0x0F; // ENCENDER 4 LUCES A LA DERECHA.
__delay_ms(25);
break;
case 0x4C: // NUMERO ASCII "L"
PORTB=0xF0;// ENCENDER 4 LUCES A LA IZQUIERDA.
__delay_ms(25);
break;
case 0x41: // NUMERO ASCII "A"
PORTB=0xFF;// ENCENDER LAS 4 LUCES .
__delay_ms(25);
break;
case 0x42: // NUMERO ASCII "B"
PORTB=0x00;// APAGAR LAS 4 LUCES .
__delay_ms(25);
break;
case 0x52: // NUMERO ASCII "R"
PORTB=0x0F; // ENCENDER 4 LUCES A LA DERECHA.
__delay_ms(25);
break;
case 0x4C: // NUMERO ASCII "L"
PORTB=0xF0;// ENCENDER 4 LUCES A LA IZQUIERDA.
__delay_ms(25);
break;
case 0x41: // NUMERO ASCII "A"
PORTB=0xFF;// ENCENDER LAS 4 LUCES .
__delay_ms(25);
break;
case 0x42: // NUMERO ASCII "B"
PORTB=0x00;// APAGAR LAS 4 LUCES .
__delay_ms(25);
break;
Fig.02 PLATAFORMA MPLAB
PROGRAMA VISUAL BASIC 6.0
Primeramente, debemos determinar la comunicación por medio del bloque que tiene una imagen de teléfono, haciendo doble click en la barra de herramientas de la derecha del entrono de Visual basic 6.0, se despliega una cuadro de dialogo donde seleccionamos Microsoft comcontrol6.0.
Segundo, realizamos doble click en la pantalla de trabajo, y escribimos siguiente código que permitirá definir el medio, la velocidad entre otras características para que podamos realizar la comunicación como se detalla a continuación:
Private Sub Form_Load()
MSComm1.CommPort = 5 // INDICA EL PUERTO
MSComm1.Settings = "9600,n,8,1" // INDICA VELOCIDAD, BIT PR, TAMAÑO INFO.
MSComm1.PortOpen = True
End Sub
MSComm1.CommPort = 5 // INDICA EL PUERTO
MSComm1.Settings = "9600,n,8,1" // INDICA VELOCIDAD, BIT PR, TAMAÑO INFO.
MSComm1.PortOpen = True
End Sub
y eso es todo ya hemos establecido la comunicacion, a continuacion vamos a configurar lo botones que enviaran un dato por USART ya configurado.


MSComm1.Output = "R"
End Sub
Private Sub Command2_Click()
MSComm1.Output = "L"
End Sub
MSComm1.Output = "L"
End Sub
Private Sub Command3_Click()
MSComm1.Output = "B"
End Sub
MSComm1.Output = "B"
End Sub
Private Sub Command4_Click()
MSComm1.Output = "A"
End Sub
MSComm1.Output = "A"
End Sub
Private Sub Command5_Click()
MSComm1.Output = "I"
End Sub
MSComm1.Output = "I"
End Sub
Finalmente le damos play al programa o lo volvemos un ejecutable como nos guste , compilamos nuestro programa en el microcontrolador y tenemos de resultado lo siguiente.
SIMULACION EN PROTEUS 8.0
IMPLEMENTACION DEL PROYECTO
https://youtu.be/DLGjiVWJQjs
Podes descargar el proyecto completo y mejorarlo:
Esperando les haya servido, dejanos tus comentarios y like.
Un cordial saludo.
MICROTECSD
Lima-Peru




No hay comentarios:
Publicar un comentario