indice del manual de usuario del modulo pic12f508.pdf

16
PIC’School: Módulo PIC12F5XX “Descubre todas las posibilidades de este “enano” pero potente micro” V 1.00 Junio 2006 INGENIERIA DE MICROSISTEMAS PROGRAMADOS S.L. C/ Alda. Mazarredo Nº 47 - 1º Dpto. 2 48009 BILBAO - BIZKAIA Tel/Fax: 94 4230651 email: [email protected] www.microcontroladores.com

Upload: carlos-aranguren

Post on 29-Oct-2015

110 views

Category:

Documents


11 download

TRANSCRIPT

Page 1: Indice del manual de usuario del Modulo PIC12F508.pdf

PIC’School:

Módulo PIC12F5XX

“Descubre todas las posibilidades deeste “enano” pero potente micro”

V 1.00 Junio 2006

INGENIERIA DE MICROSISTEMAS

PROGRAMADOS S.L.

C/ Alda. Mazarredo Nº 47 - 1º Dpto. 248009 BILBAO - BIZKAIA

Tel/Fax: 94 4230651

email: [email protected]

Page 2: Indice del manual de usuario del Modulo PIC12F508.pdf
Page 3: Indice del manual de usuario del Modulo PIC12F508.pdf

Módulo de entrenamiento para los PIC12F5XX Indice general INDICE GENERAL PRACTICA 0: Introducción al PIC12F5XX 0.1 OBJETIVOS 0-1 0.2 FUNDAMENTOS TEORICOS: El PIC12F508/509 0-1 0.2.1 Características generales 0-1 0.2.2 Diagrama de pines 0-2 0.2.3 La memoria de programa 0-2 0.2.4 El mapa de memoria de datos 0-3 0.2.5 Los registros especiales 0-4 0.2.6 El contador de programa 0-6 0.2.7 Direccionamiento del área de datos 0-6 0.2.8 Los bits del registro de configuración 0-7 0.2.9 Configuración del oscilador 0-8 0.2.10 El reset 0-9 0.3 MATERIALES NECESARIOS 0-10 0.4 DESARROLLO DE LA PRACTICA 0-11 0.4.1 Inserción del dispositivo 0-11 0.4.2 Configuración de PIC’School 0-11 0.4.3 Grabación del dispositivo 0-11 PRACTICA 1: Las líneas de E/S 1.1 OBJETIVOS 1-1 1.2 FUNDAMENTOS TEORICOS 1-1 1.2.1 El registro TRIS 1-1 1.2.2 Conexión de las E/S 1-1 2.2.3 Configuración del software 2-5 2.2.4 Tareas mas comunes 2-5 1.3 MATERIALES NECESARIOS 1-2 1.4 DESARROLLO DE LA PRACTICA 1-2 1.4.1 El programa fuente en ensamblador 1-2 1.4.2 Ensamblado del programa fuente 1-4 1.4.3 Conectando los periféricos 1-5 1.4.4 Grabación del dispositivo 1-6 1.4.5 Verificar el funcionamiento 1-6 1.5 TRABAJO PERSONAL 1-7 1.5.1 Ejercicio 1: Visualizar el complemento de las entradas 1-7 1.5.2 Ejercicio 2: Operación aritmética con el valor de las entradas 1-7 1.5.3 Ejercicio 3: Decodificador 1-7 PRACTICA 2: El estado de alta impedancia de las entradas 2.1 OBJETIVOS 2-1 2.2 FUNDAMENTOS TEORICOS 2-2 2.3 MATERIALES NECESARIOS 2-2

i-1

Page 4: Indice del manual de usuario del Modulo PIC12F508.pdf

Módulo de entrenamiento para los PIC12F5XX Indice general 2.4 DESARROLLO DE LA PRACTICA 2-2 2.4.1 Analizando una línea de entrada tri-estado 2-2 2.4.2 Análisis de dos líneas tri-estado 2-3 PRACTICA 3: Temporizaciones software 3.1 OBJETIVOS 3-1 3.2 FUNDAMENTOS TEORICOS 3-1 3.3 MATERIALES NECESARIOS 3-2 3.4 DESARROLLO DE LA PRACTICA 3-2 Ejemplo: Temporizaciones e intermitencias 3-2 3.5 TRABAJO PERSONAL 3-2 Ejercicio 1: Generación de señales modulas en anchura de pulso 3-2 PRACTICA 4: El temporizador Timer 0 (TMR0) 4.1 OBJETIVOS 4-1 4.2 FUNDAMENTOS TEORICOS 4-1 4.3 MATERIALES NECESARIOS 4-2 4.4 DESARROLLO DE LA PRACTICA 4-2 4.4.1 Modo temporizador 4-2 4.4.2 Modo contador de eventos externos 4-3 4.4.3 Ejemplo: Bomba de carga (doblador de tensión) mediante onda cuadrada 4-4 4.5 TRABAJO PERSONAL 4-5

