You are on page 1of 15

Instituto Politcnico Nacional

Unidad Profesional Interdisciplinaria en Ingeniera y


Tecnologas Avanzadas
Ingeniera Mecatrnica MICROPROCESADORES,
MICROCONTROLADORES E INTERFAZ
Profesor: LEON PONCE MOISES
Grupo: 3MV5
Fecha: 1 de junio de 2016

Proyecto
Mdulo USART

HIPOLITO MENDEZ EROS EFREN

Objetivos

Enviar datos mediante el mdulo EUSART del PIC16F887


Comunicar el PIC16F887 y MATLAB mediante el puerto serial y el modulo
del FTDI 232
Graficar y mostrar los datos recopilados por el PIC16F887 en una interfaz
grfica.
Enviar un byte de datos de la interfaz grfica para controlar 8 leds con el
PIC16F887.

Materiales
1.
2.
3.
4.
5.
6.
7.
8.

PIC16F887
4 potencimetros
8 leds
Interruptor DIP (8 Switch)
8 resistencias de 10 kohm
8 resistencias de 270 ohm
FTDI 232 (FTDI Basic)
Matlab

PIC16f887

Mdulo EUSART
El microcontrolador PIC16F887 posee un mdulo USART, usando la norma RS232.
El EUSAR (Enhanced Universal Synchronous Asynchronous Receiver
Transmotter), puede ser configurado como un Sistema full duplex o bidireccional
asncrono, adaptndose a multitud de perifricos y dispositivos que transfieren
informacin de esta forma, tales como el monitor o el computador.
EUSART puede configurarse de tres formas:

Asncrona (Full dplex, bidireccional).


Sncrona-Maestro (Half dplex, unidireccional).
Sncrona-Esclavo (Half dplex, unidereccional).

Modo Asncrono
Las transferencias de informacin de realizan sobre dos lneas TX (Transmisin) y
RX (Recepcin), saliendo y entrando los bits por dichas lneas al ritmo de una
frecuencia controlada internamente por el USART. Las lneas de comunicacin son
los dos bits de ms peso del Puerto C: RC6/TX/CK y RC7/RX/DT, donde el bit
SPEN (RCSTA<7>) y los bits TRISC<7:6> tienen que activarse mediante un 1 con
el fin de activar dichos pines.

Generador de BAUDIOS
En el protocolo RS-232, la frecuencia de baudios (bits por segundo) a la que se
realiza la transferencia se debe efectuar a un valor normalizado: 2400, 4800, 9600,
19200, etc. Para generar esta frecuencia de Baudios, BRGH y BRG16, cuyo valor
controlado por el contenido grabado en el registro SPBRGH y SPBRG.
Frecuencia en Baudios=

F OSC
64( X +1 )

X es el valor cargado en el registro SPBRGH: SPBRG


Despejando X:
X=

F OSC
1
Frec . Baudios64

Para el PIC16F887 funcionando con una frecuencia de 4MHz en modo asncrono


y alta velocidad, con una frecuencia de 9600 baudios
BRGH=1 y BRG16=0
X=

4000000
1
960016

X =25

Si se carga el registro SPBRG con 25 la frecuencia real de trabajo ser:


Frecuencia=

4000000
=9615 baudios
16( 25+1 )

El error se genera cargando en el SPBRG ser:


Error=

96159600
100 =0.16
9600

Transmisor Asncrono
Implementacin de una transmisin en el mdulo EUSART:
1.
2.
3.
4.

Configurar las lneas RC&/TX/CK como salida y RC//RX/DT como entrada.


Poner SYNC=0 y SPEN=1 para activar el EUSART en modo asncrono.
TX9=0 para trabajar con 8 bits.
Se carga el valor X adecuado en el registro SPBRG, para producir la
frecuencia de trabajo deseada. Hay que controlar el bit BRGH y BRG16.
5. Activar la transmisin con TXEN=1. El bit TXIF tendr valor 1, cuando
TXREG se encuentra vaco.
6. Cargar en TXREG el dato a transmitir. Comienza la transmicion.

Receptor Asncrono
1. Se carga con el valor X al registro SPBRG para trabajar con la frecuencia
deseada, controlando adems el valor de BRGH y BRG16.
2. Se habilita el USART en modo asncrono con SPEN = 1 y SYNC = 0.
3. Poner RX9 = 1 para permitir la recepcin del bit 9 bits.

