42
UNIVERSIDAD MAYOR FACULTAD DE INGENIERIA ESCUELA DE ELECTRONICA Y TELECOMUNICACIONES “PROGRAMACION MICROCONTROLADOR PIC 18F452 USANDO KIT DE DESARROLLO MICROCHIP” DISEÑO E IMPLEMENTACION DE SISTEMAS DIGITALES Rubén Bravo SANTIAGO – CHILE Diciembre 2006

Libro Pic18f452

Embed Size (px)

Citation preview

Page 1: Libro Pic18f452

UNIVERSIDAD MAYOR

FACULTAD DE INGENIERIA

ESCUELA DE ELECTRONICA Y TELECOMUNICACIONES

“PROGRAMACION MICROCONTROLADOR PIC 18F452 USANDO KIT DE DESARROLLO MICROCHIP”

DISEÑO E IMPLEMENTACION DE SISTEMAS DIGITALES

Rubén Bravo

SANTIAGO – CHILE

Diciembre 2006

Page 2: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

INDICE

Introducción. 21. Microcontrolador PICF452. 3

1.1 Características Técnicas. 3

1.2 Características Periféricas. 3

2. Programación del PIC. 52.1 Análisis del circuito del grabador. 7

2.2 PIC – C Compiler. 8

2.2.1 Programando en C. 8

2.2.2 Estructura C – Assembler. 11

2.3 WinPic 800. 12

2.3.1 Configurando el programador. 12

2.3.2 Extrayendo – Ingresando datos al PIC. 16

3. Picboard. 183.1 Características Generales. 18

4. Teclado. 195. Display. 20

5.1 Características. 21

5.2 Descripción de pines. 21

5.3 Encendido del LCD. 23

5.3.1 Usando Funciones del PIC-C Compiler. 24

5.3.2 Usando Funciones del Manual del LCD. 24

5.3.3 Funciones Más Usadas. 29

5.3.3.1 lcd_init(). 29

5.3.3.2 lcd_gotoxy(),

30

5.3.3.3 lcd_putc(). 30

6. Temporizador. 316.1 Interrupciones. 32

Anexos 34

2

Page 3: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

INTRODUCCION

Dentro de los tópicos del curso de “Diseño e Implementación de Sistemas Digitales”,

se introdujo como materia del ramo, las aplicaciones y programación de los

microcontroladores PIC, específicamente el PIC18F452, el cual se usó para crear un

sistema de alarma, que tuviera características varias, como un display, en el cual el

usuario pudiera seleccionar distintas opciones desde un teclado multiplexado, como

asignar Hora/Fecha, supervisar el estado de puertas y ventanas, etc.

En vista de que este material es nuevo, se pensó en la necesidad de crear un

manual que fuese en ayuda de los futuros alumnos del ramo, como también de todos

aquellos que se interesen en aprender el uso del PIC.

La finalidad de este manual, es entregar las herramientas iniciales sobre el uso,

programación y consejos que permitan crear los cimientos necesarios para que el

alumno aprenda los conocimientos básicos y sea capaz de realizar proyectos usando

las capacidades de estos microcontroladores.

De más esta decir que cualquier contribución a este manual, será bienvenida y

agradecida.

También quisiera agradecer a Osvaldo Rodríguez Toro y al profesor de la asignatura

Sr. Gustavo Meyer, por la ayuda y consejos otorgados durante el semestre para

poder usar el microcontrolador.

3

Page 4: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

1. EL MICROCONTROLADOR PICF452.

Este integrado de la familia PIC, forma parte de los circuitos integrados de Microchip

Technology Inc., que pertenece a la categoría de los microcontroladores. Presenta

características muy versátiles que le permiten aplicaciones en un gran número de

variedades.

1.1 Características Técnicas:

- Memoria Flash de 32 Kbytes.

- Número de instrucciones: 16384.

- RAM (incluida) de 1536 bytes.

- Datos EEPROM 256 bytes.

1.2 Características Periféricas:

- Posee 5 puertos I/O, de 8 bits, menos el puerto A que sólo tiene 7 bits.

- Compatibilidad A/D de 10 bits.

- Tiene un generador de oscilación que le brindan características de timer.

Para más detalle, remitirse al Data sheet del integrado que viene adjunto con el CD

del Kit de desarrollo.FIGURA 1.1

DIAGRAMA DE PINES

4

Page 5: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor FIGURA Nº 1.2

DIAGRAMA EN BLOQUES DEL PIC18F452

5

Page 6: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

2. PROGRAMACIÓN DEL PIC.

El Kit de desarrollo trae un software llamado “Mplab” en el cual se puede hacer la

programación el PIC; en primera instancia se puede hacer directamente en lenguaje