4.5.1 TMR0 en modo temporizador: Generador de pulsos 4-5 TMR0 en modo temporizador: Generador de onda cuadrada 4-5

4.5.2 TMR0 en modo contador: Contar el número de pulsos aplicados 4-6 PRACTICA 5: El Watchdog (WDT) y el RESET 5.1 OBJETIVOS 5-1 5.2 FUNDAMENTOS TEORICOS 5-1 5.3 MATERIALES NECESARIOS 5-2 5.4 DESARROLLO DE LA PRACTICA 5-2 5.4.1 Provocando desbordamientos del WDT 5-2 5.4.2 El modo SLEEP 5-3 5.4.3 Las fuentes de RESET 5-3 5.5 TRABAJO PERSONAL 5-5 5.5.1 Evitar el desbordamiento 5-5 5.5.2 Temporizador 5-5 5.5.3 Temporizador programable 5-5 PRACTICA 6: Comunicaciones serie RS232 6.1 OBJETIVOS 6-1 6.2 FUNDAMENTOS TEORICOS 6-1 6.3 MATERIALES NECESARIOS 6-2

i-2

Page 5: Indice del manual de usuario del Modulo PIC12F508.pdf

Módulo de entrenamiento para los PIC12F5XX Indice general 6.4 DESARROLLO DE LA PRACTICA 6-2 6.4.1 Transmitiendo un carácter 6-3 6.4.2 Transmitiendo mensajes 6-5 6.4.3 Transmisión / recepción 6-5 6.4.4 Visualización remota de señales 6-6 6.4.5 Control remoto de salidas 6-6 PRACTICA 7: Controlando una pantalla LCD 7.1 OBJETIVOS 7-1 7.2 FUNDAMENTOS TEORICOS 7-1 7.3 MATERIALES NECESARIOS 7-3 7.4 DESARROLLO DE LA PRACTICA 7-3 7.4.1 Visualizando el conjunto de caracteres disponibles 7-3 7.4.2 Implementando un stack por software 7-4 7.4.3 Generando caracteres gráficos 7-6 7.5 TRABAJO PERSONAL 7-7 7.5.1 Monitorizando señales de entrada 7-8 7.5.2 Visualizando palabras 7-8 PRACTICA 8: El bus I2C 8.1 OBJETIVOS 8-1 8.2 FUNDAMENTOS TEORICOS 8-1 8.3 MATERIALES NECESARIOS 8-3 8.4 DESARROLLO DE LA PRACTICA 8-4 8.4.1 Controlando las salidas a través del dispositivo PCF8574A 8-4 8.4.2 Problema combinacional 8-6 8.4.3 Control de entradas desde el dispositivo PCF8574A 8-6 8.4.4 Visualización sobre el LCD 8-7 8.5 TRABAJO PERSONAL 8-8 PRACTICA 9: Midiendo la constante R-C 9.1 OBJETIVOS 9-1 9.2 FUNDAMENTOS TEORICOS 9-1 9.3 MATERIALES NECESARIOS 9-2 9.4 DESARROLLO DE LA PRACTICA 9-2 9.4.1 Midiendo la constante de tiempo RC 9-2 a) Midiendo constantes de tiempo con resistencias fijas 9-4 b) Midiendo constantes de tiempo con resistencias variables 9-5 c) Midiendo la constante de tiempo de un sensor de luz o célula LDR 9-5 d) Midiendo la constante de tiempo de un sensor de temperatura o NTC 9-5 9.4.2 Detectando la activación de dispositivos electromecánicos 9-6 9.4.3 Controlando un teclado matricial 9-6 PRACTICA 10: Ejemplos prácticos 10 OBJETIVOS 10-1 10.1 TRANSMISOR R.F. DE 4 CANALES 10-1

i-3

Page 6: Indice del manual de usuario del Modulo PIC12F508.pdf

