Está en la página 1de 42

UNIVERSIDAD MAYOR FACULTAD DE INGENIERIA ESCUELA DE ELECTRONICA Y TELECOMUNICACIONES

PROGRAMACION MICROCONTROLADOR PIC 18F452 USANDO KIT DE DESARROLLO MICROCHIP

DISEO E IMPLEMENTACION DE SISTEMAS DIGITALES

Rubn Bravo

SANTIAGO CHILE Diciembre 2006

Rubn Bravo Brach

Universidad Mayor

INDICE Introduccin. 1. Microcontrolador PICF452. 1.1 Caractersticas Tcnicas. 1.2 Caractersticas Perifricas. 2. Programacin del PIC. 2.1 Anlisis del circuito del grabador. 2.2 PIC C Compiler. 2.2.1 Programando en C. 2.2.2 Estructura C Assembler. 2.3 WinPic 800. 2.3.1 Configurando el programador. 2.3.2 Extrayendo Ingresando datos al PIC. 3. Picboard. 3.1 Caractersticas Generales. 4. Teclado. 5. Display. 5.1 Caractersticas. 5.2 Descripcin de pines. 5.3 Encendido del LCD. 5.3.1 Usando Funciones del PIC-C Compiler. 5.3.2 Usando Funciones del Manual del LCD. 5.3.3 Funciones Ms Usadas. 5.3.3.1 lcd_init(). 5.3.3.2 lcd_gotoxy(), 30 5.3.3.3 lcd_putc(). 6. Temporizador. 6.1 Interrupciones. Anexos 30 31 32 34 2 3 3 3 5 7 8 8 11 12 12 16 18 18 19 20 21 21 23 24 24 29 29

Rubn Bravo Brach

Universidad Mayor

INTRODUCCION Dentro de los tpicos del curso de Diseo e Implementacin de Sistemas Digitales, se introdujo como materia del ramo, las aplicaciones y programacin de los microcontroladores PIC, especficamente el PIC18F452, el cual se us para crear un sistema de alarma, que tuviera caractersticas 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 tambin 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, programacin y consejos que permitan crear los cimientos necesarios para que el alumno aprenda los conocimientos bsicos y sea capaz de realizar proyectos usando las capacidades de estos microcontroladores. De ms esta decir que cualquier contribucin a este manual, ser bienvenida y agradecida. Tambin quisiera agradecer a Osvaldo Rodrguez Toro y al profesor de la asignatura Sr. Gustavo Meyer, por la ayuda y consejos otorgados durante el semestre para poder usar el microcontrolador.

Rubn 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 categora de los microcontroladores. Presenta caractersticas muy verstiles que le permiten aplicaciones en un gran nmero de variedades. 1.1 1.2 Caractersticas Tcnicas: Memoria Flash de 32 Kbytes. Nmero de instrucciones: 16384. RAM (incluida) de 1536 bytes. Datos EEPROM 256 bytes. Caractersticas Perifricas: Posee 5 puertos I/O, de 8 bits, menos el puerto A que slo tiene 7 bits. Compatibilidad A/D de 10 bits. Tiene un generador de oscilacin que le brindan caractersticas de timer.

Para ms detalle, remitirse al Data sheet del integrado que viene adjunto con el CD del Kit de desarrollo.
FIGURA 1.1 DIAGRAMA DE PINES

Rubn Bravo Brach


FIGURA N 1.2 DIAGRAMA EN BLOQUES DEL PIC18F452

Universidad Mayor

Rubn Bravo Brach

Universidad Mayor

2.

PROGRAMACIN DEL PIC.

El Kit de desarrollo trae un software llamado Mplab en el cual se puede hacer la programacin 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 opcin ms simple, es la programacin en lenguaje C, al cual se est ms habituado, otra razn 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 solucin 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 extrado desde Internet a travs de la pgina http://www.pablin.com.ar/; en donde adems, hay varios otras opciones e informacin sobre microcontroladores e interesantes temas relacionados con electrnica.

Rubn Bravo Brach


FIGURA 2.1 CIRCUITO PROGRAMADOR DE PIC

Universidad Mayor

FIGURA 2.2 CONEXIONES CON DISTINTOS TIPOS DE INTEGRADOS

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