assembler usando el set de instrucciones propio del microcontrolador (adjunto en el

data sheet), pero la dificultad de hacerlo puede ser un tanto grande, sobretodo si no

se tiene mucha experiencia en microcontroladores, o bien, en lenguaje assembler.

Por eso, la opción más simple, es la programación en lenguaje C, al cual se está más

habituado, otra razón para programar en C, es que éste es un lenguaje de mayor

nivel; lo que implica que no es necesario tener que adaptarse a los distintos tipos de

microcontroladores. No como lo que ocurre en assembler, como este es un programa

de bajo nivel, implica que cada chip tiene su propio set de instrucciones y por ende

hay que adaptarse a cada uno.

Pero aparecen otras dificultades; como el procedimiento del Mplab de aceptar la

escritura C y transformarla en instrucciones assembler.

Para ello, la solución es la siguiente: implementar un grabador de PIC propio,

compatible para lenguaje C. El circuito de éste es simple de implementar.

El esquema del circuito fue extraído desde Internet a través de la página

http://www.pablin.com.ar/; en donde además, hay varios otras opciones e información

sobre microcontroladores e interesantes temas relacionados con electrónica.

6

Page 7: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor FIGURA 2.1

“CIRCUITO PROGRAMADOR DE PIC”

FIGURA 2.2

“CONEXIONES CON DISTINTOS TIPOS DE INTEGRADOS”

CircuitoS extraído desde http://www.pablin.com.ar/electron/circuito/mc/ppp2/index.htm

Notar que las terminales con los números, corresponden a los pines del puerto

paralelo (impresora), se recomienda respetar el orden de los mismos propuestos en

7

Page 8: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

el esquema (más adelante se explicará el por qué). También este programador es

compatible para los microcontroladores de 8, 18, 28, 40 pines.

En éste caso, el PIC18F452 tiene 40 pines, por lo que sólo se usará el pin 6 del

esquema Nº 2.

2.1 Análisis del circuito del grabador.

Para la alimentación, usar una fuente de voltaje de 12 [v].

Vcc : corresponde al voltaje de alimentación del PIC, 5 [v].

Vpp : corresponde al voltaje de programación del PIC, 12 [v].

Scl : corresponde a la frecuencia de reloj.

Sda : corresponde a la entrada/salida de datos del PIC.

El LED marcado como "PIC" indica cuando no hay presencia de tensión de

programación (VPP) en el zócalo. Cuando este LED esta apagado la tensión está

presente en los zócalos PIC. Nunca insertar o quitar microcontroladores de los zócalos estando este indicador apagado.

Esto ocurre debido a que desde el PIN 6 llega una pequeña corriente a la base del

transistor; lo que hace que éste, del estado saturación pase a corte y deje fluir toda la

corriente colector emisor que viene a través de la resistencia de ΩK[1 ].

El inversor que está presente (74LS04) tiene la misión de ser una especie de buffer,

retardando la señal y levantándola; por eso la señal es negada dos veces, esto fue

pensado para aquellas situaciones en que el cable es demasiado largo y la señal

tiende a atenuarse o a presentar ruido.

8

Page 9: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

2.2 PCI - C Compiler.

En éste software es posible programar el PIC usando instrucciones de lenguaje C, es

un software muy amigable y simple. Además al momento de compilar,

automáticamente se crea un archivo de extensión “.hex” que es el necesario para

poder ejecutar otro software (se verá más adelante) que crea las instrucciones en

assembler.

2.2.1 Programando en C.

En la opción “File”, se debe buscar la subopción “New”, en donde aparecerá una

pantalla en la cual pide la ubicación en donde se guardará el proyecto.

FIGURA 2.3

“PRESENTACION VENTANA PRINCIPAL”

Una vez hecho esto, se comienza a programar el PIC.

9

Page 10: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

Lo primero que hay que declarar son las librerías necesarias y las características que

se usarán.

#include <18f452.h>

#fuses XT,NOWDT,NOPROTECT

#use delay(clock=4000000)

• En la primera, se declara la librería del integrado a usar y el programa

automáticamente adopta los parámetros del PIC.

• En la segunda directiva, se define qué fusibles deben activarse en el

dispositivo cuando se programe.

• Esta directiva indica al compilador la frecuencia del procesador, en ciclos por

segundo [Hz].

FIGURA 2.4

“EJEMPLO DE PROGRAMACIÓN”

10

Page 11: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

Para compilar se debe ir a la opción “Compile” o bien apretar F9, si no hay error

debería salir el siguiente mensaje:

FIGURA 2.5

CUADRO DE COMPILACION

El archivo con la extensión “.hex” se crea en la misma ubicación antes seleccionada

(al momento de guardar el proyecto).

Se aconseja que cada vez que se compile, se debe hacer click con el botón derecho