Módulo de entrenamiento para los PIC12F5XX Indice general 10.1.1 Fundamentos teóricos 10-1 10.1.2 Materiales necesarios 10-3 10.1.3 Desarrollo de la práctica 10-3 10.2 RECEPTOR R.F. DE 4 CANALES 10-4 10.2.1 Fundamentos teóricos 10-4 10.2.2 Materiales necesarios 10-4 10.2.3 Desarrollo de la práctica 10-5 10.2.4 Trabajo personal 10-6 LISTADO DE COMPONENTES

Resistencias: 2x 220Ω; 2x 330Ω; 2x 1KΩ; 2x 2K2; 1x 3K3; 1x 4K7; 5x 10K; 1x 22K; 1x 47K; 1x 100K; 1x1M; 1x NTC 10K/35º; 1x LDR Condensadores: 2x 1nF; 1x 1µF/25V Sensores: Sensor de luz o LDR de 5 mm Sensor de temperatura o NTC de 10K/25º Semiconductores: 2x 1N4148;

C. Integrados: 2x Microcontroladores PIC12F508 1x Controlador de LCD SYM20AA 1x Dispositivo I2C de E/S PCF8574A Módulos de RF Transmisor Aurel TX-SAW/433 s-z Receptor Aurel BC-NBK Varios: Cable de conexiones 4x Pulsadores para C.Impreso CDROM con manual de prácticas y los programas fuente en ensamblador y en C de los ejemplos propuestos. NOTA: Para realizar las prácticas propuestas se recomienda emplear el laboratorio PIC’School que se puede adquirir por separado. BIBLIOGRAFIA 1.- “Microcontroladores PIC, diseño práctico de aplicaciones”, Primera parte. Ed. Mac Graw-Hill 2.- “Microcontroladores PIC, diseño práctico de aplicaciones”, Segunda parte. Ed. Mc Graw-Hill 3.- Curso práctico de Diseño con PIC, 1ª parte. Ingeniería de Microsistemas Programados. 4.- Curso práctico de Diseño con PIC, 2ª parte. Ingeniería de Microsistemas Programados. 5.- MPASM User’s guide. Microchip 6.- MPLAB User’s guide. Microchip 7.- PIC12F508 Data Sheet. Microchip 8.- Manual de usuario del laboratorio PIC’School. Ingeniería de Microsistemas Programados.

i-4

Page 7: Indice del manual de usuario del Modulo PIC12F508.pdf

Módulo de entrenamiento para los PIC12F5XX Indice general DIRECCIONES DE INTERES Ingeniería de Microsistemas Programados S.L. www.microcontroladores.comMicrochip. www.microchip.comCustom Computer Services inc. (compiladores C) www.ccsinfo.comSoftware de grabación WinPIC800. http://perso.wanadoo.es/siscobf/winpic800.htm

i-5

Page 8: Indice del manual de usuario del Modulo PIC12F508.pdf

Módulo de entrenamiento para los PIC12F5XX Indice general

i-6

Page 9: Indice del manual de usuario del Modulo PIC12F508.pdf

Módulo de entrenamiento para los PIC12F5XX PRACTICA 7: Controlando una pantalla LCD

PRACTICA 7: Controlando una pantalla LCD 7.1 OBJETIVOS ¿ Qué dirías si con un PIC tan pequeño pudieras controlar toda una pantalla LCD ? Pues, aunque parezca difícil, resulta sencillo y totalmente factible. Naturalmente que necesitaremos de ayuda exterior. El dispositivo PIC12F508 sólo tiene, en el mejor de los casos, 6 líneas de E/S como máximo para el control de periféricos, y una pantalla LCD necesita al menos 7 líneas para su gestión. Es imprescindible por tanto un hardware externo que simplifique las conexiones entre el PIC y la pantalla. Ese hardware consiste en un circuito controlador de LCD como puede ser el SYM20AA y que se comunicará en serie con el PIC, tal y como se explicó en la práctica anterior. Ya ves, tenemos un PIC “pequeño pero matón”. En esta práctica vamos a analizar el funcionamiento del controlador de LCD SYM20AA y su conexión con el PIC12F508, mediante una serie de ejemplos.