Notar que las terminales con los nmeros, corresponden a los pines del puerto paralelo (impresora), se recomienda respetar el orden de los mismos propuestos en

Rubn Bravo Brach

Universidad Mayor

el esquema (ms adelante se explicar el por qu). Tambin este programador es compatible para los microcontroladores de 8, 18, 28, 40 pines. En ste caso, el PIC18F452 tiene 40 pines, por lo que slo se usar el pin 6 del esquema N 2. 2.1 Anlisis del circuito del grabador.

Para la alimentacin, usar una fuente de voltaje de 12 [v]. Vcc Vpp Scl Sda : : : : corresponde al voltaje de alimentacin del PIC, 5 [v]. corresponde al voltaje de programacin del PIC, 12 [v]. corresponde a la frecuencia de reloj. corresponde a la entrada/salida de datos del PIC.

El LED marcado como "PIC" indica cuando no hay presencia de tensin de programacin (VPP) en el zcalo. Cuando este LED esta apagado la tensin est presente en los zcalos PIC. Nunca insertar o quitar microcontroladores de los zcalos estando este indicador apagado. Esto ocurre debido a que desde el PIN 6 llega una pequea corriente a la base del transistor; lo que hace que ste, del estado saturacin pase a corte y deje fluir toda la corriente colector emisor que viene a travs de la resistencia de 1[ K ]. El inversor que est presente (74LS04) tiene la misin de ser una especie de buffer, retardando la seal y levantndola; por eso la seal es negada dos veces, esto fue pensado para aquellas situaciones en que el cable es demasiado largo y la seal tiende a atenuarse o a presentar ruido.

Rubn 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. Adems al momento de compilar, automticamente se crea un archivo de extensin .hex que es el necesario para poder ejecutar otro software (se ver ms adelante) que crea las instrucciones en assembler. 2.2.1 Programando en C. En la opcin File, se debe buscar la subopcin New, en donde aparecer una pantalla en la cual pide la ubicacin en donde se guardar el proyecto.
FIGURA 2.3 PRESENTACION VENTANA PRINCIPAL

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

Rubn Bravo Brach

Universidad Mayor

Lo primero que hay que declarar son las libreras necesarias y las caractersticas que se usarn. #include <18f452.h> #fuses XT,NOWDT,NOPROTECT #use delay(clock=4000000) En la primera, se declara la librera del integrado a usar y el programa automticamente adopta los parmetros 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 PROGRAMACIN

10

Rubn Bravo Brach

Universidad Mayor

Para compilar se debe ir a la opcin Compile o bien apretar F9, si no hay error debera salir el siguiente mensaje:
FIGURA 2.5 CUADRO DE COMPILACION

El archivo con la extensin .hex se crea en la misma ubicacin antes seleccionada (al momento de guardar el proyecto). Se aconseja que cada vez que se compile, se debe hacer click con el botn derecho en la pestaa que tiene el nombre del proyecto y luego seleccionar la opcin 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

Rubn Bravo Brach

Universidad Mayor

Si hay inters de ver la estructura assembler del programa realizado, se debe revisar el siguiente tpico(ver Estructura C Assembler). 2.2.2 Estructura C - Assembler.

Para ver cmo quedara el programa en instrucciones assembler propias del PIC, se debe hacer clic en el botn 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 programacin de PIC en lenguaje C, en esta direccin hay uno que se puede descargar y es bastante completo: http://www.eupmt.es/cra/inform/Manual_Compilador_C_Para_PICs.pdf 12

Rubn 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 opcin Configuracin y luego en la subopcin Hardware.
FIGURA 2.7 VENTANA PRINCIPAL WINPIC 800

13

Rubn Bravo Brach

Universidad Mayor

Los siguientes pasos son para configurar los parmetros del grabador: 1. 2. El grabador que se debe seleccionar es el Protopic2. Para que aparezca el cuadro de opciones se debe oprimir la 5 opcin 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

Rubn Bravo Brach

Universidad Mayor