en la pestaña que tiene el nombre del proyecto y luego seleccionar la opción “Make

file of Project”, para asegurarse que se compilará el archivo en el lugar apropiado.

Ahora se está en condiciones de ejecutar el software para grabar el PIC

11

Page 12: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

Si hay interés de ver la estructura assembler del programa realizado, se debe revisar

el siguiente tópico(ver Estructura C – Assembler).

2.2.2 Estructura C - Assembler.

Para ver cómo quedaría el programa en instrucciones assembler propias del PIC, se

debe hacer clic en el botón “Mixed C and ASS List File”

FIGURA 2.6

C - ASSEMBLER

“Mixed C and ASS List File”

Es muy recomendable que se tenga un manual de programación de PIC en lenguaje

C, en esta dirección hay uno que se puede descargar y es bastante completo:

http://www.eupmt.es/cra/inform/Manual_Compilador_C_Para_PICs.pdf

12

Page 13: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

2.3 WINPIC 800.

Este es un software que permite grabar el PIC usando el grabador de PIC que se

implementó con anterioridad.

2.3.1 Configurando el grabador.

Es necesario configurar el grabador en el software para que reconozca la existencia

de éste y sus capacidades. Se debe hacer click en la opción “Configuración” y luego

en la subopción “Hardware”.

FIGURA 2.7

VENTANA PRINCIPAL WINPIC 800

13

Page 14: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

Los siguientes pasos son para configurar los parámetros del grabador:

1. El grabador que se debe seleccionar es el “Protopic2”.

2. Para que aparezca el cuadro de opciones se debe oprimir la 5º opción de

izquierda a derecha en el extremo inferior izquierdo.

3. Para habilitar las casillas, se debe quitar el ticket en la casilla del extremo

superior derecho.

FIGURA 2.8

AJUSTANDO PARAMETROS DE CONFIGURACION

Oprimir para acceder a cuadro de opciones

Permite habilitar las casillas

14

Page 15: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

Ahora para ajustar los parámetros se debe tener en mente el siguiente esquema del

conector de puerto paralelo:

1 2 3 4 5 6 7 8 9 10 11 12 13

o o o o o o o o o o o o o

o o o o o o o o o o o o

14 15 16 17 18 19 20 21 22 23 24 25

En donde el PIN 1 es “Strobe”, los PINES 2 al 9 son de datos (los cuales forman 1

Byte), el 10 es “ACK” y el 25 corresponde a “GND”. El resto de los PINES no es

importante mencionarlo para efectos de este ejemplo, por lo que se deja al

interesado en buscar la información

Si se siguió el orden de los pines propuestos en el ejemplo de implementación del

grabador será más simple configurarlo.

Si recordamos el circuito:

- Vcc (alimentación PIC), está asociado al PIN 6, que según el esquema del

conector equivale al “bit 4”.

- “Scl” (Frec. Reloj) corresponde al PIN 3, que corresponde al “bit 1”.

- “Sda” (dato) está asociado a los PINES 10 y 2, pero el PIN 10 “ACK” está

predefinido como “Data in”, por lo que no se debe cambiar, pero el PIN 2

corresponde al “bit 0” y debe ser cambiado en las opciones.

Ahora en la ventana de opciones, hay que asignar a la columna “nombre” el bit

asociado.

Nombre Bit PIN P. ParaleloData 0 2

Data In ACK 10Clock 1 3Vpp 4 6

15

Page 16: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

La configuración debe quedar así:

FIGURA 2.10

AJUSTANDO PARAMETROS DEL GRABADOR

Nota: la casilla que se encuentra habilitada junto a Vpp debe quedar con el clic

puesto, ya que de ésta forma el LED nombrado como “PIC” queda encendido cuando

no hay voltaje de programación.

Así deben quedar las distintas casillas del recuadro de opciones, no olvidar oprimir el

botón “Confirmar cambios”.

Una vez hecho esto, se recomienda hacer la siguiente operación antes de comenzar

a grabar el PIC. Primero se debe detectar el grabador haciendo clic en el botón

“Detectar Dispositivo”, al oprimirlo debe salir una ventana en la cual aparezca el

nombre del PIC usado.

16

Page 17: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

Nota: al hacer esto, el PIC debe estar en el Zócalo del grabador.

FIGURA 2.11

RECONOCIMIENTO DEL PIC

Botón “Detectar dispositivo” Debe salir el nombre del PIC utilizado

2.3.2 Extrayendo – Ingresando datos al PIC.

Una vez realizada la operación de configuración, el programa debería

automáticamente reconocer la existencia del grabador de PIC, junto con el PICF452

(que debe estar puesto en el grabador).

Ahora se debe buscar el archivo con la extensión “.hex” en el lugar determinado por

