Você está na página 1de 54

11

Manual de Laboratorio
para Electronica Digital 2
en base a PIC, ccs y Proteus

Luis Alberto Vargas Tijerino

Autor: Luis Alberto Vargas Tijerino. Pgina 1
Contenido
Laboratorio 1: Introduccin a CCS y Proteus..................................................................................................... 5
1.1 Objetivo. ................................................................................................................................................... 5
1.2 Introduccin. ............................................................................................................................................ 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 simulacin y depuracin. ............................................................................................... 10
1.6.5 Abrir la ventana de observacin y Agregar los Registros ............................................................... 11
Laboratorio 2: Puertos de Entrada y Salida. .................................................................................................... 13
2.1 Objetivo. ................................................................................................................................................. 13
2.2 Trabajo Previo. ....................................................................................................................................... 13
2.3 Introduccin. .......................................................................................................................................... 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 Configuracin rpida de los pines I/O. ........................................................................................... 14
2.4.6 Manejo a travs 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 Introduccin. .......................................................................................................................................... 17
3.3 Pantalla LCD. ........................................................................................................................................... 17
3.3.1 Configuracin del Puerto para el LCD. ............................................................................................ 17
3.3.2 Fichero o Librera LCD.C .................................................................................................................. 18
3.3.3 Inicializacin del LCD. ...................................................................................................................... 18
Autor: Luis Alberto Vargas Tijerino. Pgina 2
3.3.4 Ubicacin del cursor en una posicin. ............................................................................................ 18
3.3.5 Escribir caracteres en el LCD ........................................................................................................... 18
3.4 Procedimiento ........................................................................................................................................ 20
3.5 Trabajo Extra Clase ................................................................................................................................. 22
Laboratorio 4: Convertidor Analgico a Digital. .............................................................................................. 23
4.1 Objetivo. ................................................................................................................................................. 23
4.2 Introduccin. .......................................................................................................................................... 23
4.3 Conversor Analgico Digital. .................................................................................................................. 23
4.3.1 Formato del resultado de la conversin. ........................................................................................ 24
4.3.2 Configuracin de las entradas analgicas del ADC. ........................................................................ 24
4.3.3 Configuracin del ADC. ................................................................................................................... 25
4.3.4 Lectura del Valor de la conversin ADC. ......................................................................................... 25
4.4 Procedimiento. ....................................................................................................................................... 26
4.5 Trabajo Extra clase ................................................................................................................................. 27
Laboratorio 5: Interrupcin por Lectura de Entradas. .................................................................................... 28
5.1 Objetivo. ................................................................................................................................................. 28
5.2 Introduccin. .......................................................................................................................................... 28
5.3 Interrupciones. ....................................................................................................................................... 28
5.3.1 Configuracin de las interrupciones. .............................................................................................. 28
5.4 Interrupcin Externa INT. ....................................................................................................................... 28
5.4.1 Configuracin de la interrupcin externa INT. ............................................................................... 28
5.5 Interrupcin por cambio en PORTB. ...................................................................................................... 29
5.5.1 Configuracin de la interrupcin por cambio en PORTB. ............................................................... 29
5.6 Procedimiento. ....................................................................................................................................... 30
5.7 Trabajo Extra Clase ................................................................................................................................. 31
Laboratorio 6: Interrupcin por Desbordamiento del TMR0. ......................................................................... 32
6.1 Objetivo. ................................................................................................................................................. 32
6.2 Introduccin. .......................................................................................................................................... 32
6.3 Temporizadores...................................................................................................................................... 32
6.4 Mdulo TIMER0. ..................................................................................................................................... 32
6.4.1 Configuracin de la interrupcin por TIMER0. ............................................................................... 32
6.4.2 Configuracin del TMR0.................................................................................................................. 33
6.4.3 Modificacin y obtencin del valor de TIMER0. ............................................................................. 33
Autor: Luis Alberto Vargas Tijerino. Pgina 3
6.4.4 Clculo de la temporizacin. ........................................................................................................... 33
6.5 Procedimiento. ....................................................................................................................................... 34
6.6 Trabajo Extra Clase ................................................................................................................................. 36
Laboratorio 7: Generador de seal PWM. ...................................................................................................... 37
7.1 Objetivo. ................................................................................................................................................. 37
7.2 Introduccin. .......................................................................................................................................... 37
7.3 Modulacin por ancho de pulsos ........................................................................................................... 37
7.4 Mdulo CCP. ........................................................................................................................................... 37
7.4.1 Configuracin del Mdulo CCP en Modo PWM. ............................................................................ 38
7.4.2 Configuracin del ciclo de trabajo. ................................................................................................. 38
7.5 Mdulo TIMER2. ..................................................................................................................................... 38
7.5.1 Configuracin de la frecuencia PWM. ............................................................................................ 38
7.5.2 Calculo de la Frecuencia PWM........................................................................................................ 39
7.5.3 Resolucin 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 Introduccin ........................................................................................................................................... 44
8.3 Mdulo USART. ...................................................................................................................................... 44
8.4 Modo Sncrono ....................................................................................................................................... 44
8.5 Modo Asncrono ..................................................................................................................................... 45
8.6 Niveles lgicos RS232 ............................................................................................................................. 45
8.7 El mdulo USART en C. ........................................................................................................................... 46
8.7.1 Configuracin del Mdulo USART. .................................................................................................. 46
8.7.2 Transmisin de datos: ..................................................................................................................... 47
8.7.3 Recepcin de datos: ........................................................................................................................ 47
8.8 Procedimiento. ....................................................................................................................................... 47
8.9 Configuracin del Hyperterminal de Windows ...................................................................................... 50
8.10 Trabajo Extra Clase ............................................................................................................................. 53


Autor: Luis Alberto Vargas Tijerino. Pgina 4

