miércoles, 2 de agosto de 2017

INTERRUPCIONES CON EL MICROCONTROLADOR PIC 18F4550

EL microcontrolador es un dispositivo que ejecuta tareas de manera secuencial; estas tareas son indicadas mediante un algoritmo que puede ser en Assembler, C, ect. El integrado interpretar y ejecuta linea por linea, pero que sucede cuando deseamos que realice una acción "B"cuando el microcontrolador esta ejecutando una acción "A"; para dar solución a tal problema, se utilizan las interrupciones que sera tema de discusión en el presente articulo.

                                        IMAGEN 1.0 / Proyecto Interrupción con PIC18F4550

Pero, ¿ Que son las Interrupciones ? y para que sirven.
Para dar respuesta a esta pregunta explicaremos mediante el siguiente diagrama de bloques de la imagen 2.0.: 


L
                   IMAGEN 2.0 / DIAGRAMA DE BLOQUES INTERRUPCIÓN


En el diagrama de bloques de la Izquierda tenemos un programa principal, cuando se genera una interrupción el programa se detiene y atiende esta llamada , si la interrupción es de alta prioridad se atiende de manera inmediata, las lineas punteadas que indican hacia la derecha muestran el diagrama de bloques del programa determinado de la interrupción; finalmente cuando termina, regresa al programa principal he inicia donde se genero la interrupción.

Para contextualizar este Tema, hagamos un proyecto el cual incluya un led que parpadea de manera ininterrumpida por el Puerto RD0, por otro lado, un botón en el puerto RBO por donde
se genera la interrupción y cambiara el estado de un led ubicado en el puerto RD1.
(Ver Imagen 1.0)

Con este ejemplo, podremos ver como es el funcionamiento de la interrupción de alta prioridad, así mismo, como pareciera que el microcontrolador ejecutara las dos funciones al mismo tiempo, pero en realidad ejecuta una instrucción a la vez.



Analicemos el Código: 

/*
 * File:   fhd.c
 * Author: GUILLERMO ANGULO NIQUEN
 * BLINK LED AND INTERRUPCION.
 * Created on 25 de MAYO de 2017, 0:29 A.M.
 */
#include <xc.h>
#include "INICIALIZASISTEMA.h"
#include "DELAY.h"
#define mybit  LATDbits.LATD0 // ETIQUETAMOS EL PIN PORTB RB4 COMO mybit.
#define mybit2 LATDbits.LATD1 // ETIQUETAMOS EL PIN PORTB RB4 COMO mybit.
// Programa Principal
int main(void) {
    // CONFIGURAMOS LOS PUERTOS
    TRISDbits.RD0=0; // CONFIGURAMOS AL PIN COMO SALIDA.
    TRISDbits.RD1=0; // CONFIGURAMOS AL PIN COMO SALIDA.
    //INT0 (RB0) es entrada
    TRISBbits.RB0 = 1;
     //Leds apagados
    LATDbits.LATD0 = 0;
    LATDbits.LATD1 = 0;
    //Configuración de INT0
    INTCONbits.GIE = 1; //Habilitando interrupciones
    INTCONbits.INT0IE = 1; //Habilitar INT0
    INTCON2bits.INTEDG0 = 1; //Interrupción se activa en flanco de subida
while(1){              
    mybit=1; // enciende led 
    MsDelay(150);
    mybit=0;// apaga led.
    MsDelay(150);
}

// Programa Interrupción
}
void interrupt high_isr()
{
 if(INT0IF) //Si la bandera de interrupción es 1
 {
 mybit2 = ~mybit2; //Se invierte el estado del led
 MsDelay(150);
 //inicializar bandera
 INT0IF = 0;
 }
}

SIMULACIÓN EN LA PLACA ENTRENADORA: 


Finalmente, se logro el objetivo de obtener un sistema donde podamos ejecutar varias funciones sin interrupir el proceso principal, mediante las interrupciones.


MICROTECSD 
Telf.: 978519228

Cursos, eventos y capacitaciones.







INTERFAZ VISUAL BASIC & MICROCONTROLADOR PIC18F POR PUERTO RS232-USB.

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.


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
 */
#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;
//****************** 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
 }
}
//********************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;

                             }
                         }
                   }
              }
        }
}

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


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;




XL

           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

y eso es todo ya hemos establecido la comunicacion, a continuacion vamos a configurar lo botones que enviaran un dato por USART ya configurado.


                           



Private Sub Command1_Click()
         MSComm1.Output = "R"
End Sub

Private Sub Command2_Click()
        MSComm1.Output = "L"
End Sub

Private Sub Command3_Click()
         MSComm1.Output = "B"
End Sub

Private Sub Command4_Click()
        MSComm1.Output = "A"
End Sub

Private Sub Command5_Click()
       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


                                   

BUSCANOS: https://www.facebook.com/MICROTECSD/https://www.facebook.com/MICROTECSD/


martes, 1 de agosto de 2017

CONMUTAR BITS-NIVEL BASICO-MPLAB IDE XC8 - PIC18F4550

El presente ejercicio tiene como finalidad el uso de la etique "#define" muy famosa utilizada en el compilar MPLAB IDE XC8 de Microchip.

El objetivo es etiquetar a los pines del microcontrolador :

                                                                # define  mybit  PORTBbits.RB4 

Lo que buscamos es indicar que el pin RB4 del puerto B se llame mybit y por que mybit ? , pues en realidad pude a ver sido cualquier nombre, les invito a que le pongan uno, esto se hace con la finalidad de volver mas intuitivo al programa, ya que así logramos familiarizar el software, asi mismo, para futuras actualizaciones podamos interpretar rápidamente y relacionarlo con el hardware.

Hagamos un ejemplo: 


Hacer un programa que conmute un bit RB4 entre 0 y 1, para tal fin utilizaremos un microcontrolador PIC18F4550. 


Vamos a comentar el codigo: 

#include <xc.h>   // por defecto indica las caracteristicas intrinsecas del microcontrolador.
#include "INICIALIZASISTEMA.h"  // sub programa creado para almacenar los #Pragma.
#include "DELAY.h"  // sub-progra,a para crear un tiempo de espera.
#define mybit PORTBbits.RB4 // Nombramos EL PIN PORTB RB4 COMO mybit.

int main(void) {      // programa principal.
    TRISBbits.RB4=0; // CONFIGURAMOS AL PIN COMO SALIDA.
while(1){                // BUcle infinito.
    mybit=1; // enciende led  
    MsDelay(150);   //
    mybit=0;// apaga led.
    MsDelay(150);
}
}
 
Finamente, quemanos nuestro microControlador mediante un PICKIT2 o PICKIT3 y procedemos a implementar el proyecto mediante un Protoboard, simulado en Proteus 8 o podrian comprar una placa entrenador HIFI KITS en venta en paruro para microcontroladores de gama media PIC18F, pues vallamos a ver como resulta: 



En síntesis, hemos logrado que el microcontrolador envié pulsos en un pin determinado que hemos denominado mybit,  

las aplicaciones que podemos darle a este proyecto  para adornar el arbol de navidad, encender en un determinado periodo de tiempo una lampara, encender una luz del pasadizo 
cuando cae la noche o simplemente calentar la terma por las noches a un determinado horario, ya que este sistema de control lo podemos conectar con un sistema de control de Potencia como Reles, triac,, diac, ect para encender equipos en contacto con corriente alterna, pues la imaginación es el limite.