el software anterior. Para esto se hace clic en la opción “Archivo”, subopción “Abrir” y

desde ahí buscar el archivo correspondiente, el archivo posee el mismo nombre que

se le asignó anteriormente.

17

Page 18: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

Aquí las instrucciones que anteriormente se habían escrito en lenguaje C, ahora

aparecen escritas en forma hexadecimal.

FIGURA 2.12

OPCIONES DE MANEJO DEL PIC

Botones “Leer”,”Grabar”,”Verificar”,”Borrar”

Las funciones de “Leer”, “Grabar”, “Verificar” o “Borrar” el contenido del PIC, se

realizan con una serie de botones ubicados en la barra de herramientas junto al

indicador del “tipo de microcontrolador y fabricante”.

Ahora se puede ejecutar estas opciones con el código creado según el respectivo

proyecto.

18

Page 19: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

3. PICBOARD.

Esta es una tarjeta de entrenamiento que viene como parte del Kit de desarrollo del

PIC, se hablará en términos generales sobre ésta, ya que el detalle se puede

encontrar en el manual que viene en el CD.

FIGURA 3.1

“ESQUEMA DEL PICBOARD”

3.1 Características Generales.

- Al Puerto B están conectados los LED, también el conector de teclado 4x4.

- Posee un Dipswitch de 10 posiciones y otro de seis posiciones. El primero se usa

en micros de 40/28 PINES y el otro en micros de 18/8 PINES.

- Para el display, se deben usar los puertos D y E, siendo los primeros para datos y

los segundos para control del mismo. (Esta función sólo está contemplada para

micros de 40 PINES).

19

Page 20: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

4. TECLADO.

El teclado usado en el proyecto, fue un teclado multiplexado de 4x4, como el de la

figura:FIG Nº 4.1 TECLADO MULTIPLEXADO

1 2 3 F14 5 6 F27 8 9 F3* 0 # F4

F1F2 F3 F4C1C2C3C4

Donde F: filas

C: columnas

La forma de operar de este teclado es en generar un corto-circuito al momento de

presionar una tecla, ya que cada una de éstas es un pulsador. Lógicamente el

funcionamiento se puede describir según la siguiente figura:

FIGURA Nº 4.2

FUNCIONAMIENTO TECLADO MULTIPLEXADO

20

Page 21: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

Nota: a las columnas se le recomienda agregar resistencias que garanticen la

existencia de voltaje que lleguen a las entradas del PIC. Las resistencias que ahí se

muestran son para regular la corriente y sirven de protección.

Si tomamos las filas como referencia, dependerá de las columnas que se activen

para deducir qué tecla fue presionada.

Por ejemplo, si presionamos la tecla “1”, un pulso será enviado desde la “F1” y saldrá

por “C1”, de acuerdo con la Figura 4.1. Si tomamos la Figura 4.2, y consideramos el

mismo ejemplo, al oprimir “1”, el pulso entrará por la “fila 1” y saldrá por la “columna

5”.

5. DISPLAY.

El display usado dispone de 2 filas de 16 caracteres cada una y cada carácter

dispone de una matriz de 5x7 puntos (pixels).

FIGURA 5.1

DISPLAY 2 x 16

Este dispositivo esta gobernado internamente por un microcontrolador Hitachi 44780

y regula todos los parámetros de presentación, este modelo es el mas comúnmente

usado y esta información se basará en el manejo de este u otro LCD compatible.

Para más detalle del funcionamiento del LCD, remitirse a un manual del mismo que

hay en el pañol.

21

Page 22: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

5.1 Características.

- Pantalla de caracteres ASCII, además de los caracteres Kanji y Griegos.

- Desplazamiento de los caracteres hacia la izquierda o la derecha.

- Proporciona la dirección de la posición absoluta o relativa del caracter.

- Memoria de 40 caracteres por línea de pantalla.

- Movimiento del cursor y cambio de su aspecto.

- Permite que el usuario pueda programar 8 caracteres.

- Conexión a un procesador usando un interfaz de 4 u 8 bits

Extracto de http://www.x-robotics.com/rutinas.htm#LCD

5.2 Descripción de pines.

1 Vss Tierra de alimentación GND2 Vdd Alimentación de +5V CC3 Vo Contraste del cristal liquido. ( 0 a +5V )

4 RS

Selección del registro de control/registro de datos:

RS=0 Selección registro de control

RS=1 Selección registro de datos

5 R/W

Señal de lectura/escritura:

R/W=0 Escritura (Write)

R/W=1 Lectura (Read)

6 E

Habilitación del modulo:

E=0 Módulo desconectado

E=1 Módulo conectado7-14 D0-D7 Bus de datos bidireccional.