Ahora para ajustar los parmetros se debe tener en mente el siguiente esquema del conector de puerto paralelo:
1 o 2 o o 3 o o 4 o o 5 o o 6 o o 7 o o 8 o o 9 o o 10 o o 11 o o o 12 o o 13 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 informacin Si se sigui el orden de los pines propuestos en el ejemplo de implementacin del grabador ser ms simple configurarlo. Si recordamos el circuito: Vcc (alimentacin PIC), est asociado al PIN 6, que segn 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 Data Data In Clock Vpp Bit 0 ACK 1 4 PIN P. Paralelo 2 10 3 6

15

Rubn Bravo Brach

Universidad Mayor

La configuracin 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 programacin. As deben quedar las distintas casillas del recuadro de opciones, no olvidar oprimir el botn Confirmar cambios. Una vez hecho esto, se recomienda hacer la siguiente operacin antes de comenzar a grabar el PIC. Primero se debe detectar el grabador haciendo clic en el botn Detectar Dispositivo, al oprimirlo debe salir una ventana en la cual aparezca el nombre del PIC usado.

16

Rubn Bravo Brach

Universidad Mayor

Nota: al hacer esto, el PIC debe estar en el Zcalo del grabador.


FIGURA 2.11 RECONOCIMIENTO DEL PIC

Botn Detectar dispositivo

Debe salir el nombre del PIC utilizado

2.3.2 Extrayendo Ingresando datos al PIC. Una vez realizada la operacin de configuracin, el programa debera

automticamente 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 extensin .hex en el lugar determinado por el software anterior. Para esto se hace clic en la opcin Archivo, subopcin Abrir y desde ah buscar el archivo correspondiente, el archivo posee el mismo nombre que se le asign anteriormente.

17

Rubn Bravo Brach

Universidad Mayor

Aqu las instrucciones que anteriormente se haban 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 cdigo creado segn el respectivo proyecto.

18

Rubn 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 trminos 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 Caractersticas Generales. - Al Puerto B estn conectados los LED, tambin 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 funcin slo est contemplada para micros de 40 PINES).

19

Rubn 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 4 7 *

2 5 8 0

3 6 9 #

F1 F2 F3 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. Lgicamente el funcionamiento se puede describir segn la siguiente figura:
FIGURA N 4.2 FUNCIONAMIENTO TECLADO MULTIPLEXADO

20

Rubn 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 proteccin. 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 carcter 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 parmetros de presentacin, este modelo es el mas comnmente usado y esta informacin se basar en el manejo de este u otro LCD compatible. Para ms detalle del funcionamiento del LCD, remitirse a un manual del mismo que hay en el paol.

21

Rubn Bravo Brach

Universidad Mayor

5.1

Caractersticas.

- Pantalla de caracteres ASCII, adems de los caracteres Kanji y Griegos. - Desplazamiento de los caracteres hacia la izquierda o la derecha. - Proporciona la direccin de la posicin absoluta o relativa del caracter. - Memoria de 40 caracteres por lnea de pantalla. - Movimiento del cursor y cambio de su aspecto. - Permite que el usuario pueda programar 8 caracteres. - Conexin a un procesador usando un interfaz de 4 u 8 bits
Extracto de http://www.x-robotics.com/rutinas.htm#LCD

5.2

Descripcin de pines.

1 2 3 4

Vss Vdd Vo RS

Tierra de alimentacin GND Alimentacin de +5V CC Contraste del cristal liquido. ( 0 a +5V ) Seleccin del registro de control/registro de datos: RS=0 Seleccin registro de control RS=1 Seleccin registro de datos Seal de lectura/escritura:

R/W

R/W=0 Escritura (Write) R/W=1 Lectura (Read) Habilitacin del modulo:

6 7-14

E D0-D7

E=0 Mdulo desconectado E=1 Mdulo conectado Bus de datos bidireccional.

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

El LCD tiene un aspecto fsico como el mostrado en la Figura 5.2. Est constituido por un circuito impreso en el que estn integrados los controladores del display y los pines para la conexin del display. Sobre el circuito impreso se encuentra el LCD en s, rodeado por una estructura metlica que lo protege. En total se pueden visualizar 2 lneas de 16 caracteres cada una, es decir, 2x16=32 caracteres, como se muestra en la Figura 5.3. A pesar de que el display slo puede visualizar 16 caracteres por 22

Rubn Bravo Brach

Universidad Mayor

lnea, puede almacenar en total 40 por lnea. 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 segn las siguientes opciones:

