Clasificaciones, modalidades y tendencias de investigación educativa.
MICROCONTROLADORES II EN C. TEMA 5
1. IUT Cumaná
MICROCONTROLADORES II
MÓDULO USART
(Comunicación Serial Asíncrona)
PROF. LUIS ZURITA
2. IUT Cumaná
INTRODUCCIÓN
• En los sistemas con microcontroladores puede existir
la necesidad de conectarse con el mundo exterior, y
esto se logra mediante las comunicaciones seriales y
paralelas.
• En este tema se tratará la comunicación serial
asíncrona mediante el módulo USART. Dicha
comunicación permite establecer un enlace de
comunicación tipo Full Duplex.
TX RX
RC6/TX Dispositivo
RX TX
RC7/RX Externo
GND
µC
Prof. Luis Zurita Microcontroladores II
3. IUT Cumaná
PROTOCOLO RS-232
• Este protocolo es el utilizado por los
microcontroladores y su módulo USART.
• Cada dato se envía independientemente de los
demás.
• Consta de 8 ó 9 bits de datos
• Consta de 1 bit de Inicio (START)
• Consta de 1 bit de Parada (STOP)
BIT INICIO BIT PARADA
LSB DATO MSB
Prof. Luis Zurita Microcontroladores II
4. IUT Cumaná
MÓDULO USART
1. Circuito de Muestreo (RC7/RX)
2. Generador de Baudios
La frecuencia en baudios (bits por segundos) es la
velocidad a la que se realiza la transferencia de
datos. Valores normalizados: 330, 600, 1200, 2400,
4800, 9600, 19200, 38400, otros.
• El USART tiene un generador de Frecuencia en
baudios, BRG. Su valor es controlado por el
Registro SPBRG.
• La frecuencia en baudios del generador depende
del bit BRGH del registro TXSTA (2).
Prof. Luis Zurita Microcontroladores II
5. IUT Cumaná
MÓDULO USART
• Si BRGH=1, se trabaja en alta velocidad y K= 16.
• Si BRGH=0, se trabaja en baja velocidad y K= 64.
• K se necesita para determinar la frecuencia de
funcionamiento.
Fosc
Frecuencia _(baudios )
( K ( X 1))
Ejemplo. Halle el valor a cargar en SPBRG, si se desea
trabajar con un PIC16F873, con un XT, a una baja
velocidad y frecuencia de 9600 baudios.
Prof. Luis Zurita Microcontroladores II
6. IUT Cumaná
TRANSMISOR ASÍNCRONO
• El dato a transmitirse se coloca en TXREG. De
inmediato pasa al registro de desplazamiento TSR,
que empieza a sacar los bits secuencialmente, según
la frecuencia establecida. Se incluye antes de los
datos el bit de Inicio. Y después de los bits de datos,
se agrega el bit de parada.
• Como podemos ver, el corazón del transmisor lo
constituye el TSR, cuyo contenido es cargado con el
Dato a transmitir desde el TXREG.
• Lo va sacando bit a bit desde el LSB hasta el MSB.
Prof. Luis Zurita Microcontroladores II
7. IUT Cumaná
TRANSMISOR ASÍNCRONO
• Existe un señalizador TXIF (PIR1,4) que se pone a 1,
indicando que el TSR se ha vaciado. Si se ha
habilitado la interrupción por esta causa con el bit
TXIE (PIE1,4), se entrará en una RSI.
• Cuando se escribe un nuevo dato a ser transmitido
en el TXREG, el señalizador TXIF se pone a 0.
• También existe otro bit, el TRMT (TXSTA,1) que se
pone a 1 cuando el TSR está vacío.
Prof. Luis Zurita Microcontroladores II
8. IUT Cumaná
TRANSMISOR ASÍNCRONO
Prof. Luis Zurita Microcontroladores II
9. IUT Cumaná
TX9D
TXREG
TX9=1 1 bit
8 bits
REGISTRO DE DESPLAZAMIENTO DE SALIDA RC6/TX
TX9D: 9 bits de datos transmitidos. Puede ser el bit de paridad
1 0 1
D0 D1 D2 D3 D4 D5 D6 D7
Bit start Bit stop
1 0 1
TX9D
D0 D1 D2 D3 D4 D5 D6 D7
Bit start Bit stop
Prof. Luis Zurita
Tramas a enviar Microcontroladores II
10. PASOS PARA LOGRAR IUT Cumaná
TRANSMISIÓN ASÍNCRONA (Aplica en ASM)
1. Configurar RC6/TX como salida y RC7/RX como entrada.
2. Inicializar el registro SPBRG con el valor apropiado según los
cálculos realizados. Si se desea el margen alto se pondrá a uno el
bit BRGH.
3. Habilitar USART en modo asíncrono con SYN= 0 y SPEN= 1.
4. Habilitar la interrupción (opcional) con TXIE=1. (PIE1,4).
5. Poner a cero o a uno el bit TX9 (8 ó 9 bits).
6. Habilitar la transmisión con TXEN= 1, el cual pondrá a uno el bit
TXIF.
7. Si se han seleccionado 9 bits se deber poner el noveno en el bit
TX9D.
8. Cargar el dato en el registro TXREG (comenzar la transmisión).
Prof. Luis Zurita Microcontroladores II
11. TXSTA
IUT Cumaná
bit 7: CSRC: Bit de selección de reloj
Modo Asíncrono: Sin importancia
Modo Síncrono
1 = Modo master (reloj generado internamente para BRG
(Generador de Baudios))
0 = Modo esclavo (reloj externo)
bit 6: TX9: Habilita transmisión de 9-8 bits
1 = Transmisión de 9 bits
0 = Transmisión de 8 bits
bit 5: TXEN: Bit de habilitación del transmisor
1 = Habilita transmisión
0 = Deshabilita transmisión (Nota: SREN/CREN anula TXEN
en modo SYNC.)
bit 4: SYNC: Bit de selección del modo USART
1 = Modo Síncrono
0 = Modo Asíncrono
Prof. Luis Zurita Microcontroladores II
12. TXSTA
IUT Cumaná
bit 3: Sin implementar: En lectura es'0'
bit 2: BRGH: Bit de selección del rango de baudios alto
Modo Asíncrono
1 = Alta velocidad
0 = Baja velocidad
Modo Síncrono: No se usa este modo
bit 1: TRMT: Bit de estado del registro de desplazamiento del
transmisor (TSR)
1 = TSR vacío
0 = TSR lleno
bit 0: TX9D: Noveno bit de datos de transmisión. Se puede
emplear como bit de paridad.
Prof. Luis Zurita Microcontroladores II
13. IUT Cumaná
RECEPTOR ASÍNCRONO
• Los datos se reciben en serie, bit a bit, por el pin RC7/RX, y se
van introduciendo secuencialmente en el registro de
desplazamiento RSR, que opera a una frecuencia 16 veces
más rápida que la de trabajo.
• Después de recibir el bit de Stop los datos acumulados en este
registro se cargan en el de datos RCREG (si está vacío).
Cuando la transferencia se ha completado, el bit RCIF (PIR1,5)
se pone a uno. La interrupción puede habilitarse o
deshabilitarse colocando a uno o borrando, respectivamente,
el bit RCIE (PIE1,5). El bit RCIF se borra cuando el registro
RCREG se ha leído (se "vacía" el registro).
• Cuando se tiene el formato de 9 bits de datos, hay que
programar el RX9=1 (RCSTA,6) y el 9no bit de dato se colocará
en RX9D (RCSTA,0)
Prof. Luis Zurita Microcontroladores II
14. IUT Cumaná
RECEPTOR ASÍNCRONO
Prof. Luis Zurita Microcontroladores II
15. IUT Cumaná
RC7/RX REGISTRO DE DESPLAZAMIENTO DE SALIDA
1 bit 8 bits
Buffer
FIFO
RX9=1 RX9D RCREG
Recepción de datos
Prof. Luis Zurita Microcontroladores II
16. PASOS PARA LOGRAR IUT Cumaná
RECEPCIÓN ASÍNCRONA (Aplica en ASM)
1. Configurar RC6/TX como salida y RC7/RX como entrada.
2. Inicializar el registro SPBRG con el valor apropiado según los cálculos
realizados. Si se desea el margen alto se pondrá a uno el bit BRGH.
3. Habilitar USART en modo asíncrono con SYN= 0 y SPEN= 1.
4. Habilitar la interrupción (si se desea ) poniendo a uno el bit RCIE (PIE1,5).
5. Poner a uno el bit RX9 (RCSTA,6) para habilitar 9 bits de recepción.
6. Habilitar la recepción poniendo a uno el bit CREN.
7. El flag RCIF subirá a uno cuando se complete la recepción y se ocasionará una
interrupción si está habilitado el bit RCIE.
8. Leer el registro RCSTA, cargar el noveno bit (si está habilitado) y comprobar si ha
ocurrido un error durante la recepción.
9. Leer el octavo bit recibido y dar lectura al registro RCREG para conocer si el
dispositivo se ha direccionado.
10. Si ha ocurrido un error borrarlo poniendo a cero el bit CREN.
11. Si el dispositivo ha sido direccionado, borrar el bit ADDEN para permitir que los
datos puedan leerse del buffer receptor
Prof. Luis Zurita Microcontroladores II
17. RCSTA
IUT Cumaná
bit 7: SPEN: Bit de habilitación del puerto serie
1 = Habilita puerto serie (configura patillas RC7/RX/DT y RC6/TX/CK
para el puerto serie)
0 = Deshabilita puerto serie
bit 6: RX9: Habilita recepción de 9-8 bits
1 = Selecciona 9 bits de recepción
0 = Selecciona 8 bits de recepción
bit 5: SREN: Bit de habilitación de recepción única
Modo asíncrono: Este modo no se usa
Modo Síncrono master:
1 = Habilita una recepción única
0 = Deshabilita una recepción única
Este bit se borra después de completar la recepción
Modo Síncrono esclavo: En este modo no se usa.
Prof. Luis Zurita Microcontroladores II
18. RCSTA
IUT Cumaná
bit 4: CREN: Bit de habilitación de recepción continua
Modo Asíncrono
1 = Habilita recepción continua
0 = Deshabilita recepción continua
Modo Síncrono
1 = Habilita recepción continua hasta que el bit CREN sea borrado.
0 = Deshabilita la recepción continua
bit 3: Sin implementar: En lectura es '0'
bit 2: FERR: Bit de error de empaquetamiento
1 = Error de empaquetamiento (Puede actualizarse al leer el registro
RCREG y recibir el siguiente byte)
0 = No hay error
bit 1: OERR: Bit de error de desbordamiento
1 = Error de desbordamiento (puede ser borrado al borrar CREN)
0 = No hay desbordamiento
bit 0:RXGD: Noveno bit de datos de recepción. Se puede emplear como bit de
paridad
Prof. Luis Zurita Microcontroladores II
19. Módulo USART en C IUT Cumaná
• Las siguientes directivas permiten una configuración genérica
del módulo USART:
#USE RS232 (opciones)
Esta directiva permite configurar varios parámetros del módulo
USART, tales como la velocidad de transmisión, pines
utilizados, entre otros. Se puede modificar en cualquier parte
del programa, pero siempre después de haber definido la
directiva #USE DELAY.
Esta directiva habilita el uso de funciones tales como GETCH,
PUTCHAR y PRINTF. Permite su uso en dispositivos que no
poseen módulo USART mediante software USART.
Cuando se utilizan dispositivos con USART, si no se puede
alcanzar una tasa de baudios dentro del 3 % del valor deseado
utilizando la frecuencia de reloj actual, se generará un error.
Prof. Luis Zurita Microcontroladores II
20. Módulo USART en C IUT Cumaná
BAUD=X Velocidad en Baudios
XMIT=pin Pin de transmisión
RCV= pin Pin de recepción
FORCE_SW Usa un software UART en lugar del hardware,
aún cuando se especifican los pines del
hardware.
RESTART_WDT Hace que la función GETC ( ) ponga a cero el
WDT mientras espera un carácter.
BRGH1OK Permite velocidades de transmisión bajas en
chips que tienen problemas de transmisión.
Prof. Luis Zurita Microcontroladores II
21. Módulo USART en C IUT Cumaná
ENABLE= pin El pin especificado estará a nivel alto durante la
transmisión. Utilizado en transmisión 485.
DEBUGGER Permite depuración a través del ICD. El pin por
defecto es el B3;
INVERT Invierte la polaridad de los pines serie
(normalmente no es necesario con el
convertidor de nivel, como el MAX232). No
puede usarse con el USART interno.
PARITY= X Donde X es N,E u O
BITS= X Donde X es 5-9 (no puede usarse 5-7 con el
USART interno).
FLOAT_HIGH Se utiliza para las salidas de colector abierto.
Prof. Luis Zurita Microcontroladores II
22. Módulo USART en C IUT Cumaná
ERRORS Indica al compilador que guarde los errores recibidos en la
variable RS232_ERRORS para restablecerlos cuando se
producen.
SAMPLE_EARLY No se puede utilizar con el USART interno. Provoca que el
muestreo del dato a través de la función GETC ( ) se realice al
principio de un bit de tiempo.
RETURN= pin Para FLOAT_HIGH y MULTI_MASTER, este pin se usa para leer
la señal de retorno. Por defecto, para FLOAT_HIGH es XMIT y
para MULTIMASTER es RCV.
MULTI_MASTER Usa el pin de RETURN para determinar si otro master en el bus
está transmitiendo al mismo tiempo. Si se detecta una colisión,
el bit 6 se pone a 1 en RS232_ERRORS y todos los posibles
PUTC ( ) son ignorados hasta que el bit 6 esté a 0. La señal es
comprobada al final y al principio de cada bit de tiempo. No se
puede utilizar con USART interno.
LONG_DATA Permite manejar INT16 a las funciones GETC ( ) y PUTC ( ). En
formatos de datos de 9 bits.
DISABLE_INTS Provoca la deshabilitación de interrupciones cuando se ejecuta
GETC ( ) y PUTC ( ) evitando distorsiones en los datos.
Prof. Luis Zurita Microcontroladores II
23. Módulo USART en C IUT Cumaná
STOP= x Número de bits de stop (por defecto 1)
TIMEOUT= x Para establecer el tiempo que GETC ( ) espera
un carácter (en ms). Si no se recibe carácter en
este tiempo, el RS232_ERRORS se pone a 0.
SYNC_SLAVE Provoca una línea RS232 en modo esclavo
síncrono, haciendo el pin de recepción como
entrada de reloj y la de transmisión como
entrada/salida de datos.
SYNC_MASTER Provoca una línea RS232 en modo maestro
síncrono, haciendo el pin de recepción como
salida de reloj y la de transmisión como
entrada/salida de datos.
UART1 Configura el XMIT y RCV para el USART1
UART2 Configura el XMIT y RCV para el USART2
Prof. Luis Zurita Microcontroladores II
24. Módulo USART en C IUT Cumaná
Ejemplos:
#use delay (clock=20000000);
#use rs232 (BAUD=9600 , XMIT=PIN_C6 , RCV=PIN_C7 , BITS=8)
#use rs232 (BAUD=9600 , XMIT=PIN_A2 , RCV=PIN_A3)
Setup_uart(baud)
baud es una constante que define la velocidad. Un 1 enciende el
USART y un 0 lo apaga. Con cualquier valor de velocidad, el USART
se enciende.
set_uart_speed (baud)
Idéntica a la función anterior. Ejemplo:
// Se establece la velocidad mediante la combinación de los pines B0
y B1:
switch (input_b ( ) & 3){
case 0: set_uart_speed(2400); break;
case 1: set_uart_speed(4800); break;
case 2: set_uart_speed(9600); break;
case 3: set_uart_speed(19200); break;
Prof. Luis Zurita Microcontroladores II
25. Módulo USART en C IUT Cumaná
Transmisión de datos:
putc (cdata)
putchar (cdata)
cdata es un carácter de 8 bits. Esta función envía un
carácter mediante el pin XMIT. La directiva #USE RS232
debe situarse siempre antes de utilizar esta función.
puts (string)
string: cadena de caracteres constante o matriz de
caracteres terminada con un 0. La funcióon puts ( )
manda los caracteres de la cadena, uno a uno, a través
del bus RS232 utilizando la función PUTC ( ); detrás de la
cadena envía un RETURN (13) y un retorno de carro (10)
Prof. Luis Zurita Microcontroladores II
26. Módulo USART en C IUT Cumaná
printf (fname, cstring, values…)
cstring: es una cadena de caracteres (constante) o matriz
de caracteres terminada con un cero.
fname: las funciones a utilizar para escribir la cadena
indicada; por defecto se utiliza la función PUTC ( ), que
permite escribir en el bus RS232.
values: valores a incluir en la cadena separados por comas;
se debe indicar %nt. El formato es %nt, donde n es
opcional y puede ser:
1-9 para especificar cuantos caracteres deben ser
especificados;
01-09 para indicar la cantidad de ceros a la izquierda.
1.1-9.9 para coma flotante.
Prof. Luis Zurita Microcontroladores II
27. Módulo USART en C IUT Cumaná
t puede indicar:
c Carácter
s Cadena o carácter
u Entero sin signo
d Entero con signo
Lu Entero sin signo
Ld Entero largo con signo
x Entero hexadecimal (minúscula)
X Entero hexadecimal (mayúscula)
Lx Entero largo hexadecimal (minúscula)
LX Entero largo hexadecimal (mayúscula)
f Flotante con truncado
g Flotante con redondeo
e Flotante en formato exponencial
w Entero sin signo con decimales insertados. La 1ra cifra
indica el total, la 2da el número de decimales.
Prof. Luis Zurita Microcontroladores II
28. Módulo USART en C IUT Cumaná
Recepción de datos:
value= getc ( );
value= getch ( );
value= getchar ( );
value (valor) es un carácter de 8 bits. Espera recibir un
carácter por la línea RS232 y devuelve su valor. En los
dispositivos con USART interno, se pueden almacenar
hasta tres caracteres; para evitar esperas se puede
utilizar la función KBHIT ( ).
valor= kbhit ( );
valor es 0 (FALSE) si GETC ( ) debe esperar a que llegue un
carácter; 1 (TRUE) si ya hay un carácter listo para ser
leído por la función GETC ( ).
Prof. Luis Zurita Microcontroladores II
29. Ejemplo 1. Enviar los datos del 0 al 10, en modo asíncrono, entre dos
PICS. Visualizar con un LCD, los datos enviados y los datos recibidos;
la recepción del dato deberá ser por interrupción del USART.
// PIC MAESTRO
#include <16F877.h>
#FUSES XT,NOWDT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)
#include <LCD.C>
void main() {
int valor;
lcd_init();
while(1){
for (valor=0;valor<=10;valor++) {
PUTC(valor); // Envia valor
printf(lcd_putc,"fENVIANDOn");
printf(lcd_putc,"%1D",valor);
delay_ms(2000);
}
}
}
Prof. Luis Zurita Microcontroladores II
30. // PIC ESCLAVO
#include <16F877.h> IUT Cumaná
#FUSES XT,NOWDT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8)
#include <LCD.C>
#BYTE TRISA=0X85
#BYTE PORTA=0X05
int valor;
#int_RDA
RDA_isr() {
valor=GETC();} //Recibe valor
void main() {
bit_clear(TRISA,0);
lcd_init();
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
for (;;) {
lcd_gotoxy(1,1);
printf(lcd_putc,"recibiendo=%1D",valor);
}
}
Prof. Luis Zurita Microcontroladores II
31. IUT Cumaná
Con el “Virtual Terminal”, presionando el
botón derecho del mouse y seleccionando
Hex display mode, podemos visualizar los
datos que se están recibiendo.
Prof. Luis Zurita Microcontroladores II
32. La norma RS232 IUT Cumaná
• Es la más básica de las comunicaciones serie. Comunica un
equipo terminal de datos (DTE) con el equipo de
comunicación de datos (DCE).
• Las características eléctricas de la señal en esta norma
establecen que la longitud máxima entre dos equipos no
debe ser superior a 15 metros, sin embargo, el autor ha
realizado pruebas de campo que permiten alcanzar los 30
metros. La velocidad máxima de transmisión es de 20 kbps.
Los niveles lógicos no son compatibles con los niveles TTL,
ya que se situan dentro de los siguientes rangos: 1 lógico
entre -3 v a -15 v y 0 lógico entre +3 v a +15 v.
• Se utilizan conectores DB9 y DB25.
Prof. Luis Zurita Microcontroladores II
33. La norma RS232 IUT Cumaná
• Para una comunicación full duplex desde el USART
del PIC, se debe conectar un mínimo número de
señales, a saber: TXD, RXD y tierra (GND). Los PICS
utilizan señal TTL en el módulo USART, por lo que
debe utilizarse un convertidor de niveles a RS232,
como el circuito integrado MAX232
RX TX
TX RX
MAX232
GND GND
NIVELES TTL NIVELES RS232
Prof. Luis Zurita Microcontroladores II
35. • En la actualidad, las computadoras desde el año 1996 han ido
erradicando el puerto serie con el conector DB9 y DB25, por el
IUT Cumaná
puerto USB (Universal Serial Port).
• Una solución ha sido la implementación de cables de
conversión USB-232.
• Sin embargo, los microcontroladores de la familia PIC18,
integran un módulo USB para comunicaciones como protocolo
de comunicación.
Convertidor Módulo Módulo
USB-232 USART USB
Familia PIC16F87X PIC PIC Familia PIC18
Prof. Luis Zurita Microcontroladores II
36. Ejemplo 2. Realizar un sistema Maestro-Esclavo multi- IUT Cumaná
selector.
• La selección de las órdenes se realiza mediante un
teclado y se visualizan en una pantalla LCD en el
Maestro.
• Si se presiona 1, el Maestro envía el dato: 17H, el
esclavo activa el led Rojo y muestra en una pantalla
LCD: ORDEN1.
• Si se presiona 4, el Maestro envía el dato: 2DH, el
esclavo activa el led amarillo y muestra en una
pantalla LCD: ORDEN2.
• Si se presiona 7 el Maestro envía el dato: 64H, el
esclavo activa el led verde y muestra en una pantalla
LCD: ORDEN3.
• Si se presiona cualquier otra tecla, el Maestro envía
el dato: C2H, el esclavo desactiva todos los leds y
muestra en una pantalla LCD: TODOS OFF.
Prof. Luis Zurita Microcontroladores II
37. Ejemplo 2. Sistema Maestro-Esclavo multi- selector. IUT Cumaná
Programa del Maestro:
#include <16f877.h> if (k!=0) {
#fuses XT,NOWDT,NOPROTECT,NOLVP if (x==1)
#use delay (CLOCK = 4000000) {valor=0x17;
#use rs232(baud=9600, xmit=pin_c6, PUTC(valor);
rcv=pin_c7) printf(lcd_putc,"fORDEN 1");}
#define use_portb_kbd TRUE else if (x==4)
#define use_portd_lcd TRUE {valor=0x2D;
#include <lcd.c> PUTC(valor);
#include <kbd.c> printf(lcd_putc,"fORDEN 2");}
else if (x==7)
void main() { {valor=0x64;
char k; PUTC(valor);
int x; printf(lcd_putc,"fORDEN 3");}
int valor; else
lcd_init(); {valor=0xC2;
kbd_init(); PUTC(valor);
port_b_pullups(TRUE); printf(lcd_putc,"fTODOS OFF");
printf(lcd_putc,"fPRESIONE FUNCION"); delay_ms(1000);}
OUTPUT_C(0x00); }
while (TRUE) { }
k=kbd_getc(); }
x=k-48;
Prof. Luis Zurita Microcontroladores II
38. Ejemplo 2. Sistema Maestro-Esclavo multi- selector. IUT Cumaná
Programa del Esclavo:
#include <16f877.h> delay_ms(50);}
#fuses XT,NOWDT else if (valor==0x2D)
#use delay(CLOCK=4000000) {printf(lcd_putc,"fORDEN 2");
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, output_low (PIN_C0);
bits=8) output_high (PIN_C1);
#define use_portd_lcd TRUE output_low (PIN_C2);
#include <lcd.c> delay_ms(50);}
int valor; else if (valor==0X64)
{printf(lcd_putc,"fORDEN 3");
#int_RDA output_low (PIN_C0);
RDA_isr(void){ output_low (PIN_C1);
valor=GETC();} output_high (PIN_C2);
delay_ms(50);}
void main() { else if (valor==0XC2)
set_tris_c(0x80); {printf(lcd_putc,"fTODOS OFF");
lcd_init(); output_low (PIN_C0);
enable_interrupts(INT_RDA); output_low (PIN_C1);
enable_interrupts(GLOBAL); output_low (PIN_C2);
while (TRUE) { delay_ms(50);}
if (valor==0x17) else{
{printf(lcd_putc,"fORDEN 1"); }
output_high (PIN_C0); }
output_low (PIN_C1); }
Prof. Luis Zurita output_low (PIN_C2); Microcontroladores II
39. Ejemplo 2. Sistema Maestro-Esclavo multi- selector. IUT Cumaná
Simulación del Programa:
Prof. Luis Zurita Microcontroladores II
40. Ejemplo 2. Sistema Maestro-Esclavo multi- selector. IUT Cumaná
Simulación del Programa:
Prof. Luis Zurita Microcontroladores II
41. Ejemplo 2. Sistema Maestro-Esclavo multi- selector. IUT Cumaná
Simulación del Programa:
Prof. Luis Zurita Microcontroladores II
42. Ejemplo 2. Sistema Maestro-Esclavo multi- selector. IUT Cumaná
Simulación del Programa:
Prof. Luis Zurita Microcontroladores II
43. Ejemplo 3. Realizar una conversión A/D de una señal proveniente de
un potenciómetro en un PIC16F877, y enviarlo al puerto serie de una
computadora. Visualizar los datos en LABVIEW (Opcional), además de
poder controlar el puerto B de un PIC16F873 desde la computadora.
PROGRAMA DEL PIC MAESTRO: for (;;) {
#include <16F877A.h> set_adc_channel(0); // Conversión
#device ADC=10 //de la señal del potenciómetro
#FUSES XT,NOWDT,NOPROTECT,NOLVP delay_ms(10); // Espera el TADQ
#use standard_io(c) valor = read_adc(); // Lee el valor
#use delay(clock=4000000) de //la conversión
#use rs232(baud=9600, xmit=pin_c6, p=valor*0.098; // Factor escalar
rcv=pin_c7, bits=8, parity=N) //para pasar de 0-1023 a 0-100
#BYTE TRISA=0X85 putc(p);
#BYTE PORTA=0X05 delay_ms(200); //Tiempo de
//muestreo
}
void main() { }
int16 valor;
int p;
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
Prof. Luis Zurita Microcontroladores II
44. Ejemplo 3. Realizar una conversión A/D de una señal proveniente de
un potenciómetro en un PIC16F877, y enviarlo al puerto serie de una
computadora. Visualizar los datos en LABVIEW (Opcional), además de
poder controlar el puerto B de un PIC16F873 desde la computadora.
PROGRAMA DEL PIC ESCLAVO: void main() {
#include <16F873A.h> set_tris_b(0x00);
#FUSES XT,NOWDT,NOPROTECT,NOLVP enable_interrupts(INT_RDA);
#use standard_io(c) enable_interrupts(GLOBAL);
#use fast_io(b) while (1){
#use delay(clock=4000000) output_b(valor);}
#use rs232(baud=9600, xmit=pin_c6, }
rcv=pin_c7, bits=8, parity=N)
int valor;
#int_RDA //Interrupción por RX de datos
RDA_isr(void){
valor=GETC();}
Prof. Luis Zurita Microcontroladores II
47. Puerto Serie en PROTEUS IUT Cumaná
• El ISIS del PROTEUS proporciona un componente que
permite la simulación a través del puerto serie:
COMPIM.
• Utilizando este componente no se necesita colocar un
MAX232 para la simulación, debido a que el propio
componente gestiona la comunicación con el puerto de
la computadora.
• Podemos entonces comunicarnos con nuestra propia
computadora. Si se tiene 2 puertos serie o 1 serie y
varios USB, con su respectivo cable convertidor, y así
manejar los datos que provienen del PIC con diferentes
programas de aplicación como Visual C, LABVIEW, entre
otros.
Prof. Luis Zurita Microcontroladores II
48. Puerto Serie en PROTEUS IUT Cumaná
P1
1
DCD
6
DSR
2
RXD
7
RTS
3
TXD
8
CTS
4
DTR
9
RI
ERROR
COMPIM
La configuración del puerto se realiza como cualquier otro componente
y se pueden cambiar virtualmente todas las propiedades de un puerto
serie: número de puerto, velocidad, paridad, número de bits, entre
otros.
Prof. Luis Zurita Microcontroladores II
49. Ejemplo 4. Realizar una conversión A/D de una señal proveniente de
un potenciómetro y enviarlo al puerto serie de una computadora.
Para este ejercicio, se envían los datos del PIC al COMPIM 1. Para simular que los
datos se reciben en otro puerto (la computadora), se utiliza otro simulador
de puerto (COMPIM 2):
#include <16F877.h>
#device ADC=10
#FUSES XT,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
#include <LCD.C>
void main() {
int16 valor=0;
float p=0.0;
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
lcd_init();
Prof. Luis Zurita Microcontroladores II
50. Ejemplo 4. Realizar una conversión A/D de una señal proveniente de
un potenciómetro y enviarlo al puerto serie de una computadora.
Continuación del ejercicio:
for (;;) {
set_adc_channel(0); // Conversión de la señal del potenciómetro
delay_us(10); // Espera el TADQ
valor = read_adc(); // Lee el valor de la conversión
p =5.0 * valor / 1024.0;// Convierte el valor decimal a voltaje
//Es lo mismo que utilizar p=0.004883*valor;
printf(lcd_putc, "fADC =%LUn",valor);
printf(lcd_putc,"VOLTAJE = %01.2fV",p);
printf("ADC = %4ld ",valor); //Envío de información a la computadora
printf("VOLTAJE = %01.2fVr", p); // El r permite cambiar de línea.
delay_ms(100);
}
}
Prof. Luis Zurita Microcontroladores II
52. IUT Cumaná
Recibe
En este ejemplo no se recibe nada,
puesto que no se pudo conectar un
cable USB entre dos puertos de la
misma computadora.
Transmite
Prof. Luis Zurita Microcontroladores II