También vamos a tocar un tema importante como es la implementación de un stack gestionado por software que nos permitirá anidar un buen número de subrutinas en nuestros programas de aplicación. 7.2 FUNDAMENTOS TEORICOS El controlador SYM20AA permite la gestión de todas las tareas propias de una pantalla LCD. Se comunica en serie con el microcontrolador principal o “Host” a través de una o dos líneas, lo que resulta especialmente útil en aquellas aplicaciones donde el número de líneas de E/S disponibles sea crítico. El microcontrolador o Host simplemente le transmite los caracteres que se desea visualizar así como unos comandos muy sencillos que producen distintos efectos de visualización. El controlador se encarga totalmente del interface con la pantalla LCD, lo que facilita enormemente el desarrollo de la aplicación final y el consiguiente ahorro de memoria (cuestión que también debe ser considerada). En el disco de usuario se incluye un PDF con el manual completo del controlador SYM20AA donde se explica sus características y conexiones. Estas se muestran en la figura 7-1 y la tabla que le acompaña. Nº PIN NOMBRE DESCRIPCION

2 D7 Línea de interface con el LCD 1 D6 Línea de interface con el LCD

18 D5 Línea de interface con el LCD 17 D4 Línea de interface con el LCD 9 E Señal de habilitación del LCD

16 R/W Señal para la lectura/escritura del LCD 15 RS Señal de comandos y datos del LCD 14 VCC Tensión de alimentación de +5Vcc 5 GND Tensión de alimentación GND 8 TxD Transmisión de datos al Host 7 RxD Recepción de datos desde el Host 3 BAUD Selección de baudios. “0” = 9600, “1” = 19200 6 BLIGHT Salida para el control de la luz de fondo (si está

disponible en el LCD) 4 Vpp No conectar

13 DATA No conectar 12 CLK No conectar

SYM-20AA

21

1817

9

15

14

16

8

7

3

6

5134

12

D7D6D5D4

E

RS

VCC

R/W

TxD

RxD

BAUD

BLIGHT

GNDDATA

VPP

CLK

Figura 7-1. Conexiones del SYM20AA

En la figura 7-2 se muestra el esquema eléctrico de conexiones entre el controlador SYM20AA y el microcontrolador PIC12F508. Atentos a este esquema porque se empleará en posteriores ejemplos. Debemos tener en cuenta que una pantalla LCD es el periférico de salida por excelencia que permite visualizar los resultados de cualquier tipo de proceso.

7-1

Page 10: Indice del manual de usuario del Modulo PIC12F508.pdf

Módulo de entrenamiento para los PIC12F5XX PRACTICA 7: Controlando una pantalla LCD

La pantalla del laboratorio PIC’School se va a conectar con el controlador SYM20AA a través de las líneas D4-D7 para la transferencia de datos y comandos. También se conectan las señales de control de flujo E, R/W y RS con sus correspondientes del controlador. Este a su vez se conecta con el microcontrolador a través de GP4 (TxD) y GP5 (RxD). Por GP4 se transmiten los comandos y datos que se desean visualizar. Cada vez que el controlador finaliza la ejecución de un determinado comando, transmite el código ACK (0x06) que se recibe por la línea GP5. El empleo de esta señal no es imprescindible. Podemos evitarla si el software de la aplicación se toma la molestia de esperar el tiempo que establece el fabricante para la ejecución de un comando. En los ejemplos que vamos a proponer esta línea no se emplea. Es decir, empleamos una sola línea del micro, la GP4, para la comunicación con el controlador SYM20AA, tenemos por tanto disponibles otras 5.

+5Vcc

LCD HD44780 compatible

7 8 9 10 11 12 13 14654321 15 16

D0

D1

D2

D3

D4

D5

D6

D7

ERW

RS

VLC

VC

CG

ND

L+ L-

SYM-20AA

21

1817

9

15

14

16

8

7

3

6

5134

12

D7D6D5D4

E

RS

VCC

R/W

TxD

RxD

BAUD

BLIGHT

GNDDATA

VPP

CLK

GP4(TxD)

GP5(RxD)

Figura 7-2. Esquema típico de montaje

La siguiente tabla muestra todos los código de comandos y datos admitidos por el controlador SYM20AA. HEX DEC DESCRIPCIÓN T.MAX. 0x00 0 Visualiza el carácter gráfico nº 0 previamente definido mediante Set_Char 0.5mS 0x01 1 Visualiza el carácter gráfico nº 1 previamente definido mediante Set_Char 0.5mS 0x02 2 Visualiza el carácter gráfico nº 2 previamente definido mediante Set_Char 0.5mS 0x03 3 Visualiza el carácter gráfico nº 3 previamente definido mediante Set_Char 0.5mS 0x04 4 Visualiza el carácter gráfico nº 4 previamente definido mediante Set_Char 0.5mS 0x05 5 Visualiza el carácter gráfico nº 5 previamente definido mediante Set_Char 0.5mS 0x06 6 Visualiza el carácter gráfico nº 6 previamente definido mediante Set_Char 0.5mS 0x07 7 Visualiza el carácter gráfico nº 7 previamente definido mediante Set_Char 0.5mS 0x08 8 BackSpace: Mueve el cursor una posición a la izquierda y borra el carácter actual