Autor: Luis Alberto Vargas Tijerino. Pgina 5
Laboratorio 1: Introduccin a CCS y Proteus.
1.1 Objetivo.
Familiarizar al estudiante con el compilador CCS y el simulador de circuitos Proteus.
1.2 Introduccin.
A continuacin se mostrarn los pasos necesarios para crear un nuevo proyecto en CCS y luego se mostrarn
los pasos necesarios para simular nuestro proyecto en Proteus.
1.3 ISIS-PROTEUS VSM
El entorno de diseo electrnico PROTEUS VSM de LABCENTER ELECTRONICS (www.labcenter.co.uk) ofrece la
posibilidad de simular cdigo de alto (lenguaje C) y bajo nivel (lenguaje ensamblador) para los
microcontroladores y, simultneamente, con la simulacin en modo mixto de SPICE. Esto permite el diseo
tanto a nivel de hardware como software y realizar la simulacin en un mismo y nico entorno. Para ello se
suministra tres potentes entornos como son el ISIS para el diseo grfico, VSM (Virtual System Modelling) para
la simulacin y el ARES para el diseo 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 especficamente para PIC MCU, obteniendo la mxima
optimizacin del compilador con estos dispositivos. Dispone de una amplia librera de funciones predefinidas,
comandos de preprocesado y ejemplos. Adems existe gran cantidad de informacin y soporte tcnico en
espaol en los foros www.todopic.com.ar/foros y www.ucontrol.com.ar/foros.
Autor: Luis Alberto Vargas Tijerino. Pgina 6
Tambin suministra los controladores (drivers) para diversos dispositivos como LCD, convertidores AD, relojes
en tiempo real, EEPROM serie, etc.
Otra caracterstica sumamente importante es que puede ser utilizado conjuntamente con ISIS-PROTEUS para
depurar el cdigo paso a paso, lo que permite a los diseadores encontrar errores de algoritmizacin sin la
necesidad de tener una herramienta fsica 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 bsicos de su estructura.
- LIBRERAS A INCLUIR: Contienen funciones, instrucciones, definiciones, variables y constantes que
pueden ser utilizadas por el cdigo principal.
- BITS DE CONFIGURACIN O FUSES: Estos se utilizan para configurar ciertos parmetros 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 cdigo contra lectura, etc
- DIRECTIVAS #USE: Se utilizan para configurar algunos perifricos y para controlar como el compilador
generar los cdigos de retardos.
- DEFINICIONES: Se utilizan para modificar fcilmente algunos valores que se utilizan con mucha
frecuencia en el cdigo.
- DECLARACIONES DE VARIABLES Y CONSTANTES: indican los nombres y caractersticas de las variables
y constantes que utilizaremos en el cdigo.
- PROGRAMAS o FUNCIONES: son un conjunto de instrucciones que pueden ser llamadas para evitar
repetir el cdigo. Puede haber uno o varios, en cualquier caso siempre debe haber uno definido como
principal mediante la inclusin de la llamada main().
- INSTRUCCIONES: Indican cmo debe comportarse el PIC en cada momento.
- COMNTARIOS: permiten describir lo que significa cada lnea del programa ya sea para recordarlo ms
tarde o para mostrar el cdigo a otras personas que trabajan en el grupo.
Autor: Luis Alberto Vargas Tijerino. Pgina 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 botn close Project para cerrar todos los archivos anteriormente abiertos.
3. Dar click en el botn inicio.
4. Crear un nuevo archivo dando click en New Source File a como se muestra en la siguiente figura
Bits de configuracin
Librera
Directiva #USE
Instrucciones
Funcin main
Comentarios
Autor: Luis Alberto Vargas Tijerino. Pgina 8

5. Crear una Nueva carpeta llamada Lab1 en la ubicacin 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 Cdigo 1.1 Led_blink
Cdigo 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 botn Build All de la pestaa Compile o presionar la tecla F9.
Autor: Luis Alberto Vargas Tijerino. Pgina 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 bsqueda 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 bsqueda 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 bsqueda 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
numrico.
b. Si se desea rotar el dispositivo en sentido anti-horario presionar la tecla - del teclado
numrico.
c. Si se desea rotar el dispositivo en espejo s e debe presionar la combinacin de teclas ctrl+m.
Ventana de
dispositivos
seleccionado
Lista de
Resultados
Caja de
Busqueda
Autor: Luis Alberto Vargas Tijerino. Pgina 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 botn 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 botn Ok.
1.6.4 Realizar la simulacin y depuracin.
Con ayuda de la simulacin mixta podemos observar cmo se modifican las variables internas del PIC y cmo
estas interactan con variables externas que pueden ser analgicas o digitales. Por otro lado, la depuracin
nos permite ver paso a paso el desarrollo del cdigo que hemos cargado en el PIC con el objetivo de encontrar
errores de lgica o de secuencia.
Ventana de
dispositivos
seleccionados
Ventana de
Trabajo.
PIC16F887
LOGICPROBE
Barra de
Simulacin
Autor: Luis Alberto Vargas Tijerino. Pgina 11
1. Dar clic en el botn Play de la barra de simulacin y observar la
simulacin.
2. Dar clic en el botn stop de la barra de simulacin.
3. Dar clic en el botn step de la barra de simulacin para iniciar la simulacin paso a paso o
presionar la combinacin de teclas Ctrl+F12.
4. A continuacin se mostraran la ventana del cdigo fuente y la ventana de variables.

5. En la ventana de Cdigo aparecen 4 botones .
a. Step over o tecla F10: La simulacin se realiza paso a paso pero al encontrar la llamada a
una funcin el depurador la realiza toda la funcin de una sola vez sin entrar a ella.
b. Step into o tecla F11: La simulacin se realiza paso a paso y al encontrar la llamada a una
funcin el depurador la realiza entra a la funcin realizndola paso a paso.
c. Step out o combinacin Ctrl+F11: Si el depurador se encuentra en el cdigo interno de una
funcin al presionar este botn saldr del cdigo interno de la funcin y se mostrar la lnea
siguiente a la llamada a la funcin.
d. Run to Source Line o combinacin Ctrl+F10: Ubica al depurador en la lnea seleccionada por
el usuario.
6. Una vez que se presione uno de los botones anteriores se puede observar el cambio en la ventana de
cdigo y en la ventana de variables.
1.6.5 Abrir la ventana de observacin y Agregar los Registros
1. Dar clic en men debug>watch window.
Ventana de
Cdigo
Ventana de
Variables
Autor: Luis Alberto Vargas Tijerino. Pgina 12

