lunes, 24 de agosto de 2020

lab 11

 

LAB 11 - Comunicación serial con PIC

CURSO DE PROGRAMACIÓN DE MICROCONTROLADORES PIC

PARTE A: Programación de Microcontroladores PIC de MICROCHIP.

COMUNICACIÓN SERIAL CON PIC

 

CAPACIDAD TERMINAL

  • Utilizar al microcontrolador en aplicaciones de control electrónico.
  • Desarrollar y ejecutar programas en un microcontrolador PIC
  • Programar y configurar interfaces básicas del microcontrolador.

COMPETENCIA ESPECIFICA DE LA SESION

  • Conocer el funcionamiento del módulo de comunicación USART
  • Aplicar estos conocimientos para la transmisión y recepción de datos.

CONTENIDOS A TRATAR

  • Funcionamiento del módulo USART
  • Programa de aplicación USART.

RESULTADOS

  • Diseñan y optimizan sistemas y procesos para cumplir con las condiciones establecidas y gestionando adecuadamente los recursos materiales y humanos.

MATERIALES Y EQUIPO

  • CCS Compiler instalado.
  • Entrenador de PICS
  • PIC16F877A
  • Guía de Laboratorio. El trabajo se desarrolla de manera GRUPAL.
  • PC con Software de simulación.

MARCO TEÓRICO:

La comunicación serial es una de las más simples que podremos emplear en nuestro microcontrolador PIC para poder visualizar información de interés en nuestro computador.

La comunicación UART o comunicación serial sólo utiliza tres líneas: una para recibir los datos Rx, otra para trasmitir los datos Tx y la línea común GND.

En nuestro caso especifico para el PIC16F887 las lineas TX y RX corresponden a los pines 25 y 26 (Puerto RC6 y RC7 respectivamente) como puede ser observado en la siguiente figura. Para cualquier otro PIC, solo basta con buscar donde están ubicados estos pines con ayuda del datasheet.

Comunicacion Serial con PIC

Pines para la Comunicación Serial con PIC

NOTA: El pic 16F887 solo tiene un puerto UART fisico, es por eso que solo tiene un solo RX y un solo TX para realizar la comunicación serial. Existen otros PICS que poseen más de un UART facilitando realizar varias comunicaciones con el dispositivo al tiempo. Si necesitamos adicionar mas puertos de comunicación serial con pic, podremos hacerlo con ayuda del PIC C Compiler creando UARTS VIRTUALES, esto sera detallado abajo en el post en el TERCER EJEMPLO, para verlo debes compartir el post.

Cada dato se transmite bit a bit, un bit a la vez, por lo tanto se hace mucho más lenta, pero tiene la ventaja de necesitar menos líneas y las distancias a las cuales se puede transferir la información son mayores, además con el uso de los módem se puede trasmitir a cualquier parte del mundo.

Comunicación serial RS232


Comunicación serial RS232

Existen dos formas de comunicación serial:

  • Sincrónica?
  • Asincrónica

Comunicación Serie Sincrónica

Para realizar esta configuración de la comunicación, se requiere adicionar una linea que contenga pulsos de reloj que indiquen que el dato que viaja en la otra linea de datos es válido; la duración del bit está determinada por la duración del pulso de  sincronismo.

Comunicación Serie Asincrónica

En esta comunicación los pulsos de reloj no son necesarios y se utilizan otros mecanismos para realizar la transferencia de datos.

La duración de cada bit esta determinada por la velocidad con la cual se realiza la trasferencia de datos, por ejemplo si se transmite a 1200 bits por segundo (baudios), la duración de cada bit es de 833 micro segundos. 

Las velocidades de transmisión más comunes son 300, 600,1200, 2400, 9600, 14400 y 28800 baudios.

En esta entrada solo se estudia la comunicación asincrónica.

comunicación serial: señal asincrona
comunicación serial: señal asincrona

En la figura anterior se muestra la forma como se trasmite un dato cuando se realiza alguna transferencia:

  1. La línea del transmisor permanece en alto.
  2. Para empezar a transmitir datos esta línea se pone en bajo durante un bit, lo cual se conoce como bit de Start.
  3. Se comienza a transmitir los bits correspondientes al dato, empezando por el bit menos significativo (LSB) y terminando con el más significativo (MSB).
  4. Al finalizar se agrega el bit de paridad, si está activada esta opción.
  5. Por último los bits de stop, que pueden ser 1 o 2, en los cuales la línea regresa a nivel alto. 

    En el ejemplo de la figura, después del bit de start se trasmite el dato 01001011 y al final hay un bit de stop.