4. Se habilita la recepcin poniendo CREN = 1.


5. Al completarse la recepcin RCIF se pondr a 1 y se produce una
interrupcin si se haba permitido
6. Se lee el registro RCSTA y se averigua si se ha producido algn error.
7. Leer los 8 bits del registro RCREG para determinar si el dispositivo ha sido
direccionado.
8. Si se ha producido algn error, poner CREN = 0.

Conversor anlogo digital A/D del PIC16F887


Las seales analgicas abundan en nuestro entorno. Para su estudio y anlisis
detallado, requiere de su procesamiento en el computador, por tanto, se necesitan
dispositivos capaces de transformar o traducir dichas seales en digitales, para
que puedan ser enviadas
Conversor A/D de 10 bits de resolucin y 14 canales.

Resolucin
f
+Vre
1024
Vre f
Resolucin=
Si Vref+ es 5 VDC y Vref- esta referenciado a tierra
Resolucin=

Vref
1024

Resolucin=4.882

mV
bit

Registros del mdulo A/C


1.
2.
3.
4.
5.

ADRESH: Parte alta del resultado de la conversin.


ADRESL: Parte baja del resultado de la conversin.
ADCON0: Registro de Control 0.
ADCON1: Registro de Control 1.
ANSEL y ANSELH: configuracin de canales Anlogos y E/S digitales.

Configuracin del mdulo A/D

Configurar los pines que actuaran como entradas analgicas, las que
trabajan como E/S digitales y las usadas para la tensin de referencia
(ADCON1).

Seleccionar el reloj de la conversin (ADCON0).


Seleccionar el canal de entrada A/D (ADCON0).
Activar el mdulo A/D(ADCON0).

Utilizando los bits CHS3, CHS2, CHS1 y CHS0 se selecciona el pin donde se
llevar acabo la lectura analgica

Inicio de la conversin y lectura

Colocar en 1 el bit GO/DONE (ADCON0).


Por la exploracin del bit GO/DONE, que al completarse la conversin se
convierte a 0.
Leer el resultado en los 10 bits validos de ADRESH: ADRESL

De esta manera a una entrada analgica de 0 V le corresponde un valor digital de


00 0000 0000 y para 5 V, un valor de 11 1111 1111. La tensin de referencia
determina los limites mximo y mnimo de la tensin analgica que se puede
convertir

FTDI 232

SparkFun tiene una lnea de productos de USB a serial UART diseados para
permitir al usuario comunicar con serial UART a travs de un puerto USB comn.
Actualmente es ms difcil encontrar un ordenador con puerto serial UART y muy
comn encontrar dispositivos seriales.
RS-232 es un estndar completo, no solamente incluyendo caractersticas
elctricas, sino caractersticas fsicas y mecnicas, como una conexin de
hardware, pin-outs, nombres de seales. Una interfaz punto a punto, RS-232 es
capaz de lograr a distancias moderadas velocidades de hasta 20-Kbps. Aunque no
se especifique en el estndar, velocidades ms altas de 115.2Knps son posibles
en distancias relativamente cortas

Comunicacin Serial MATLAB


La comunicacin en la computadora se llev a cabo mediante MATLAB usando los
comandos asociados al control del puerto serial
delete(instrfind({'port'},{'COM7'}));
puerto=serial('COM7');
puerto.BaudRate=9600;
fopen(puerto);
valorADC=fread(puerto,5,'uint8')

La interfaz grfica se realiz me el GUIDE Quick Start

El cdigo siguiente controla el puerto serial y lo grafica utilizando la funcin


drawnow para dibujar la grfica en tiempo real
% --- Executes just before GuiProyecto is made visible.
function GuiProyecto_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;

Se establece el estado inicial de los botones para controlar los leds


set(handles.radiobutton1,'Value',1);
set(handles.radiobutton2,'Value',1);
set(handles.radiobutton3,'Value',1);
set(handles.radiobutton4,'Value',1);
set(handles.radiobutton5,'Value',1);
set(handles.radiobutton6,'Value',1);
set(handles.radiobutton7,'Value',1);
set(handles.radiobutton8,'Value',1);
set(handles.radiobutton9,'Value',1);

Se borran los datos de el COM7 antes de iniciarlo