2. Dar clic derecho en la ventana de observacin 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. Pgina 13
Laboratorio 2: Puertos de Entrada y Salida.
2.1 Objetivo.
Familiarizarse con los Puertos de Entrada y Salida mediante la implementacin prctica del ejemplo.
2.2 Trabajo Previo.
Contestar las siguientes Preguntas:
1. Mencione los puertos de entrada/salida tiene el PIC16F887.
2. Cuntos 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. Cmo se eliminan los rebotes de los botones?
2.3 Introduccin.
En casi todos los proyectos es necesario leer alguna entrada de tipo digital conectada a pulsadores,
interruptores, sensores digitales o similares; tambin 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 cmo realizar la configuracin 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 alfabticamente 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 propsito general, y en dependencia de la configuracin de sus
perifricos pueden estar disponibles como I/O de propsito general. Por ejemplo si utilizamos el mdulo
USART (Transmisin Serial) los pines correspondientes a este perifrico sern utilizados para atender las
operaciones del mismo y no podrn ser utilizados como I/O de propsito general.
2.4.1 Lectura del puerto.
La siguiente funcin 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 funcin 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. Pgina 14
2.4.3 Escritura del puerto.
La siguiente funcin 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 Configuracin rpida de los pines I/O.
Una configuracin rpida genera cdigo ms eficiente, ya que el compilador asume que los pines de I/O sern
cambiados solo si es especificado por el usuario. A continuacin se muestra la funcin 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 funcin 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. Pgina 15
2.4.6 Manejo a travs 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 ubicacin 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 Cdigo 2.1 Led_botones
Cdigo 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 bsqueda en la
ventana PICK DEVICE el PIC16F887, el LOGICSTATE y el LOGICPROBE.
Autor: Luis Alberto Vargas Tijerino. Pgina 16

7. Cargar el Archivo fuente Led_Botones.cof, Realizar la simulacin y Abrir la ventana de observacin y
Agregar los Registros TRISA, TRISB, TRISC, TRISD, PORTA, PORTB, PORC y PORTD.
a. Cul es el valor del registro TRISD despus de la lnea 32?
b. Cul es el valor de los registros TRISB, TRISA, PORTB y PORTA despus de la lnea 34?
c. Cul es el valor de los registros TRISC y PORTC despus de las lneas 35, 36, 37, 38 y 39?
d. Cul es el valor del registro PORTD despus de la lnea 41?
e. Hacia dnde se realiza el salto despus de la lnea 42?
f. Cambia los valores de los LOGICSTATES y contesta de nuevo las preguntas a hasta f.
g. Cul es el valor de PORTD despus de la lnea 41 si PORTA es mayor a 0b00001111?
h. Cul es el valor de PORTD despus de la lnea 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. Pgina 17
Laboratorio 3: Pantalla LCD.
3.1 Objetivo.
Familiarizarse con la conexin y utilizacin de la pantalla LCD 16x2 mediante la implementacin prctica del
ejemplo LCD_HolaMundo.
3.2 Introduccin.
Existe una gran cantidad de proyectos en las que es necesario visualizar informacin a travs de una pantalla
de bajo costo. En este laboratorio explicaremos cmo realizar la comunicacin y configuracin entre el PIC y el
LCD de 16 caracteres por 2 lneas que posee un controlador del tipo HD44780.
3.3 Pantalla LCD.
Las Pantallas LCD tienen la capacidad de mostrar cualquier carcter alfanumrico, permitiendo presentar la
informacin que genera cualquier equipo electrnico de forma fcil y econmica. Cada carcter consta de una
matriz de puntos (generalmente 5x7), que se distribuyen en una, dos, tres o cuatro lneas 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 Configuracin del Puerto para el LCD.
Existen dos maneras de configurar el puerto que se conectara al LCD, la primera realiza la conexin 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 instruccin 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 ms flexible, ya que nos permite seleccionar la conexin
de cada pin. A continuacin se muestra cmo hacerlo.
Autor: Luis Alberto Vargas Tijerino. Pgina 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 configuracin anterior.
3.3.2 Fichero o Librera 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.
...
//Configuracin del Puerto.
#include <lcd.c>
...

3.3.3 Inicializacin 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 funcin.
Lcd_init()
3.3.4 Ubicacin del cursor en una posicin.
Para ubicar el cursor en una ubicacin especificada por el usuario se utiliza la siguiente funcin:
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 funcin es la siguiente:
Lcd_putc( )
Sintaxis Lcd_putc(c)
Parametros c puede ser el carcter que se escribir en el LCD o puede ser una cadena de caracteres.
La segunda funcin que nos permite escribir en el LCD es la siguiente:
Autor: Luis Alberto Vargas Tijerino. Pgina 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 funcin que utilizar printf, en este caso ser lcd_putc.
Values es la lista de variables que sern 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 Carcter.
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 minsculas.
X Entero Hexadecimal con letras en maysculas.
Lx Entero Largo Hexadecimal (minsculas).
LX Entero largo Hexadecimal (maysculas).
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
nmero 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 continuacin 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 lnea.
- \n: Se utiliza para realizar un salto de lnea.
- \b: Se utiliza para mover el cursor un espacio hacia atrs.
La Tabla 3.2 muestra los caracteres que se pueden escribir en el LCD.
Autor: Luis Alberto Vargas Tijerino. Pgina 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 Cdigo 3.1 LCD_HolaMundo
Cdigo 3.1 LCD_HolaMundo
///////////////////////////////////////////////////////////////////////////////
//Autor: Luis Alberto Vargas Tijerino.
//Alias: Bigluis.
//Pais: Nicaragua.
Autor: Luis Alberto Vargas Tijerino. Pgina 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 bsqueda en la
ventana PICK DEVICE el PIC16F887 y el LM016L.
Autor: Luis Alberto Vargas Tijerino. Pgina 22