Extracto de http://www.x-robotics.com/rutinas.htm#LCD

El LCD tiene un aspecto físico como el mostrado en la Figura 5.2. Está constituido

por un circuito impreso en el que están integrados los controladores del display y los

pines para la conexión del display. Sobre el circuito impreso se encuentra el LCD en

sí, rodeado por una estructura metálica que lo protege. En total se pueden visualizar

2 líneas de 16 caracteres cada una, es decir, 2x16=32 caracteres, como se muestra

en la Figura 5.3. A pesar de que el display sólo puede visualizar 16 caracteres por

22

Page 23: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

línea, puede almacenar en total 40 por línea. Es el usuario el que especifica qué 16

caracteres son los que se van a visualizar.

FIGURA 5.2

FIGURA 5.3

El cableado entre el LCD y el PIC puede ser de varias formas, variando la cantidad

de bits que se usan para los datos, estos pueden ser según las siguientes opciones:

23

Page 24: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

5.3. Encendido del LCD.

Antes de que aparezca cualquier cosa en la pantalla LCD, debe ser inicializada; esto

significa, enviar códigos de bits por medio del PIC que indiquen la forma de trabajo

de éste, o sea “setear” la características que se utilizarán del LCD, como que

aparezca el cursor, mover los datos de izquierda o derecha, etc.

Internamente el LCD cuenta con un microcontrolador que transforma los datos

enviados del PIC, para desplegarlos en pantalla.

Recordemos que por defecto los pines que están conectados al PIC en el

PICBOARD son los del Puerto E para control y Puerto D para datos, la forma de

inicializar la pantalla.

Para inicializar el LCD, hay dos caminos a seguir, el primero es usar las funciones

propias del software de programación PIC-C Compiler (se recomienda), o bien usar

24

Page 25: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

las instrucciones adjuntas en el manual del LCD. Se prefiere usar la primera, debido

a la simplicidad en el manejo de las funciones. De cualquier forma, nos referiremos a

las dos opciones.

5.3.1 Usando Funciones del PIC – C Compiler.

La librería <lcd.c> contiene los códigos de inicialización y otras funciones del LCD,

como mostrar datos en pantalla, manipular la posición del cursor, etc.

Pero el cableado entre el PIC y el display debe ser el que está predeterminado por

las funciones, esto es usar el puerto D, pero sólo se usan los 3 de control y 4 de

datos, por lo que el pin D3 no será usado.

PIN DISPLAY PIN PICD0 ENABLED1 RSD2 R/WD4 D4D5 D5D6 D6D7 D7

Para inicializar el LCD, basta con escribir en el programa, lcd_init().

5.3.2 Usando Funciones del Manual del LCD.

Para esto se recomienda usar los 8 bits para datos de cualquier puerto y usar el los 3

pines del puerto E como control, ya que como se mostró anteriormente, para usar 4

bits de datos, hay que multiplexar la información y el programa tiende a ponerse más

complejo, por ende, si no se tiene la habilidad necesaria de programación es mejor

usar los 8 bits de datos.

En los bits de datos, hay que generar un código para inicializar el LCD, el que se da

a continuación:

25

Page 26: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

- CLEAR DISPLAY:Borra el módulo LCD y coloca el cursor en la primera posición (dirección 0). Pone el

bit I/D a 1 por defecto.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 0 0 0 0 0 1

Tiempo de ejecución: 1.64mS

- HOME:Coloca el cursor en la posición de inicio (dirección 0) y hace que el display comience

a desplazarse desde la posición original. El contenido de la memoria RAM de datos

de visualización (DD RAM) permanece invariable. La dirección de la memoria RAM

de datos para la visualización (DD RAM) es puesta a 0.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 0 0 0 0 1 X

Tiempo de ejecución: 1.64mS

- ENTRY MODE SET:Establece la dirección de movimiento del cursor y especifica si la visualización se va

desplazando a la siguiente posición de la pantalla o no. Estas operaciones se

ejecutan durante la lectura o escritura de la DD RAM o CG RAM. Para visualizar

normalmente poner el bit S=0.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 0 0 0 1 I/D S

Tiempo de ejecución: 40µS

- DISPLAY ON/OFF CONTROL:Activa o desactiva poniendo en ON/OFF tanto al display (D) como al cursor (C) y se

establece si este último debe o no parpadear (B).

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 0 0 1 D C B

Tiempo de ejecución: 40µS

- CURSOR OR DISPLAY SHIFT:

26

Page 27: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

Mueve el cursor y desplaza el display sin cambiar el contenido de la memoria de

datos de visualización DD RAM.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 0 1 S/C R/L X X

Tiempo de ejecución: 40µS

- FUNCTION SET:Establece el tamaño de interfase con el bus de datos (DL), número de líneas del