delete(instrfind({'port'},{'COM7'}));

Se direccionan los datos del COM7 a un objeto nombrado puerto y se configura la


velocidad de transmisin
puerto=serial('COM7');
puerto.BaudRate=9600;

Se inicia el puerto
fopen(puerto);
voltaje=0;
axes(handles.axes1);

Se crean 4 vectores con la configuracin de las lneas que se graficaran y se


establecen otros parmetros de la grafica
l1=line(nan,nan,'Color','magenta','LineWidth',1);
l2=line(nan,nan,'Color','r','LineWidth',1);
l3=line(nan,nan,'Color','b','LineWidth',1);
l4=line(nan,nan,'Color','g','LineWidth',1);
title('GRAFICA VOLTAJE ADC-SERIAL');
xlabel('Numero de Muestras');
ylabel('Voltaje (V)');
grid on;

grid minor
hold on;

Se establece la frecuencia de muestreo de la grfica y la cantidad de datos


Fs=20;
N=400;

Se crean 4 vectores llenos de 0, para el ciclo que recorrer los datos


y2=zeros(N,1);
y3=zeros(N,1);
y4=zeros(N,1);

Vector de tiempo y limetes de la grafica


t=linspace(0,(N-1),N);
ylim([-0.1 5.1]); %Limites del eje y
xlim([0 N]); %Limites del eje x

Ciclo permanente
tic
while 1

Se lee el estado de los botones que controlaran los leds y se convierten en un


valor decimal guardndolo en la variable dato
b0=get(handles.radiobutton1,'Value');
b1=get(handles.radiobutton2,'Value');
b2=get(handles.radiobutton3,'Value');
b3=get(handles.radiobutton4,'Value');
b4=get(handles.radiobutton5,'Value');
b5=get(handles.radiobutton6,'Value');
b6=get(handles.radiobutton7,'Value');
b7=get(handles.radiobutton8,'Value');
b8=get(handles.radiobutton9,'Value');
dato=b0+(2*b1)+(4*b2)+(8*b3)+(16*b4)+(32*b5)+(64*b6)+(128*b7);

Se escribe el valor de dato en el puerto abierto


fwrite(puerto,dato,'uint8');

Se leen los valores recibidos por el pic y se crea un vector de 5 datos cada dato de
1 byte
valorADC=fread(puerto,5,'uint8') %Toma el valor recibido por el puerto y lo
guarda en la variable

Se guarda cada valor del vector en diferentes variables y se hace la conversin a


voltaje
voltaje=valorADC(1)*5/255; %Hace la conversin a voltaje
voltaje2=(valorADC(2)*5/255); %Hace la conversin a voltaje
voltaje3=valorADC(3)*5/255;
voltaje4=valorADC(4)*5/255;
valorsw=valorADC(5);
valorbin=dec2bin(valorADC(5),8);

Se imprimen los datos en diferentes edit text


set(handles.edit3,'String',voltaje);
set(handles.edit4,'String',voltaje2);
set(handles.edit5,'String',voltaje3);
set(handles.edit6,'String',voltaje4);
set(handles.edit1,'String',valorbin);
set(handles.edit2,'String',valorsw);
set(handles.edit8,'String',dato);

Se guarda cada dato recibido en su vector que lo graficara, recorriendo los datos
en una posicin y guardando el dato en el ltimo lugar y se grafica utilizando
drawnow

if toc>(1/Fs)
tic;
y(1:end-1)=y(2:end);
y(end)=voltaje;
y2(1:end-1)=y2(2:end);
y2(end)=voltaje2;
y3(1:end-1)=y3(2:end);
y3(end)=voltaje3;
y4(1:end-1)=y4(2:end);
y4(end)=voltaje4;
set(l1,'XData',t,'YData',y)
set(l2,'XData',t,'YData',y2)
set(l3,'XData',t,'YData',y3)
set(l4,'XData',t,'YData',y4)
drawnow
end
end
% Update handles structure

Se cierra el puerto y se borra el objeto creado


fclose(puerto);
delete(puerto);
guidata(hObject, handles);

Implementacin de la comunicacin UART con el