7. Cargar el Archivo fuente LCD_HolaMundo.cof y Realizar la simulacin.
8. Conteste:
a. Qu ocurre en las lneas 45 a la 53?
b. Comente la lnea 53 y descomente la lnea 54 y explique que ocurre en la lnea 54?
3.5 Trabajo Extra Clase
1. Elabore un programa en CCS que muestre en la primera lnea del LCD PORTB= y en la segunda lnea
muestre el valor de PORTB en formato unsigned int.

LM016
PIC16F88
Autor: Luis Alberto Vargas Tijerino. Pgina 23
Laboratorio 4: Convertidor Analgico a Digital.
4.1 Objetivo.
Familiarizarse con el mdulo de conversin analgico digital mediante la implementacin prctica del ejemplo
Leer_ADC.
4.2 Introduccin.
Existe una gran cantidad de proyectos en las que es necesario que nuestros dispositivos digitales realicen
operaciones de control de variables analgicas tales como temperatura, presin, flujo, caudal, peso, distancia,
velocidad o similares. Este laboratorio trata de explicar cmo realizar la configuracin del mdulo ADC del PIC
para realizar las mediciones antes mencionadas.
4.3 Conversor Analgico Digital.
Un conversor analgico-digital (ADC, Analog-to-Digital Converter) es un dispositivo electrnico capaz de
convertir una entrada analgica de voltaje en un valor binario, Se utiliza en equipos electrnicos como
ordenadores, grabadores de sonido y de vdeo, y equipos de telecomunicaciones. La seal analgica, que vara
de forma continua en el tiempo, se conecta a la entrada del dispositivo y se somete a un muestreo a una
velocidad fija, obtenindose as una seal digital a la salida del mismo. [Wikipedia]
El convertidor Analgico-digital del PIC16F887 permite la conversin de una seal de entrada analgica a un
valor en representacin binaria de 10 bits o de 8 bits. Este dispositivo usa 13 entradas analgicas que son
multiplexadas hacia un circuito de muestreo y retencin (Sample and Hold). La salida del muestreo y retencin
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 conversin en dos registros (ADRESL y
ADRESH). La Figura 4.1 muestra el diagrama en bloques del mdulo ADC y la Figura 4.2 muestra el modelo de
la Entrada Analgica.
Figura 4.1 Diagrama en Bloque del ADC

Autor: Luis Alberto Vargas Tijerino. Pgina 24
Figura 4.2 Modelo de una Entrada Analgica

Como se observa en la Figura 4.1 es posible seleccionar el voltaje de referencia del ADC mediante software.
A continuacin se muestra la funcin de transferencia del ADC.

4.3.1 Formato del resultado de la conversin.
Para especificar el formato del resultado de la conversin 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 Configuracin de las entradas analgicas del ADC.
Para realizar la configuracin de los puertos ADC se utiliza la siguiente funcin:
setup_adc_ports(value)
Sintaxis setup_adc_ports(value)
Parametros value podra ser una o ms de las siguientes constantes:
- sAN0 Selecciona AN0 analgica
- sAN1 Selecciona AN1 analgica
- sAN2 Selecciona AN2 analgica
- sAN3 Selecciona AN3 analgica
Autor: Luis Alberto Vargas Tijerino. Pgina 25
- sAN4 Selecciona AN4 analgica
- sAN5 Selecciona AN5 analgica
- sAN6 Selecciona AN6 analgica
- sAN7 Selecciona AN7 analgica
- sAN8 Selecciona AN8 analgica
- sAN9 Selecciona AN9 analgica
- sAN10 Selecciona AN10 analgica
- sAN11 Selecciona AN11 analgica
- sAN12 Selecciona AN12 analgica
- sAN13 Selecciona AN13 analgica
- NO_ANALOGS Selecciona ninguna analgica
- ALL_ANALOG Selecciona todas analgica
- 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 analgicas, Vss y Vdd como Vref.
4.3.3 Configuracin del ADC.
Para realizar la configuracin del ADC se utiliza la siguiente funcin:
setup_adc()
Sintaxis setup_adc(value)
Parametros mode podra ser una o ms 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 analgicas, Vss y Vdd como Vref.
4.3.4 Lectura del Valor de la conversin ADC.
Para realizar la lectura del valor de la conversin ADC se utiliza la siguiente funcin:
read_adc( )
Sintaxis value = read_adc ([mode])
Parametros mode es un parmetro 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 conversin y no retorna valor.
- ADC_READ_ONLY Lee el ltimo valor de conversin.
Ejemplo
read_adc(); //Se inicia la conversin 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. Pgina 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 ubicacin 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 Cdigo 4.1 Leer_ADC
Cdigo 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. Pgina 27
5. Compilar el proyecto.
6. Crear el circuito en Proteus. Para ello ser necesario buscar mediante la caja de bsqueda 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 simulacin.
8. Conteste:
a. Cunto es el tiempo que transcurre para que el ADC realice la adquisicin del dato en la lnea
53?
b. Comente la lnea 44, descomente la lnea 46 y conteste la pregunta anterior.
4.5 Trabajo Extra clase
1. Conteste:
a. Elabore una lista de algunos sensores de temperatura, presin, luz y nivel.
b. Cmo 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. Pgina 28
Laboratorio 5: Interrupcin por Lectura de Entradas.
5.1 Objetivo.
Familiarizarse con la utilizacin de la interrupcin por cambio en las Entradas digitales mediante la
implementacin prctica de esta gua de laboratorio.
5.2 Introduccin.
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 cmo realizar esto de la manera
ms eficiente.
5.3 Interrupciones.
Una Interrupcin consiste en un mecanismo por el cual un evento interno o externo puede interrumpir la
ejecucin de un programa en cualquier momento. Esto produce un salto automtico a una subrutina de
atencin a la interrupcin, sta atiende inmediatamente el evento y retoma luego la ejecucin del programa
exactamente donde estaba en el momento de ser interrumpido.
Las fuentes de interrupcin dependen del PIC utilizado. Por ejemplo, el PIC16F84 tiene 4 fuentes de
interrupcin mientras que la familia PIC16F88X tiene entre 13 y 14.
Los PIC de gama baja y media tienen un nico vector de interrupcin situado en la direccin 04h de programa,
mientras que los de gama alta tienen dos vectores de interrupcin de distinta prioridad, alta y baja, situados
en la posicin 08h y 18h de la memoria.
5.3.1 Configuracin de las interrupciones.
A continuacin se describen un conjunto de funciones que se utilizan para configurar las interrupciones:
disable_interrupts(level) Desabilita la interrupcin Especificada.
enable_interrupts(level) Habilita la interrupcin especificada.
clear_interrupt(level) Limpia el flag de interrupci especificado. Esto puede ser utilizado durante una
interrupcin global, o para prevenir la utilizacin de una interrpupcin.
5.4 Interrupcin 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 seal. La interrupcin se puede producir si y slo si el cambio en RB0/INT es
durante el flanco ascendente o si y slo si es durante el flanco descendente.
5.4.1 Configuracin de la interrupcin externa INT.
Para realizar la configuracin de la interrupcin externa INT es necesario realizar lo siguiente:
1. Escribir la rutina de interrupcin y sobre ella su directiva a como se muestra a continuacin:
#INT_EXT
Void int_ext_isr(){

Autor: Luis Alberto Vargas Tijerino. Pgina 29
Cdigo de la interrupcion

}