23

Rubn 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 cdigos de bits por medio del PIC que indiquen la forma de trabajo de ste, o sea setear la caractersticas que se utilizarn 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 estn 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 programacin PIC-C Compiler (se recomienda), o bien usar

24

Rubn 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 librera <lcd.c> contiene los cdigos de inicializacin y otras funciones del LCD, como mostrar datos en pantalla, manipular la posicin 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 slo se usan los 3 de control y 4 de datos, por lo que el pin D3 no ser usado.
PIN DISPLAY D0 D1 D2 D4 D5 D6 D7 PIN PIC ENABLE RS R/W D4 D5 D6 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 informacin y el programa tiende a ponerse ms complejo, por ende, si no se tiene la habilidad necesaria de programacin es mejor usar los 8 bits de datos. En los bits de datos, hay que generar un cdigo para inicializar el LCD, el que se da a continuacin:

25

Rubn Bravo Brach

Universidad Mayor

CLEAR DISPLAY:

Borra el mdulo LCD y coloca el cursor en la primera posicin (direccin 0). Pone el bit I/D a 1 por defecto.

RS 0

R/W 0

DB7 0

DB6 0

DB5 0

DB4 0

DB3 0

DB2 0

DB1 0

DB0 1

Tiempo de ejecucin: 1.64mS

HOME:

Coloca el cursor en la posicin de inicio (direccin 0) y hace que el display comience a desplazarse desde la posicin original. El contenido de la memoria RAM de datos de visualizacin (DD RAM) permanece invariable. La direccin de la memoria RAM de datos para la visualizacin (DD RAM) es puesta a 0.
RS 0 R/W 0 DB7 0 DB6 0 DB5 0 DB4 0 DB3 0 DB2 0 DB1 1 DB0 X

Tiempo de ejecucin: 1.64mS

ENTRY MODE SET:

Establece la direccin de movimiento del cursor y especifica si la visualizacin se va desplazando a la siguiente posicin 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 0

R/W 0

DB7 0

DB6 0

DB5 0

DB4 0

DB3 0

DB2 1

DB1 I/D

DB0 S

Tiempo de ejecucin: 40S

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 0 R/W 0 DB7 0 DB6 0 DB5 0 DB4 0 DB3 1 DB2 D DB1 C DB0 B

Tiempo de ejecucin: 40S

CURSOR OR DISPLAY SHIFT:

26

Rubn Bravo Brach

Universidad Mayor

Mueve el cursor y desplaza el display sin cambiar el contenido de la memoria de datos de visualizacin DD RAM.

RS 0

R/W 0

DB7 0

DB6 0

DB5 0

DB4 1

DB3 S/C

DB2 R/L

DB1 X

DB0 X

Tiempo de ejecucin: 40S

FUNCTION SET:

Establece el tamao de interfase con el bus de datos (DL), nmero de lneas del display (N) y tipo de carcter (F)

RS 0

R/W 0

DB7 0

DB6 0

DB5 1

DB4 DL

DB3 N

DB2 F

DB1 X

DB0 X

Tiempo de ejecucin: 40S

SET THE CG RAM ADDRESS:

El mdulo LCD adems de tener definidos todo el conjunto de caracteres ASCII, permite al usuario definir 4 u 8 caracteres grficos. La composicin de estos caracteres se va guardando en una memoria llamada CG RAM con capacidad para 64 bytes. Cada carcter grfico definido por el usuario se compone de 16 u 8 bytes que se almacenan en sucesivas posiciones de la CG RAM. Mediante esta instruccin se establece la direccin de memoria CG RAM a partir de la cual se irn almacenando los bytes que definen un carcter grfico. Ejecutando este comando todos los datos que se lean o escriban posteriormente, lo hacen desde esta memoria CG RAM.

RS 0

R/W 0

DB7 0

DB6 1

DB5

DB4

DB3 DB2 DB1 Direccin de la CG RAM

DB0

Tiempo de ejecucin: 40S

SET THE DD RAM ADDRESS:

27

