domingo, 23 de marzo de 2014

PRUEBA DE LABVIEW CON MICROCONTROLADOR AVR

                              El siguiente programa tiene como único fin conocer con que datos realiza la comunicación en el protocolo RS232 el programa LABVIEW para posteriormente realizar un sistema de control con ayuda de este programa. Para ello se utilizo un microcontrolador AVR el cual devuelve el dato enviado por LABVIEW para ser presentado en una barra.


DESARROLLO:

                              El programa en microcontrolador no tiene mayor complejidad, ya que recibe y reenvía los datos recibidos convertidos para que sean interpretados por el software utilizado en la computadora, aunque para este caso se modificaron para hacer uso de funciones, aclarando que podría reenviarse la información y únicamente tendría que seleccionarse los componentes adecuados en LABVIEW para interpretarlos.

MICROCONTROLADOR:

                              
CONCATENAR(unsigned char datos):

                                 Esta función realiza la conversión del dato tipo char en decimal en su correspondiente carácter para ser enviado por el microcontrolador y así poder ser interpretado.

unsigned char concatenar(unsigned char datos)

DESCONCATENAR(unsigned char dato):

                               La siguiente función realiza la conversión de los datos recibidos por el microcontrolador de caracteres a su decimal correspondiente y así poder tratarlo y reenviarlo en el formato que desee.

unsigned char desconcatenar(unsigned char dato)

ISR(USART_RX_vect):

                               Realiza la recepción y envió de información a través del UART cada vez que sucede una interrupción, esto sucede cada vez que el microcontrolador tiene un dato sin leer en el buffer de entrada.

for (i=0;i<2;i++)
{
    recibido[i]=ReceiveUART0();
}
           
                                   Una vez recibido los datos se convierten a su correspondiente valor en decimal y nuevamente se convierten a caracteres esta vez en el formato de caracteres decimales a diferencia de los caracteres hexadecimales con los que LABVIEW fue programado en esta ocasión.

for (i=0;i<2;i++)
{
valor[i]=desconcatenar(recibido[i]);
}

n=valor[0]*16+valor[1];

valor1[0]=n/100;
valor1[1]=(n-100*valor1[0])/10;
valor1[2]=n-100*valor1[0]-10*valor1[1];
valor1[3]=0x0A;
for (i=0;i<3;i++)
{
enviar[i]=concatenar(valor1[i]);
}

                                   Se envían los datos convertidos y para finalizar  el carácter que indica que la cadena ha terminado esto es para que LABVIEW reconozca cuando debe dejar de esperar a recibir.

for (i=0;i<4;i++)
{
TransmiteUART0(enviar[i]);
}

}

LABVIEW:

                               El programa realizado en LABVIEW consta de una perilla que envía valores de 0 a 255 a través del puerto serial bajo los siguientes parámetros de comunicación:


  • BAUDRATE DE 9600
  • 8 BITS DE DATOS
  • SIN PARIDAD
  • 2 BITS DE STOP
  • SIN CONTROL DE FLUJO DE DATOS
  • TIMEOUT DE 2 SEGUNDOS

                             
                               El programa envia el dato seleccionado en la perilla convertido a una cadena en hexadecimal, lo cual recibe el microcontrolador, una vez realizado esto recibe los datos enviados por el microcontrolador y los presenta en la barra y en forma numérica para conocer el valor exacto. 
                               Cabe aclarar que la simulación con ISIS PROTEUS no realiza del todo bien la recepción de datos por lo que podría ser se muestra un vídeo con el funcionamiento del circuito ensamblado.






NOTA:
                      Alguna duda, aclaración o recomendación puede ingresarla en los comentarios para ayudarnos a mejorar la presentación de los programas y si lo desean incrementar la información que se presenta. El link de los programas se dejara la final para que puedan ser descargados.



PROGRAMA:

/*
 * PRUEBA.c
 *
 * Created: 19/03/2014 0:00:19
 *  Author: TERRAFORMARS
 */ 


#include <avr/io.h>
#ifndef F_CPU
#define F_CPU 8000000UL // XTAL de 8 MHz
#endif
#include "UARTAiNit.h"
#include <util/delay.h>
#include <avr/interrupt.h>

#define setbit(sfr,bit) (_SFR_BYTE(sfr)|=(_BV(bit)))
#define clearbit(sfr,bit) (_SFR_BYTE(sfr)&=~(_BV(bit)))
#define bittoggle(sfr,bit)(_SFR_BYTE(sfr)^=_BV(bit))

unsigned char valor[4]={0},recibido[2]={0},unidad=0,enviar[4]={0},i=0,valor1[4]={0},n=0;



unsigned char concatenar(unsigned char datos){

switch(datos){

case 0:
unidad='0';
break;
case 1:
unidad='1';
break;
case 2:
unidad='2';
break;
case 3:
unidad='3';
break;
case 4:
unidad='4';
break;
case 5:
unidad='5';
break;
case 6:
unidad='6';
break;
case 7:
unidad='7';
break;
case 8:
unidad='8';
break;
case 9:
unidad='9';
break;
}
return unidad;
}

unsigned char desconcatenar(unsigned char dato){

switch(dato){

case '0':
unidad=0;
break;
case '1':
unidad=1;
break;
case '2':
unidad=2;
break;
case '3':
unidad=3;
break;
case '4':
unidad=4;
break;
case '5':
unidad=5;
break;
case '6':
unidad=6;
break;
case '7':
unidad=7;
break;
case '8':
unidad=8;
break;
case '9':
unidad=9;
break;
case 'A':
unidad=10;
break;
case 'B':
unidad=11;
break;
case 'C':
unidad=12;
break;
case 'D':
unidad=13;
break;
case 'E':
unidad=14;
break;
case 'F':
unidad=15;
break;


}
return unidad;
}
ISR (USART_RX_vect){
for (i=0;i<2;i++)
{
    recibido[i]=ReceiveUART0();
}
//recibido[1]-=72;
for (i=0;i<2;i++)
{
valor[i]=desconcatenar(recibido[i]);
}

n=valor[0]*16+valor[1];

valor1[0]=n/100;
valor1[1]=(n-100*valor1[0])/10;
valor1[2]=n-100*valor1[0]-10*valor1[1];
valor1[3]=0x0A;
for (i=0;i<3;i++)
{
enviar[i]=concatenar(valor1[i]);
}

for (i=0;i<4;i++)
{
TransmiteUART0(enviar[i]);
}

}


int main(void)
{

initializeUART0(9600,0,8,2,2);
setbit(UCSR0B,RXCIE0);
sei();

    while(1)
    {
        //TODO:: Please write your application code 
    }
}


VÍDEO:



IMÁGENES:

PROGRAMA EN ATMEL STUDIO:



PANEL FRONTAL DE LABVIEW:


DIAGRAMA DE BLOQUES DE LABVIEW:



SIMULACIÓN ISIS PROTEUS:


SIMULACIÓN DE LABVIEW:



SIMULACIÓN DE LABVIEW E ISIS:



 LINKS:

MICROCONTROLADOR:
https://mega.co.nz/#!c09VyZwC!2Y7yWezOecvfrO8jY5wJuuKVZasF9r38mZkbYjoTWYk

LABVIEW:
https://mega.co.nz/#!o0EQ1JoQ!2EhECFAleAXO_tjTuQeGv3Jusv2lAb4pskqaDHwgIqg












No hay comentarios:

Publicar un comentario