2. Dentro de la rutina principal habilitar las interrupciones globales y Habilitar la interrupcin INT a como
se muestra a continuacin:
Void main(){

enable_interrups(GLOBAL); //Habilita las interrupciones Globales.
enable_interrups(INT_EXT); //Habilita las interrupcion INT_EXT.

}
5.5 Interrupcin 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 interrupcin 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 estn configurados como pines de Interrupcin-en-cambio. Para que se habilite la
interrupcin el valor presente es comparado con el valor almacenado en la ltima lectura para determinar
cul bit ha sido cambiado o cual no coincide.
Esta interrupcin puede despertar al dispositivo del modo sleep. Para salir de la rutina de interrupcin el
usuario debe leer el PORTB para eliminar la condicin de error.
5.5.1 Configuracin de la interrupcin por cambio en PORTB.
Para realizar la configuracin de la interrupcin por es necesario realizar lo siguiente:
1. Escribir la rutina de interrupcin y sobre ella su directiva a como se muestra a continuacin:
#INT_RBx
Void RBx_isr(){

Cdigo de la interrupcion

}

2. Dentro de la rutina principal habilitar las interrupciones globales y Habilitar la interrupcin TMR0 a
como se muestra a continuacin:
Void main(){

enable_interrups(GLOBAL); //Habilita las interrupciones Globales.
enable_interrups(INT_RBx); //Habilita las interrupcion INT_RBx.

}
Autor: Luis Alberto Vargas Tijerino. Pgina 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 ubicacin 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 Cdigo 5.1 Led_botones2
Cdigo 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 bsqueda en la
ventana PICK DEVICE el PIC16F887, el LOGICSTATE y el LOGICPROBE.
Autor: Luis Alberto Vargas Tijerino. Pgina 31

7. Cargar el Archivo fuente Led_Botones2.cof y Realizar la simulacin.
8. Conteste:
a. Qu ocurre en la lnea 39?
b. De doble clic en la lnea 29 para generar un break point y explique cundo ocurre el salto hacia
la lnea 29.
c. Comente la lnea 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 interrupcin por cambio en PORTB).


PIC16F887
LOGICSTATE
LOGICPROBE
Autor: Luis Alberto Vargas Tijerino. Pgina 32
Laboratorio 6: Interrupcin por Desbordamiento del TMR0.
6.1 Objetivo.
Utilizar la interrupcin por desbordamiento del TMR0 mediante la implementacin de esta prctica de
laboratorio para comprender su funcionamiento.
6.2 Introduccin.
En el Laboratorio anterior se estudi el concepto de interrupcin, especficamente las interrupciones
producidas por cambio en las entradas. En este laboratorio estudiaremos la interrupcin por desbordamiento
del TMR0 en el cual realizaremos un ejemplo prctico.
6.3 Temporizadores.
Los TIMERs o Temporizadores son mdulos integrados en el PIC que permiten realizar cuentas tanto de
eventos internos como externos. Cuando la cuenta es interna se habla de temporizacin 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 ejecucin 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 temporizacin.
La manera ms eficiente de realizar una temporizacin es cargar el valor en uno de los TIMER, luego se espera
a que ocurra la interrupcin cuando este se desborde y finalmente se realizan ajustes finos mediante retardos
pequeos para aumentar la precisin de la temporizacin.
6.4 Mdulo TIMER0.
El mdulo TIMER0 es un Temporizador/Contador con las siguientes caractersticas:
- Temporizador/Contador de 8bits.
- Prescaler de 8 bits (compartido con el Watchdog Timer).
- Fuente de reloj externa o interna programable.
- Interrupcin por desbordamiento.
6.4.1 Configuracin de la interrupcin por TIMER0.
Para realizar la configuracin de la interrupcin por TIMER0 es necesario realizar lo siguiente:
1. Escribir la rutina de interrupcin y sobre ella su directiva a como se muestra a continuacin:
#INT_TMR0
Void TMR0_isr(){

Cdigo de la interrupcion

}

