Está en la página 1de 66

Procesadores

Continuación diseño de un Dimmer Embebido.


Inicio tema comunicaciones seriales la USART.
Manejo de cadenas..!!!!!!!!!!!
Comparalas, copiarlas unas en otras, empatarlas
Separa.
Resolver el problema del sincronismo:

Eso se hace con una interrupción externa que no


tiene mayor dificultad.
Estudiemos el Programa dimerpot
Comunicaciones seriales con USART.
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.
Tradicionalmente los computadores se
comunicaban por el puerto RS232 (Com)
Pero eso ya no existe, a lo sumo puertos USB o
bluetooth.
Lo que si se hace es que para poder atender
comunicaciones seriales en maquinas sin puerto
norma RS232
Se emulan en una conexión USB (dongles)
Originalmente se usaban niveles de tensión grandes y separados
sobre todo para evitar perdidas en los cables y proporcionar algo
de rechazo al ruido.

Se puede encontrar una norma similar pero en cables que


transportan corriente o el conocido RS485 (industrial). La
corriente es igual en todo el cable. (muy bueno esto)
https://proyectoarduino.com/comunicaciones-con-rs485
/
Ojo Pilas!..
No confunda norma con protocolo
Norma es un asunto físico.
Rs232
RS405
Etc son normas que especifican:
Conectores físicos
Niveles de tensión
Tipo de señal
Velocidad
Topología de red. ….etc.
Protocolo es un asunto lógico.
Por ejemplo la lógica de una USART se puede adaptar a cualquier norma por Software.
Mandar datos binarios en formato serie asíncrono. Se
reduce a mover de 0 a 1 o de 1 a 0, niveles de tensión
en un puerto digital de un procesador.
Siete Septetos ASCII por ser solo caracteres
Pero pueden se también 8 bits. (eso se logra
configurando el hardware)
Ese margen se logra insertando y declarando bits de
parada, uno o dos.
Su intención es que los sistemas se esperen a que los
procesadores procesen la información.
Ósea no se ahoguen con los datos. Por si alguien es
muy veloz.

Para controlar errores en la capa física. Lo mas


incipiente se hace con los bits de paridad.
Juguemos con proteus y una consola serial

Lancemos datos y miremos con osciloscopio

Requerimos una consola


Y virtualizar un puerto
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.
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.
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.
Existen dos formas de comunicación serial:
•Sincrónica?
•Asincrónica
Comunicación Serial Sincrónica
Para realizar esta configuración de la comunicación, se
requiere adicionar una línea 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.
Fin de la clase del Jueves 11 de nov
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 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.
1.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).
Pasos para trabajar con comunicación serial con pic:
1. En el encabezado del programa incluir la directiva:
Temas de software
Instrucciones necesarias para
establecer una comunicación
serial asíncrona
RS232
#USE RS232(BAUD=BAUDIOS, XMIT=PIN, RCV=PIN)

Baud: Velocidad en baudios (bits por segundo).


Xmit: Bit que transmite (Tx)
RCV: Bit que recibe (Rx)
2. En el programa principal enviar o recibir un
carácter.
Para recibir un carácter se usa la instrucción.

C=getc(); // Esta instrucción espera un carácter por el pin RCV del


//puerto RS232 y retorna el carácter recibido.
Hacen lo mismo las instrucciones

GETCH() y GETCHAR()

Para enviar un carácter se usa la instrucción

PUTC() //Esta instrucción envía un carácter a la patica XMIT del


//dispositivoRS232.
Hace lo mismo la instrucción

PUTCHAR( )

NOTA: Entre los paréntesis va el caracter a enviar.


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 informática.

Otra interfaz muy común es el dongle USB-TTL para prototipos.


Requiere instalar un driver en Windows. (pueden darse problemas de
compatibilidad según la versión del Windows)
Comunicación serial ejemplos:
Ejemplo 1: comunicación serial con pic:
En nuestro primer ejemplo, vamos a conectar un LM35 (Sensor de
temperatura) al puerto análogo digital del PIC16F887 y vamos a
mostrar dicha temperatura en el computador utilizando la
comunicación serial y el puerto DB9 del computador. El diagrama del
circuito está a continuación:

https://controlautomaticoeducacion.com/wp-content/uploads
/Serial-con-PIC.zip
EJEMPLO 2: comunicación serial entre dos PIC:
Realizar una comunicación serial con pic sencilla entre dos
microcontroladores, y mostrar en un LCD lo que cada uno esta
transmitiendo y/o recibiendo.
El microcontrolador que recibe el dato, debe hacerlo por medio de
una interrupcion por recepción serial. A continuación se describen
los pasos para activar la configuración de la interrupción serial.
Como primer paso se definen las interrupciones en el programa
principal void main(); donde se configura el programa para recibir
interrupciones por recepción serial y adicionalmente se activan las
interrupciones.

enable_interrupts(INT_RDA); //Activa interrupción serial


enable_interrupts(GLOBAL); //Activa las interrupciones en el PIC
Como segundo paso, se procede a crear la función que se va a ejecutar
cuando la interrupción por recepción serial es activada. A la función se
le puede colocar cualquier nombre, y dicha función NO recibe
parámetros de entrada ni de salida.
La función debe ser creada inmediatamente después de la
directiva #int_RDA.
#int_RDA
Rutina_Serial()
{
..........
..........
}
Código Primer Microcontrolador