Rubn 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 instruccin se establece la direccin de la memoria DD RAM a partir de la cual se irn almacenando los datos a visualizar. Ejecutando este comando, todos los datos que se escriban o lean posteriormente lo harn desde esta memoria DD RAM. Las direcciones de la 80h a la 8Fh corresponden con los 16 caracteres del primer rengln y de la C0h a la CFh con los 16 caracteres del segundo rengln, para este modelo de LCD.

RS 0

R/W 0

DB7 1

DB6 DB5 DB4 DB3 Direccin de la DD RAM


Tiempo de ejecucin: 40S

DB2

DB1

DB0

READ BUSY FLAG & ADDRESS:

Cuando el modulo LCD esta ejecutando cualquiera de estas instrucciones, tarda un cierto tiempo de ejecucin en el que no se debe mandar ninguna instruccin. Para ello dispone de un flag llamado BUSY (ocupado) que indica que se est ejecutando una instruccin previa. Esta instruccin de lectura informa del estado de dicho flag adems de proporcionar el valor del contador de direcciones de la CG RAM o de la DD RAM segn la ltima que se haya empleado.

RS 0

R/W 1

DB7 BF

DB6

DB5 DB4 DB3 DB2 DB1 Direccin de la CG RAM o DD RAM


Tiempo de ejecucin: 40S

DB0

WRITE DATA TO GG DD RAM:

28

Rubn Bravo Brach

Universidad Mayor

Mediante este comando se escribe en la memoria DD RAM los datos que se quieren presentar en pantalla y que sern los diferentes cdigos ASCII de los caracteres a visualizar. Igualmente se escribe en la memoria CG RAM los diferentes bytes que permiten confeccionar caracteres grficos a gusto del usuario. El escribir en uno u otro tipo de memoria depende de si se ha empleado previamente la instruccin de direccionamiento DD RAM o la de direccionamiento CG RAM.

RS 1

R/W 0

DB7

DB6

DB5 DB4 DB3 DB2 DB1 Cdigo ASCII o byte del carcter grfico
Tiempo de ejecucin: 40S

DB0

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 sern los cdigos ASCII de los caracteres almacenados. Igualmente se lee de la memoria CG RAM los diferentes bytes con los que se ha confeccionado un determinado carcter grfico. El leer de uno u otro tipo de memoria depende de si se ha empleado previamente la instruccin de direccionamiento de la DD RAM o la de direccionamiento CG RAM.

RS 1

R/W 1

DB7

DB6

DB5 DB4 DB3 DB2 DB1 Cdigo ASCII o byte del carcter grfico
Tiempo de ejecucin: 40S

DB0

5.3.3 Funciones Ms Usadas.

29

Rubn Bravo Brach

Universidad Mayor

El detalle de las funciones del LCD se puede ver abriendo el archivo en la ubicacin: C:\Archivos de programa\PICC\Drivers\LCD Ah se pueden ver, adems, los parmetros 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 funcin 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

Rubn Bravo Brach

Universidad Mayor

Esta funcin pone el cursor en la posicin 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 funcin es anloga al printf() usado en programacin convencional de C. Para mostrar caracteres hay que ponerlos entre comillas Ej. lcd_putc(TEXTO); Para mostrar nmeros hay que agregarle la funcin printf() de la siguiente forma: Ej. printf(lcd_putc,%d,variable);

Si a esta funcin se le agregan los siguientes prefijos, como los siguientes, causan los siguientes efectos:

31

Rubn Bravo Brach

Universidad Mayor

\f \n \b

Borra el display. Va al inicio de la 2 lnea. Retrocede una posicin.

El detalle de sta funcin se muestra aqu:


void lcd_putc( char c) { switch (c) { case '\f' : lcd_send_byte(0,1); delay_ms(2); break; case '\n' case '\b' default } } : lcd_gotoxy(1,2); : lcd_send_byte(0,0x10); : lcd_send_byte(1,c); break; break; break;

6.

TIMER.

Esta caracterstica de reloj se logra a travs de interrupciones, ya que se le asocia una variable que cuenta un nmero 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 simulacin, porque siempre habr un pequeo error en los segundos. Dependiendo de la forma de hacer el clculo, se puede minimizar, pero siempre habr un error.

6.1

Interrupciones.

32

Rubn Bravo Brach

Universidad Mayor