que hubiera 0.5mS

0x0A 10 Line_Feed: El cursor se mueve a la siguiente línea. Si se encuentra en la última se pasa a la primera. Se conserva la posición dentro de la línea

0.5mS

0x0C 12 Form_Feed: Salto de página. El cursor se coloca en la 1ª posición de la 1ª línea. La pantalla se borra

6mS

0x0d 13 Return: El cursor se mueve a la 1ª posición de la siguiente línea. Si esta fuera la última, se pasará a la 1ª.

0.5ms

0x20 –

0x7F

32 -

127

Visualiza el carácter correspondiente al código ASCII. Ver tabla de caracteres disponibles.

0.5mS

0x80 128 Display_ON: Activa el LCD y visualiza el contenido actual. Valor por defecto. 0.5mS 0x81 129 Display_OFF: Desactiva el LCD. La pantalla queda en blanco, pero el contenido

actual permanece intacto. 0.5mS

0x82 130 Cursor_ON: Visualiza el cursor en la posición actual. Valor por defecto 0.5mS 0x83 131 Cursor_OFF: Desactiva la visualización del cursor 0.5mS 0x84 132 Blink_ON: Activa intermitencia del cursor 0.5mS 0x85 133 Blink_OFF: Desactiva la intermitencia del cursor. Valor por defecto 0.5mS 0x86 134 Backlight_ON: Activa la luz de fondo. Sólo es válido en pantallas LCD que dispongan

de dicha luz. 0.5mS

0x87 135 Backlight_OFF: Desactiva la luz de fondo. Valor por defecto 0.5mS 0x88 136 Shift_Right: Desplaza el cursor una posición a la derecha sin borrar el carácter

actual 0.5mS

7-2

Page 11: Indice del manual de usuario del Modulo PIC12F508.pdf

Módulo de entrenamiento para los PIC12F5XX PRACTICA 7: Controlando una pantalla LCD

HEX DEC DESCRIPCIÓN T.MAX. 0x89 137 Shift_Left: Desplaza el cursor una posición a la izquierda sin borrar el carácter actual 0.5mS 0x8A 138 Set_Cursor: Coloca el cursor en las coordenadas indicadas sin borrar el carácter

actual.

Formato: 0x8A ff cc ff = filas (entre 1 y 4) cc = columnas (entre 1 y 40)

Se verifica si las coordenadas indicadas están fuera del rango establecido por el tipo de LCD (Set_LCD), en cuyo caso se establecen las coordenadas por defecto (0-0)

0.5mS

0x8B 139 Set_Char: Genera uno de los posibles caracteres gráficos y los almacena en la memoria interna del LCD.

Formato: 0x8B nn B0 B1 B2 B3 B4 B5 B6 B7 nn = número de identificación del carácter. B0-B7 = Son los bytes que definen la matriz.

Si el sistema queda sin alimentación los caracteres que haya definidos se borran, con lo que habrá que volver a repetir el proceso.

0.5mS

0x8C 140 Sel_LCD: Ajusta el modelo de LCD disponible.

Formato: 0x8C ff cc ff = Número de filas (entre 1 y 4) cc = Número de columnas (entre 1 y 40)

Si un parámetro excede de los límites, se toma el modelo por defecto (2x16). La nueva configuración sólo se mantiene mientras el sistema esté alimentado. La ejecución de este comando implica un borrado total de la pantalla y el posicionamiento del cursor en la 1ª posición de la 1ª fila.

6mS

7.3 MATERIALES NECESARIOS Laboratorio PIC’School PIC12F508 Controlador de LCD SYM20AA Cables de conexión 7.4 DESARROLLO DE LA PRACTICA Los ejemplos que se proponen tienen por objeto hacerse una idea de cómo controlar la pantalla LCD del laboratorio PIC’School, lo que abre la puerta a un sin fin de aplicaciones posibles. 7.4.1 Visualizando el conjunto de caracteres disponibles Se trata de ir sacando por la pantalla LCD el juego completo de caracteres (96) que están definidos en su interior. Como se trata de una pantalla de 2x16 sólo es capaz de visualizar 32 caracteres cada vez. El programa se encarga de ir mostrando las tres páginas de 32 caracteres cada una. El programa fuente