Autor: Luis Alberto Vargas Tijerino. Pgina 33
2. Dentro de la rutina principal habilitar el FLAG de interrupcin TMR0 y habilitar el FLAG de interrupcion
global, si no se habilita este FLAG no se realizar ninguna interrupcin.
Void main(){

enable_interrups(GLOBAL); //Habilita las interrupciones Globales.
enable_interrups(INT_TMR0);//Habilita las interrupcion INT_RBx.

}
6.4.2 Configuracin del TMR0.
La funcin que se encarga de realizar la configuracin del mdulo TIMER0 es la siguiente:
setup_timer_0 (mode)
Sintaxis setup_timer_0 (mode)
Parametros mode podra 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
interrupcin. (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 Modificacin y obtencin del valor de TIMER0.
Las funciones que se encargan de realizar la obtencin y modificacin del mdulo 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 Clculo de la temporizacin.
Las temporizaciones se pueden calcular de la siguiente manera:
( ) 4 0 256 0 T DIV TMR
Temporizacion
Fosc

=
Autor: Luis Alberto Vargas Tijerino. Pgina 34
6.4.4.1 Ejemplo
Se desea calcular una temporizacin 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 sera calcular el
valor de TMR0.
0 256
4 0
20 8
0 256 99
4 256
OSC
Temporizacion F
TMR
T DIV
ms MHz
TMR

= ~


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 ubicacin 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 Cdigo 6.1 Led_blink2
Cdigo 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. Pgina 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 bsqueda en la
ventana PICK DEVICE el PIC16F887, el LOGICSTATE y el LOGICPROBE.

7. Para insertar el OSCILLOSCOPE ser necesario dar clic en el botn Virtual Instrument del cinta de
botones izquierda y luego se debe dar clic en la opcin OSCILLOSCOPE del panel lateral a como se
muestra en la siguiente figura.

OSCILLOSCOPE
PIC16F88
7
LOGICSTATE
LOGICPROBE
Botn Virtual
Instruments
Panel
Instruments
Autor: Luis Alberto Vargas Tijerino. Pgina 36
8. Cargar el Archivo fuente Led_Blink2.cof y Realizar la simulacin.
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 interrupcin por cambio en PORTB y
por desbordamiento de TMR0).

Autor: Luis Alberto Vargas Tijerino. Pgina 37
Laboratorio 7: Generador de seal PWM.
7.1 Objetivo.
Familiarizarse con la utilizacin del mdulo CCP en modo PWM mediante la implementacin prctica del
ejemplo prctico Gen_PWM
7.2 Introduccin.
Este laboratorio trata de mostrar la teora y el procedimiento utilizado para generar una seal PWM mediante
el mdulo CCP1 del PIC16F887.
7.3 Modulacin por ancho de pulsos
La modulacin por ancho de pulsos (PWM, pulse-width modulation) de una seal o fuente de energa es una
tcnica en la que se modifica el ciclo de trabajo de una seal peridica (una senoidal o una cuadrada, por
ejemplo), ya sea para transmitir informacin a travs de un canal de comunicaciones o para controlar la
cantidad de energa que se enva a una carga.
El ciclo de trabajo de una seal peridica es el ancho relativo de su parte positiva en relacin con el perodo.
Expresado matemticamente:

D es el ciclo de trabajo
es el tiempo en que la funcin es positiva (ancho del pulso)
T es el perodo de la funcin [Wikipedia]

[wikipedia]
7.4 Mdulo CCP.
Los mdulos CCP (Capture/Compare/PWM) permiten realizar las siguientes Funciones:
- Captura: obtiene el valor del temporizador en un momento dato, fijado por la accin de un terminal
del PIC.
- Comparacin: compara el valor del temporizador con el valor de un registro y provoca una accin en el
PIC.
Autor: Luis Alberto Vargas Tijerino. Pgina 38
- PWM: genera una seal modulada por ancho de pulso.
Los PIC de gama media pueden tener hasta 2 mdulos CCP.
7.4.1 Configuracin del Mdulo CCP en Modo PWM.
La funcin que se encarga de realizar la configuracin del mdulo CCP es la siguiente:
setup_ccpX( )
Sintaxis setup_ccp1 (mode) o setup_ccp2 (mode)
Parametros mode es una constant. Las constantes vlidas se encuentran en los archivos .h del dispositivo y
son las siguientes:

Deshabilita el mdulo CCP
CCP_OFF

Configuracin del CCP para modo PWM:
CCP_PWM Habilita el Pulse Width Modulator

7.4.2 Configuracin del ciclo de trabajo.
La funcin 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 podra ser una variable o una constante de 8 o 16 bits.
7.5 Mdulo TIMER2.
Es un temporizador de 8 bits, similar al TIMER0, con las siguientes caractersticas:
1. Registro TIMER2 de 8 bits.
2. Registro PR2 de 8 bits.
3. Interrupcin 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 Configuracin de la frecuencia PWM.
El Perodo de la seal se obtiene al configurar TIMER2 y el valor del registro PR2, para ello se utiliza la
siguiente funcin:
setup_timer_2( )
Sintaxis setup_timer_2 (mode, period, postscale)
Parametros mode podra ser:
- T2_DISABLED
- T2_DIV_BY_1
- T2_DIV_BY_4
Autor: Luis Alberto Vargas Tijerino. Pgina 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
interrupcin. (1 significa una vez, 2 significa 2 veces, etc.).
[ayuda ccs]
A continuacin se describe el funcionamiento del mdulo.

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 Perodo.
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 Perodo.
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 continuacin se muestra la ecuacin para calcular el
Perodo PWM que nos brinda Microchip.
( ) 4 2 2 1
PWM OSC
T T T DIV PR = +
Es decir:
Autor: Luis Alberto Vargas Tijerino. Pgina 40
( ) 4 2 2 1
OSC
PWM
F
F
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 1
4 2
OSC
PWM
F
PR
F T DIV
=


El segundo paso ser sustituir valores y probar con T2DIV = 1.
8
2 1 1999
4 1 1
MHz
PR
kHz
= =


Como el valor anterior es mayor al valor mximo de PR2, es decir 255, debemos aumentar el valor de T2DIV.
8
2 1 499
4 1 4
MHz
PR
kHz
= =


Como an el valor anterior es mayor al valor mximo de PR2, es decir 255, debemos aumentar el valor de
T2DIV y finalmente encontramos que:
8
2 1 124
4 1 16
MHz
PR
kHz
= =


Por lo tanto, para configurar la frecuencia PWM debemos ingresar la siguiente funcin:
Setup_timer_2(T2_DIV_16,124,1)
7.5.3 Resolucin del Ciclo de Trabajo.
La resolucin determina el nmero de posibles ciclos de trabajo para un perodo dado. Por ejemplo, una
resolucin de 10 bits resultar en 1024 ciclos de trabajo discretos, mientras que una resolucin de 8 bits
resultar en 256 ciclos de trabajo discretos.
La mxima resolucin es 10 bits cuando PR2 es 255. La resolucin es funcin del valor del registro PR2 a como
se muestra en la siguiente ecuacin.