PIC16F887
Declaracin de variables a usar
int advalue = 0;
int advalue1 = 0;
int advalue2 = 0;
int advalue3 = 0;
int LEDC = 0;
int VSW = 0;
int i=1;
///////////////////////////////////////////////////
main()
{

Configuracin de puertos
PORTA = 0;
TRISA = 0xFF;//ENTRADA
PORTB = 0x00;
TRISB = 0x00;//SALIDA
PORTC = 0x00;
TRISC = 0xFF;//PIN RC7 ENTRADA RC0->RC6 SALIDA
TRISD = 0xFF;//ENTRADA

Configuracin del puerto A como canal analgico y el B como canal digital


ANSEL =1;
ADCON1 = 0b00110000;
PORTA = 0;
ANSELH = 0;
CM1CON0 = 0;
CM2CON0 = 0;

//PUERTO A ANALOGICO
//PUERTO B DIGITAL
// Initialize Comparator 1 off
// Initialize Comparator 2 off

Configuracin del mdulo EUSART


BRGH=1;
BRG16=0;
SYNC=0;

SPEN=1;

Configuracin de la recepcin y envi de datos de 8 bits


TX9=0;
RX9=0;

Se habilita la transmisin
TXEN=1;

Se carga en SPBRG el valor que determinara la velocidad de la comunicacin (En


este caso un 25 decimal o 19 hexadecimal para 9600 Baudio tomando en cuenta
la frecuencia de PIC de 4 Mhz)
SPBRG=0x19;

Ciclo permanente
while(1==1)
{

Se inicia la recepcin con CREN


RCIF =0;
CREN=1;
while (RCIF==0) //wait for A/D to finish
{
}

Se carga el valor de RCREG cuando RCIF se pone en 1 indicando que el registro


termino la recepcin y luego se mueve al puerto B
LEDC=RCREG;
PORTB=LEDC;

Si OERR se ha puesto en 1 significa que ha ocurrido un error en la recepcion, por


lo cual se detiene la recepcin configurando CREN en 0 para despus volver a
activarla
if (OERR==1)
{
CREN=0;
}

Con la variable i previamente configurada con un 1 se lee el dato de AN0


despus de la conversin del A/D y se manda. Al mandar el dato se configura i
como 2 para leer la conversin del siguiente pin
if(i==1)
{
i=2;
ADCON0 = 0b00000001;
GODONE = 1; //Start A/D process
while (GODONE ==1)
//wait for A/D to finish
{
}
advalue = ADRESH;
TXREG=advalue;
ADRESH=0;
ADRESL=0;
pause(10);
}

Con la variable i previamente configurada con un 2 se lee el dato de AN1


despus de la conversin del A/D y se manda. Al mandar el dato se configura i
como 3 para leer la conversin del siguiente pin
if(i==2)
{
i=3;
ADCON0 = 0b00000101;
GODONE = 1; //Start A/D process

while (GODONE ==1)


{
}
advalue1 = ADRESH;
TXREG=advalue1;
ADRESH=0;
ADRESL=0;
pause(10);
}

//wait for A/D to finish

Con la variable i previamente configurada con un 3 se lee el dato de AN4


despus de la conversin del A/D y se manda. Al mandar el dato se configura i
como 4 para leer la conversin del siguiente pin
if(i==3)
{
i=4;
ADCON0 = 0b00010001;
GODONE = 1; //Start A/D process
while (GODONE ==1)
//wait for A/D to finish
{
}
advalue2 = ADRESH;
TXREG=advalue2;
ADRESH=0;
ADRESL=0;
pause(10);
}

Con la variable i previamente configurada con un 4 se lee el dato de AN5


despus de la conversin del A/D y se manda. Al mandar el dato se configura i
como 5 para leer la conversin del siguiente pin
if(i==4)
{
i=5;
ADCON0 = 0b00010101;
GODONE = 1; //Start A/D process
while (GODONE ==1)
//wait for A/D to finish
{
}
advalue3 = ADRESH;
TXREG=advalue3;
ADRESH=0;
ADRESL=0;
pause(10)
}

Con la variable i previamente configurada con un 5 se lee el dato del puerto D, se


guarda en la variable VSW y luego se enva
if(i==5)
{
i=1;
VSW=PORTD;
TXREG=VSW;
pause(10)
}
pause(50)
} //End while
}
//End main

Conexiones

Funcionamiento
Seales muestreadas en MATLAB y generadas al variar los
potencimetros conectados al PIC

Leds prendidos al recibir el dato del ordenador

You might also like