Los ficheros Ejem_7A.asm y Ejem_7B.c contienen los programas fuente escritos en ensamblador y en C respectivamente. Los programas tienen básicamente una estructura similar a los empleados en anteriores ejercicios. Se incluye el mismo fichero “RS232LOW.INC” que contienen las rutinas de transmisión y recepción ya conocidas.

7-3

Page 12: Indice del manual de usuario del Modulo PIC12F508.pdf

Módulo de entrenamiento para los PIC12F5XX PRACTICA 7: Controlando una pantalla LCD

Una consideración a tener en cuenta es que al inicio del programa principal, tras el arranque, se debe realizar una temporización de unos 100ms. Ello es debido a que al conectar la alimentación, la pantalla LCD realiza un proceso interno de inicialización en el que no se le debe enviar ningún comando o dato. Si emplearamos la línea GP5 el controlador enviaría el código ACK (0x06) cuando dicho proceso finalice. Como no lo hacemos, es necesario realizar una temporización “a ojo” para esperar que eso ocurra. Esta consideración también debe tenerse en cuenta durante la ejecución de determinados comandos. Consultar la tabla anterior donde se indican los tiempos de ejecución de cada uno de ellos. Se empieza visualizando el primer carácter ASCII que se corresponde con el “espacio“ (0x20). Entre un carácter y el siguiente se aplica una temporización de 0.3”. Se emplea la rutina “Delay” muy similar a la empleada en anteriores ejemplos.

Cuando se completa una línea (16 caracteres) el controlador continúa automáticamente en la siguiente. Al completarse la pantalla o página (16x2 caracteres) se produce una temporización de 1”, se borra el LCD y se procede a visualiza los siguientes 32. Cuando se han visualizado los 96 caracteres (3 páginas) se empieza de nuevo todo el proceso. Conexiones

Son las mismas que las mostradas en el esquema de la figura 7-2. No hace falta conectar GP5. En la fotografía de la figura 7-3 se muestra el montaje realizado sobre el módulo board del laboratorio. Se puede apreciar que se trata de un montaje muy sencillo y que conviene hacerlo a conciencia. Este mismo montaje se empleará en posteriores prácticas. Tener en cuenta que una pantalla LCD es un periférico de salida que ofrece muchas posibilidades y que, tal y como la estamos empleando, sólo nos consume una línea del PIC. Figura 7-3. Montaje práctico sobre el laboratorio

Evaluación de la práctica Como es habitual se procede a ensamblar o compilar el programa fuente contenido en los ficheros ya mencionados. El dispositivo lo grabaremos mediante el software de grabación WinPIC800 o similar. El jumper JP4 debe estar en la posición MCL y el conmutador en la posición PC. Una vez grabado podemos poner JP4 en la posición GP3 (en esta ocasión no hace falta) y el conmutador en la posición RUN. Se recomienda apagar y encender el entrenador para proceder correctamente con la secuencia interna de inicio de la pantalla LCD. Se observará cómo van apareciendo los distintos caracteres ASCII de forma secuencial y organizados en páginas de 32 caracteres. El proceso se repite de forma indefinida. 7.4.2 Implementando un Stack por software Uno de las inconvenientes de los dispositivos PIC de gama baja en general y del PIC12F508 en particular, es su limitado stack de 2 niveles. Como ya es sabido cada vez que en el programa de aplicación se ejecuta un salto a subrutina mediante la instrucción CALL, en el stack se salva automáticamente el valor actual del PC y que representa la dirección de retorno. Cuando al final de la subrutina se ejecuta la instrucción RETLW se recupera la dirección guardada y el PC retorna al punto de partida.

7-4

Page 13: Indice del manual de usuario del Modulo PIC12F508.pdf

Módulo de entrenamiento para los PIC12F5XX PRACTICA 7: Controlando una pantalla LCD

El problema radica a que el stack de un PIC12F508 es de dos niveles y sólo tiene por tanto capacidad para guardar otras tantas direcciones de retorno. Esto implica que en el diseño del programa de aplicación hay que tener mucho cuidado de no emplear subrutinas anidadas mas allá de dos porque de lo contrario se perderán las diferentes direcciones de retorno.