7.5.3.1 Ejemplo
Calcule la resolucin del ciclo de trabajo del ejemplo anterior.
En el ejemplo anterior el valor de PR2 fue 124 por lo tanto su resolucin ser:
Autor: Luis Alberto Vargas Tijerino. Pgina 41
( ) log 4 124 1
8
log2
Resolucion bits
+ (

= ~
7.6 Procedimiento.
1. Crear el Proyecto en CCS.
2. Copiar el Cdigo 7.1 Gen_PWM
Cdigo 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. Pgina 42
}
}

3. Presione F9 para compilar el proyecto.
4. Crear el circuito en Proteus. Para ello ser necesario buscar mediante la caja de bsqueda en la
ventana PICK DEVICE el PIC16F887 y el LOGICPROBE.

5. Para insertar el OSCILLOSCOPE ser necesario dar clic en el botn Virtual Instrument de la cinta de
botones izquierda y luego se debe dar clic en la opcin OSCILLOSCOPE del panel lateral a como se
muestra en la siguiente figura.

6. Cargar el Archivo fuente GEN_PWM.cof y Realizar la simulacin.
7. Conteste:
LOGICPROBE
PIC16F887
OSCILLOSCOPE
Botn Virtual
Instruments
Panel
Instruments
Autor: Luis Alberto Vargas Tijerino. Pgina 43
a. Cunto es la resolucin para cada una de las frecuencias escogidas?
b. Cunto debera ser la frecuencia PWM si utilizamos resolucin mxima?
c. Qu ocurre cuando el ciclo de trabajo es mayor a la resolucin PWM?
d. Qu ocurre en la lnea 36 al no presionar ningn botn?
e. Qu ocurre en la lnea 38, 39 y 40 si se presiona el botn RB0?
f. Qu ocurre en la lnea 41, 42 y 43 si se presiona el botn RB1?
g. Qu ocurre en la lnea 44 si se presiona el botn RB0?
h. Qu ocurre en la lnea 45 si se presiona el botn RB1?
7.7 Trabajo Extra Clase.
1. Investigue y conteste:
a. Cmo funciona una fuente Conmutada?
b. Cmo funciona un servomotor?
c. Cmo funciona un Amplificador Clase D?
d. Cul es la frecuencia PWM mxima que se puede generar con un PIC16F887 y un cristal de
20MHz?
2. Elabore un programa en CCS que genere una seal PWM de 1kHz y que se module mediante una
resistencia conectada a una entrada analgica.

Autor: Luis Alberto Vargas Tijerino. Pgina 44
Laboratorio 8: USART
8.1 Objetivo
Comprender el funcionamiento del mdulo USART mediante un ejemplo prctico que transmite datos entre
un PIC y una PC u otro PIC.
8.2 Introduccin
Existe una gran cantidad de proyectos en los que ser necesario tomar un conjunto de seales fsicas,
convertirlas en tensiones elctricas y digitalizarlas de manera que se puedan transmitir y procesar en una
computadora. A este tipo de sistemas se les conoce como Sistemas de Adquisicin de datos (DAQ, Data
Acquisition por sus siglas en ingls).
Por otro lado los PIC tambin 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 comunicacin Serie con la computadora y con otros PIC.
8.3 Mdulo USART.
El mdulo USART (Universal Synchronous Asynchronous Receiver Transmitter) permite la transmisin y
recepcin de datos en serie ya sea con un ordenador trabajando en modo full-duplex asncrono o con
perifricos trabajando en modo half-duplex.
Bsicamente, la transmisin serie consiste en enviar los datos bit a bit a travs de una lnea comn en
periodos de tiempo fijos, dando lugar a la llamada velocidad de transmisin o nmero de bits enviados por
segundo (baudios). Tanto el emisor como el receptor poseen registros de desplazamiento para realizar la
comunicacin. Los bit estn 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 Sncrono
En el modo sncrono (ver Figura 8.1) se permite la transmisin continua de datos y no existe un lmite de
tamao, es un modo semi-duplex (la comunicacin serie se establece a travs de una nica lnea, en ambos
sentidos, pero no se puede transferir informacin en ambos sentidos de forma simultnea). En este modo de
transmisin se puede trabajar de dos formas:
- En modo Maestro, donde el microcontrolador maestro genera la seal de reloj e inicia o finaliza la
comunicacin.
- En modo Esclavo, donde el microcontrolador esclavo recibe la seal de reloj y depende del
microcontrolador para recibir o enviar informacin.
Figura 8.1 Transmisin sincrona