display (N) y tipo de carácter (F)

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 0 1 DL N F X X

Tiempo de ejecución: 40µS

- SET THE CG RAM ADDRESS:El módulo LCD además de tener definidos todo el conjunto de caracteres ASCII,

permite al usuario definir 4 u 8 caracteres gráficos. La composición de estos

caracteres se va guardando en una memoria llamada CG RAM con capacidad para

64 bytes. Cada carácter gráfico definido por el usuario se compone de 16 u 8 bytes

que se almacenan en sucesivas posiciones de la CG RAM.

Mediante esta instrucción se establece la dirección de memoria CG RAM a partir de

la cual se irán almacenando los bytes que definen un carácter gráfico. Ejecutando

este comando todos los datos que se lean o escriban posteriormente, lo hacen desde

esta memoria CG RAM.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 0 1 Dirección de la CG RAM

Tiempo de ejecución: 40µS

- SET THE DD RAM ADDRESS:

27

Page 28: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

Los caracteres o datos que se van visualizando, se van almacenando en una

memoria llamada DD RAM para de aquí pasar a la pantalla.

Mediante esta instrucción se establece la dirección de la memoria DD RAM a partir

de la cual se irán almacenando los datos a visualizar. Ejecutando este comando,

todos los datos que se escriban o lean posteriormente lo harán desde esta memoria

DD RAM. Las direcciones de la 80h a la 8Fh corresponden con los 16 caracteres del

primer renglón y de la C0h a la CFh con los 16 caracteres del segundo renglón, para

este modelo de LCD.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 0 1 Dirección de la DD RAM

Tiempo de ejecución: 40µS

- READ BUSY FLAG & ADDRESS:Cuando el modulo LCD esta ejecutando cualquiera de estas instrucciones, tarda un

cierto tiempo de ejecución en el que no se debe mandar ninguna instrucción. Para

ello dispone de un flag llamado BUSY (ocupado) que indica que se está ejecutando

una instrucción previa.

Esta instrucción de lectura informa del estado de dicho flag además de proporcionar

el valor del contador de direcciones de la CG RAM o de la DD RAM según la última

que se haya empleado.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB00 1 BF Dirección de la CG RAM o DD RAM

Tiempo de ejecución: 40µS

- WRITE DATA TO GG DD RAM:

28

Page 29: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

Mediante este comando se escribe en la memoria DD RAM los datos que se quieren

presentar en pantalla y que serán los diferentes códigos ASCII de los caracteres a

visualizar.

Igualmente se escribe en la memoria CG RAM los diferentes bytes que permiten

confeccionar caracteres gráficos a gusto del usuario.

El escribir en uno u otro tipo de memoria depende de si se ha empleado previamente

la instrucción de direccionamiento DD RAM o la de direccionamiento CG RAM.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB01 0 Código ASCII o byte del carácter gráfico

Tiempo de ejecución: 40µS

- READ DATA FROM CG RAM OR DD RAM:Mediante este comando se lee de la memoria DD RAM los datos que haya

almacenados y que serán los códigos ASCII de los caracteres almacenados.

Igualmente se lee de la memoria CG RAM los diferentes bytes con los que se ha

confeccionado un determinado carácter gráfico.

El leer de uno u otro tipo de memoria depende de si se ha empleado previamente la

instrucción de direccionamiento de la DD RAM o la de direccionamiento CG RAM.

RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB01 1 Código ASCII o byte del carácter gráfico

Tiempo de ejecución: 40µS

5.3.3 Funciones Más Usadas.

29

Page 30: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

El detalle de las funciones del LCD se puede ver abriendo el archivo en la ubicación:

C:\Archivos de programa\PICC\Drivers\LCD

Ahí se pueden ver, además, los parámetros y modificarlos si se estima conveniente.

5.3.3.1 lcd_init().

Inicializa el LCD, hay que usar los pines del puerto D, descrito en anteriormente en

punto 5.3.1.

El esquema en C de esta función es el siguiente:

void lcd_init() BYTE i; set_tris_lcd(LCD_WRITE); lcd.rs = 0; lcd.rw = 0; lcd.enable = 0; delay_ms(15); for(i=1;i<=3;++i)

lcd_send_nibble(3); delay_ms(5); lcd_send_nibble(2); for(i=0;i<=3;++i) lcd_send_byte(0,LCD_INIT_STRING[i]);

5.3.3.2 lcd_gotoxy(y,x).

30

Page 31: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

Esta función pone el cursor en la posición deseada, esto es en la fila (Y), columna

(X).

void lcd_gotoxy( BYTE x, BYTE y)BYTE address;if(y!=1)

address=lcd_line_two;else

address=0; address+=x-1; lcd_send_byte(0,0x80|address);