Figura 7-4. Anidamiento En el presente ejemplo se desea hacer un programa capaz de visualizar diferentes mensajes sobre la pantalla LCD. Para ello nos vemos en la necesidad de hacer tres subrutinas cuyo anidamiento se presenta en la figura 7-4. Desde el programa principal se llama a la subrutina “Mensaje” encargada de ir seleccionando cada uno de los diferentes caracteres. De aquí se llama a la subrutina “TxD” encargada de transmitirlo al LCD, y de esta se llama a “Delay_bit” para la temporización en la transmisión entre un bit y el siguiente. Como el micro sólo tiene dos niveles de stack, la vuelta al programa principal resulta imposible ya que sólo quedaron registradas las dos últimas direcciones de retorno (a “TxD” y a “Mensaje”). El método que se propone es crear un stack por software sobre la memoria RAM del dispositivo. En primer lugar se define la dirección de inicio de ese stack:

Stack equ 0x0e ;Posición inicial para el stack por software Cada salto a subrutina consumirá una posición de RAM por lo que es fácil calcular cuántos anidamientos se pueden realizar según la memoria disponible. Para salvar la dirección de retorno empleamos el direccionamiento indirecto que guarda el valor actual del PCL a partir de la posición definida como inicio de stack:

;Esta macro implementa un stack por software. Cada vez que se usa, el valor ;actual del PC se salva mediante el reg. INDF, en una posición RAM NCALL macro Destino movf PCL,W movwf INDF ;Salva el valor actual del PC incf FSR,F ;Siguiente posición del stack goto Destino ;Salto al inicio de la rutina endm

Se carga el valor actual del PCL en el reg. W (movf PCL,W), este se salva de forma indirecta sobre la posición de memoria destinada al stack (movwf INDF), a continuación se incrementa el puntero a la siguiente dirección (incf FSR,F) y finalmente se salta a la dirección de destino (goto Destino). Estas cuatro instrucciones sustituyen a la clásica instrucción CALL. Como puede que haya que usarlas en numerosas ocasiones, se agrupan en torno a una macro llamada “NCALL Destino“y así no hay que teclearlas cada vez. Para recuperar la dirección de retorno se ejecuta siempre la misma secuencia de instrucciones:

;El retorno se produce recuperando de RAM, a través del reg. INDF, el valor ;del PC al que se le añade +3 para apuntar a la siguiente instrucción justo ;despues de la última NCALL ejecutada. Retorno decf FSR,F ;Posición previa del stack movlw 3 addwf INDF,W ;Ajusta desplazamiento para el PC movwf PCL ;PC apunta a la siguiente instrucción

7-5

Page 14: Indice del manual de usuario del Modulo PIC12F508.pdf

Módulo de entrenamiento para los PIC12F5XX PRACTICA 7: Controlando una pantalla LCD

Se decrementa el puntero para recoger el valor de la posición previa del stack (decf FSR,F), se ajusta un desplazamiento de +3 que hay que aplicarlo sobre el PCL (movlw 3, addwf INDF,W) y, finalmente, el resultado se aplica al PCL, lo que provoca el retorno inmediato a la dirección de partida.

Ahora el programa principal puede saltar a cualquier subrutina simplemente invocando a la macro “NCALL Destino” y la subrutina retornar al programa principal simplemente ejecutando “goto Retorno”. Con todo ello, el esquema de trabajo empleado en el ejemplo del fichero Ejem_7_2A.asm se puede resumir como se muestra en la figura 7-5. Figura 7-5. Esquema empleado en el ejemplo

Cada vez que se emplea la macro “NCALL Destino” se consume una posición de la RAM reservada para el stack por software, pero no un nivel del stack hardware implementado en los PIC. Se puede por tanto anidar tantas subrutinas como memoria RAM disponible haya. Sólo se guarda el valor de 8 bits correspondientes a PCL, por lo que todas las subrutinas deben estar situadas dentro de las primeras 256 posiciones de la memoria de programa. El fichero Ejem_7_2B.c contiene el programa fuente escrito en C. Se puede observar la simplicidad del mismo. Toda la problemática del stack desaparece ya que es el propio compilador quien se encarga de gestionarlo de forma totalmente transparente al usuario. Evaluación de la práctica Se supone que se han realizado las conexiones detalladas en el esquema de la figura 7-2 y que el dispositivo ha sido grabado siguiendo los mismos pasos que en ejemplos anteriores. El ejemplo resuelto, ya sea en la versión asm como en la versión C, simplemente visualiza 2 mensajes o “strings” compuestos de varios caracteres y durante cierto tiempo. También se emplean algunos comandos propios del controlador YM20AA para producir diferentes efectos de visualización: ubicación del cursor, parpadeo, borrado, etc.. 7.4.3 Generando caracteres gráficos