#include <16f887.h>
#fuses xt,nowdt
#use delay(crystal=4000000)
#use rs232(baud=57600,xmit=pin_c6,rcv=pin_c7)//esta instrucción dice que empleara la UART
física
#include <lcd.c>
void main()
{
int valor,i;
lcd_init();
while(1)
{
for(valor=0;valor<=10;valor++)
{
putc(valor);
printf(lcd_putc,"\fEnviando= %1D",valor);
delay_ms(1000);
}
}
Codigo segundo microcontrolador.
#include <16f887.h>
#fuses xt,nowdt
#use delay(crystal=4000000)
#use rs232(baud=57600,xmit=pin_c6,rcv=pin_c7,bits=8)
#include <lcd.c>
int valor;
#int_RDA
RDA_isr()
{
valor=getc();
}
void main()
{
lcd_init();
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
for(;;)
{
lcd_gotoxy(1,1);
printf(lcd_putc,"Recibido= %1D",valor);
}
}
Ejemplo 3 de comunicación serial con pic:
En este último ejemplo vamos a ver como podremos ampliar los
puertos de comunicación serial programando UARTS VIRTUALES.
Para eso basta simplemente seleccionar otros dos pines
CUALQUIERAS donde queremos realizar una comunicación serial,
uno de estos pines lo configuraremos como el PIN RX y el otro como
el PIN TX. Para efectuar esta configuración declaramos en el
encabezado del programa lo siguiente:
#use rs232(baud=57600,
xmit=PIN_c6,rcv=PIN_c7,stream=PIC,parity=N, bits=8)
#use rs232(baud=9600,xmit=PIN_D0,rcv=PIN_D1,stream=PC,
parity=N, bits=8
Mirando detalladamente esta directiva, nos vamos a dar cuenta que
estamos configurando en este caso 2 UARTS, La primera linea está
configurando el UART fisico del PIC, que ya sabemos que correspone
al RC6 y RC7 para el caso del PIC16f887. La segunda linea está
configurando un UART por software, en este caso yo seleccione que el
PIN D0 fuera el de transmisión (TX) y el PIN D1 fuera el de Recepción
(RX).
Note además que ahora cada UART está identificado con
un NOMBRE, este NOMBRE puede ser cualquiera. Para el caso de
la primera línea yo lo llame como PIC («stream=com1») y la
segunda línea lo llame como PC («stream=PC»).
Asi, si por ejemplo yo quisiera leer un dato del UART que se llama
PIC tendría que leerlo así:

char c,k;
c=fgetc(com1);//físico UART
k=fgetc(com2);//Por software
Por otro lado, si yo quisiera escribir por ejemplo en el
UART que se llama PC, tendria que hacerlo asi:

char c=1;
int d=10;
fprintf(com1,"Caracter= %c, Entero= %d",c,d);
//Muestra el Caracter 1 en el PC
//y el entero 10 en el PC
El siguiente ejemplo es similar al Ejemplo 2. Acá vamos a conectar dos
PIC por el puerto UART FÍSICO, pero en el PIC 1 vamos a crear un
UART por Software.
Entonces el PIC 1 va a recibir caracteres por medio de un computador
a través del UART virtual (9600 baudios) y los va a mandar al PIC
2 por el UART fisico (57600 baudios). El segundo PIC debe recibir los
datos que el PIC 1 le está mandando y mostrarlos en una pantalla LCD.

https://controlautomaticoeducacion.com/wp-content/uploads/2016/06/
UartVirtual.rar
http://robotypic.blogspot.com/2012/08/transmision-variable-tipo-
float-por.html
Clase procesadores martes 16 de nov 2021
Formas para enviar datos desde un procesador PIC

Un carácter una cadena

Formas para recibir datos hacia un procesador PIC

Un carácter y una cadena


Recibir ordenes en forma de cadenas y procesarlas

Onoff3.c
UART Física (aporta interrupción)
Se configuran desde el wizard

UART Virtual (no aporta interrupción)


Se configuran desde el wizard
Ensamblar una trama
Tramaout.c
Leer la trama que entrega un equipo
Programa pm25
Maniobras con cadenas string.h
strcmp(str1, str3) compara dos
strncmp(str1, str2, 5)//compara dos cadenas 5
primeros
strcat( <cadena_destino>, <cadena_fuente>
)
9, 11,12 de nov Clases
16, 18, 19 de nov. Clases
23, 25, 26 de nov. Clases

Comunicaciones seriales con casos y ejemplos de


lectura de sensores y equipos de
comunicaciones.
Introducción al APPINVENTOR y la comunicación Bluetooth.
Ejemplos en APPINVENTOR.
Leer un GPS (protocolo NMEA).
Comunicaciones GSM.
Comunicaciones GPRS.
Internet de las cosas.
Fabricación Aditiva e impresión 3D.
Fin del curso.
Segundo Parcial.
Temas Para el mes de enero y Febrero.

11, 13 y 14 de enero clases normales.


Las clases terminan febrero 12
1, 3, 4 de Febrero clases normales.
11 de Febrero segundo Parcial.
Viernes 4, Martes 8 y Jueves 10 de febrero. Estaré
preparando las preguntas y montarlas en la
plataforma.
Programación de clases antes del parcial
9, 11,12 de nov Clases
16, 18, 19 de nov. Clases
23, 25, 26 de nov. Clases

Dos clases antes del parcial las requiero para generar


listas y preguntas. Serian los días. Martes 30 de nov y
Jueves 2 de diciembre, que no dictare clase.
Primer parcial

3 de diciembre de 2021 hora de clase


Por la plataforma de exámenes que se
describe en el programa calendario.
https://www.classmarker.com/

También podría gustarte