5.3.3.3 lcd_putc().

Muestra datos en el display, su función es análoga al printf() usado en programación

convencional de C.

Para mostrar caracteres hay que ponerlos entre comillas

Ej. lcd_putc(“TEXTO”);

Para mostrar números hay que agregarle la función printf() de la siguiente forma:

Ej. printf(lcd_putc,”%d”,variable);

Si a esta función se le agregan los siguientes prefijos, como los siguientes, causan

los siguientes efectos:

31

Page 32: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

\f Borra el display.

\n Va al inicio de la 2º línea.

\b Retrocede una posición.

El detalle de ésta función se muestra aquí:

void lcd_putc( char c)

switch (c)

case '\f' : lcd_send_byte(0,1); delay_ms(2); break; case '\n' : lcd_gotoxy(1,2); break; case '\b' : lcd_send_byte(0,0x10); break; default : lcd_send_byte(1,c); break;

6. TIMER.

Esta característica de reloj se logra a través de interrupciones, ya que se le asocia

una variable que cuenta un número determinado de interrupciones y éstas pueden

ser tales que calcen en 1 segundo, de esta forma se logra simular un reloj con el PIC,

se refiere a simulación, porque siempre habrá un pequeño error en los segundos.

Dependiendo de la forma de hacer el cálculo, se puede minimizar, pero siempre

habrá un error.

6.1 Interrupciones.

32

Page 33: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

El PIC posee varios métodos y tipos de interrupciones, aquí se hablará de la RTTC,

que usa el TIMER_0, ésta es una interrupción por desbordamiento, la cual es muy

útil para desarrollar un reloj. Para más detalles sobre ésta y otras, remitirse al data

sheet del integrado.

Forma de uso:

La interrupción RTCC se produce cada vez que el contador TIMER0 pasa de FFh a

00h en 8 bits o bien de FFFh a 000h en 16 bits.

El TIMER0 hace un cómputo completo de 00h a FFh cada 0.083ms, sin embargo

este tiempo puede ser cambiado mediante un preescaler o sea un divisor, ajustable.

Los tiempos generados para cada configuración son:

• 2 -> 83 [mseg] al mínimo preescaler posible.

• 4 -> 166 [mseg]

• 8 -> 333 [mseg]

• 16 -> 666 [mseg]

• 32 -> 1.33 [seg]

• 64 -> 2.66 [seg]

• 128 -> 5.33 [seg]

• 256 -> 10.66 [seg] ----->al máximo preescaler posible.

Se advierte que los tiempos fueron obtenidos de forma empírica mediante reiteradas

pruebas. Por ende hay que considerar un margen de error en los mismos.

Las interrupciones se activan en el programa principal mediante la siguiente forma:

33

Page 34: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

setup_counters(RTCC_INTERNAL,RTCC_DIV_2); // TIMER0: Clock Interno, Presescaler 2

setup_timer_1(T1_DISABLED); // para un RTCC de 33.3 milisegundossetup_timer_2(T2_DISABLED,0,1); // -> 1 Segundo = 7 RTCCenable_interrupts(INT_RTCC); // Habilito Interrupción RTCCenable_interrupts(global); // Habilito Interrupciones

34

Page 35: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

ANEXOS

35

Page 36: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor

1. Programa para hacer que desde un teclado multiplexado de 4x4 se ingrese la hora, mostrarla en un display LCD y también para que un LED (PIN B1) se encienda y se apague a una hora determinada por usuario.

#include <18f452.h> // Selecciona el PIC#fuses XT,NOWDT,NOPROTECT // Opciones de configuración#use delay(clock=4000000) // Velocidad del Cristal : 4 Mhz#include <lcd.c>byte const NInts=6; // Numero de interrupciones para 1 Segundo// VARIABLES GLOBALESchar C_Ints=0; // Contador de Interrupciones ocurridaschar Flag=0; // Flag que cambia cada NInts interrupciones

#int_RTCC // Interrupción por desbordamientoRTCC_isr() // del TIMER0 RTCC if(C_Ints > NInts) // Si las ints ocurridas > ints para 1 Seg. if(Flag==0) Flag=1; else Flag=0; C_Ints=0; // Reinicializo Contador de Ints ++C_Ints; // Incremento el número de interrupciones // Ocurridas

teclado() // Lee un teclado multiplexado de 4x4int x;lcd_gotoxy(1,2);teclado: x=1;while(x<5) if(x==1) //para las teclas 1 2 3 output_high(PIN_C0);

36

Page 37: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor if(input(PIN_C4)==1) delay_us(500000); return(1); delay_us(500000); if(input(PIN_C5)==1) delay_us(500000); return(2); delay_us(500000); if(input(PIN_C6)==1) delay_us(500000); return(3); delay_us(500000); output_low(PIN_C0); if(x==2) //para las teclas 4 5 6