El PIC posee varios mtodos y tipos de interrupciones, aqu se hablar de la RTTC, que usa el TIMER_0, sta es una interrupcin por desbordamiento, la cual es muy til para desarrollar un reloj. Para ms detalles sobre sta y otras, remitirse al data sheet del integrado. Forma de uso: La interrupcin 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 cmputo 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 configuracin son:

2 4 8 16 32 64

-> 83 [mseg] al mnimo preescaler posible. -> 166 [mseg] -> 333 [mseg] -> 666 [mseg] -> 1.33 [seg] -> 2.66 [seg]

128 -> 5.33 [seg] 256 -> 10.66 [seg] ----->al mximo preescaler posible.

Se advierte que los tiempos fueron obtenidos de forma emprica 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

Rubn Bravo Brach

Universidad Mayor

setup_counters(RTCC_INTERNAL,RTCC_DIV_2); // TIMER0: Clock Interno, Presescaler 2 setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); enable_interrupts(INT_RTCC); enable_interrupts(global); // para un RTCC de 33.3 milisegundos // -> 1 Segundo = 7 RTCC // Habilito Interrupcin RTCC // Habilito Interrupciones

34

Rubn Bravo Brach

Universidad Mayor

ANEXOS

35

Rubn 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 tambin para que un LED (PIN B1) se encienda y se apague a una hora determinada por usuario.

#include <18f452.h> #fuses XT,NOWDT,NOPROTECT #use delay(clock=4000000) #include <lcd.c> byte const NInts=6; // VARIABLES GLOBALES char C_Ints=0; char Flag=0; #int_RTCC RTCC_isr() { if(C_Ints > NInts) { if(Flag==0) { Flag=1; } else { Flag=0; } C_Ints=0; } ++C_Ints; } teclado() { int x; lcd_gotoxy(1,2); teclado: x=1; while(x<5) { if(x==1) { output_high(PIN_C0);

// Selecciona el PIC // Opciones de configuracin // Velocidad del Cristal : 4 Mhz // Numero de interrupciones para 1 Segundo // Contador de Interrupciones ocurridas // Flag que cambia cada NInts interrupciones // Interrupcin por desbordamiento // del TIMER0 RTCC // Si las ints ocurridas > ints para 1 Seg.

// Reinicializo Contador de Ints // Incremento el nmero de interrupciones // Ocurridas // Lee un teclado multiplexado de 4x4

//para las teclas 1 2 3

36

Rubn Bravo Brach


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) { 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); //para las teclas 4 5 6

Universidad Mayor

37

Rubn Bravo Brach


} if(x==3) { 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) { 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);

Universidad Mayor
//para las teclas 7 8 9 F3

//para las teclas * 0 # F4

38

Rubn Bravo Brach


return(101); delay_us(500000); } output_low(PIN_C3); } delay_us(1000000); x=x+1; } goto teclado; } void main() { int k=1; int a=0; int b=0; int c=0; int d,e,f,g; int q=101; lcd_init(); delay_us(6); while(q==101) { 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)

Universidad Mayor

//realiza una pausa en microsegundos

//Programa Principal

//a:segundos, b:minutos, c:horas

//seleccionar hora y minutos reloj

39

Rubn Bravo Brach


{ goto p; } printf(lcd_putc,"%d SI F3,NO F4",b); q=teclado(); } lcd_putc("\f"); q=101; while(q==101) { 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) { m : lcd_putc("\fApagado LED(hora)");

Universidad Mayor

//encendido LED

//apagado LED

40

Rubn Bravo Brach


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); setup_timer_1(T1_DISABLED); setup_timer_2(T2_DISABLED,0,1); enable_interrupts(INT_RTCC); enable_interrupts(global); lcd_putc("\f"); lcd_putc("Contando..."); do { if(Flag==k) { } else { printf(lcd_putc,"\n%d :%d :%d",c,b,a); if(a==60)

Universidad Mayor

// TIMER0: Clock Interno,Presescaler 2 // para una RTCC cada 83 milisegundos // -> 1 Segundo = 6 RTCC // Habilito Interrupcin RTCC // Habilito Interrupciones

// Bucle infinito

// si ha cambiado Flag // muestra el reloj

41

Rubn Bravo Brach


{ 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; } }while(true); }

Universidad Mayor

// Guardo estado anterior de Flag

42