Guias PIC Digital 2
-
Upload
jeison-tacue-gonzalez -
Category
Documents
-
view
85 -
download
9
Transcript of Guias PIC Digital 2
11
Manual de Laboratorio
para Electronica Digital 2
en base a PIC, ccs y Proteus
Luis Alberto Vargas Tijerino
Autor: Luis Alberto Vargas Tijerino. Página 1
Contenido Laboratorio 1: Introducción a CCS y Proteus..................................................................................................... 5
1.1 Objetivo. ................................................................................................................................................... 5
1.2 Introducción. ............................................................................................................................................ 5
1.3 ISIS-PROTEUS VSM ................................................................................................................................... 5
1.4 Compilador PIC-C de CCS. ........................................................................................................................ 5
1.5 Estructura de un Programa ...................................................................................................................... 6
1.6 Procedimiento. ......................................................................................................................................... 7
1.6.1 Crear el Proyecto en CCS .................................................................................................................. 7
1.6.2 Crear el circuito en Proteus .............................................................................................................. 9
1.6.3 Cargar el Archivo fuente ................................................................................................................. 10
1.6.4 Realizar la simulación y depuración. ............................................................................................... 10
1.6.5 Abrir la ventana de observación y Agregar los Registros ............................................................... 11
Laboratorio 2: Puertos de Entrada y Salida. .................................................................................................... 13
2.1 Objetivo. ................................................................................................................................................. 13
2.2 Trabajo Previo. ....................................................................................................................................... 13
2.3 Introducción. .......................................................................................................................................... 13
2.4 Puertos de Entradas/Salidas. ................................................................................................................. 13
2.4.1 Lectura del puerto........................................................................................................................... 13
2.4.2 Lectura del pin de Entrada .............................................................................................................. 13
2.4.3 Escritura del puerto. ....................................................................................................................... 14
2.4.4 Escritura de un pin. ......................................................................................................................... 14
2.4.5 Configuración rápida de los pines I/O. ........................................................................................... 14
2.4.6 Manejo a través de la RAM ............................................................................................................. 15
2.5 Procedimiento. ....................................................................................................................................... 15
2.6 Trabajo Extra Clase ................................................................................................................................. 16
Laboratorio 3: Pantalla LCD. ............................................................................................................................ 17
3.1 Objetivo. ................................................................................................................................................. 17
3.2 Introducción. .......................................................................................................................................... 17
3.3 Pantalla LCD. ........................................................................................................................................... 17
3.3.1 Configuración del Puerto para el LCD. ............................................................................................ 17
3.3.2 Fichero o Librería LCD.C .................................................................................................................. 18
3.3.3 Inicialización del LCD. ...................................................................................................................... 18
Autor: Luis Alberto Vargas Tijerino. Página 2
3.3.4 Ubicación del cursor en una posición. ............................................................................................ 18
3.3.5 Escribir caracteres en el LCD ........................................................................................................... 18
3.4 Procedimiento ........................................................................................................................................ 20
3.5 Trabajo Extra Clase ................................................................................................................................. 22
Laboratorio 4: Convertidor Analógico a Digital. .............................................................................................. 23
4.1 Objetivo. ................................................................................................................................................. 23
4.2 Introducción. .......................................................................................................................................... 23
4.3 Conversor Analógico Digital. .................................................................................................................. 23
4.3.1 Formato del resultado de la conversión. ........................................................................................ 24
4.3.2 Configuración de las entradas analógicas del ADC. ........................................................................ 24
4.3.3 Configuración del ADC. ................................................................................................................... 25
4.3.4 Lectura del Valor de la conversión ADC. ......................................................................................... 25
4.4 Procedimiento. ....................................................................................................................................... 26
4.5 Trabajo Extra clase ................................................................................................................................. 27
Laboratorio 5: Interrupción por Lectura de Entradas. .................................................................................... 28
5.1 Objetivo. ................................................................................................................................................. 28
5.2 Introducción. .......................................................................................................................................... 28
5.3 Interrupciones. ....................................................................................................................................... 28
5.3.1 Configuración de las interrupciones. .............................................................................................. 28
5.4 Interrupción Externa INT. ....................................................................................................................... 28
5.4.1 Configuración de la interrupción externa INT. ............................................................................... 28
5.5 Interrupción por cambio en PORTB. ...................................................................................................... 29
5.5.1 Configuración de la interrupción por cambio en PORTB. ............................................................... 29
5.6 Procedimiento. ....................................................................................................................................... 30
5.7 Trabajo Extra Clase ................................................................................................................................. 31
Laboratorio 6: Interrupción por Desbordamiento del TMR0. ......................................................................... 32
6.1 Objetivo. ................................................................................................................................................. 32
6.2 Introducción. .......................................................................................................................................... 32
6.3 Temporizadores...................................................................................................................................... 32
6.4 Módulo TIMER0. ..................................................................................................................................... 32
6.4.1 Configuración de la interrupción por TIMER0. ............................................................................... 32
6.4.2 Configuración del TMR0.................................................................................................................. 33
6.4.3 Modificación y obtención del valor de TIMER0. ............................................................................. 33
Autor: Luis Alberto Vargas Tijerino. Página 3
6.4.4 Cálculo de la temporización. ........................................................................................................... 33
6.5 Procedimiento. ....................................................................................................................................... 34
6.6 Trabajo Extra Clase ................................................................................................................................. 36
Laboratorio 7: Generador de señal PWM. ...................................................................................................... 37
7.1 Objetivo. ................................................................................................................................................. 37
7.2 Introducción. .......................................................................................................................................... 37
7.3 Modulación por ancho de pulsos ........................................................................................................... 37
7.4 Módulo CCP. ........................................................................................................................................... 37
7.4.1 Configuración del Módulo CCP en Modo PWM. ............................................................................ 38
7.4.2 Configuración del ciclo de trabajo. ................................................................................................. 38
7.5 Módulo TIMER2. ..................................................................................................................................... 38
7.5.1 Configuración de la frecuencia PWM. ............................................................................................ 38
7.5.2 Calculo de la Frecuencia PWM........................................................................................................ 39
7.5.3 Resolución del Ciclo de Trabajo. ..................................................................................................... 40
7.6 Procedimiento. ....................................................................................................................................... 41
7.7 Trabajo Extra Clase. ................................................................................................................................ 43
Laboratorio 8: USART ...................................................................................................................................... 44
8.1 Objetivo .................................................................................................................................................. 44
8.2 Introducción ........................................................................................................................................... 44
8.3 Módulo USART. ...................................................................................................................................... 44
8.4 Modo Síncrono ....................................................................................................................................... 44
8.5 Modo Asíncrono ..................................................................................................................................... 45
8.6 Niveles lógicos RS232 ............................................................................................................................. 45
8.7 El módulo USART en C. ........................................................................................................................... 46
8.7.1 Configuración del Módulo USART. .................................................................................................. 46
8.7.2 Transmisión de datos: ..................................................................................................................... 47
8.7.3 Recepción de datos: ........................................................................................................................ 47
8.8 Procedimiento. ....................................................................................................................................... 47
8.9 Configuración del Hyperterminal de Windows ...................................................................................... 50
8.10 Trabajo Extra Clase ............................................................................................................................. 53
Autor: Luis Alberto Vargas Tijerino. Página 4
Autor: Luis Alberto Vargas Tijerino. Página 5
Laboratorio 1: Introducción a CCS y Proteus.
1.1 Objetivo. Familiarizar al estudiante con el compilador CCS y el simulador de circuitos Proteus.
1.2 Introducción. A continuación se mostrarán los pasos necesarios para crear un nuevo proyecto en CCS y luego se mostrarán
los pasos necesarios para simular nuestro proyecto en Proteus.
1.3 ISIS-PROTEUS VSM El entorno de diseño electrónico PROTEUS VSM de LABCENTER ELECTRONICS (www.labcenter.co.uk) ofrece la
posibilidad de simular código de alto (lenguaje C) y bajo nivel (lenguaje ensamblador) para los
microcontroladores y, simultáneamente, con la simulación en modo mixto de SPICE. Esto permite el diseño
tanto a nivel de hardware como software y realizar la simulación en un mismo y único entorno. Para ello se
suministra tres potentes entornos como son el ISIS para el diseño gráfico, VSM (Virtual System Modelling) para
la simulación y el ARES para el diseño de circuitos impresos en tarjetas.
Figura 1.1 Entorno de trabajo PROTEUS
1.4 Compilador PIC-C de CCS. El Compilador C de CCS ha sido desarrollado específicamente para PIC MCU, obteniendo la máxima
optimización del compilador con estos dispositivos. Dispone de una amplia librería de funciones predefinidas,
comandos de preprocesado y ejemplos. Además existe gran cantidad de información y soporte técnico en
español en los foros www.todopic.com.ar/foros y www.ucontrol.com.ar/foros.
Autor: Luis Alberto Vargas Tijerino. Página 6
También suministra los controladores (drivers) para diversos dispositivos como LCD, convertidores AD, relojes
en tiempo real, EEPROM serie, etc.
Otra característica sumamente importante es que puede ser utilizado conjuntamente con ISIS-PROTEUS para
depurar el código paso a paso, lo que permite a los diseñadores encontrar errores de algoritmización sin la
necesidad de tener una herramienta física para probar el circuito.
1.5 Estructura de un Programa Para escribir un programa en C se deben tener en cuenta una serie de elementos básicos de su estructura.
LIBRERÍAS A INCLUIR: Contienen funciones, instrucciones, definiciones, variables y constantes que
pueden ser utilizadas por el código principal.
BITS DE CONFIGURACIÓN O FUSES: Estos se utilizan para configurar ciertos parámetros del PIC
durante la primera vez que son quemados, por ejemplo: el tipo de oscilador que se utilizará, si el PIN
MCLR puede ser utilizado como Entrada digital, si deseamos proteger el código contra lectura, etc…
DIRECTIVAS #USE: Se utilizan para configurar algunos periféricos y para controlar como el compilador
generará los códigos de retardos.
DEFINICIONES: Se utilizan para modificar fácilmente algunos valores que se utilizan con mucha
frecuencia en el código.
DECLARACIONES DE VARIABLES Y CONSTANTES: indican los nombres y características de las variables
y constantes que utilizaremos en el código.
PROGRAMAS o FUNCIONES: son un conjunto de instrucciones que pueden ser llamadas para evitar
repetir el código. Puede haber uno o varios, en cualquier caso siempre debe haber uno definido como
principal mediante la inclusión de la llamada main().
INSTRUCCIONES: Indican cómo debe comportarse el PIC en cada momento.
COMNTARIOS: permiten describir lo que significa cada línea del programa ya sea para recordarlo más
tarde o para mostrar el código a otras personas que trabajan en el grupo.
Autor: Luis Alberto Vargas Tijerino. Página 7
Figura 1.2 Estructura de un programa
1.6 Procedimiento.
1.6.1 Crear el Proyecto en CCS
1. Abrir el Compilador PIC C de CCS
2. Presionar el botón close Project para cerrar todos los archivos anteriormente abiertos.
3. Dar click en el botón inicio.
4. Crear un nuevo archivo dando click en New Source File a como se muestra en la siguiente figura
Bits de configuración
Librería
Directiva #USE
Instrucciones
Función main
Comentarios
Autor: Luis Alberto Vargas Tijerino. Página 8
5. Crear una Nueva carpeta llamada Lab1 en la ubicación que consideres necesaria (Ejemplo: Carpeta Mis
Documentos).
6. Abrir la carpeta Lab1 y guardar el proyecto con el nombre de Led_Blink1.
7. Copiar el Código 1.1 Led_blink
Código 1.1 Led_blink
///////////////////////////////////////////////////////////////////////////////
//Autor: Luis Alberto Vargas Tijerino.
//Alias: Bigluis.
//Pais: Nicaragua.
//Fecha: 8-Nov-10.
///////////////////////////////////////////////////////////////////////////////
#include <16f887.h>//pic a utilizar
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES NOBROWNOUT //No brownout reset
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOWRT //Program memory not write protected
#FUSES BORV40 //Brownout reset at 4.0V
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay (clock=8M) //Fosc=8Mhz
///PROGRAMA
void main(void){
setup_adc_ports(NO_ANALOGS|VSS_VDD); //Todas las entradas del PIC Seran Digitales.
setup_comparator(NC_NC_NC_NC); //Los comparadores Analogicos estaran apagados.
while(TRUE){ //bucle infinito
output_low(PIN_B0); //led off
delay_ms(500); //Retardo de 500ms = 0.5s
output_high(PIN_B0); //led on
delay_ms(500); //Retardo de 500ms = 0.5s
}
}
8. Dar clic en el botón Build All de la pestaña Compile o presionar la tecla F9.
Autor: Luis Alberto Vargas Tijerino. Página 9
1.6.2 Crear el circuito en Proteus
1. Abrir el simulador ISIS 7 de Proteus .
2. Presionar la tecla “P” del teclado.
3. Escribir PIC16F887 en la caja de búsqueda y darle doble clic al dispositivo en la lista de resultados para
que aparezca en la ventana de dispositivos seleccionados.
4. Escribir LOGICPROBE en la caja de búsqueda y darle doble clic al dispositivo en la lista de resultados
para que aparezca en la ventana de dispositivos seleccionados.
5. Escribir LOGICTOGGLE en la caja de búsqueda y darle doble clic al dispositivo en la lista de resultados
para que aparezca en la ventana de dispositivos seleccionados.
6. Cerrar la ventana de Pick Devices.
7. En la ventana de dispositivos seleccionados darle un clic al dispositivo y luego dar un clic en la ventana
de trabajo para que aparezca el dispositivo y finalmente ubicar los dispositivos como aparece en la
siguiente figura.
a. Si se desea rotar el dispositivo en sentido horario se debe presionar la tecla “+” del teclado
numérico.
b. Si se desea rotar el dispositivo en sentido anti-horario presionar la tecla “-“ del teclado
numérico.
c. Si se desea rotar el dispositivo en espejo s e debe presionar la combinación de teclas “ctrl+m”.
Ventana de
dispositivos
seleccionado
Lista de
Resultados
Caja de
Busqueda
Autor: Luis Alberto Vargas Tijerino. Página 10
8. Conectar el Pin del LOGICPROBE con el pin RB0 del PIC16F887.
9. Guardar el Archivo.
1.6.3 Cargar el Archivo fuente
1. Darle doble clic al PIC16F887 ubicado en la ventana de trabajo
2. Darle clic al botón de la caja de texto Program File y seleccionar el archivo fuente Led_Blink1.cof
3. Cambiar la frecuencia de reloj a 8MHz.
4. Luego presionar el botón Ok.
1.6.4 Realizar la simulación y depuración.
Con ayuda de la simulación mixta podemos observar cómo se modifican las variables internas del PIC y cómo
estas interactúan con variables externas que pueden ser analógicas o digitales. Por otro lado, la depuración
nos permite ver paso a paso el desarrollo del código que hemos cargado en el PIC con el objetivo de encontrar
errores de lógica o de secuencia.
Ventana de
dispositivos
seleccionados
Ventana de
Trabajo.
PIC16F887
LOGICPROBE Barra de
Simulación
Autor: Luis Alberto Vargas Tijerino. Página 11
1. Dar clic en el botón Play de la barra de simulación y observar la
simulación.
2. Dar clic en el botón stop de la barra de simulación.
3. Dar clic en el botón step de la barra de simulación para iniciar la simulación paso a paso o
presionar la combinación de teclas Ctrl+F12.
4. A continuación se mostraran la ventana del código fuente y la ventana de variables.
5. En la ventana de Código aparecen 4 botones .
a. Step over o tecla F10: La simulación se realiza paso a paso pero al encontrar la llamada a
una función el depurador la realiza toda la función de una sola vez sin entrar a ella.
b. Step into o tecla F11: La simulación se realiza paso a paso y al encontrar la llamada a una
función el depurador la realiza entra a la función realizándola paso a paso.
c. Step out o combinación Ctrl+F11: Si el depurador se encuentra en el código interno de una
función al presionar este botón saldrá del código interno de la función y se mostrará la línea
siguiente a la llamada a la función.
d. Run to Source Line o combinación Ctrl+F10: Ubica al depurador en la línea seleccionada por
el usuario.
6. Una vez que se presione uno de los botones anteriores se puede observar el cambio en la ventana de
código y en la ventana de variables.
1.6.5 Abrir la ventana de observación y Agregar los Registros
1. Dar clic en menú debug>watch window.
Ventana de
Código
Ventana de
Variables
Autor: Luis Alberto Vargas Tijerino. Página 12
2. Dar clic derecho en la ventana de observación y seleccionar Add Items (By Name)
3. Luego dar doble clic a los registros TRISB y PORTB en la ventana Add Memory Item.
Autor: Luis Alberto Vargas Tijerino. Página 13
Laboratorio 2: Puertos de Entrada y Salida.
2.1 Objetivo. Familiarizarse con los Puertos de Entrada y Salida mediante la implementación práctica del ejemplo.
2.2 Trabajo Previo. Contestar las siguientes Preguntas:
1. Mencione los puertos de entrada/salida tiene el PIC16F887.
2. ¿Cuántos pines de entrada/salida tiene el PIC16F887 en total?
3. ¿Por qué es necesario utilizar resistencias para conectar resistencias a los LED?
4. ¿Por qué es necesario utilizar resistencias de pull-up ó pull-down para conectar los interruptores?
5. ¿Cómo se eliminan los rebotes de los botones?
2.3 Introducción. En casi todos los proyectos es necesario leer alguna entrada de tipo digital conectada a pulsadores,
interruptores, sensores digitales o similares; también es necesario escribir datos por medio de una salida de
tipo digital conectada a LED, pantallas LCD, display de siete segmentos o similares. Este laboratorio trata de
explicar cómo realizar la configuración de los puertos del PIC para utilizarlos como entradas o salidas digitales.
2.4 Puertos de Entradas/Salidas. Los Microcontroladores PIC tienen terminales de entrada/salida (I/O, Input/Output) divididos en puertos, que
se encuentras nombrados alfabéticamente A, B, C, D, etc. Cada puerto puede tener hasta 8 terminales que se
pueden comportar como una I/O digital.
El PIC16F887 tiene hasta 35 I/O digitales de propósito general, y en dependencia de la configuración de sus
periféricos pueden estar disponibles como I/O de propósito general. Por ejemplo si utilizamos el módulo
USART (Transmisión Serial) los pines correspondientes a este periférico serán utilizados para atender las
operaciones del mismo y no podrán ser utilizados como I/O de propósito general.
2.4.1 Lectura del puerto.
La siguiente función configura el puerto como entrada y realiza su lectura:
input_x( )
Sintaxis value = input_x()
Parametros value es el valor booleano que se lee de la entrada x.
2.4.2 Lectura del pin de Entrada
La siguiente función configura el PIN como entrada y realiza su lectura:
input( )
Sintaxis value = input(pin)
Parametros value es el valor que se lee del pin x.
Autor: Luis Alberto Vargas Tijerino. Página 14
2.4.3 Escritura del puerto.
La siguiente función configura el puerto como salida y realiza su escritura:
output_x( )
Sintaxis output_x (value)
Parametros value es el valor de 8 bits que se escribe en la salida x.
2.4.4 Escritura de un pin.
Las siguientes funciones configuran el pin como salida y realizan su escritura:
output_low( ), output_high( ) y output_bit( )
Sintaxis output_low(pin ) Pone a 0 el pin output_high(pin) Pone a 1 el pin output_bit(pin,value) Le da el valor de value al pin.
2.4.5 Configuración rápida de los pines I/O.
Una configuración rápida genera código más eficiente, ya que el compilador asume que los pines de I/O serán
cambiados solo si es especificado por el usuario. A continuación se muestra la función para decidir si los pines
de un puerto son de entrada o salida:
set_tris_x( )
Sintaxis set_tris_x(value)
Parametros value es un valor de 8 bits, cada bit determina si el pin correspondiente es de entrada o salida. Por ejemplo: si el bit 0 es igual a 0 entonces el pin 0 será salida y si el bit 4 es 1 entonces el bit 4 será una entrada.
Al utilizar la función anterior siempre es necesario utilizar la siguiente directiva:
#USE FAST_IO
Sintaxis #use fast_io (port)
Parametros port puede ser:
A solo el puerto A
B solo el puerto B
C solo el puerto C
D solo el puerto D
E solo el puerto E
F solo el puerto F
G solo el puerto G
H solo el puerto H
I solo el puerto I
J solo el puerto J
ALL. Todos los puertos
Autor: Luis Alberto Vargas Tijerino. Página 15
2.4.6 Manejo a través de la RAM
La siguiente etiqueta nos permite manipular los puertos directamente como un dato:
#byte PORTx=getenv(“SFR:PORTx”)
2.5 Procedimiento. 1. Repetir los pasos del 1 al 4 en Crear el Proyecto en CCS.
2. Crear una Nueva carpeta llamada Lab2 y una subcarpeta llamada LED_Botones en la ubicación que
consideres necesaria (Ejemplo: Carpeta Mis Documentos).
3. Abrir la carpeta LED_Botones y guardar el proyecto con el nombre de LED_Botones.
4. Copiar el Código 2.1 Led_botones
Código 2.1 Led_botones
///////////////////////////////////////////////////////////////////////////////
//Autor: Luis Alberto Vargas Tijerino.
//Alias: Bigluis.
//Pais: Nicaragua.
//Fecha: 8-Nov-10.
///////////////////////////////////////////////////////////////////////////////
#include <16f887.h>//pic a utilizar
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES NOBROWNOUT //No brownout reset
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOWRT //Program memory not write protected
#FUSES BORV40 //Brownout reset at 4.0V
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay (clock=8M) //Fosc=8Mhz
#use FAST_IO(D)
#byte PORTD=getenv("SFR:PORTD")
///PROGRAMA
void main(void){
setup_adc_ports(NO_ANALOGS|VSS_VDD); //Todas las entradas del PIC Seran Digitales.
setup_comparator(NC_NC_NC_NC); //Los comparadores Analogicos estaran apagados.
set_tris_d(0x0F); //Configura PORTD<7:4> como salidas y PORTD<3:0> como entradas.
while(TRUE){ //bucle infinito
output_b(input_a()); //El PORTB se configura como salida y es igual a PORTA
output_low(PIN_C0); //El PIN_C0 se configura como salida y se pone en bajo
output_high(PIN_C0); //El PIN_C0 se configura como salida y se pone en alto
output_bit(PIN_C1,0); //El PIN_C1 se configura como salida y se pone en bajo
output_bit(PIN_C1,1); //El PIN_C1 se configura como salida y se pone en alto
output_bit(PIN_C2,input(PIN_A0)); //El PIN_C2 se configura como salida y se le asigna el
//valor del PIN_A0 configurado como entrada.
PORTD=input_a(); //El valor del nibble superior de PORTA se transferira al de PORTD
}
}
5. Presionar F9 para compilar el proyecto.
6. Crear el circuito en Proteus. Para ello será necesario buscar mediante la caja de búsqueda en la
ventana PICK DEVICE el PIC16F887, el LOGICSTATE y el LOGICPROBE.
Autor: Luis Alberto Vargas Tijerino. Página 16
7. Cargar el Archivo fuente Led_Botones.cof, Realizar la simulación y Abrir la ventana de observación y
Agregar los Registros TRISA, TRISB, TRISC, TRISD, PORTA, PORTB, PORC y PORTD.
a. ¿Cuál es el valor del registro TRISD después de la línea 32?
b. ¿Cuál es el valor de los registros TRISB, TRISA, PORTB y PORTA después de la línea 34?
c. ¿Cuál es el valor de los registros TRISC y PORTC después de las líneas 35, 36, 37, 38 y 39?
d. ¿Cuál es el valor del registro PORTD después de la línea 41?
e. ¿Hacia dónde se realiza el salto después de la línea 42?
f. Cambia los valores de los LOGICSTATES y contesta de nuevo las preguntas a hasta f.
g. ¿Cuál es el valor de PORTD después de la línea 41 si PORTA es mayor a 0b00001111?
h. ¿Cuál es el valor de PORTD después de la línea 41 si PORTA es menor a 0b00001111?
2.6 Trabajo Extra Clase 1. Elabore un programa en CCS que encienda los LED conectados a PORTB (1 a la vez) cada 1 segundo.
2. Elabore un programa que muestre en PORTD el valor ingresado a PORTB.
3. Explique si es posible elaborar un programa que combine las dos tareas de los problemas 1 y 2.
LOGICSTATE
LOGICPROBE
PIC16F887
Autor: Luis Alberto Vargas Tijerino. Página 17
Laboratorio 3: Pantalla LCD.
3.1 Objetivo. Familiarizarse con la conexión y utilización de la pantalla LCD 16x2 mediante la implementación práctica del
ejemplo LCD_HolaMundo.
3.2 Introducción. Existe una gran cantidad de proyectos en las que es necesario visualizar información a través de una pantalla
de bajo costo. En este laboratorio explicaremos cómo realizar la comunicación y configuración entre el PIC y el
LCD de 16 caracteres por 2 líneas que posee un controlador del tipo HD44780.
3.3 Pantalla LCD. Las Pantallas LCD tienen la capacidad de mostrar cualquier carácter alfanumérico, permitiendo presentar la
información que genera cualquier equipo electrónico de forma fácil y económica. Cada carácter consta de una
matriz de puntos (generalmente 5x7), que se distribuyen en una, dos, tres o cuatro líneas de 16 hasta 40
caracteres. Estas pantallas incorporan un microcontrolador HD44780 que gobierna su funcionamiento.
Estas pantallas tienen la posibilidad de mostrar letras griegas y caracteres elaborados por el usuario.
3.3.1 Configuración del Puerto para el LCD.
Existen dos maneras de configurar el puerto que se conectara al LCD, la primera realiza la conexión mediante
el puerto completo para ello se realiza lo siguiente.
#define use_portx_lcd TRUE
O
#define LCD_DATA_PORT getenv("SFR:PORTx")
Donde x es el puerto a utilizar, este debe tener 8 bits. La desventaja de utilizar esta instrucción es que los
pines quedan configurados por defecto de la siguiente manera:
PIN_X0 ENABLE
PIN_X1 RS
PIN_X2 RW
PIN_X4 D4
PIN_X5 D5
PIN_X6 D5
PIN_X7 D5
La segunda forma de configurar el puerto del LCD es más flexible, ya que nos permite seleccionar la conexión
de cada pin. A continuación se muestra cómo hacerlo.
Autor: Luis Alberto Vargas Tijerino. Página 18
...
#define LCD_ENABLE_PIN PIN_X5
#define LCD_RS_PIN PIN_X4
#define LCD_RW_PIN PIN_X6
#define LCD_DATA4 PIN_X0
#define LCD_DATA5 PIN_X1
#define LCD_DATA6 PIN_X2
#define LCD_DATA7 PIN_X3
...
Nota: El usuario puede variar el orden de los pines que se muestra en la configuración anterior.
3.3.2 Fichero o Librería LCD.C
El archivo LCD.C es un fichero (driver) propio del compilador PIC-C, para utilizarlo es necesario realizar la
llamada de las siguiente manera.
...
//Configuración del Puerto.
#include <lcd.c>
...
3.3.3 Inicialización del LCD.
El primer paso para utilizar el LCD es inicializarlo, con esto ocurre lo siguiente:
1. Se borra el LCD.
2. Se configura en el formato de 4 bits y con caracteres de 5x8 puntos
3. El LCD se pone en modo encendido
4. El cursor se apagado y se configura para que no parpadee.
Para inicializar el LCD es necesario utilizar la siguiente función.
Lcd_init()
3.3.4 Ubicación del cursor en una posición.
Para ubicar el cursor en una ubicación especificada por el usuario se utiliza la siguiente función:
Lcd_gotoxy( )
Sintaxis Lcd_gotoxy(x , y)
Parametros x es la fila en que se ubicará el cursor. y es la columna en que se ubicará el cursor.
3.3.5 Escribir caracteres en el LCD
Para escribir caracteres en el LCD es posible utilizar dos funciones, la primera función es la siguiente:
Lcd_putc( )
Sintaxis Lcd_putc(c)
Parametros c puede ser el carácter que se escribirá en el LCD o puede ser una cadena de caracteres.
La segunda función que nos permite escribir en el LCD es la siguiente:
Autor: Luis Alberto Vargas Tijerino. Página 19
Printf( )
Sintaxis printf(fname,string,values),
Parametros String es la cadena de caracteres que se escribirá en el LCD. Fname es el nombre de la función que utilizará printf, en este caso será lcd_putc. Values es la lista de variables que serán impresas separadas por comas.
El formato es %nt, donde n es opcional y puede ser: 1-9: para especificar cuantos caracteres se deben especificar. 01-09: para indicar cantidad de ceros a la izquierquierda. 1.1-9.9: para coma flotante.
t puede indicar: c Carácter. s Cadena de caracteres. u Entero sin signo. d Entero con signo. Lu Entero largo sin signo. Ld Entero largo con signo. x Entero Hexadecimal con letras en minúsculas. X Entero Hexadecimal con letras en mayúsculas. Lx Entero Largo Hexadecimal (minúsculas). LX Entero largo Hexadecimal (mayúsculas). f Flotante con truncado. g Flotante en formato exponencial. w Entero sin signo con decimales insertados. La 1ª cifra indica el total, la 2ª el
número de decimales.
La Tabla 3.1 ejemplos de los distintos formatos:
Tabla 3.1
Formato Valor = 0x12 Valor = 0xFE
%03u 018 254 %u 18 254
%2u 18 * %5 18 254 %d 18 -2 %x 12 Fe %X 12 FE
%4X 0012 00FE %3.1w 1.8 25.4
A continuación se muestran los caracteres especiales que se utilizan en el LCD:
\f: Se utiliza para borrar el LCD y se ubica al inicio de cada línea.
\n: Se utiliza para realizar un salto de línea.
\b: Se utiliza para mover el cursor un espacio hacia atrás.
La Tabla 3.2 muestra los caracteres que se pueden escribir en el LCD.
Autor: Luis Alberto Vargas Tijerino. Página 20
Tabla 3.2
3.4 Procedimiento 1. Repetir los pasos del 1 al 4 en Crear el Proyecto en CCS.
2. Crear una Nueva carpeta llamada LCD_HolaMundo.
3. Abrir la carpeta LCD_HolaMundo y guardar el proyecto con el nombre de LCD_HolaMundo.
4. Copiar el Código 3.1 LCD_HolaMundo
Código 3.1 LCD_HolaMundo
///////////////////////////////////////////////////////////////////////////////
//Autor: Luis Alberto Vargas Tijerino.
//Alias: Bigluis.
//Pais: Nicaragua.
Autor: Luis Alberto Vargas Tijerino. Página 21
//Fecha: 12-Nov-10.
///////////////////////////////////////////////////////////////////////////////
#include <16f887.h>//pic a utilizar
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES NOBROWNOUT //No brownout reset
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOWRT //Program memory not write protected
#FUSES BORV40 //Brownout reset at 4.0V
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay (clock=8M) //Fosc=4Mhz
//Definir Pines de conexion al LCD
#define LCD_ENABLE_PIN PIN_B0
#define LCD_RS_PIN PIN_B1
#define LCD_RW_PIN PIN_B2
#define LCD_DATA4 PIN_B3
#define LCD_DATA5 PIN_B4
#define LCD_DATA6 PIN_B5
#define LCD_DATA7 PIN_B6
#include <lcd.c> //Llamada a la libreria lcd.c
int a=135; //Declaramos e iniciamos a
long b=0x1234; //Declaramos e iniciamos b
int32 c=12345678; //Declaramos e iniciamos c
float d=3.98;
void main(){
setup_adc_ports(NO_ANALOGS|VSS_VDD); //Todas las entradas del PIC Seran Digitales.
setup_comparator(NC_NC_NC_NC); //Los comparadores Analogicos estaran apagados.
lcd_init(); //Inicializamos el LCD.
while(1){
lcd_putc("\f Hola Mundo\n"); //Se escribe en el LCD la cadena Hola mundo.
lcd_putc(0b11100000); //Escribe el caracter alfa
printf(lcd_putc,"\f %03u %u",a,a); //Escribe a en 4 formatos
printf(lcd_putc,"\n %x %d",a,a); //Escribe a en 4 formatos en la segunda linea
printf(lcd_putc,"\f %X %2.1w",a,a); //Escribe a en formatos hexadecimal y con flotante
printf(lcd_putc,"\f %Lu \n %Ld",b,b); //Escribe b en formato unsigned y formato decimal
printf(lcd_putc,"\f %Lu \n%Ld",c,c); //Escribe b en formato unsigned y formato decimal
//! printf(lcd_putc,"\f %f \n %g",d,d); //Escribe c en formato flotante truncado y con exponencial
}
}
5. Presionar F9 para compilar el proyecto.
6. Crear el circuito en Proteus. Para ello será necesario buscar mediante la caja de búsqueda en la
ventana PICK DEVICE el PIC16F887 y el LM016L.
Autor: Luis Alberto Vargas Tijerino. Página 22
7. Cargar el Archivo fuente LCD_HolaMundo.cof y Realizar la simulación.
8. Conteste:
a. ¿Qué ocurre en las líneas 45 a la 53?
b. Comente la línea 53 y descomente la línea 54 y explique que ocurre en la línea 54?
3.5 Trabajo Extra Clase 1. Elabore un programa en CCS que muestre en la primera línea del LCD “PORTB=” y en la segunda línea
muestre el valor de PORTB en formato unsigned int.
LM016
PIC16F88
Autor: Luis Alberto Vargas Tijerino. Página 23
Laboratorio 4: Convertidor Analógico a Digital.
4.1 Objetivo. Familiarizarse con el módulo de conversión analógico digital mediante la implementación práctica del ejemplo
Leer_ADC.
4.2 Introducción. Existe una gran cantidad de proyectos en las que es necesario que nuestros dispositivos digitales realicen
operaciones de control de variables analógicas tales como temperatura, presión, flujo, caudal, peso, distancia,
velocidad o similares. Este laboratorio trata de explicar cómo realizar la configuración del módulo ADC del PIC
para realizar las mediciones antes mencionadas.
4.3 Conversor Analógico Digital. Un conversor analógico-digital (ADC, Analog-to-Digital Converter) es un dispositivo electrónico capaz de
convertir una entrada analógica de voltaje en un valor binario, Se utiliza en equipos electrónicos como
ordenadores, grabadores de sonido y de vídeo, y equipos de telecomunicaciones. La señal analógica, que varía
de forma continua en el tiempo, se conecta a la entrada del dispositivo y se somete a un muestreo a una
velocidad fija, obteniéndose así una señal digital a la salida del mismo. [Wikipedia]
El convertidor Analógico-digital del PIC16F887 permite la conversión de una señal de entrada analógica a un
valor en representación binaria de 10 bits o de 8 bits. Este dispositivo usa 13 entradas analógicas que son
multiplexadas hacia un circuito de muestreo y retención (Sample and Hold). La salida del muestreo y retención
es conectada a la entrada del convertidor. El convertidor genera un resultado binario de 10 bits o de 8 bits
mediante aproximaciones sucesivas y almacena el resultado de la conversión en dos registros (ADRESL y
ADRESH). La Figura 4.1 muestra el diagrama en bloques del módulo ADC y la Figura 4.2 muestra el modelo de
la Entrada Analógica.
Figura 4.1 Diagrama en Bloque del ADC
Autor: Luis Alberto Vargas Tijerino. Página 24
Figura 4.2 Modelo de una Entrada Analógica
Como se observa en la Figura 4.1 es posible seleccionar el voltaje de referencia del ADC mediante software.
A continuación se muestra la función de transferencia del ADC.
4.3.1 Formato del resultado de la conversión.
Para especificar el formato del resultado de la conversión se escribe arriba de todas las funciones lo siguiente:
#device adc=valor
Donde el valor que se le asigna a ADC puede ser de 8 ó 10 bits.
4.3.2 Configuración de las entradas analógicas del ADC.
Para realizar la configuración de los puertos ADC se utiliza la siguiente función:
setup_adc_ports(value)
Sintaxis setup_adc_ports(value)
Parametros value podría ser una o más de las siguientes constantes:
sAN0 Selecciona AN0 analógica
sAN1 Selecciona AN1 analógica
sAN2 Selecciona AN2 analógica
sAN3 Selecciona AN3 analógica
Autor: Luis Alberto Vargas Tijerino. Página 25
sAN4 Selecciona AN4 analógica
sAN5 Selecciona AN5 analógica
sAN6 Selecciona AN6 analógica
sAN7 Selecciona AN7 analógica
sAN8 Selecciona AN8 analógica
sAN9 Selecciona AN9 analógica
sAN10 Selecciona AN10 analógica
sAN11 Selecciona AN11 analógica
sAN12 Selecciona AN12 analógica
sAN13 Selecciona AN13 analógica
NO_ANALOGS Selecciona ninguna analógica
ALL_ANALOG Selecciona todas analógica
VSS_VDD Seleccionamos Vss como Vref- y Vdd como Vref+
VSS_VREF Seleccionamos Vss como Vref- y Vref+ como Vref+
VREF_VREF Seleccionamos Vref- como Vref- y Vref+ como Vref+
VREF_VDD Seleccionamos Vref- como Vref- y Vdd como Vref+ Ejemplo setup_adc_ports(sAN0|sAN1|VSS_VDD);
//Seleccionamos AN0 y AN1 como analógicas, Vss y Vdd como Vref.
4.3.3 Configuración del ADC.
Para realizar la configuración del ADC se utiliza la siguiente función:
setup_adc()
Sintaxis setup_adc(value)
Parametros mode podría ser una o más de las siguientes constantes:
ADC_OFF Apagamos el ADC.
ADC_CLOCK_DIV_2 Utiliza Fosc/2 (ej. Fosc=1MHz)
ADC_CLOCK_DIV_8 Utiliza Fosc/8 (ej. Fosc=1MHz)
ADC_CLOCK_DIV_32 Utiliza Fosc/32 (ej. Fosc=20MHz y 8MHz)
ADC_CLOCK_INTERNAL Utiliza el reloj RC interno. Ejemplo setup_adc_ports(sAN0|sAN1|VSS_VDD);
//Seleccionamos AN0 y AN1 como analógicas, Vss y Vdd como Vref.
4.3.4 Lectura del Valor de la conversión ADC.
Para realizar la lectura del valor de la conversión ADC se utiliza la siguiente función:
read_adc( )
Sintaxis value = read_adc ([mode])
Parametros mode es un parámetro opcional. Si es usado puede ser uno de los siguientes valores:
ADC_START_AND_READ Toma lecturas continuamente. Este está por defecto.
ADC_START_ONLY Inicia la conversión y no retorna valor.
ADC_READ_ONLY Lee el último valor de conversión. Ejemplo read_adc(); //Se inicia la conversión y retorna el valor del
//ADC. read_adc(ADC_START_ONLY); //Inicia la conversion AD.
...otras tareas
Value=read_adc(READ_ONLY); //Lee el valor del ADC.
Autor: Luis Alberto Vargas Tijerino. Página 26
4.4 Procedimiento. 1. Repetir los pasos del 1 al 4 en Crear el Proyecto en CCS.
2. Crear una Nueva carpeta llamada Lab3 en la ubicación que consideres necesaria (Ejemplo: Carpeta Mis
Documentos).
3. Abrir la carpeta Lab3 y guardar el proyecto con el nombre de Leer_ADC.
4. Copiar el Código 4.1 Leer_ADC
Código 4.1 Leer_ADC
///////////////////////////////////////////////////////////////////////////////
//Autor: Luis Alberto Vargas Tijerino.
//Alias: Bigluis.
//Pais: Nicaragua.
//Fecha: 16-Nov-10.
///////////////////////////////////////////////////////////////////////////////
#include <16f887.h>//pic a utilizar
#device adc=10
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES NOMCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES NOBROWNOUT //No brownout reset
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOWRT //Program memory not write protected
#FUSES BORV40 //Brownout reset at 4.0V
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay (clock=8M) //Fosc=8Mhz
//Definir Pines de conexion al LCD
#define LCD_ENABLE_PIN PIN_B5
#define LCD_RS_PIN PIN_B4
#define LCD_RW_PIN PIN_B6
#define LCD_DATA4 PIN_B0
#define LCD_DATA5 PIN_B1
#define LCD_DATA6 PIN_B2
#define LCD_DATA7 PIN_B3
#include <lcd.c> //Llamada a la libreria lcd.c
///PROGRAMA
void main(void){
long val;
setup_comparator(NC_NC_NC_NC); //Los comparadores Analogicos estaran apagados.
setup_adc_ports(sAN0|VSS_VDD); //AN0 sera analogica las demas Digitales.
SETUP_ADC(ADC_CLOCK_INTERNAL); //La fuente de reloj para la conversion sera
//El circuito RC interno del PIC, su TAD tipico
//es de 4us.
//! SETUP_ADC(ADC_CLOCK_DIV_32); //La fuente de reloj para la conversion sera
//Fosc externa entre 32, por lo tanto TAD=4us.
SET_ADC_CHANNEL(0); //Seleccionamos canal 0 para leerlo.
lcd_init(); //Inicializamos el LCD.
lcd_putc("\fValor Leido="); //Se muestra en el LCD la cadena "Valor Leido="
while(TRUE){ //Inicia el ciclo Infinito.
val=READ_ADC(); //Se lee y guarda el valor del ADC
printf(lcd_putc,"%4Lu",val); //Se imprime en el LCD el valor leido del ADC
lcd_gotoxy(13,1); //Se envia el cursor a la columna 13 fila 1.
}
}
Autor: Luis Alberto Vargas Tijerino. Página 27
5. Compilar el proyecto.
6. Crear el circuito en Proteus. Para ello será necesario buscar mediante la caja de búsqueda en la
ventana PICK DEVICE el PIC16F887, el LCD 16x2 y el POT-HG.
7. Cargar el Archivo fuente Leer_ADC.cof y Realizar la simulación.
8. Conteste:
a. ¿Cuánto es el tiempo que transcurre para que el ADC realice la adquisición del dato en la línea
53?
b. Comente la línea 44, descomente la línea 46 y conteste la pregunta anterior.
4.5 Trabajo Extra clase 1. Conteste:
a. Elabore una lista de algunos sensores de temperatura, presión, luz y nivel.
b. ¿Cómo funciona un LM35?
2. Realice un programa en CCS que muestre la temperatura medida por un sensor LM35.
LCD 16x2
PIC16F887
POT-HG
Autor: Luis Alberto Vargas Tijerino. Página 28
Laboratorio 5: Interrupción por Lectura de Entradas.
5.1 Objetivo. Familiarizarse con la utilización de la interrupción por cambio en las Entradas digitales mediante la
implementación práctica de esta guía de laboratorio.
5.2 Introducción. En casi todos los proyectos es necesario leer alguna entrada de tipo digital conectada a pulsadores,
interruptores, sensores digitales o similares. Este laboratorio trata de explicar cómo realizar esto de la manera
más eficiente.
5.3 Interrupciones. Una Interrupción consiste en un mecanismo por el cual un evento interno o externo puede interrumpir la
ejecución de un programa en cualquier momento. Esto produce un salto automático a una subrutina de
atención a la interrupción, ésta atiende inmediatamente el evento y retoma luego la ejecución del programa
exactamente donde estaba en el momento de ser interrumpido.
Las fuentes de interrupción dependen del PIC utilizado. Por ejemplo, el PIC16F84 tiene 4 fuentes de
interrupción mientras que la familia PIC16F88X tiene entre 13 y 14.
Los PIC de gama baja y media tienen un único vector de interrupción situado en la dirección 04h de programa,
mientras que los de gama alta tienen dos vectores de interrupción de distinta prioridad, alta y baja, situados
en la posición 08h y 18h de la memoria.
5.3.1 Configuración de las interrupciones.
A continuación se describen un conjunto de funciones que se utilizan para configurar las interrupciones:
disable_interrupts(level) Desabilita la interrupción Especificada.
enable_interrupts(level) Habilita la interrupción especificada.
clear_interrupt(level) Limpia el flag de interrupció especificado. Esto puede ser utilizado durante una
interrupción global, o para prevenir la utilización de una interrpupción.
5.4 Interrupción Externa INT. La fuente de interrupciones externa INT se utiliza para atender eventos externos en tiempo real, por ejemplo
detectar el cruce por cero de una señal. La interrupción se puede producir si y sólo si el cambio en RB0/INT es
durante el flanco ascendente o si y sólo si es durante el flanco descendente.
5.4.1 Configuración de la interrupción externa INT.
Para realizar la configuración de la interrupción externa INT es necesario realizar lo siguiente:
1. Escribir la rutina de interrupción y sobre ella su directiva a como se muestra a continuación:
#INT_EXT
Void int_ext_isr(){
…
Autor: Luis Alberto Vargas Tijerino. Página 29
Código de la interrupcion
…
}
2. Dentro de la rutina principal habilitar las interrupciones globales y Habilitar la interrupción INT a como
se muestra a continuación:
Void main(){
…
enable_interrups(GLOBAL); //Habilita las interrupciones Globales.
enable_interrups(INT_EXT); //Habilita las interrupcion INT_EXT.
…
}
5.5 Interrupción por cambio en PORTB. La fuente de interrupciones por cambio en PORTB se utiliza para atender eventos externos en tiempo real,
tales como manejo de botones o interruptores. La interrupción se puede producir si el cambio en alguno de
los Pines en RB es durante el flanco ascendente o si es durante el flanco descendente.
Todos los pines del PORTB están configurados como pines de Interrupción-en-cambio. Para que se habilite la
interrupción el valor presente es comparado con el valor almacenado en la última lectura para determinar
cuál bit ha sido cambiado o cual no coincide.
Esta interrupción puede despertar al dispositivo del modo sleep. Para salir de la rutina de interrupción el
usuario debe leer el PORTB para eliminar la condición de error.
5.5.1 Configuración de la interrupción por cambio en PORTB.
Para realizar la configuración de la interrupción por es necesario realizar lo siguiente:
1. Escribir la rutina de interrupción y sobre ella su directiva a como se muestra a continuación:
#INT_RBx
Void RBx_isr(){
…
Código de la interrupcion
…
}
2. Dentro de la rutina principal habilitar las interrupciones globales y Habilitar la interrupción TMR0 a
como se muestra a continuación:
Void main(){
…
enable_interrups(GLOBAL); //Habilita las interrupciones Globales.
enable_interrups(INT_RBx); //Habilita las interrupcion INT_RBx.
…
}
Autor: Luis Alberto Vargas Tijerino. Página 30
5.6 Procedimiento. 1. Repetir los pasos del 1 al 4 en Crear el Proyecto en CCS.
2. Crear una Nueva carpeta llamada Lab4 y una subcarpeta llamada LED_Botones2 en la ubicación que
consideres necesaria (Ejemplo: Carpeta Mis Documentos).
3. Abrir la carpeta LED_Botones2 y guardar el proyecto con el nombre de LED_Botones2.
4. Copiar el Código 5.1 Led_botones2
Código 5.1 Led_botones2
///////////////////////////////////////////////////////////////////////////////
//Autor: Luis Alberto Vargas Tijerino.
//Alias: Bigluis.
//Pais: Nicaragua.
//Fecha: 8-Nov-10.
///////////////////////////////////////////////////////////////////////////////
#include <16f887.h>//pic a utilizar
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES NOBROWNOUT //No brownout reset
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOWRT //Program memory not write protected
#FUSES BORV40 //Brownout reset at 4.0V
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay (clock=8M) //Fosc=8Mhz
///PROGRAMA
#INT_RB
void RB_ISR(void){ //Inicio de la interrupcion por cambio de PORTB
int aux; //Declaracion de la variable aux.
output_bit(PIN_A0,input(PIN_B0)); //Hacemos que RA0 sea igual a RB0.
aux=input_B(); //Leemos el valor del PORTB para eliminar la condicion
} //de error y que sea posible salir de la interrupcion.
void main(void){
setup_adc_ports(NO_ANALOGS|VSS_VDD); //Todas las entradas del PIC Seran Digitales.
setup_comparator(NC_NC); //Los comparadores Analogicos estaran apagados.
ENABLE_INTERRUPTS(GLOBAL); //Habilitamos las interrupciones Globales
ENABLE_INTERRUPTS(INT_RB0); //Habilitamos las interrupciones por cambio en PIN_B0
while(TRUE){ //bucle infinito
SLEEP(); //Ponemos el PIC en modo de bajo consumo.
}
}
5. Compilar el proyecto.
6. Crear el circuito en Proteus. Para ello será necesario buscar mediante la caja de búsqueda en la
ventana PICK DEVICE el PIC16F887, el LOGICSTATE y el LOGICPROBE.
Autor: Luis Alberto Vargas Tijerino. Página 31
7. Cargar el Archivo fuente Led_Botones2.cof y Realizar la simulación.
8. Conteste:
a. ¿Qué ocurre en la línea 39?
b. De doble clic en la línea 29 para generar un break point y explique cuándo ocurre el salto hacia
la línea 29.
c. Comente la línea 36 y conteste la pregunta anterior de nuevo.
5.7 Trabajo Extra Clase Elabore un programa en CCS que muestre una secuencia de LED conectados al PORTC (1 a la vez) cada 1
segundo y que muestre en PORTC el valor ingresado por PORTB (utilizar interrupción por cambio en PORTB).
PIC16F887
LOGICSTATE
LOGICPROBE
Autor: Luis Alberto Vargas Tijerino. Página 32
Laboratorio 6: Interrupción por Desbordamiento del TMR0.
6.1 Objetivo. Utilizar la interrupción por desbordamiento del TMR0 mediante la implementación de esta práctica de
laboratorio para comprender su funcionamiento.
6.2 Introducción. En el Laboratorio anterior se estudió el concepto de interrupción, específicamente las interrupciones
producidas por cambio en las entradas. En este laboratorio estudiaremos la interrupción por desbordamiento
del TMR0 en el cual realizaremos un ejemplo práctico.
6.3 Temporizadores. Los TIMERs o Temporizadores son módulos integrados en el PIC que permiten realizar cuentas tanto de
eventos internos como externos. Cuando la cuenta es interna se habla de temporización y cuando la cuenta es
externa se habla de contador.
Los Temporizadores son útiles en caso de requerir que los eventos ocurran en tiempos exactas, ya que sin
ellos hay que tener en cuenta el tiempo de ejecución de las instrucciones y de los saltos.
Por lo general se comete el error de realizar las temporizaciones mediante retardos pero esto se hace
imposible si necesitamos que el PIC realice otra tarea mientras se está ejecutando la temporización.
La manera más eficiente de realizar una temporización es cargar el valor en uno de los TIMER, luego se espera
a que ocurra la interrupción cuando este se desborde y finalmente se realizan ajustes finos mediante retardos
pequeños para aumentar la precisión de la temporización.
6.4 Módulo TIMER0. El módulo TIMER0 es un Temporizador/Contador con las siguientes características:
Temporizador/Contador de 8bits.
Prescaler de 8 bits (compartido con el Watchdog Timer).
Fuente de reloj externa o interna programable.
Interrupción por desbordamiento.
6.4.1 Configuración de la interrupción por TIMER0.
Para realizar la configuración de la interrupción por TIMER0 es necesario realizar lo siguiente:
1. Escribir la rutina de interrupción y sobre ella su directiva a como se muestra a continuación:
#INT_TMR0
Void TMR0_isr(){
…
Código de la interrupcion
…
}
Autor: Luis Alberto Vargas Tijerino. Página 33
2. Dentro de la rutina principal habilitar el FLAG de interrupción TMR0 y habilitar el FLAG de interrupcion
global, si no se habilita este FLAG no se realizará ninguna interrupción.
Void main(){
…
enable_interrups(GLOBAL); //Habilita las interrupciones Globales.
enable_interrups(INT_TMR0);//Habilita las interrupcion INT_RBx.
…
}
6.4.2 Configuración del TMR0.
La función que se encarga de realizar la configuración del módulo TIMER0 es la siguiente:
setup_timer_0 (mode)
Sintaxis setup_timer_0 (mode)
Parametros mode podría ser dos de las siguientes constantes:
T0_INTERNAL
T0_EXT_L_TO_H
T0_EXT_H_TO_L
T0_DIV_1
T0_DIV_2
T0_DIV_4
T0_DIV_16
T0_DIV_32
T0_DIV_64
T0_DIV_128
T0_DIV_256 period es un int de 0-255 que determina cuando el valor del reloj se reinicia. postscale es un numero de 1-16 que determina cuantos desbordes del timer antes de una interrupción. (1 significa una vez, 2 significa 2 veces, etc.).
Ejemplo Setup_timer_0(T0_INTERNAL|T0_DIV_1); //utiliza reloj interno y lo divide entre 1
6.4.3 Modificación y obtención del valor de TIMER0.
Las funciones que se encargan de realizar la obtención y modificación del módulo TIMER0 son las siguientes:
set_timer0() y get_timer0()
Sintaxis set_timer_0 (value) y get_timer0()
Parametros value es el valor que tendrá TIMER0 en ese instante
6.4.4 Cálculo de la temporización.
Las temporizaciones se pueden calcular de la siguiente manera:
4 0 256 0T DIV TMRTemporizacion
Fosc
Autor: Luis Alberto Vargas Tijerino. Página 34
6.4.4.1 Ejemplo
Se desea calcular una temporización de 20 ms para un PIC16F887 conectado a un CRYSTAL de 8MHz.
Sabemos que este PIC posee 9 prescaler para TIMER0, escogeremos T0DIV=256. Lo siguiente sería calcular el
valor de TMR0.
0 2564 0
20 80 256 99
4 256
OSCTemporizacion FTMR
T DIV
ms MHzTMR
6.5 Procedimiento. 1. Repetir los pasos del 1 al 4 en Crear el Proyecto en CCS.
2. Crear una Nueva carpeta llamada Lab5 y una subcarpeta llamada LED_Blink2 en la ubicación que
consideres necesaria (Ejemplo: Carpeta Mis Documentos).
3. Abrir la carpeta LED_Blink2 y guardar el proyecto con el nombre de LED_Blink2.
4. Copiar el Código 6.1 Led_blink2
Código 6.1 Led_blink2
///////////////////////////////////////////////////////////////////////////////
//Autor: Luis Alberto Vargas Tijerino.
//Alias: Bigluis.
//Pais: Nicaragua.
//Fecha: 24-Nov-10.
///////////////////////////////////////////////////////////////////////////////
#include <16f887.h>//pic a utilizar
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES NOBROWNOUT //No brownout reset
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOWRT //Program memory not write protected
#FUSES BORV40 //Brownout reset at 4.0V
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay (clock=8M) //Fosc=8Mhz
#use fast_io(A)
#use fast_io(B)
//Interrupcion por TMR0.
//La interrupcion ocurrira (256-TMR0)*256*4/Fosc=(256-0)*256*4/8MHz=32.768ms
int1 aux;
#INT_TIMER0
void TIMR0_ISR(){
output_bit(PIN_B0,~input_state(PIN_B0)); //Si RB0 es igual a 1 entoneces el valor siguiente sera 0.
} //Si RB0 es igual a 0 entoneces el valor siguiente sera 1.
///PROGRAMA Principal.
void main(void){
set_tris_B(0);
set_tris_A(255);
setup_adc_ports(NO_ANALOGS|VSS_VDD); //Todas las entradas del PIC Seran Digitales.
setup_comparator(NC_NC_NC_NC); //Los comparadores Analogicos estaran apagados.
setup_timer_0(T0_INTERNAL|T0_DIV_256); //La entrada de Reloj para TIMER0 sera interna.
//Se dividira el reloj interno entre 256.
setup_timer_1(T1_DISABLED); //Desabilitamos el TIMER1.
setup_timer_2(T2_DISABLED,0,1); //Desabilitamos el TIMER2.
Autor: Luis Alberto Vargas Tijerino. Página 35
enable_interrupts(INT_TIMER0); //Habilitamos la interrupcion por desborde del TIMER0.
enable_interrupts(GLOBAL); //Habilitamos la interrupciones globales.
while(TRUE){ //bucle infinito
output_bit(PIN_B1,input(PIN_A1)); //RB1 sera igual a RA1.
}
}
5. Presionar F9 para compilar el proyecto.
6. Crear el circuito en Proteus. Para ello será necesario buscar mediante la caja de búsqueda en la
ventana PICK DEVICE el PIC16F887, el LOGICSTATE y el LOGICPROBE.
7. Para insertar el OSCILLOSCOPE será necesario dar clic en el botón “Virtual Instrument” del cinta de
botones izquierda y luego se debe dar clic en la opción “OSCILLOSCOPE” del panel lateral a como se
muestra en la siguiente figura.
OSCILLOSCOPE
PIC16F88
7
LOGICSTATE
LOGICPROBE
Botón Virtual
Instruments
Panel
Instruments
Autor: Luis Alberto Vargas Tijerino. Página 36
8. Cargar el Archivo fuente Led_Blink2.cof y Realizar la simulación.
6.6 Trabajo Extra Clase Elabore un programa en CCS que muestre una secuencia de LEDs conectados al PORTC (1 a la vez) cada 1
segundo y que muestre en PORTC el valor ingresado por PORTB (utilizar interrupción por cambio en PORTB y
por desbordamiento de TMR0).
Autor: Luis Alberto Vargas Tijerino. Página 37
Laboratorio 7: Generador de señal PWM.
7.1 Objetivo. Familiarizarse con la utilización del módulo CCP en modo PWM mediante la implementación práctica del
ejemplo práctico Gen_PWM
7.2 Introducción. Este laboratorio trata de mostrar la teoría y el procedimiento utilizado para generar una señal PWM mediante
el módulo CCP1 del PIC16F887.
7.3 Modulación por ancho de pulsos La modulación por ancho de pulsos (PWM, pulse-width modulation) de una señal o fuente de energía es una
técnica en la que se modifica el ciclo de trabajo de una señal periódica (una senoidal o una cuadrada, por
ejemplo), ya sea para transmitir información a través de un canal de comunicaciones o para controlar la
cantidad de energía que se envía a una carga.
El ciclo de trabajo de una señal periódica es el ancho relativo de su parte positiva en relación con el período.
Expresado matemáticamente:
D es el ciclo de trabajo
τ es el tiempo en que la función es positiva (ancho del pulso)
T es el período de la función [Wikipedia]
[wikipedia]
7.4 Módulo CCP. Los módulos CCP (Capture/Compare/PWM) permiten realizar las siguientes Funciones:
Captura: obtiene el valor del temporizador en un momento dato, fijado por la acción de un terminal
del PIC.
Comparación: compara el valor del temporizador con el valor de un registro y provoca una acción en el
PIC.
Autor: Luis Alberto Vargas Tijerino. Página 38
PWM: genera una señal modulada por ancho de pulso.
Los PIC de gama media pueden tener hasta 2 módulos CCP.
7.4.1 Configuración del Módulo CCP en Modo PWM.
La función que se encarga de realizar la configuración del módulo CCP es la siguiente:
setup_ccpX( )
Sintaxis setup_ccp1 (mode) o setup_ccp2 (mode)
Parametros mode es una constant. Las constantes válidas se encuentran en los archivos .h del dispositivo y son las siguientes: Deshabilita el módulo CCP CCP_OFF Configuración del CCP para modo PWM:
CCP_PWM Habilita el Pulse Width Modulator
7.4.2 Configuración del ciclo de trabajo.
La función que se encarga de configurar el ciclo de trabajo es la siguiente.
Set_pwm_dutyX( )
Sintaxis set_pwm1_duty (value) ó set_pwm2_duty (value)
Parametros value podría ser una variable o una constante de 8 o 16 bits.
7.5 Módulo TIMER2. Es un temporizador de 8 bits, similar al TIMER0, con las siguientes características:
1. Registro TIMER2 de 8 bits.
2. Registro PR2 de 8 bits.
3. Interrupción al coincidir TIMER2 con PR2.
4. Prescaler programable por software (1:1, 1:4, 1:16).
5. Postcaler programable por software (1:1 hasta 1:16). [hoja de datos].
7.5.1 Configuración de la frecuencia PWM.
El Período de la señal se obtiene al configurar TIMER2 y el valor del registro PR2, para ello se utiliza la
siguiente función:
setup_timer_2( )
Sintaxis setup_timer_2 (mode, period, postscale)
Parametros mode podría ser:
T2_DISABLED
T2_DIV_BY_1
T2_DIV_BY_4
Autor: Luis Alberto Vargas Tijerino. Página 39
T2_DIV_BY_16 period es un int de 0-255 que determina cuando el valor del reloj se reinicia. postscale es un numero de 1-16 que determina cuantos desbordes del timer antes de una interrupción. (1 significa una vez, 2 significa 2 veces, etc.).
[ayuda ccs]
A continuación se describe el funcionamiento del módulo.
En la figura anterior podemos observar que cuando el valor del registro PR2 coincide con el valor del TIMER2
ocurre lo siguiente.
1. Se reinicia TMR2.
2. El pin CCPx se pone a 1 (excepto cuando el Ciclo de trabajo es 0%).
3. El valor del Registro principal del Ciclo de Trabajo (CCPRxL y CCPxCON<5:4>) se carga en el registro
auxiliar del Ciclo de trabajo (CCPRxH mas 2bits).
El Registro principal del Ciclo de Trabajo (CCPRxL y CCPxCON<5:4>) puede ser escrito en cualquier momento
pero no se cargan en el registro auxiliar (CCPRxH mas 2bits) hasta que finalice el Período.
Cuando el valor de TIMER2 coincide con el valor del Ciclo de Trabajo (CCPRxH mas 2bits) el pin CCPx se pone a
0 hasta que PR2 coincida de nuevo con TIMER2 y se inicie el nuevo Período.
7.5.2 Calculo de la Frecuencia PWM.
Con lo dicho anterior mente podemos determinar que la frecuencia PWM depende del valor del prescaler del
TIMER2 T2DIV (valor de mode) y PR2 (valor de period), a continuación se muestra la ecuación para calcular el
Período PWM que nos brinda Microchip.
4 2 2 1PWM OSCT T T DIV PR
Es decir:
Autor: Luis Alberto Vargas Tijerino. Página 40
4 2 2 1
OSCPWM
FF
T DIV PR
7.5.2.1 Ejemplo:
Deseamos que Fpwm=1khz para un PIC16F887 al que se le conecta un cristal de 8MHz.
Sabemos que este PIC posee 3 prescaler T2DIV=1, 4 y 16, por lo tanto el primer paso será despejar el valor de
PR2 de la formula anterior.
2 14 2
OSC
PWM
FPR
F T DIV
El segundo paso será sustituir valores y probar con T2DIV = 1.
82 1 1999
4 1 1
MHzPR
kHz
Como el valor anterior es mayor al valor máximo de PR2, es decir 255, debemos aumentar el valor de T2DIV.
82 1 499
4 1 4
MHzPR
kHz
Como aún el valor anterior es mayor al valor máximo de PR2, es decir 255, debemos aumentar el valor de
T2DIV y finalmente encontramos que:
82 1 124
4 1 16
MHzPR
kHz
Por lo tanto, para configurar la frecuencia PWM debemos ingresar la siguiente función:
Setup_timer_2(T2_DIV_16,124,1)
7.5.3 Resolución del Ciclo de Trabajo.
La resolución determina el número de posibles ciclos de trabajo para un período dado. Por ejemplo, una
resolución de 10 bits resultará en 1024 ciclos de trabajo discretos, mientras que una resolución de 8 bits
resultará en 256 ciclos de trabajo discretos.
La máxima resolución es 10 bits cuando PR2 es 255. La resolución es función del valor del registro PR2 a como
se muestra en la siguiente ecuación.
7.5.3.1 Ejemplo
Calcule la resolución del ciclo de trabajo del ejemplo anterior.
En el ejemplo anterior el valor de PR2 fue 124 por lo tanto su resolución será:
Autor: Luis Alberto Vargas Tijerino. Página 41
log 4 124 18
log 2Resolucion bits
7.6 Procedimiento. 1. Crear el Proyecto en CCS.
2. Copiar el Código 7.1 Gen_PWM
Código 7.1 Gen_PWM
///////////////////////////////////////////////////////////////////////////////
//Autor: Luis Alberto Vargas Tijerino.
//Alias: Bigluis.
//Pais: Nicaragua.
//Fecha: 24-Nov-10.
///////////////////////////////////////////////////////////////////////////////
#include <16f887.h>//pic a utilizar
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES NOBROWNOUT //No brownout reset
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOWRT //Program memory not write protected
#FUSES BORV40 //Brownout reset at 4.0V
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay (clock=8M) //Fosc=8Mhz
#use fast_io(B)
void main(){
signed int sel_Fpwm=0;
unsigned int Duty=127;
set_tris_B(0XFF); //Todos los pines de PORTB seran entradas.
setup_comparator(NC_NC); //Desconectamos los comparadores Analogicos
SETUP_ADC_PORTS(NO_ANALOGS); //Solo AN0 sera analogico los demas digitales.
SETUP_ADC(ADC_OFF); //Apagamos el ADC
setup_ccp1(CCP_PWM); //Configuramos CCP1 en modo PWM simple.
while(TRUE){ //Inicio del ciclo Infinito
while(!input_B()); //Espera a que se active un pin del PORTB.
delay_ms(10); //Retardo de 10ms para eliminar rebotes.
if(input(PIN_B0)) //Si se activa PIN_B0
if(++sel_Fpwm>3) //preincrementamos sel_Fpwm y si es mayor que 3
sel_Fpwm=0; //igualamos sel_Fpwm a 0.
if(input(PIN_B1)) //Si se activa PIN_B1
if(--sel_Fpwm<0) //predecrementamos sel_Fpwm y si es menor que 0
sel_Fpwm=3; //igualamos sel_Fpwm a 2.
if(input(PIN_B2))Duty+=4; //Si se activa PIN_B2 incrementamos Duty en 4.
if(input(PIN_B3))Duty-=4; //Si se activa PIN_B3 decrementamos Duty en 4.
set_pwm1_duty(duty); //El %DT de la senial sera Duty.
switch(sel_Fpwm) { //Fpwm = Fosc/(4*T2_DIV*PR)
case 0 : //Si sel_Fpwm es 0
setup_timer_2(T2_DIV_BY_16,249,1);//Fpwm = 8MHz/(4*16*249)=500Hz
break; //Res=10Bits
case 1 : //Si sel_Fpwm es 1
setup_timer_2(T2_DIV_BY_16,124,1);//Fpwm = 8MHz/(4*16*124)=1000Hz
break; //Res=7Bits
case 2 : //Si sel_Fpwm es 2
setup_timer_2(T2_DIV_BY_16,82,1); //Fpwm = 8MHz/(4*16*82)= 1500Hz
break; //Res=6Bits
default: //De lo contrario
setup_timer_2(T2_DIV_BY_4,249,1); //Fpwm = 8MHz/(4*4*249)= 2000Hz
}; //Res=10Bits
while(input_B()); //Espera a que se desactiven los pines de PORTB
Autor: Luis Alberto Vargas Tijerino. Página 42
}
}
3. Presione F9 para compilar el proyecto.
4. Crear el circuito en Proteus. Para ello será necesario buscar mediante la caja de búsqueda en la
ventana PICK DEVICE el PIC16F887 y el LOGICPROBE.
5. Para insertar el OSCILLOSCOPE será necesario dar clic en el botón “Virtual Instrument” de la cinta de
botones izquierda y luego se debe dar clic en la opción “OSCILLOSCOPE” del panel lateral a como se
muestra en la siguiente figura.
6. Cargar el Archivo fuente GEN_PWM.cof y Realizar la simulación.
7. Conteste:
LOGICPROBE
PIC16F887
OSCILLOSCOPE
Botón Virtual
Instruments
Panel
Instruments
Autor: Luis Alberto Vargas Tijerino. Página 43
a. ¿Cuánto es la resolución para cada una de las frecuencias escogidas?
b. ¿Cuánto debería ser la frecuencia PWM si utilizamos resolución máxima?
c. ¿Qué ocurre cuando el ciclo de trabajo es mayor a la resolución PWM?
d. ¿Qué ocurre en la línea 36 al no presionar ningún botón?
e. ¿Qué ocurre en la línea 38, 39 y 40 si se presiona el botón RB0?
f. ¿Qué ocurre en la línea 41, 42 y 43 si se presiona el botón RB1?
g. ¿Qué ocurre en la línea 44 si se presiona el botón RB0?
h. ¿Qué ocurre en la línea 45 si se presiona el botón RB1?
7.7 Trabajo Extra Clase. 1. Investigue y conteste:
a. ¿Cómo funciona una fuente Conmutada?
b. ¿Cómo funciona un servomotor?
c. ¿Cómo funciona un Amplificador Clase D?
d. ¿Cuál es la frecuencia PWM máxima que se puede generar con un PIC16F887 y un cristal de
20MHz?
2. Elabore un programa en CCS que genere una señal PWM de 1kHz y que se module mediante una
resistencia conectada a una entrada analógica.
Autor: Luis Alberto Vargas Tijerino. Página 44
Laboratorio 8: USART
8.1 Objetivo Comprender el funcionamiento del módulo USART mediante un ejemplo práctico que transmite datos entre
un PIC y una PC u otro PIC.
8.2 Introducción Existe una gran cantidad de proyectos en los que será necesario tomar un conjunto de señales físicas,
convertirlas en tensiones eléctricas y digitalizarlas de manera que se puedan transmitir y procesar en una
computadora. A este tipo de sistemas se les conoce como Sistemas de Adquisición de datos (DAQ, Data
Acquisition por sus siglas en inglés).
Por otro lado los PIC también deben comunicarse con otros PIC o con otros dispositivos que se encuentra
alejados para controlar motores, calderas, nivel de tanques etc…
Por lo cual en este laboratorio estudiaremos la comunicación Serie con la computadora y con otros PIC.
8.3 Módulo USART. El módulo USART (Universal Synchronous Asynchronous Receiver Transmitter) permite la transmisión y
recepción de datos en serie ya sea con un ordenador trabajando en modo full-duplex asíncrono o con
periféricos trabajando en modo half-duplex.
Básicamente, la transmisión serie consiste en enviar los datos bit a bit a través de una línea común en
periodos de tiempo fijos, dando lugar a la llamada velocidad de transmisión o número de bits enviados por
segundo (baudios). Tanto el emisor como el receptor poseen registros de desplazamiento para realizar la
comunicación. Los bit están codificados en NRZ (Not Return to Zero, nivel alto: 1, nivel bajo: 0), NRZI (Not
Return to Zero Inverted, cambio de nivel: 1, sin cambio de nivel: 0), etc.
8.4 Modo Síncrono En el modo síncrono (ver Figura 8.1) se permite la transmisión continua de datos y no existe un límite de
tamaño, es un modo semi-duplex (la comunicación serie se establece a través de una única línea, en ambos
sentidos, pero no se puede transferir información en ambos sentidos de forma simultánea). En este modo de
transmisión se puede trabajar de dos formas:
En modo Maestro, donde el microcontrolador maestro genera la señal de reloj e inicia o finaliza la
comunicación.
En modo Esclavo, donde el microcontrolador esclavo recibe la señal de reloj y depende del
microcontrolador para recibir o enviar información.
Figura 8.1 Transmisión sincrona
Autor: Luis Alberto Vargas Tijerino. Página 45
8.5 Modo Asíncrono En el modo asíncrono (ver Figura 8.2) se emplean relojes tanto en el emisor como en el receptor. Ambos
relojes deben ser de igual frecuencia y deben estar en fase o sincronizados. La frecuencia de reloj se acuerda
antes de la transmisión configurando la velocidad mientras que la sincronización se realiza durante la
transmisión. Cada trama de datos tiene un tamaño fijo y poseen un bit inicial o de arranque (star) y un bit final
o de parada (stop) que permiten realizar dicha sincronización. La transmisión es en modo full-duplex (se
utilizan dos líneas, una transmisora TX y otra receptora RX, transfiriendo información en ambos sentidos de
forma simultanea).
Figura 8.2 Transmisión asíncrona
El modo más habitual de transmisión por el USART es el modo asíncrono, puesto que permite comunicaciones
en largas distancias. Existen distintas normas de transmisión serie asíncrona, como la RS232, la RS485, etc. Los
niveles de tensión empleados en estas normas son diferentes al empleado por el PIC. Por ello, suele ser
necesaria la utilización de drivers externos de adaptación tal cómo el MAX232 de Dallas Semiconductor-
MAXIM que se muestra en la Figura 8.3.
Figura 8.3 MAX232
8.6 Niveles lógicos RS232 La Figura 8.4 ilustra los requisitos en cuanto a niveles lógicos que debe cumplir una transmisión serie según la
norma RS232.
Autor: Luis Alberto Vargas Tijerino. Página 46
Figura 8.4 Byte según normas RS232
Los datos se transmiten con lógica negativa, es decir, un voltaje positivo en la conexión representa un
“0”, mientras que un voltaje negativo representa un “1”.
Para garantizar un “0” lógico una línea debe mantener un voltaje entre +3V y +15V.
Del mismo modo para “1” lógico garantizado debe estar entre -3V y -15V.
Los voltajes más usados son +12V para el “0” y -12V para “1”.
Es importante resaltar que cuando un puerto serie no está transmitiendo mantiene el terminal de
transmisión a “1” lógico a -12V, normalmente.
La banda muerta entre +3V y -3V se conoce como la región de transición donde los niveles lógicos no
están definidos. Es decir estos valores pueden interpretarse ambiguamente como “0” ó “1”.
Si se aumenta la velocidad de transmisión las señales de datos se vuelven susceptibles a pérdidas de voltaje
causadas por la capacidad, resistencia e inductancia del cable. Estas pérdidas son conocidas como efectos de
alta frecuencia y aumentan con la longitud del cable.
Estos valores de tensión proporcionan un amplio margen de seguridad que es de gran utilidad cuando los
cables deben pasar por zonas cercanas a elementos que generan interferencias eléctricas: motores,
transformadores, equipos de comunicación, etc. Estos elementos, unidos a la longitud del cable, pueden hacer
disminuir la señal hasta en varios voltios, sin que afecte adversamente al nivel lógico de la entrada. [mic16F84,
p308]
8.7 El módulo USART en C.
8.7.1 Configuración del Módulo USART.
Para configurar el módulo USART es necesario utilizar la siguiente directiva:
#USE RS232(opciones)
Sintaxis #USE RS232(opciones)
Parametros Las opciones para realizar la comunicación RS232 son las siguientes:
Autor: Luis Alberto Vargas Tijerino. Página 47
STREAM=id Asocia una identificador con su puerto RS232. El identificador podría ser usado en funciones como fputc.
BAUD=x Configura la taza de baudios con el valor de x
XMIT=pin Pin de Transmisión
RCV=pin Pin de recepción
FORCE_SW Usa un UART mediante software.
STOP=x Número de bits de stop (por defecto 1)
PARITY=x Donde x es N (Ninguna), E (par), u O (impar).
BITS=x Donde x es 5-9 (no puede usarse 5-7 con el USART interno).
Ver ayuda de CCS para utilizar las demás opciones.
8.7.2 Transmisión de datos:
La siguiente función envía datos a través del pin XMIT RS232. Debe aparecer #USE RS232 antes de su llamada
para determinar el baud rate y el pin usado.
Sintaxis putc(cdata), putchar(cdata), fputc(cdata,stream)
Parametros cdata es un carácter u entero de 8 bits. Stream es un identificador (un byte constante).
También es posible utilizar la función printf que utilizamos para Escribir caracteres en el LCD.
8.7.3 Recepción de datos:
Para recibir un dato de 8 bits (entero o carácter) se utiliza la siguiente función:
Sintaxis value = getc(), value = fgetc(stream), value=getch() o value=getchar()
Parametros Stream es un identificador (un byte constante). Retorna Value es un dato de 8 bits (entero o carácter).
La siguiente función sirve para recibir un dato de 8 bits (1 byte).
Sintaxis gets(string) o value = fgets(string,stream)
Parametros String es un puntero del arreglo de caracteres donde será almacenada la cadena recibida. Stream es un identificador (un byte constante).
Retorna Value es un dato de 8 bits (entero o carácter).
8.8 Procedimiento. 8. Crear el Proyecto en CCS.
9. Copiar el Código 8.1 Trans_serie
Código 8.1 Trans_serie
///////////////////////////////////////////////////////////////////////////////
Autor: Luis Alberto Vargas Tijerino. Página 48
//Autor: Luis Alberto Vargas Tijerino.
//Alias: Bigluis.
//Pais: Nicaragua.
//Fecha: 24-Nov-10.
///////////////////////////////////////////////////////////////////////////////
#include <16f887.h>//pic a utilizar
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES NOBROWNOUT //No brownout reset
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOWRT //Program memory not write protected
#FUSES BORV40 //Brownout reset at 4.0V
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay (clock=8M) //Fosc=8Mhz
#use RS232(baud=9600, UART1) //Configuramos USART con 9600 baudios y EUSART interno.
#define LCD_ENABLE_PIN PIN_B5
#define LCD_RS_PIN PIN_B4
#define LCD_RW_PIN PIN_B6
#define LCD_DATA4 PIN_B0
#define LCD_DATA5 PIN_B1
#define LCD_DATA6 PIN_B2
#define LCD_DATA7 PIN_B3
#include <lcd.c>
//Declaraciones:
int valor; //valor como entero
char cadena1[10]; //cadena1 como arreglo de 10 caracteres
char const cadena2[]="hola"; //cadena2 como arreglo constante de caracteres
void main(){
setup_comparator(NC_NC); //Desconectamos los comparadores Analogicos
SETUP_ADC_PORTS(NO_ANALOGS); //Solo AN0 sera analogico los demas digitales.
SETUP_ADC(ADC_OFF); //Apagamos el ADC
lcd_init(); //Inicializa el LCD.
lcd_putc("\fTx:\nRx:"); //Escribe "Tx:" en pos. 1,1 y "Rx:" en pos. 1,2
while(1){
lcd_gotoxy(5,1); //Ubicar el cursor en la posicion 5,1
while(!input_a()); //Espera hasta que se activen los pines de PORTA
delay_ms(10); //Retardo de 10ms para eliminar rebotes
if(input(PIN_A0)){ //Si se activa el PIN_A0
lcd_putc('U'); //Escribir en el LCD la letra 'U'
putc('U'); //Enviar por USART la letra 'U'
}
if(input(PIN_A1)){ //Si se activa el PIN_A1
lcd_putc("FEC "); //Escribe en el LCD "FEC "
puts("FEC "); //Envia por usart la cadena "FEC "
}
if(input(PIN_A2)){ //Si se activa el PIN_A2
printf(lcd_putc,"%s",cadena2); //Escribe en el LCD el contenido de cadena2
printf("%s",cadena2); //Envia por USART el contenido de cadena2
}
if(input(PIN_A3)){ //Si se activa el PIN_A3
lcd_gotoxy(5,2); //Posicion del cursor del LCD es 5,2
valor=getc(); //Almacena el dato recibido del USART en valor
lcd_putc(valor); //Escribe el contenido de valor en el LCD
}
if(input(PIN_A4)){ //Si se activa el PIN_A4
lcd_gotoxy(5,2); //Envia cursor a pos. 5,2.
gets(cadena1); //Almacena la cadena recibida en cadena1
printf(lcd_putc,"%s",cadena1); //Escribe en el LCD el contenido de cadena1
}
while(input_a()); //Espera hasta que se desactiven los pines de PORTA
}
}
¡Error! No se encuentra el origen de la referencia.
10. Presionar F9 para compilar el proyecto.
Autor: Luis Alberto Vargas Tijerino. Página 49
11. Crear el circuito en Proteus que se muestra en la Figura 8.5. Para ello será necesario buscar
mediante la caja de búsqueda en la ventana PICK DEVICE el PIC16F887, LOGICTOGGLE, COMPIN y
LM016L.
Figura 8.5
12. Para insertar el VIRTUAL TERMINAL será necesario dar clic en el botón “Virtual Instrument” de la cinta
de botones izquierda y luego se debe dar clic en la opción “VIRTUAL TERMINAL” del panel lateral a
como se muestra en la siguiente figura.
13. Cargar el Archivo fuente GEN_PWM.cof y Realizar la simulación.
14. Contestar las siguientes preguntas:
a. Presione el botón conectado a RA0 y explique qué ocurre en las líneas 52 y 53.
COMPIN
Virtual
Terminal
PIC16F887 LM016L
LOGICTOGGLE
Botón Virtual
Instruments
Panel
Instruments
Autor: Luis Alberto Vargas Tijerino. Página 50
b. Presione el botón conectado a RA1 y explique qué ocurre en las líneas 56 y 57.
c. Presione el botón conectado a RA2 y explique qué ocurre en las líneas 61 y 62.
d. Presione el botón conectado a RA3, escriba la letra f en el Virtual Terminal y explique qué
ocurre en las líneas 65 y 66.
e. Presione el botón conectado a RA4, escriba PIC en el Virtual Terminal y explique qué ocurre en
las líneas 70 y 71.
15. Crear el circuito en Proteus que se muestra en la Figura 8.6. Para ello copie y pegue el circuito anterior.
Figura 8.6
16. Contestar las siguientes preguntas:
a. Presione el botón RA3 de U2, luego presione el botón RA0 de U1 y explique qué ocurre.
b. Presione el botón RA4 de U2, luego presione el botón RA2 de U1 y explique qué ocurre.
c. Presione el botón RA4 de U2, luego presione el botón RA3 de U1 y explique qué ocurre.
d. Presione el botón RA3 de U1, luego presione el botón RA0 de U2 y explique qué ocurre.
e. Presione el botón RA4 de U1, luego presione el botón RA2 de U2 y explique qué ocurre.
f. Presione el botón RA4 de U1, luego presione el botón RA3 de U2 y explique qué ocurre.
8.9 Configuración del Hyperterminal de Windows Una herramienta sumamente útil para observar los datos provenientes del puerto serie de la PC es el
Hyperterminal, a continuación se muestra como realizar su configuración.
1. Para comenzar la configuración, diríjase al botón de Inicio y seleccione: Programas - Accesorios -
Hyperterminal. Si no tiene la carpeta de Hyperterminal:
PIC16F887 LM016L
LOGICTOGGLE
Autor: Luis Alberto Vargas Tijerino. Página 51
2. Dentro de Mi PC haga doble click sobre el icono de Panel de Control. Luego haga doble click sobre
Agregar o Quitar Programas y haga un click sobre la pestaña de Instalación de Windows. Ahora para
verificar las opciones de comunicaciones que tiene instalada, haga doble click sobre Comunicaciones,
luego en las Propiedades, y marque la opción de Hyperterminal y seleccione Aceptar hasta que el
programa empiece a instalar el Hyperterminal.
3. Se visualizará una ventana como lo muestra la figura. Haga doble clic sobre el ícono Hypertrm.
4. Al presentarse esta pantalla, en el campo de Nombre, escriba el nombre con el que desea identificar la
sesión (puede escribir T-NET) y oprima el botón de Aceptar.
Autor: Luis Alberto Vargas Tijerino. Página 52
5. En el campo de Conectar utilizando, se selecciona el puerto de comunicación (Com) en donde se
encuentre su PIC instalado. Oprima el botón de Aceptar.
6. Las propiedades del puerto (com x) no deben sufrir modificaciones. En esta pantalla oprima el botón
de Aceptar.
Autor: Luis Alberto Vargas Tijerino. Página 53
Nota: Los datos provenientes del puerto serial pueden ser obtenidos por programas como Visual Basic,
Matlab, LabView y otros.
8.10 Trabajo Extra Clase 1. Conteste:
a. ¿Cuál de los dos modos de transmisión transfiere más rápido los datos?
b. ¿Cuál de los dos modos de transmisión acepta la mayor distancia entre dispositivos?
c. ¿Qué es la transmisión SPI?
d. ¿Qué es la transmisión I2C?
e. ¿Qué es la transmisión One-Wire?
f. ¿Cuáles son los protocolos de transmisión alámbrico más utilizados actualmente en la
electrónica de consumo?
2. Elabore un programa en CCS que obtenga los datos del ADC y los envíe mediante USART al
Hyperterminal de Windows.