Libro Pic18f452
-
Upload
harrygomez18 -
Category
Documents
-
view
62 -
download
4
Transcript of 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
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
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
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
Rubén Bravo Brach Universidad Mayor FIGURA Nº 1.2
DIAGRAMA EN BLOQUES DEL PIC18F452
5
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Rubén Bravo Brach Universidad Mayor
ANEXOS
35
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
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
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
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
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
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
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