Guias PIC Digital 2

54
11 Manual de Laboratorio para Electronica Digital 2 en base a PIC, ccs y Proteus Luis Alberto Vargas Tijerino

Transcript of Guias PIC Digital 2

Page 1: Guias PIC Digital 2

11

Manual de Laboratorio

para Electronica Digital 2

en base a PIC, ccs y Proteus

Luis Alberto Vargas Tijerino

Page 2: Guias PIC Digital 2

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

Page 3: Guias PIC Digital 2

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

Page 4: Guias PIC Digital 2

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

Page 5: Guias PIC Digital 2

Autor: Luis Alberto Vargas Tijerino. Página 4

Page 6: Guias PIC Digital 2

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.

Page 7: Guias PIC Digital 2

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.

Page 8: Guias PIC Digital 2

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

Page 9: Guias PIC Digital 2

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.

Page 10: Guias PIC Digital 2

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

Page 11: Guias PIC Digital 2

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

Page 12: Guias PIC Digital 2

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

Page 13: Guias PIC Digital 2

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.

Page 14: Guias PIC Digital 2

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.

Page 15: Guias PIC Digital 2

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

Page 16: Guias PIC Digital 2

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.

Page 17: Guias PIC Digital 2

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

Page 18: Guias PIC Digital 2

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.

Page 19: Guias PIC Digital 2

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:

Page 20: Guias PIC Digital 2

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.

Page 21: Guias PIC Digital 2

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.

Page 22: Guias PIC Digital 2

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.

Page 23: Guias PIC Digital 2

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

Page 24: Guias PIC Digital 2

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

Page 25: Guias PIC Digital 2

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

Page 26: Guias PIC Digital 2

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.

Page 27: Guias PIC Digital 2

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.

}

}

Page 28: Guias PIC Digital 2

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

Page 29: Guias PIC Digital 2

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(){

Page 30: Guias PIC Digital 2

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.

}

Page 31: Guias PIC Digital 2

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.

Page 32: Guias PIC Digital 2

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

Page 33: Guias PIC Digital 2

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

}

Page 34: Guias PIC Digital 2

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

Page 35: Guias PIC Digital 2

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.

Page 36: Guias PIC Digital 2

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

Page 37: Guias PIC Digital 2

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).

Page 38: Guias PIC Digital 2

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.

Page 39: Guias PIC Digital 2

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

Page 40: Guias PIC Digital 2

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:

Page 41: Guias PIC Digital 2

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á:

Page 42: Guias PIC Digital 2

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

Page 43: Guias PIC Digital 2

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

Page 44: Guias PIC Digital 2

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.

Page 45: Guias PIC Digital 2

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

Page 46: Guias PIC Digital 2

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.

Page 47: Guias PIC Digital 2

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:

Page 48: Guias PIC Digital 2

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

///////////////////////////////////////////////////////////////////////////////

Page 49: Guias PIC Digital 2

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.

Page 50: Guias PIC Digital 2

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

Page 51: Guias PIC Digital 2

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

Page 52: Guias PIC Digital 2

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.

Page 53: Guias PIC Digital 2

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.

Page 54: Guias PIC Digital 2

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.