La figura 7-6 muestra el juego completo de caracteres soportados por el controlador SYM20AA y la pantalla LCD. Se corresponden con los caracteres ASCII estándar. Empieza desde la columna 2 (MSB=0010) y fila 0 (LSB=0000) que coincide con el carácter de espacio. A partir de aquí disponemos de todos los símbolos alfanuméricos conocidos cuyos códigos van desde 0x20 hasta 0x7F.

Figura 7-6. Juego de caracteres admitidos

7-6

Page 15: Indice del manual de usuario del Modulo PIC12F508.pdf

Módulo de entrenamiento para los PIC12F5XX PRACTICA 7: Controlando una pantalla LCD

Otras de las posibilidades del controlador SYM20AA es la de crear nuestros propios caracteres gráficos personalizados. Efectivamente es posible definir hasta 8 caracteres gráficos mediante el comando Set_Char (0x8A). Este comando va acompañado del número de carácter gráfico entre 0 y 7 y de 8 bytes que define al propio carácter.

Todo carácter se confecciona mediante una matriz de pixels con 5 columnas y 8 filas tal y como se muestra en la figura 7-7. Las 8 filas se corresponden con los 8 bytes (B0-B7) que definen al carácter y de los que sólo se emplean los 5 bits de menos peso. Cualquier bit de cualquiera de esos bytes que valga nivel “1” provoca la activación del píxel correspondiente. Un nivel “0” lo desactiva. Figura 7-7. Matriz para los caracteres gráficos

La figura 7-8 muestra cómo queda la matriz así como los valores binarios necesarios para formar el carácter “ñ”. Dichos valores son los bytes que deben acompañar al comando Set_Char. Figura 7-8. Definición del carácter “ñ” De está forma, para definir el carácter hay que enviar al controlador LCD la secuencia:

0x8B, 0x01, 0x00, 0x1F, 0x00, 0x17, 0x19, 0x11, 0x11, 0x11 Donde 0x8B es el código del comando Set_Char propiamente dicho, el valor 0x01 se corresponde al número de carácter (entre 0 y 7) y los 8 bytes restantes definen el carácter. Para visualizar posteriormente un carácter ya definido basta simplemente con enviar su número (entre 0 y 7) como si de cualquier otro código ASCII se tratara. Programa fuente Los ficheros Ejem_7_3A.asm y Ejem_7_3B.c contienen los programas fuente en ensamblador y en C. El ejemplo consiste en definir los caracteres “ñ” y “€” para posteriormente visualizarlos. Analizando los fuentes se aprecia claramente que definir un carácter no es ni mas ni menos que enviar una simple secuencia de bytes, similar a lo que hacíamos para visualizar un mensaje. Una vez definido un carácter lo podemos visualizar tantas veces como se desee, igual que cualquier otro. Finalmente indicar que los caracteres se definen en tiempo de ejecución y se mantienen siempre y cuando la pantalla LCD esté alimentada. Evaluación de la práctica

Se supone que se han realizado las conexiones detalladas en el esquema de la figura 7-2 y que el dispositivo ha sido grabado siguiendo los mismos pasos que en ejemplos anteriores.

En este caso se definen los caracteres “ñ” y “€” y luego se visualizan sobre la pantalla durante cierto tiempo y provocando ciertos efectos de intermitencia.

7-7

Page 16: Indice del manual de usuario del Modulo PIC12F508.pdf

Módulo de entrenamiento para los PIC12F5XX PRACTICA 7: Controlando una pantalla LCD

7.5 TRABAJO PERSONAL Vamos a proponer una serie de ejercicios con los que demostrar una vez mas lo simple que resulta el manejo de una pantalla LCD con la ayuda del controlador SYM20AA y empleando tan sólo una línea del PIC 7.5.1 Monitorizando señales de entrada En el esquema de la figura 7-9 se muestra las conexiones a realizar. Las líneas GP0-GP3 se conectan con los interruptores E0-E3 y GP5 con el pulsador E4. Se trata de monitorizar sobre la pantalla LCD el estado lógico de esas señales de entrada E2

E0E1

E3E4

AP18

ENTRADAS DIGITALES

12345678

GP3GP2RB6(GP1)RB7(GP0)

GP5

Figura 7-9. Esquema de conexiones 7.5.2 Visualizando palabras Se trata de hacer un programa que vaya visualizando secuencialmente las siguientes palabras:

árbol, vendré, aquí, opción y baúl

7-8