output_high(PIN_C1); if(input(PIN_C4)==1) delay_us(500000); return(4); delay_us(500000); if(input(PIN_C5)==1) delay_us(500000); return(5); delay_us(500000); if(input(PIN_C6)==1) delay_us(500000); return(6); delay_us(500000); output_low(PIN_C1);

37

Page 38: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor if(x==3) //para las teclas 7 8 9 F3

output_high(PIN_C2); if(input(PIN_C4)==1) delay_us(500000); return(7); delay_us(500000); if(input(PIN_C5)==1) delay_us(500000); return(8); delay_us(500000); if(input(PIN_C6)==1) delay_us(500000); return(9); delay_us(500000); if(input(PIN_C7)==1) delay_us(500000); return(100); delay_us(500000); output_low(PIN_C2); if(x==4) //para las teclas * 0 # F4

output_high(PIN_C3); if(input(PIN_C5)==1) delay_us(500000); return(0); delay_us(500000); if(input(PIN_C7)==1)

delay_us(500000);

38

Page 39: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor return(101); delay_us(500000); output_low(PIN_C3); delay_us(1000000); //realiza una pausa en microsegundos x=x+1; goto teclado;void main() //Programa Principalint k=1;int a=0;int b=0;int c=0;int d,e,f,g; //a:segundos, b:minutos, c:horasint q=101;lcd_init();delay_us(6);while(q==101) //seleccionar hora y minutos reloj r : lcd_putc("\fIngrese hora"); lcd_gotoxy(1,2); c=teclado()*10; c=teclado()+c; if(c>24) goto r; printf(lcd_putc,"%d SI F3,NO F4",c); q=teclado();lcd_putc("\f");q=101;while(q==101) p : lcd_putc("\fIngrese minutos"); lcd_gotoxy(1,2); b=teclado()*10; b=teclado()+b; if(b>60)

39

Page 40: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor goto p; printf(lcd_putc,"%d SI F3,NO F4",b); q=teclado();lcd_putc("\f");q=101;while(q==101) //encendido LED o : lcd_putc("\fEncendido LED(hora)"); lcd_gotoxy(1,2); d=teclado()*10; d=teclado()+d; if(d>24) goto o; printf(lcd_putc,"%d SI F3,NO F4",d); q=teclado();lcd_putc("\f");q=101;while(q==101) t : lcd_putc("\fEncendido LEC(min)"); lcd_gotoxy(1,2); e=teclado()*10; e= teclado()+e; if(e>60) goto t; printf(lcd_putc,"%d SI F3,NO F4",e); q=teclado();lcd_putc("\f");q=101;while(q==101) //apagado LED m : lcd_putc("\fApagado LED(hora)");

40

Page 41: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor lcd_gotoxy(1,2); f=teclado()*10; f=teclado()+f; if(f>24) goto m; printf(lcd_putc,"%d SI F3,NO F4",f); q=teclado();lcd_putc("\f");q=101;while(q==101) n : lcd_putc("\fApagado LED(min)"); lcd_gotoxy(1,2); g=teclado()*10; g=teclado()+g; if(g>60) goto n; printf(lcd_putc,"%d SI F3,NO F4",g); q=teclado();output_b(0x0);setup_counters(RTCC_INTERNAL,RTCC_DIV_2); // TIMER0: Clock Interno,Presescaler 2setup_timer_1(T1_DISABLED); // para una RTCC cada 83 milisegundossetup_timer_2(T2_DISABLED,0,1); // -> 1 Segundo = 6 RTCCenable_interrupts(INT_RTCC); // Habilito Interrupción RTCCenable_interrupts(global); // Habilito Interrupcioneslcd_putc("\f");lcd_putc("Contando...");do // Bucle infinito if(Flag==k) else // si ha cambiado Flag printf(lcd_putc,"\n%d :%d :%d",c,b,a); // muestra el reloj if(a==60)

41

Page 42: Libro Pic18f452

Rubén Bravo Brach Universidad Mayor a=0; lcd_putc("\fContando..."); printf(lcd_putc,"\n%d :%d :%d",c,b,a); b++; if(b==60) a=0; b=0; lcd_putc("\fContando..."); printf(lcd_putc,"\n%d :%d :%d",c,b,a); c++; if(c==24) a=0; b=0; c=0; lcd_putc("\fContando..."); printf(lcd_putc,"\n%d :%d :%d",c,b,a); a++; if((b==e)&&(c==d)) output_high(PIN_B1); if((b==g)&&(c==f)) output_low(PIN_B1); k=Flag; // Guardo estado anterior de Flag while(true);

42