Esto significa que la configuración de la transmisión serial es: 1 bit start, 8 bits datos, no paridad y 1 bit de stop.

El receptor no está sincronizado con el transistor y no sabe cuando va a recibir datos.

La transición de alto a bajo de la línea del transmisor, activa el receptor y este generan un conteo de tiempo de tal manera que realiza una lectura de la línea medio bit después del evento; si la lectura realizada es un estado alto, asume que la transición ocurrida fue ocasionada por ruido en la línea; si por el contrario la lectura es un estado bajo, considera como válida la transición y empieza a realizar lecturas secuenciales a intervalos de un bit hasta conformar el dato transmitido.

Lógicamente tanto el transmisor como el receptor deberán tener los mismos parámetros de configuración (velocidad, número bits del dato, paridad y bits de parada).

Si deseamos comunicar nuestro microcontrolador con el computador, tenemos que conectar nuestro PIC al puerto serial que traen principalmente los ordenadores de escritorio:

puerto serial
puerto serial

Y para lograr dicha comunicación con nuestro computador, es necesario utilizar un circuito integrado adicional llamado MAX232.

El MAX232 (Enlaces a un sitio externo.) es un circuito integrado de Maxim que convierte las señales de un puerto serie RS-232 a señales compatibles con los niveles TTL (Enlaces a un sitio externo.) de circuitos lógicos. El MAX232 sirve como interfaz de transmisión y recepción para las señales RX, TX, CTS y RTS.

DB9
DB9

El siguiente esquema es para conectar nuestro pic al computador con ayuda del integrado MAX232 con un cable DB9.

comunicación serial max232
comunicación serial max232

El problema principal que tenemos con este tipo de comunicación, es que el puerto serial de los computadores ya fue abolido hace mucho tiempo, y por eso en computadores actuales, no vamos a encontrar este tipo de puerto. Para dar solución a este problema, podemos usar un conversor SERIAL-USB el cual podemos comprar en cualquier tienda informatica:

conversor serial usb
conversor serial usb

O podemos utilizar un circuito integrado, que generalmente se encuentran en estos conversores SERIAL-USB, llamado FT232, este integrado generalmente viene en una placa electronica ya lista para ser usada, y lo unico que debemos hacer es energizarla y conectar los terminales RX y TX de nuestro microcontrolador a esta placa.

ft232

 

 

Para entender el funcionamiento de forma práctica, realizar el siguiente proyecto:

DIAGRAMA ESQUEMÁTICO:

diagrama serial.png

 

CÓDIGO DE PROGRAMACIÓN EN PIC C COMPILER:


#include <16F873A.h>
#FUSES NOWDT, HS, PUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT, RESERVED
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include <LCD.C>

int contador=1;
char data;

void main()
{
lcd_init();

Printf("PC OK");
printf(lcd_putc,"LCD OK");
delay_ms(1000);
printf(lcd_putc,"\f");

while (1)
{
data=getc();
printf(lcd_putc,"%c", data);
if (data==13)
printf(lcd_putc,"\n");
if (data==8)
printf(lcd_putc,"\f");
if (data=='1')
output_high(PIN_C0);
if (data=='0')
output_low (PIN_C0);
}
}

#include <16F873A.h>
#device adc=10
#FUSES NOWDT, HS, PUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT, RESERVED
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#include <LCD.C>

char dato;
int contador=0;
int16 analogico;

#int_RDA
void RDA_isr(void)
{
dato=getc();
printf(lcd_putc,"%c",dato);

if (dato==13)
lcd_gotoxy(1,2);
if (dato==8)
printf(lcd_putc,"\f");
}

void main()
{
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
lcd_init();
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);

Printf("Comunicación Serial");
printf(lcd_putc,"LCD OK");
delay_ms(2000);
printf(lcd_putc,"\f");

while (true)
{
if (input(PIN_A1))
{
++contador;
Printf("\rBienvenido visitante %u", contador);
while(input(PIN_A1)) {}
}

if (input(PIN_A2))
{
set_adc_channel (0); //lectura del canal analogico 3
delay_us (20);
analogico = read_adc (); // Leemos Canal A3
Printf("\rValor Analogico: %lu", analogico);
while(input(PIN_A2)) {}
}
}

}

 

 

 

VIDEO EXPLICATIVO:




No hay comentarios:

Publicar un comentario