Autor: Luis Alberto Vargas Tijerino. Pgina 45
8.5 Modo Asncrono
En el modo asncrono (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 transmisin configurando la velocidad mientras que la sincronizacin se realiza durante la
transmisin. Cada trama de datos tiene un tamao fijo y poseen un bit inicial o de arranque (star) y un bit final
o de parada (stop) que permiten realizar dicha sincronizacin. La transmisin es en modo full-duplex (se
utilizan dos lneas, una transmisora TX y otra receptora RX, transfiriendo informacin en ambos sentidos de
forma simultanea).
Figura 8.2 Transmisin asncrona

El modo ms habitual de transmisin por el USART es el modo asncrono, puesto que permite comunicaciones
en largas distancias. Existen distintas normas de transmisin serie asncrona, como la RS232, la RS485, etc. Los
niveles de tensin empleados en estas normas son diferentes al empleado por el PIC. Por ello, suele ser
necesaria la utilizacin de drivers externos de adaptacin tal cmo el MAX232 de Dallas Semiconductor-
MAXIM que se muestra en la Figura 8.3.
Figura 8.3 MAX232

8.6 Niveles lgicos RS232
La Figura 8.4 ilustra los requisitos en cuanto a niveles lgicos que debe cumplir una transmisin serie segn la
norma RS232.
Autor: Luis Alberto Vargas Tijerino. Pgina 46
Figura 8.4 Byte segn normas RS232

- Los datos se transmiten con lgica negativa, es decir, un voltaje positivo en la conexin representa un
0, mientras que un voltaje negativo representa un 1.
- Para garantizar un 0 lgico una lnea debe mantener un voltaje entre +3V y +15V.
- Del mismo modo para 1 lgico garantizado debe estar entre -3V y -15V.
- Los voltajes ms 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
transmisin a 1 lgico a -12V, normalmente.
- La banda muerta entre +3V y -3V se conoce como la regin de transicin donde los niveles lgicos no
estn definidos. Es decir estos valores pueden interpretarse ambiguamente como 0 1.
Si se aumenta la velocidad de transmisin las seales de datos se vuelven susceptibles a prdidas de voltaje
causadas por la capacidad, resistencia e inductancia del cable. Estas prdidas son conocidas como efectos de
alta frecuencia y aumentan con la longitud del cable.
Estos valores de tensin proporcionan un amplio margen de seguridad que es de gran utilidad cuando los
cables deben pasar por zonas cercanas a elementos que generan interferencias elctricas: motores,
transformadores, equipos de comunicacin, etc. Estos elementos, unidos a la longitud del cable, pueden hacer
disminuir la seal hasta en varios voltios, sin que afecte adversamente al nivel lgico de la entrada. [mic16F84,
p308]
8.7 El mdulo USART en C.
8.7.1 Configuracin del Mdulo USART.
Para configurar el mdulo USART es necesario utilizar la siguiente directiva:
#USE RS232(opciones)
Sintaxis #USE RS232(opciones)
Parametros Las opciones para realizar la comunicacin RS232 son las siguientes:
Autor: Luis Alberto Vargas Tijerino. Pgina 47
STREAM=id
Asocia una identificador con su puerto RS232. El identificador podra ser
usado en funciones como fputc.
BAUD=x Configura la taza de baudios con el valor de x
XMIT=pin Pin de Transmisin
RCV=pin Pin de recepcin
FORCE_SW Usa un UART mediante software.
STOP=x Nmero 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 dems opciones.
8.7.2 Transmisin de datos:
La siguiente funcin enva datos a travs 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 carcter u entero de 8 bits.
Stream es un identificador (un byte constante).
Tambin es posible utilizar la funcin printf que utilizamos para Escribir caracteres en el LCD.
8.7.3 Recepcin de datos:
Para recibir un dato de 8 bits (entero o carcter) se utiliza la siguiente funcin:
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 carcter).
La siguiente funcin 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 carcter).

8.8 Procedimiento.
8. Crear el Proyecto en CCS.
9. Copiar el Cdigo 8.1 Trans_serie
Cdigo 8.1 Trans_serie
///////////////////////////////////////////////////////////////////////////////
Autor: Luis Alberto Vargas Tijerino. Pgina 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. Pgina 49
11. Crear el circuito en Proteus que se muestra en la Figura 8.5. Para ello ser necesario buscar
mediante la caja de bsqueda 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 botn Virtual Instrument de la cinta
de botones izquierda y luego se debe dar clic en la opcin VIRTUAL TERMINAL del panel lateral a
como se muestra en la siguiente figura.

13. Cargar el Archivo fuente GEN_PWM.cof y Realizar la simulacin.
14. Contestar las siguientes preguntas:
a. Presione el botn conectado a RA0 y explique qu ocurre en las lneas 52 y 53.
COMPIN
Virtual
Terminal
PIC16F887
LM016L
LOGICTOGGLE
Botn Virtual
Instruments
Panel
Instruments
Autor: Luis Alberto Vargas Tijerino. Pgina 50
b. Presione el botn conectado a RA1 y explique qu ocurre en las lneas 56 y 57.
c. Presione el botn conectado a RA2 y explique qu ocurre en las lneas 61 y 62.
d. Presione el botn conectado a RA3, escriba la letra f en el Virtual Terminal y explique qu
ocurre en las lneas 65 y 66.
e. Presione el botn conectado a RA4, escriba PIC en el Virtual Terminal y explique qu ocurre en
las lneas 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 botn RA3 de U2, luego presione el botn RA0 de U1 y explique qu ocurre.
b. Presione el botn RA4 de U2, luego presione el botn RA2 de U1 y explique qu ocurre.
c. Presione el botn RA4 de U2, luego presione el botn RA3 de U1 y explique qu ocurre.
d. Presione el botn RA3 de U1, luego presione el botn RA0 de U2 y explique qu ocurre.
e. Presione el botn RA4 de U1, luego presione el botn RA2 de U2 y explique qu ocurre.
f. Presione el botn RA4 de U1, luego presione el botn RA3 de U2 y explique qu ocurre.
8.9 Configuracin del Hyperterminal de Windows
Una herramienta sumamente til para observar los datos provenientes del puerto serie de la PC es el
Hyperterminal, a continuacin se muestra como realizar su configuracin.
1. Para comenzar la configuracin, dirjase al botn de Inicio y seleccione: Programas - Accesorios -
Hyperterminal. Si no tiene la carpeta de Hyperterminal:
PIC16F887
LM016L
LOGICTOGGLE
Autor: Luis Alberto Vargas Tijerino. Pgina 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 pestaa de Instalacin de Windows. Ahora para
verificar las opciones de comunicaciones que tiene instalada, haga doble click sobre Comunicaciones,
luego en las Propiedades, y marque la opcin 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
sesin (puede escribir T-NET) y oprima el botn de Aceptar.
Autor: Luis Alberto Vargas Tijerino. Pgina 52

5. En el campo de Conectar utilizando, se selecciona el puerto de comunicacin (Com) en donde se
encuentre su PIC instalado. Oprima el botn de Aceptar.

6. Las propiedades del puerto (com x) no deben sufrir modificaciones. En esta pantalla oprima el botn
de Aceptar.
Autor: Luis Alberto Vargas Tijerino. Pgina 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. Cul de los dos modos de transmisin transfiere ms rpido los datos?
b. Cul de los dos modos de transmisin acepta la mayor distancia entre dispositivos?
c. Qu es la transmisin SPI?
d. Qu es la transmisin I2C?
e. Qu es la transmisin One-Wire?
f. Cules son los protocolos de transmisin almbrico ms utilizados actualmente en la
electrnica de consumo?
2. Elabore un programa en CCS que obtenga los datos del ADC y los enve mediante USART al
Hyperterminal de Windows.

Você também pode gostar