sábado, 11 de mayo de 2013

Exposición Comunicación PIC18F4550 - RS-232 - MATLAB


La comunicación serial entre un dispositivo 18f4550 de Microchip con Matlab es sencilla. En este artículo se ensayará el código necesario para la tx de datos desde Matlab para encender un led con el microcontrolador 18f4550. Para esta simulación, se configuran dos puertos virtuales usando el demo del programa Virtual Serial Port Driver v.6.

MATLAB


El código necesario para la inicializar el puerto serial es:
SerPIC = serial('COM2');
set(SerPIC,'BaudRate',2400);
set(SerPIC,'DataBits',8);
set(SerPIC,'Parity','none');
set(SerPIC,'StopBits',1);
set(SerPIC,'FlowControl','none');
La función serial crea un objeto que contiene todos los parámetros correspondientes al puerto serial como baudios, bits de datos, bit de parada, etc. Estos parámetros se los modifica con la función set.
Una vez establecidos los parámetros de la comunicación, se procede a abrir el puerto con la función fopen:
fopen(SerPIC);
La función para escribir el puerto serial es fprintf:
fprintf(SerPIC,'%s','A')
En la línea precedente se escribe en el puerto la letra A en formato string. (También es posible escribir caracteres, reemplazando %s por %c y enviando los datos con la función char.)
Una vez terminada la comunicación, se procede a cerrar el puerto con el siguiente código:
fclose(SerPIC);
delete(SerPIC)
clear SerPIC

MICROCONTROLADOR

En el microcontrolador tenemos el siguiente programa:

include "modedefs.bas"
valor var byte
trisb =%00000001
portb =%00000000
inicio:
serin portb.0,T2400,valor
if valor == "E" then high portb.1 'E->Encendido
if valor == "A" then low portb.1 'A->Apagado
goto inicio
Como se trata de una transmisión serial, siempre va la librería modedefs.bas. No olvidar que la velocidad de envío debe ser la misma que la velocidad de recepción (2400 en este caso).
En este programa si el dato recibido es “E”, enciende el pin 1 del puerto B. Si recibe “A” pone a 0 ese mismo pin.
Código matlab.m
clear all;
close all;
clc;


PS=serial('COM1');
set(PS,'Baudrate',9600); % se configura la velocidad a 9600 Baudios
set(PS,'StopBits',1); % se configura bit de parada a uno
set(PS,'DataBits',8); % se configura que el dato es de 8 bits, debe estar entre 5 y 8
set(PS,'Parity','none'); % se configura sin paridad
set(PS,'Terminator','CR/LF');% “c” caracter con que finaliza el envío
set(PS,'OutputBufferSize',1); % ”n” es el número de bytes a enviar
set(PS,'InputBufferSize' ,1); % ”n” es el número de bytes a recibir
set(PS,'Timeout',5); % 5 segundos de tiempo de espera


fopen(PS);
fclose(PS);
delete(PS);
clear PS;



PUERTO SERIAL CON MATLAB


Este es una forma básica de conectarse al puerto serial utilizando matlab.
%configurando puerto y dando de alta “s” como objeto asociado al “com1”
s=serial('COM1', 'BaudRate', 9600);
% abriendo el puerto
fopen(s);
%lee una linea de texto y la almacena en "datos" no incluye terminador
datos = fgetl(s);
%escribe datos en el puerto en binario
fwrite (s,datos);
% cerrando el puerto
fclose(s);
% borrando el objeto de memoria
delete(s)
clear s
%algunas instrucciones asociadas con este puerto en matlab
clear (serial)
delete (serial)
fgetl (serial)
fgets (serial)
fopen (serial)
fprintf (serial)
fread (serial)
fscanf (serial)
fwrite (serial)
get (serial)
instrcallback
instrfind
instrfindall
isvalid (serial)
length (serial)
load (serial)
readasync
record
save (serial)
serial
serialbreak
set (serial)
size (serial)
stopasync