Manual

262
Prácticas PIC basadas en máquina de vending AUTOR: Félix Rizo Lobato DIRECTOR: Nicolau Cañellas Alberich FECHA: Septiembre / 2004

description

muestra las caracteristicas y proyectos con pic

Transcript of Manual

Page 1: Manual

Prácticas PIC basadas en máquina de vending

AUTOR: Félix Rizo Lobato

DIRECTOR: Nicolau Cañellas Alberich

FECHA: Septiembre / 2004

Page 2: Manual

1.- ÍNDICE

Page 3: Manual

2.- MEMORIA DESCRIPTIVA 1 2.1. INTRODUCCIÓN 2 2.1.1. Antecedentes 2

2.1.2. Objetivos 2

2.2. SOLUCIÓN ADOPTADA 4 2.2.1. Los microcontroladores. Consideraciones previas 4

2.2.2. Ventajas de los diseños basados en microcontroladores 5 2.2.3. Arquitectura básica de los µC 5

2.2.3.1. CPU (Central Process Unit) 6 2.2.3.2. Memoria de programa 6 2.2.3.3. Memoria de datos 6 2.2.3.4. Puertos entrada / salida 7 2.2.3.5. Watch-Dog 7 2.2.3.6. Brown-out 7 2.2.3.7. Contador / timer 7 2.2.3.8. ADC y DAC 8 2.2.3.9. PWM 8 2.2.3.10. Comunicación Serie 8 2.2.4. Que es un PIC? 8 2.2.4.1. Diferencias con otros µC 8

2.2.5. Los microcontroladores PIC 9 2.2.5.1. Características de los microcontroladores PIC 9 2.2.5.2. Familias PICmicro 10 2.2.5.3. ¿Que PIC escogemos? 10 2.2.5.4. PIC 16F876 y 16F877 11

2.3. PRÁCTICAS CON MICROCONTROLADORES 13

2.3.1. Consideraciones previas 13 2.3.2. Descripción del MPLAB 13

2.3.2.1. Introducción programa 13 2.3.2.2. Funcionamiento del MPLAB IDE 14

2.3.3. Descripción del Kit MPLAB-ICD 16 2.3.3.1. Introducción 16 2.3.3.2. Características del MPLAB-ICD Module 17 2.3.3.3. Características del MPLAB-ICD Header 17

2.3.4. Placa base de laboratorio 18 2.3.4.1 Descripción de la paca usada en laboratotio 18

2.3.5. Regulador de tensión 18 2.3.6. Descripción Pantalla LCD 19

2.3.6.1. Introducción 19 2.3.6.2. Que pantalla LCD vamos a utilizar? 19 2.3.6.3. Funcionamiento de la pantalla LCD 19

Page 4: Manual

2.3.7. Descripción teclado 21 2.3.7.1. Introducción 21 2.3.7.2. Funcionamiento del teclado 21

2.4. DESCRIPCIÓN FUNCIONAL DE NUESTRO SISTEMA 24 2.4.1. Visión general 24 2.4.2. Funcionamiento 25

2.4.2.1 Funcionamiento general 25 2.4.2.2 Funcionamiento Módulo 1 26 2.4.2.3 Funcionamiento Módulo 2 27

2.5. DESCRIPCIÓN CIRCUITAL 30 2.5.1. Introducción 30

2.5.2. Circuito regulador de tensión 31 2.5.3. El microcontrolador 31 2.5.4. Decodificador 74LS138 34 2.5.5. Decodificador de BCD a 7 segmentos 7447 y display 36 2.5.6. El Teclado 38 2.5.7. Pantalla LCD 40

2.6. PRÁCTICAS A REALIZAR 42 2.6.1. Introducción 42 2.6.2. Enunciados de prácticas 42

2.6.2.1. Práctica 1 43 2.6.2.2. Práctica 2 50 2.6.2.3. Práctica 3 59 2.6.2.4. Práctica 4 69 2.6.2.5. Práctica 5 78 2.6.2.6. Práctica 6 88

2.7. PROGRAMA ASM 97

2.7.1 Introducción 97 2.7.2. Modulo 1 97

2.7.2.1. Visión general. 97 2.7.2.2. Revisar monedero 98 2.7.2.3. Revisar producto 99 2.7.2.4. Dar cambio 101 2.7.2.5. Interrupción 102

2.7.3. Módulo 2 103 2.7.3.1. Visión general 103 2.7.3.2. Seleccionar producto o precio 104 2.7.3.3. Elegir producto 104 2.7.3.4. Enviar EEPROM 105 2.7.3.5. Interrupción 106

Page 5: Manual

2.7.4. Datos de interés 107 2.7.4.1. Registros de dinero 107 2.7.4.2. Clasificación de los productos. 108 2.7.4.3. Función ‘Escribir_LCD’ 108 2.7.4.4. Función ‘Clear_display’ 109 2.7.4.5. Función ‘EE_escribe’ 109 2.7.4.6. Función ‘EE_LEE’ 109

3.- MEMORIA DE CÁLCULO 110

3.1. CÁLCULOS DE LOS ESQUEMAS ELÉCTRICOS 111 3.2. CÁLCULOS DEL PROGRAMA ASM 112 4.- PRESUPUESTO 114

4.1. LISTA ELEMENTOS 115 4.1.1. Lista de elementos del módulo 1 115 4.1.2. Lista de elementos del módulo 2 116

4.2. LISTA DE PRECIOS 117 4.2.1. Lista de precios de elementos del módulo 1 117 4.2.2. Lista de precios de elementos del módulo 2 118

4.3. COSTE TOTAL 119 4.3.1. Coste total del módulo 1 119 4.3.2. Coste total del módulo 2 120

4.4. RESUMEN DEL PRESUPUESTO 121 5.- PLANOS 122

5.1. ESQUEMAS DE ELEMENTOS 123 5.1.1. Esquema Regulador fuente tensión 123 5.1.2. Esquema del 74LS47 123 5.1.3. Esquema del 74LS138 124 5.1.4. Esquema Comunicación USART 124 5.1.5. Conector teclado 125

5.1.5.1.Teclado producto 125 5.1.5.2.Teclado monedas 125 5.1.5.3.Teclado precio 126

5.1.6. Esquema conector pantalla LCD 126 5.1.6.1. LCD Módulo 1 126 5.1.6.2. LCD Módulo 2 126

Page 6: Manual

5.2. ESQUEMAS PRÁCTICAS MÓDULO 1 127 5.2.1. Esquemas Práctica 1 127 5.2.2. Esquemas Práctica 3 128 5.2.3. Esquemas Práctica 4 129 5.2.4. Esquemas Práctica 6 130 5.2.5. Esquema general 131 5.2.6. Diseño placa base 132

5.3. ESQUEMAS PRÁCTICAS MÓDULO 2 133 5.3.1. Esquemas Práctica 2 133 5.3.2. Esquemas Práctica 5 y Módulo 2 133 5.3.3. Diseño placa base 134

ANEXOS

A. LISTA DE CÓDIGOS DE PROGRAMA

A.1. Módulo 1 I A.1.1. Programa ASM de práctica 1 I A.1.2. Programa ASM de práctica 3 X A.1.3. Programa ASM de práctica 4 XXV A.1.4. Programa ASM de práctica 6 XXXV

A.1.5. Programa ASM del Módulo 1 completo XLVIII A.2. Módulo 2 LXX A.2.1. Programa ASM de práctica 2 LXX A.2.2. Programa ASM de práctica 6 LXXXVI A.2.3. Programa ASM del Módulo 2 completo CI

Page 7: Manual

Memoria descriptiva

2. MEMORIA DESCRIPTIVA

Page 8: Manual

Memoria descriptiva Introducción

2

2.1. Introducción

En este proyecto encontraremos seis prácticas para la asignatura de “Sistemes electrònics amb microcontrolador”, en las cuales se pretende que el alumno aprenda a programar un microcontrolador.

Estas prácticas serán diferentes partes de una simulación de una máquina de vending.

Cada grupo de alumnos debería realizar una práctica. Al finalizar correctamente todas las prácticas, se deberían poder unir los códigos de todos los grupos y se podría simular dicha máquina, por ello, se tendría que intentar que todos los grupos trabajasen en conjunto para poder unir al final todas las prácticas.

Para ello, este proyecto de final de carrera propuesto por Nicolau Cañellas pretende

montar el hardware y el software de la máquina de vending y diseñar las diferentes prácticas a realizar por los alumnos. 2.1.1. Antecedentes

Nuestro antecedente será la asignatura de “Sistemes electrònics amb

microcontrolador” que se realiza en el segundo cuatrimestre del tercer curso de E.T.I. en Electrónica Industrial.

Dicha asignatura tiene 3 créditos prácticos con lo cual este proyecto pretende

complementar las prácticas ya existentes utilizando al máximo los recursos de hardware ya existentes en estas prácticas. 2.1.2. Objetivos

La finalidad de este proyecto es realizar una serie de prácticas con el objetivo de que

los alumnos puedan utilizarlas para aprender a programar mediante el MPLAB a un microcontrolador.

Al mismo tiempo pretendemos, debido a que las prácticas a realizar son las diferentes

partes de una máquina de vending, que estas prácticas puedan unirse, con lo cual pretendemos que exista una unión entre los diferentes alumnos para poder conseguir al final del curso unir todas las prácticas y que funcionen como una sola.

Como queriamos una práctica de comunicaciones serie hemos pensado crear un

sistema para modificar los precios de la EEPROM. La idea sería guardar todos los precios en un módulo que podríamos conectar a la máquina y transmitir los datos para modificar los precios.

También se dejan abiertas una serie de posibilidades para poder añadir diferentes

prácticas a estas para mejorar la simulación, con lo cual los alumnos podrían proponer alguna práctica nueva o para un posible proyecto futuro que ampliase los módulos y el número de prácticas.

Page 9: Manual

Memoria descriptiva Introducción

3

Las diferentes prácticas tienen unos objetivos diferentes. Se ha pretendido que con cada práctica se simule una parte de la máquina de vending, aunque como se ha dicho anteriormente todas estas partes tienen registros en común, como por ejemplo el que realiza la práctica del monedero y el que realiza la práctica del cambio tienen en común el registro que se encarga de saber la cantidad de dinero que se ha pagado.

Las diferentes prácticas a realizar tienen como objetivos: - PRÁCTICA 1: Realizar la simulación de un monedero, con el objetivo de

guardar la cantidad de dinero que el usuario introduce a una máquina.

- PRÁCTICA 2: Realizar un sistema para poder modificar los precios de los productos a vender en la EEPROM.

- PRACTICA 3: Realizar el programa que se encarga de pedir el producto,

revisar el dinero pagado, el que se tiene que pagar y entregar el producto.

- PRACTICA 4: Realizar el programa que se encarga de dar el cambio, tanto cuando seleccionamos un producto como cuando queremos que nos devuelva el dinero pagado.

- PRACTICA 5: Realizar el código para poder comunicar dos

microcontroladores mediante la comunicación de USART. Este sería para enviar la EEPROM para modificar los precios de los productos.

- PRÁCTICA 6: Realizar el código para poder comunicar dos

microcontroladores mediante la comunicación de USART. Este sería para pedir producto.

Page 10: Manual

Memoria descriptiva Solución adoptada

4

2.2. Solución adoptada 2.2.1.Los microcontroladores. Consideraciones previas.

Antes que nada, nos interesa saber que es un microcontrolador, así que partiremos de las funciones que éste hace y haremos una pequeña comparación con otros dispositivos que también hacen esas o otras funciones similares, para descubrir realmente las posibilidades en general de los microcontroladores y de lo que haremos servir en este proyecto. Por esto, haremos unas definiciones previas: Controlador: Dispositivo usado por control automático de un conjunto de procesos Controlador digital: Controlador con lógica de control digital Implementaciones de los controladores digitales: - Lógica discreta

• Baja densidad de integración • Diseño (Hardware) sencillo / medio / complejo • Poco generalizable • Coste bajo / medio / alto

- PLC (Programmable Logic Controller)

• Mayor densidad de integración • Diseño (Software) sencillo • Muy generalizable • Coste elevado

- Microprocesador + RAM + ROM + Periféricos (A/D, Timers...)

• Elevada densidad de integración • Diseño (Software + Hardware) medio / complejo • Generalizable • Coste bajo / medio

- Microcontroladores

• Densidad de integración muy elevada • Diseño (Software + Hardware) sencillo / medio • Muy generalizable • Coste bajo

Page 11: Manual

Memoria descriptiva Solución adoptada

5

2.2.2. Ventajas de los diseños basados en microcontroladores

• Reducción del tamaño y precio: El elevado grado de integración de un microcontrolador (µC) en circuito integrado permite una elevada funcionalidad por área a bajo coste y un menor tamaño del PCB.

• Elevada flexibilidad: Un mismo microcontrolador (µC) puede ser usado por un elevado número de aplicaciones variando solo el software.

• Rapidez de desarrollo: La adaptación de un µC en otra aplicación puede consistir en adaptar el software y muy poco hardware.

• Aumento de la fiabilidad: La disminución de componentes en placa hace disminuir también los riesgos de averías.

• Buenas prestaciones: Los µC usan µP que permiten la ejecución eficiente de algoritmos de control.

2.2.3. Arquitectura básica de los µC En este apartado se muestran todos los elementos que puede tener un µC, no quiere decir ue todos lo µC tengan estos dispositivos, esto depende de la versión del µC que escogamos. Este µC se escoge dependiendo de las aplicaciones que necesitemos.

Figura 1. Arquitectura de los mC

Viendo la descripción de cada uno de los elementos que aparecen en el diagrama anterior, se puede entender mejor.

Page 12: Manual

Memoria descriptiva Solución adoptada

6

2.2.3.1. CPU (Central Process Unit) Es el microprocesador del sistema. Sus características y funcionalidad se definen sobretodo a partir de tres clasificaciones: - Clasificación en función del tamaño de los datos:

• 4 bit: Aplicaciones muy sencillas y muy económicas • 8 bit: Aplicaciones sencillas /medias y económicas. Es el tipo de µC dominante

en el mercado • 16 bit: Aplicaciones medias y coste medio • 32 bit: Aplicaciones complejas y de coste elevado

- Clasificación en función del conjunto de instrucciones:

• RISC (Reduced Instruction Set Code). Instrucciones sencillas y de rápida ejecución.

• CISC (Complex Instruction Set Code). Instrucciones más complejas y de mayor tiempo de ejecución.

- Clasificación en función de la arquitectura de buses:

• Von Newmann: Buses de datos y direcciones compartidos por la memoria de datos y de programa. Simplifica el diseño y el coste.

• Harvard: Buses de datos y direcciones diferentes por la memoria de datos y de programa. Permite acceso simultaneo.

2.2.3.2. Memoria de Programa Ésta es la memoria donde se guarda el programa que escribimos. Es una memoria que se mantiene aunque apaguemos el sistema que la contiene. Existen diferentes tipos de memoria de programa en función de la forma de gravarla y/o borrarla:

• ROM: Dispositivo OTP grabado en fábrica • EPROM: Dispositivo OTP o borrable (con ventana) • EEPROM: Dispositivo regrabable in-system con Vpp = 12v • FLASH: Dispositivo regrabable in-system

2.2.3.3. Memoria de datos La podemos diferenciar en dos tipos de memoria, dependiendo de si ésta se mantiene o no en desconectar el programa. Así tenemos: - Memoria volátil de datos: Es la memoria donde se guardan temporalmente variables usadas en el programa. Tenemos dos, una genérica y otra más específica:

Page 13: Manual

Memoria descriptiva Solución adoptada

7

• RAM: Almacenaje de variables del programa • SFR: (Special Function Regiters). Usados para hacer servir los periféricos, las

interrupciones,... - Memoria no volátil de datos: Es un tipo de memoria como la anterior, ya que sirve

para almacenar datos, pero con la particularidad de que éstos se mantienen en memoria. Es muy útil, por ejemplo, para guardar en memoria algunos datos que queramos llamar desde diversos programas, como datos de configuración o de seguridad. Existen dos tipos:

• EEPROM • FLASH

2.2.3.4. Puertos de Entrada / Salida Son los pins que sirven para la entrada y salida de datos desde o al exterior. Son generalmente de 8 bits, aunque pueden variar según el puerto y algunos de ellos incorporan resistencias de pull-up, la función de las cuales es evitar ponerlas exteriormente en algún tipo de conexión, como entradas procedentes de fuentes de tensión, corriente,... donde tenemos que controlar, por ejemplo las corrientes de entrada. Esto nos hace ahorrar especialmente espacio. 2.2.3.5. WatchDog El WatchDog es un temporizador especial y su función es realizar un reset del microcontrolador periódicamente para refrescarlo. Su funcionamiento no está predefinido, sino que tenemos que introducir un código de programa para hacerlo funcionar como mejor nos convenga y para reinicializarlo en el momento determinado. 2.2.3.6. Brown-out El Brown-out es un circuito interno que sirve como detector de posibles errores en la alimentación del microcontrolador, paralizando el sistema para evitar posibles daños en éste. 2.2.3.7. Contador /Timer En este apartado definimos el contador como un contador de pulsaciones procedentes de un reloj o un dispositivo asincrónico externo y recibidos por un pin destinado a esta función.

En cambio, llamamos Timer al contador de ciclos de una señal de reloj generado

internamente en el dispositivo, pudiendo programarlo como el anterior para que produzca algún evento en el momento determinado que nos interese según lo programemos. Tanto uno como el otro suelen incluir pre-scaler para multiplicar el valor programado y conseguir así posibles temporizaciones más altas.

Page 14: Manual

Memoria descriptiva Solución adoptada

8

2.2.3.8. ADC y DAC Estas opciones son una la inversa de la otra. La primera, mucho más fácil de encontrar, se refiere a la conversión de un valor analógico procedente del exterior en uno de digital dentro de nuestro dispositivo, por esto poder tratarlo. En cambio, el conversor digital analógico nos interesa para transformar un valor que tenemos en formato digital en nuestro dispositivo analógico a la salida al exterior. Pensamos que las señales externas pueden estar en los dos formatos, mientras que en nuestro microcontrolador sólo las podemos tratar en formato digital, de forma que es lógico que el A/D sea en la dirección exterior-interior y el D/A en dirección inversa. 2.2.3.9. PWM El PWM (Pulse Width Modulator) es, como su nombre indica, un generador de pulsos de anchura variable, útil para controles del mismo tipo haciendo la función de duty-cycle, es decir, variaciones en las duraciones de los semiciclos positivos y negativos para obtener tensiones medias variables y conseguir así, por ejemplo, controlar la velocidad de un motor DC. También existe la posibilidad de variar la frecuencia de estos pulsos y conseguir así, por ejemplo, emitir diferentes sonidos en una aplicación. 2.2.3.10. Comunicaciones Serie Los microcontroladores son capaces de enviar o recibir datos del exterior por medio de las comunicaciones serie. Dependiendo del microcontrolador, éstos pueden ser:

• SPI (Serial Peripherical Interface) • I2 C (Inter-Integrated Circuit) • UART (Universal Asynchronous Receiver-Transmiter) • USART (Universal Synchronous-Asynchronous Receiver-Transmiter) • CAN (Controller Area Network) • USB (Universal Serial Bus)

2.2.4. Que es un PIC? Un PIC es un microcontrolador fabricado por Microchip Inc. De este fabricante de µC’s será el nuestro. Aparte de este fabricante existen diferentes fabricantes de microcontroladores, National, Motorola, Intel ,Zilog ,Thomson. 2.2.4.1. Diferencias con otros µC. Las pricipales diferencias entre los PIC y otras marcas es que tienen gran variedad de módelos que permiten sleccionar el que más convenga para tu proyecto. Que tienen gran variedad de herraminetas para desarrollar hardware y software. Por su longitud de palabra de

Page 15: Manual

Memoria descriptiva Solución adoptada

9

12 bits son los que menos espacio ocupan en la memoria de instrucciones. Y son bastante más rapidos que la mayoría. Déspues de estas diferencias parece que los PIC son los mejores, cosa que no es verdad para aplicaciones muy especificas en lso que las otras marcas pueden dar unas prestaciones más elevadas. 2.2.5. Los microcontroladores PIC 2.2.5.1. Características de los microcontroladores PIC

• RISC (Reduced Instruction Code) o Gama baja (PIC 16C5X) 33 instrucciones o Gama media (PIC 16CXXX) 35 instrucciones o Gama alta (PIC 17CXXX/18CXXX) 58/77 instrucciones

• Arquitectura Harvard (Buses diferentes para las memorias de datos y

direcciones) o Memoria de datos de 8 bits o Memoria de programa de 12/14/16 bits

• Arquitectura Pipeline o Todas las instrucciones ocupan 1 palabra de instrucción o Ejecución de todas las instrucciones en 2 ciclos o Throghput 1 ciclo de instrucción, excepto saltos que son 2 ciclos

• Pila Hardware • WatchDog Timer (WDT) • Power on Reset (POR) • Modo de bajo consumo (SLEEP) • Líneas E/S de alta corriente (20/25 mA) • Protección de código • Número de serie/código de identificación • Programación:

o C = CMOS OTP/EPROM o CR = CMOS ROM o CE = CMOS OTP/EPROM+EEPROM o F = FLASH o HV = High Voltage (15v) o LF = Low Voltage Flash o LC = Low Voltage OTP o LCR = Low Voltage ROM

Page 16: Manual

Memoria descriptiva Solución adoptada

10

2.2.5.2. Familias PICmicro Seguidamente se muestran las familias PIC pertenecientes a la marca Microchip, a partir de las características de las cuales escogemos el modelo más apropiado para nuestra aplicación.

• Familia PIC 16C5X o 12-bit program word o Familia base o 2 Niveles de pila hardware o No interrupciones o 1 Timer-8bits + WDT

• Familia PIC 12C5XXX

o 12-bit/14-bit program word o EEPROM o Interrupciones o 1 Timer-8bits + WDT

• Familia PIC 16CXXX, 16 FXXX

o 14-bit program word o Prestaciones medias o Gran variedad de periféricos on-chip: Comparadores, PWM, 3 Timers,

Conversores A/D, EEPROM de datos, USART,... o 8 Niveles de pila hardware o Interrupciones internas y externas

• Familia PIC 17CXXX

o 14-bit program word o Otras prestaciones o Gran variedad de periféricos on-chip: Comparadores, PWM, 3 Timers,

Conversores A/D, EEPROM de datos, USART,... o 16 Niveles de pila hardware o Interrupciones vectorizadas

• Familia PIX 18CXXX o 16-bit program word o Muchas otras prestaciones (10 MIPS) o Gran variedad de periféricos on-chip: Comparadores, PWM, 3 Timers,

Conversores A/D, EEPROM de datos, USART,... o 32 Niveles de pila hardware o Interrupciones vectorizadas (internas y externas)

2.2.5.3. ¿Que PIC escogemos? Como hemos explicado anteriormente, el PIC a escoger será 16F876 debido a que actualmente en las clases prácticas ya se utiliza este microcontrolador, con lo cual tendremos

Page 17: Manual

Memoria descriptiva Solución adoptada

11

ya los microcontroladores e incluso los kits del ICD-DEBUGER, con lo que nos podemos ahorrar una gran parte del presupuesto. También lo elegimos ya que es un micro de gama media. Con lo cual tenemos funciones de sobra en el micro para poder realizar las prácticas diseñadas, he incluso sirve para posteriores ampliaciones, ya que no gastamos todos los recursos que nos da el microcontrolador. Se utilizarán dos PIC debido a que queremos hacer una práctica de comunicación por USART y ya que tenemos que utilizar los dos micros utilizaremos el segundo micro tanto en la simulación del módulo para modificar los precios de la EEPROM, como para entregar el producto seleccionado, ya que para posibles ampliaciones de las prácticas se necesitarían más entradas y salidas. De este modo, con este segundo micro se podría seguir ampliando la máquina. 2.2.5.4. PIC 16F876 y 16F877

A continuación se exponen las características principales de estos microprocesador. Estos PIC’s disponen de:

• Arquitectura Harvard (Memoria de datos y programa separados) • Memoria de datos de 8 bit • Memoria de programa de 14 bit • Líneas E/S de alta corriente • Memoria RAM de 368 Bytes • Memoria de datos EEPROM de 256 Bytes • Memoria FLASH de programa de 14336 Bytes (14bit*8192 word) • 3 Puertos de Entrada/Salida (1 de 6 bits, 2 de 8bits) en el 16F876 y 5 Puertos de salida

en el 16F877 (1 de 3 bits, 1 de 6 bits, 3 de 8 bits) en el 16F877 • WatchDog (Temporizador especial que hace un reset periódicamente) • Timer de 16bit • 2 Timer de 8 bit • 5 conversores A/D de 10 bits en el 16F876 y 8 convresores A/D de 10 bits en el

16F877 • 1 Puerto Serie para comunicación • 1Puerto Paralelo para comunicación en el 16F877 • Posibilidades de interrupciones internas / externas • Posibilidad de interrupción del Puerto Serie

Page 18: Manual

Memoria descriptiva Solución adoptada

12

Figura 2. Diagrama de bloques del PIC 16F876

Page 19: Manual

Memoria descriptiva Prácticas con microcontroladores

13

2.3. Prácticas con microcontroladores 2.3.1. Consideraciones previas En los siguientes apartados vamos a explicar los diferentes dispositivos que necesitamos para poder realizar las prácticas. El teclado, la pantalla de LCD, el kit MPLAB-ICD y una pequeña descripción del funcionamiento del MPLAB. 2.3.2. Descripción del MPLAB 2.3.2.1. Introducción programa En este apartado explicamos el programa que tienen que utilizar los alumnos para programar y realizar las pruebas sobre el µC.

Hay varios programas en la página de microchip, la relación de estos es:

Development Tools Simulator Part Number Linker Library

Integrated Development Environment

Free Download Available

Demo Download Available

Compiler Assembler

MPLAB® IDE v6.60

Yes SW007002 Yes Yes Yes Yes No No Yes

Motor Control Graphical User Interface (MC-

GUI)

MPLAB C18 Yes SW006011 Yes Yes No No Yes Yes Yes

Application Maestro Software

No Yes Yes

MPLAB C30 Yes SW006012 Yes Yes No Yes Yes Yes Yes

MPLAB Visual Device

Initializer

MPLAB C17 Yes SW006010 Yes Yes No No Yes Yes Yes

FilterLab filter design software No No No No Yes No No No

Como se puede comprobar, el programa que vamos a utilizar es el MPLAB© IDE ya que es el único con el cual podemos utilizar el kit MPLAB-ICD. La única diferencia es que utilizaremos una versión más antigua, la del MPLAB v4.1 que es la que está instalada en los ordenadores de los laboratorios de la universidad.

Figura 3. Relación de programas

Page 20: Manual

Memoria descriptiva Prácticas con microcontroladores

14

2.3.2.2. Funcionamiento del MPLAB IDE Al ejecutar el programa saldrá la siguiente pantalla del MPLAB:

En la cual se puede ver las diferentes barras de elementos y los diferentes menús. Esto es como se abriría en el caso de que no se hubiese trabajado anteriormente con él, si no preguntará si abre los archivos y el proyecto último con el que se estaba trabajando antes de cerrar por última vez. A nosotros nos interesa como crear un nuevo proyecto. Los pasos a seguir serian ir al menú ‘PROJECT’ y crear un nuevo proyecto.

Figura 4. Pantalla MPLAB

Figura 5. Menú “New Project”

Page 21: Manual

Memoria descriptiva Prácticas con microcontroladores

15

Una vez dado el nombre se abrirá la ventana ‘EDIT project’ donde tenemos que asignar un nodo al proyecto que será el archivo .ASM en donde está código del programa a funcionar.

Por último tenemos que seleccionar el procesador que queremos utilizar e ir a ‘DEVELOPMENT MODE’ en donde tenemos que asignar si queremos trabajar como simulador, que sería simplemente para que funcione el código en el PC simulando el ordenador al µC, o utilizar el ‘MPLAB-ICD Debugger’ que para ello tenemos que tener el kit MPLAB-ICD.

Figura 6. Ventana “Edit project”

Figura 7. Ventana de “Development Mode”

Page 22: Manual

Memoria descriptiva Prácticas con microcontroladores

16

Una vez terminada la creación del proyecto y terminado el código del programa que queremos probar tenemos que dar al botón de linkiar el programa para crear el archivo que se tiene que guardar en la memoria de programa del micro.

Para ver la memoria de la EEPROM, que lo necesitaremos cuando trabajemos con ella, se tendría que seleccionar en el menú de ‘Windows->EEPROM’ con lo cual se nos abriría una ventana donde saldrían los valores de la EEPROM. 2.3.3. Explicación del Kit MPLAB-ICD.

2.3.3.1. Introducción

Este kit es el sistema a través del cual comunicamos el PC con el µC, a través de él

conseguimos poder utilizar todas las funciones del MPLAB. La finalidad de este kit es poder programar un PIC y poder ejecutar el código paso a

paso para probar el funcionamiento del código volcado en el µC. Esto es ideal para realizar nuevos códigos que están en un proyecto de una fábrica en el laboratorio de I+D por ejemplo, o como en nuestro caso, para los laboratorios de clase, ya que el alumno tiene que programar una y otra vez el código hasta que funcione.

Esta opción de programar a los µC es la ideal por si tienes que reprogramar una y otra vez el µC debido a que tengas que corregir el código debido a que el micro tiene memoria FLASH.

Para ver toda la

memoria RAM

Ejecutar el programa

Ejecutar paso a paso

Para ver el programa

grabado en la ROM del

µC

Para ver los registros

especiales del µC

Linkar el programa para ver si hay errores

Figura 8. Barra de herramientas MPLAB

Page 23: Manual

Memoria descriptiva Prácticas con microcontroladores

17

Para programar el µC una vez el código está correcto se hace de diferentes formas. Si es una fábrica y tiene que fabricar muchos, los fabrica con el código ya programado con memoria ROM. Si es un usuario que a lo mejor programa algunos para uso personal lo hace mediante un programador del tipo T-20, que resulta mucho más económico. 2.3.3.2. Características del MPLAB-ICD Module

Este kit está compuesto de dos partes, una que es el ICD module y la otra es el ICD Header. El esquema del ICD module es:

Esta parte se encarga de comunicarse a través del puerto serie ‘J2’ con el PC y a través del conector ‘J3’ con el MPLAB Header. 2.3.3.3. Características del MPLAB-ICD Header

El MPLAB Header sirve para poder conectarlo a un dispositivo de DIP-28 como es el

18F876, o como para un dispositivo DIP-40 como el 18F877. Un esquema de la placa base sería el siguiente:

Figura 9. MPLAB ICD Module

Page 24: Manual

Memoria descriptiva Prácticas con microcontroladores

18

2.3.4. Placa base del laboratorio 2.3.4.1.Explicación placa base del laboratorio

La placa base de la que vamos a hablar ahora es de la que se dipone en laboratorio de prácticas de la asignatura de “Sistemas electrónicos con miro controladores”. Dicha placa está compuesta por un regulador de tensión a 5V, Un conector para una pantalla de LCD y un conector para un teclado. Que serán explicados en lo siguientes apartados.

2.3.5. Regulador de tensión

Este regulador se coloca en las placas donde tenemos el µC para alimentarlo, con el regulamos la tensión de alimentación al valor que necesitamos (5V), de tal forma que nos permite tener una tensión estable para el mejor funcionamiento de nuestro sistema y nos permite que la fuente de alimentación de la placa pueda variar entre 8 y 15V aproximadamente.

Figura 10. MPLAB ICD Header

Page 25: Manual

Memoria descriptiva Prácticas con microcontroladores

19

2.3.6. Descripción Pantalla LCD 2.3.6.1. Introducción Un microcontrolador necesita dispositivos para poder comunicarse con el exterior, de la misma forma que un ordenador necesita un teclado y una pantalla, al µControlador le vamos a suministrar los teclados de 16 teclas y una pantalla LCD alfanumérica. La mayoría de los LCD’s están basados en el microcontrolador HITACHI 44780 u otro similar, con lo cual la mayoría de estos se programan de forma similar. El tamaño de los caracteres que se muestran son de 5x7 o 5x10 pixels. Todos ellos tienen como método para escribir los datos a través de un bus de 8 bits que se conecta al µC/µP aunque también permiten la conexión a través de 4 bits, simplemente lo que hacen es dividir los datos a enviar en dos bloques para enviar los datos.

Hay pantallas de muchos tipos. La forma más fácil de clasificarlas es por el número de

caracteres y por el número de líneas (caracteres x línea) que se pueden introducir. Existen los siguientes tipos:

• 8x2 • 16x1, 16x2, 16x3 y 16x4 • 20x2 y 20x4 • 24x2 • 40x2 y 40x4

2.3.6.2. Que pantalla LCD vamos a utilizar Para estas prácticas vamos a utilizar las pantallas ya existentes en el laboratorio de prácticas para abaratar los costes. Son pantallas de 16x2 con retro-alimentación con 16 pines de conexión con el µC. 2.3.6.3. Funcionamiento de la pantalla LCD

La configuración de los pins de la pantalla de LCD que vamos a utilizar en las prácticas es la siguiente:

Asignación de los pines del JM162A #PIN Nombre Función 1 Vss Masa (0V) 2 Vdd Alimentación (+5V) 3 Vee Contraste (Vss=Vee=Vdd) 4 RS Selección de modo (dato=1/comando=0) 5 R/W Lectura/escritura de comando (lectura=1/ecritura=0) 6 E Enable ( Validación DB<7:0> en flanco 1? 0) 7 DB0 Bit 0 (LSB) de dato 8 DB1 Bit 1 de dato 9 DB2 Bit 2 de dato

Page 26: Manual

Memoria descriptiva Prácticas con microcontroladores

20

10 DB3 Bit 3 de dato 11 DB4 Bit 4 de dato 12 DB5 Bit 5 de dato 13 DB6 Bit 6 de dato 14 DB7 Bit 7 (MSB) de dato 15 A Anodo (+) retro-iluminación 16 K Cátodo (-) retro-iluminación

Tabla 1. Asignación de los pins del JM162A

De todos estos pins solamente se van a utilizar 6 de ellos que son los de DB<7:4> para

la comunicación con el µC, no utilizamos los 8 pins para ahorrar salidas en el µC. El inconveniente es que se tarda algo más en enviar los datos ya que hay que escribir dos veces en el bus pero la pérdida de tiempo es tan pequeña que nos sale a cuenta reducir el número de salidas del µC. Los otros dos pins que vamos a utilizar van a ser el RS y RW Estas pantallas tienen un juego de instrucciones con las cuales podemos ir escribiendo los datos en la pantalla, los caracteres que queremos escribir es poniendo el código ASCII en hexadecimal de la letra que queremos poner en el bus de datos, de tal forma que para escribir una ‘A’ habría que escribir ‘40’H. El juego de instrucciones de estos teclados es el siguiente:

CODIGO INSTRUCCIÓN

INSTRUCCIÓN RS RW

DB 7

DB 6

DB 5

DB 4

DB 3

DB 2

DB 1

DB 0

DESCRIPCIÓN

Tiempo Ejecución

(fosc = 270KHz)

Clear Display 0 0 0 0 0 0 0 0 0 1 Escribe ‘20’H en DDRAM y coloca

DDRAM addrees en ‘00H’ de AC 1.53ms

Return Home 0 0 0 0 0 0 0 0 1 X

Coloca ‘00H’ en DDRAM addrees y vuelve el cursor a la posición original

1.53ms

Entry mode Set 0 0 0 0 0 0 0 1 I/

D SH

Asigna el movimiento el cursor y si queremos que el cursor se vea o no 39µs

Display ON/OFF control 0 0 0 0 0 0 1 D C B

Set Display (D), cursor (C), y parpadeo del cursor (B) on/off bit de control

39µs

Cursor or Display Shift 0 0 0 0 0 1 S/

C R/L X X

Set cursor moving and display shift bit de control y la dirección, sin cambiar la DDRAM data.

39µs

Function Set 0 0 0 0 1 D

L N F X X

Asignar la interface de longitud de datos (DL:4-bit/8-bit), números de líneas del display (N:1-línea/2-líneas, Display tipo de fuente(F:0...)

39µs

Set CGRAM Addrees 0 0 0 1

AC5

AC4

AC3

AC2

AC1

AC0

Colocar CGRAM addrees en el contador de dirección

39µs

Set DDRAM Addrees 0 0 1 A

CAC

AC

AC

AC

AC

AC

Set DDRAM addrees en el contador de dirección 39µs

Page 27: Manual

Memoria descriptiva Prácticas con microcontroladores

21

6 5 4 3 2 1 0

Read Busy Flag and Addrees

0 1 BF

AC6

AC5

AC4

AC3

AC2

AC1

AC0

Whether during internal operation or not can be known by reading BF. The contents of addrees counter can also be read

0µs

Write Data To RAM 1 0 D

7 D6

D5

D4

D3

D2

D1

D0

Escribir dato en la RAM (DDRAM/CGRAM) 43µs

Read Data From RAM 1 1 D

7 D6

D5

D4

D3

D2

D1

D0

Leer dato de la RAM (DDRAM/CGRAM) 43µs

Tabla 2. Juego instrucciones de la pantalla LCD

2.3.7. Descripción del teclado 2.3.7.1. Introducción El teclado puede ser de dos tipos, 3x4 o 4x4. Aunque nosotros con el de 3x4 para los teclados del módulo 1 teníamos bastante, escogemos el teclado de 4x4 ya que es del que se dispone en el laboratorio y por lo tanto no tendríamos que comprar ningún otro teclado. 2.3.7.2. Funcionamiento del teclado

El teclado servirá para comunicarnos con el µC. La disposición de las teclas en el teclado es la siguiente:

1 2 3 F

4 5 6 E

7 8 9 D

A 0 B C

En nuetro sistema hay tres teclados y la configuración de las teclas varia dependiendo de la utilidad del teclado. La configuración de dichos teclados no influye en el funcionamiento del teclado, ya que el µC leerá que hay una tecla pulsada y dependiendo del teclado que sea hará una cosa u otra. Todo esto se hace por software.

Figura 11. Disposición teclas

Page 28: Manual

Memoria descriptiva Prácticas con microcontroladores

22

La configuración de los diferentes teclados es:

• Teclado del monedero

5 CENT 10 CENT 20 CENT CANCELAR

50 CENT 1 EURO 2 EURO

• Teclado del producto modulo 1

1 2 3

4 5 6

7 8 9

ACEPTAR 0 CANCELAR

• Teclado del producto módulo 2

1 2 3

4 5 6 ENVIAR

7 8 9 RESETEAR

ACEPTAR 0 CANCELAR

Figura 12. Teclado monedero

Figura 13. Teclado producto módulo 1

Figura 14. Teclado producto módulo 2

Page 29: Manual

Memoria descriptiva Prácticas con microcontroladores

23

El esquema eléctrico de estos teclados sería:

Con lo cuál, al pulsar una tecla cerramos el interruptor y comunicamos la fila con la

columna, con lo cual dando la fila como entrada y la columna como salida, o viceversa, al poner un nivel ( ’0’ o ‘1’) la salida si se pulsa la tecla tendríamos que leer el mismo nivel en la salida.

B C0A

7 8 9 D

4 5 6 E

1 2 3 F

4x200O Figura 15. Esquema eléctrico del teclado

Page 30: Manual

Memoria descriptiva Descripción funcional de nuestro sistema

24

2.4. Descripción funcional de nuestro sistema

Una vez vista la descripción de los elementos que se usan para esta práctica, veremos el funcionamiento general de todo el sistema dando sentido a todos los elementos que componen los módulos.

2.4.1. Visión General El objetivo de este grupo de prácticas es simular una máquina de vending, como ya se había mencionado anteriormente. El conjunto de entradas y salidas que componen el sistema son:

• 3 teclados. • 2 pantallas LCD • Circuito LED’s de cambio • 3 pulsadores. 1 para el cambio y 2 para producto. • Display de 7 segmentos • Comunicación por USART entre los dos módulos

PRACTICA 3PEDIR

PRODUCTO

MODULO 1

PRACTICA 1TECLADO

PRACTICA 4DAR CAMBIO

PRACTICA 5COMUNICACIÓN

USART

PRACTICA 2CAMBIAR

PRECIO

MODULO 2

PRACTICA 6COMUNICACIÓN

USART

TECLADOPRODUCTO

TECLADOMONEDERO

PANTALLALCD

TECLADOPRODUCTO

PANTALLALCD

LED’sCAMBIO

PULSADORCAMBIO

PULSADORPRODUCTO

PULSADORPRODUCTO

LED DARPRODUCTO

DISPLAYLED DAR

PRODUCTO

Figura 16. Diagrama de bloques de entradas y salidas

Page 31: Manual

Memoria descriptiva Descripción funcional de nuestro sistema

25

Como se puede ver en el diagrama de bloque de entrada y salida el módulo 1 se encarga de todo lo que es el control del dinero, ya que tiene las entradas y las salidas de las monedas y se encarga de la selección del producto. Hay un pulsador de producto y el LED de entregar el producto que se sería lo que faltaría para poder entregar los productos. Esta entrada y salida se ha puesto para poder realizar una de las prácticas que componen el código de este módulo. Con este módulo podemos simular el monedero de la máquina para la entrada y salida del dinero a introducir, revisar y controlar si se ha pagado el producto y dar el cambio si se da el caso. El módulo 2 se hizo para crear alguna práctica para usar la USART del µC. Lo que se a hecho con el módulo 2 es un sistema para poder cambiar los precios de los productos en simulación como si fuese un pequeño aparato en el que se graban los precios y que se conectase a la máquina de vending y le transfiriese todos los precios de lo productos. Al mismo tiempo ya que teníamos creado el módulo, lo hemos aprovechado para que hiciese el control de productos debido a que el PIC del módulo 1 estaba saturado y pensando en posteriores ampliaciones del sistema. La comunicación entre los dos módulos para el control de productos se hará también por USART. Con lo cual la comunicación por USART servirá para el producto y para modificar el precio del producto. Para la comunicación con la USART lo suyo sería con un sistema RS232 utilizando el chip MAX232 y un conector del tipo serie. Pero para nuestro sistema hemos pensado conectar cruzados los pins RX y TX de los dos micros ya que con ello ahorramos dispositivos y lo único que perdemos es calidad de transmisión, cosa que para las prácticas no es imprescindible. 2.4.2. Funcionamiento 2.4.2.1. Funcionamiento general El funcionamiento de esta simulación de máquina de vending, es parecido a cualquier máquina de vending de las que existen en la calle. El sistema está esperando a que se introduzca una moneda o que se seleccione un producto. Una vez que se selecciona un producto se revisa si hay suficiente dinero para pagarlo y se revisa si hay producto para ver si se ha agotado, en el caso de que todo vaya bien, pasaría a calcular el cambio, a dar el cambio y a entregar el producto. En el caso de haber algún error durante el proceso de elegir un producto saldrá un error por la pantalla y se cancelará el proceso. El módulo 2 se encarga de modificar los precios de la máquina primero guardando los datos en este módulo y por último transmitiendo todos los precios. En este módulo al mismo tiempo que se modifican los precios también se hace el control sobre los productos, de tal forma que cuando se tiene que pedir un producto o dar un producto se envía una señal a este modulo y este tiene guíe responder dependiendo de si hay producto o no.

Page 32: Manual

Memoria descriptiva Descripción funcional de nuestro sistema

26

2.4.2.2. Funcionamiento Módulo 1 El módulo 1 está compuesto por los siguientes elementos de entrada o salida:

• El teclado que simula el monedero • El teclado para introducir el número del producto • La pantalla LCD • El sistema de LED’s para devolver las monedas • El LED de entregar producto • El interruptor de ‘Cambio’ • El interruptor de ‘Producto’ • El conector para la comunicación con el módulo 2

Este módulo como hemos dicho anteriormente se encarga de la selección del producto y de simular el monedero. Para ello disponemos de los dos teclados que mientras no esté realizando otra operación estará mirando si se ha pulsado una de las teclas de cualquiera de los dos teclados.

Si se pulsa una tecla del teclado del monedero, el µC deberá mirar que tecla ha sido la

pulsada y actuar en consecuencia. Si es la tecla de una moneda deberá incrementar la cantidad de dinero que ha sido pagada y mostrarla por la pantalla del LCD y si se pulsa la tecla de cancelar se tendrá que devolver el dinero que haya sido introducido hasta ese momento.

Si la tecla pulsada es del teclado producto deberá revisar si es un número o la tecla

‘aceptar’ o ‘cancelar’. Si es un número deberá procesar la tecla para conseguir el número del producto que el usuario quiere pedir, una vez seleccionado un producto saldrá el precio por la pantalla del LCD, dicho precio está en la EEPROM del µC y el micro esperará a que se pulse la tecla ‘Aceptar’ o ‘Cancelar’ para seguir el proceso.

Si es la tecla ‘Cancelar’ sirve para que el usuario cancele el proceso de la selección.

Esto puede servir por si el usuario se equivoca al seleccionar el producto o ve que la cantidad a pagar es mayor de la que ha introducido.

En el caso de que sea la tecla ‘Aceptar’ solamente la procesará cuando ya se haya

seleccionado el producto, ya que en cualquier otro caso no haría nada y esperaría otra tecla. Cuando se haya pulsado y el producto ya se haya seleccionado, lo primero que debe hacer el módulo es revisar si se ha pagado el producto seleccionado y después revisar si hay producto, es decir, que no se ha agotado. En este caso lo haremos a través de la comunicación USART que se le preguntará al otro módulo si existe el producto., también hay otra forma que se explicará al final.

Si recibimos respuesta positiva del otro módulo conforme que hay producto, continuaría el proceso calculando el cambio a dar y en el caso de que hubiese que dar cambio se revisaría si existe cambio. Para ello miraría el interruptor de ‘CAMBIO’, que dependiendo de su estado nos diría si hay cambio o no. Este sistema es una forma fácil de controlar si hay cambio o no y se pensó pensando en algún dispositivo que calcula las monedas que quedan o

Page 33: Manual

Memoria descriptiva Descripción funcional de nuestro sistema

27

de alguna otra forma y que al final lo que hace es mandar una señal de aviso conforme no hay cambio, que sería el interruptor que hemos puesto. Esta parte que revisa las monedas que hay para cambio o el sistema que sea podría realizarse en una próxima revisión del proyecto.

Si hubiese que dar el cambio utilizaría el sistema que he diseñado para entregar las

monedas, que es un decodificador de 3 bits con LED’s, en el cual cada LED representa una de las monedas a entregar. El micro debería calcular las monedas a devolver una a una e ir entregándolas.

Por último debería entregar el producto que como en caso de preguntar si había

producto existen dos posibilidades, nosotros escogemos el pedir el producto al módulo 2 mediante la comunicación USART. La otra posibilidad se explicará al final junto con la posibilidad de pedir producto.

Una vez pedido el producto, el µC se inicializará y se quedará esperando a que se pulse

una nueva tecla. Al igual que este módulo pregunta si hay producto o da el producto comunicándose

con el otro módulo, el otro módulo puede modificar los precios de este. Lo que hace es volcar la EEPROM del módulo 2 en este módulo, con lo cual cuando recibamos una interrupción por recepción de datos, hay que revisar si es para modificar la EEPROM y en el caso de que así sea, parar el proceso de dar el producto y no permitir que nadie pueda entrar monedas ni seleccionar producto mientras se modifican los precios de la EEPROM.

En el caso de que durante el proceso de entregar el producto hubiese algún tipo de

problema del tipo que no existiese el producto seleccionado, no se hubiese pagado, no hubiese producto o no hubiese cambio, el µC saca un mensaje por la pantalla de LCD diciendo el tipo de error, se cancelaría el proceso, se inicializarían los registros y se quedaría esperando a que se pulsase una tecla.

Por último, vamos a explicar la otra opción que hay para preguntar si hay precio y para

dar producto. Para preguntar si hay precio se podría hacer revisando el estado del interruptor de producto. Este interruptor esta aquí debido a que en una de las prácticas no se utiliza la transmisión y lo hace de esta forma para saber si hay producto. Para dar el producto hay un LED que podemos encender cuando demos el producto. Este LED está aquí por si realizamos la práctica 4 en la que no usamos comunicación con el otro módulo como pasaba en el caso del interruptor del producto.

2.4.2.3. Funcionamiento Módulo 2 El módulo 2 está compuesto por los siguientes elementos de entrada o salida:

• El teclado para introducir el número del producto • La pantalla LCD • El sistema del DISPLAY para ver el número del producto que piden • El LED de entregar producto

Page 34: Manual

Memoria descriptiva Descripción funcional de nuestro sistema

28

• El interruptor de ‘Producto’ • El conector para la comunicación con el módulo 1

Este módulo, como ya se ha dicho, se encarga de gestionar los productos y de guardar los precios para después enviar los precios al módulo 1 y modificarlos.

El funcionamiento de este módulo es que una vez inicializado se pone a testear el teclado de producto a la espera de que se pulse una tecla o de que se active la interrupción por recepción de datos.

Si se pulsa una tecla del teclado el µC deberá mirar que tecla ha sido la pulsada y

actuar en consecuencia. Si se pulsa la tecla RESETEAR el programa nos debería pedir la confirmación para borrar todos los precios que están almacenados en la EEPROM.

La tecla ‘CANCELAR’ sirve para parar el proceso de la modificación de precio y para

la confirmación de borrar la memoria. La tecla ‘ACEPTAR’ sirve para confirmar el cambio de precio, confirmar el borrar la memoria y para comenzar la comunicación con el módulo 1 para cambiar los precios.

La tecla ‘ENVIAR’ sirve para enviar los precios guardados en la EEPROM al módulo

1 de tal forma que cuando se pulsa nos pide la confirmación y comienza a enviar los datos. Las teclas numéricas son para seleccionar el producto al que queremos modificar el

precio y para insertar el nuevo precio. Para modificar un precio, primero hay que seleccionar el producto y una vez que se ha

seleccionado nos presentará por la pantalla LCD el precio actual que tiene el producto y se queda a la espera de introducir el nuevo precio. Una vez insertado el nuevo precio se debería confirmar y entonces modificar de la EEPROM el precio del producto.

Para ver el precio de un producto se puede utilizar el mismo método que el de cambiar

el precio, con la diferencia de que una vez seleccionado el producto y salido el precio, cuando nos pida el precio nuevo debemos cancelar el proceso con lo cual no se modifica dicho precio.

Para enviar los precios al módulo 1 hay que pulsar la tecla ‘ENVIAR’. Entonces nos

pediría la confirmación para enviar los datos. Una vez confirmada la operación comenzaría el proceso de comunicación.

En cualquier momento se puede recibir una interrupción por la recepción de datos

debido a que el otro módulo puede peguntar si hay un producto o dar la orden de dar un producto.

En el caso de recibir la pregunta sobre si hay un producto lo que tiene que hacer el µC

es parar el proceso de cambiar un precio y no permitir que se pueda introducir ninguna tecla por el teclado. Después debería enseñar el número del producto por el display y revisar si hay

Page 35: Manual

Memoria descriptiva Descripción funcional de nuestro sistema

29

producto, lo cual se hace mirando el estado del interruptor del producto. Por último respondería al módulo 1 diciendo si hay o no producto.

En el caso de recibir la orden de dar el producto tendría que poner el número del

producto en el display como antes y entonces encender el LED de dar producto. En posteriores revisiones del proyecto estas salidas pueden servir perfectamente para

montar algún tipo de dispositivo, como una serie de multiplexadores, de tal forma que en vez de leer el interruptor o encender el LED se puedan leer diferentes sensores o algo parecido.

Page 36: Manual

Memoria descriptiva Descripción circuital

30

2.5. Descripción circuital 2.5.1. Introducción En este apartado se explican los eslementos electtricos y los conectores que están en los modulos en el siguiente diagrama de bloques veremeos los diferentes sistemas que vamos a utilizar:

M Ó D U L O 1

R E G U L A D O R D E

TENSIÓN

PIC 16f876

C O N E C T O R P A N T A L L A L C D

C O N E C T O RT E C L A D OM O N E D A S

C O N E C T O R T E C L A D O

P R O D U C T O

D E C O D I F I C A D O R74LS138

MÓDULO 2

REGULADOR DE

TENSIÓN

PIC 16f876

CONECTOR PANTALLA LCD

CONECTORTECLADO

PRODUCTO

DECODIFICADORDE BCD

A 7 SEGMENTOS7447

Y DIPLAY

A contiuaciuón se explican todos los bloques de cada módulo.

Figura 17. Diagrama bloques esquema eléctrico Módulo 1

Figura 18. Diagrama bloques esquema eléctrico Módulo 2

Page 37: Manual

Memoria descriptiva Descripción circuital

31

2.5.2. Circuito regulador de tensión

El circuito regulador de tensión va en lo dos módulos. Este circuito sirve, como bien dice el nombre, para regular la tensión de entrada a 5V para alimentar el PIC y los diferentes componentes de los módulos. El sentido de este circuito es para regular y mantener constante la tensión de 5V independientemente de las variaciones que tengamos en la entrada del circuito, siempre que estén entre un margen de 8 a 15V aproximadamente. El LED que está puesto a la salida del regulador LM7805 es simplemente para ver que el circuito está conectado Este circuito está compuesto por:

• 2 condensadores de poliéster 100nF • 1 condensador electrolítico 47µF • 1 resistencia de 1kΩ • 1 regulador de tensión LM7805 • 1 conector de 2 pins para conectar la placa a la fuente de alimentación • 1 LED rojo de 5mm

Vreg

U1LM7805CT

IN OUT

R11.0kohmC3

100nFC147uF

C2100nF

J1

HDR1X2

LED_red

LED1

2.5.2. El microcontrolador Recordemos las principales características de un microcontrolador. Un µC está formado principalmente por:

• CPU (Unidad Central de Proceso), que es el microprocesador del sistema. • Memoria de programa, que puede ser:

o ROM: Dispositivo grabado en fábrica o EPROM: Dispositivo grabable y borrable (Mediante UV) o EEPROM Dispositivo regrabable in-system con VPP = 12 v o FLASH: Dispositivo regrabable in-system

• Memoria volátil de datos: o RAM: Almacenamiento de variables del programa

Figura 19. Regulador de tensión 5V

Page 38: Manual

Memoria descriptiva Descripción circuital

32

o SFR: Special Function Registers, usados para controlar los periféricos, configuraciones, interrupciones,...

• Memoria no volátil de datos: o EEPROM o FLASH

• Puertos de Entrada / Salida • Timers

El PIC que hemos elegido para montar nuestro circuito es el PIC 16F876 y consta de: • Arquitectura Harvard (Memoria de datos y programa separados) • Memoria de datos de 8 bit • Memoria de programa de 14 bit • Líneas E/S de alta corriente • Memoria RAM de 368 Bytes • Memoria de datos EEPROM de 256 Bytes • Memoria FLASH de programa de 14336 Bytes (14bit*8192 word) • 3 Puertos de Entrada / salida (1 de 6 bits, 2 de 8 bits) • WatchDog (Temporizador especial que hace un reset periódicamente) • 1 Timer de 16 bit • 2 Timer de 8 bit • 5 conversores A/D de 10 bits • 1 Puerto Serie por comunicación asíncrona full-duplex • Posibilidad de interrupción por el Puerto Serie

Seguidamente, vemos el esquema del patillaje del PIC 16F876

Funciones de cada uno de los pins del PIC 16F876

Figura 20. Esquema patillaje del PIC 16F876

Page 39: Manual

Memoria descriptiva Descripción circuital

33

Nombre del Pin Nº

de Pin

Tipo E(4) /S(5)

/P(6)

Tipo de Buffer

Descripción

OSC1/CLKIN 9 E ST/CMOS(3) Entrada oscilador de cristal/Entrada de reloj externo

OSC2/CLKOUT 10 S - Salida oscilador de cristal. En modo RC, el pin OSC2 es la salida CLKOUT, el cual tiene una ¼ de la frecuencia de OS1 y denota el tiempo de ciclo de instrucción

MCLR*/Vpp 1 E/P ST(7) Entrada Master Clear (Reset) o entrada de tensión y programación. Este pin es un RESET del dispositivo activo por nivel bajo

RA0/AN0 RA1/AN1 RA2/AN2/Vref- RA3/AN3/Vref+ RA4/T0CKI RA5/SS*/AN4

2 3 4

5

6

7

E/S E/S E/S

E/S

E/S

E/S

TTL(8)

TTL

TTL

TTL

ST

TTL

PORTA es un Puerto de E/S bidireccional RA0 puede también ser la entrada analógica 0 RA1 puede también ser la entrada analógica 1 RA2 puede también ser la entrada analógica 2 o el nodo negativo de la referencia de tensión analógica RA3 puede también ser la entrada analógica 3 o el nodo positivo de la referencia de tensión analógica RA4 puede también ser la entrada de reloj del Timer 0. La salida es del tipo colector abierto. RA5 puede también ser la entrada analógica 5 o el selector de esclavo para puerto serie asíncrono

PORTB es un puerto de E/S bidireccional. Puede ser programado por software para habilitar pull-ups internos en todas las entradas

RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD

21 22 23 24 25 26 27 28

E/S E/S E/S E/S E/S E/S E/S E/S

TTL/ST(1) TTL TTL TTL TTL TTL TTL/ST(2) TTL/ST(2)

RB0 puede también ser el pin de interrupción externo RB3 puede ser la entrada de baja tensión de programación Pin de interrupción en cambio de estado Pin de interrupción en cambio de estado Pin de interrupción en cambio de estado o pin para programación In-Circuit_Debugger. Reloj de programación serie. Pin de interrupción en cambio de estado o pin para la programación In-CircuitDebugger. Datos en la programación serie.

RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO

11

12

13

14

15

16

E/S

E/S

E/S

E/S

E/S

E/S

ST

ST

ST

ST

ST

ST

PORTA en un Puerto E/S bidireccional RC0 puede también ser la salida de oscilador del Timer 1 o la entrada de reloj el Timer 1 RC1 puede también ser la entrada del oscilador del Timer 1 o la entrada de Captura2/salida de Captura2/salida PWM2 RC2 puede también ser la entrada de Captura1/salida de Captura1/salida PWM1 RC3 puede también ser la entrada de reloj del puerto serie asíncrono para modos SPI y IIC. RC4 puede también ser la entrada de datos SPI (modo SPI) o el E/S de datos en el modo IIC RC5 puede también ser la salida de datos SPI (modo SPI)

Page 40: Manual

Memoria descriptiva Descripción circuital

34

RC6/TX/CK RC7/RX/DT

17

18

E/S

E/S

ST

ST

RC6 puede también ser el pin de transmisión en USART o el reloj asíncrono RC7 puede también ser el pin de recepción en USART o los datos en modo asíncrono

Vss 8,19 P - Referencia de tierra

Vdd 20 P - Entrada de tensión positiva

(1) Este buffer es una entrada Schmitt Trigger cuando la configuramos como interrupción externa (2) Este buffer es una entrada Schmitt Trigger cuando la usamos en modo de programación Serie (3) Este buffer es una entrada Schmitt Trigger cuando la configuramos en modo oscilador RC y como

entrada CMOS (4) E = Entrada (5) S = Salida (6) P = Power (7) ST = Entrada Schmitt Trigger (8) TTL = Entrada TTL

2.5.3. Decodificador 74LS138 Para devolver el cambio o la cantidad de dinero pagada, he pensado en un sistema en el módulo 1 que tiene que dar una señal para cada una de las diferentes monedas que tenemos que devolver. Las monedas para dar el cambio serán 5 (5, 10, 20 y 50 céntimos y la de 1 €)

Para no utilizar 5 salidas del µC utilizaremos una codificación para estas monedas, con lo cual con tres salidas RA<2:0> sería suficiente y a posterior utilizaremos el 74LS138 para decodificarlas. Las salidas del 74138 atacarán a unos LEDS que corresponden a la moneda a entregar.

A continuación ponemos la codificación que he empleado para las monedas

RA0-RA2 MONEDA

(0,0,0) NO CONECTADO

(0,0,1) 5 CENTIMOS (0,1,0) 10 CENTIMOS (0,1,1) 20 CENTIMOS (1,0,0) 50 CENTIMOS (1,0,1) 1 EURO

(1,1,0) NO CONECTADO

(1,1,1) NO CONECTADO

Tabla 3. Funciones de los pins en el PIC 16 F876

Tabla 4. Codificación monedas

Page 41: Manual

Memoria descriptiva Descripción circuital

35

La tabla de la verdad del 74138 es:

El circuito está compuesto por:

• Decodificador/demultiplexor de 3 a 8 líneas 74138 • 5 LEDS verdes de 5mm • Resistencia SIP 1x8 de 1KΩ

El esquema eléctrico del circuito es:

Y015

Y114

Y213

Y312

Y411

Y510

Y69

Y77

A1

B2

C3

G16

~G2A4

~G2B5

U1

74LS138N

RA0

RA1

RA3

5V

LED_green5 centimos

LED_green10 centimos

LED_green20 centimos

LED_green50 centimos

LED_green1 euro

R1

4.7kOhm

23

45

1

67

89

5VVDD

Tabla 5. Tabla de la verdad del 74138

Figura 21. Esquema eléctrico del circuito

Page 42: Manual

Memoria descriptiva Descripción circuital

36

2.5.4. Decodificador de BCD a 7 segmentos 7447 y display Esto se encuentra en el módulo 2. Su función es que cuando recibe el módulo 2 la

orden de dar el producto o cuando pregunta por algún producto, aparte de realizar otras operaciones debe mostrar por los diplays el número del producto sobre el que pregunta o da.

La tabla de la verdad del 7447 es:

Figura 22. Conexiones y esquema display

Tabla 6. Tabla de la verdad del 7447

Page 43: Manual

Memoria descriptiva Descripción circuital

37

El circuito del 7447 y del display esta compuesto por:

• 14 Resistencias de 1kΩ • 2 chips decodificadores de BCD a 7 segmentos 7447 • 2 Displays SA-0511

El esquema del circuito es:

U1

SEVEN_SEG_DISPLAY

ABCDEFG

U2

SEVEN_SEG_DISPLAY

ABCDEFG

R1

1.0kohmR2

1.0kohmR3

1.0kohmR4

1.0kohmR5

1.0kohmR6

1.0kohmR7

1.0kohm

R8

1.0kohmR9

1.0kohmR10

1.0kohmR11

1.0kohmR12

1.0kohmR13

1.0kohmR14

1.0kohm

7126

1310915 111214

354

ABCDLT

RB

IB

I/RB

O OA

OB

OC

OD

OE

OF

OG

74LS47NU3

7126

1310915 111214

354

ABCDLT

RB

IB

I/RB

O OA

OB

OC

OD

OE

OF

OG

74LS47NU4

RA3RA45V

VDD

5VVDD

RB2

RB3

RB1

RB0

Figura 23. Esquema del circuito

Page 44: Manual

Memoria descriptiva Descripción circuital

38

2.5.5. El teclado El teclado es el elemento con el cual entramos datos en el µC como hemos dicho antes. Lo conectamos a través de un cable paralelo de 10 pins. Hay que tener en cuenta que hay tres teclados por la tanto las conexiones son diferentes para cada uno. Sabiendo que el esquema eléctrico del teclado es:

Vamos a explicar las conexiones de los conectores a los µC de los módulos. El teclado

del monedero tiene la siguiente configuración:

J1

HDR2X5

RA3

RC0

RC2

RA4

RC1

RC3

R110kohm

R210kohm

B C0A

7 8 9 D

4 5 6 E

1 2 3 F

4x200O

Figura 24. Esquema eléctrico del teclado

Figura 25. Configuración teclado monedero

Page 45: Manual

Memoria descriptiva Descripción circuital

39

El teclado de seleccionar producto del módulo 1:

J1

HDR2X5

RB0

RC0

RC2

RB1

RC1

RC3

R110kohm

R210kohm

RB2

R310kohm

El teclado de seleccionar producto del módulo 2:

J1

HDR2X5

RA0

RC0

RC2

RA1

RC1

RC3

R110kohm

R210kohm

RA2

R310kohm

RA3

R410kohm

Figura 26. Teclado selección producto módulo 1

Figura 27. Teclado selección producto módulo 2

Page 46: Manual

Memoria descriptiva Descripción circuital

40

Como se puede comprobar, los teclados de seleccionar producto de los módulos son prácticamente iguales. El del monedero es un poco diferente, ya que por estética hemos cambiado las filas por las columnas, cosa que a nivel de hardware no comporta ninguna dificultad pero a nivel de software hay que tenerlo en cuenta para poder leer correctamente las filas y las columnas. 2.5.6. Pantalla LCD Tanto aquí como en el apartado anterior, vamos a explicar las conexiones del µC con la pantalla del LCD. Para ello utilizamos un conector de 16 para cable paralelo. Las conexiones de la pantalla al conector son las siguientes:

Tenemos que utilizar dos pantallas de LCD, una para cada módulo. El

esquema de conexión del módulo 1 es:

J1

RIBBON_16H

VCC

RC0

RC2

RC1

RC3

RB3

RB4

Figura 28. Conexiones pantalla LCD al conector

Figura 29. Esquema conexión módulo 1

Page 47: Manual

Memoria descriptiva Descripción circuital

41

Y el del módulo 2 es:

J1

RIBBON_16H

VCC

RC0

RC2

RC1

RC3

RB4

RB5

Como se puede observar es muy parecido en los dos módulos. Lo que hay que tener en

cuenta es que como se puede comprobar, los pins DB<3:0> no se utilizan y esto ocurre porque en vez de enviar los datos en paquetes de 8 bits, los enviamos en paquetes de 4 bits, con lo cual se ahorra pins de salida del µC, aunque perdemos en tiempo de ejecución ya que hay que pasar dos veces los datos para poder enviarlos.

Figura 30. Esquema conexión módulo 2

Page 48: Manual

Memoria descriptiva Prácticas a realizar

42

2.6. Prácticas a realizar 2.6.1. Introducción En este apartado vamos a poner las prácticas que he diseñado para ser realizadas por los alumnos. Estas prácticas se han intentado que sean lo más independientes posible del resto, aunque si al final de las prácticas se intentan unir todas en una sola, hay que tener una serie de factores para poder unirlas. A continuación se exponen los enunciados de las prácticas realizadas. En ellas se pueden observar los siguientes apartados:

• Equipos y materiales: En este apartado se dicen los materiales necesarios para la práctica a realizar.

• Descripción del funcionamiento: Aquí vamos a dar un resumen de lo que tiene que hacer la práctica a realizar.

• Funcionamiento del teclado: Se hace una explicación de como va el teclado y la configuración del mismo.

• Funcionamiento del display: Se hace una breve explicación del funcionamiento de la pantalla deLCD.

• Bases teóricas: Una explicación más detallada de lo que tiene que hacer el programa. • Explicación del esquema eléctrico: Una breve explicación de cómo es el esquema

eléctrico. • Resumen de objetivos: Aquí se muestran los objetivos a realizar por el alumno en la

práctica. • Diagrama de flujo: Son los diagramas de flujo de un ejemplo de cómo podría

funcionar la práctica • Otros: En algunas practicas se ha añadido algún otro apartado para así poder explicar

algún tipo de componente que se utiliza en ella.

2.6.2. Enunciados de prácticas

Page 49: Manual

43

2.6.2.1. Práctica núm.1 Monedero

1.1 Equipos y materiales:

Para realizar la práctica utilizaremos: • Ordenador PC • Software MPLAB • Teclado de 16 teclas • Display SAMSUNG KS0070 • Cable plano de 16 • “ “ “ 10 • Cable comunicación puerto serie • Kit MPLAB-ICD debugger • PIC 16F876

1.2 Descripción del funcionamiento

En ésta práctica tenemos que programar el chip para simular un monedero de una

máquina de autoservicio. Para ello, el microcontrolador debe interpretar una serie de señales que vienen de un teclado que simulará el detector de monedas de la máquina autoservicio, para ver su funcionamiento leer el apartado 1.3.

Una vez se haya detectado una moneda, se debería incrementar el valor de dicha moneda en un registro que nos irá diciendo la cantidad de dinero que tenemos introducido. Este registro lo llamaremos ‘PAGADO’ y tendrá el formato que se explica en el apartado 1.5.

En éste teclado, además de las teclas que corresponden a las monedas a introducir,

también existirá una tecla que nos servirá para la devolución de la cantidad introducida, la cuál reseteará el registro ‘PAGADO’ (del que se ha hablado anteriormente) y procederá a la devolución del dinero.

Como en toda máquina, habrá una cantidad máxima de dinero para insertar. Ésta

cantidad dependerá del valor máximo de los precios que fijaremos o de las limitaciones de hardware o software que tengamos. Si superamos este valor máximo, nos deberá devolver la última moneda introducida y no incrementar el valor de lo que llevamos pagado. Para fijar dicho valor máximo leer el apartado 1.5.

Por último, dispondremos de un display para poder ver la cantidad de dinero que

llevamos introducido. Para ver el funcionamiento del display y el formato con el que tenemos que escribir los datos leer el apartado 1.4 y 1.5 respectivamente.

Page 50: Manual

44

1.3 Funcionamiento del teclado Para poder simular el detector de monedas, utilizaremos un teclado en el cual a cada

tecla se le asignará el valor de una moneda. Aparte, en el mismo teclado existirá una tecla que servirá para cancelar la cantidad de dinero que llevamos insertado en ese momento y proceder a su devolución. La disposición de las teclas podría ser la siguiente:

5

CÉNTIMOS 10

CÉNTIMOS 20

CÉNTIMOS CANCELAR

50 CÉNTIMOS 1 Euro 2 Euros E

7 8 9 D

A

0

B C

Tabla 1

El teclado consta de una serie de interruptores conectados de la siguiente manera: Con lo cuál, al pulsar una tecla cerramos el interruptor y comunicamos la fila con la columna.

B C0A

7 8 9 D

4 5 6 E

1 2 3 F

4x200O Figura 1

Page 51: Manual

45

1.4 Funcionamiento del display Las pantallas de cristal líquido LCD (Liquid Crystal Display) alfanuméricas se

clasifican según el número de caracteres y líneas que pueden mostrar. Las configuraciones más usuales son de 8x1, 16x1, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2, 40x4. Una gran mayoría de los LCDs están basados en el microcontrolador HITACHI 44780 u otro compatible, de forma que la configuración y anejo es bastante similar en muchos de ellos. El tamaño de los caracteres que muestran son de 5x7 o 5x10 píxels. Permiten modos de interface de 4-bits u 8 bits a µP/µC. Por otro lado muchos también incorporan retro-iluminación por diodos led verde, para facilitar su lectura. Para la conexión de un LCD con un sistema electrónico se disponen generalmente de 14 pins con la siguiente asignación de la Tabla 2. En las pantallas retro-iluminadas se incluyen los terminales A, K, de los leds de iluminación. En el caso de la JM162A, se añaden los pines 15 y 16 con esta funcionalidad, tal y como se muestra en la Fig.2

Tabla 2. Asignación de los pines del JM162A #PIN Nombre Función 1 Vss Masa (0V) 2 Vdd Alimentación (+5V) 3 Vee Contraste (Vss=Vee=Vdd) 4 RS Selección de modo (dato=1/comando=0) 5 R/W Lectura/escritura de comando (lectura=1/ecritura=0) 6 E Enable ( Validación DB<7:0> en flanco 1? 0) 7 DB0 Bit 0 (LSB) de dato 8 DB1 Bit 1 de dato 9 DB2 Bit 2 de dato 10 DB3 Bit 3 de dato 11 DB4 Bit 4 de dato 12 DB5 Bit 5 de dato 13 DB6 Bit 6 de dato 14 DB7 Bit 7 (MSB) de dato 15 A Anodo (+) retro-iluminación 16 K Cátodo (-) retro-iluminación

Figura 2

Page 52: Manual

46

1.5 Bases teóricas

Esta práctica utiliza un detector de monedas. Un detector de monedas tiene varios sensores que dependiendo de la moneda insertada, envían una señal u otra al microcontrolador que lleva, el cual se encarga de averiguar el tipo de moneda insertada.

Como se puede interpretar en la tabla 1 y en el esquema de la Figura 1, lo que el micro

debe hacer es interpretar las señales de entrada y salida que están conectadas al teclado, con lo cual al apretar por ejemplo la tecla de 1 EURO se debería incrementar la cantidad de dinero que llevamos insertada en 1€.

Para memorizar el dinero introducido lo haremos en un registro que llamaremos

‘PAGADO’ el cual como todos los registros del micro son de 8 bits, su escala irá de 0 a 255 céntimos. Entonces, para poder superar los 255 céntimos introducidos, como la cantidad de dinero insertado es siempre múltiple de 5, debido a que almoneda más pequeña será la de 5centimos, la vamos a guardar en el micro dividiéndola entre 5, como se explica en el siguiente ejemplo:

Dinero insertado(€) Valor en registro ‘PAGADO’

2,00 40 12,00 240 0,75 15 0,05 1 1,25 25 12,75 255

Con lo cual podemos guardar en 1 registro 12,75€. Aunque existen otros sistemas,

como por ejemplo guardarlo en 2 registros, utilizaremos este sistema para hacer compatible el registro con el resto de las prácticas.

Si apretamos la tecla ‘CANCELAR’ el micro debería poner a cero la cantidad de dinero que llevamos insertada y llamar a una función que nos devolvería el dinero introducido. En nuestra práctica, se debería detectar si se supera el máximo de dinero permitido insertado. Dicha cantidad máxima, se fijará a un valor y no nos permitiría superar esta cantidad, al mismo tiempo que llamaría a una función que nos devolvería la última moneda introducida, una cantidad máxima para esta práctica puede ser simplemente los 12,75 € que es lo máximo que podemos introducir en el registro de ‘PAGADO’ Al mismo tiempo que el micro hace las operaciones con el dinero introducido en la máquina, el micro nos debe sacar por la pantalla del LCD la cantidad de dinero insertada.

Page 53: Manual

47

El formato de presentación puede ser este:

D D , D D P G

D - Cantidad de dinero insertado en la máquina PG Es lo que tiene que poner para especificar que es lo pagado

Ejemplo:

0 2 , 1 5 P G

5V

Vpp

RA0

RA1

RA2

RA3

RA4

RA5

Vss

OSC1

OSC2

RC0

RC1

RC2

RC3 RC4

RC5

TX

RX

VSS1

VDD

RB0

RB1

RB2

RB3

RB4

RB5

PGC

PGD

16F876

10nF

22pF

4.7kohm

5V

RIBBON_16H

RIBBON_10H

5V

2x10K

Page 54: Manual

48

1.6 Explicación esquema eléctrico

Como se puede ver en el esquema eléctrico (Fig.2) utilizaremos RC<3:0> como salidas para escribir el dato a enviar a la pantalla del LCD y utilizaremos RB<4:3> para controlar RS y E de la pantalla del LCD respectivamente. Para ver el funcionamiento de la pantalla del LCD, ver las características técnicas adjuntadas en las prácticas y el apartado 1.4 Funcionamiento del display. Una posibilidad para controlar el teclado sería RC<3:0> como salida y RA<4:3> como entrada. El funcionamiento sería que al proporcionarle tensión a una de las salidas de RC, si pulsásemos cualquiera de las dos teclas que están conectadas a la columna activada, en RA obtendríamos un ‘1’ ya que comunicaríamos la columna con la fila. Si pulsásemos la misma tecla y la columna no estuviese activada, en RA obtendríamos un ‘0’. Ver apartado 1.3 Funcionamiento del teclado.

1.7 Resumen de objetivos

Tenemos que hacer el código para: - Que se reconozcan los pulsadores cuando apretemos las teclas. - Cuando sea una moneda se debería incrementar el registro ‘PAGADO’ con la

cantidad de la moneda seleccionada. - En el caso de que no sea una moneda

o Que no haga nada si es la tecla E o Que si se aprieta la tecla F se ponga a 0 la cantidad de dinero insertada y

se llame a una función para proceder a la devolución del dinero, que se realizará en la práctica de devolución de dinero.

- En el caso de superar una cantidad de dinero ya fijada, que puede ser por ejemplo

la cantidad máxima que se puede almacenar en ‘PAGADO’ (12,75 €) u otra cantidad que creemos en otra variable, no incrementará la cantidad de dinero insertado y llamará a una función para devolver la última moneda introducida, ésta función puede ser la misma que la de devolución del dinero pasándole la moneda a devolver

- Se tendrá que poner en la pantalla del LCD la cantidad de dinero insertada con el

formato explicado anteriormente. 1.8 Objetivos de conocimiento - Aprender control de teclado y pantalla LCD - Conversiones de datos entre diferetnes tipos de numeración en un microcontrolador

Page 55: Manual

49

1.9 DIAGRAMA DE FLUJO

Como se puede ver, esta sería una posible solución simple para el problema dado.

INICIAR LCD

SI DEVOLVERPAGADO

SI

NO

NO

ACTUALIZARCANTIDAD DE DINERO

PAGADO

NO

SI

DEVOLVER ÚLTIMA MONEDA

INSERTADA

ESCRIBIR NUEVA

CANTIDADEN LCD

TESTEAR TECLADO

INICIO

TECLAAPRETADA?

TECLACANCELAR?

SI

NO

TECLA1,2,3,4,5 o 6?

SE SUPERA EL MÁXIMO?

Page 56: Manual

50

2.6.2.2 Práctica núm.2 Modificar precio

2.1 Equipos y materiales: Para realizar la práctica utilizaremos:

• Ordenador PC • Software MPLAB • Teclado de 16 teclas • Display SAMSUNG KS0070 • Cable plano de 16 • “ “ “ 10 • Cable comunicación puerto serie • Kit MPLAB-ICD debuger • PIC 16F876

2.2 Descripción del funcionamiento

En ésta práctica tenemos un teclado (ver aparatado 2.3), el cuál nos sirve para

introducir el número del producto (a cada producto le asignaremos un número). Una vez introducido dicho número, debería salir el precio actual de éste producto.

A continuación deberemos introducir el precio del nuevo producto y darle a la tecla

aceptar para que cambie el precio en la E2PROM.

Aparte de poder cambiar el precio, habrán diferentes opciones en el teclado. Una opción sería la tecla ‘CANCELAR’ con la que podremos interrumpir el proceso del cambio de precio en cualquier momento por si nos hemos equivocado.

Otra opción del teclado será la tecla ‘ENVIAR’. Servirá para poder enviar los datos de

la E2PROM a otro chip. Éste apartado no lo realizaremos, ya que se hará en la práctica “enviar datos USART”. En nuestra práctica simplemente mandará a una función.

La última opción será la tecla ‘RESETEAR’ que servirá para eliminar todos los precios

de la E2PROM. Esto valdrá sobre todo para inicializar la E2PROM y por si hay que cambiar todos los precios.

Durante todo el proceso se mostrará por la pantalla del display los procesos que vamos

realizando. Para ello leer el funcionamiento y el formato de cómo escribir los datos en el display en los apartados 2.4 y 2.5 respectivamente.

Page 57: Manual

51

2.3 Funcionamiento del teclado Para esta práctica utilizaremos un teclado para seleccionar el producto y poner el nuevo

precio. Dicho teclado puede tener la disposición siguiente:

1 2 3 F

4 5 6 ENVIAR

7 8 9 RESETEAR

ACEPTAR

0

CANCELAR C

Tabla 1

El teclado consta de una serie de interruptores conectados de la siguiente manera:

Con lo cuál, al pulsar una tecla cerramos el interruptor y comunicamos la fila con la columna.

B C0A

7 8 9 D

4 5 6 E

1 2 3 F

4x200O

Figura 1

Page 58: Manual

52

2.4 Funcionamiento del display Las pantallas de cristal líquido LCD (Liquid Crystal Display) alfanuméricas se

clasifican según el número de caracteres y líneas que pueden mostrar. Las configuraciones más usuales son de 8x1, 16x1, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2, 40x4. Una gran mayoría de los LCDs están basados en el microcontrolador HITACHI 44780 u otro compatible, de forma que la configuración y anejo es bastante similar en muchos de ellos. El tamaño de los caracteres que muestran son de 5x7 o 5x10 píxels. Permiten modos de interface de 4-bits u 8 bits a µP/µC. Por otro lado muchos también incorporan retro-iluminación por diodos led verde, para facilitar su lectura. Para la conexión de un LCD con un sistema electrónico se disponen generalmente de 14 pins con la siguiente asignación de la Tabla 2. En las pantallas retro-iluminadas se incluyen los terminales A, K, de los leds de iluminación. En el caso de la JM162A, se añaden los pines 15 y 16 con esta funcionalidad, tal y como se muestra en la Fig.2

Tabla 2. Asignación de los pines del JM162A #PIN Nombre Función 1 Vss Masa (0V) 2 Vdd Alimentación (+5V) 3 Vee Contraste (Vss=Vee=Vdd) 4 RS Selección de modo (dato=1/comando=0) 5 R/W Lectura/escritura de comando (lectura=1/ecritura=0) 6 E Enable ( Validación DB<7:0> en flanco 1? 0) 7 DB0 Bit 0 (LSB) de dato 8 DB1 Bit 1 de dato 9 DB2 Bit 2 de dato 10 DB3 Bit 3 de dato 11 DB4 Bit 4 de dato 12 DB5 Bit 5 de dato 13 DB6 Bit 6 de dato 14 DB7 Bit 7 (MSB) de dato 15 A Anodo (+) retro-iluminación 16 K Cátodo (-) retro-iluminación

Page 59: Manual

53

2.5 Bases teóricas

En esta práctica vamos a cambiar los datos de la E2PROM del microchip. Una E2PROM es una memoria no volátil que puede ser programada electrónicamente. Dentro del PIC 16F876 existe una E2PROM con capacidad de 256 bytes (H’00’-h’FF’).

Para nuestra práctica solamente vamos a utilizar 40 valores de esta E2PROM y la

distribución podría ser por ejemplo: H’00’ → H’09’ H’10’ → H’19’ H’20’ → H’29’ H’30’ → H’39’ De esta forma al buscar un precio de un producto podemos pensar en decimal y no

tener que trabajar en hexadecimal. . Otro motivo es que Al introducir el precio lo hacemos en decimal con lo que nos ahorramos una conversión de decimal a hexadecimal y viceversa. Ejemplo:

Producto 12 → D’12’ →H’C’ Como se puede interpretar en la tabla 1 y en el esquema de la Figura 1 , lo que el micro

debe hacer es interpretar las señales de entrada y salida que están conectadas al teclado, con lo cual al apretar por ejemplo la tecla ‘2’ se debería almacenar en algún registro que hemos apretado la tecla 2 para después procesar lo que se debe hacer con ella.

El micro en esta práctica debería estar esperando a que se pulsase una tecla para comenzar el proceso. Lo primero que comprobará una vez pulsada una tecla, será revisar si ya se ha seleccionado un producto o no. Para seleccionar un producto debemos introducir dos unidades, ya que como habíamos explicado anteriormente, tendremos que trabajar con 40 productos. Con lo cual las decenas del producto deben ser 0, 1, 2 o 3 y por lo tanto si apretásemos cualquier otro número no debería hacer nada el micro ya que sería incorrecto. En cuanto apretemos el valor de las unidades del producto, que será la segunda tecla que tocaremos, ya tendremos seleccionado el producto que queríamos y debería sacar por el display el valor actual del precio guardado en E2PROM de dicho producto y quedarse testeando el teclado a la espera de que se pulse una nueva tecla para poner el nuevo precio o cancelar. Utilizando el método de como se guardan los valores en la E2PROM que hemos explicado al principio, vamos a insertar el precio nuevo, lo vamos a hacer directamente con el valor divido entre 5, o sea, que para meter 2,00 € pondremos 40 o para meter 0,05€ pondremos 1. Por ultimo, cuando terminemos de introducir el precio nuevo, debemos pulsar la tecla ‘ACEPTAR’, con lo cual saldría el precio real por el display y se cambiaría el precio en la

Page 60: Manual

54

E2PROM, se iría al inicio y volveríamos a quedar en espera de que se apretase una nueva tecla. Si pulsamos la tecla ‘CANCELAR’ durante el proceso de cambiar el precio, el micro cancelaría el proceso y volvería al inicio del programa, inicializando todos los registros e inicializando el display. Si pulsamos la tecla ‘ENVIO’, el micro debe llamar a una función que puede ser ‘ENVIAR_EEPROM’ y que mandará vía RS232 la E2PROM de este chip a otro chip. Esta parte se hará en la práctica de envío por USART, con lo cual nosotros solo tenemos que hacer que vaya a la función explicada anteriormente. En el caso de pulsar la tecla ‘RESETEAR’ lo que tiene que hacer el micro es poner a 0 todos los valores de los precios, lo cuál servirá para saber si hay o no producto, ya que si al leer el precio su valor es 0 eso significará que no existe producto a vender en esa posición. Al mismo tiempo que el micro hace las operaciones pertinentes para modificar el precio, utilizaremos el display para ir viendo lo que vamos haciendo. La presentación puede ser de esta forma:

P R O D X X A A , A A N U E C C C B B , B B

X – El número del producto a seleccionar que es de 2 dígitos.

A – El precio del producto seleccionado. C - El precio nuevo que vamos a entrar, este precio será el real divido entre 5 (* Ver nota).

B – El precio insertado real.

*Para insertar el precio debemos dividir entre 5 el precio que queremos insertar. Como ejemplo puede ser:

5 → 00,25 15 → 00,75 152 → 07,50

Ejemplo:

P R O D 1 2 0 2 , 3 0 N U E 2 5 0 1 , 2 5

Page 61: Manual

55

5V

Vpp

RA0

RA1

RA2

RA3

RA4

RA5

Vss

OSC1

OSC2

RC0

RC1

RC2

RC3 RC4

RC5

TX

RX

VSS1

VDD

RB0

RB1

RB2

RB3

RB4

RB5

PGC

PGD

16F876

10nF22pF

4.7kohm

5V RIBBON_10H

RIBBON_16H

5V

4x10K

2.6 Explicación esquema eléctrico

Como se puede ver en el esquema eléctrico (Fig.2) utilizaremos RC<3:0> como salidas

para escribir el dato a enviar a la pantalla del LCD y utilizaremos RB<5:4> para controlar RS y E de la pantalla del LCD respectivamente. Para ver el funcionamiento de la pantalla del LCD, ver las características técnicas adjuntadas en las prácticas. Una posibilidad para controlar el teclado sería RC<3:0> como salida y RA<3:0> como entrada. El funcionamiento sería que al proporcionarle tensión a una de las salidas de RC, si pulsásemos cualquiera de las dos teclas que están conectadas a la columna activada, en RA obtendríamos un ‘1’ ya que comunicaríamos la columna con la fila. Si pulsásemos la misma tecla y la columna no estuviese activada, en RA obtendríamos un ‘0’.

Fig. 2

Page 62: Manual

56

2.7 Resumen objetivos

Tenemos que hacer el código para:

- Que se reconozcan las teclas cuando las pulsemos - Que busque el precio del producto seleccionado.

- Que se cambie de E2PROM el precio del producto por el nuevo que hemos

insertado.

- Que en el caso de que pulsemos la tecla ‘ENVIAR’, nos mande el programa a una función que llamaremos ‘ENVIAR_ EEPROM’, que ésta será diseñada en la práctica de comunicación por USART.

- Si pulsamos la tecla ‘RESETEAR’ deberían ponerse a 0 todos los precios de la

E2PROM - Se tendrán que poner en la pantalla del display los datos a su debido tiempo y con

el formato que se ha explicado anteriormente. 2.8 Objetivos de conocimientos. - Aprender control de teclado y pantalla LCD - Escrbir y leer una EEPROM de un microcontrolador

- Converiones entre diferentes tipos de numeración en un microcontrolador

Page 63: Manual

57

2.9 Diagramas de flujo

INCIO

NO

SI

TECLAAPRETADA?

TESTEAR TECLADO

PRODUCTOELEGIDO=1?

SI

PRECIO INTRODUCIDO=1?

LA TECLA ES0,1,2,3,4,5,6,7,8,9?

LA TECLA ES ‘CANCELAR’?

LA TECLA ES ‘ACEPTAR’?

NO

NO

ELEGIRPRDUCTO

SI

LA TECLA ES0,1,2,3,4,5,6,7,8,9?

LA TECLA ES ‘CANCELAR’?

NO

NO

ESCRIBIR TECLA EN DISPLAY

HACERCALCULOS

Y PRECIO INTRODUCIDO=1

SI

SIINICIAR

REGISTROS Y ESCRIBIR CANCEL EN

DISPLAY

ESCRIBIR TECLA EN DISPLAY

HACERCALCULOS

INICIAR REGISTROS Y ESCRIBIR CANCEL EN

DISPLAY

ESCRIBIRPRECIO

EN EEPROM

MODIFICARPRECIO EN

EEPROM

NO

PRECIOINTRODUCIDO=0

INICIAR DISPLAY

INICIAR DISPLAY

INICIAR DISPLAY

SI

SI

SI

NO

Page 64: Manual

58

ESCRIBIR TECLA EN DISPLAY

LA TECLA ES0,1,2,3,4,5,6,7,8,9?

LA TECLA ES ‘CANCELAR’?

NO

NO

DECENASINTRODUCIDAS=1? LA TECLA ES

‘ENVIAR’?

BUSCAR PRECIO

PRODUCTO

ESCRIBIR PRECIO EN

DSPLAY

PRODUCTO ELEGIDO=1

YDECENAS

INTRODUCIDAS=0

SI

ELEGIRPRDUCTO

INICIAR REGISTROS Y ESCRIBIR CANCEL EN

DISPLAY

IR A FUNCION ‘ENVIAR EEPROM’

FIN

TECLA > 4?

ESCRIBIR TECLA EN DISPLAY

CALCULAR LA DECENA

DEL PRODUCTO

SI

NO

NO

SI

SI

DECENASINTRODUCIDAS=1

INICIAR DISPLAY

Como se puede ver, esta sería una posible solución simple para el problema dado.

Page 65: Manual

59

2.6.2.3 Práctica núm.3 Pedir producto

3.1 Equipos y materiales: Para realizar la práctica utilizaremos: • Ordenador PC • Software MPLAB • Teclado de 16 teclas • Display SAMSUNG KS0070 • Cable plano de 16 • “ “ “ 10 • Cable comunicación puerto serie • Kit MPLAB-ICD debuger • PIC 16F876

3.2 Descripción del funcionamiento En esta práctica programaremos el micro para poder pedir un producto. Se trata de

hacer el programa de tal manera que se pueda unir al resto de prácticas a realizar. Para empezar, el micro esperará a que se seleccione uno de los productos a través del

teclado. Ver su funcionamiento en el apartado 3.3. A continuación, una vez seleccionado el producto, obtendremos el valor de dicho

producto, que estará almacenado en la E2PROM y se quedará a la espera de que el usuario cancele o acepte la operación.

En el caso de que el usuario acepte, deberá comprobar en el registro ‘PAGADO’ si se

ha insertado la cantidad de dinero suficiente para pagar el producto seleccionado y en el caso de que así sea, se comprobará si hay producto, ya que podría ser que se hubiese agotado.

Una vez comprobado si se ha pagado y si hay producto, procederemos a dar el cambio

del dinero. En esta práctica no realizaremos este proceso, simplemente mandaremos a una función que se realizará en la práctica 4 ‘DAR CAMBIO’.

Por último, tendremos que entregar el producto y volver al inicio a esperar a que se

seleccione otro producto y volver a empezar el proceso. Todo esto se tiene que ir mostrando en el display de la forma que se indica en el

apartado 3.5. El funcionamiento del display se puede ver en el aparatado 3.4.

Page 66: Manual

60

3.3 Funcionamiento del teclado El teclado servirá para seleccionar el producto que queremos, con lo cual deberá

dejarnos introducir dos dígitos para seleccionar un producto. Además, en el mismo teclado existirá la tecla ‘CANCELAR’ que servirá para interrumpir la selección del producto y volver a comenzar el proceso y la tecla ‘ACEPTAR’ para confirmar que el producto que queremos es el seleccionado. La disposición de las teclas podría ser la siguiente:

1 2 3 F

4 5 6 E

7 8 9 D

ACEPTAR

0

CANCELAR C

Tabla 1

El teclado consta de una serie de interruptores conectados de la siguiente manera: Con lo cuál, al pulsar una tecla cerramos el interruptor y comunicamos la fila con la

columna.

B C0A

7 8 9 D

4 5 6 E

1 2 3 F

4x200O

Figura 1

Page 67: Manual

61

3.4 Funcionamiento del display Las pantallas de cristal líquido LCD (Liquid Crystal Display) alfanuméricas se

clasifican según el número de caracteres y líneas que pueden mostrar. Las configuraciones más usuales son de 8x1, 16x1, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2, 40x4. Una gran mayoría de los LCDs están basados en el microcontrolador HITACHI 44780 u otro compatible, de forma que la configuración y anejo es bastante similar en muchos de ellos. El tamaño de los caracteres que muestran son de 5x7 o 5x10 píxels. Permiten modos de interface de 4-bits u 8 bits a µP/µC. Por otro lado muchos también incorporan retro-iluminación por diodos led verde, para facilitar su lectura. Para la conexión de un LCD con un sistema electrónico se disponen generalmente de 14 pins con la siguiente asignación de la Tabla 2. En las pantallas retro-iluminadas se incluyen los terminales A, K, de los leds de iluminación. En el caso de la JM162A, se añaden los pines 15 y 16 con esta funcionalidad, tal y como se muestra en la Fig.2

Tabla 2. Asignación de los pines del JM162A #PIN Nombre Función 1 Vss Masa (0V) 2 Vdd Alimentación (+5V) 3 Vee Contraste (Vss=Vee=Vdd) 4 RS Selección de modo (dato=1/comando=0) 5 R/W Lectura/escritura de comando (lectura=1/ecritura=0) 6 E Enable ( Validación DB<7:0> en flanco 1? 0) 7 DB0 Bit 0 (LSB) de dato 8 DB1 Bit 1 de dato 9 DB2 Bit 2 de dato 10 DB3 Bit 3 de dato 11 DB4 Bit 4 de dato 12 DB5 Bit 5 de dato 13 DB6 Bit 6 de dato 14 DB7 Bit 7 (MSB) de dato 15 A Anodo (+) retro-iluminación 16 K Cátodo (-) retro-iluminación

Figura 2

Page 68: Manual

62

3.5 Bases teóricas

Como se puede ver en la tabla 1 y en el esquema de la Figura 1, lo que el micro debe hacer es interpretar las señales de entrada y salida que están conectadas al teclado, con lo cual al pulsar por ejemplo la tecla ‘2’ se debería almacenar en algún registro que hemos pulsado dicha tecla para después procesar lo que se debe hacer con ella.

Los productos están almacenados en la E2PROM. De acuerdo con el formato que se ha

comentado en la práctica 2, las posiciones de la E2PROM que se van a usar van a ser las siguientes:

H’00’ → H’09’ H’10’ → H’19’ H’20’ → H’29’ H’30’ → H’39’ De esta forma, al buscar un precio de un producto podemos pensar en decimal y no

tener que trabajar en hexadecimal. Ejemplo: Producto 12 → D’12’ →H’C’

El micro en esta práctica debería estar esperando a que se pulsase una tecla para

comenzar el proceso. Una vez pulsada una tecla, lo primero que hará el micro será comprobar si ya se había seleccionado un producto o no. Para seleccionar un producto debemos introducir dos unidades, ya que como habíamos explicado anteriormente, tendremos que trabajar con 40 productos. Con lo cual, las decenas del producto deben ser 0, 1, 2 o 3 y por lo tanto si pulsásemos cualquier otro número no debería hacer nada el micro, ya que sería incorrecto.

En cuanto pulsemos el valor de las unidades del producto, que será la segunda tecla que tocaremos, ya tendremos seleccionado el producto que queríamos y debería sacar por el display el valor actual del precio guardado en E2PROM de dicho producto y quedarse testando el teclado a la espera de que se pulse la tecla ‘ACEPTAR’ para continuar o la tecla ‘CANCELAR’ para empezar de nuevo.

En el caso de pulsar la tecla’CANCELAR’ cuando estamos seleccionando el producto, debe volver al principio a esperar a empezar de nuevo la selección del producto.

Una vez elegido el producto, hay que mirar si se ha pagado o no, para ello hay que

comparar el precio del producto con la cantidad que se ha pagado. Para ello, el precio del producto nos lo da el valor de la E2PROM y la cantidad que se ha pagado vendrá dada por un registro que llamaremos ‘PAGADO’ que será modificado en la práctica 1 “monedero”. Para poder modificar este registro nosotros utilizaremos el MPLAB en el comando ‘Window->Modify’. Donde aparecerá una ventana en la cual en ‘Adress’ escribiremos la dirección o el nombre del registro ‘PAGADO’ y podremos variar su valor.

Page 69: Manual

63

Tanto para introducir la cantidad de dinero como para hacer operaciones en el registro ‘PAGADO’, hay que seguir el formato de la práctica 1. Se introduce en el registro ‘PAGADO’ la cantidad de dinero insertado dividiendo entre 5 como se explica en el ejemplo siguiente:

Dinero insertado(€) Valor en registro ‘PAGADO’

2,00 40 12,00 240 0,75 15 0,05 1 1,25 25 12,75 255

Con lo cual, podemos guardar en 1 registro 1275 céntimos. Aunque existen otros

sistemas, como por ejemplo guardarlo en 2 registros, nosotros utilizaremos este sistema para hacer compatible el registro con el resto de las prácticas.

A continuación, para comprobar si hay producto se tendría que ir a una función que nos debería comunicar con otro micro, el cual llevaría el control de los productos. Como la comunicación es parte de otra práctica, en este caso, lo que haremos será revisar el interruptor colocado en RC5 que dependiendo de si está abierto o cerrado, indicará si hay producto o no. Si se ha pagado y hay producto, se continua el proceso calculando el cambio. En el caso de que lo pagado sea exacto, se seguirá el proceso de dar producto. En el caso de que se deba dar cambio, lo calculará y comprobará el interruptor de RC6 que dependiendo de si está abierto o cerrado, indicará si hay cambio o no. En el caso de que se tenga que dar cambio y exista cambio, debería ir a la función “DAR CAMBIO”. En esta práctica esta función no hará nada ya que “DAR CAMBIO” se realizará en la práctica 4. Si todo a sido correcto, queda entregar el producto. Como en el caso de revisar si hay producto, esto se debería hacer por comunicación USART con otro micro, en esta práctica solamente encenderemos el LED de entregar el producto, que está en RB5 . Una vez entregado el producto, volveríamos al inicio a esperar que se introduzca otro producto. Al mismo tiempo que el micro hace las operaciones explicadas anteriormente, el micro debe presentar por la pantalla del LCD los diversos aparatados que se han explicado. El formato de presentación puede ser el siguiente:

B B , B B C M P R O D N N A A , A A $

N –Producto seleccionado. A – Precio del producto seleccionado.

B – Cantidad de dinero a devolver por el cambio.

Page 70: Manual

64

Ejemplo en el caso que ‘PAGADO’ hubiese tenido el valor correspondiente a 3€:

0 0 , 2 5 C M

P R O D 1 2 0 2 , 7 5 $ En el caso de que se hubiese cancelado el proceso a causa de que no exista cambio, que no se haya pagado el producto o no quede, se podría, para mayor claridad de lo que esta pasando en el programa, escribir mensajes a través del LCD. Se podría hacer en el espacio guardado para escribir el cambio a dar. Unos ejemplos de cómo se podría hacer serían los siguientes:

En el caso de no haberse pagado el producto:

N O P G P R O D 1 2 0 2 , 7 5 $

En el caso de no haber producto:

N O P R O D P R O D 1 2 0 2 , 7 5 $

En el caso de no haber cambio:

N O C M P R O D 1 2 0 2 , 7 5 $

Page 71: Manual

65

5V

Vpp

RA0

RA1

RA2

RA3

RA4

RA5

Vss

OSC1

OSC2

RC0

RC1

RC2

RC3 RC4

RC5

TX

RX

VSS1

VDD

RB0

RB1

RB2

RB3

RB4

RB5

PGC

PGD

16F876

10nF

ENTREGA PRODUCTO

1.0kohm

HAY PRODUCTO

5V

22pF

4.7kohm

5V RIBBON_10H

RIBBON_16H

3x10K

HAY CAMBIO

5V

3.6 Explicación esquema eléctrico

Como se puede ver en el esquema eléctrico (Fig.2) utilizaremos RC<3:0> como salidas para escribir el dato a enviar a la pantalla del LCD y utilizaremos RB<4:3> para controlar RS y E de la pantalla del LCD respectivamente. Para ver el funcionamiento de la pantalla del LCD, ver las características técnicas adjuntadas en las prácticas y el apartado 3.4 Funcionamiento del display. Una posibilidad para controlar el teclado sería RC<3:0> como salida y RB<3:0> como entrada. El funcionamiento sería que al proporcionarle tensión a una de las salidas de RC, si pulsásemos cualquiera de las dos teclas que están conectadas a la columna activada, en RA obtendríamos un ‘1’ ya que comunicaríamos la columna con la fila. Si pulsásemos la misma tecla y la columna no estuviese activada, en RA obtendríamos un ‘0’. Ver apartado 3.3 Funcionamiento del teclado.

Fig. 2

Page 72: Manual

66

3.7 Resumen de objetivos

Tenemos que hacer el código para conseguir: - Que se reconozcan los pulsadores cuando pulsemos las teclas. - Que una vez seleccionado un producto, busque el precio y espere a que se pulse la

tecla ‘ACEPTAR’ para continuar.

- Si pulsásemos la tecla ‘CANCELAR’ durante la selección del producto, debería borrar lo que se ha seleccionado de momento y quedar preparado para empezar de nuevo.

- Una vez seleccionado el producto, hay que revisar si existe suficiente dinero para

pagar el producto.

- A continuación, habrá que revisar si hay producto por si se hubiese agotado utilizando el método del interruptor. Recordar separarlo en una función, ya que después esta función será modificada al unirlo con otras prácticas.

- Si se ha pagado y existe producto, se tiene que calcular el cambio y mandar a una

función ‘DAR CAMBIO’ que se hará en otra práctica.

- Por ultimo, habrá que entregar el producto con el método del LED explicado anteriormente. Recordar que la función de preguntar si hay producto tiene que ir separada del resto del código.

- Se tendrán que poner en la pantalla del display los datos y las causas por las que se

sigue el proceso de pedir producto por no haber cambio, no haber producto, etc... Todos estos mensajes se deben mostrar en su debido tiempo y con el formato que se ha explicado en el apartado 4.5.

3.8 Objetivos de conocimientos. - Aprender control de teclado y pantalla LCD - Leer una EEPROM de un microcontrolador

- Hacer un sisitema de detección de errores.

Page 73: Manual

67

3.9 Diagrama de flujo

TESTEARTECLADO

Producto elegido=1?

ELEGIR PRODUCTO

NO

NO

SI

REVISAR SI EXISTE PRECIO

EN EEPROM

NO

SI

SI

SI

SI

REVISAR SI HAY CAMBIO

Existe precio?DAR MENSAJE ERROR ‘NO $’

REVISAR SI SE HA AGOTADO

PRODUCTO

RC<4>=1?DAR MENSAJE

ERROR ‘NO PROD’

MOSTRAR EN LCD PRECIO DEL

PRODUCTO

REVISAR SI INSERTADO SUF.

DINERO

Se ha pagado?DAR MENSAJE

ERROR ‘NO PG’

MIRAR SI NECESITA DAR

CAMBIO

Necesita dar cambio?

NO

INICIAR LCD

DAR PROD RA<5>=1 Y MOSTRAR CAMBIO

NO

RC<5>=0?

SI

DAR MENSAJE ERROR

‘NO CM’

NO

DAR CAMBIO

Producto eleegido=0

INICIO

Page 74: Manual

68

Tecla = Aceptar o Cancelar?

SI

NO

NO

SI

SI

REVISAR SI SON LAS DECENAS

Lim_tec=2?ESCRIBIR EN LCD

‘PROD’ Y EL Nº DE DECENA

REVISAR LAS UNIDADES

Lim_tec=1?ESCRIBIR EN LCD

EL Nº DE LA UNIDAD

NO

TECLA APRETADA=0

ELEGIR PRODUCTO

CANCELAR EL PROCESOTecla = Cancelar?

SI

Lim_tec=0?SI PRODUCTO

ELEGIDO=1

LIM_TEC=LIM_TEC+1

NO

NO

GUARDAR VALOR DECENA

Y LIM_TEC-1

PRODUCTO= DECENA+UNIDAD

FIN

Como se puede ver, esta sería una posible solución simple para el problema

dado.

Page 75: Manual

69

2.6.2.4 Práctica núm.4 Dar cambio

4.1 Equipos y materiales:

Para realizar la práctica utilizaremos: • Ordenador PC • Software MPLAB • Teclado de 16 teclas • Display SAMSUNG KS0070 • Cable plano de 16 • “ “ “ 10 • Cable comunicación puerto serie • Kit MPLAB-ICD debuger • PIC 16F876

4.2 Descripción del funcionamiento

En esta práctica programaremos el micro para poder dar el cambio de dinero. Se

trata de hacer el programa para unirlo al resto de prácticas a realizar. Para empezar, el micro esperará a que se introduzca una cantidad de dinero a

través del teclado, ver su funcionamiento en el apartado 4.3. Una vez seleccionada la cantidad de dinero tenemos que revisar si existe

cambio, ya que puede pasar que no quede. Para ello hay un interruptor de “hay cambio” que nos indicará si hay o no.

Por último debería dar el cambio. Para ello, se tendría que ir a una función, que

será ‘Dar el cambio’ y la utilizaremos para unir al resto de las prácticas, con lo cual hay que tener en cuenta algunos aspectos que se explican en el apartado 4.5.

La función ‘Dar el cambio’, lo que tiene que hacer es ir restando a la cantidad

del cambio las fracciones monetarias de las que disponemos y a medida que se va detectando una moneda se tiene que enviar el código para encender el LED correspondiente a la moneda a devolver.

Una vez que se ha devuelto todo el dinero, saldríamos de la función del cambio

y tendríamos que volver a esperar a que se introduzca una nueva cantidad de dinero y seleccionar otro producto.

Todo esto se tiene que ir mostrando en el display de la forma que se indica en el

apartado 4.5. El funcionamiento se puede ver en el aparatado 4.4.

Page 76: Manual

70

4.3 Funcionamiento del teclado El teclado servirá para seleccionar el cambio que se tiene que devolver, con lo cual

deberá dejarnos introducir una cantidad numérica, que puede ser de 2, 3 o 4 dígitos. Además, en el mismo teclado existirá la tecla ‘ACEPTAR’ para confirmar que es la cantidad de cambio que queremos que se nos devuelva. La disposición de las teclas podría ser la siguiente:

1 2 3 F

4 5 6 E

7 8 9 D

ACEPTAR

0

B C

Tabla 1

El teclado consta de una serie de interruptores conectados de la siguiente manera: Con lo cuál, al pulsar una tecla cerramos el interruptor y comunicamos la fila con la

columna.

B C0A

7 8 9 D

4 5 6 E

1 2 3 F

4x200O Figura 1

Page 77: Manual

71

4.4 Funcionamiento del display Las pantallas de cristal líquido LCD (Liquid Crystal Display) alfanuméricas se

clasifican según el número de caracteres y líneas que pueden mostrar. Las configuraciones más usuales son de 8x1, 16x1, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2, 40x4. Una gran mayoría de los LCDs están basados en el microcontrolador HITACHI 44780 u otro compatible, de forma que la configuración y anejo es bastante similar en muchos de ellos. El tamaño de los caracteres que muestran son de 5x7 o 5x10 píxels. Permiten modos de interface de 4-bits u 8 bits a µP/µC. Por otro lado muchos también incorporan retro-iluminación por diodos led verde, para facilitar su lectura. Para la conexión de un LCD con un sistema electrónico se disponen generalmente de 14 pins con la siguiente asignación de la Tabla 2. En las pantallas retro-iluminadas se incluyen los terminales A, K, de los leds de iluminación. En el caso de la JM162A, se añaden los pines 15 y 16 con esta funcionalidad, tal y como se muestra en la Fig.2

Tabla 2. Asignación de los pines del JM162A #PIN Nombre Función 1 Vss Masa (0V) 2 Vdd Alimentación (+5V) 3 Vee Contraste (Vss=Vee=Vdd) 4 RS Selección de modo (dato=1/comando=0) 5 R/W Lectura/escritura de comando (lectura=1/ecritura=0) 6 E Enable ( Validación DB<7:0> en flanco 1? 0) 7 DB0 Bit 0 (LSB) de dato 8 DB1 Bit 1 de dato 9 DB2 Bit 2 de dato 10 DB3 Bit 3 de dato 11 DB4 Bit 4 de dato 12 DB5 Bit 5 de dato 13 DB6 Bit 6 de dato 14 DB7 Bit 7 (MSB) de dato 15 A Anodo (+) retro-iluminación 16 K Cátodo (-) retro-iluminación

Figura 2

Page 78: Manual

72

4.5 Características del 74LS138N

El 74LS138 es un codificador/demultiplexor invertido y lo vamos a utilizar como un decodificador para encender los LED’s de las monedas a entregar. La tabla de función de este chip es la siguiente:

INPUT OUTPUT

1E 2E 3E A0 A1 A2 0Y 1Y 2Y 3Y 4Y 5Y 6Y 7Y

H X X X X X H H H H H H H H X H X X X X H H H H H H H H X X L X X X H H H H H H H H L L H L L L L H H H H H H H L L H H L L H L H H H H H H L L H L H L H H L H H H H H L L H H H L H H H L H H H H L L H L L H H H H H L H H H L L H H L H H H H H H L H H L L H L H H H H H H H H L H L L H H H H H H H H H H H L

Las características técnicas de este chip se encuentran al final de la práctica.

4.6 Bases teóricas

Como se puede interpretar en la tabla 1 y en el esquema de la Figura 1, lo que el micro debe hacer es interpretar las señales de entrada y salida que están conectadas al teclado, con lo cual al pulsar por ejemplo la tecla ‘2’ se debería almacenar en algún registro que hemos pulsado dicha tecla para después procesar lo que se debe hacer con ella.

El micro en esta práctica debería estar esperando a que se pulsase una tecla para

comenzar el proceso. Para seleccionar la cantidad de dinero que se tiene que dar en el cambio, se da libertad en el procedimiento con el teclado, lo único a tener en cuenta es que la cantidad de dinero del cambio se tiene que guardar en un registro que llamaremos ‘CAMBIO’ y que tendrá el formato que se explica en la práctica 1. Se introduce en el registro ‘CAMBIO’ la cantidad de dinero insertado dividiendo entre 5 como se explica en el ejemplo siguiente:

Dinero insertado Valor en registro ‘CAMBIO’

2,00 40 12,00 240 0,75 15 0,05 1 1,25 25

12,75 255

Page 79: Manual

73

Con lo cual podemos guardar en 1 registro 1275 céntimos.

Una vez insertada la cantidad de cambio a dar habría que revisar si hay cambio o no. Esto se realizará con un interruptor conectado en RC<6> y se puede programar a elección del programador. Podría ser, ON – Hay cambio, OFF – No hay cambio, o viceversa.

Para dar el cambio hay que crear una función que esta será la que se una al conjunto de

prácticas. Para que funcione bien hay que tener en cuenta el registro ‘CAMBIO’ explicado anteriormente y que la función tiene que ser transparente para no modificar otros registros que puedan alterar el funcionamiento de las otras prácticas si las unimos.

Para calcular las monedas a dar, una posibilidad podría ser ir restando la cantidad de las diferentes monedas hasta que la cantidad de ‘CAMBIO’ fuese 0, el método para averiguar las monedas a entregar de cambio se deja a elección del usuario, aunque se expone un diagrama de flujo en el apartado 4.8 de una posible solución.

Para entregar las monedas, hay un demultiplexador de 3-8 (74LS138N, ver características en el apartado 4.5) conectado a RA<2:0> por un lado y a una serie de LED’S por el otro, con lo cual existe la siguiente codificación:

RA0-RA2 MONEDA

(0,0,0) NO CONECTADO

(0,0,1) 5 CENTIMOS (0,1,0) 10 CENTIMOS (0,1,1) 20 CENTIMOS (1,0,0) 50 CENTIMOS (1,0,1) 1 EURO

(1,1,0) NO CONECTADO

(1,1,1) NO CONECTADO

Hay que tener en cuenta que después de dar una moneda hay que hacer una pausa, ya que si no, no llegaremos a ver el LED que se enciende y por lo tanto parecerá que no devuelve las monedas. Una vez entregado el cambio, el micro se queda a la espera de introducir una nueva cantidad de cambio. Al mismo tiempo que el micro hace las operaciones explicadas en la máquina, el micro debe sacar por la pantalla del LCD los diversos aparatados que hemos explicado anteriormente. El formato de presentación puede ser el siguiente:

Page 80: Manual

74

S S S S S B B , B B C M

S – El cambio insertado (se deja a elección del programador el formato)

B – Cantidad de dinero a devolver por el cambio (registro ‘CAMBIO’).

Ejemplo en el caso que ‘CAMBIO’ hubiese tenido el valor correspondiente a 3€:

3 0 0 0 3 , 0 0 C M

En el caso de que se introduzcan los 3€ como se guarda en el registro ‘CAMBIO’ 300/5 = 60

6 0 0 3 , 0 0 C M

Page 81: Manual

75

5V

Vpp

RA0

RA1

RA2

RA3

RA4

RA5

Vss

OSC1

OSC2

RC0

RC1

RC2

RC3 RC4

RC5

TX

RX

VSS1

VDD

RB0

RB1

RB2

RB3

RB4

RB5

PGC

PGD

16F876

10nF

5V

22pF

4.7kohm

5V RIBBON_10H

RIBBON_16H

5V

3x10K

Y0

15

Y1

14

Y2

13

Y3

12

Y4

11

Y5

10

Y6

9

Y7

7

A1

B2

C3

G1

6

~G2A

4

~G2B

5

74LS138N

1kOhm

2 3 4 5

1

6 7 8 9

HAY CAMBIO

5V

5V

5 cent 10 cent20 cent50 cent 1€

Fig. 2

Page 82: Manual

76

4.7 Explicación esquema eléctrico

Como se puede ver en el esquema eléctrico (Fig.2) utilizaremos RC<2:0> como salidas para escribir el dato a enviar a la pantalla del LCD y utilizaremos RB<4:3> para controlar RS y E de la pantalla del LCD respectivamente. Para ver el funcionamiento de la pantalla del LCD, ver las características técnicas adjuntadas en las prácticas y el apartado 4.4 Funcionamiento del display. Una posibilidad para controlar el teclado sería RC<3:0> como salida y RB<2:0> como entrada. El funcionamiento sería que al proporcionarle tensión a una de las salidas de RC, si pulsásemos cualquiera de las dos teclas que están conectadas a la columna activada, en RA obtendríamos un ‘1’ ya que comunicaríamos la columna con la fila. Si pulsásemos la misma tecla y la columna no estuviese activada, en RA obtendríamos un ‘0’. Ver apartado 4.3 Funcionamiento del teclado. Para dar las monedas del cambio como se puede ver hay que poner el código correspondiente de las monedas en RA<2:0> para que después lo decodifique el chip 74LS138N y encienda el LED que corresponde.

4.8 Resumen de objetivos

Tenemos que hacer el código para: - Que se reconozcan los pulsadores cuando pulsemos las teclas. - Una vez seleccionada una cantidad de dinero, habrá que pulsar la tecla

‘ACEPTAR’ para confirmar.

- Una vez elegida la cantidad de cambio a devolver, hay que revisar si hay cambio mirando el interruptor conectado en RC<5>.

- A continuación habrá que pasar a la función de devolver cambio, que será la que

tengamos que poder insertar en el resto de prácticas.

- A medida de que se vaya calculando el cambio se irán dando las monedas, encendiendo los LED’s de las monedas a devolver.

- Se tendrán que poner en la pantalla del display la cantidad a dar de cambio, tal y

como se explica en el apartado 4.6 4.9 Objetivos de cocnocimientos - Aprender control de teclado y pantalla LCD - Controlar un decodificador con el µC para emitr señales.

Page 83: Manual

77

4.10 Diagrama de flujo

DAR CAMBIO

CAMBIO>100?SI

N O

FIN

W -> CAMBIO

CAMBIO= CAMBIO -100

DAR SEÑAL DE 1€

CAMBIO= CAMBIO -50

CAMBIO>50?SI

N O

DAR SEÑAL DE 50 Céntimos

CAMBIO= CAMBIO -20

CAMBIO>20?

SI

N O

DAR SEÑAL DE 20 Céntimos

CAMBIO= CAMBIO -10

CAMBIO>10 ?SI

N O

DAR SEÑAL DE 10 Céntimos

MIRAR SI QUEDA

CAMBIO

CAMBIO =0?

N O

SI

DAR SEÑAL DE 5 Céntimos

Como se puede ver, esta sería una posible solución simple para el problema dado.

Page 84: Manual

78

2.6.2.5 Práctica núm.5 Comunicación USART 1

5.1 Equipos y materiales Para realizar la práctica utilizaremos:

• Ordenador PC • Software MPLAB • Teclado de 16 teclas • Display SAMSUNG KS0070 • Cable plano de 16 • “ “ “ 10 • Cable comunicación puerto serie • Kit MPLAB-ICD debuger • PIC 16F876 • Cable para conectar los microcontroladores.

5.2 Descripción del funcionamiento

En esta práctica, la cuál va conjuntamente con la práctica 6, haremos el código

para que dos microcontroladores puedan comunicarse entre sí. Se trata de hacer el programa para unirlo al resto de prácticas a realizar.

Para empezar, deberemos configurar el micro y crear unas funciones para que

sea capaz de detectar cuando se pulsan las teclas del teclado. Esta parte queda a libre elección de diseño, solamente hay que tener en cuenta lo que se explica en el apartado 5.3.

Una vez que detecte las teclas, en esta práctica solamente necesitamos que al

pulsar una tecla, por ejemplo la tecla ‘E’, debería de comenzar a transmitir los datos que hay en la EEPROM de las posiciones que se explican en las bases teóricas (apartado 5.7).

En cualquier momento, este micro puede recibir datos del micro al que está

conectado. Los datos a recibir serán: -Una petición para saber si hay un producto, a lo que tendrá que averiguar el

micro si dicho producto está disponible. -Una petición conforme hay que entregar el producto, a lo que el micro deberá

entregarlo. - Además de las confirmaciones de los datos que se van transmitiendo, que

simplemente será un ‘ACEPTAR’ o ‘CANCELAR’.

A medida que se van enviado los datos de la EEPROM se podría sacar por el display los datos que se van enviando. Ver aparatado 5.5 y 5.6.

Page 85: Manual

79

5.3 Funcionamiento del teclado El teclado nos servirá para dar la orden al micro para que comience a transmitir los

datos de la EEPROM:

1 2 3 F

4 5 6 E

7 8 9 D

A

0

B C

Tabla 1

El teclado consta de una serie de interruptores conectados de la siguiente manera:

Con lo cuál, al pulsar una tecla cerramos el interruptor y comunicamos la fila con la

columna.

B C0A

7 8 9 D

4 5 6 E

1 2 3 F

4x200O

Figura 1

Page 86: Manual

80

5.4 Funcionamiento del display Las pantallas de cristal líquido LCD (Liquid Crystal Display) alfanuméricas se

clasifican según el número de caracteres y líneas que pueden mostrar. Las configuraciones más usuales son de 8x1, 16x1, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2, 40x4. Una gran mayoría de los LCDs están basados en el microcontrolador HITACHI 44780 u otro compatible, de forma que la configuración y manejo es bastante similar en muchos de ellos. El tamaño de los caracteres que muestran son de 5x7 o 5x10 píxels. Permiten modos de interface de 4-bits u 8 bits a µP/µC. Por otro lado muchos también incorporan retro-iluminación por diodos led verde, para facilitar su lectura. Para la conexión de un LCD con un sistema electrónico se disponen generalmente de 14 pins con la siguiente asignación de la Tabla 2. En las pantallas retro-iluminadas se incluyen los terminales A, K, de los leds de iluminación. En el caso de la JM162A, se añaden los pines 15 y 16 con esta funcionalidad, tal y como se muestra en la Fig.2

Tabla 2. Asignación de los pines del JM162A #PIN Nombre Función 1 Vss Masa (0V) 2 Vdd Alimentación (+5V) 3 Vee Contraste (Vss=Vee=Vdd) 4 RS Selección de modo (dato=1/comando=0) 5 R/W Lectura/escritura de comando (lectura=1/ecritura=0) 6 E Enable ( Validación DB<7:0> en flanco 1? 0) 7 DB0 Bit 0 (LSB) de dato 8 DB1 Bit 1 de dato 9 DB2 Bit 2 de dato 10 DB3 Bit 3 de dato 11 DB4 Bit 4 de dato 12 DB5 Bit 5 de dato 13 DB6 Bit 6 de dato 14 DB7 Bit 7 (MSB) de dato 15 A Anodo (+) retro-iluminación 16 K Cátodo (-) retro-iluminación

Figura 2

Page 87: Manual

81

5.5 Protocolo de comunicación Vamos a enviar datos a través de la USART del microcontrolador en modo asíncrono

donde RC7 es RX y RC6 es TX. Estos pines tienen que estar cruzados con los pines del microcontrolador con el que nos queremos comunicar.

Para ello hay que crear un protocolo entre los dos microcontroladores que nos servirá

para que los µC’s se puedan entender entre ellos, ya que si no utilizasen el mismo protocolo sería imposible comunicarse entre ellos ya que representaría como si uno hablase en un idioma y el otro en otro idioma.

Este protocolo se debería crear poniéndose de acuerdo con el compañero que realiza la

práctica 6, que es el que realiza el código del µC con el que tenemos que comunicarnos. Los datos a enviar serán de este tipo:

START BITS <7:0> STOP STOP

Hay que tener en cuenta que es lo que queremos enviar, que será:

o 1 palabra de inicio o 1 palabra de dirección o 1 palabra de dato o 1 palabra de fin

Aparte, por ejemplo se podrían poner unas palabras de control, como puede ser:

o 1 palabra de petición de dato o 1 palabra de petición de dirección o 1 palabra para decir que hemos terminado de enviar un grupo de

datos (una dirección y un dato).

Un ejemplo de protocolo que funciona puede ser este:

CODIGO SIGIFICADO RECIBE 0 0 X X X X X X Preguntar producto

1 0 X X X X X X Pedir producto 0 1 0 0 1 1 1 1 Cancelar 1 1 1 1 0 0 0 0 Aceptar

TRANSMITE X X X X X X X X Dato 0 0 X X X X X X Dirección 0 1 0 1 0 1 0 1 Petición dirección 0 1 1 0 0 1 1 0 Fin de transmisión 1 0 0 1 1 0 0 1 Fin de 1 grupo de datos 1 0 1 0 1 0 1 0 Petición de dato 1 1 1 1 1 1 1 1 Inicio 1 1 1 1 0 0 0 0 Aceptar 0 1 0 0 1 1 1 1 Cancelar

Page 88: Manual

82

5.6 Decodificador de 4 a 7 segmentos En la práctica vamos a utilizar el 74LS47N que es un decodificador de 4 a 7

segmentos. Este chip sirve para convertir el código BCD en código de 7 segmentos que es lo que necesitamos para encender el display de LED’s.

Las conexiones serán como se puede ver en el esquema eléctrico del apartado 5.8. Y la tabla de la verdad del 7447N es:

TABLA DE VERDAD

ENTRADA SEGMENTOS

A1 B1 C1 D1 A B C D E F G

0 0 0 0 1 1 1 1 1 1 0

0 0 0 1 0 1 1 0 0 0 0

0 0 1 0 1 1 0 1 1 0 1

0 0 1 1 1 1 1 1 0 0 1

0 1 0 0 0 1 1 0 0 1 1

0 1 0 1 1 0 1 1 0 1 1

0 1 1 0 0 0 1 1 1 1 1

0 1 1 1 1 1 1 0 0 0 0

1 0 0 0 1 1 1 1 1 1 1

1 0 0 1 1 1 1 0 0 1 1

5.7 Bases teóricas

Como se puede interpretar en la tabla 1 y en el esquema de la Figura 1 , lo que el micro

debe hacer es interpretar las señales de entrada y salida que están conectadas al teclado, con lo cual al pulsar la tecla ‘E’ debería comenzar a enviar los datos de la EEPROM.

Como se necesita modificar los datos de la EEPROM y ya hay la práctica 2 que ya se

encarga de ello. Para facilitar el trabajo en esta práctica, cuando queramos cambiar un valor de la EEPROM utilizaremos el MENU->UTILIDADES->MODIFY del programa M-PLAB y cuando salga la pantalla de modificar seleccionaremos la EEPROM y de este modo podremos leer y escribir datos en la EEPROM.

El micro en esta práctica debería estar esperando a que se pulsase la tecla ‘E’ para comenzar, una vez pulsada la tecla ‘E’ comenzaría el proceso de la transmisión. En la transmisión de la EEPROM solamente hay que transmitir los datos:

de H’00’ hasta H’09’

Page 89: Manual

83

de H’10’ hasta H’19’ de H’20’ hasta H’29’ de H’30’ hasta H’39’ Para ello debemos tener un protocolo de comunicación que está explicado en el

apartado 5.5.

Para la recepción de datos hay que tener en cuenta, como se puede ver en el protocolo del apartado 5.5, que aparte de recibir las confirmaciones de los datos que enviamos, que será justo después de haber enviado uno, recibiremos también en cualquier momento los que nos envía el otro µC.

Los datos que envía el otro µC serán para preguntar si hay un producto, que si es este

caso, lo que tendrá que hacer el micro es revisar el estado del interruptor que está conectado en RC<5> y transmitir al otro micro si hay o no producto, al mismo tiempo que tendremos que sacar por el display de 7 segmentos el número del producto que se pide, colocando los cuatro bits de menos peso del dato recibido en RB<3:0> y los dos bits siguientes el 5 y 6 ponerlos en RA<5:4>, que como se puede ver en el esquema eléctrico (apartado 5.8) RB<3:0> está conectado a un decodificador de 4 a 7 segmentos que nos dará las unidades y al mismo tiempo RA<5:4> también estará conectado a otro decodificador de 4 a 7 segmentos que nos dará las decenas del producto. Ver el apartado 5.6

El otro dato que se puede recibir es la petición de entregar un producto, que en ese

caso, habrá que encender el LED de entregar el producto que esta en RC<4>, al mismo tiempo sacaremos por el display de 7 segmentos el número del producto a entregar de la misma forma que se ha explicado anteriormente.

Habría que asegurarse de que durante la transmisión de la EEPROM , si se recibiese la

‘petición de entregar producto’ o de ‘preguntar si hay producto’ no debería hacer caso a los datos recibidos y seguir con la transmisión de datos.

Cuando esté transmitiendo los datos de la EEPROM se debería sacar por pantalla del LCD la dirección de la EEPROM y el valor de dicha dirección. El formato de presentación puede ser el siguiente:

N N X X I I I I I I

N – La dirección de la EEPROM que estamos enviando X – El valor de dicha dirección

I – ‘OK’ si todo se ha enviado bien o ‘CANCEL’ en el caso de que hubiese habido algún problema

Page 90: Manual

84

7

1

2

6

13

10

9

15

11

12

14

3

5

4

A

B

C

D

LT

RBI

BI/RBO

OA

OB

OC

OD

OE

OF

OG

74LS47N

7

1

2

6

13

10

9

15

11

12

14

3

5

4

A

B

C

D

LT

RBI

BI/RBO

OA

OB

OC

OD

OE

OF

OG

74LS47N

SEVEN_SEG_DISPLAY

ABCDEFG

SEVEN_SEG_DISPLAY

ABCDEFG

5V

HDR1X4

Vpp

RA0

RA1

RA2

RA3

RA4

RA5

Vss

OSC1

OSC2

RC0

RC1

RC2

RC3 RC4

RC5

TX

RX

VSS1

VDD

RB0

RB1

RB2

RB3

RB4

RB5

PGC

PGD

16F876

10nF

LED_red

1.0kohm

HAY PRODUCTO

5V

22pF

4.7kohm

5V

RIBBON_10H

RIBBON_16H

5V

4x10K

5.8 Explicación esquema eléctrico Como se puede ver en el esquema eléctrico (Fig.2) utilizaremos RC<3:0> como salidas

para escribir el dato a enviar a la pantalla del LCD y utilizaremos RB<4:3> para controlar RS y E de la pantalla del LCD respectivamente. Para ver el funcionamiento de la pantalla del LCD, ver las características técnicas adjuntadas en las prácticas y el apartado 5.4 Funcionamiento del display.

Una posibilidad para controlar el teclado sería RC<3:0> como salida y RA<4:3> como entrada. El funcionamiento sería que al proporcionarle tensión a una de las salidas de RC, si pulsásemos cualquiera de las dos teclas que están conectadas a la columna activada, en RA obtendríamos un ‘1’ ya que comunicaríamos la columna con la fila. Si pulsásemos la misma tecla y la columna no estuviese activada, en RA obtendríamos un ‘0’. Ver apartado 5.3 Funcionamiento del teclado.

Fig. 2

Page 91: Manual

85

5.9. Resumen de objetivos

Tenemos que hacer el código para: - Que se reconozcan los pulsadores cuando pulsemos las teclas. - Crear o utilizar el protocolo que hay de ejemplo en el apartado 5.5, quedando de

acuerdo con los compañeros que hacen la práctica 6. - Una vez pulsada una tecla (la ‘ E’ por ejemplo) que comience la transmisión de la

EEPROM con las condiciones explicadas en las bases teóricas (apartado 5.7).

- En la recepción de datos hay que distinguir tres casos:

o Cuando se reciben las confirmaciones de los datos que transmitimos.

o Cuando se recibe la pregunta de si hay un producto, a lo que se deberá revisar si hay un producto tal y como se indica en las bases teóricas

o Cuando se recibe la petición de entregar un producto, a lo que se deberá

entregar el producto tal y como se explica en las bases teóricas.

- Se tendrán que poner en la pantalla de LCD los datos que se explican en el apartado 5.7

5.10. Objetivos de conocimieto - Aprender control de teclado y pantalla LCD - Leer una EEPROM de un microcontrolador

- Control decodificador de BCD a 7 segmentos

- Apreder funcionamiento de USART de un microcontrolador

Page 92: Manual

86

5.11 Diagrama de flujo

ENVIAR INICIOTRANSMISION

TODOCORRECTO?

TECLA ENVIOAPRETADA?

ENVIAR PETICON

DIRECCION

INICIO

SI

NO

ESPERAR TECLA O

RECEPCION

TODOCORRECTO?

ENVIAR DIRECCION

TODOCORRECTO?

TODOCORRECTO?

ENVIAR PETICION

DATO

ENVIAR FINTRANSMISION

ENVIARDATO

TODOCORRECTO?

ULTIMADIRECCION?

CONTINUAMOS?

SI

NO

CONTINUAMOS?

SI

NO

CONTINUAMOS?

SI

NO

CONTINUAMOS?

SI

NO

CONTINUAMOS?

SI

NO

CANELARTRANSMISION

NO

NO

SI

SI

NO

NO

NO

NO

SI

SI

SI

SI

Page 93: Manual

87

ES ACEPTAR?

INICIOITERRUPCION

SI

NO

ES CANCELAR? SI

NO

SI

NO

SI

NO

ES PORRECEPCION?

SE PUIEDECONTINUAR Y ES CORRECTO

SE PUIEDECONTINUAR Y

NO ES CORRECTO

ES PREGUNTARPRODUCTO?

ES PEDIRPRODUCTO?

FININTERRUPCION

PONER DATOEN DISPLAY SEGMENTOS

HAY PRODUCTO?ENVIAR

CANCELAR

ENVIAR ACEPTAR

SE PUIEDECONTINUAR Y

NO ES CORRECTO

SI

NO

NO

SI

Como se puede ver, esta sería una posible solución simple para el problema dado.

Page 94: Manual

88

2.6.2.6 Práctica núm.6 Comunicación USART 2

6.1 Equipos y materiales Para realizar la práctica utilizaremos:

• Ordenador PC • Software MPLAB • Teclado de 16 teclas • Display SAMSUNG KS0070 • Cable plano de 16 • “ “ “ 10 • Cable comunicación puerto serie • Kit MPLAB-ICD debuger • PIC 16F876 • Cable para conectar los microcontroladores.

6.2 Descripción del funcionamiento

En esta práctica haremos el código para que dos microcontroladores puedan

comunicarse entre sí. Esta práctica va en conjunto con la práctica 5 . Se trata de hacer el programa para unirlo al resto de prácticas a realizar.

Para empezar, deberemos configurar el micro y crear unas funciones para que sea

capaz de detectar cuando se pulsan las teclas del teclado. Se debe tener en cuenta el apartado 6.3.

Una vez que detecte las teclas, en esta práctica tendremos que poder introducir un número de dos dígitos comprendidos entre el 00 y el 39 y teclas para aceptar o cancelar .

Una vez se ha dado a la tecla ‘aceptar’ debe comenzar el proceso de comunicación. Lo

que tiene que hacer este micro en el proceso de comunicación, es preguntar si hay producto y en el caso de que halla, debe dar la orden de entregar producto.

En cualquier momento, este micro puede recibir datos del micro al que está conectado.

Los datos a recibir servirán para modificar los datos de la EEPROM.

Se debería sacar por el display el número del dato a enviar y la respuesta cuando lo que hacemos es preguntar si hay producto. Ver apartado 6.6

Page 95: Manual

89

6.3 Funcionamiento del teclado El teclado nos servirá para introducir los dos dígitos del número a enviar, para aceptar

cuando queremos enviar el número introducido y cancelar para borrar el número y empezar de nuevo:

1 2 3 F

4 5 6 E

7 8 9 D

ACEPTAR

0

CANCELAR C

Tabla 1

El teclado consta de una serie de interruptores conectados de la siguiente manera:

Con lo cuál, al pulsar una tecla, cerramos el interruptor y comunicamos la fila con la columna.

B C0A

7 8 9 D

4 5 6 E

1 2 3 F

4x200O Figura 1

Page 96: Manual

90

6.4 Funcionamiento del display Las pantallas de cristal líquido LCD (Liquid Crystal Display) alfanuméricas se

clasifican según el número de caracteres y líneas que pueden mostrar. Las configuraciones más usuales son de 8x1, 16x1, 16x4, 20x2, 20x4, 24x2, 24x4, 40x2, 40x4. Una gran mayoría de los LCDs están basados en el microcontrolador HITACHI 44780 u otro compatible, de forma que la configuración y manejo es bastante similar en muchos de ellos. El tamaño de los caracteres que muestran son de 5x7 o 5x10 píxels. Permiten modos de interface de 4-bits u 8 bits a µP/µC. Por otro lado muchos también incorporan retro-iluminación por diodos led verde, para facilitar su lectura. Para la conexión de un LCD con un sistema electrónico se disponen generalmente de 14 pins con la siguiente asignación de la Tabla 2. En las pantallas retro-iluminadas se incluyen los terminales A, K, de los leds de iluminación. En el caso de la JM162A, se añaden los pines 15 y 16 con esta funcionalidad, tal y como se muestra en la Fig.2

Tabla 2. Asignación de los pines del JM162A #PIN Nombre Función 1 Vss Masa (0V) 2 Vdd Alimentación (+5V) 3 Vee Contraste (Vss=Vee=Vdd) 4 RS Selección de modo (dato=1/comando=0) 5 R/W Lectura/escritura de comando (lectura=1/ecritura=0) 6 E Enable ( Validación DB<7:0> en flanco 1? 0) 7 DB0 Bit 0 (LSB) de dato 8 DB1 Bit 1 de dato 9 DB2 Bit 2 de dato 10 DB3 Bit 3 de dato 11 DB4 Bit 4 de dato 12 DB5 Bit 5 de dato 13 DB6 Bit 6 de dato 14 DB7 Bit 7 (MSB) de dato 15 A Anodo (+) retro-iluminación 16 K Cátodo (-) retro-iluminación

Figura 2

Page 97: Manual

91

6.5 Protocolo de comunicación Vamos a enviar datos a través de la USART del microcontrolador en modo asíncrono

donde RC7 es RX y RC6 es TX. Estos pines tienen que estar cruzados con los pines del microcontrolador con el que nos queremos comunicar.

Para ello hay que crear un protocolo entre los dos microcontroladores que nos servirá

para que los µC’s se puedan entender entre ellos, ya que si no utilizasen el mismo protocolo sería imposible comunicarse entre ellos, ya que representaría como si uno hablase en un idioma y el otro en otro idioma.

Este protocolo se debería crear poniéndose de acuerdo con el compañero que realiza la

práctica 5, que es el que realiza el código del µC con el que tenemos que comunicarnos. Los datos a enviar serán de este tipo:

START BITS <7:0> STOP STOP

Hay que tener en cuenta que es lo que queremos enviar, que será: o 1 palabra de petición de producto o 1 palabra de petición de producto o 1 palabra de cancelar o 1 palabra de aceptar

En la recepción de datos hay muchos datos a recibir y habría que implementar bien la

interrupción para poder cambiar los datos e la EPROM:

o 1 palabra de petición de dato o 1 palabra de petición de dirección o 1 palabra para decir que hemos terminado de enviar un grupo de

datos (una dirección y un dato). o 1 palabra de dato o 1 palabra de dirección o 1 palabra de inicio o 1 palabra de fin o 1 palabra para confirmar que hay producto ‘aceptar’ o 1 palabra para confirmar que no hay producto ‘cancelar’

Un ejemplo de protocolo que funciona puede ser el que está en la siguiente tabla:

CODIGO SIGIFICADO TRANSMITE 0 0 X X X X X X Preguntar producto

1 0 X X X X X X Pedir producto 0 1 0 0 1 1 1 1 Cancelar 1 1 1 1 0 0 0 0 Aceptar

RECIBE X X X X X X X X Dato

Page 98: Manual

92

0 0 X X X X X X Dirección 0 1 0 1 0 1 0 1 Petición dirección 0 1 1 0 0 1 1 0 Fin de transmisión 1 0 0 1 1 0 0 1 Fin de 1 grupo de datos 1 0 1 0 1 0 1 0 Petición de dato 1 1 1 1 1 1 1 1 Inicio 1 1 1 1 0 0 0 0 Aceptar 0 1 0 0 1 1 1 1 Cancelar

6.6 Bases teóricas

Como se puede interpretar en la tabla 1 y en el esquema de la Figura 1, lo que el micro

debe hacer es interpretar las señales de entrada y salida que están conectadas al teclado. Se debería programar para introducir dos dígitos y una vez terminado apretar el botón

aceptar para empezar el proceso de transmisión. El proceso consta de dos pasos. Primero se tiene que enviar el dato escrito y una vez se

reciba la contestación del otro micro, si la respuesta es ‘Aceptar’ se debería volver a enviar el número. Y en el caso de que sea ‘cancelar’ pararíamos el proceso y empezaríamos de nuevo. Para enviar los datos hay que crear un protocolo de comunicación. En el apartado 6.5 hay uno de muestra que puede funcionar en esta práctica, se puede crear uno nuevo o utilizar este, pero siempre quedando de acuerdo con el compañero que realice la práctica 5 debido a que es él el que hace el código para el micro que tiene recibir lo que nosotros enviamos.

Para la recepción de datos hay que tener en cuenta, como se puede ver en el protocolo del aparatado 6.5, que aparte de recibir la confirmación de si hay el producto por el que hemos preguntado, se reciben los datos para modificar los valores de la EEPROM. Para comenzar el cambio de precios en la EEPROM debemos recibir en primer lugar la señal de inicio de cambio de EEPROM. Una vez recibida dicha señal habría que asegurarse que el usuario no puede seleccionar ningún producto por el teclado y si está en proceso de seleccionarlo tendría que parar la selección y volver al inicio de empezar a seleccionar un producto. Una vez hecho esto debería enviar la confirmación para continuar el proceso de cambiar el producto.

A continuación deberíamos ir recibiendo los datos necesarios para poder ir

modificando la EEPROM en el siguiente orden:

• Petición de dirección. • Dirección • Petición de dato • Dato • Fin de grupo de datos

Si todo se va recibiendo en orden se iría respondiendo ‘Aceptar’ al otro µC en cada

palabra enviada, en el caso de que se reciba algún dato cuando no se esperaba se debería cancelar el proceso de modificar los precios y enviar al otro µC la señal de ‘Cancelar’.

Page 99: Manual

93

Se debería sacar por pantalla del LCD el número que queremos enviar y la respuesta que nos da el otro micro:

N N I I I I I I

N – EL valor que estamos enviando I – ‘ACCEPT’ si seguimos el proceso o ‘CANCEL’ si no debe seguir el proceso y empezar el nuevo.

5V

HDR1X4

Vpp

RA0

RA1

RA2

RA3

RA4

RA5

Vss

OSC1

OSC2

RC0

RC1

RC2

RC3 RC4

RC5

TX

RX

VSS1

VDD

RB0

RB1

RB2

RB3

RB4

RB5

PGC

PGD

16F876

10nF

22pF

4.7kohm

5V

RIBBON_10H

RIBBON_16H

3x10K

5V

6.7 Explicación esquema eléctrico Como se puede ver en el esquema eléctrico (Fig.2) utilizaremos RC<3:0> como salidas para escribir el dato a enviar a la pantalla del LCD y utilizaremos RB<4:3> para controlar RS y E de la pantalla del LCD respectivamente. Para ver el funcionamiento de la

Fig. 2

Page 100: Manual

94

paantalla del LCD, ver las características técnicas adjuntadas en las prácticas y el apartado 6.4 Funcionamiento del display. Una posibilidad para controlar el teclado sería RC<3:0> como salida y RB<2:0> como entrada. El funcionamiento sería que al proporcionarle tensión a una de las salidas de RC, si pulsásemos cualquiera de las dos teclas que están conectadas a la columna activada, en RB obtendríamos un ‘1’ ya que comunicaríamos la columna con la fila. Si pulsásemos la misma tecla y la columna no estuviese activada, en RB obtendríamos un ‘0’. Ver apartado 6.3 Funcionamiento del teclado.

6.8 Resumen de objetivos

Tenemos que hacer el código para: - Que se reconozcan los pulsadores cuando pulsemos las teclas. - Crear o utilizar el protocolo que hay de ejemplo en el apartado 6.5, quedando de

acuerdo con los compañeros que hacen la práctica 5. - Una vez seleccionado un número de 2 dígitos y pulsada la tecla ‘aceptar’ comenzar

a transmitir.

- Si la respuesta es positiva volver a enviar el número y si es negativa cancelar el proceso y esperar para comenzar de nuevo.

- La recepción de datos será para cambiar los datos de la EEPROM con lo que a

medida que se reciban las direcciones y los valores se tendrán que ir cambiando dichos valores.

- En el caso de que se reciba la orden de empezar a cambiar los datos de la

EEPROM, que borre el número que hallamos seleccionado o que estemos seleccionando para comenzar de nuevo cuando termine de cambiar los valores de la EEPROM.

- Se tendrán que poner en la pantalla del display los datos que se explican en el

apartado 6.7 6.9. Objetivos de conocimieto - Aprender control de teclado y pantalla LCD - Escribir en una EEPROM de un microcontrolador

- Apreder funcionamiento de USART de un microcontrolador

Page 101: Manual

95

6.10. Diagrama de flujo

INICIO

NO

SE PUEDECONTIMUAR?

NO

SI

SI

ES TECLA

ACEPTAR?

PROCESAR TECLA PARA ALMACENAR

AL NUMERO A ENCIAR

SE HAACEPTADO?

SI

NO

LEER TECLA

ENVIAR DATO

ENVIAR DATO

ES TECLA

CANCELAR?

NO

SI

BORRARNUMERO

INSERTADO

Page 102: Manual

96

ESTAMOS ENMODO PRECIO?

INICIOITERRUPCION

SI

NO

ESPERAMOSPETCION

DIRECCION?

SI

NO

SI

NO

SI

NO

ES PORRECEPCION?

ES CONFIRMACION DE PRODUCTO

ES FIN DE CAMBIO DE

EEPROM

FININTERRUPCION

ES DATO,CAMBIAR EN LA POSICION DE MEMORIA RECIBIDA EL

DATO QU HABIA POR

ESTE RECIBIDO

SI

NO

NO

ES INIICODE CAMBIAR

EEPROM?

NO MIRAR SI HAY PRODUCTO O NO

Y ACTUAR EN CONSECUENCIA

PONER MODO PRECIO Y

CANCELAR PROCESO DE

INSERTAR NUMERO

ES PETICIONDE DIRECCION?

QUITAR MODO PRECIO Y

ACTUALIZAR LOS

REGISTROS

ENVIAR ACEPTAR

NO

SI

ESPERAMOSDIRECCION? ES DIRECCION?

GUARDAR DIRECCION ENVIADA

ENVIAR CANCELAR

ESPERAMOSPETICONDATO?

ES PETICIONDE DATO?

SISI

NO

SI

Como se puede ver, esta sería una posible solución simple para el problema dado.

Page 103: Manual

Memoria descriptiva Programa ASM

97

2.7. Programa ASM 2.7.1. Introducción Vamos a explicar las principales funciones que he diseñado para realizar las diferentes prácticas. Estas se han intentado que sean lo más genéricas posibles para no tener que repetir el mismo código varias veces.

Además, vamos a explicar algunas cosas importantes del programa que son básicas en la programación, como por ejemplo el registro del dinero pagado o el del precio del producto, el número del producto a elegir y algunas funciones básicas. 2.7.2. Módulo1. 2.7.2.1. Visión general. En este módulo lo que tiene que hacer el micro es estar leyendo las teclas de las monedas y de los productos. Mientras no se pulse ninguna tecla, el módulo no hará nada, a no ser que venga una interrupción, pero esto se explicará más adelante. Una vez pulsada una tecla se tiene que revisar cual de los dos teclados se ha pulsado y dependiendo del que se halla pulsado, va a la función de ‘revisar monedero’ o ‘revisar tecla producto’. Si es el caso de monedero iría a la función ‘revisar monedero’. En el caso de ser una tecla de producto, después de ir a ‘revisar tecla producto’ tendrá que mirar si se ha terminado de seleccionar un producto, que esto nos lo indicará la función de ‘revisar tecla producto’. En el caso de que no se haya seleccionado vuelve a esperar una nueva tecla.

En el caso de que sí se haya seleccionado un producto, pasamos a ‘revisar si se ha

pagado’, que simplemente será una resta entre el precio pagado y el precio que cuesta el producto seleccionado y nos indicará si se ha pagado el producto. Si no se ha pagado iremos a ‘anular proceso selección’ en donde se inicia todo y volvemos a esperar una nueva tecla. A continuación si se ha pagado, iremos a ‘revisar si hay producto’ que igual que anteriormente, nos indicará si hay producto o no. Esto se hará mediante la comunicación USART con el otro módulo que nos responderá si hay producto, con lo cual en el caso de que no halla producto, como en el caso del cambio se irá a la función ‘anular proceso selección’ y volverá a esperar una tecla. Si hubiese producto se pasaría a ‘comprobar si hay cambio’ que lo haría mirando el estado del interruptor de cambio, que nos indica si hay cambio o no. Si no hay cambio, se irá a ‘anular proceso de selección’ y en el caso de que halla cambio seguimos el proceso con ‘dar cambio’, que se encargará de dar el cambio del producto si hace falta.

Page 104: Manual

Memoria descriptiva Programa ASM

98

Por último, se iría a ’dar el producto’ e inicializar todos los registros para ir a esperar un nueva tecla y comenzar de nuevo la selección de un producto cuando se vuelva a presionar una nueva tecla.

E S T E C L AM O N E D E R O ?

H A YP R O D U C T O ?

N O

S E H A A P R E T A D OA L G U N A T E C L A ?

S E H A S E L E C C I O N A D O

P R O D U C T O ?

S I

I N I C I O

R E V I S A RS I S E H A P A G A D O

S E H A P A G A D O ?

S I

N O

N O

S I

E S T E C L A D E P R O D U C T O .

R E V I S A R T E C L A P R O D U C T O

N O

S I

M I R A R S I H A Y

P R O D U C T O

A N U L A R P R O D .

S E L E C C .

C A L C U L A R C A M B I O Y R E V I A S R S I

H A Y C A M B I O

N O

S I

H A YC A M B I O ?

N O

S I

D A R C A M B I O

D A R P R O D U C T O

I N I C I A R T O D O S L O S R E G I S T R O S

R E V I S A R M O N E D E R O .

2.7.2.2. Revisar monedero En esta función lo que tiene que hacer el µC, simplemente es mirar si es la tecla cancelar o es una de las monedas. Si es la tecla cancelar se tendría que ir a ’devolver pagado’ y lo único que tiene que hacer es mirar lo que se ha pagado e ir a la función ‘dar cambio’, pero pasando el valor de lo pagado.

Figura 31. Esquema Módulo 1

Page 105: Manual

Memoria descriptiva Programa ASM

99

En el caso de que sea una moneda, se tendría que ir a ‘detectar moneda apretada’ en donde se revisará la moneda pulsada y también se revisaría si sumando la cantidad de la moneda pulsada a lo que llevamos pagado se supera un máximo que fijaremos, en el caso de que no se supere se incrementará la cantidad de pagado y sacamos la nueva cantidad de pagado por la pantalla de LCD. En el caso de que se supere el máximo de lo pagado, se tendría que devolver la última moneda insertada y deberá pasar el valor de dicha moneda a la función ‘dar cambio’.

R E V I S A R M O N E D E R O

I N I C I A R L C D

S ID E V O L V E R

P A G A D O

N O

A C T U A L I Z A RC A N T I D A D D E D IN E R O

P A G A D O

N O

S I

D E V O L V E R Ú L T I M A M O N E D A

I N S E R T A D A

E S C R I B I R N U E V A

C A N T I D A DE N L C D

T E C L AC A N C E L A R ?

S E S U P E R A E L M Á X I M O ?

D E T E C T A R M O N E D A

A P R E T A D A

F I N

2.7.2.3. Revisar producto En esta función miramos que tecla se había pulsado y en el caso de que se hubiese pulsado la tecla ‘cancelar’ se anula la selección que se hubiese hecho y se inicializa el µC para esperar una nueva tecla. A la tecla ‘Aceptar’ solamente se le hará caso en el caso de que se haya seleccionado un producto y activará el registro’prod_seleccionado’.

Figura 32. Esquema revisar mondedero

Page 106: Manual

Memoria descriptiva Programa ASM

100

En el caso de que sea un producto, mirará si ya se han insertado las decenas del producto o no, y en el caso de que no se hallan insertado, pasará la tecla pulsada a las decenas del producto a seleccionar, si ya se habían insertado, el número pulsado es de las unidades con lo cual haría los cálculos para seleccionar el producto y miraría el precio del producto seleccionado y quedaría a la espera de una tecla.

REVISAR TECLA

P R O D U C T O

SI

N O

SI ESCRIBIR EN LCD ‘PROD’ Y EL Nº

D E D E C E N A

ES UNIDAD.ESCRIBIR EN LCD

EL Nº DE LA U N I D A D

N O

T E C L A A P R E T A D A = 0

C A N C E L A R E L PROCESO

SI

SI

N O N O

G U A R D A R V A L O R D E C E N A

P R O D U C T O = D E C E N A + U N I D A D

FIN

TECLAC A N C E L A R ?

TECLAACEPTAR?

P R O D U C T OS E L E C C I O N A D O ?

P R O D U C T O ELEGIDO=1

FALTAND E C E N A S ?

BUSCAR PRECIOD E L P R O D U C T OSELECIONADO

H A Y P R E C I O ?

S A C A R M E N S A J E ERROR POR LCD

M O S T R A R P R E C I O P O R P A N T A L L A

LCD

N O

SI

Figura 33. Esquema revisar producto

Page 107: Manual

Memoria descriptiva Programa ASM

101

2.7.2.4. Dar cambio Esta función sirve para calcular las monedas a dar por el µC para dar el cambio, devolver el dinero pagado o devolver la última moneda pagada en el caso de se haya excedido el dinero introducido. Lo que se hace es pasar la cantidad de dinero que queremos devolver a través de W del µC y a partir de ahí vamos haciendo comparaciones con la moneda que queremos devolver de la de mayor valor a la de menor. En este caso la moneda de mayor valor será la de 1€ y no la de 2€ como a la hora de pagar. Cuando se detecte que hay que entregar una moneda se deberá encender el LED que corresponde a dicha moneda.

D A R C A M B I O

C A M B I O > 1 0 0 ?S I

N O

FIN

W -> CAMBIO

C A M B I O = C A M B I O -100

D A R S E Ñ A L D E 1€

C A M B I O = C A M B I O -50

C A M B I O > 5 0 ?S I

N O

D A R S E Ñ A L D E 50 Céntimos

C A M B I O = C A M B I O -20

C A M B I O > 2 0 ?

S I

N O

D A R S E Ñ A L D E 20 Céntimos

C A M B I O = C A M B I O -10

C A M B I O > 1 0 ?SI

N O

D A R S E Ñ A L D E 10 Cént imos

M IRAR SI Q U E D A

C A M B I O

C A M B I O =0?

N O

SI

D A R S E Ñ A L D E 5 Cént imos

Figura 34. Esquema dar cambio

Page 108: Manual

Memoria descriptiva Programa ASM

102

2.7.2.5. Interrupción En la interrupción, primero hay que diferenciar si estamos esperando datos para modificar la EEPROM o no. En el caso de que no estemos esperando datos para modificar la EEPROM, miraremos si es la confirmación de si hay producto y lo que tiene que hacer es activar los registros de que ha recibido comunicación. En el caso de que no hubiese producto daría una señal de error. También puede pasar que recibamos el inicio de la transmisión de la EEPROM, con lo cual pondríamos el µC en modo recepción, se anularía el producto seleccionado y se esperaría al siguiente dato. En el caso de estar en el modo precio, iríamos esperando a que se fuesen enviando los datos, comprobando que van llegando en el orden que tocan y cambiando los datos de la EEPROM de las direcciones que van llegando.

E S T A M O S E NM O D O P R E C I O ?

IN T E R R U P C IÓ N

S I

N O

E S P E R A M O SP E T C I O N

D I R E C C I O N ?

S I

N O

S I

N O

S I

N O

E S P O RR E C E P C I O N ?

E S C O N F I R M A C I O N

D E P R O D U C T O

E S F I N D E C A M B I O D E

E E P R O M

FININ T E R R U P C IO N

E S D A T O ,C A M B I A R E N L A P O S I C I O N D E M E M O R I A R E C I B I D A E L

D A T O Q U E H A B I A P O R

E S T E R E C I B I D O

S I

N O

N O

E S I N I I C OD E C A M B I A R

E E P R O M ?

N O M I R A R S I H A Y P R O D U C T O O N O

Y A C T U A R E N C O N S E C U E N C I A

P O N E R M O D O P R E C I O Y

C A N C E L A R P R O C E S O D E

I N S E R T A R N U M E R O

E S P E T I C I O ND E D I R E C C I O N ?

Q U I T A R M O D O P R E C I O Y

A C T U A L I Z A R L O S

R E G I S T R O S

E N V I A R A C E P T A R

N O

S I

E S P E R A M O SD I R E C C I O N ?

E S D I R E C C I O N ?G U A R D A R

D I R E C C I O N E N V I A D A

E N V I A R C A N C E L A R

E S P E R A M O SP E T I C O ND A T O ?

E S P E T I C I O ND E D A T O ?

S IS I

N O

S I

Figura 35. Esquema interrupción Módulo 1

Page 109: Manual

Memoria descriptiva Programa ASM

103

2.7.3. Módulo 2 2.7.3.1. Visión general

En este módulo lo que se hace es esperar que se pulse una tecla y una vez pulsada se revisa si es la tela ‘enviar’, en el caso de que sea se iría a la función enviar producto. Si no es la tecla enviar, se revisa si es la tecla aceptar que en el caso que se haya introducido un nuevo precio a un producto lo que tendría que hacer es cambiar el precio en la EEPROM de dicho producto. Si no se hubiese puesto un nuevo precio no haría nada el µC y seguiría esperando una nueva tecla. Si es una tecla numérica iría a la función para seleccionar un producto o para introducir un nuevo precio.

IN I C I O

S I

T E C L AA P R E T A D A ?

T E S T E A R T E C L A D O

L A T E C L A E S ‘ C A N C E L A R ’ ?

N O

I N I C I A R R E G I S T R O S Y E S C R I B I R C A N C E L E N

D I S P L A Y

N O

I N I C I A R D I S P L A Y

S I

N O

E S L A T E C L A D E E N V I A R ?

E N V I A R P R O D U C T O

S I

N O

S E L E C C I O N A R P R O D U C T O O

P R E C I O

L A T E C L A E S ‘ A C E P T A R ’ ?

M O D I F I C A RP R E C I O E N

E E P R O M

S I P R E C I OIN T R O D U C I D O = 1 ?

S I

N O

Figura 36. Esquema Módulo 2

Page 110: Manual

Memoria descriptiva Programa ASM

104

2.7.3.2. Seleccionar producto o precio En esta función miramos primero si ya se había seleccionado un producto, si no se ha elegido vamos a la función ‘elegir producto’. Si ya se había seleccionado un producto es para poner el precio nuevo del producto, lo único que hay que tener en cuenta que la primera vez que se introduzca un número del precio de un producto se tiene que activar el registro de ‘precio_introducido’ de tal forma que podamos pulsar la tecla aceptar al terminar.

SELECCIONAR PRODUCTO O PRECIO

NO

PRODUCTOELEGIDO=1?

SI

PRECIO INTRODUCIDO=1?

ELEGIRPRDUCTO

SI

ESCRIBIR TECLA EN DISPLAY

HACERCALCULOS

Y PRECIO INTRODUCIDO=1

ESCRIBIR TECLA EN DISPLAY

HACERCALCULOS

NO

FIN

2.7.3.3. Elegir producto Habrá que seleccionar el producto al cual le queremos cambiar el precio, para ello igual que en el módulo 1 primero habrá que introducir las decenas y después las unidades del producto por eso lo primero que hace es revisar si ya se han insertado las decenas. En el caso

Figura 37. Esquema seleccionar producto o precio

Page 111: Manual

Memoria descriptiva Programa ASM

105

de que ya se hubiese insertado, el número pulsado sería la unidad con lo que tendría que hacer los procesos para guardar el número del producto y activar el registro de ‘producto seleccionado’. En el caso de que no se hubiese insertado las decenas tendría que mirar si la tecla pulsada no supera el número 3 ya que no hay productos por encima del número 39. A continuación, si no supera el número 3 tiene que calcular para pasar el número a decena.

E S C R I B I R T E C L A E N D I S P L A Y

D E C E N A SIN T R O D U C I D A S = 1 ?

B U S C A R P R E C I O P R O D U C T O

E S C R I B I R P R E C I O E N

D S P L A Y

P R O D U C T O E L E G I D O = 1Y

D E C E N A S IN T R O D U C I D A S = 0

E L E G I R P R O D U C T O

FIN

T E C L A > 3 ?

E S C R I B I R T E C L A E N D I S P L A Y

C A L C U L A R L A D E C E N A D E L

P R O D U C T O

S I

N O

N O

S I

D E C E N A SIN T R O D U C I D A S = 1

2.7.3.4. Enviar EEPROM En esta función se tienen que enviar los datos para modificar la EEPROM en el otro módulo y para ello comienza mandando una petición para iniciar el proceso de cambio de EEPROM. Una vez confirmado por el otro módulo, comienza a enviar por este orden: petición de dirección, dirección petición de dato, dato. Una vez terminado se mira si era la última dirección y si no vuelve a enviarlo todo. Una vez llegada a la última dirección se envía ‘fin de comunicación’.

Figura 38. Esquema elegir producto

Page 112: Manual

Memoria descriptiva Programa ASM

106

E N V I A R I N I C I OT R A N S M I S I O N

T O D OC O R R E C T O ?

E N V I A R P E T I C O N

D I R E C C I O N

E N V I A R E E P R O M

SI

T O D OC O R R E C T O ?

E N V I A R D I R E C C I O N

T O D OC O R R E C T O ?

T O D OC O R R E C T O ?

E N V I A R P E T I C I O N

D A T O

E N V I A R F I NT R A N S M I S I O N

E N V I A RD A T O

T O D OC O R R E C T O ?

U L T I M AD I R E C C I O N ?

C O N T I N U A M O S ?

S I

N O

C O N T I N U A M O S ?

S I

N O

C O N T I N U A M O S ?

S I

N O

C O N T I N U A M O S ?

SI

N O

C O N T I N U A M O S ?

SI

N O

C A N E L A RT R A N S M I S I O N

N O

N O

S I

S I

N O

N O

N O

N O

SI

SI

SI

S I

FIN

2.7.3.5. Interrupción En esta interrupción recibiremos las confirmaciones para continuar el proceso de transmitir los datos de la EEPROM. Aparte de esto, también recibimos la pregunta por si hay un producto, que en ese caso tiene que revisar el estado si hay el producto mirando el interruptor de producto que está en RC<4> y también recibe la orden de dar producto, en la cual tiene que encender el LED de RC<5>. En los dos casos, tiene que encender en el display de 7 segmentos el número del producto enviado por el módulo 1.

Figura 39. Esquema enviar EEPROM

Page 113: Manual

Memoria descriptiva Programa ASM

107

ES ACEPTAR?

INICIOITERRUPCION

SI

NO

ES CANCELAR? SI

NO

SI

NO

SI

NO

ES PORRECEPCION?

SE PUEDECONTINUAR Y ES CORRECTO

SE PUEDECONTINUAR Y

NO ES CORRECTO

ES PREGUNTARPRODUCTO?

ES PEDIRPRODUCTO?

FININTERRUPCION

PONER DATOEN DISPLAY SEGMENTOS

HAY PRODUCTO?ENVIAR

CANCELAR

ENVIAR ACEPTAR

PONER DATOEN DISPLAY

SEGMENTOS Y ENCENDER

LED DE ENTREGAR PRODUCTO

SI

NO

NO

SI

2.7.4. Datos de interés 2.7.4.1. Registros de dinero

Para los registros de dinero hay que tener en cuenta que lo haremos en un registro, que como todos los registros del micro son de 8 bits, su escala irá de 0 a 255 céntimos. Entonces, para poder superar los 255 céntimos introducidos, como la cantidad de dinero insertado es siempre múltiple de 5 debido a que la moneda más pequeña será la de 5 céntimos, vamos a guardar en el micro las cantidades de dinero dividiendo entre 5 el valor real, como se explica en el siguiente ejemplo:

Figura 40. Esquema interrupción

Page 114: Manual

Memoria descriptiva Programa ASM

108

Dinero insertado(€) Valor en registro ‘PAGADO’

2,00 40 12,00 240 0,75 15 0,05 1 1,25 25 12,75 255

Con lo cual podemos guardar en 1 registro 1275 céntimos. Aunque existen otros sistemas, como por ejemplo guardarlo en 2 registros, utilizaremos este sistema para hacer compatible el registro con el resto de las prácticas. 2.7.4.2. Clasificación de los productos

Para nuestra práctica solamente vamos a utilizar 40 valores de esta E2PROM y la distribución podría ser por ejemplo:

H’00’ → H’09’ H’10’ → H’19’ H’20’ → H’29’ H’30’ → H’39’ De esta forma al buscar un precio de un producto podemos pensar en decimal y no

tener que trabajar en hexadecimal. Un motivo es que el display de 7 segmentos solamente lo tenemos configurado para sacar números del 0 al 39. Otro motivo es que al introducir el precio lo hacemos en decimal con lo que nos ahorramos una conversión de decimal a hexadecimal y viceversa. Ejemplo:

Producto 12 → D’12’ →H’C’

2.7.4.3. Función ‘Escribir_LCD’ Esta función sirve para todas las instrucciones de la pantalla de LCD que sean menores de 39µseg. Para que funcione se tiene que pasar a través del registro ‘Letra’ el código ASCII de la letra a escribir y poner el bit del RS en el valor que le corresponde, dependiendo de si queremos escribir o hacer otra cosa con la pantalla de LCD, antes de pasar a la función ‘Escribir_LCD’ Esta función simplemente coge el registro ‘Letra’ y le va haciendo las operaciones que corresponden para pasar el valor a la pantalla de LCD y que esta ejecute la instrucción que se pasa.

Tabla 7. Ejemplo registro de dinero

Page 115: Manual

Memoria descriptiva Programa ASM

109

2.7.4.4. Función ‘Clear_display’ Es igual que la función anterior de ‘Escribir_LCD’ pero con la diferencia que esta es para funciones de 1.53mseg que son la de clear display y return home. 2.7.4.5. Función ‘EE_escribe’ Esta función sirve para escribir en la EEPROM del µC. El funcionamiento es que simplemente hay que pasarle la dirección de la EEPROM que queremos escribir a través del registro ‘DIREC’ y pasarle el dato a escribir en la EEPROM a través del registro ‘DATO’. 2.7.4.6. Función ‘EE_LEE’ Esta función sirve para leer los datos de la EEPROM del µC. Para leer los datos solamente hay que pasar la dirección de la EEPROM al registro ’DIREC’ y a continuación llamar a la función. El dato de la EEPROM se guarda en el registro de ‘DATO’.

Page 116: Manual

Memoria de cálculo

110

3.MEMORIA DE CÁLCULO.

Page 117: Manual

Memoria de cálculo Cálculos de los esquemas eléctricos

111

3.1. Cálculos de los esquemas eléctricos Para la placa base solamente vamos a calcular las resistencias de los LED’s que vamos a colocar para las diferentes utilidades. El esquema modelo será el siguiente ya que la tensión máxima en el circuito será de 5V y todos los LED’s estarán conectados entre esos 5V y 0 V del circuito:

V15V

R1

LED_blueLED1

Para calcular la resistencia tendremos que la caída de tensión en el LED será de 2V y como máximo pueden pasar 5mA por el diodo por lo tato:

Ω=−

=−

= 6005

251

mAVV

IVV

R LEDDD (1)

Cualquier resistencia superior a esta nos permite que no se pase la intensidad de los 5mA por lo tanto he puesto resistencias de 1KΩ que son las más comunes y son las que he encontrado del modelo SIP.

Figura 41. Esquema eléctrico de LED

Page 118: Manual

Memoria de cálculo Cálculos del programa ASM

112

3.2. Cálculos del programa ASM Los únicos cálculos que haremos en el programa serán de los tiempos de espera que se necesita para hacer funcionar la pantalla de LCD, que como se puede ver en el apartado 2.3.2.3 en la Tabla 2’ Juego instrucciones de la pantalla LCD’, se necesitan 39µs para las instrucciones de escribir y algunas otras como la de situar el cursor. Para la instrucción de limpiar pantalla y la de volver al inicio el cursor, se necesita un tiempo de 1,53 ms. Por lo tanto como hemos realizado una función genérica para todas las instrucciones que tienen el mismo tiempo tenemos: Utilizamos la función del TIMER0 del µC en la cual el tiempo de espera será:

NTMRTt OSCESPERA ×−××= )0(4 (2) En la fórmula 2, N es el pre-scaler del registro ‘OPTION-REG’ 1:N, que en nuestro

caso será 8 y OSCT es el periodo de oscilación que es la inversa de la frecuencia de oscilación de 4MHz que tenemos en el µC. Con lo cual tenemos:

)0(88)0(4

14)0(4 TMRsTMR

MHzNTMRTt OSCESPERA −×=×−××=×−××= µ (3)

*Función ‘ESCRIBIR_LCD’ para las funciones de 39µs:

En este caso con este pre-scaler tenemos:

5875.4839

)0(

39)0(88)0(4

14)0(4

===−

⇒=−×=×−××=×−××=

ss

TMR

sTMRsTMRMHz

NTMRTt OSCESPERA

µµ

µµ

Con lo cual necesitaríamos poner como mínimo el TMR0 a –5 que eso es en

hexadecimal con 8 bits el FB, con lo cual el código será: movlw 0x02 movwf OPTION_REG ;pre-scaler 1:8

movlw 0xFB ;Timer 0 a -4 movwf TMR0 t1 btfsc TMR0,7 goto t1 movlw 0x00 ;pre-scaler 1:2 movwf OPTION_REG return

(4)

Page 119: Manual

Memoria de cálculo Cálculos del programa ASM

113

*Función ‘CLEAR_DISPLAY’ para las funciones de 1.53 ms:

En este caso con este pre-scaler tenemos:

19225,191853.1

)0(

53.1)0(88)0(4

14)0(4

===−

⇒=−×=×−××=×−××=

sms

TMR

msTMRsTMRMHz

NTMRTt OSCESPERA

µ

µ

Con lo cual necesitaríamos poner como mínimo el TMR0 a -192 que eso es en hexadecimal con 8 bits el 40 con lo cual el código será:

movlw 0x02 movwf OPTION_REG ;pre-scaler 1:8

movlw 0x40 ;Timer 0 a -192 movwf TMR0 t1 btfsc TMR0,7 goto t1 movlw 0x00 ;pre-scaler 1:2 movwf OPTION_REG return

(5)

Page 120: Manual

Presupuesto

114

4. PRESUPUESTO

Page 121: Manual

Presupuesto Lista de elementos

115

4.1. Lista de elementos En este apartado sacaremos la lista de elementos necesarios para hacer la placa base de

los diferentes módulos de prácticas.

4.1.1. Lista elementos del módulo 1

CODIGO DESCRIPCIÓN CANTIDAD 1.1 Regleta de conexiones 2 contactos 1 1.2 LED rojo 5mm 2 1.3 LED verde 5mm 5 1.4 Condensador electrolítico 47 uF. 25V 1 1.5 Condensador Poliéster 100 nF 400V. raster 2 1.6 Condensador Poliéster 22 nF 400V. raster 1 1.7 Condensador Poliéster 10 nF 400V. raster 1 1.8 Estabilizador de tensión positiva LM7805 1 1.9 Resistencia 1K ohmios 1/4 watio 6 1.10 Resistencia 10K ohmios 1/4 watio 3 1.11 Resistencia 4,7K ohmios 1/4 watio 1 1.12 banana paso 4mm negra 1 1.13 banana paso 4mm roja 1 1.14 Cable paralelo 2x1mm 0,40m 1.15 Diodo rectificador estándar 1,5 Am 1 1.16 Conector macho para CI 2,54mm 4 pines 1

1.17 Conector macho C/I para cable plano 10 hilos 1 metro 2

1.18 Conector macho C/I para cable plano 16 hilos 1 metro 1

1.19 Zócalo torneado 28 pines estrecho 1 1.20 Zócalo 16 pines 1 1.21 Placa fotosensible baquelita.1,2 mm 100x160 mm 1 1.22 74LS138N 3-line to 8-line decoder / demultiplexer 1 1.23 Horas de montaje 5 1.24 Resistencia array 8+1 1k ohmios 1

Tabla 8. Lista elementos módulo 1

Page 122: Manual

Presupuesto Lista de elementos

116

4.1.2. Lista elementos del módulo 2

CODIGO DESCRIPCIÓN CANTIDAD 2.1 Regleta de conexiones 2 contactos 1 2.2 LED rojo 5mm 2 2.3 Condensador electrolítico 47 uF. 25V 1 2.4 Condensador Poliéster 100 nF 400V. raster 2 2.5 Condensador Poliéster 22 nF 400V. raster 1 2.6 Condensador Poliéster 10 nF 400V. raster 1 2.7 Estabilizador de tensión positiva LM7805 1 2.8 Resistencia 1K ohmios 1/4 watio 16 2.9 Resistencia 10K ohmios 1/4 watio 4 2.10 Resistencia 4,7K ohmios 1/4 watio 1 2.11 banana paso 4mm negra 1 2.12 banana paso 4mm roja 1 2.13 Cable paralelo 2x1mm 0,40m 2.14 Diodo rectificador estándar 1,5 Am 1 2.15 Conector macho para CI 2,54mm 4 pines 1

2.16 Conector macho C/I para cable plano 10 hilos 1 metro 1

2.17 Conector macho C/I para cable plano 16 hilos 1 metro 1

2.18 Placa fotosensible baquelita.1,2 mm 100x160 mm 1 2.19 Zócalo torneado 28 pines estrecho 1 2.20 Zócalo 16 pines 2

2.21 74LS47N BCD-to-Seven-Segment Decoders/Drivers 2

2.22 Horas de montaje 5

2.23 Display ánodo común 13x19 color rojo 3000-8000 mcd 2

Tabla 9. Lista elementos módulo 2

Page 123: Manual

Presupuesto Lista de precios unitarios

117

4.2. Lista de precios unitarios En este apartado ponemos los precios de cada elemento de cada placa.

4.2.1. Lista de precios unitarios de elementos del módulo 1

CODIGO DESCRIPCIÓN PRECIO 1.1 Regleta de conexiones 2 contactos 0.22 € 1.2 LED rojo 5mm 0.09 € 1.3 LED verde 5mm 0.09 € 1.4 Condensador electrolítico 47 uF. 25V 0.13 € 1.5 Condensador Poliéster 100 nF 400V. raster 0.19 € 1.6 Condensador Poliéster 22 nF 400V. raster 0.16 € 1.7 Condensador Poliéster 10 nF 400V. raster 0.15 € 1.8 Estabilizador de tensión positiva LM7805 0.29 € 1.9 Resistencia 1K ohmios 1/4 watio 0.0187 €

1.10 Resistencia 10K ohmios 1/4 watio 0.0187 € 1.11 Resistencia 4,7K ohmios 1/4 watio 0.0187 € 1.12 banana paso 4mm negra 0.87 € 1.13 banana paso 4mm roja 0.87 € 1.14 Cable paralelo 2x1mm 0.60/m€ 1.15 Diodo rectificador estándar 1,5 Am 0.057 € 1.16 Conector macho para CI 2,54mm 4 pines 0.10 €

1.17 Conector macho C/I para cable plano 10 hilos 1 metro 0.16 €

1.18 Conector macho C/I para cable plano 16 hilos 1 metro 0.28 €

1.19 Zócalo torneado 28 pines estrecho 0.51 € 1.20 Zócalo 16 pines 0.12 € 1.21 Placa fotosensible baquelita.1,2 mm 100x160 mm 0.32 € 1.22 74LS138N 3-line to 8-line decoder / demultiplexer 0.91 € 1.23 Horas de montaje 15.00 €/h 1.24 Resistencia array 8+1 1k ohmios 0.18 €

Tabla 10. Lista precios unitarios elementos módulo 1

Page 124: Manual

Presupuesto Lista de precios unitarios

118

4.2.2. Lista de precios unitarios de elementos del módulo 2

CODIGO DESCRIPCIÓN PRECIO 2.1 Regleta de conexiones 2 contactos 0.22 € 2.2 LED rojo 5mm 0.09 € 2.3 Condensador electrolítico 47 uF. 25V 0.13 € 2.4 Condensador Poliéster 100 nF 400V. raster 0.19 € 2.5 Condensador Poliéster 22 nF 400V. raster 0.16 € 2.6 Condensador Poliéster 10 nF 400V. raster 0.15 € 2.7 Estabilizador de tensión positiva LM7805 0.29 € 2.8 Resistencia 1K ohmios 1/4 watio 0.0187 € 2.9 Resistencia 10K ohmios 1/4 watio 0.0187 €

2.10 Resistencia 4,7K ohmios 1/4 watio 0.0187 € 2.11 banana paso 4mm negra 0.87 € 2.12 banana paso 4mm roja 0.87 € 2.13 Cable paralelo 2x1mm 0.60/m€ 2.14 Diodo rectificador estándar 1,5 Am 0.057 € 2.15 Conector macho para CI 2,54mm 4 pines 0.10 €

2.16 Conector macho C/I para cable plano 10 hilos 1 metro 0.16 €

2.17 Conector macho C/I para cable plano 16 hilos 1 metro 0.28 €

2.18 Placa fotosensible baquelita.1,2 mm 100x160 mm 3.22 € 2.19 Zócalo torneado 28 pines estrecho 0.51 € 2.20 Zócalo 16 pines 0.12 € 2.21 74LS47N BCD-to-Seven-Segment Decoders/Drivers 0.49 € 2.22 Horas de montaje 15.00 €/h

2.23 Display ánodo común 13x19 color rojo 3000-8000 mcd 1.51 €

Tabla 11. Lista de precios unitarios de elementos del módulo 2

Page 125: Manual

Presupuesto Coste total

119

4.3. Coste total Aquí unimos las cantidades y los precios unitarios para sacar el precio total de cada módulo. 4.3.1. Coste total del módulo 1 CODIGO DESCRIPCIÓN CANTIDAD PRECIO TOTAL

1.1 Regleta de conexiones 2 contactos 1 0.22 € 0.22 € 1.2 LED rojo 5mm 2 0.09 € 0.18 € 1.3 LED verde 5mm 5 0.09 € 0.45 €

1.4 Condensador electrolítico 47 uF. 25V 1 0.13 € 0.13 €

1.5 Condensador Poliéster 100 nF 400V. raster 2 0.19 € 0.38 €

1.6 Condensador Poliéster 22 nF 400V. raster 1 0.16 € 0.16 €

1.7 Condensador Poliéster 10 nF 400V. raster 1 0.15 € 0.15 €

1.8 Estabilizador de tensión positiva LM7805 1 0.29 € 0.29 €

1.9 Resistencia 1K ohmios 1/4 watio 6 0.0187 € 0.11 € 1.10 Resistencia 10K ohmios 1/4 watio 3 0.0187 € 0.06 € 1.11 Resistencia 4,7K ohmios 1/4 watio 1 0.0187 € 0.02 € 1.12 banana paso 4mm negra 1 0.87 € 0.87 € 1.13 banana paso 4mm roja 1 0.87 € 0.87 € 1.14 Cable paralelo 2x1mm 0,40m 0.60/m€ 0.24 € 1.15 Diodo rectificador estándar 1,5 Am 1 0.057 € 0.06 €

1.16 Conector macho para CI 2,54mm 4 pines 1 0.10 € 0.10 €

1.17 Conector macho C/I para cable plano 10 hilos 1 metro 2 0.16 € 0.32 €

1.18 Conector macho C/I para cable plano 16 hilos 1 metro 1 0.28 € 0.28 €

1.19 Zócalo torneado 28 pines estrecho 1 0.51 € 0.51 € 1.20 Zócalo 16 pines 1 0.12 € 0.12 €

1.21 Placa fotosensible baquelita.1,2 mm 100x160 mm 1 0.32 € 0.32 €

1.22 74LS138N 3-line to 8-line decoder / demultiplexer 1 0.91 € 0.91 €

1.23 Horas de montaje 5 15.00 €/h 75.00 € 1.24 Resistencia array 8+1 1k ohmios 1 0.18 € 0.18 €

TOTAL 81.92 €

Tabla 12. Coste total del módulo 1

Page 126: Manual

Presupuesto Coste total

120

4.3.2. Coste total del módulo 2

CODIGO DESCRIPCIÓN CANTIDAD PRECIO TOTAL 2.1 Regleta de conexiones 2 contactos 1 0.22 € 0.22 € 2.2 LED rojo 5mm 2 0.09 € 0.18 € 2.3 Condensador electrolítico 47 uF. 25V 1 0.13 € 0.13 €

2.4 Condensador Poliéster 100 nF 400V. raster 2 0.19 € 0.38 €

2.5 Condensador Poliéster 22 nF 400V. raster 1 0.16 € 0.16 € 2.6 Condensador Poliéster 10 nF 400V. raster 1 0.15 € 0.15 € 2.7 Estabilizador de tensión positiva LM7805 1 0.29 € 0.29 € 2.8 Resistencia 1K ohmios 1/4 watio 16 0.0187 € 0.30 € 2.9 Resistencia 10K ohmios 1/4 watio 4 0.0187 € 0.07 € 2.10 Resistencia 4,7K ohmios 1/4 watio 1 0.0187 € 0.02 € 2.11 banana paso 4mm negra 1 0.87 € 0.87 € 2.12 banana paso 4mm roja 1 0.87 € 0.87 € 2.13 Cable paralelo 2x1mm 0,40m 0.60/m€ 0.24 € 2.14 Diodo rectificador estándar 1,5 Am 1 0.057 € 0.06 € 2.15 Conector macho para CI 2,54mm 4 pines 1 0.10 € 0.10 €

2.16 Conector macho C/I para cable plano 10 hilos 1 metro 1 0.16 € 0.16 €

2.17 Conector macho C/I para cable plano 16 hilos 1 metro 1 0.28 € 0.28 €

2.18 Placa fotosensible baquelita.1,2 mm 100x160 mm 1 3.22 € 3.22 €

2.19 Zócalo torneado 28 pines estrecho 1 0.51 € 0.51 € 2.20 Zócalo 16 pines 2 0.12 € 0.24 €

2.21 74LS47N BCD-to-Seven-Segment Decoders/Drivers 2 0.49 € 0.98 €

2.22 Horas de montaje 5 15.00 €/h 75.00 €

2.23 Display ánodo común 13x19 color rojo 3000-8000 mcd 2 1.51 € 3.02 €

TOTAL 87.45 €

Tabla 13. Coste total del módulo 2

Page 127: Manual

Presupuesto Resumen del presupuesto

121

4.4. Resumen del presupuesto Aquí pongo el precio de lo que costaría el total de realizar los módulos para las prácticas para los diferentes grupos. Se han pensado 8 unidades del módulo 1 debido a que hay 4 prácticas en las que se utiliza este módulo y 4 unidades del módulo 2, ya que como antes hay 2 prácticas que utilizan este módulo.

ELEMENTO UNIDADES PRECIO TOTAL MÓDULO 1 8 81.92 € 655.36 € MÓDULO 2 4 87.45 € 349.80 €

TOTAL 1,005.19 € IVA 16% 160.83 € TOTAL CON IVA 1,166.02 € No incluyo los ordenadores, ni los kits del MPLAB-ICD, teclados y pantallas de LCD, debido a que ya están en los laboratorios de pruebas y no es necesario comprar estos elementos ya que se pueden aprovechar.

Tabla 14. Resumen presupuesto

Page 128: Manual

Planos

122

5. PLANOS

Page 129: Manual

Planos Esquemas de elementos

123

En este aparatado se exponen los esquemas eléctricos de los elementos que componen las prácticas. A continuación los esquemas de cada módulo con los esquemas de sus respectivas prácticas y el esquema final de todo el módulo completo.

5.1 . Esquemas de elementos

Aquí ponemos los esquemas de los elementos independientes de las prácticas que

vamos a realizar.

5.1.1. Esquema Regulador fuente tensión

Vreg

U1LM7805CT

IN OUT

R11.0kohmC3

100nFC147uF

C2100nF

J1

HDR1X2

LED_red

LED1

5.1.2. Esquema del 74LS47

U1

SEVEN_SEG_DISPLAY

A B C D E F G

U2

SEVEN_SEG_DISPLAY

A B C D E F G

R1

1.0kohmR2

1.0kohmR3

1.0kohmR4

1.0kohmR5

1.0kohmR6

1.0kohmR7

1.0kohm

R8

1.0kohmR9

1.0kohmR10

1.0kohmR11

1.0kohmR12

1.0kohmR13

1.0kohmR14

1.0kohm

7126

1310915 11

1214

354

ABCDLT

RB

I

BI/R

BO OA

OB

OC

OD

OE

OF

OG

74LS47NU3

7126

1310915 11

1214

354

ABCDLT

RB

I

BI/R

BO OA

OB

OC

OD

OE

OF

OG

74LS47NU4

RA3RA45V

VDD

5VVDD

RB2

RB3

RB1

RB0

Figura 42. Esquema regulador fuente tensión

Figura 43. Esquema del 74LS47

Page 130: Manual

Planos Esquemas de elementos

124

5.1.3. Esquema del 74LS138

Y015

Y114

Y213

Y312

Y411

Y510

Y69

Y77

A1

B2

C3

G16

~G2A4

~G2B5

U1

74LS138N

RA0

RA1

RA3

5V

LED_green5 centimos

LED_green10 centimos

LED_green20 centimos

LED_green50 centimos

LED_green1 euro

R1

4.7kOhm

23

45

1

67

89

5VVDD

5.1.4. Esquema comunicación USART

J1

HDR1X4

TX

RX

Figura 44. Esquema del 74LS138

Figura 45. Esquema comunicación USART

Page 131: Manual

Planos Esquemas de elementos

125

5.1.5. Conector teclado

En este apartado se indican las conexiones de los tres teclados que hay en nuestros módulos: 5.1.5.1.Teclado producto

J1

HDR2X5

RB0

RC0

RC2

RB1

RC1

RC3

R110kohm

R210kohm

RB2

R310kohm

5.1.5.2. Teclado monedero

J1

HDR2X5

RA3

RC0

RC2

RA4

RC1

RC3

R110kohm

R210kohm

Figura 46. Teclado producto

Figura 47. Teclado monedero

Page 132: Manual

Planos Esquemas de elementos

126

5.1.5.3. Teclado precio

J1

HDR2X5

RA0

RC0

RC2

RA1

RC1

RC3

R110kohm

R210kohm

RA2

R310kohm

RA3

R410kohm

5.1.6. Esquema conector pantalla LCD 5.1.6.1. LCD modulo 1

J1

RIBBON_16H

VCC

RC0

RC2

RC1

RC3

RB3

RB4

5.1.6.2. LCD modulo 2

J1

RIBBON_16H

VCC

RC0

RC2

RC1

RC3

RB4

RB5

Figura 48. Teclado precio

Figura 49. LCD módulo 1

Figura 50. LCD módulo 2

Page 133: Manual

Planos Esquemas Prácticas Modulo 1

127

5.2 Esquemas Prácticas Módulo 1 5.2.1. Esquemas Práctica 1

5V

Vpp

RA0

RA1

RA2

RA3

RA4

RA5

Vss

OSC1

OSC2

RC0

RC1

RC2

RC3 RC4

RC5

TX

RX

VSS1

VDD

RB0

RB1

RB2

RB3

RB4

RB5

PGC

PGD

16F876

10nF

22pF

4.7kohm

5V

RIBBON_16H

RIBBON_10H

5V

2x10K

Figura 51. Esquema práctica 1

Page 134: Manual

Planos Esquemas Prácticas Modulo 1

128

5.2.2. Esquemas Práctica 3

5V

Vpp

RA0

RA1

RA2

RA3

RA4

RA5

Vss

OSC1

OSC2

RC0

RC1

RC2

RC3 RC4

RC5

TX

RX

VSS1

VDD

RB0

RB1

RB2

RB3

RB4

RB5

PGC

PGD

16F876

10nF

ENTREGA PRODUCTO

1.0kohm

HAY PRODUCTO

5V

22pF

4.7kohm

5V RIBBON_10H

RIBBON_16H

3x10K

HAY CAMBIO

5V

Figura 52. Esquema práctica 3

Page 135: Manual

Planos Esquemas Prácticas Modulo 1

129

5.2.3. Esquemas Práctica 4

5V

Vpp

RA0

RA1

RA2

RA3

RA4

RA5

Vss

OSC1

OSC2

RC0

RC1

RC2

RC3 RC4

RC5

TX

RX

VSS1

VDD

RB0

RB1

RB2

RB3

RB4

RB5

PGC

PGD

16F876

10nF

5V

22pF

4.7kohm

5V RIBBON_10H

RIBBON_16H

5V

3x10K

Y0

15

Y1

14

Y2

13

Y3

12

Y4

11

Y5

10

Y6

9

Y7

7

A1

B2

C3

G1

6

~G2A

4

~G2B

5

74LS138N

1kOhm

2 3 4 5

1

6 7 8 9

HAY CAMBIO

5V

5V

5 cent 10 cent20 cent50 cent 1€

Figura 53. Esquema práctica 4

Page 136: Manual

Planos Esquemas Prácticas Modulo 1

130

5.2.4. Esquemas Práctica 6

5V

HDR1X4

Vpp

RA0

RA1

RA2

RA3

RA4

RA5

Vss

OSC1

OSC2

RC0

RC1

RC2

RC3 RC4

RC5

TX

RX

VSS1

VDD

RB0

RB1

RB2

RB3

RB4

RB5

PGC

PGD

16F876

10nF

22pF

4.7kohm

5V

RIBBON_10H

RIBBON_16H

3x10K

5V

Figura 54. Esquema práctica 6

Page 137: Manual

Planos Esquemas Prácticas Modulo 1

131

5.2.5. Esquema general

5V

HDR1X4

Vpp

RA0

RA1

RA2

RA3

RA4

RA5

Vss

OSC1

OSC2

RC0

RC1

RC2

RC3 RC4

RC5

TX

RX

VSS1

VDD

RB0

RB1

RB2

RB3

RB4

RB5

PGC

PGD

16F876

10nF

ENTREGA PRODUCTO

1.0kohm

HAY PRODUCTO

5V

22pF

4.7kohm

5V

RIBBON_10H

RIBBON_16H

5V

3x10K

RIBBON_10H

Y0

15

Y1

14

Y2

13

Y3

12

Y4

11

Y5

10

Y6

9

Y7

7

A1

B2

C3

G1

6

~G2A

4

~G2B

5

74LS138N

1kOhm

2 3 4 5

1

6 7 8 9

HAY CAMBIO

5V

2x10K

5V

5 cent 10 cent20 cent50 cent 1€

Figura 55. Esquema general

Page 138: Manual

Planos Esquemas Prácticas Modulo 1

132

5.2.6. Diseño placa base

Figura 56. Diseño placa base

Page 139: Manual

Planos Esquemas Práctica Módulo 2

133

5.3. Esquemas Práctica Módulo 2 5.3.1 Esquemas Práctica 2

5V

Vpp

RA0

RA1

RA2

RA3

RA4

RA5

Vss

OSC1

OSC2

RC0

RC1

RC2

RC3 RC4

RC5

TX

RX

VSS1

VDD

RB0

RB1

RB2

RB3

RB4

RB5

PGC

PGD

16F876

10nF22pF

4.7kohm

5V RIBBON_10H

RIBBON_16H

5V

4x10K

5.3.2. Esquemas Práctica 5 y módulo 2

7

1

2

6

13

10

9

15

11

12

14

3

5

4

A

B

C

D

LT

RBI

BI/RBO

OA

OB

OC

OD

OE

OF

OG

74LS47N

7

1

2

6

13

10

9

15

11

12

14

3

5

4

A

B

C

D

LT

RBI

BI/RBO

OA

OB

OC

OD

OE

OF

OG

74LS47N

SEVEN_SEG_DISPLAY

A B C D E F G

SEVEN_SEG_DISPLAY

A B C D E F G5V

HDR1X4

Vpp

RA0

RA1

RA2

RA3

RA4

RA5

Vss

OSC1

OSC2

RC0

RC1

RC2

RC3 RC4

RC5

TX

RX

VSS1

VDD

RB0

RB1

RB2

RB3

RB4

RB5

PGC

PGD

16F876

10nF

LED_red

1.0kohm

HAY PRODUCTO

5V

22pF

4.7kohm

5V

RIBBON_10H

RIBBON_16H

5V

4x10K

Figura 58. Esquema práctica 2

Figura 59. Esquema práctica 5 y módulo 2

Page 140: Manual

Planos Esquemas Práctica Módulo 2

134

5.3.3. Diseño placa base

Figura 60. Diseño placa base

Page 141: Manual

ANEXOS

Page 142: Manual

Anexo Programa ASM de práctica 1

I

A. Lista de códigos de programa A.1 Módulo 1 A.1.1. Programa ASM de práctica 1

include "p16f877.inc" ;registros de proposito general rmoneda equ 0x40 ;valor de la tecla apretada rprecio equ 0x42 ;precio producto tapreta equ 0x43 ;registro para saber si tecla esta apretda r1 equ 0x50 ;Guardamos la columna elegida r2 equ 0x51 ;guardamos la fila elegida mas_fil equ 0x52 ;se guarda la mascara de la fila modetect equ 0x54 ;moneda a enviar rmonaux equ 0x58 ;reg para calcular las decenas en precio pagado equ 0x59 ;reg de la cantidad pagada digito equ 0x5b ;reg aux para el digito a pasar al LCD a traves de ;letra ret equ 0x60 ;para hacer el retardo letra equ 0x61 ;reg para escribir en LCD letraux equ 0x5a ;reg aux para escr precios en LCD lauxil equ 0x62 ;reg auxiliar para escribir moneda pausa equ 0x63 ;reg auxiliar para hacer pausa cambio equ 0x34 ;el cambio a dar pausa2 equ 0x38 ;otro reg para pausa aux equ 0x39 ;reg auxiliar aux2 equ 0x3a ;reg auxiliar2 ;Rutina principal org 0x00 Inicio call iniciar_LCD ;vamos a rutina para iniciar la pantalla LCD call conf_tec ;vamos a rutina para dar vlaores a las teclas call conf_mic ;vamos a rutina para configurar el micro buckle nop call ver_moneda btfsc tapreta,1 ;mira si hay una tecla apretada y si no es asi mira call detectmoneda ;la ocion del teclado si no va a volver a mirar el goto buckle ;LCD ;rutina para iniciar el LCD iniciar_LCD banksel TRISA movlw 0xF0 movwf TRISC ;RC<0:4> SALIDAS RC<5:7> entradas para RX y TX movlw 0x07 movwf TRISB ;RB<0:2> entradas RC<3:7> salidas

Page 143: Manual

Anexo Programa ASM de práctica 1

II

movlw 0x18 movwf TRISA ;RA<0:2> SALIDAS RA <3:4> entradas movlw 0x83 ;ponemos el pre-escaler a 1:16 movwf OPTION_REG banksel PORTA clrf PORTA ;ponemos la instrucción FUCTION SET call RS0 call E1 movlw 0x02 movwf PORTC call E0 call retardo movlw 0x2F movwf letra call escribir_LCD call retardo movlw 0x0f ;ponemos la instrucción DISPLAY ON/OFF control movwf letra call escribir_LCD call retardo movlw 0x01 ;ponemos la instrucción CLEAR_DISPLAY movwf letra call clear_display call retardo call RS0 ;ponemos la instrucción ENTRY MODE SET movlw 0x06 movwf letra call escribir_LCD call retardo call RS1 return ;fin de la inicialización del LCD ;asignamos cada valor del teclado a un registro conf_tec movlw 1 ;tecla 1 movwf 0x20 movlw 2 ;tecla 2 movwf 0x21 movlw 3 ;tecla 3 movwf 0x22 movlw 0xc ;tecla f movwf 0x23 movlw 4 ;tecla 4 movwf 0x24 movlw 5 ;tecla 5 movwf 0x25 movlw 6 ;tecla 6 movwf 0x26 movlw 0xd ;tecla e movwf 0x27 movlw 7 ;tecla 7 movwf 0x28 movlw 8 ;tecla 8 movwf 0x29 movlw 9 ;tecla 9 movwf 0x2a movlw 0xe ;tecla d

Page 144: Manual

Anexo Programa ASM de práctica 1

III

movwf 0x2b movlw 0xa ;tecla a movwf 0x2c movlw 0 ;tecla 0 movwf 0x2d movlw 0xb ;tecla b movwf 0x2e movlw 0xf ;tecla c movwf 0x2f return ;Configuracion del micro conf_mic banksel ADCON1 ;cogemos el banco de memoria 1 movlw 0x7 movwf ADCON1 ;salidas digitales movlw 0x87 movwf OPTION_REG ;preescaler a 256 banksel PORTC ; banco 0 clrf r1 clrf r2 clrf pagado clrf tapreta ;inicializa el valor del reg. de valor de tecla clrf rmoneda ;inicializa el valor del reg. de la tecla apretada clrf rprecio ;inicializamos el valor del reg. de precio call mens_inicio ;sacamos por pantalla el mens. de inicio return ;vamos dando un '1' a las columnas para ir comprobando si la tecla esta apretada ver_moneda movlw 0x1 movwf PORTC clrf r1 ;guardamos 0 en r1 para saber q estamos en la columna 1 call rev_fila ;vamos a mirar las filas una por una movlw 0x2 movwf PORTC movlw 0x04 movwf r1 ;guardamos 1 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas movlw 0x4 movwf PORTC movlw 0x08 movwf r1 ;guardamos 1 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas movlw 0x8 movwf PORTC movlw D'12' movwf r1 ;guardamos 1 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas return ;volvemos al principio rev_fila

Page 145: Manual

Anexo Programa ASM de práctica 1

IV

clrf r2 ;ponemos 0 para saber que es la fila 1 movlw 0x08 movwf mas_fil ;guardamos mascara para comprobar despues btfsc PORTA,3 ;miramos si la fila 1 esta a 0 para mirar ;numero si no es asi seguimos call ret_tecl_moneda btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return movlw 0x10 movwf r2 ;ponemos el valor 4 para saber q es la fila 2 movwf mas_fil ;volvemos a guardar mascara btfsc PORTA,4 ;comprobamos bit 1 para saber ;si la tecla de la fila esta activada call ret_tecl_moneda return ;en esta rutina hacemos un pequeño retardo para los rebotes ;buckle para saber que tecla del monedro está apretada. ret_tecl_moneda movlw 0x0F movwf ret ;actualizamos el registro para el retardo buck_re2

decfsz ret,f ;se va decrementando ret hasta q volvemos a goto buck_re2 ; comprobar el PORTC movf PORTA,w andwf mas_fil,w ;hace una and entre la mascara guardada y W si el ;resultado es diferente de 0 es q la tecla btfsc STATUS,Z ;esta pulsada para mirarlo si el flag Z del

return ; STATUS esta a 0 es q la tecla se pulso si no es ;asi seguimos con el programa

;aqui calculamos la tecla apretada en el monedero most_num2 clrw addwf r1,w ;sumamos los valores de r1 y r2 para saber la tetcla addwf r2,f ; apretada rrf r2,f ;rotamos 2 veces el valor de r2 para que nos coincida rrf r2,w ; el valor de r2 con el numero del registro de tecla

addlw 0x20 ; guardado movwf FSR ;movemos el valor a FSR para acceso indirecto movf INDF,w movwf rmoneda ;guardamos el resultado de la tecla

bsf tapreta,1 ;poenmos a '1' el registro de tapreta para saber ;si hay tecla apretada

;buckle para saber si la tecla deja de ser apretada sol_tec2 movf PORTA,w andwf mas_fil,w ;volvemos a utilizar la mascara para saber si la btfss STATUS,Z ;tecla sigue apretada hasta q el flag Z no este goto sol_tec ;acticado no saldra del buckle return ;------------------------------------------------------------------------ ;rutina para detectar moneda detectmoneda

Page 146: Manual

Anexo Programa ASM de práctica 1

V

movf rmoneda,w btfsc rmoneda,3 ;si la tecla es menor de 8 saltamos goto mirarsiopcion ;si la tecla es mayor de 8 vamos a ver si movf rmoneda,w ;es la tecla de cancelar movwf modetect ;pasamos la moneda detectada al registro y call detect_moneda ;vamos a detectarla return Dev_pagado movf pagado,w call dev_dinero ;pasamos la cantidad de dinero pagada al W clrf pagado ;para que la funcion dev_dinero devuelva call mens_inicio ;dicho dinero y ponemos a 0 la cantidad clrf tapreta ; pagada return detect_moneda btfsc modetect,2 ;si la tecla es < de 4 saltamos

goto detec_50_100_200 ;si la tecla es > de 4 es la moneda 50 100 o ;200 cent

btfsc modetect,1 ;si la tecla es < de 2 saltamos goto detec_10y20 ;si la tecla es > de 2 es la moneda 10 o 20

;cent movf modetect,w ;aqui ya sabemos que es la moneda de 5 cent goto fin_detect detec_10y20 btfsc modetect,0 ;diferenciamos entre la moneda de 10 y 20 cent si goto detect_20 ;es la la tecla 2 es la moneda de 10 y por lo movlw D'2' ;tanto en pagado habrá que incrementar el valor

goto fin_detect ;de '2' detect_20 movlw D'4' ;aqui sabemos que es la moneda de 20 cent y habrá goto fin_detect ;que incrementar en '4' el valor de pagado detec_50_100_200 btfsc modetect,1 ;diferenciamos entre las monedas de 50 100 y 200 goto detec_200 ; centimos btfsc modetect,0 goto detec_100 movlw D'10' ;si es la tecla 4 llegará hasta aqui y sabremos goto fin_detect ;que es la moneda de 50 cent por lo tanto ;incrementamos en '10' pagado detec_200 movlw D'40' ;aqui sabemos que es la moneda de 200 cent y goto fin_detect ;habrá que incrementar en '40' el valor de pagado detec_100 movlw D'20' ;aqui sabemos que es la moneda de 100 cent y goto fin_detect ;habrá que incrementar en '20' el valor de pagado fin_detect ;a esta función las anteriores le pasan por el W el ;valor a incrementar el registro pagado movwf aux ;lo que vamos a añadir se pone en aux por si hemos addwf pagado ;metido más monedas de la cuenta

Page 147: Manual

Anexo Programa ASM de práctica 1

VI

btfsc STATUS,C goto exceso_de_dinero ;en el caso de haber pasado el tope se irá call RS0 ;a esta función movlw 0x2 ;pasamos este valor para hacer un return home en movwf letra ;el LCD call clear_display movf pagado,w ;iniciamos registros clrf digito clrf tapreta call pasar_a_LCD ;y escribimos lo pagado en la pantalla de LCD call escribir_PG ;despues del valor de lo pagado escribimos PG en return ; el LCD exceso_de_dinero movf aux,w ;en el caso de exceso de dinero devovlemos la moneda subwf pagado,f ;insertada y restamos la ultima moneda al registro call dev_dinero ;pagado clrf tapreta ;inciamos registro de tecla apretada para esperar la return ; proxima tecla mirarsiopcion ;Aqui revisamos si es cancelar y devolver lo pagado btfss rmoneda,0 call Dev_pagado ;Aqui se ha cancelado y se devolveria lo pagado fin clrf tapreta ;iniciamos registros clrf rmoneda return ;-------------------------------------------------------------- pasar_a_LCD movwf letraux clrf digito b_millares ;para saber si hay más de 10 euros metidos movlw D'200' subwf letraux btfss STATUS,C goto millar_no movlw 1 addwf digito goto millar_si millar_no movlw D'200' ;este es solo en caso q sea + de 10 euros addwf letraux millar_si movf digito,w addlw 0x30 movwf letra call escribir_LCD clrf digito b_centenas ;calculo las centenas de lo que he metido movlw D'20' subwf letraux btfss STATUS,C

Page 148: Manual

Anexo Programa ASM de práctica 1

VII

goto centenas movlw 1 addwf digito goto b_centenas centenas ;envio las centenas movlw D'20' addwf letraux movf digito,w addlw 0x30 movwf letra call escribir_LCD movlw 0x2c ;escribo una coma para separar euros de centimos movwf letra call escribir_LCD clrf digito b_decenas ;y calculo decenas movlw D'2' subwf letraux btfss STATUS,C goto unidades movlw 1 addwf digito goto b_decenas unidades movf digito,w ;envio decenas addlw 0x30 movwf letra call escribir_LCD movlw D'2' addwf letraux movlw 0x30 btfsc letraux,0 ;calculo y envio unidades movlw 0x35 movwf letra call escribir_LCD clrf letraux return ;--------------------------------------------------------------------- dev_dinero ;esta rutina será la que tenga que hacer el de la practica 4 nop ;en esta práctica no hará nada return ;------------------------------------------------------------------------ mens_inicio movlw 0x1 ;limpiamos la pantalla movwf letra call clear_display movf pagado,w ;pasamos el valor de lo pagado al W para que la call pasar_a_LCD ; función pasar_a_LCD nos saque lo pagado por el call escribir_PG ; LCDescribimos PG después return escribir_PG movlw 0x50 ;letra P movwf letra

Page 149: Manual

Anexo Programa ASM de práctica 1

VIII

call escribir_LCD movlw 0x47 ;letra G movwf letra call escribir_LCD return clear_display ;función para las instruciones de 1,53ms de la banksel TRISB ;pantalla de LCD movlw 0x87 movwf OPTION_REG banksel PORTA call RS0 call E1 clrf PORTC call E0

call E1 movf letra,w

movwf PORTC call E0 movlw 0x80 movwf TMR0 t0 btfsc TMR0,7 goto t0 call RS1 banksel TRISA movlw 0x83 movwf OPTION_REG banksel PORTA return escribir_LCD ;función para las instruccion de 49us de la pantalla LCD call E1 movf letra,w andlw 0xf0 movwf lauxil swapf lauxil,w movwf PORTC call E0 call E1 movlw 0x0f andwf letra,w movwf PORTC call E0 movlw 0xFC movwf TMR0 t1 btfsc TMR0,7 goto t1 return E0 ;función para poner la entrada E del LCD a '0' bcf PORTB,4 return E1 ;función para poner la entrada E del LCD a '1' bsf PORTB,4 return RS0 ;función para poner la entrada RS del LCD a '0' bcf PORTB,3

Page 150: Manual

Anexo Programa ASM de práctica 1

IX

return RS1 ;función para poner la entrada RS del LCD a '1' bsf PORTB,3 return limpiar_LCD ;función para dejar la pantalla sin nada call RS0 ;aqui hariamos un RETURN HOME movlw 0x02 movwf letra call clear_display movlw 0x01 ;aqui harimaos un CLEAR DISPLAY movwf letra call clear_display return ;-------------------------------------------------------------------------- retardo ;funciones para retardos este sería cortito movlw 0xFF movwf pausa retm decfsz pausa goto retm return retardo_largo ;funcón para un retardo un poco más largo que el anterior movlw 0xFF movwf pausa2 ret_l1 movlw 0xFF movwf pausa ret_l2 banksel TRISB banksel PORTB decfsz pausa goto ret_l2 decfsz pausa2 goto ret_l1 return end

Page 151: Manual

Anexo Programa ASM de práctica 3

X

A.1.2. Programa ASM de práctica 3

include "p16f877.inc" ;registros de proposito general rmoneda equ 0x40 ;valor de la tecla apretada tapreta equ 0x41 ;ponemos a '1' si la tecla a sido apretada rprecio equ 0x42 ;precio producto r1 equ 0x50 ;Guardamos la columna elegida r2 equ 0x51 ;guardamos la fila elegida mas_fil equ 0x52 ;se guarda la mascara de la fila lim_tec equ 0x55 ;reg. para saber q tiene q detectar 2 teclas en

;producto num_prod equ 0x56 ;registro del numero del producto rmonaux equ 0x58 ;reg para calcular las decenas en precio pagado equ 0x59 ;reg de la cantidad pagada digito equ 0x5b ;reg aux para el digito a pasar al LCD a traves de

;letra ret equ 0x60 ;para hacer el retardo letra equ 0x61 ;reg para escribir en LCD letraux equ 0x5a ;reg aux para escr precios en LCD lauxil equ 0x62 ;reg auxiliar para escribir moneda pausa equ 0x63 ;reg auxiliar para hacer pausa al dar moneda DATO equ 0x30 ;dato de eprom DIREC equ 0x31 ;direcion eprom err_prod equ 0x32 ;si el producto existe o hay cambio contador equ 0x33 ;contador para escribir '#' si no hay precio prod_elegido equ 0x36 ;para saber si se ha elegido el producto decenas equ 0x37 ;guardamos las decenas de los productos pausa2 equ 0x38 ;otro reg para pausa aux equ 0x39 ;reg auxiliar aux2 equ 0x3a ;reg auxiliar2 esp_prec equ 0x3b ;para mover el cursor en le precio producto equ 0x3c ;donde guardamos el numero del producto ;Rutina principal org 0x00 Inicio call iniciar_LCD ;vamos a rutina para iniciar la pantalla LCD call conf_tec ;vamos a rutina para dar vlaores a las teclas call conf_mic ;vamos a rutina para configurar el micro buckle nop ;se mira si se a apretado una tela de producto call ver_moneda btfss tapreta,0 goto buckle call pedir_prod ;va al aparatado de elegir producto goto buckle ;rutina para iniciar el LCD iniciar_LCD banksel TRISA

Page 152: Manual

Anexo Programa ASM de práctica 3

XI

movlw 0xF0 movwf TRISC ;RC<0:4> SALIDAS RC<5:7> entradas para RX y TX movlw 0x07 movwf TRISB ;RB<0:2> entradas RC<3:7> salidas movlw 0x18 movwf TRISA ;RA<0:2> SALIDAS RA <3:4> entradas movlw 0x83 ;ponemos el pre-escaler a 1:16 movwf OPTION_REG banksel PORTA clrf PORTA ;ponemos la instrucción FUCTION SET call RS0 call E1 movlw 0x02 movwf PORTC call E0 call retardo movlw 0x2F movwf letra call escribir_LCD call retardo movlw 0x0f ;ponemos la instrucción DISPLAY ON/OFF control movwf letra call escribir_LCD call retardo movlw 0x01 ;ponemos la instrucción CLEAR_DISPLAY movwf letra call clear_display call retardo call RS0 ;ponemos la instrucción ENTRY MODE SET movlw 0x06 movwf letra call escribir_LCD call retardo call RS1 return ;fin de la inicialización del LCD ;asignamos cada valor del teclado a un registro conf_tec movlw 1 ;tecla 1 movwf 0x20 movlw 2 ;tecla 2 movwf 0x21 movlw 3 ;tecla 3 movwf 0x22 movlw 0xc ;tecla f movwf 0x23 movlw 4 ;tecla 4 movwf 0x24 movlw 5 ;tecla 5 movwf 0x25 movlw 6 ;tecla 6 movwf 0x26 movlw 0xd ;tecla e movwf 0x27 movlw 7 ;tecla 7 movwf 0x28 movlw 8 ;tecla 8

Page 153: Manual

Anexo Programa ASM de práctica 3

XII

movwf 0x29 movlw 9 ;tecla 9 movwf 0x2a movlw 0xe ;tecla d movwf 0x2b movlw 0xa ;tecla a movwf 0x2c movlw 0 ;tecla 0 movwf 0x2d movlw 0xb ;tecla b movwf 0x2e movlw 0xf ;tecla c movwf 0x2f return ;Configuracion del micro conf_mic banksel ADCON1 ;cogemos el banco de memoria 1 movlw 0x7 movwf ADCON1 ;salidas digitales movlw 0x87 movwf OPTION_REG ;preescaler a 256 banksel PORTC ; banco 0 clrf r1 ;iicializamos registros clrf r2 clrf tapreta clrf rprecio clrf num_prod clrf rmoneda clrf decenas clrf prod_elegido bsf lim_tec,0 clrf err_prod banksel EECON1 ;esto es para configurar la EEPROM bcf EECON1,EEPGD ;ponemos en modo ecritura de datos banksel PORTB ;volvemos al primer banco call mens_inicio call op_a_producto ;para iniciar registros en modo pedir producto return ;vamos dando un '1' a las columnas para ir comprobando si la tecla esta ;apretada ver_moneda movlw 0x1 movwf PORTC clrf r1 ;guardamos 0 en r1 para saber q estamos en la columna 1 call rev_fila ;vamos a mirar las filas una por una movlw 0x2 movwf PORTC movlw 0x04 movwf r1 ;guardamos 1 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas movlw 0x4 movwf PORTC movlw 0x08

Page 154: Manual

Anexo Programa ASM de práctica 3

XIII

movwf r1 ;guardamos 1 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas movlw 0x8 movwf PORTC movlw D'12' movwf r1 ;guardamos 1 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas return ;volvemos al prinicipio rev_fila btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return clrf r2 ;ponemos 0 para saber que es la fila 1 movlw 0x01 movwf mas_fil ;guardamos mascara para comprobar despues btfsc PORTB,0 ;miramos si la fila 1 esta a 0 para mirar ;numero si no es asi seguimos call ret_tcl_producto btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return movlw 0x01 movwf r2 ;ponemos el valor 4 para saber q es la fila 2 movlw 0x02 movwf mas_fil ;volvemos a guardar mascara btfsc PORTB,1 ;comprobamos bit 1 para saber ;si la tecla de la fila esta activada call ret_tcl_producto btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return movlw 0x02 ;guardamos el valor 8 para la fila 3 movwf r2 movlw 0x04 movwf mas_fil btfsc PORTB,2 call ret_tcl_producto btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return ;en esta rutina hacemos un pequeño retardo para los rebotes ret_tcl_producto movlw 0x0F movwf ret ;actualizamos el registro para el retardo buck_re

decfsz ret,f ;se va decrementando ret hasta q volvemos a goto buck_re ;comprobar el PORTB movf PORTB,w andwf mas_fil,w ;hacemos una and entre la mascara guardada y W

;si el resultado es diferente de 0 es q la tecla ;esta pulsada

Page 155: Manual

Anexo Programa ASM de práctica 3

XIV

btfsc STATUS,Z ;para mirarlo si el flag Z del STATUS esta a 0 es q return ;la tecla se pulso si no es asi seguimos con el

;programa ;aqui calculamos la tecla apretada most_num clrw addwf r1,w ;sumamos r1 y r2 para despues saber el valor de addwf r2,w ;la tecla apretada addlw 0x20 movwf FSR ;movemos el valor a FSR para acceso indirecto movf INDF,w movwf rmoneda ;guardamos el resultado de la tecla

bsf tapreta,0 ;se pone a '1' tapreta para saber que hay tecla ;apretada

;buckle para saber si la tecla deja de ser apretada sol_tec

movf PORTB,w andwf mas_fil,w ;volvemos a utilizar la mascara para saber si la btfss STATUS,Z ; tecla sigue apretada hasta q el flag Z no este goto sol_tec ; acticado no saldra del buckle return ;-------------------------------------------------------------- pasar_a_LCD movwf letraux clrf digito b_millares ;para saber si hay más de 10 euros metidos movlw D'200' subwf letraux btfss STATUS,C goto millar_no movlw 1 addwf digito goto millar_si millar_no movlw D'200' ;este es solo en caso q sea + de 10 euros addwf letraux millar_si movf digito,w addlw 0x30 movwf letra call escribir_LCD clrf digito b_centenas ;calculo las centenas de lo que he metido movlw D'20' subwf letraux btfss STATUS,C goto centenas movlw 1 addwf digito goto b_centenas

Page 156: Manual

Anexo Programa ASM de práctica 3

XV

centenas ;envio las centenas movlw D'20' addwf letraux movf digito,w addlw 0x30 movwf letra call escribir_LCD movlw 0x2c ;escribo una coma para separar euros de centimos movwf letra call escribir_LCD clrf digito b_decenas ;y calculo decenas movlw D'2' subwf letraux btfss STATUS,C goto unidades movlw 1 addwf digito goto b_decenas unidades movf digito,w ;envio decenas addlw 0x30 movwf letra call escribir_LCD movlw D'2' addwf letraux movlw 0x30 btfsc letraux,0 ;calculo y envio unidades movlw 0x35 movwf letra call escribir_LCD clrf letraux return ;-------------------------------------------------------------------------- ;rutina para elegir producto pedir_prod call elegir_prod ;vamos a elegir el producto y cuando volvemos btfss prod_elegido,0 ;si se a terminado de elegir continuamos si no return ;esperamos otra tecla rev_prod btfsc err_prod,0 ;miramos que no hayamos cogido un producto que goto esc_err_prec ;no tiene precio si es así vamos mostrar el error call det_si_prod ;revismos si hay producto si no lo hay iremos a btfsc err_prod,1 ;mostrar el error y no dar goto no_dar call RS0 ;ponemos el display en 1ª linea movlw 2 movwf letra call escribir_LCD call RS1 call det_si_cambio ;mirarmos si hay que dar cambio y si hay cambio bcf STATUS,Z movlw 0xF

Page 157: Manual

Anexo Programa ASM de práctica 3

XVI

andwf err_prod btfss STATUS,Z goto no_dar ;si a avido algún problema vamos a no dar producto call retardo_largo call dar_producto ;todo correcto damos el producto y hacemos pausas call retardo_largo call retardo_largo call retardo_largo call retardo_largo clrf pagado call mens_inicio ;inicializamos LCD y registros y esperamos nueva movlw 0x1 ;seleccion de producto subwf lim_tec call iniciar_regs call op_a_producto return ;-----------------fin del cuerpo de pedir producto------------------------ comprobar_precio ;rutina para comprobar si se ha pagado prod movf DATO,w btfsc STATUS,Z goto no_precio movf DATO,w call pasar_a_LCD movlw 0x24 ;ponemos E despues de precio movwf letra call escribir_LCD return no_precio ;por si no hay precio bsf err_prod,0 call escribir_ERROR return esc_err_prec ;rutina para salir por error en el precio call retardo_largo call no_dar ;vamos a o dar el producto e inicializamos clrf tapreta ;registros clrf err_prod clrf decenas call mens_inicio return det_si_cambio ;para ver si hay que dar cambio y si se ha pagado bcf STATUS,C ;el producto bcf STATUS,Z movf DATO,w subwf pagado,w btfss STATUS,C goto sin_dinero ;esto es en el caso de haberse pagado el producto btfss STATUS,Z call detect_cambio return sin_dinero ;si no se ha pagado producto pasamos el error a err_prod bsf err_prod,2 return

Page 158: Manual

Anexo Programa ASM de práctica 3

XVII

no_dar ;función donde se procesan los errores y son se da el call no_pagado ;producto por que a avido algún fallo s inicializan clrf decenas ;los registros para comenzanzar de nuevo clrf err_prod clrf tapreta movlw 0x10 movwf aux buck_ret call retardo_largo decfsz aux goto buck_ret call mens_inicio nop return detect_cambio ;para detectar cambio miramos el interruptor que hay en btfsc PORTC,5 ;RB5 (0 no prod, 1 si prod) y guardaremos en err_prod si bsf err_prod,3 ;no hay prod. return dar_producto ;son las funciones que tiene que hacer para dar producto call dar_cambio call entregar_producto call retardo_largo return ;------------------------------------------------------------------------- entregar_producto ;rutina para dar el producto tendria que ser por bsf PORTB,5 ; comunicación pero en esta practica no se hace call retardo_largo ; comunicación y solo habrá que encender el call retardo_largo ; LED de RB5 de dar producto call retardo_largo bcf PORTB,5 return det_si_prod ;rutina para preguntar si hay producto tendria que ser por btfsc PORTB,4 ;comunicacion pero como antes solamente miraremos bsf err_prod,1 ;el estado del interruptor que hay en RB4 (0 si bcf err_prod,1 ; prod,1 no prod) y guardaremos en err_prod si hay return ; fallo ;-------------------------------------------------------------------------- ;tratamiento de errores en el proceso no_pagado call retardo_largo call RS0 movlw 0x88 ;situamos ursor en la posicion 8 de la 1ª linea movwf letra call escribir_LCD call RS1 movlw 0x4E ;N movwf letra call escribir_LCD movlw 0x4f ;O movwf letra call escribir_LCD

Page 159: Manual

Anexo Programa ASM de práctica 3

XVIII

movlw 0x20 ;space movwf letra call escribir_LCD btfsc err_prod,0 goto err_x_precio btfsc err_prod,1 goto err_x_gastado btfsc err_prod,3 goto err_x_cambio

call escribir_PG ;escribir PG en el caso de no haber pagado el ;producto

fin_no_pagado clrf err_prod call op_a_producto return err_x_precio movlw 0x24 ;escribir '$' en el caso de existir precio movwf letra call escribir_LCD goto fin_no_pagado err_x_gastado call escribir_PROD ;en el caso de que el producto se haya gastado goto fin_no_pagado err_x_cambio call escribir_CM ;error xq no hay cambio. goto fin_no_pagado ;-------------------------------------------------------------------------- dar_cambio ;esta rutina nos da las monedas a devovler solo hay que pasarle nop ;por el W la cantidad de dinero a devovler se hara en otra return ; practica. ;--------------------------------------------------------------------------elegir_prod movlw 0x3 ;revisamos si tenemos q poner las unidades o las decenas andwf lim_tec,w ;si no es el caso solo se puede apretar la tecla btfsc STATUS,Z ; aceptar o cancelar goto correcto? movf rmoneda,w ;miramos si no es la tecla acpetar o cancelar btfss rmoneda,3 ;si no lo es revisamos la tecla del numero goto revisar_tecla andlw 0x6 ;miramos si es la tecla 9 btfsc STATUS,Z goto revisar_tecla movf rmoneda,w btfsc rmoneda,2 return btfsc rmoneda,0 goto correcto? ;en el caso que sea la tecla aceptar o cancelar return revisar_tecla btfsc lim_tec,1 goto enviar_decena

Page 160: Manual

Anexo Programa ASM de práctica 3

XIX

call RS0 movlw 0xc6 ;ponemos cursor en espacio 6 de la 2ª linea del display movwf letra call escribir_LCD call RS1 movf rmoneda,w ;escribimos el valor de las unidad del producto a addlw 0x30 ; elegir movwf letra call escribir_LCD call RS0 movlw 0xca ;ponemos el cursor en el espacio 10 de la 2ª linea movwf letra call escribir_LCD call RS1 movf decenas,w addwf rmoneda,w ;aqui guardamos la direcion del producto movwf DIREC call EE_LEE call comprobar_precio ;revisamos precio y o escribimos clrf tapreta clrf lim_tec return enviar_decena call RS0 ;ponemos el display en 2ª linea movlw 0xC0 movwf letra call escribir_LCD call RS1 call escribir_PROD movlw 0x20 ;espacio en blanco movwf letra call escribir_LCD movf rmoneda,w ;escibimos la decena del dislay movwf num_prod addlw 0x30 movwf letra call escribir_LCD buc_decenas ;bucle para calcular las decenas movlw 0 addwf rmoneda btfsc STATUS,Z ;revisamos si es la tecla 0 goto escribe_0 movlw 0x10 ;sumamos 10 para convertir a decenas addwf decenas movlw 0x1 subwf rmoneda btfss STATUS,Z goto buc_decenas subwf lim_tec clrf tapreta return

Page 161: Manual

Anexo Programa ASM de práctica 3

XX

escribe_0 clrf tapreta ;ponemos a 0 el registro tecla apretada para sig. tecla movlw 1 subwf lim_tec ;quitamos 1 al limite de tecla para saber q la return ; siguiente es las unidades correcto? ;para saber si se aprieta la tecla de cacelar o aceptar btfss rmoneda,3 goto fin_correcto? btfss rmoneda,0 goto aceptado goto cancelado aceptado bsf prod_elegido,0 ;ponemos a ‘1’ el registro de prod_elelgido para goto fin_correcto? ;que al salir de seleccionar producto sepa que ya ;ha sido seleccionado cancelado clrf decenas ;si es tecla cancelar se inician registros y LCD call op_a_producto ;y se comienza de nuevo call mens_inicio goto fin_correcto? fin_correcto? clrf tapreta ;aquí solamente ponemos a ‘0’ el registro que nos dice return ;si hay una tecla apretada. ;-------------------------------------------------------------------------- op_a_producto ;esto es para iniciar registros movlw 0x2 movwf lim_tec clrf err_prod clrf prod_elegido clrf tapreta return iniciar_regs ;otra funcion para iniciar regisros clrf num_prod clrf decenas clrf tapreta return ;-------------------------------------------------------------------------- mens_inicio ;para escribir mensaje de inicio solamente movlw 0x1 ;limpiaremos ala panatalla de LCD movwf letra call clear_display return escribir_PG movlw 0x50 ;letra P movwf letra call escribir_LCD movlw 0x47 ;letra G movwf letra call escribir_LCD return

Page 162: Manual

Anexo Programa ASM de práctica 3

XXI

escribir_PROD movlw 0x50 ;letra P movwf letra call escribir_LCD movlw 0x52 ;letra R movwf letra call escribir_LCD movlw 0x4f ;letra O movwf letra call escribir_LCD movlw 0x44 ;letra D movwf letra call escribir_LCD return escribir_CM movlw 0x43 ;letra C movwf letra call escribir_LCD movlw 0x4d ;letra M movwf letra call escribir_LCD return escribir_NUE movlw 0x4e ;letra N movwf letra call escribir_LCD movlw 0x55 ;letra U movwf letra call escribir_LCD movlw 0x45 ;letra E movwf letra call escribir_LCD return escribir_ERROR movlw 0x45 ;letra E movwf letra call escribir_LCD movlw 0x52 ;letra R movwf letra call escribir_LCD movlw 0x52 ;letra R movwf letra call escribir_LCD movlw 0x4f ;letra O movwf letra call escribir_LCD movlw 0x52 ;letra R movwf letra call escribir_LCD clear_display ;función para las instruciones de 1,53ms de la pantalla de

;LCD banksel TRISB

Page 163: Manual

Anexo Programa ASM de práctica 3

XXII

movlw 0x87 movwf OPTION_REG banksel PORTA call RS0 call E1 clrf PORTC call E0

call E1 movf letra,w

movwf PORTC call E0 movlw 0x80 movwf TMR0 t0 btfsc TMR0,7 goto t0 call RS1 banksel TRISA movlw 0x83 movwf OPTION_REG banksel PORTA return escribir_LCD ;función para las instruccion de 49us de la pantalla LCD call E1 movf letra,w andlw 0xf0 movwf lauxil swapf lauxil,w movwf PORTC call E0 call E1 movlw 0x0f andwf letra,w movwf PORTC call E0 movlw 0xFC movwf TMR0 t1 btfsc TMR0,7 goto t1 return E0 ;función para poner la entrada E del LCD a '0' bcf PORTB,4 return E1 ;función para poner la entrada E del LCD a '1' bsf PORTB,4 return RS0 ;función para poner la entrada RS del LCD a '0' bcf PORTB,3 return RS1 ;función para poner la entrada RS del LCD a '1' bsf PORTB,3 return limpiar_LCD ;función para dejar la pantalla sin nada call RS0 ;aqui hariamos un RETURN HOME movlw 0x02

Page 164: Manual

Anexo Programa ASM de práctica 3

XXIII

movwf letra call clear_display movlw 0x01 ;aqui harimaos un CLEAR DISPLAY movwf letra call clear_display return ;-------------------------------------------------------------------------- ;funciones de la EEPROM EE_ESCRIBE ;con esta escvribimos un valor pasado por el W movf DATO,w ;en la Direccion psada por el registro DIREC banksel EEDATA movwf EEDATA banksel 0 movf DIREC,w banksel EEADR movwf EEADR banksel EECON1 bsf EECON1,WREN bcf INTCON,GIE movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1,WR bsf INTCON,GIE bcf EECON1,WREN EE_WAIT btfsc EECON1,WR goto EE_WAIT banksel DATO return EE_LEE ;leemos el valor de la EEPROM que este en el Registro movf DIREC,w ;DIREC que le hemos pasado banksel EEDATA movwf EEADR banksel EECON1 bsf EECON1,RD banksel EEDATA movf EEDATA,w banksel DATO movwf DATO ;devolvemos el valor leido por el registro DATO return ;-------------------------------------------------------------------------- retardo ;funciones varias de retardos para diferntes pausas movlw 0xFF movwf pausa retm decfsz pausa goto retm return retardo_largo movlw 0xFF movwf pausa2 retm1 movlw 0xFF

Page 165: Manual

Anexo Programa ASM de práctica 3

XXIV

movwf pausa retm2 banksel TRISB banksel PORTB decfsz pausa goto retm2 decfsz pausa2 goto retm1 return end

Page 166: Manual

Anexo Programa ASM de práctica 4

XXV

A.1.3. Programa ASM de práctica 4

include "p16f877.inc" ;registros de proposito general rmoneda equ 0x40 ;valor de la tecla apretada tapreta equ 0x41 ;ponemos a '1' si la tecla a sido apretada rprecio equ 0x42 ;precio producto r1 equ 0x50 ;Guardamos la columna elegida r2 equ 0x51 ;guardamos la fila elegida mas_fil equ 0x52 ;se guarda la mascara de la fila modetect equ 0x54 ;moneda a enviar pagado equ 0x59 ;reg. para guardar el dinero que e va introduciendo digito equ 0x5b ;reg aux para el digito a pasar al LCD ret equ 0x60 ;para hacer el retardo letra equ 0x61 ;reg para escribir en LCD letraux equ 0x5a ;reg aux para escr precios en LCD lauxil equ 0x62 ;reg auxiliar para escribir moneda pausa equ 0x63 ;reg auxiliar para hacer pausa al dar moneda cambio equ 0x34 ;el cambio a dar maux equ 0x35 ;para encender los bits de la moneda a dar. pausa2 equ 0x38 ;otro reg para pausa aux equ 0x39 ;reg auxiliar aux2 equ 0x3a ;reg auxiliar2 ;Rutina principal org 0x00 Inicio call iniciar_LCD ;vamos a rutina para iniciar la pantalla LCD call conf_tec ;vamos a rutina para dar vlaores a las teclas call conf_mic ;vamos a rutina para configurar el micro buckle nop call ver_moneda ;miramos el teclado btfsc tapreta,0 call leer_dinero ;va al aparatado de elegir producto goto buckle ;rutina para iniciar el LCD iniciar_LCD banksel TRISA movlw 0xF0 movwf TRISC ;RC<0:4> SALIDAS RC<5:7> entradas para RX y TX movlw 0x07 movwf TRISB ;RB<0:2> entradas RC<3:7> salidas movlw 0x18 movwf TRISA ;RA<0:2> SALIDAS RA <3:4> entradas movlw 0x83 ;ponemos el pre-escaler a 1:16 movwf OPTION_REG banksel PORTA clrf PORTA ;ponemos la instrucción FUCTION SET call RS0 call E1

Page 167: Manual

Anexo Programa ASM de práctica 4

XXVI

movlw 0x02 movwf PORTC call E0 call retardo movlw 0x2F movwf letra call escribir_LCD call retardo movlw 0x0f ;ponemos la instrucción DISPLAY ON/OFF control movwf letra call escribir_LCD call retardo movlw 0x01 ;ponemos la instrucción CLEAR_DISPLAY movwf letra call clear_display call retardo call RS0 ;ponemos la instrucción ENTRY MODE SET movlw 0x06 movwf letra call escribir_LCD call retardo call RS1 return ;fin de la inicialización del LCD ;asignamos cada valor del teclado a un registro conf_tec movlw 1 ;tecla 1 movwf 0x20 movlw 2 ;tecla 2 movwf 0x21 movlw 3 ;tecla 3 movwf 0x22 movlw 0xc ;tecla f movwf 0x23 movlw 4 ;tecla 4 movwf 0x24 movlw 5 ;tecla 5 movwf 0x25 movlw 6 ;tecla 6 movwf 0x26 movlw 0xd ;tecla e movwf 0x27 movlw 7 ;tecla 7 movwf 0x28 movlw 8 ;tecla 8 movwf 0x29 movlw 9 ;tecla 9 movwf 0x2a movlw 0xe ;tecla d movwf 0x2b movlw 0xa ;tecla a movwf 0x2c movlw 0 ;tecla 0 movwf 0x2d movlw 0xb ;tecla b movwf 0x2e movlw 0xf ;tecla c

Page 168: Manual

Anexo Programa ASM de práctica 4

XXVII

movwf 0x2f return ;Configuracion del micro conf_mic banksel ADCON1 ;cogemos el banco de memoria 1 movlw 0x7 movwf ADCON1 ;salidas digitales movlw 0x87 movwf OPTION_REG ;preescaler a 256 banksel PORTC ; banco 0 clrf r1 clrf r2 clrf tapreta ;inicializa el valor del registro de valor de tecla banksel PORTB ;volvemos al primer banco call mens_inicio return ;vamos dando un '1' a las columnas para ir comprobando si la tecla esta ;apretada ver_moneda movlw 0x1 movwf PORTC clrf r1 ;guardamos 0 en r1 para saber q estamos en la columna 1 call rev_fila ;vamos a mirar las filas una por una movlw 0x2 movwf PORTC movlw 0x04 movwf r1 ;guardamos 1 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas movlw 0x4 movwf PORTC movlw 0x08 movwf r1 ;guardamos 1 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas movlw 0x8 movwf PORTC movlw D'12' movwf r1 ;guardamos 1 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas return ;volvemos al prinicipio rev_fila btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return clrf r2 ;ponemos 0 para saber que es la fila 1 movlw 0x01 movwf mas_fil ;guardamos mascara para comprobar despues btfsc PORTB,0 ;miramos si la fila 1 esta a 0 para mirar ;numero si no es asi seguimos call ret_tcl_producto btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return

Page 169: Manual

Anexo Programa ASM de práctica 4

XXVIII

movlw 0x01 movwf r2 ;ponemos el valor 4 para saber q es la fila 2 movlw 0x02 movwf mas_fil ;volvemos a guardar mascara btfsc PORTB,1 ;comprobamos bit 1 para saber ;si la tecla de la fila esta activada call ret_tcl_producto btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return movlw 0x02 ;guardamos el valor 8 para la fila 3 movwf r2 movlw 0x04 movwf mas_fil btfsc PORTB,2 call ret_tcl_producto btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return ;en esta rutina hacemos un pequeño retardo para los rebotes ret_tcl_producto movlw 0x0F movwf ret ;actualizamos el registro para el retardo buck_re decfsz ret,f ;se va decrementando ret hasta q volvemos a

;comprobar el PORTB goto buck_re movf PORTB,w andwf mas_fil,w ;hacemos una and entre la mascara guardada y W

;si el resultado es diferente de 0 es q la tecla ;esta pulsada

btfsc STATUS,Z ;para mirarlo si el flag Z del STATUS esta a 0 es q return ; la tecla se pulso si no es asi seguimos con el

;programa ;aqui calculamos la tecla apretada most_num clrw addwf r1,w ;sumamos r1 y r2 para despues saber el valor de addwf r2,w ;la tecla apretada addlw 0x20 movwf FSR ;movemos el valor a FSR para acceso indirecto movf INDF,w movwf rmoneda ;guardamos el resultado de la tecla

bsf tapreta,0 ;ponemos a '1' tapreta para saber que hay tecla ;apretada

;buckle para saber si la tecla deja de ser apretada sol_tec

movf PORTB,w andwf mas_fil,w ;volvemos a utilizar la mascara para saber si la btfss STATUS,Z ; tecla sigue apretada hasta q el flag Z no este goto sol_tec ; acticado no saldra del buckle return

Page 170: Manual

Anexo Programa ASM de práctica 4

XXIX

;-------------------------------------------------------------------------- leer_dinero ;como hemos dicho en el enunciado de la práctica damos nop ;libertad de que el alumno escoga la forma de procesar las movf rmoneda,w ;teclas para elegir el producto solo tiene que tener en clrf tapreta ;cuenta que si la tecla es 'aceptar' tiene xorlw 0xa ;que dar el cambio de lo que se ha insertado. btfsc STATUS,Z goto dar_cambio return ;-------------------------------------------------------------- pasar_a_LCD movwf letraux clrf digito b_millares movlw D'200' subwf letraux btfss STATUS,C goto millar_no movlw 1 addwf digito goto millar_si millar_no movlw D'200' ;este es solo en caso q sea + de 10 euros addwf letraux millar_si movf digito,w addlw 0x30 movwf letra call escribir_LCD clrf digito b_centenas ;calculo las centenas de lo que he metido movlw D'20' subwf letraux btfss STATUS,C goto centenas movlw 1 addwf digito goto b_centenas centenas ;envio las centenas movlw D'20' addwf letraux movf digito,w addlw 0x30 movwf letra call escribir_LCD movlw 0x2c ;escribo una coma para separar euros de centimos movwf letra call escribir_LCD clrf digito

Page 171: Manual

Anexo Programa ASM de práctica 4

XXX

b_decenas ;y calculo decenas movlw D'2' subwf letraux btfss STATUS,C goto unidades movlw 1 addwf digito goto b_decenas unidades movf digito,w ;envio decenas addlw 0x30 movwf letra call escribir_LCD movlw D'2' addwf letraux movlw 0x30 btfsc letraux,0 ;calculo y envio unidades movlw 0x35 movwf letra call escribir_LCD clrf letraux return ;-------------------------------------------------------------------------- dar_cambio

movf pagado,w ;aqui hemos supuesto que el registro donde se ;guardará la cantida dinero será 'pagado' con lo ;cual pasamos esa cantidad al W y la funcion ;dev_dinero hace el resto

;--------------------------------------------------------------------- dev_dinero ;esta rutina nos da las monedas a devovler por RA solo hay que movwf cambio ; pasarle por el W la cantidad de dinero a devolver. call retardo_largo call RS0 movlw 0x89 ;ponemos el cursor en el espacio 9 de la 1ª linea movwf letra call escribir_LCD call RS1 call escribir_CM ;escribimos CM antes de la cantidad movf cambio,w call pasar_a_LCD ;esribimos la cantidad a devolver call retardo_largo movf cambio,w btfsc STATUS,Z return movwf letraux bcf STATUS,C euro1

movlw B'000101' ;ponemos codigo a pasar al decodificador este codigo movwf maux ;es le de 1 euro movlw D'20' ;revisamos que la cantidad supere 20 subwf letraux,f btfss STATUS,C goto cent50 ;si no lo supera vamos a revisar la moneda de 50 cent. call dar_moneda ;si lo supera vamos a dar la moneda y volvemos a mirar

Page 172: Manual

Anexo Programa ASM de práctica 4

XXXI

goto euro1 ;si sigue superando 20 para dar otra moneda. cent50

bcf STATUS,C ;como en la anterior se pne el código moneda de 50 cent. movlw B'000100' movwf maux ;se suma 20 que es lo restado antes para quedarnos con movlw D'20' ;el cambio que tenemos realmente addwf letraux,f buc50

movlw D'10' ;y empoezamos como antes a restar 10 hasta que nos salga subwf letraux,f ;negativo que pasara a revisar la moneda de 20 cent. btfss STATUS,C goto cent20 call dar_moneda goto buc50 cent20 bcf STATUS,C ;pasamos el código de la moneda de 20 cent. Y movlw B'000011' ; sumamos 10 para tener el cambio real a dar. movwf maux movlw D'10' addwf letraux,f buc20

movlw D'4' ;restamos 4 hasta que no nos salga negativo que subwf letraux,f ;pasaria a revisar la moneda de 10 cent. btfss STATUS,C goto cent10 call dar_moneda goto buc20 cent10 bcf STATUS,C ;pasamos el código de la moneda de 10 cent. movlw B'000010' movwf maux ;y sumamos 4 para volver al valor real movlw D'4' addwf letraux,f buc10

movlw D'2' ;restamos 2 hasta que quede negativo y pasariamos a subwf letraux,f ;la moneda de 5 cent. btfss STATUS,C goto cent5 call dar_moneda goto buc10 cent5 bcf STATUS,C ;pasamos el código de la moneda de 5 cent. y sumamos movlw B'000001' ;2 al valor que teniamos movwf maux movlw '2' addwf letraux,f

btfsc letraux,0 ;si el valor que tenemos del cambio es 0 no damos call dar_moneda ;moneda si es 1 tedremos que dar una moneda de 5 ;cent.

return dar_moneda ;esta función si detecta las anteriores que hay que movf maux,w ;dar una moneda le pasan por maux el vlor de la movwf PORTA ;moneda a dar y pasa el valor al decodificador para

Page 173: Manual

Anexo Programa ASM de práctica 4

XXXII

banksel TRISA ;que se encienda el LED correspòndiente movlw 0x87 movwf OPTION_REG banksel PORTA call retardo_largo ;aquí hacemos pausas para ver el LED encendido call retardo_largo movlw B'111000' ;volvemos a dejar el decodificador para que no andwf PORTA ;encienda ningun LED call retardo_largo banksel TRISA movlw 0x83 movwf OPTION_REG banksel PORTA return ;-------------------------------------------------------------------------- mens_inicio movlw 0x1 movwf letra call clear_display return escribir_PG movlw 0x50 ;letra P movwf letra call escribir_LCD movlw 0x47 ;letra G movwf letra call escribir_LCD return escribir_CM movlw 0x43 ;letra C movwf letra call escribir_LCD movlw 0x4d ;letra M movwf letra call escribir_LCD return clear_display ;función para las instruciones de 1,53ms de la pantalla de

;LCD banksel TRISB movlw 0x87 movwf OPTION_REG banksel PORTA call RS0 call E1 clrf PORTC call E0

call E1 movf letra,w

movwf PORTC call E0 movlw 0x80 movwf TMR0

Page 174: Manual

Anexo Programa ASM de práctica 4

XXXIII

t0 btfsc TMR0,7 goto t0 call RS1 banksel TRISA movlw 0x83 movwf OPTION_REG banksel PORTA return escribir_LCD ;función para las instruccion de 49us de la pantalla LCD call E1 movf letra,w andlw 0xf0 movwf lauxil swapf lauxil,w movwf PORTC call E0 call E1 movlw 0x0f andwf letra,w movwf PORTC call E0 movlw 0xFC movwf TMR0 t1 btfsc TMR0,7 goto t1 return E0 ;función para poner la entrada E del LCD a '0' bcf PORTB,4 return E1 ;función para poner la entrada E del LCD a '1' bsf PORTB,4 return RS0 ;función para poner la entrada RS del LCD a '0' bcf PORTB,3 return RS1 ;función para poner la entrada RS del LCD a '1' bsf PORTB,3 return limpiar_LCD ;función para dejar la pantalla sin nada call RS0 ;aqui hariamos un RETURN HOME movlw 0x02 movwf letra call clear_display movlw 0x01 ;aqui harimaos un CLEAR DISPLAY movwf letra call clear_display return ;-------------------------------------------------------------------------- retardo ;funciones para las diferentes pausas durante el programa movlw 0xFF movwf pausa retm decfsz pausa

Page 175: Manual

Anexo Programa ASM de práctica 4

XXXIV

goto retm return retardo_largo movlw 0xFF movwf pausa2 ret_l1 movlw 0xFF movwf pausa ret_l2 banksel TRISB banksel PORTB decfsz pausa goto ret_l2 decfsz pausa2 goto ret_l1 return end

Page 176: Manual

Anexo Programa ASM de práctica 6

XXXV

A.1.4. Programa ASM de práctica 6

include "p16f877.inc" ;etiquetas ACEPTAR equ 0x4F ;por si cancelas algun paso CANCELAR equ 0x0F ;para aceptar el precio. INICIO equ 0xFF ;para iniciar envio FIN equ 0x66 ;para acabar envio EDATO equ 0xAA ;para decir que envio dato EDIREC equ 0x55 ;para decir que envio direccion CANC_PRO equ 0x0F ;para cancelar pedir producto ;registros de proposito general rmoneda equ 0x40 ;valor de la tecla apretada tapreta equ 0x41 ;ponemos a '1' si la tecla a sido apretada rprecio equ 0x42 ;precio producto r1 equ 0x50 ;Guardamos la columna elegida r2 equ 0x51 ;guardamos la fila elegida mas_fil equ 0x52 ;se guarda la mascara de la fila lim_tec equ 0x55 ;reg para saber q tiene q detectar 2 teclas en ;producto ret equ 0x60 ;para hacer el retardo letra equ 0x61 ;reg para escribir en LCD letraux equ 0x5a ;reg aux para escr precios en LCD lauxil equ 0x62 ;reg auxiliar para escribir moneda pausa equ 0x63 ;reg auxiliar para hacer pausa al dar moneda DATO equ 0x30 ;dato de eprom DIREC equ 0x31 ;direcion eprom err_prod equ 0x32 ;si el producto no existe o hay cambio prod_elegido equ 0x36 ;para saber si se ha elegido el producto T_escrita equ 0x37 ;decenas del producto seleccionado dato_recibido equ 0x3b ;para saber si se ha recibido el dato por RX. pausa2 equ 0x38 ;otro reg para pausa aux equ 0x39 ;reg auxiliar aux2 equ 0x3a ;reg auxiliar2 producto equ 0x3c ;donde guardamos el numero del producto modo_precio equ 0x3d ;para saber si estamos en modo cambio de precio aux_int equ 0x3e ;reg auxiliar para interrupcion esp_DATO equ 0x5c ;reg para esperar Dato esp_DIREC equ 0x5d ;reg para esperar Direccion ;Rutina principal org 0x0 clrf INTCON ;deshabilitamos interrupciones para iniciar micro goto inicio org 0x4 goto INTERRUPT ;cuando se produzca una interrupción vendrá aqui

org 0x5 ;comienza el programa aqui Inicio call iniciar_LCD ;vamos a rutina para iniciar la pantalla LCD call conf_tec ;vamos a rutina para dar vlaores a las teclas call conf_mic ;vamos a rutina para configurar el micro

Page 177: Manual

Anexo Programa ASM de práctica 6

XXXVI

buckle nop call ver_moneda ;revisa tecla apretada btfsc tapreta,0 call pedir_prod ;va al aparatado de elegir producto goto buckle ;rutina para iniciar el LCD iniciar_LCD banksel TRISA movlw 0xF0 movwf TRISC ;RC<0:4> SALIDAS RC<5:7> entradas para RX y TX movlw 0x07 movwf TRISB ;RB<0:2> entradas RC<3:7> salidas movlw 0x18 movwf TRISA ;RA<0:2> SALIDAS RA <3:4> entradas movlw 0x83 ;1:16 movwf OPTION_REG banksel PORTA clrf PORTA ;ponemos la instrucción FUCTION SET call RS0 call E1 movlw 0x02 movwf PORTC call E0 call retardo movlw 0x2F movwf letra call escribir_LCD call retardo movlw 0x0f ;ponemos la instrucción DISPLAY ON/OFF control movwf letra call escribir_LCD call retardo movlw 0x01 ;ponemos la instrucción CLEAR_DISPLAY movwf letra call clear_display call retardo call RS0 ;ponemos la instrucción ENTRY MODE SET movlw 0x06 movwf letra call escribir_LCD call retardo call RS1 return ;fin de la inicialización del LCD ;asignamos cada valor del teclado a un registro conf_tec movlw 1 ;tecla 1 movwf 0x20 movlw 2 ;tecla 2 movwf 0x21 movlw 3 ;tecla 3 movwf 0x22 movlw 0xc ;tecla f movwf 0x23

Page 178: Manual

Anexo Programa ASM de práctica 6

XXXVII

movlw 4 ;tecla 4 movwf 0x24 movlw 5 ;tecla 5 movwf 0x25 movlw 6 ;tecla 6 movwf 0x26 movlw 0xd ;tecla e movwf 0x27 movlw 7 ;tecla 7 movwf 0x28 movlw 8 ;tecla 8 movwf 0x29 movlw 9 ;tecla 9 movwf 0x2a movlw 0xe ;tecla d movwf 0x2b movlw 0xa ;tecla a movwf 0x2c movlw 0 ;tecla 0 movwf 0x2d movlw 0xb ;tecla b movwf 0x2e movlw 0xf ;tecla c movwf 0x2f return ;Configuracion del micro conf_mic banksel ADCON1 ;cogemos el banco de memoria 1 movlw 0x7 movwf ADCON1 ;salidas digitales movlw 0x87 movwf OPTION_REG ;preescaler a 256 bsf PIE1,RCIE ;interupccion RX habilitada bcf PIE1,TXIE ;interupccion TX deshabilitada movlw 0x24 movwf TXSTA ;TX tx9=1 txen=1 brgh=1 movlw D'27' ;SPBRG=27 que es donde tiene menos error movwf SPBRG banksel PORTC ; banco 0 movlw 0x90 movwf RCSTA ;RC spen=1 rx9=1 CREN=1 movlw 0xc0 iorwf INTCON,F ;acitvamos interrupciones clrf r1 clrf r2 clrf tapreta ;inicializa el valor del registro de valor de tecla

clrf rmoneda ;inicializa el valor del reg de detecion de tecla ;apretada

clrf rprecio ;inicializamos el valor del registro de precio clrf T_escrita clrf modo_precio clrf dato_recibido ;inicializa el reg. De dato recibido clrf prod_elegido bsf lim_tec,1 movlw 1 movwf esp_DIREC

Page 179: Manual

Anexo Programa ASM de práctica 6

XXXVIII

movwf esp_DATO banksel EECON1 ;esto es para configurar la EEPROM bcf EECON1,EEPGD ;ponemos en modo ecritura de datos banksel PORTB ;volvemos al primer banco call mens_inicio return ;vamos dando un '1' a las columnas para ir comprobando si la tecla esta ;apretada ver_moneda movlw 0x1 movwf PORTC clrf r1 ;guardamos 0 en r1 para saber q estamos en la columna 1 call rev_fila ;vamos a mirar las filas una por una movlw 0x2 movwf PORTC movlw 0x04 movwf r1 ;guardamos 1 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas movlw 0x4 movwf PORTC movlw 0x08 movwf r1 ;guardamos 1 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas movlw 0x8 movwf PORTC movlw D'12' movwf r1 ;guardamos 1 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas return ;volvemos al prinicipio rev_fila btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return clrf r2 ;ponemos 0 para saber que es la fila 1 movlw 0x01 movwf mas_fil ;guardamos mascara para comprobar despues btfsc PORTB,0 ;miramos si la fila 1 esta a 0 para mirar ;numero si no es asi seguimos call ret_tcl_producto btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return movlw 0x01 movwf r2 ;ponemos el valor 4 para saber q es la fila 2 movlw 0x02 movwf mas_fil ;volvemos a guardar mascara btfsc PORTB,1 ;comprobamos bit 1 para saber ;si la tecla de la fila esta activada call ret_tcl_producto btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return

Page 180: Manual

Anexo Programa ASM de práctica 6

XXXIX

movlw 0x02 ;guardamos el valor 8 para la fila 3 movwf r2 movlw 0x04 movwf mas_fil btfsc PORTB,2 call ret_tcl_producto btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return ;en esta rutina hacemos un pequeño retardo para los rebotes ret_tcl_producto movlw 0x0F movwf ret ;actualizamos el registro para el retardo buck_re decfsz ret,f ;se va decrementando ret hasta q volvemos a goto buck_re ;comprobar el PORTB movf PORTB,w andwf mas_fil,w ;hacemos una and entre la mascara guardada y W

;si el resultado es diferente de 0 es q la tecla ;esta pulsada

btfsc STATUS,Z ;para mirarlo si el flag Z del STATUS esta a 0 es q return ;la tecla se pulso si no es asi seguimos con el

;programa ;aqui calculamos la tecla apretada most_num clrw addwf r1,w ;sumamos r1 y r2 para despues saber el valor de addwf r2,w ;la tecla apretada addlw 0x20 movwf FSR ;movemos el valor a FSR para acceso indirecto movf INDF,w movwf rmoneda ;guardamos el resultado de la tecla

bsf tapreta,0 ;poenmos a '1' el bit 0 de tapreta para saber que ;hay 1 tecla apretada

;buckle para saber si la tecla deja de ser apretada sol_tec movf PORTB,w andwf mas_fil,w ;volvemos a utilizar la mascara para saber si la btfss STATUS,Z ; tecla sigue apretada hasta q el flag Z no este a 1 goto sol_tec ; no saldra del buckle return ;-------------------------------------------------------------------------- ;rutina para elegir producto pedir_prod call elegir_prod ;vamos a elegir el producto y cuando volvemos btfss prod_elegido,0 ;si se a terminado de elegir continuamos si no return ;esperamos otra tecla rev_prod call det_si_prod ;miramos si se hay producto btfsc err_prod,1 ;si hay error se cancela proceso goto no_dar call retardo_largo ;si todo va bien hacemos pausas y damos el call dar_producto ;producto

Page 181: Manual

Anexo Programa ASM de práctica 6

XL

call retardo_largo call retardo_largo call retardo_largo call mens_inicio ;volvemos a poner el mensaje de inicio movlw 0x1 subwf lim_tec clrf dato_recibido return no_dar ;si no hay producto iniciamos registros y pantalla clrf rmoneda ;LCD y esperamos nueva selección de producto call mens_inicio call ini_reg return dar_producto ;si hay el producto entregamos el procuto call entregar_producto ;y espera nueva selección de producto call retardo_largo call ini_reg return ini_reg ;para iniciar los registros para una nueva selección clrf lim_tec bsf lim_tec,1 clrf T_escrita clrf tapreta return ;-------------------------------------------------------------------------- elegir_prod movlw 0x3 ;revisamos si tenemos q poner las unidades o las decenas andwf lim_tec,w ;si no es el caso solo se puede apretar la tecla btfsc STATUS,Z ;aceptar o cancelar goto correcto? movf rmoneda,w ;miramos si no es la tecla acpetar o cancelar btfss rmoneda,3 ;si no lo es revisamos la tecla del numero goto revisar_tecla andlw 0x6 ;miramos si es la tecla 9 btfsc STATUS,Z goto revisar_tecla movf rmoneda,w btfsc rmoneda,2 return btfsc rmoneda,0 goto correcto? return revisar_tecla ;aqui revisamos la tecla si la tecla es un numero btfsc lim_tec,1 ;miramos si ya se ha seleccionado la decena goto enviar_decena ;del producto si no va a hacerlo call RS0 movlw 0x01 ;poemos cursor en espacio 2 de la 1ª linea del display movwf letra call escribir_LCD call RS1 movf rmoneda,w ;escribimos el valor de las unidad del producto addlw 0x30

Page 182: Manual

Anexo Programa ASM de práctica 6

XLI

movwf letra call escribir_LCD call RS0 movlw 0xc9 ;ponemos el cursor en el espacio 9 de la 2ª linea movwf letra call escribir_LCD call RS1 movf T_escrita,w addwf rmoneda,w ;aqui guardamos la direcion del producto movwf DIREC call EE_LEE ;buscamos precio del producto clrf tapreta clrf lim_tec return enviar_decena call RS0 ;ponemos el display en 1ª linea movlw 0x00 movwf letra call escribir_LCD call RS1 movf rmoneda,w ;escibimos la decena del dislay addlw 0x30 movwf letra call escribir_LCD buc_decenas ;bucle para calcular las decenas movlw 0 addwf rmoneda btfsc STATUS,Z ;revisamos si es lña tecla 0 goto escribe_0 movlw 0x10 ;sumamos 10 para convertir a decenas addwf T_escrita movlw 0x1 subwf rmoneda btfss STATUS,Z goto buc_decenas subwf lim_tec clrf tapreta return escribe_0 clrf tapreta ;pone a 0 el reg. tecla apretada para sig. tecla movlw 1 subwf lim_tec ;quitamos 1 al limite de tecla para saber q la return ; siguiente es las unidades correcto? ;para saber si se aprieta la tecla de cacelar o aceptar btfss rmoneda,3 ;revisa si es tecla aceptar o cancelar de lo goto fin_correcto? ;si no lo es pasa de la tecla apretada btfss rmoneda,0 goto aceptado goto cancelado aceptado bsf prod_elegido,0 ;activa el registro de prodcuto elelgido goto fin_correcto? ;para que continue el proceso al salir de

Page 183: Manual

Anexo Programa ASM de práctica 6

XLII

;de elegir producto cancelado clrf T_escrita ;inicializa registros para empezar nueva call mens_inicio ;seleccion call ini_reg goto fin_correcto? fin_correcto? clrf tapreta ;limpiamos registro de tecla apretada para poder return ;apretar una nueva tecla ;------------------------------------------------------------------------- ;Comunicación RS232 para comprobrar producto y dar producto. entregar_producto ;rutina para dar el producto movf DIREC,w addlw 0x80 ;ponemos el codigo para queel otro micro sepa que ;queremos pedir que entrege el producto movwf TXREG ;enviamos direccion del producto seleccionado call esp_envio ;espermaos confirmación clrf dato_recibido return esp_envio ;para ver si se ha enviado el dato banksel TXSTA espenv btfss TXSTA,TRMT ;una vez que se desactive TRMT es que se ha enviado goto espenv ;la direccion banksel 0 return det_si_prod ;rutina para preguntar si hay producto clrf dato_recibido movf DIREC,w movwf TXREG ;enviamos dato call esp_envio ;esperamos a que se haya enviado el dato espRX2 ;esperamos recibir confirmacion del otro

btfss dato_recibido,0 ;micro para saber si hay o no producto goto espRX2 clrf dato_recibido return ;-------------------------------------------------------------------------- mens_inicio movlw 0x1 movwf letra call clear_display return escribir_ERROR movlw 0x45 ;letra E movwf letra call escribir_LCD movlw 0x52 ;letra R movwf letra call escribir_LCD movlw 0x52 ;letra R

Page 184: Manual

Anexo Programa ASM de práctica 6

XLIII

movwf letra call escribir_LCD movlw 0x4f ;letra O movwf letra call escribir_LCD movlw 0x52 ;letra R movwf letra call escribir_LCD clear_display ;función para las instruciones de 1,53ms de la pantalla de

;LCD banksel TRISB movlw 0x87 movwf OPTION_REG banksel PORTA call RS0 call E1 clrf PORTC call E0

call E1 movf letra,w

movwf PORTC call E0 movlw 0x80 movwf TMR0 t0 btfsc TMR0,7 goto t0 call RS1 banksel TRISA movlw 0x83 movwf OPTION_REG banksel PORTA return escribir_LCD ;función para las instruccion de 49us de la pantalla LCD call E1 movf letra,w andlw 0xf0 movwf lauxil swapf lauxil,w movwf PORTC call E0 call E1 movlw 0x0f andwf letra,w movwf PORTC call E0 movlw 0xFC movwf TMR0 t1 btfsc TMR0,7 goto t1 return E0 ;función para poner la entrada E del LCD a '0' bcf PORTB,4 return E1 ;función para poner la entrada E del LCD a '1'

Page 185: Manual

Anexo Programa ASM de práctica 6

XLIV

bsf PORTB,4 return RS0 ;función para poner la entrada RS del LCD a '0' bcf PORTB,3 return RS1 ;función para poner la entrada RS del LCD a '1' bsf PORTB,3 return limpiar_LCD ;función para dejar la pantalla sin nada call RS0 ;aqui hariamos un RETURN HOME movlw 0x02 movwf letra call clear_display movlw 0x01 ;aqui harimaos un CLEAR DISPLAY movwf letra call clear_display return ;-------------------------------------------------------------------------- ;funciones de la EEPROM EE_ESCRIBE ;con esta escvribimos un valor pasado por el W movf DATO,w ;en la Direccion psada por el registro DIREC banksel EEDATA movwf EEDATA banksel 0 movf DIREC,w banksel EEADR movwf EEADR banksel EECON1 bsf EECON1,WREN bcf INTCON,GIE movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1,WR bsf INTCON,GIE bcf EECON1,WREN EE_WAIT btfsc EECON1,WR goto EE_WAIT banksel DATO return EE_LEE ;leemos el valor de la EEPROM que este en el Registro movf DIREC,w ;DIREC que le hemos pasado banksel EEDATA movwf EEADR banksel EECON1 bsf EECON1,RD banksel EEDATA movf EEDATA,w banksel DATO movwf DATO ;devolvemos el valor leido por el registro DATO return

Page 186: Manual

Anexo Programa ASM de práctica 6

XLV

;-------------------------------------------------------------------------- INTERRUPT ;rutina de interrupcion para recibir datos banksel 0x0 nop L1 btfss PIR1,RCIF ;miramos si la interupcion es por recepcion goto L2 btfss RCSTA,2 ;si lo es miramos queno haya error de framing goto ER1 bsf err_prod,1 ;si lo hay leemos RCREG par quitar error activamos movf RCREG,F ;el registro de error movlw CANCELAR ;y enviamos CANCELAR al otro micro movwf TXREG goto L1 ER1 btfss RCSTA,1 ;miramos si ha y errror de overfow goto revisar_enviado bsf err_prod,1 ;si lo hay ponemos a ‘0’ CREN y despues a ‘1’ para bcf RCSTA,4 ;quitar el error bsf RCSTA,4 bsf dato_recibido,0 goto L1 revisar_enviado ;aquí llemos el datorecibido y lo pasamos a regisro movf RCREG,w ;auxiliar movwf aux_int btfss modo_precio,0 ;si no estamos en modo precio vamos es q goto rec_conf_producto ;recibimos confirmacion de producto o inicio btfsc esp_DIREC,0 ;de cambio de EEPROM goto pet_DIREC ;si estamos en modo precio es que esperamos btfsc esp_DIREC,1 ;alguno de los aparados para cambiar el precio goto rec_DIREC ;de la EEPROM y mira haber cual espera para ir btfsc esp_DATO,0 ;alli goto pet_DATO goto rec_DATO rec_conf_producto ;aqui miramos si es la confirmacion de producto movf aux_int,w ;o que se inicia el cambio de la EEPROM xorlw INICIO btfss STATUS,Z goto int_ped_prod goto ini_int_EEPROM ;------------------------------ int_ped_prod ;confirmación de pedir producto movf aux_int,w xorlw ACEPTAR btfsc STATUS,Z goto correcto FALLO ;si no hay proucto hace esto

bsf err_prod,1 bsf dato_recibido,0 goto L1 correcto ;si lo hay hace esto otro clrf err_prod bsf dato_recibido,0 goto L1

Page 187: Manual

Anexo Programa ASM de práctica 6

XLVI

;------------------------------- pet_DIREC ;funcion que espera la peticion de direcion movf aux_int,w ;comprueba que sea la peticion de direccion xorlw EDIREC ;si lo es envia codigo de ‘aceptar’ si no lo btfss STATUS,Z ;es va a revisar si es el fin del ambio de la goto fin_cambio_EEPROM ; EEPROM movlw 2 ;se pone a esperar la direccion movwf esp_DIREC movlw ACEPTAR movwf TXREG call esp_envio ;espera a que el dato haya sido enviado goto L1 rec_DIREC ;funcion que espera la direcion movf aux_int,w ;comprueva que pueda ser direccion si no xorlw 0xC0 ;va a fallo de transmision btfsc STATUS,Z goto fallo_tx movf aux_int,w ;si lo es guarda la direcion y se queda a movwf DIREC ;esperar peticion de dato y envia el codigo clrf esp_DIREC ;de ‘aceptar’ bsf esp_DATO,0 movlw ACEPTAR movwf TXREG call esp_envio ;espera a que el dato haya sido enviado goto L1 pet_DATO ;espera la peticion de dato compruevaque lo movf aux_int,w ;recibido es petidion de dato si no lo es va xorlw EDATO ;a fallo de transmisión btfss STATUS,Z goto fallo_tx ;si lo es se pone a esperar dato y se queda movlw 2 ;a esperar el dato y envia codigo ‘aceptar’ movwf esp_DATO movlw ACEPTAR movwf TXREG call esp_envio ;espera a que el dato haya sido enviado goto L1 rec_DATO ;Aquí recibe el dato n comprueba que este bien movf aux_int,w ;porque no se puede lo que hace es con el dato movwf DATO ;recibido y la direccion recibida cambia el bsf esp_DIREC,0 ;dato de la direccion de la EEPROM y se queda clrf esp_DATO ;a la espera de una nueva peticion de call EE_ESCRIBE ;direccion y envia el codigo de ‘aceptar’ movlw ACEPTAR movwf TXREG call esp_envio ;espera a que el dato haya sido enviado goto L1 fallo_tx ;ene l caso de fallo de transmision movlw CANCELAR ;manda el codigo de ‘cancelar’ movwf TXREG call esp_envio ;espera a que el dato haya sido enviado

Page 188: Manual

Anexo Programa ASM de práctica 6

XLVII

goto L1 ini_int_EEPROM ;en el caso de haber recibido inicio de transmision movlw 0xF ;ponemos a '1' todos los errores para q salga de las movwf err_prod ;rutinas x si esta en medio de pedir producto clrf tapreta ;eliminamos si habia una tecla apretada

bsf modo_precio,0 ;esto es para saber que estamos en modo ;cambiar precio

movlw ACEPTAR ;enviamos como respuesta 'F0' movwf TXREG call esp_envio goto L1 fin_cambio_EEPROM clrf modo_precio ;ponemos a 0 para saber que ya no se esta clrf esp_DIREC ;cambiando la EEPROM e inicia todos los clrf esp_DATO ;los registros para continuar el proceso bsf esp_DIREC,0 bsf esp_DATO,0 clrf err_prod goto L1 L2 retfie ;-------------------------------------------------------------------------- retardo ;funciones de diferentes retardos que se utilizan movlw 0xFF ;durante la ejecucion del programa movwf pausa retm decfsz pausa goto retm return retardo_largo movlw 0xFF movwf pausa2 ret_l1 movlw 0xFF movwf pausa ret_l2 banksel TRISB banksel PORTB decfsz pausa goto ret_l2 decfsz pausa2 goto ret_l1 return end

Page 189: Manual

Anexo Programa ASM de Módulo 1 completo

XLVIII

A.1.5. Programa ASM del Módulo 1 completo

include "p16f877.inc" ;etiquetas ACEPTAR equ 0xF0 ;por si cancelas algun paso CANCELAR equ 0xFF ;para aceptar el precio. INICIO equ 0xFF ;para iniciar envio FIN equ 0x66 ;para acabar envio EDATO equ 0xAA ;para decir que envio dato EDIREC equ 0x55 ;para decir que envio direccion CANC_PRO equ 0x0F ;para cancelar pedir producto ;registros de proposito general rmoneda equ 0x40 ;valor de la tecla apretada tapreta equ 0x41 ;ponemos a '1' si la tecla a sido apretada rprecio equ 0x42 ;precio producto r1 equ 0x50 ;Guardamos la columna elegida r2 equ 0x51 ;guardamos la fila elegida mas_fil equ 0x52 ;se guarda la mascara de la fila modetect equ 0x54 ;moneda a enviar lim_tec equ 0x55 ;registro para saber q tiene q detectar 2 teclas en

;producto num_prod equ 0x56 ;registro del numero del producto rmonaux equ 0x58 ;reg para calcular las decenas en precio pagado equ 0x59 ;reg de la cantidad pagada digito equ 0x5b ;reg aux para el digito a pasar al LCD ret equ 0x60 ;para hacer el retardo letra equ 0x61 ;reg para escribir en LCD letraux equ 0x5a ;reg aux para escr precios en LCD lauxil equ 0x62 ;reg auxiliar para escribir moneda pausa equ 0x63 ;reg auxiliar para hacer pausa al dar moneda DATO equ 0x30 ;dato de eprom DIREC equ 0x31 ;direcion eprom err_prod equ 0x32 ;si el producto existe o hay cambio contador equ 0x33 ;contador para escribir '#' si no hay precio cambio equ 0x34 ;el cambio a dar maux equ 0x35 ;para encender los bits de la moneda a dar. prod_elegido equ 0x36 ;para saber si se ha elegido el producto decenas equ 0x37 ;guardamos las decenas de los productos dato_recibido equ 0x3b ;para saber si se ha recibido el dato por RX. pausa2 equ 0x38 ;otro reg para pausa aux equ 0x39 ;reg auxiliar aux2 equ 0x3a ;reg auxiliar2 esp_prec equ 0x3b ;para mover el cursor en le precio producto equ 0x3c ;donde guardamos el numero del producto modo_precio equ 0x3d ;para saber si estamos en modo cambio de precio aux_int equ 0x3e ;reg auxiliar para interrupcion esp_DATO equ 0x5c ;reg para esperar Dato esp_DIREC equ 0x5d ;reg para esperar Direccion ;Rutina principal org 0x0 clrf INTCON ;deshabilitamos interrupciones para iniciar micro goto inicio org 0x4 goto INTERRUPT ;cuando se produzca una interrupción vendrá aqui

Page 190: Manual

Anexo Programa ASM de Módulo 1 completo

XLIX

org 0x5 ;comienza el programa aqui Inicio call iniciar_LCD ;vamos a rutina para iniciar la pantalla LCD call conf_tec ;vamos a rutina para dar vlaores a las teclas call conf_mic ;vamos a rutina para configurar el micro buckle nop call ver_moneda btfsc tapreta,1 ;mira si hay una tecla apretada y si no es asi mira call detectmoneda ;la ocion del teclado si no va a volver a mirar el btfss tapreta,0 ;LCD goto buckle call pedir_prod ;va al aparatado de elegir producto goto buckle ;rutina para iniciar el LCD iniciar_LCD banksel TRISA movlw 0xF0 movwf TRISC ;RC<0:4> SALIDAS RC<5:7> entradas para RX y TX movlw 0x07 movwf TRISB ;RB<0:2> entradas RC<3:7> salidas movlw 0x18 movwf TRISA ;RA<0:2> SALIDAS RA <3:4> entradas movlw 0x83 ;pre-escaler a 1:16 movwf OPTION_REG banksel PORTA clrf PORTA ;ponemos la instrucción FUCTION SET call RS0 call E1 movlw 0x02 movwf PORTC call E0 call retardo movlw 0x2F movwf letra call escribir_LCD call retardo movlw 0x0f ;ponemos la instrucción DISPLAY ON/OFF control movwf letra call escribir_LCD call retardo movlw 0x01 ;ponemos la instrucción CLEAR_DISPLAY movwf letra call clear_display call retardo call RS0 ;ponemos la instrucción ENTRY MODE SET movlw 0x06 movwf letra call escribir_LCD call retardo call RS1 return ;fin de la inicialización del LCD ;asignamos cada valor del teclado a un registro

Page 191: Manual

Anexo Programa ASM de Módulo 1 completo

L

conf_tec movlw 1 ;tecla 1 movwf 0x20 movlw 2 ;tecla 2 movwf 0x21 movlw 3 ;tecla 3 movwf 0x22 movlw 0xc ;tecla f movwf 0x23 movlw 4 ;tecla 4 movwf 0x24 movlw 5 ;tecla 5 movwf 0x25 movlw 6 ;tecla 6 movwf 0x26 movlw 0xd ;tecla e movwf 0x27 movlw 7 ;tecla 7 movwf 0x28 movlw 8 ;tecla 8 movwf 0x29 movlw 9 ;tecla 9 movwf 0x2a movlw 0xe ;tecla d movwf 0x2b movlw 0xa ;tecla a movwf 0x2c movlw 0 ;tecla 0 movwf 0x2d movlw 0xb ;tecla b movwf 0x2e movlw 0xf ;tecla c movwf 0x2f return ;Configuracion del micro conf_mic banksel ADCON1 ;cogemos el banco de memoria 1 movlw 0x7 movwf ADCON1 ;salidas digitales movlw 0x87 movwf OPTION_REG ;preescaler a 1:256 bsf PIE1,RCIE ;interupccion RX habilitada bcf PIE1,TXIE ;interupccion TX deshabilitada movlw 0x24 movwf TXSTA ;TX tx9=1 txen=1 brgh=1 movlw D'27' ;SPBRG=27 que es donde tiene menos error movwf SPBRG banksel PORTC ; banco 0 movlw 0x90 movwf RCSTA ;RC spen=1 rx9=1 CREN=1 movlw 0xc0 iorwf INTCON,F ;activamos interrupciones clrf r1 clrf r2 clrf tapreta ;inicializa el valor del registro de valor de tecla

Page 192: Manual

Anexo Programa ASM de Módulo 1 completo

LI

clrf rmoneda ;inicializa el valor del reg de detecion de tecla ;apretada

clrf rprecio ;inicializamos el valor del registro de precio clrf num_prod clrf decenas clrf modo_precio clrf dato_recibido ;inicializa el reg. De dato recibido clrf prod_elegido bsf lim_tec,0 clrf err_prod movlw 1 movwf esp_DIREC movwf esp_DATO banksel EECON1 ;esto es para configurar la EEPROM bcf EECON1,EEPGD ;ponemos en modo ecritura de datos banksel PORTB ;volvemos al primer banco call mens_inicio call op_a_producto ;para iniciar registros en modo pedir producto return ;vamos dando un '1' a las columnas para ir comprobando si la tecla esta ;apretada ver_moneda movlw 0x1 movwf PORTC clrf r1 ;guardamos 0 en r1 para saber q esta encolumna 1 call rev_fila ;vamos a mirar las filas una por una movlw 0x2 movwf PORTC movlw 0x04 movwf r1 ;guardamos 1 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas movlw 0x4 movwf PORTC movlw 0x08 movwf r1 ;guardamos 1 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas movlw 0x8 movwf PORTC movlw D'12' movwf r1 ;guardamos 1 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas return ;volvemos al prinicipio rev_fila btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return clrf r2 ;ponemos 0 para saber que es la fila 1 movlw 0x01 movwf mas_fil ;guardamos mascara para comprobar despues btfsc PORTB,0 ;miramos si la fila 1 esta a 0 para mirar ;numero si no es asi seguimos call retardo_prod

Page 193: Manual

Anexo Programa ASM de Módulo 1 completo

LII

btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return movlw 0x01 movwf r2 ;ponemos el valor 4 para saber q es la fila 2 movlw 0x02 movwf mas_fil ;volvemos a guardar mascara btfsc PORTB,1 ;comprobamos bit 1 para saber ;si la tecla de la fila esta activada call retardo_prod btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return movlw 0x02 ;guardamos el valor 8 para la fila 3 movwf r2 movlw 0x04 movwf mas_fil btfsc PORTB,2 call retardo_prod btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return clrf r2 ;ponemos 0 para saber que es la fila 1 movlw 0x08 movwf mas_fil ;guardamos mascara para comprobar despues btfsc PORTA,3 ;miramos si la fila 1 esta a 0 para mirar ;numero si no es asi seguimos call ret_tecl_moneda btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return movlw 0x10 movwf r2 ;ponemos el valor 4 para saber q es la fila 2 movwf mas_fil ;volvemos a guardar mascara btfsc PORTA,4 ;comprobamos bit 1 para saber ;si la tecla de la fila esta activada call ret_tecl_moneda return ;en esta rutina hacemos un pequeño retardo para los rebotes retardo_prod movlw 0x0F movwf ret ;actualizamos el registro para el retardo buck_re decfsz ret,f ;se va decrementando ret hasta q volvemos a comprobar el PORTB goto buck_re movf PORTB,w andwf mas_fil,w ;hacemos una and entre la mascara guardada y W

;si el resultado es diferente de 0 es q la tecla ;esta pulsada

btfsc STATUS,Z ;para mirarlo si el flag Z del STATUS esta a 0 es q return ;la tecla se pulso si no es asi seguimos con el

;programa ;aqui calculamos la tecla apretada

Page 194: Manual

Anexo Programa ASM de Módulo 1 completo

LIII

most_num clrw addwf r1,w ;sumamos r1 y r2 para despues saber el valor de addwf r2,w ;la tecla apretada addlw 0x20 movwf FSR ;movemos el valor a FSR para acceso indirecto movf INDF,w movwf rmoneda ;guardamos el resultado de la tecla

bsf tapreta,0 ;poenmos a '1' el bit 0 de tapreta para saber que ;hay 1 tecla apretada

;buckle para saber si la tecla deja de ser apretada sol_tec movf PORTB,w andwf mas_fil,w ;volvemos a utilizar la mascara para saber si la btfss STATUS,Z ; tecla sigue apretada hasta q el flag Z no este a 1 goto sol_tec ; no saldra del buckle return ;buckle para saber que tecla del monedro está apretada. ret_tecl_moneda movlw 0x0F movwf ret ;actualizamos el registro para el retardo buck_

decfsz ret,f ;se va decrementando ret hasta q volvemos a goto buck_re2 ; comprobar el PORTC movf PORTA,w andwf mas_fil,w ;hace una and entre la mascara guardada y W si el ;resultado es diferente de 0 es q la tecla btfsc STATUS,Z ;esta pulsada para mirarlo si el flag Z del

return ; STATUS esta a 0 es q la tecla se pulso si no es ;asi seguimos con el programa

;aqui calculamos la tecla apretada en el monedero most_num2 addwf r1,w ;sumamos los valores de r1 y r2 para saber la tetcla addwf r2,f ; apretada rrf r2,f ;rotamos 2 veces el valor de r2 para que nos coincida rrf r2,w ; el valor de r2 con el numero del registro de tecla

addlw 0x20 ; guardado movwf FSR ;movemos el valor a FSR para acceso indirecto movf INDF,w movwf rmoneda ;guardamos el resultado de la tecla

bsf tapreta,1 ;poenmos a '1' el registro de tapreta para saber ;si hay tecla apretada

;buckle para saber si la tecla deja de ser apretada sol_tec2

movf PORTA,w andwf mas_fil,w ;volvemos a utilizar la mascara para saber si la btfss STATUS,Z ;tecla sigue apretada hasta q el flag Z no este goto sol_tec ;acticado no saldra del buckle return ;--------------------------------------------------------------------------

Page 195: Manual

Anexo Programa ASM de Módulo 1 completo

LIV

;rutina para detectar moneda detectmoneda movf rmoneda,w btfsc rmoneda,3 ;si la tecla es menor de 8 saltamos goto mirarsiopcion ;si la tecla es mayor de 8 vamos a ver si movf rmoneda,w ;es la tecla de cancelar movwf modetect ;pasamos la moneda detectada al registro y call detect_moneda ;vamos a detectarla return Dev_pagado movf pagado,w call dev_dinero ;pasamos la cantidad de dinero pagada al W clrf pagado ;para que la funcion dev_dinero devuelva call mens_inicio ;dicho dinero y ponemos a 0 la cantidad clrf tapreta ; pagada return detect_moneda btfsc modetect,2 ;si la tecla es < de 4 saltamos

goto detec_50_100_200 ;si la tecla es > de 4 es la moneda 50 100 o ;200 cent

btfsc modetect,1 ;si la tecla es < de 2 saltamos goto detec_10y20 ;si la tecla es > de 2 es la moneda 10 o 20

;cent movf modetect,w ;aqui ya sabemos que es la moneda de 5 cent goto fin_detect detec_10y20 btfsc modetect,0 ;diferenciamos entre la moneda de 10 y 20 cent si goto detect_20 ;es la la tecla 2 es la moneda de 10 y por lo movlw D'2' ;tanto en pagado habrá que incrementar el valor

goto fin_detect ;de '2' detect_20 movlw D'4' ;aqui sabemos que es la moneda de 20 cent y habrá goto fin_detect ;que incrementar en '4' el valor de pagado detec_50_100_200 btfsc modetect,1 ;diferenciamos entre las monedas de 50 100 y 200 goto detec_200 ; centimos btfsc modetect,0 goto detec_100 movlw D'10' ;si es la tecla 4 llegará hasta aqui y sabremos goto fin_detect ;que es la moneda de 50 cent por lo tanto ;incrementamos en '10' pagado detec_200 movlw D'40' ;aqui sabemos que es la moneda de 200 cent y goto fin_detect ;habrá que incrementar en '40' el valor de pagado detec_100 movlw D'20' ;aqui sabemos que es la moneda de 100 cent y goto fin_detect ;habrá que incrementar en '20' el valor de pagado fin_detect ;a esta función las anteriores le pasan por el W el ;valor a incrementar el registro pagado

Page 196: Manual

Anexo Programa ASM de Módulo 1 completo

LV

movwf aux ;lo que vamos a añadir se pone en aux por si hemos addwf pagado ;metido más monedas de la cuenta btfsc STATUS,C

goto exceso_de_dinero ;en el caso de haber pasado el tope se irá call RS0 ;a esta función movlw 0x2 ;pasamos este valor para hacer un return home en movwf letra ;el LCD call clear_display movf pagado,w ;iniciamos registros clrf digito clrf tapreta call pasar_a_LCD ;y escribimos lo pagado en la pantalla de LCD call escribir_PG ;despues del valor de lo pagado escribimos PG en return ; el LCD exceso_de_dinero movf aux,w ;en el caso de exceso de dinero devovlemos la moneda subwf pagado,f ;insertada y restamos la ultima moneda al registro call dev_dinero ;pagado clrf tapreta ;inciamos registro de tecla apretada para esperar la return ; proxima tecla mirarsiopcion ;Aqui revisamos si es cancelar y devolver lo pagado btfss rmoneda,0 call Dev_pagado ;Aqui se ha cancelado y se devolveria lo pagado fin clrf tapreta ;iniciamos registros clrf rmoneda return ;-------------------------------------------------------------- pasar_a_LCD movwf letraux clrf digito b_millares ;para saber si hay más de 10 euros metidos movlw D'200' subwf letraux btfss STATUS,C goto millar_no movlw 1 addwf digito goto millar_si millar_no movlw D'200' ;este es solo en caso q sea + de 10 euros addwf letraux millar_si movf digito,w addlw 0x30 movwf letra call escribir_LCD clrf digito b_centenas ;calculo las centenas de lo que he metido movlw D'20' subwf letraux

Page 197: Manual

Anexo Programa ASM de Módulo 1 completo

LVI

btfss STATUS,C goto centenas movlw 1 addwf digito goto b_centenas centenas ;envio las centenas movlw D'20' addwf letraux movf digito,w addlw 0x30 movwf letra call escribir_LCD movlw 0x2c ;escribo una coma para separar euros de centimos movwf letra call escribir_LCD clrf digito b_decenas ;y calculo decenas movlw D'2' subwf letraux btfss STATUS,C goto unidades movlw 1 addwf digito goto b_decenas unidades movf digito,w ;envio decenas addlw 0x30 movwf letra call escribir_LCD movlw D'2' addwf letraux movlw 0x30 btfsc letraux,0 ;calculo y envio unidades movlw 0x35 movwf letra call escribir_LCD clrf letraux return ;-------------------------------------------------------------------------- ;rutina para elegir producto pedir_prod call elegir_prod ;vamos a elegir el producto y cuando volvemos btfss prod_elegido,0 ;si se a terminado de elegir continuamos si no return ;esperamos otra tecla rev_prod btfsc err_prod,0 ;reviamos si hay algun error en el producto goto esc_err_prec ;si es asisalimos por error call det_si_prod ;de lo contrario miramossi hay producto btfsc err_prod,1 ;vovlemosa revisar sihay error goto no_dar ;si lo hay salimos y no damos producto call RS0 ;ponemos el display en 1ª linea movlw 2 movwf letra

Page 198: Manual

Anexo Programa ASM de Módulo 1 completo

LVII

call escribir_LCD call RS1 call det_si_cambio ;revisa si se necesita cambio y si se ha bcf STATUS,Z ;pagado movlw 0xF andwf err_prod ;si no hay errores continua si no no da el btfss STATUS,Z ;producto goto no_dar call retardo_largo ;hacemos esperas antesy damos el producto call dar_producto call retardo_largo call retardo_largo call retardo_largo clrf pagado ;iniciamos LCD y registros para esperar nuevo call mens_inicio ;producto movlw 0x1 subwf lim_tec call iniciar_regs call op_a_producto clrf dato_recibido return ;-----------------fin del cuerpo de pedir producto------------------------ comprobar_precio ;rutina para comprobar si se ha pagado prod movf DATO,w btfsc STATUS,Z goto no_precio movf DATO,w call pasar_a_LCD movlw 0x24 ;ponemos E despues de precio movwf letra call escribir_LCD return no_precio ;por si no hay precio bsf err_prod,0 call escribir_ERROR return esc_err_prec ;rutina para salir por error en el precio call retardo_largo call no_dar ;vamos a o dar el producto e inicializamos clrf tapreta ;registros clrf err_prod clrf decenas call mens_inicio return det_si_cambio ;para ver si hay que dar cambio y si se ha pagado bcf STATUS,C ;el producto bcf STATUS,Z movf DATO,w subwf pagado,w btfss STATUS,C goto sin_dinero ;esto es en el caso de haberse pagado el producto btfss STATUS,Z call detect_cambio return

Page 199: Manual

Anexo Programa ASM de Módulo 1 completo

LVIII

sin_dinero ;si no se ha pagado producto pasamos el error a err_prod bsf err_prod,2 return no_dar ;función donde se procesan los errores y son se da el call no_pagado ;producto por que a avido algún fallo s inicializan clrf decenas ;los registros para comenzanzar de nuevo clrf err_prod clrf tapreta movlw 0x10 movwf aux buck_ret call retardo_largo decfsz aux goto buck_ret call mens_inicio nop return detect_cambio ;para detectar cambio miramos el interruptor que hay en btfsc PORTC,5 ;RB5 (0 no prod, 1 si prod) y guardaremos en err_prod si bsf err_prod,3 ;no hay prod. return dar_producto ;son las funciones que tiene que hacer para dar producto call dar_cambio call entregar_producto call retardo_largo return ;------------------------------------------------------------------------- ;Comunicación RS232 para comprobrar producto y dar producto. entregar_producto ;rutina para dar el producto movf DIREC,w addlw 0x80 ;ponemos el codigo para queel otro micro sepa que ;queremos pedir que entrege el producto movwf TXREG ;enviamos direccion del producto seleccionado call esp_envio ;espermaos confirmación clrf dato_recibido return esp_envio ;para ver si se ha enviado el dato banksel TXSTA espenv btfss TXSTA,TRMT ;una vez que se desactive TRMT es que se ha enviado goto espenv ;la direccion banksel 0 return det_si_prod ;rutina para preguntar si hay producto clrf dato_recibido movf DIREC,w movwf TXREG ;enviamos dato call esp_envio ;esperamos a que se haya enviado el dato espRX2 ;esperamos recibir confirmacion del otro

btfss dato_recibido,0 ;micro para saber si hay o no producto

Page 200: Manual

Anexo Programa ASM de Módulo 1 completo

LIX

goto espRX2 clrf dato_recibido return allo_envio ;rutina por no recibir nada bsf err_prod,1 clrf dato_recibido return ;-------------------------------------------------------------------------- ;tratamiento de errores en el proceso no_pagado call retardo_largo call RS0 movlw 0x88 ;situamos ursor en la posicion 8 de la 1ª linea movwf letra call escribir_LCD call RS1 movlw 0x4E ;N movwf letra call escribir_LCD movlw 0x4f ;O movwf letra call escribir_LCD movlw 0x20 ;space movwf letra call escribir_LCD btfsc err_prod,0 ;si es error por n tener precio goto err_x_precio btfsc err_prod,1 ;si no hay producto goto err_x_gastado btfsc err_prod,3 ;si no hay cambio goto err_x_cambio

call escribir_PG ;escribir PG en el caso de no haber pagado el ;producto

fin_no_pagado ;iniciar registros antes de sperar otra tecla clrf err_prod call op_a_producto return err_x_precio movlw 0x24 ;escribir '$' en el caso de existir precio movwf letra call escribir_LCD goto fin_no_pagado err_x_gastado call escribir_PROD ;en el caso de que el producto se haya gastado goto fin_no_pagado err_x_cambio call escribir_CM ;error xq no hay cambio. goto fin_no_pagado ;-------------------------------------------------------------------------- dar_cambio

Page 201: Manual

Anexo Programa ASM de Módulo 1 completo

LX

movf DATO,w ;aquí para calvular el cambio solamente restamos subwf pagado,w ;a lo pagado el precio del producto y dejamos el ;valor en W ;--------------------------------------------------------------------- dev_dinero ;esta rutina nos da las monedas a devovler por RA solo hay que movwf cambio ; pasarle por el W la cantidad de dinero a devolver. call retardo_largo call RS0 movlw 0x89 ;ponemos el cursor en el espacio 9 de la 1ª linea movwf letra call escribir_LCD call RS1 call escribir_CM ;escribimos CM antes de la cantidad movf cambio,w call pasar_a_LCD ;esribimos la cantidad a devolver call retardo_largo movf cambio,w btfsc STATUS,Z return movwf letraux bcf STATUS,C euro1

movlw B'000101' ;ponemos codigo a pasar al decodificador este codigo movwf maux ;es le de 1 euro movlw D'20' ;revisamos que la cantidad supere 20 subwf letraux,f btfss STATUS,C goto cent50 ;si no lo supera vamos a revisar la moneda de 50 cent. call dar_moneda ;si lo supera vamos a dar la moneda y volvemos a mirar goto euro1 ;si sigue superando 20 para dar otra moneda. cent50

bcf STATUS,C ;como en la anterior se pne el código moneda de 50 cent. movlw B'000100' movwf maux ;se suma 20 que es lo restado antes para quedarnos con movlw D'20' ;el cambio que tenemos realmente addwf letraux,f buc50

movlw D'10' ;y empoezamos como antes a restar 10 hasta que nos salga subwf letraux,f ;negativo que pasara a revisar la moneda de 20 cent. btfss STATUS,C goto cent20 call dar_moneda goto buc50 cent20 bcf STATUS,C ;pasamos el código de la moneda de 20 cent. Y movlw B'000011' ; sumamos 10 para tener el cambio real a dar. movwf maux movlw D'10' addwf letraux,f buc20

movlw D'4' ;restamos 4 hasta que no nos salga negativo que subwf letraux,f ;pasaria a revisar la moneda de 10 cent. btfss STATUS,C

Page 202: Manual

Anexo Programa ASM de Módulo 1 completo

LXI

goto cent10 call dar_moneda goto buc20 cent10 bcf STATUS,C ;pasamos el código de la moneda de 10 cent. movlw B'000010' movwf maux ;y sumamos 4 para volver al valor real movlw D'4' addwf letraux,f buc10

movlw D'2' ;restamos 2 hasta que quede negativo y pasariamos a subwf letraux,f ;la moneda de 5 cent. btfss STATUS,C goto cent5 call dar_moneda goto buc10 cent5 bcf STATUS,C ;pasamos el código de la moneda de 5 cent. y sumamos movlw B'000001' ;2 al valor que teniamos movwf maux movlw '2' addwf letraux,f

btfsc letraux,0 ;si el valor que tenemos del cambio es 0 no damos call dar_moneda ;moneda si es 1 tedremos que dar una moneda de 5 ;cent.

return dar_moneda ;esta función si detecta las anteriores que hay que movf maux,w ;dar una moneda le pasan por maux el vlor de la movwf PORTA ;moneda a dar y pasa el valor al decodificador para banksel TRISA ;que se encienda el LED correspòndiente movlw 0x87 movwf OPTION_REG banksel PORTA call retardo_largo ;aquí hacemos pausas para ver el LED encendido call retardo_largo movlw B'111000' ;volvemos a dejar el decodificador para que no andwf PORTA ;encienda ningun LED call retardo_largo banksel TRISA movlw 0x83 movwf OPTION_REG banksel PORTA return retardo_largo ;retardo para poder ver el LED encendido movlw 0xFF movwf pausa2 retm1 movlw 0xFF movwf pausa retm2 banksel TRISB banksel PORTB decfsz pausa goto retm2 decfsz pausa2

Page 203: Manual

Anexo Programa ASM de Módulo 1 completo

LXII

goto retm1 return ;-------------------------------------------------------------------------- elegir_prod movlw 0x3 ;revisamos si tenemos q poner las unidades o las decenas andwf lim_tec,w ;si no es el caso solo se puede apretar la tecla btfsc STATUS,Z ; aceptar o cancelar goto correcto? movf rmoneda,w ;miramos si no es la tecla acpetar o cancelar btfss rmoneda,3 ;si no lo es revisamos la tecla del numero goto revisar_tecla andlw 0x6 ;miramos si es la tecla 9 btfsc STATUS,Z goto revisar_tecla movf rmoneda,w btfsc rmoneda,2 return btfsc rmoneda,0 goto correcto? ;en el caso que sea la tecla aceptar o cancelar return revisar_tecla btfsc lim_tec,1 goto enviar_decena call RS0 movlw 0xc6 ;ponemos cursor en espacio 6 de la 2ª linea del display movwf letra call escribir_LCD call RS1 movf rmoneda,w ;escribimos el valor de las unidad del producto a addlw 0x30 ;elegir movwf letra call escribir_LCD call RS0 movlw 0xca ;ponemos el cursor en el espacio 10 de la 2ª linea movwf letra call escribir_LCD call RS1 movf decenas,w addwf rmoneda,w ;aqui guardamos la direcion del producto movwf DIREC call EE_LEE call comprobar_precio ;revisamos precio y o escribimos clrf tapreta clrf lim_tec return enviar_decena clrf tapreta btfsc rmoneda,2 ;cancelo si la tecla es mayor de 4 return btfsc rmoneda,3 ;cancelo si la tecla es 8 o 9 return call RS0 ;ponemos el display en 2ª linea movlw 0xC0 movwf letra call escribir_LCD

Page 204: Manual

Anexo Programa ASM de Módulo 1 completo

LXIII

call RS1 call escribir_PROD movlw 0x20 ;espacio en blanco movwf letra call escribir_LCD movf rmoneda,w ;escibimos la decena del dislay movwf num_prod addlw 0x30 movwf letra call escribir_LCD buc_decenas ;bucle para calcular las decenas movlw 0 addwf rmoneda btfsc STATUS,Z ;revisamos si es lña tecla 0 goto escribe_0 movlw 0x10 ;sumamos 10 para convertir a decenas addwf decenas movlw 0x1 subwf rmoneda btfss STATUS,Z goto buc_decenas subwf lim_tec clrf tapreta return escribe_0 clrf tapreta ;ponemos a 0 el registro tecla apretada para sig. tecla movlw 1 subwf lim_tec ;quitamos 1 al limite de tecla para saber q la return ; siguiente es las unidades correcto? ;para saber si se aprieta la tecla de cacelar o aceptar btfss rmoneda,3 goto fin_correcto? btfss rmoneda,0 goto aceptado goto cancelado aceptado btfss err_prod,0 ;si hay error por q no tiene precio no deja activar ;el registro prod_elegido bsf prod_elegido,0 ;ponemos a ‘1’ el registro de prod_elelgido para goto fin_correcto? ;que al salir de seleccionar producto sepa que ya ;ha sido seleccionado cancelado clrf decenas ;si es tecla cancelar se inician registros y LCD call op_a_producto ;y se comienza de nuevo call mens_inicio goto fin_correcto? fin_correcto? clrf tapreta ;aquí solamente ponemos a ‘0’ el registro que nos dice return ;si hay una tecla apretada. ;-------------------------------------------------------------------------- op_a_producto ;para iniciar registros

Page 205: Manual

Anexo Programa ASM de Módulo 1 completo

LXIV

movlw 0x2 movwf lim_tec clrf err_prod clrf prod_elegido clrf tapreta return iniciar_regs ;para iniciar registros clrf num_prod clrf decenas clrf tapreta return ;-------------------------------------------------------------------------- mens_inicio ;mensaje de inicio a escribir en LCD movlw 0x1 movwf letra call clear_display movf pagado,w call pasar_a_LCD call escribir_PG return escribir_PG movlw 0x50 ;letra P movwf letra call escribir_LCD movlw 0x47 ;letra G movwf letra call escribir_LCD return escribir_PROD movlw 0x50 ;letra P movwf letra call escribir_LCD movlw 0x52 ;letra R movwf letra call escribir_LCD movlw 0x4f ;letra O movwf letra call escribir_LCD movlw 0x44 ;letra D movwf letra call escribir_LCD return escribir_CM movlw 0x43 ;letra C movwf letra call escribir_LCD movlw 0x4d ;letra M movwf letra call escribir_LCD return escribir_NUE movlw 0x4e ;letra N

Page 206: Manual

Anexo Programa ASM de Módulo 1 completo

LXV

movwf letra call escribir_LCD movlw 0x55 ;letra U movwf letra call escribir_LCD movlw 0x45 ;letra E movwf letra call escribir_LCD return escribir_ERROR movlw 0x45 ;letra E movwf letra call escribir_LCD movlw 0x52 ;letra R movwf letra call escribir_LCD movlw 0x52 ;letra R movwf letra call escribir_LCD movlw 0x4f ;letra O movwf letra call escribir_LCD movlw 0x52 ;letra R movwf letra call escribir_LCD clear_display ;función para las instruciones de 1,53ms de la pantalla de

;LCD banksel TRISB movlw 0x87 movwf OPTION_REG banksel PORTA call RS0 call E1 clrf PORTC call E0

call E1 movf letra,w

movwf PORTC call E0 movlw 0x80 movwf TMR0 t0 btfsc TMR0,7 goto t0 call RS1 banksel TRISA movlw 0x83 movwf OPTION_REG banksel PORTA return escribir_LCD ;función para las instruccion de 49us de la pantalla LCD call E1 movf letra,w andlw 0xf0

Page 207: Manual

Anexo Programa ASM de Módulo 1 completo

LXVI

movwf lauxil swapf lauxil,w movwf PORTC call E0 call E1 movlw 0x0f andwf letra,w movwf PORTC call E0 movlw 0xFC movwf TMR0 t1 btfsc TMR0,7 goto t1 return E0 ;función para poner la entrada E del LCD a '0' bcf PORTB,4 return E1 ;función para poner la entrada E del LCD a '1' bsf PORTB,4 return RS0 ;función para poner la entrada RS del LCD a '0' bcf PORTB,3 return RS1 ;función para poner la entrada RS del LCD a '1' bsf PORTB,3 return limpiar_LCD ;función para dejar la pantalla sin nada call RS0 ;aqui hariamos un RETURN HOME movlw 0x02 movwf letra call clear_display movlw 0x01 ;aqui harimaos un CLEAR DISPLAY movwf letra call clear_display return ;-------------------------------------------------------------------------- ;EEPROM ;funciones de la EEPROM EE_ESCRIBE ;con esta escvribimos un valor pasado por el W movf DATO,w ;en la Direccion psada por el registro DIREC banksel EEDATA movwf EEDATA banksel 0 movf DIREC,w banksel EEADR movwf EEADR banksel EECON1 bsf EECON1,WREN bcf INTCON,GIE movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1,WR

Page 208: Manual

Anexo Programa ASM de Módulo 1 completo

LXVII

bsf INTCON,GIE bcf EECON1,WREN EE_WAIT btfsc EECON1,WR goto EE_WAIT banksel DATO return EE_LEE ;leemos el valor de la EEPROM que este en el movf DIREC,w ;Registro DIREC que le hemos pasado banksel EEDATA movwf EEADR banksel EECON1 bsf EECON1,RD banksel EEDATA movf EEDATA,w banksel DATO movwf DATO ;devolvemos el valor leido por el registro DATO return ;-------------------------------------------------------------------------- INTERRUPT ;rutina de interrupcion para recibir datos banksel 0x0 nop L1 btfss PIR1,RCIF ;miramos si la interupcion es por recepcion goto L2 btfss RCSTA,2 ;si lo es miramos queno haya error de framing goto ER1 bsf err_prod,1 ;si lo hay leemos RCREG par quitar error activamos movf RCREG,F ;el registro de error movlw CANCELAR ;y enviamos CANCELAR al otro micro movwf TXREG goto L1 ER1 btfss RCSTA,1 ;miramos si ha y errror de overfow goto revisar_enviado bsf err_prod,1 ;si lo hay ponemos a ‘0’ CREN y despues a ‘1’ para bcf RCSTA,4 ;quitar el error bsf RCSTA,4 bsf dato_recibido,0 goto L1 revisar_enviado ;aquí llemos el datorecibido y lo pasamos a regisro movf RCREG,w ;auxiliar movwf aux_int btfss modo_precio,0 ;si no estamos en modo precio vamos es q goto rec_conf_producto ;recibimos confirmacion de producto o inicio btfsc esp_DIREC,0 ;de cambio de EEPROM goto pet_DIREC ;si estamos en modo precio es que esperamos btfsc esp_DIREC,1 ;alguno de los aparados para cambiar el precio goto rec_DIREC ;de la EEPROM y mira haber cual espera para ir btfsc esp_DATO,0 ;alli goto pet_DATO goto rec_DATO rec_conf_producto ;aqui miramos si es la confirmacion de producto movf aux_int,w ;o que se inicia el cambio de la EEPROM xorlw INICIO btfss STATUS,Z

Page 209: Manual

Anexo Programa ASM de Módulo 1 completo

LXVIII

goto int_ped_prod goto ini_int_EEPROM ;------------------------------ int_ped_prod ;confirmación de pedir producto movf aux_int,w xorlw ACEPTAR btfsc STATUS,Z goto correcto FALLO ;si no hay proucto hace esto

bsf err_prod,1 bsf dato_recibido,0 goto L1 correcto ;si lo hay hace esto otro clrf err_prod bsf dato_recibido,0 goto L1 ;------------------------------- pet_DIREC ;funcion que espera la peticion de direcion movf aux_int,w ;comprueba que sea la peticion de direccion xorlw EDIREC ;si lo es envia codigo de ‘aceptar’ si no lo btfss STATUS,Z ;es va a revisar si es el fin del ambio de la goto fin_cambio_EEPROM ; EEPROM movlw 2 ;se pone a esperar la direccion movwf esp_DIREC movlw ACEPTAR movwf TXREG call esp_envio ;espera a que el dato haya sido enviado goto L1 rec_DIREC ;funcion que espera la direcion movf aux_int,w ;comprueva que pueda ser direccion si no xorlw 0xC0 ;va a fallo de transmision btfsc STATUS,Z goto fallo_tx movf aux_int,w ;si lo es guarda la direcion y se queda a movwf DIREC ;esperar peticion de dato y envia el codigo clrf esp_DIREC ;de ‘aceptar’ bsf esp_DATO,0 movlw ACEPTAR movwf TXREG call esp_envio ;espera a que el dato haya sido enviado goto L1 pet_DATO ;espera la peticion de dato compruevaque lo movf aux_int,w ;recibido es petidion de dato si no lo es va xorlw EDATO ;a fallo de transmisión btfss STATUS,Z goto fallo_tx ;si lo es se pone a esperar dato y se queda movlw 2 ;a esperar el dato y envia codigo ‘aceptar’ movwf esp_DATO movlw ACEPTAR movwf TXREG

Page 210: Manual

Anexo Programa ASM de Módulo 1 completo

LXIX

call esp_envio ;espera a que el dato haya sido enviado goto L1 rec_DATO ;Aquí recibe el dato n comprueba que este bien movf aux_int,w ;porque no se puede lo que hace es con el dato movwf DATO ;recibido y la direccion recibida cambia el bsf esp_DIREC,0 ;dato de la direccion de la EEPROM y se queda clrf esp_DATO ;a la espera de una nueva peticion de call EE_ESCRIBE ;direccion y envia el codigo de ‘aceptar’ movlw ACEPTAR movwf TXREG call esp_envio ;espera a que el dato haya sido enviado goto L1 fallo_tx ;ene l caso de fallo de transmision movlw CANCELAR ;manda el codigo de ‘cancelar’ movwf TXREG call esp_envio ;espera a que el dato haya sido enviado goto L1 ini_int_EEPROM ;en el caso de haber recibido inicio de transmision movlw 0xF ;ponemos a '1' todos los errores para q salga de las movwf err_prod ;rutinas x si esta en medio de pedir producto clrf tapreta ;eliminamos si habia una tecla apretada

bsf modo_precio,0 ;esto es para saber que estamos en modo ;cambiar precio

movlw ACEPTAR ;enviamos como respuesta 'F0' movwf TXREG call esp_envio goto L1 fin_cambio_EEPROM clrf modo_precio ;ponemos a 0 para saber que ya no se esta clrf esp_DIREC ;cambiando la EEPROM e inicia todos los clrf esp_DATO ;los registros para continuar el proceso bsf esp_DIREC,0 bsf esp_DATO,0 clrf err_prod goto L1 L2 retfie Retardo ;pequeño retardo para el inciar el LCD movlw 0x80 movwf TMR0 b_r btfsc TMR0,7 goto b_r return end

Page 211: Manual

Anexo Programa ASM práctica 2

LXX

A.2 Módulo 2 A.2.1. Programa ASM de práctica 2

#include "p16f877.inc" ;registros de proposito general DATO equ 0x30 ;dato de eprom DIREC equ 0x31 ;direcion eprom modo_envio equ 0x33 ;para pasar a modo de envio de la EEPROM decena equ 0x35 ;para guardar las decenas del producto selec. pausa2 equ 0x36 ;otro reg para pausa aux equ 0x37 ;reg auxiliar aux1 equ 0x38 ;reg auxiliar rtecla equ 0x40 ;valor de la tecla apretada tapreta equ 0x41 ;ponemos a '1' si la tecla a sido apretada rprecio equ 0x42 ;precio producto r1 equ 0x43 ;Guardamos la columna elegida r2 equ 0x44 ;guardamos la fila elegida mas_fil equ 0x45 ;se guarda la mascara de la fila ret1 equ 0x51 ;registro para retardo ret2 equ 0x52 ;registro para retardo ret3 equ 0x53 ;registro para retardo lim_tec equ 0x54 ;registro para saber q tiene q detectar 2 teclas en

;producto num_prod equ 0x55 ;registro producto seleccionado rmonaux equ 0x56 ;reg para calcular las decenas en precio pagado equ 0x57 ;reg de la cantidad pagada digito equ 0x58 ;reg aux para el digito a pasar al LCD ret equ 0x59 ;para hacer el retardo letra equ 0x5a ;reg para escribir en LCD letraux equ 0x5b ;reg aux para escr precios en LCD lauxil equ 0x5c ;reg auxiliar para escribir tecla esp_prec equ 0x5d ;para saber si hemos insertado el producto prod_elegido equ 0x5e ;reg para elegir el producto precio_actual equ 0x5f ;donde guardamos el precio introducido borrar_memoria equ 0x46 ;para saber si queremos borrar a memoria o no. org 0x0 inicio call iniciar_LCD ;vamos a rutina para iniciar la pantalla LCD call conf_tec ;vamos a rutina para dar vlaores a las teclas call conf_mic ;vamos a rutina para configurar el micro buckle nop call ver_tecla btfsc tapreta,0 ;mira si hay una tecla apretada y si no es asi call mod_precio ;vuelve a revisar el teclado goto buckle ;rutina para iniciar el LCD iniciar_LCD banksel TRISA movlw 0xe0

Page 212: Manual

Anexo Programa ASM práctica 2

LXXI

movwf TRISC ;RC<0:4> SALIDAS RC<5:7> entradas para RX y TX movlw 0xc0 movwf TRISB ;RB<0:2> entradas RC<3:7> salidas movlw 0x0f movwf TRISA ;RA SALIDAS movlw 0x03 ;pre-escaler a 1:16 movwf OPTION_REG banksel PORTA movf PORTA,W ;ponemos la instrucción FUCTION SET andlw 0XF movwf PORTA call RS0 call E1 movlw 0x02 movwf PORTC call retardo_ini call E0 movlw 0x2F movwf letra call escribir_LCD call retardo_ini movlw 0x0f ;ponemos la instrucción DISPLAY ON/OFF control movwf letra call escribir_LCD call retardo_ini movlw 0x01 ;ponemos la instrucción CLEAR_DISPLAY movwf letra call clear_display call retardo_ini call RS0 ;ponemos la instrucción ENTRY MODE SET movlw 0x06 movwf letra call escribir_LCD call retardo_ini call RS1 return ;fin de la inicialización del LCD ;asignamos cada valor del teclado a un registro conf_tec movlw 1 ;tecla 1 movwf 0x20 movlw 2 ;tecla 2 movwf 0x21 movlw 3 ;tecla 3 movwf 0x22 movlw 0xf ;tecla f movwf 0x23 movlw 4 ;tecla 4 movwf 0x24 movlw 5 ;tecla 5 movwf 0x25 movlw 6 ;tecla 6 movwf 0x26 movlw 0xe ;tecla e movwf 0x27 movlw 7 ;tecla 7 movwf 0x28

Page 213: Manual

Anexo Programa ASM práctica 2

LXXII

movlw 8 ;tecla 8 movwf 0x29 movlw 9 ;tecla 9 movwf 0x2a movlw 0xd ;tecla d movwf 0x2b movlw 0xa ;tecla a movwf 0x2c movlw 0 ;tecla 0 movwf 0x2d movlw 0xb ;tecla b movwf 0x2e movlw 0xc ;tecla c movwf 0x2f return ;Configuracion del micro iniciar_mic banksel ADCON1 ;cogemos el banco de memoria 1 movlw 0x07 movwf ADCON1 ;salidas digitales de RA movwf OPTION_REG banksel PORTC ; banco 0 clrf PORTB bcf PORTC,4 clrf r1 clrf r2 clrf tapreta ;inicializa el valor del reg. de valor de tecla clrf rtecla ;inicializa el valor del reg. de tecla apretada clrf rprecio ;inicializamos el valor del registro de precio clrf num_prod clrf decena clrf borrar_memoria clrf lim_tec bsf lim_tec,1 ;iniciamos lim_tec a 2 clrf esp_prec bsf modo_envio,0 clrf prod_elegido banksel EECON1 ;esto es para configurar la EEPROM bcf EECON1,EEPGD ;ponemos en modo ecritura de datos banksel PORTB ;volvemos al primer banco call mens_inicio return ;-------------------------------------------------------------------------- ver_tecla movlw 0x01 movwf PORTC clrf r1 ;guardamos 0 en r1 para saber q estamos en la columna 1 call rev_fila ;vamos a mirar las filas una por una movlw 0x02 movwf PORTC movlw 0x04 movwf r1 ;guardamos 4 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas

Page 214: Manual

Anexo Programa ASM práctica 2

LXXIII

movlw 0x04 movwf PORTC movlw 0x08 movwf r1 ;guardamos 8 en r1 para saber q estamos en la columna 3 call rev_fila ;volvemos a mirar filas movlw 0x08 movwf PORTC movlw D'12' movwf r1 ;guardamos 12 en r1 para saber q estamos en la columna 4 call rev_fila ;volvemos a mirar filas return ;volvemos al prinicipio rev_fila btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return clrf r2 ;ponemos 0 para saber que es la fila 1 movlw 0x01 movwf mas_fil ;guardamos mascara para comprobar despues btfsc PORTA,0 ;miramos si la fila 1 esta a 0 para mirar ;numero si no es asi seguimos call confimar_tecla btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return movlw 0x01 movwf r2 ;ponemos el valor 1 para saber q es la fila 2 movlw 0x02 movwf mas_fil ;volvemos a guardar mascara btfsc PORTA,1 ;comprobamos bit 1 para saber ;si la tecla de la fila esta activada call confimar_tecla btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return movlw 0x02 ;guardamos el valor 2 para la fila 3 movwf r2 movlw 0x04 movwf mas_fil btfsc PORTA,2 call confimar_tecla btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return movlw 0x03 ;guardamos el valor 2 para la fila 3 movwf r2 movlw 0x08 movwf mas_fil btfsc PORTA,3 call confimar_tecla return confimar_tecla call ret_corto movlw 0x0F

Page 215: Manual

Anexo Programa ASM práctica 2

LXXIV

andwf PORTA,w

xorwf mas_fil,w ;hacemos una xor entre la mascara guardada y W ;si el resultado es diferente de 1 es q la tecla ;esta pulsada

btfss STATUS,Z ;para mirarlo si el flag Z del STATUS esta a 0 es q return ;la tecla se pulso si no es asi seguimos con el

;programa ;aqui calculamos la tecla apretada most_num clrw addwf r1,w ;sumamos r1 y r2 para despues saber el valor de addwf r2,w ;la tecla apretada addlw 0x20 movwf FSR ;movemos el valor a FSR para acceso indirecto movf INDF,w movwf rtecla ;guardamos el resultado de la tecla

bsf tapreta,0 ;poenmos a '1' el bit 0 de tapreta para saber que ;hay 1 tecla apretada

;buckle para saber si la tecla deja de ser apretada sol_tec movlw 0x0f andwf PORTA,w andwf mas_fil,w ;volvemos a utilizar la mascara para saber si la tecla sigue apretada btfss STATUS,Z ;hasta q el flag Z no este a 1 no saldra del buckle goto sol_tec return ;-------------------------------------------------------------------------- ;rutina para modificar precio mod_precio clrf tapreta ;se mira si se ha elegido producto si no vamos btfss prod_elegido,0 ;a elergirlo si yas eha elegido revisamos la goto elegir_prod ;tecla apretda el_precio btfss esp_prec,0 ;si es el primer numero del precio salta goto siguiente ;de lo contrario va a siguiente btfss rtecla,3 ;miramos si es una tecla entre 0-7 goto primera_letra movlw 0x06 andwf rtecla,w ;miramos si es la tecla 8 o 9 btfsc STATUS,Z goto primera_letra clrf tapreta ;vamos mirando que sea la tecla ‘Cancelar’ btfsc rtecla,2 ;por si se cancela el proceso return btfss rtecla,0 return goto cancelar primera_letra call RS0 movlw 0xc0 ;ponemos el cursor en la 2ª linea movwf letra

Page 216: Manual

Anexo Programa ASM práctica 2

LXXV

call escribir_LCD call RS1 call escribir_NUE ;escribimos NUE antes del precio bcf esp_prec,0 ;ponemos a 0 esp_prec para poder apretar clrf decena ;la tecla cancelar clrf num_prod siguiente ;es igual que el precio pero con la posibilidad de la tecla ;’ACEPTAR’ movf rtecla,w btfss rtecla,3 ;no saltamos si es tecla 0,1,2,3,4,5,6 o 7 goto rev_precio andlw 0x6 btfsc STATUS,Z ;no saltamos si es tecla 8 o 9 goto rev_precio btfsc rtecla,2 ;no saltamos si es tecla C,D,E o F goto err_tecla btfss rtecla,0 ;no saltamos si es tecla A goto aceptar goto cancelar ;tiene q ser la tecla B err_tecla ;ene l caso de que haya pulsado una tecla clrf tapreta ;que no tocaba se limpia el regisrtro de tecla return ;apretada y se vuelve a esperar otra cancelar ;aqui inicializamos los registros para empezar clrf DIREC ;de nuevo movlw 0x02 movwf lim_tec call iniciar_regs bsf esp_prec,0 bsf modo_envio,0 clrf prod_elegido call escribir_CANCEL call retardo call mens_inicio return aceptar ;en esta función pasamos el valor del precio

movf precio_actual,w movwf DATO ;en la dirección guardada y se va a la función movlw 0x02 ;de escibir en la eeprom movwf lim_tec call EE_ESCRIBE call iniciar_regs call RS0 ;ponemos cursor en pos 8 de 2ª linea de LCD movlw 0xc9 movwf letra call escribir_LCD call RS1 movf DATO,w ;escribimos en LCd el precio insertado en EEPROM call pasar_a_LCD call retardo call mens_inicio ;vamos a inicializar la panatalla LCD y se inician bsf esp_prec,0 ;los registros para empezar de nuevo bsf modo_envio,0 clrf prod_elegido

Page 217: Manual

Anexo Programa ASM práctica 2

LXXVI

return iniciar_regs clrf num_prod clrf decena clrf tapreta return rev_precio ;esto es para seleccionar el precio movf rtecla,w ;lo unico que hacemos es leer la tecla addlw 0x30 ;escribirla en el LCD movwf letra movf decena,w addwf rtecla,w movwf rtecla btfsc STATUS,Z ;revisamos si es 0 goto f_rev_precio movwf aux clrf decena buc_rev_precio ;aquí que es la continuacion multiplica el valor movlw d'10' ;del precio por 10 para la siguiente teca que se addwf decena ;apriete decf aux,f btfss STATUS,Z goto buc_rev_precio f_rev_precio ;finalizamos actualizando los precios movf rtecla,w ;para la siguiente tecla movwf precio_actual call escribir_LCD clrf tapreta movlw 0x02 movwf lim_tec return ;-------------------------------------------------------------------------- elegir_prod btfsc borrar_memoria,0 goto mirar_si_borro movf rtecla,w ;miramos si no es la tecla acpetar o cancelar btfss rtecla,3 ;si no lo es revisamos la tecla del numero goto revisar_tecla andlw 0x6 ;miramos si es la tecla 8 o 9 btfsc STATUS,Z goto revisar_tecla movf rtecla,w btfsc rtecla,2 goto mirar_si_envio btfsc rtecla,0 ;si es la tecla B se cancela el proceso goto cancelar return mirar_si_envio ;esto para ver si es la tecla envir btfss modo_envio,0 ;o borrar la memoria return btfss rtecla,1 return

Page 218: Manual

Anexo Programa ASM práctica 2

LXXVII

btfss rtecla,0 goto enviar_RS2 goto ini_reset_memory mirar_si_borro ;si se ha seleccionado borrar la memoria btfss rtecla,3 ;solo podemos apretar la tecla aceptar y return ;cancelar btfsc rtecla,2 return btfss rtecla,1 return btfsc rtecla,0 goto fin_borrar_memoria ;tecla cancelar goto reset_memory ;tecla aceptar revisar_tecla ;si es una tecla numerica primero se revisa si btfsc lim_tec,1 ;se han insertado las decenas del producto goto enviar_decena movf rtecla,w ;en el caso que si, se escribe la unidad del addlw 0x30 ;producto movwf letra call escribir_LCD call RS0 movlw 0x89 ;ponemos el cursor en el espacio 10 de la 2ª linea movwf letra call escribir_LCD call RS1 movf decena,w addwf rtecla,w ;sumams las decenas del producto a la unidad movwf DIREC ;y guardamos en DIREC que nos servirá para buscar clrf tapreta ;el precio en la EEPROM se inicializan los clrf lim_tec ;registros bsf prod_elegido,0 call EE_LEE ;se busca precio en EEPROM movf DATO,w call pasar_a_LCD ;se escribi precio en EEPROM bsf esp_prec,0 return enviar_decena clrf tapreta btfsc rtecla,2 ;si la tecla es mayor de 4 cancelamos return btfsc rtecla,3 ;si la tecla es 8 o 9 cancelamos return call RS1 bcf modo_envio,0 movf rtecla,w ;escibimos la decena del dislay movwf num_prod addlw 0x30 movwf letra call escribir_LCD buc_decenas ;bucle para calcular las decenas movf rtecla,w btfsc STATUS,Z ;revisamos si es lña tecla 0 goto escribe_0

Page 219: Manual

Anexo Programa ASM práctica 2

LXXVIII

movlw 0x10 ;sumamos 10 para convertir a decenas addwf decena movlw 0x1 subwf rtecla btfss STATUS,Z goto buc_decenas bcf lim_tec,1 clrf tapreta return escribe_0 clrf tapreta ;ponemos a 0 el registro tecla apretada movlw 1 ;para sig. tecla

subwf lim_tec ;quitamos 1 al limite de tecla para saber q la ;siguiente es las unidades

return ;-------------------------------------------------------------------------- enviar_RS2 nop ;esto es para enviar losdatos de la EEPROM pero return ;no se va a hacer en esta practica ;-------------------------------------------------------------------------- ;Para poner a cero la memoria EEPROM ini_reset_memory call limpiar_LCD call escribir_borrar_memoria bsf borrar_memoria,0 return fin_borrar_memoria call mens_inicio bcf borrar_memoria,0 return reset_memory clrf DIREC arriba clrf DATO ;aquí pnemos a 0 todos los valores de call EE_ESCRIBE ;la EEPROM entre los valores 00 y 39 call RS0 movlw 0xc0 movwf letra call escribir_LCD call RS1 movf DIREC,w call escribir_DIREC incf DIREC,f btfsc DIREC,6 goto fin_borrar_memoria goto arriba ;-------------------------------------------------------------------------- ;funciones de la EEPROM EE_ESCRIBE ;con esta escvribimos un valor pasado por el W movf DATO,w ;en la Direccion psada por el registro DIREC banksel EEDATA movwf EEDATA

Page 220: Manual

Anexo Programa ASM práctica 2

LXXIX

banksel 0 movf DIREC,w banksel EEADR movwf EEADR banksel EECON1 bsf EECON1,WREN bcf INTCON,GIE movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1,WR bsf INTCON,GIE bcf EECON1,WREN EE_WAIT btfsc EECON1,WR goto EE_WAIT banksel DATO return EE_LEE ;leemos el valor de la EEPROM que este en el Registro movf DIREC,w ;DIREC que le hemos pasado banksel EEDATA movwf EEADR banksel EECON1 bsf EECON1,RD banksel EEDATA movf EEDATA,w banksel DATO movwf DATO ;devolvemos el valor leido por el registro DATO return ;-------------------------------------------------------------------------- mens_inicio call limpiar_LCD call escribir_PROD return escribir_CANCEL call RS0 movlw 0xc8 ;situamos cursor en espacio 8 de 2ª linea movwf letra call escribir_LCD call RS1 movlw 0x43 ;letra C movwf letra call escribir_LCD movlw 0x41 ;letra A movwf letra call escribir_LCD movlw 0x4e ;letra N movwf letra call escribir_LCD movlw 0x43 ;letra C movwf letra call escribir_LCD movlw 0x45 ;letra E

Page 221: Manual

Anexo Programa ASM práctica 2

LXXX

movwf letra call escribir_LCD movlw 0x4c ;letra L movwf letra call escribir_LCD return escribir_DIREC movwf letraux clrf digito call limpiar_LCD escribir_DIREC2 movlw 0x10 subwf letraux btfss STATUS,C goto DIREC_decenas movlw 1 addwf digito goto escribir_DIREC2 DIREC_decenas ;envio las centenas movlw 0x10 addwf letraux movf digito,w addlw 0x30 movwf letra call escribir_LCD clrf digito DIREC_unidades movf letraux,w addlw 0x30 movwf letra call escribir_LCD return escribir_borrar_memoria movlw 0x42 ;letra B movwf letra call escribir_LCD movlw 0x4f ;letra O movwf letra call escribir_LCD movlw 0x52 ;letra R movwf letra call escribir_LCD movlw 0x52 ;letra R movwf letra call escribir_LCD movlw 0x41 ;letra A movwf letra call escribir_LCD movlw 0x52 ;letra R movwf letra call escribir_LCD movlw 0x20 ;letra ' ' movwf letra

Page 222: Manual

Anexo Programa ASM práctica 2

LXXXI

call escribir_LCD movlw 0x4d ;letra M movwf letra call escribir_LCD movlw 0x45 ;letra E movwf letra call escribir_LCD movlw 0x4d ;letra M movwf letra call escribir_LCD movlw 0x4f ;letra O movwf letra call escribir_LCD movlw 0x52 ;letra R movwf letra call escribir_LCD movlw 0x49 ;letra I movwf letra call escribir_LCD movlw 0x41 ;letra A movwf letra call escribir_LCD movlw 0x3f ;letra ? movwf letra call escribir_LCD return escribir_NUE movlw 0x4e ;letra N movwf letra call escribir_LCD movlw 0x55 ;letra U movwf letra call escribir_LCD movlw 0x45 ;letra E movwf letra call escribir_LCD return escribir_PROD movlw 0x50 ;letra P movwf letra call escribir_LCD movlw 0x52 ;letra R movwf letra call escribir_LCD movlw 0x4f ;letra O movwf letra call escribir_LCD movlw 0x44 ;letra D movwf letra call escribir_LCD movlw 0x20 ;ponemos espacio en blanco movwf letra call escribir_LCD return

Page 223: Manual

Anexo Programa ASM práctica 2

LXXXII

clear_display ;función para las instruciones de 1,53ms del LCD banksel TRISB movlw 0x87 movwf OPTION_REG banksel PORTA call RS0 call E1 clrf PORTC call E0

call E1 movf letra,w

movwf PORTC call E0 movlw 0x80 movwf TMR0 t0 btfsc TMR0,7 goto t0 call RS1 banksel TRISA movlw 0x83 movwf OPTION_REG banksel PORTA return escribir_LCD ;función para las instruccion de 49us de la pantalla LCD call E1 movf letra,w andlw 0xf0 movwf lauxil swapf lauxil,w movwf PORTC call E0 call E1 movlw 0x0f andwf letra,w movwf PORTC call E0 movlw 0xFC movwf TMR0 t1 btfsc TMR0,7 goto t1 return E0 ;función para poner la entrada E del LCD a '0' bcf PORTB,5 return E1 ;función para poner la entrada E del LCD a '1' bsf PORTB,5 return RS0 ;función para poner la entrada RS del LCD a '0' bcf PORTB,4 return RS1 ;función para poner la entrada RS del LCD a '1' bsf PORTB,4 return

Page 224: Manual

Anexo Programa ASM práctica 2

LXXXIII

limpiar_LCD ;función para dejar la pantalla sin nada call RS0 ;aqui hariamos un RETURN HOME movlw 0x02 movwf letra call clear_display movlw 0x01 ;aqui harimaos un CLEAR DISPLAY movwf letra call clear_display return pasar_a_LCD ;todo lo de abajo es para mostrar precio por el LCD movwf letraux clrf digito b_millares ;esto es para las de movlw D'200' subwf letraux btfss STATUS,C goto millar_no movlw 1 addwf digito goto millar_si millar_no movlw D'200' ;este es solo en caso q sea + de 10 euros addwf letraux millar_si movf digito,w addlw 0x30 movwf letra call escribir_LCD clrf digito b_centenas ;calculo las centenas de lo que he metido movlw D'20' subwf letraux btfss STATUS,C goto centenas movlw 1 addwf digito goto b_centenas centenas ;envio las centenas movlw D'20' addwf letraux movf digito,w addlw 0x30 movwf letra call escribir_LCD movlw 0x2c ;escribo una coma para separar euros de centimos movwf letra call escribir_LCD clrf digito

Page 225: Manual

Anexo Programa ASM práctica 2

LXXXIV

b_decenas ;y calculo decenas movlw D'2' subwf letraux btfss STATUS,C goto unidades movlw 1 addwf digito goto b_decenas unidades movf digito,w ;envio decenas addlw 0x30 movwf letra call escribir_LCD movlw D'2' addwf letraux movlw 0x30 btfsc letraux,0 ;calculo y envio unidades movlw 0x35 movwf letra call escribir_LCD clrf letraux return ;-------------------------------------------------------------------------- retardo ;diferente funciones de retardo de diferentes tiempos movlw 0x1f ;para hacer pausas durante el programa movwf ret3 retardo3 decf ret3,f btfsc STATUS,Z return movlw 0xFF movwf ret1 movwf ret2 retardo1 decf ret1,f btfsc STATUS,Z goto retardo3 retardo2 decf ret2,f btfsc STATUS,Z goto retardo1 goto retardo2 ret_corto movlw 0xFF movwf ret1 movwf ret2 r1c decf ret1,f btfsc STATUS,Z return r2c decf ret2,f btfsc STATUS,Z goto r2c movlw 0xff movwf ret2

Page 226: Manual

Anexo Programa ASM práctica 2

LXXXV

goto r1c retardo_ini movlw 0x80 movwf TMR0 b_r_ini btfsc TMR0,7 goto b_r_ini return end

Page 227: Manual

Anexo Programa ASM práctica 5

LXXXVI

A.2.2. Programa ASM de práctica 5

#include "p16f877.inc" ;etiquetas CANCELAR equ 0x4F ;por si cancelas algun paso ACEPTAR equ 0xF0 ;para aceptar el precio. INICIO equ 0xfF ;para iniciar envio FIN equ 0x66 ;para acabar envio EDATO equ 0xAA ;para decir que envio dato EDIREC equ 0x55 ;para decir que envio direccion CANC_PRO equ 0x0F ;lo que enciamos se cancela producto ;registros de proposito general DATO equ 0x30 ;dato de eprom DIREC equ 0x31 ;direcion eprom dato_recibido equ 0x32 ;para saber si se ha recibido el dato por RX. continuar equ 0x34 pausa2 equ 0x36 ;otro reg para pausa aux equ 0x37 ;reg auxiliar aux1 equ 0x38 ;reg auxiliar rtecla equ 0x40 ;valor de la tecla apretada tapreta equ 0x41 ;ponemos a '1' si la tecla a sido apretada rprecio equ 0x42 ;precio producto r1 equ 0x43 ;Guardamos la columna elegida r2 equ 0x44 ;guardamos la fila elegida mas_fil equ 0x45 ;se guarda la mascara de la fila recibido equ 0x50 ;donde guardamos el valor de lo q recibimos ret1 equ 0x51 ;registro para retardo ret2 equ 0x52 ;registro para retardo ret3 equ 0x53 ;registro para retardo digito equ 0x58 ;reg aux para el digito a pasar al LCD ret equ 0x59 ;para hacer el retardo letra equ 0x5a ;reg para escribir en LCD letraux equ 0x5b ;reg aux para escr precios en LCD lauxil equ 0x5c ;reg auxiliar para escribir tecla org 0x0 clrf INTCON ;deshabilitamos interrupciones para iniciar micro goto inicio org 0x4 goto INTERRUPT ;cuando se produzca una interrupción vendrá aqui

org 0x5 ;comienza el programa aqui inicio call iniciar_LCD ;vamos a rutina para iniciar la pantalla LCD call conf_tec ;vamos a rutina para dar vlaores a las teclas call conf_mic ;vamos a rutina para configurar el micro buckle nop call ver_tecla btfsc tapreta,0 ;mira si hay una tecla apretada para enviar call mirar_si_envio ; la opcion del teclado si no va a volver a mirar goto buckle

Page 228: Manual

Anexo Programa ASM práctica 5

LXXXVII

;rutina para iniciar el LCD iniciar_LCD banksel TRISA movlw 0xF0 movwf TRISC ;RC<0:4> SALIDAS RC<5:7> entradas para RX y TX movlw 0x07 movwf TRISB ;RB<0:2> entradas RC<3:7> salidas movlw 0x18 movwf TRISA ;RA<0:2> SALIDAS RA <3:4> entradas movlw 0x83 ;ponemos el pre-escaler a 1:16 movwf OPTION_REG banksel PORTA clrf PORTA ;ponemos la instrucción FUCTION SET call RS0 call E1 movlw 0x02 movwf PORTC call E0 call retardo movlw 0x2F movwf letra call escribir_LCD call retardo movlw 0x0f ;ponemos la instrucción DISPLAY ON/OFF control movwf letra call escribir_LCD call retardo movlw 0x01 ;ponemos la instrucción CLEAR_DISPLAY movwf letra call clear_display call retardo call RS0 ;ponemos la instrucción ENTRY MODE SET movlw 0x06 movwf letra call escribir_LCD call retardo call RS1 return ;fin de la inicialización del LCD ;asignamos cada valor del teclado a un registro conf_tec movlw 1 ;tecla 1 movwf 0x20 movlw 2 ;tecla 2 movwf 0x21 movlw 3 ;tecla 3 movwf 0x22 movlw 0xf ;tecla f movwf 0x23 movlw 4 ;tecla 4 movwf 0x24 movlw 5 ;tecla 5 movwf 0x25 movlw 6 ;tecla 6 movwf 0x26 movlw 0xe ;tecla e movwf 0x27

Page 229: Manual

Anexo Programa ASM práctica 5

LXXXVIII

movlw 7 ;tecla 7 movwf 0x28 movlw 8 ;tecla 8 movwf 0x29 movlw 9 ;tecla 9 movwf 0x2a movlw 0xd ;tecla d movwf 0x2b movlw 0xa ;tecla a movwf 0x2c movlw 0 ;tecla 0 movwf 0x2d movlw 0xb ;tecla b movwf 0x2e movlw 0xc ;tecla c movwf 0x2f return ;Configuracion del micro iniciar_mic movlw 0xc0 iorwf INTCON,f movlw 0x90 movwf RCSTA ;RC spen=1 rx9=0 CREN=1 banksel ADCON1 ;cogemos el banco de memoria 1 movlw 0x07 movwf ADCON1 movwf OPTION_REG movlw 0x24 movwf TXSTA ;TX tx9=0 txen=1 brgh=1 movlw D'27' ;ponemos el SPBRG=27 que es donde tiene menos error movwf SPBRG bsf PIE1,RCIE ;interupccion RX habilitada bcf PIE1,TXIE ;interupccion TX deshabilitada banksel PORTC ; banco 0 clrf PORTB bcf PORTC,4 clrf r1 clrf r2 clrf continuar bsf continuar,0 clrf tapreta ;inicializa el valor del reg. de valor de tecla clrf rtecla ;inicializa el valor del reg. de tecla apretada clrf dato_recibido ;limiamos el registro de si hemos recibido dato. banksel EECON1 ;esto es para configurar la EEPROM bcf EECON1,EEPGD ;ponemos en modo ecritura de datos banksel PORTB ;volvemos al primer banco call mens_inicio return ;-------------------------------------------------------------------------- ver_tecla movlw 0x01 movwf PORTC clrf r1 ;guardamos 0 en r1 para saber q estamos en la columna 1

Page 230: Manual

Anexo Programa ASM práctica 5

LXXXIX

call rev_fila ;vamos a mirar las filas una por una movlw 0x02 movwf PORTC movlw 0x04 movwf r1 ;guardamos 4 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas movlw 0x04 movwf PORTC movlw 0x08 movwf r1 ;guardamos 8 en r1 para saber q estamos en la columna 3 call rev_fila ;volvemos a mirar filas movlw 0x08 movwf PORTC movlw D'12' movwf r1 ;guardamos 12 en r1 para saber q estamos en la columna 4 call rev_fila ;volvemos a mirar filas return ;volvemos al prinicipio rev_fila btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return clrf r2 ;ponemos 0 para saber que es la fila 1 movlw 0x01 movwf mas_fil ;guardamos mascara para comprobar despues btfsc PORTA,0 ;miramos si la fila 1 esta a 0 para mirar ;numero si no es asi seguimos call confimar_tecla btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return movlw 0x01 movwf r2 ;ponemos el valor 1 para saber q es la fila 2 movlw 0x02 movwf mas_fil ;volvemos a guardar mascara btfsc PORTA,1 ;comprobamos bit 1 para saber ;si la tecla de la fila esta activada call confimar_tecla btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return movlw 0x02 ;guardamos el valor 2 para la fila 3 movwf r2 movlw 0x04 movwf mas_fil btfsc PORTA,2 call confimar_tecla btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return movlw 0x03 ;guardamos el valor 2 para la fila 3 movwf r2 movlw 0x08

Page 231: Manual

Anexo Programa ASM práctica 5

XC

movwf mas_fil btfsc PORTA,3 call confimar_tecla return confimar_tecla call ret_corto movlw 0x0F andwf PORTA,w xorwf mas_fil,w ;hacemos una xor entre la mascara guardada y W

;si el resultado es diferente de 1 es q la tecla ;esta pulsada

btfss STATUS,Z ;para mirarlo si el flag Z del STATUS esta a 0 es q return ;la tecla se pulso si no es asi seguimos con el

;programa ;aqui calculamos la tecla apretada most_num clrw addwf r1,w ;sumamos r1 y r2 para despues saber el valor de addwf r2,w ;la tecla apretada addlw 0x20 movwf FSR ;movemos el valor a FSR para acceso indirecto movf INDF,w movwf rtecla ;guardamos el resultado de la tecla

bsf tapreta,0 ;poenmos a '1' el bit 0 de tapreta para saber que ;hay 1 tecla apretada

;buckle para saber si la tecla deja de ser apretada sol_tec movlw 0x0f andwf PORTA,w

andwf mas_fil,w ;volvemos a utilizar la mascara para saber si la ;tecla sigue apretada

btfss STATUS,Z ;hasta q el flag Z no este a 1 no saldra del buckle goto sol_tec return ;-------------------------------------------------------------------------- mirar_si_envio clrf tapreta movf rtecla,w ;miramos si es la tecla e y sies así enviamos EEPROM xorlw 0xe btfsc STATUS,Z goto enviar_RS2 return ;-------------------------------------------------------------------------- enviar_RS2 call limpiar_LCD ;escribimos comunicando en el LCD call escribir_COMUNICANDO clrf continuar movlw INICIO ;pasamos el valor de inicio para movwf TXREG ;transmitirlo y esperamos respuesta call esperar_respuesta_inicio btfss continuar,0 ;si la resuesta a sido correcta continua goto error_transmision ;si no va error de transmision

Page 232: Manual

Anexo Programa ASM práctica 5

XCI

enviar_EEPROM ;iniciamos los registros para enviar las 40 movlw 0x4 ;posiciones de memoria movwf aux movlw 0xa movwf aux1 clrf DIREC goto buc_env_EEPROM1 ;saltamos ya que esta todo inicializado buc_env_EEPROM ;este buckle es para pasar del 9 al 10 decf aux,f ;si se ha llegado a la posicion 40 se manda btfsc STATUS,Z ;fin de envio goto fin_envio movlw 0xa movwf aux1 movlw 0x6 addwf DIREC,f buc_env_EEPROM1 ;este buckle es para incrementar la posicion de call EE_LEE ;memoria de 1 en 1 y leer el dato de la EEPROM call enviar_todo ;y enviar el dato btfss continuar,0 ;si todoa ido correcto pasa a la siguiente goto error_transmision ;posicion de memoria de lo contrario va a incf DIREC,f ;error de transmision decf aux1,f btfsc STATUS,Z ;aqui si se han pasado 10 posiciones va a goto buc_env_EEPROM ;a pasar de la posicion 9 a la 10 por ejemplo goto buc_env_EEPROM1 ;si no va a enviar la siguiente posición enviar_todo ;aquí pasamos los dataos para cada direccion nop ;por orden es primero la peticion de direccion movlw EDIREC call mandar_RS2 movf DIREC,w ;despues la direccion a cambiar call escribir_DIREC ;escribimos la direccion en LCD movf DIREC,w call mandar_RS2 movlw EDATO ;despues la petición del dato call mandar_RS2 movf DATO,w ;despues el valor de la dirección call escribir_DATO ;escribimos dicho valor en LCD movf DATO,w call mandar_RS2 call retardo_corto_rs232 return mandar_RS2 ;esta función es para mandar los datos movwf TXREG ;que le pasan por el W a traves de la USART call esperar_respuesta ;aquí esperamos un respuesta btfss continuar,0 ;si todo a sido correcto continua goto error_transmision ;si no va cancelar la transmision return esperar_respuesta_inicio ;para el caso del inicio ponemos una call retardo_rs232 ;función más que tiene perdida de tiempo btfss dato_recibido,0 ;para ver si comunica con el otro micro clrf continuar clrf dato_recibido return

Page 233: Manual

Anexo Programa ASM práctica 5

XCII

esperar_respuesta ;esta funcion es como la anterior pero sin btfss dato_recibido,0 ;la espera goto esperar_respuesta clrf dato_recibido return error_transmision ;en el caso de producirse un error en call escribir_CANCEL ;la tranmision escribe CANCEL en el LCD call retardo ;e inicializa registros para continuar movlw CANCELAR ;haciendo lo que se le pida movwf TXREG movlw 1 movwf aux movwf aux1 clrf continuar call mens_inicio clrf tapreta goto L1 fin_envio ;cuando se termina de pasar los datos btfss continuar,0 ;al otro micro se le envia este codigo goto sig ;para decirle que ya se ha terminado movlw FIN movwf TXREG call escribir_OK call retardo call mens_inicio sig bsf continuar,0 return ;-------------------------------------------------------------------------- ;funciones de la EEPROM EE_ESCRIBE ;con esta escvribimos un valor pasado por el W movf DATO,w ;en la Direccion psada por el registro DIREC banksel EEDATA movwf EEDATA banksel 0 movf DIREC,w banksel EEADR movwf EEADR banksel EECON1 bsf EECON1,WREN bcf INTCON,GIE movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1,WR bsf INTCON,GIE bcf EECON1,WREN EE_WAIT btfsc EECON1,WR goto EE_WAIT banksel DATO return

Page 234: Manual

Anexo Programa ASM práctica 5

XCIII

EE_LEE ;leemos el valor de la EEPROM que este en el Registro movf DIREC,w ;DIREC que le hemos pasado banksel EEDATA movwf EEADR banksel EECON1 bsf EECON1,RD banksel EEDATA movf EEDATA,w banksel DATO movwf DATO ;devolvemos el valor leido por el registro DATO return ;------------------------------------------------------------------------- mens_inicio call limpiar_LCD return escribir_CANCEL call RS0 movlw 0xc8 ;situamos cursor en espacio 8 de 2ª linea movwf letra call escribir_LCD call RS1 movlw 0x43 ;letra C movwf letra call escribir_LCD movlw 0x41 ;letra A movwf letra call escribir_LCD movlw 0x4e ;letra N movwf letra call escribir_LCD movlw 0x43 ;letra C movwf letra call escribir_LCD movlw 0x45 ;letra E movwf letra call escribir_LCD movlw 0x4c ;letra L movwf letra call escribir_LCD return escribir_DIREC ;funcion para escribir la direccion del dato a enviar movwf letraux ;inicializamos registros clrf digito call limpiar_LCD escribir_DIREC2 ;aquí camos restando 10 a la direccion dada movlw 0x10 ;cuando salga negativo el valor es que ya a subwf letraux ;terminado y por digito pasremos el valor a btfss STATUS,C ;escribir en el LCD goto DIREC_decenas movlw 1 addwf digito goto escribir_DIREC2

Page 235: Manual

Anexo Programa ASM práctica 5

XCIV

DIREC_decenas ;envio las dentenas movlw 0x10 ;incrementamos en 10 el reg auxiliar para addwf letraux ;tener el valor real y escribimos el valor movf digito,w ;de digito en la pantalla LCD addlw 0x30 movwf letra call escribir_LCD clrf digito DIREC_unidades movf letraux,w ;ahora en escribimos el valor del reg. Aux. addlw 0x30 ;que serán la unidades de la direccion a movwf letra ;a enviar call escribir_LCD return escribir_DATO ;ahora pasamos el valor del dato de la call RS0 ;direccion a enviar primero situamos el cursor movlw 0x87 ;y despues vamos a a funcion de escribir movwf letra ;un precio en la pantalla call escribir_LCD call RS1 movf DATO,w call pasar_a_LCD return escribir_OK ;esto es si todo ha ido bien nos pone en la pantalla call RS0 ;OK para saberlo movlw 0xc8 ;situamos cursor en espacio 8 de la 2ª linea del LCD movwf letra call escribir_LCD call RS1 movlw 0x4f ;letra O movwf letra call escribir_LCD movlw 0x4b ;letra K movwf letra call escribir_LCD return escribir_COMUNICANDO ;cuando iniciamos la comunicación sacamos este mens. movlw 0x43 ;letra C movwf letra call escribir_LCD movlw 0x4f ;letra O movwf letra call escribir_LCD movlw 0x4d ;letra M movwf letra call escribir_LCD movlw 0x55 ;letra U movwf letra call escribir_LCD movlw 0x4E ;letra N movwf letra call escribir_LCD movlw 0x49 ;letra I

Page 236: Manual

Anexo Programa ASM práctica 5

XCV

movwf letra call escribir_LCD movlw 0x43 ;letra C movwf letra call escribir_LCD movlw 0x41 ;letra A movwf letra call escribir_LCD movlw 0x4E ;letra N movwf letra call escribir_LCD movlw 0x44 ;letra D movwf letra call escribir_LCD movlw 0x4F ;letra O movwf letra call escribir_LCD return clear_display ;función para las instruciones de 1,53ms de la banksel TRISB ;pantalla de LCD movlw 0x87 movwf OPTION_REG banksel PORTA call RS0 call E1 clrf PORTC call E0

call E1 movf letra,w

movwf PORTC call E0 movlw 0x80 movwf TMR0 t0 btfsc TMR0,7 goto t0 call RS1 banksel TRISA movlw 0x83 movwf OPTION_REG banksel PORTA return escribir_LCD ;función para las instruccion de 49us de la pantalla LCD call E1 movf letra,w andlw 0xf0 movwf lauxil swapf lauxil,w movwf PORTC call E0 call E1 movlw 0x0f andwf letra,w movwf PORTC call E0 movlw 0xFC

Page 237: Manual

Anexo Programa ASM práctica 5

XCVI

movwf TMR0 t1 btfsc TMR0,7 goto t1 return E0 ;función para poner la entrada E del LCD a '0' bcf PORTB,5 return E1 ;función para poner la entrada E del LCD a '1' bsf PORTB,5 return RS0 ;función para poner la entrada RS del LCD a '0' bcf PORTB,4 return RS1 ;función para poner la entrada RS del LCD a '1' bsf PORTB,4 return limpiar_LCD ;función para dejar la pantalla sin nada call RS0 ;aqui hariamos un RETURN HOME movlw 0x02 movwf letra call clear_display movlw 0x01 ;aqui harimaos un CLEAR DISPLAY movwf letra call clear_display return pasar_a_LCD ;todo lo de abajo es para mostrar precio por el LCD movwf letraux clrf digito b_millares movlw D'200' subwf letraux btfss STATUS,C goto millar_no movlw 1 addwf digito goto millar_si millar_no movlw D'200' ;este es solo en caso q sea + de 10 euros addwf letraux millar_si movf digito,w addlw 0x30 movwf letra call escribir_LCD clrf digito b_centenas ;calculo las centenas de lo que he metido movlw D'20' subwf letraux btfss STATUS,C goto centenas movlw 1 addwf digito

Page 238: Manual

Anexo Programa ASM práctica 5

XCVII

goto b_centenas centenas ;envio las centenas movlw D'20' addwf letraux movf digito,w addlw 0x30 movwf letra call escribir_LCD movlw 0x2c ;escribo una coma para separar euros de centimos movwf letra call escribir_LCD clrf digito b_decenas ;y calculo decenas movlw D'2' subwf letraux btfss STATUS,C goto unidades movlw 1 addwf digito goto b_decenas unidades movf digito,w ;envio decenas addlw 0x30 movwf letra call escribir_LCD movlw D'2' addwf letraux movlw 0x30 btfsc letraux,0 ;calculo y envio unidades movlw 0x35 movwf letra call escribir_LCD clrf letraux return ;-------------------------------------------------------------------------- INTERRUPT ;funcion de interupcion banksel 0 L1 btfss PIR1,RCIF ;revisamos si es por recepción si no salimos goto L2 btfss RCSTA,2 ;miramos si hay error de framing si no continua goto ER1 movf RCREG,F ;si lo hay leemos RCREG y volvemos a ver siguiene goto L1 ;dato ER1 btfss RCSTA,1 ;miramos si hay error de overflow si no vamos a goto ver_recibido ;leer datorecibido de lo contrario ponemos CREN a bcf RCSTA,4 ;’1’ y luego volvemos a poner a ‘0’ bsf RCSTA,4 goto L1 ver_recibido ;pasamos el valor recibido al registro recibido movf RCREG,w

Page 239: Manual

Anexo Programa ASM práctica 5

XCVIII

movwf recibido btfss recibido,6 ;miramos si el bit ‘6’ de lo recibido esta a ‘1’ goto int_producto ;si es así es que pregutna o pide producto andlw 0x0f ;de lo contrario es una respuesta a lo enviado btfss STATUS,Z ;por nosotros si aquí el bit Z de status esta goto cancelar_precio ;activado es que todo va bien de lo contarario goto aceptar_precio ;es que a habido algún fallo y vamos a cancelar int_producto btfss recibido,7 ;dependiendo del bit ‘7’ de lo recibido abemos si goto preg_prod ;esta pidendo o preguntando por un producto goto pedir_prod pedir_prod ;si pide producto vendrá a esta función bsf PORTC,4 ;activaremos el LED de dar producto movf recibido,w ;pasaremoslos cuatro bits de menos peso movwf aux ;al portb para escribir la unidad del producto andlw 0x0f ;en el display de 7 segmentos movwf PORTB movf aux,w andlw 0xF0 ;y los cuatro de más peso al porta para escribir movwf PORTA ;las decenas del producto a dar call retardo ;hacemos pausa par poder ver lo que pasa bcf PORTC,4 ;apagomos el LED clrf PORTB ;y limpiamos los puertos para dejar todo como movlw 0xf ;estaba antes iorwf PORTA,f goto L1 preg_prod ;aqui preguntamos si hay producto call RX ;vamos a escribir el numero del producto en el btfss PORTC,5 ;display de 7 segementos y testeamos el interruptor goto no_producto ;de portc5 si esta a ‘1’ es quehay producto y de lo goto si_producto ;contrario es queno hay producto RX movf recibido,w ;pasamos el valor recibido a porta y portb para andlw 0x0f ;sacarlo por display 7 segmentos movwf PORTB movf recibido,w andlw 0xF0 movwf PORTA call retardo ;hacemos pausa para poder verlo return no_producto ;si no hay producto enviamos al otro micro la señal movlw CANC_PRO ;de que no hay producto movwf TXREG clrf PORTB ;limpiamos porta y portb clrf PORTA goto L1 si_producto movlw 0xF0 ;enviamos la señal de que hay producto movwf TXREG clrf PORTA ;limpiamos porta y portb clrf PORTB

Page 240: Manual

Anexo Programa ASM práctica 5

XCIX

bcf PORTC,4 goto L1 aceptar_precio ;si hemos recibido la señal e todo esta bien bsf continuar,0 ;en el envio de la EEPROM activamos continuar bsf dato_recibido,0 ;y recibido goto L1 cancelar_precio ;si hemos recibido la señal de error activamos bcf continuar,0 ;recibido pero ponemos a ‘0’ el reg. continuar bsf dato_recibido,0 goto L1 ;----------------------------------------------- retardo ;diferentes retardos para diferentes pausas movlw 0x1f ;utilizadas durante la ejecucion movwf ret3 retardo3 decf ret3,f btfsc STATUS,Z return movlw 0xFF movwf ret1 movwf ret2 retardo1 decf ret1,f btfsc STATUS,Z goto retardo3 retardo2 decf ret2,f btfsc STATUS,Z goto retardo1 goto retardo2 ret_corto movlw 0xFF movwf ret1 movwf ret2 r1c decf ret1,f btfsc STATUS,Z return r2c decf ret2,f btfsc STATUS,Z goto r2c movlw 0xff movwf ret2 goto r1c retardo_rs232 movlw 0x10 movwf ret3 retardo_rs3 decf ret3,f btfsc STATUS,Z return movlw 0xFF movwf ret1

Page 241: Manual

Anexo Programa ASM práctica 5

C

movwf ret2 retardo_rs1 decf ret1,f btfsc STATUS,Z goto retardo_rs3 retardo_rs2 decf ret2,f btfsc STATUS,Z goto retardo_rs1 goto retardo_rs2 retardo_corto_rs232 movlw 0x3 movwf ret3 retardo_c_rs3 decf ret3,f btfsc STATUS,Z return movlw 0xFF movwf ret1 movwf ret2 retardo_c_rs1 decf ret1,f btfsc STATUS,Z goto retardo_c_rs3 retardo_c_rs2 decf ret2,f btfsc STATUS,Z goto retardo_c_rs1 goto retardo_c_rs2 L2 retfie end

Page 242: Manual

Anexo Programa ASM del Módulo 2 completo

CI

A.2.3. Programa ASM del Módulo 2 completo

#include "p16f877.inc" ;etiquetas CANCELAR equ 0x4F ;por si cancelas algun paso ACEPTAR equ 0xF0 ;para aceptar el precio. INICIO equ 0xfF ;para iniciar envio FIN equ 0x66 ;para acabar envio EDATO equ 0xAA ;para decir que envio dato EDIREC equ 0x55 ;para decir que envio direccion CANC_PRO equ 0x0F ;lo que enciamos se cancela producto ;registros de proposito general DATO equ 0x30 ;dato de eprom DIREC equ 0x31 ;direcion eprom dato_recibido equ 0x32 ;para saber si se ha recibido el dato por RX. modo_envio equ 0x33 ;para pasar a modo de envio de la EEPROM continuar equ 0x34 decena equ 0x35 ;para guardar las decenas del producto selec. pausa2 equ 0x36 ;otro reg para pausa aux equ 0x37 ;reg auxiliar aux1 equ 0x38 ;reg auxiliar rtecla equ 0x40 ;valor de la tecla apretada tapreta equ 0x41 ;ponemos a '1' si la tecla a sido apretada rprecio equ 0x42 ;precio producto r1 equ 0x43 ;Guardamos la columna elegida r2 equ 0x44 ;guardamos la fila elegida mas_fil equ 0x45 ;se guarda la mascara de la fila recibido equ 0x50 ;donde guardamos el valor de lo q recibimos ret1 equ 0x51 ;registro para retardo ret2 equ 0x52 ;registro para retardo ret3 equ 0x53 ;registro para retardo lim_tec equ 0x54 ;registro para saber q tiene q detectar 2 teclas en

;producto num_prod equ 0x55 ;registro producto seleccionado rmonaux equ 0x56 ;reg para calcular las decenas en precio pagado equ 0x57 ;reg de la cantidad pagada digito equ 0x58 ;reg aux para el digito a pasar al LCD ret equ 0x59 ;para hacer el retardo letra equ 0x5a ;reg para escribir en LCD letraux equ 0x5b ;reg aux para escr precios en LCD lauxil equ 0x5c ;reg auxiliar para escribir tecla esp_prec equ 0x5d ;para saber si hemos insertado el producto prod_elegido equ 0x5e ;reg para elegir el producto precio_actual equ 0x5f ;donde guardamos el precio introducido borrar_memoria equ 0x46 ;para saber si queremos borrar a memoria o no. org 0x0 clrf INTCON ;deshabilitamos interrupciones para iniciar micro goto inicio org 0x4 goto INTERRUPT ;cuando se produzca una interrupción vendrá aqui

Page 243: Manual

Anexo Programa ASM del Módulo 2 completo

CII

org 0x5 ;comienza el programa aqui inicio call iniciar_LCD ;vamos a rutina para iniciar la pantalla LCD call conf_tec ;vamos a rutina para dar vlaores a las teclas call conf_mic ;vamos a rutina para configurar el micro buckle nop call ver_tecla

btfsc tapreta,0 ;mira si hay una tecla apretada y si no es asi m call mod_precio ;la ocion del teclado si no va a volver a mirar el

goto buckle ;LCD ;rutina para iniciar el LCD iniciar_LCD banksel TRISA movlw 0xe0 movwf TRISC ;RC<0:4> SALIDAS RC<5:7> entradas para RX y TX movlw 0xc0 movwf TRISB ;RB<0:2> entradas RC<3:7> salidas movlw 0x0f movwf TRISA ;RA SALIDAS movlw 0x03 ;pre-escaler a 1:16 movwf OPTION_REG banksel PORTA movf PORTA,W ;ponemos la instrucción FUCTION SET andlw 0XF movwf PORTA call RS0 call E1 movlw 0x02 movwf PORTC call retardo_ini call E0 movlw 0x2F movwf letra call escribir_LCD call retardo_ini movlw 0x0f ;ponemos la instrucción DISPLAY ON/OFF control movwf letra call escribir_LCD call retardo_ini movlw 0x01 ;ponemos la instrucción CLEAR_DISPLAY movwf letra call clear_display call retardo_ini call RS0 ;ponemos la instrucción ENTRY MODE SET movlw 0x06 movwf letra call escribir_LCD call retardo_ini call RS1 return ;fin de la inicialización del LCD

Page 244: Manual

Anexo Programa ASM del Módulo 2 completo

CIII

;asignamos cada valor del teclado a un registro conf_tec movlw 1 ;tecla 1 movwf 0x20 movlw 2 ;tecla 2 movwf 0x21 movlw 3 ;tecla 3 movwf 0x22 movlw 0xf ;tecla f movwf 0x23 movlw 4 ;tecla 4 movwf 0x24 movlw 5 ;tecla 5 movwf 0x25 movlw 6 ;tecla 6 movwf 0x26 movlw 0xe ;tecla e movwf 0x27 movlw 7 ;tecla 7 movwf 0x28 movlw 8 ;tecla 8 movwf 0x29 movlw 9 ;tecla 9 movwf 0x2a movlw 0xd ;tecla d movwf 0x2b movlw 0xa ;tecla a movwf 0x2c movlw 0 ;tecla 0 movwf 0x2d movlw 0xb ;tecla b movwf 0x2e movlw 0xc ;tecla c movwf 0x2f return ;Configuracion del micro iniciar_mic movlw 0xc0 iorwf INTCON,f movlw 0x90 movwf RCSTA ;RC spen=1 rx9=0 CREN=1 banksel ADCON1 ;cogemos el banco de memoria 1 movlw 0x07 movwf ADCON1 movwf OPTION_REG movlw 0x24 movwf TXSTA ;TX tx9=0 txen=1 brgh=1 movlw D'27' ;ponemos el SPBRG=27 que es donde tiene menos error movwf SPBRG bsf PIE1,RCIE ;interupccion RX habilitada bcf PIE1,TXIE ;interupccion TX deshabilitada banksel PORTC ; banco 0 clrf PORTB bcf PORTC,4 clrf r1 clrf r2

Page 245: Manual

Anexo Programa ASM del Módulo 2 completo

CIV

clrf continuar bsf continuar,0 clrf tapreta ;inicializa el valor del reg. de valor de tecla clrf rtecla ;inicializa el valor del reg. de tecla apretada clrf rprecio ;inicializamos el valor del registro de precio clrf dato_recibido ;limiamos el registro de si hemos recibido dato clrf num_prod clrf decena clrf borrar_memoria clrf lim_tec bsf lim_tec,1 ;iniciamos lim_tec a 2 clrf esp_prec bsf modo_envio,0 clrf prod_elegido banksel EECON1 ;esto es para configurar la EEPROM bcf EECON1,EEPGD ;ponemos en modo ecritura de datos banksel PORTB ;volvemos al primer banco call mens_inicio return ;-------------------------------------------------------------------------- ver_tecla movlw 0x01 movwf PORTC clrf r1 ;guardamos 0 en r1 para saber q estamos en la columna 1 call rev_fila ;vamos a mirar las filas una por una movlw 0x02 movwf PORTC movlw 0x04 movwf r1 ;guardamos 4 en r1 para saber q estamos en la columna 2 call rev_fila ;volvemos a mirar filas movlw 0x04 movwf PORTC movlw 0x08 movwf r1 ;guardamos 8 en r1 para saber q estamos en la columna 3 call rev_fila ;volvemos a mirar filas movlw 0x08 movwf PORTC movlw D'12' movwf r1 ;guardamos 12 en r1 para saber q estamos en la columna 4 call rev_fila ;volvemos a mirar filas return ;volvemos al prinicipio rev_fila btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return clrf r2 ;ponemos 0 para saber que es la fila 1 movlw 0x01 movwf mas_fil ;guardamos mascara para comprobar despues btfsc PORTA,0 ;miramos si la fila 1 esta a 0 para mirar ;numero si no es asi seguimos call confimar_tecla btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido

Page 246: Manual

Anexo Programa ASM del Módulo 2 completo

CV

return movlw 0x01 movwf r2 ;ponemos el valor 1 para saber q es la fila 2 movlw 0x02 movwf mas_fil ;volvemos a guardar mascara btfsc PORTA,1 ;comprobamos bit 1 para saber ;si la tecla de la fila esta activada call confimar_tecla btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return movlw 0x02 ;guardamos el valor 2 para la fila 3 movwf r2 movlw 0x04 movwf mas_fil btfsc PORTA,2 call confimar_tecla btfsc tapreta,0 ;si hay tecla apretada salta para ir mas rapido return movlw 0x03 ;guardamos el valor 2 para la fila 3 movwf r2 movlw 0x08 movwf mas_fil btfsc PORTA,3 call confimar_tecla return confimar_tecla call ret_corto movlw 0x0F andwf PORTA,w xorwf mas_fil,w ;hacemos una xor entre la mascara guardada y W

;si el resultado es diferente de 1 es q la tecla ;esta pulsada

btfss STATUS,Z ;para mirarlo si el flag Z del STATUS esta a 0 es q return ;la tecla se pulso si no es asi seguimos con el

;programa ;aqui calculamos la tecla apretada most_num clrw addwf r1,w ;sumamos r1 y r2 para despues saber el valor de addwf r2,w ;la tecla apretada addlw 0x20 movwf FSR ;movemos el valor a FSR para acceso indirecto movf INDF,w movwf rtecla ;guardamos el resultado de la tecla

bsf tapreta,0 ;poenmos a '1' el bit 0 de tapreta para saber que ;hay 1 tecla apretada

;buckle para saber si la tecla deja de ser apretada sol_tec

movlw 0x0f andwf PORTA,w

Page 247: Manual

Anexo Programa ASM del Módulo 2 completo

CVI

andwf mas_fil,w ;volvemos a utilizar la mascara para saber si la ;tecla sigue apretada

btfss STATUS,Z ;hasta q el flag Z no este a 1 no saldra del buckle goto sol_tec return ;-------------------------------------------------------------------------- ;rutina para modificar precio mod_precio clrf tapreta btfss prod_elegido,0 ;si el producto no ha sido elegido vamos a goto elegir_prod ;elegirlo el_precio btfss esp_prec,0 ;si es el primer numero del precio salta goto siguiente ;de lo contrario va a siguiente btfss rtecla,3 ;miramos si es una tecla entre 0-7 goto primera_letra movlw 0x06 andwf rtecla,w ;miramos si es la tecla 8 o 9 btfsc STATUS,Z goto primera_letra clrf tapreta ;vamos mirando que sea la tecla ‘Cancelar’ btfsc rtecla,2 ;por si se cancela el proceso return btfss rtecla,0 return goto cancelar primera_letra call RS0 movlw 0xc0 ;ponemos el cursor en la 2ª linea movwf letra call escribir_LCD call RS1 call escribir_NUE ;escribimos NUE antes del precio bcf esp_prec,0 ;ponemos a 0 esp_prec para poder apretar clrf decena ;la tecla cancelar clrf num_prod siguiente ;es igual que el precio pero con la posibilidad de la tecla ;’ACEPTAR’ movf rtecla,w btfss rtecla,3 ;no saltamos si es tecla 0,1,2,3,4,5,6 o 7 goto rev_precio andlw 0x6 btfsc STATUS,Z ;no saltamos si es tecla 8 o 9 goto rev_precio btfsc rtecla,2 ;no saltamos si es tecla C,D,E o F goto err_tecla btfss rtecla,0 ;no saltamos si es tecla A goto aceptar goto cancelar ;tiene q ser la tecla B err_tecla ;ene l caso de que haya pulsado una tecla clrf tapreta ;que no tocaba se limpia el regisrtro de tecla return ;apretada y se vuelve a esperar otra

Page 248: Manual

Anexo Programa ASM del Módulo 2 completo

CVII

cancelar ;aqui inicializamos los registros para empezar clrf DIREC ;de nuevo movlw 0x02 movwf lim_tec call iniciar_regs bsf esp_prec,0 bsf modo_envio,0 clrf prod_elegido call escribir_CANCEL call retardo call mens_inicio return aceptar ;en esta función pasamos el valor del precio

movf precio_actual,w movwf DATO ;en la dirección guardada y se va a la función movlw 0x02 ;de escibir en la eeprom movwf lim_tec call EE_ESCRIBE call iniciar_regs call RS0 ;ponemos cursor en pos 8 de 2ª linea de LCD movlw 0xc9 movwf letra call escribir_LCD call RS1 movf DATO,w ;escribimos en LCd el precio insertado en EEPROM call pasar_a_LCD call retardo call mens_inicio ;vamos a inicializar la panatalla LCD y se inician bsf esp_prec,0 ;los registros para empezar de nuevo bsf modo_envio,0 clrf prod_elegido return iniciar_regs clrf num_prod clrf decena clrf tapreta return rev_precio ;esto es para seleccionar el precio movf rtecla,w ;lo unico que hacemos es leer la tecla addlw 0x30 ;escribirla en el LCD movwf letra movf decena,w addwf rtecla,w movwf rtecla btfsc STATUS,Z ;revisamos si es 0 goto f_rev_precio movwf aux clrf decena buc_rev_precio ;aquí que es la continuacion multiplica el valor movlw d'10' ;del precio por 10 para la siguiente teca que se addwf decena ;apriete decf aux,f

Page 249: Manual

Anexo Programa ASM del Módulo 2 completo

CVIII

btfss STATUS,Z goto buc_rev_precio f_rev_precio ;finalizamos actualizando los precios movf rtecla,w ;para la siguiente tecla movwf precio_actual call escribir_LCD clrf tapreta movlw 0x02 movwf lim_tec return ;-------------------------------------------------------------------------- elegir_prod btfsc borrar_memoria,0 goto mirar_si_borro movf rtecla,w ;miramos si no es la tecla acpetar o cancelar btfss rtecla,3 ;si no lo es revisamos la tecla del numero goto revisar_tecla andlw 0x6 ;miramos si es la tecla 8 o 9 btfsc STATUS,Z goto revisar_tecla movf rtecla,w btfsc rtecla,2 goto mirar_si_envio btfsc rtecla,0 ;si es la tecla B se cancela el proceso goto cancelar return mirar_si_envio ;esto para ver si es la tecla envir btfss modo_envio,0 ;o borrar la memoria return btfss rtecla,1 return btfss rtecla,0 goto enviar_RS2 goto ini_reset_memory mirar_si_borro ;si se ha seleccionado borrar la memoria btfss rtecla,3 ;solo podemos apretar la tecla aceptar y return ;cancelar btfsc rtecla,2 return btfss rtecla,1 return btfsc rtecla,0 goto fin_borrar_memoria ;tecla cancelar goto reset_memory ;tecla aceptar revisar_tecla ;si es una tecla numerica primero se revisa si btfsc lim_tec,1 ;se han insertado las decenas del producto goto enviar_decena movf rtecla,w ;en el caso que si, se escribe la unidad del addlw 0x30 ;producto movwf letra call escribir_LCD call RS0

Page 250: Manual

Anexo Programa ASM del Módulo 2 completo

CIX

movlw 0x89 ;ponemos el cursor en el espacio 10 de la 2ª linea movwf letra call escribir_LCD call RS1 movf decena,w addwf rtecla,w ;sumams las decenas del producto a la unidad movwf DIREC ;y guardamos en DIREC que nos servirá para buscar clrf tapreta ;el precio en la EEPROM se inicializan los clrf lim_tec ;registros bsf prod_elegido,0 bsf prod_elegido,0 call EE_LEE ;se busca precio en EEPROM movf DATO,w call pasar_a_LCD ;se escribi precio en EEPROM bsf esp_prec,0 return enviar_decena clrf tapreta btfsc rtecla,2 ;si la tecla es mayor de 4 cancelamos return btfsc rtecla,3 ;si la tecla es 8 o 9 cancelamos return call RS1 bcf modo_envio,0 movf rtecla,w ;escibimos la decena del dislay movwf num_prod addlw 0x30 movwf letra call escribir_LCD buc_decenas ;bucle para calcular las decenas movf rtecla,w btfsc STATUS,Z ;revisamos si es lña tecla 0 goto escribe_0 movlw 0x10 ;sumamos 10 para convertir a decenas addwf decena movlw 0x1 subwf rtecla btfss STATUS,Z goto buc_decenas bcf lim_tec,1 clrf tapreta return escribe_0 clrf tapreta ;ponemos a 0 el registro tecla apretada movlw 1 ;para sig. tecla

subwf lim_tec ;quitamos 1 al limite de tecla para saber q la ;siguiente es las unidades

return ;-------------------------------------------------------------------------- Para poner a cero la memoria EEPROM ini_reset_memory call limpiar_LCD call escribir_borrar_memoria

Page 251: Manual

Anexo Programa ASM del Módulo 2 completo

CX

bsf borrar_memoria,0 return fin_borrar_memoria call mens_inicio bcf borrar_memoria,0 return reset_memory clrf DIREC arriba clrf DATO ;aquí pnemos a 0 todos los valores de call EE_ESCRIBE ;la EEPROM entre los valores 00 y 39 call RS0 movlw 0xc0 movwf letra call escribir_LCD call RS1 movf DIREC,w call escribir_DIREC incf DIREC,f btfsc DIREC,6 goto fin_borrar_memoria goto arriba ;-------------------------------------------------------------------------- enviar_RS2 call limpiar_LCD ;escribimos comunicando en el LCD call escribir_COMUNICANDO clrf continuar movlw INICIO ;pasamos el valor de inicio para movwf TXREG ;transmitirlo y esperamos respuesta call esperar_respuesta_inicio btfss continuar,0 ;si la resuesta a sido correcta continua goto error_transmision ;si no va error de transmision enviar_EEPROM ;iniciamos los registros para enviar las 40 movlw 0x4 ;posiciones de memoria movwf aux movlw 0xa movwf aux1 clrf DIREC goto buc_env_EEPROM1 ;saltamos ya que esta todo inicializado buc_env_EEPROM ;este buckle es para pasar del 9 al 10 decf aux,f ;si se ha llegado a la posicion 40 se manda btfsc STATUS,Z ;fin de envio goto fin_envio movlw 0xa movwf aux1 movlw 0x6 addwf DIREC,f buc_env_EEPROM1 ;este buckle es para incrementar la posicion de call EE_LEE ;memoria de 1 en 1 y leer el dato de la EEPROM call enviar_todo ;y enviar el dato btfss continuar,0 ;si todoa ido correcto pasa a la siguiente goto error_transmision ;posicion de memoria de lo contrario va a

Page 252: Manual

Anexo Programa ASM del Módulo 2 completo

CXI

incf DIREC,f ;error de transmision decf aux1,f btfsc STATUS,Z ;aqui si se han pasado 10 posiciones va a goto buc_env_EEPROM ;a pasar de la posicion 9 a la 10 por ejemplo goto buc_env_EEPROM1 ;si no va a enviar la siguiente posición enviar_todo ;aquí pasamos los dataos para cada direccion nop ;por orden es primero la peticion de direccion movlw EDIREC call mandar_RS2 movf DIREC,w ;despues la direccion a cambiar call escribir_DIREC ;escribimos la direccion en LCD movf DIREC,w call mandar_RS2 movlw EDATO ;despues la petición del dato call mandar_RS2 movf DATO,w ;despues el valor de la dirección call escribir_DATO ;escribimos dicho valor en LCD movf DATO,w call mandar_RS2 call retardo_corto_rs232 return mandar_RS2 ;esta función es para mandar los datos movwf TXREG ;que le pasan por el W a traves de la USART call esperar_respuesta ;aquí esperamos un respuesta btfss continuar,0 ;si todo a sido correcto continua goto error_transmision ;si no va cancelar la transmision return esperar_respuesta_inicio ;para el caso del inicio ponemos una call retardo_rs232 ;función más que tiene perdida de tiempo btfss dato_recibido,0 ;para ver si comunica con el otro micro clrf continuar clrf dato_recibido return esperar_respuesta ;esta funcion es como la anterior pero sin btfss dato_recibido,0 ;la espera goto esperar_respuesta clrf dato_recibido return error_transmision ;en el caso de producirse un error en call escribir_CANCEL ;la tranmision escribe CANCEL en el LCD call retardo ;e inicializa registros para continuar movlw CANCELAR ;haciendo lo que se le pida movwf TXREG movlw 1 movwf aux movwf aux1 clrf continuar call mens_inicio clrf tapreta goto L1 fin_envio ;cuando se termina de pasar los datos btfss continuar,0 ;al otro micro se le envia este codigo

Page 253: Manual

Anexo Programa ASM del Módulo 2 completo

CXII

goto sig ;para decirle que ya se ha terminado movlw FIN movwf TXREG call escribir_OK call retardo call mens_inicio sig bsf continuar,0 return ;-------------------------------------------------------------------------- ;funciones de la EEPROM EE_ESCRIBE ;con esta escvribimos un valor pasado por el W movf DATO,w ;en la Direccion psada por el registro DIREC banksel EEDATA movwf EEDATA banksel 0 movf DIREC,w banksel EEADR movwf EEADR banksel EECON1 bsf EECON1,WREN bcf INTCON,GIE movlw 0x55 movwf EECON2 movlw 0xAA movwf EECON2 bsf EECON1,WR bsf INTCON,GIE bcf EECON1,WREN EE_WAIT btfsc EECON1,WR goto EE_WAIT banksel DATO return EE_LEE ;leemos el valor de la EEPROM que este en el Registro movf DIREC,w ;DIREC que le hemos pasado banksel EEDATA movwf EEADR banksel EECON1 bsf EECON1,RD banksel EEDATA movf EEDATA,w banksel DATO movwf DATO ;devolvemos el valor leido por el registro DATO return ;-------------------------------------------------------------------------- mens_inicio call limpiar_LCD call escribir_PROD return escribir_CANCEL call RS0 movlw 0xc8 ;situamos cursor en espacio 8 de 2ª linea movwf letra

Page 254: Manual

Anexo Programa ASM del Módulo 2 completo

CXIII

call escribir_LCD call RS1 movlw 0x43 ;letra C movwf letra call escribir_LCD movlw 0x41 ;letra A movwf letra call escribir_LCD movlw 0x4e ;letra N movwf letra call escribir_LCD movlw 0x43 ;letra C movwf letra call escribir_LCD movlw 0x45 ;letra E movwf letra call escribir_LCD movlw 0x4c ;letra L movwf letra call escribir_LCD return escribir_borrar_memoria movlw 0x42 ;letra B movwf letra call escribir_LCD movlw 0x4f ;letra O movwf letra call escribir_LCD movlw 0x52 ;letra R movwf letra call escribir_LCD movlw 0x52 ;letra R movwf letra call escribir_LCD movlw 0x41 ;letra A movwf letra call escribir_LCD movlw 0x52 ;letra R movwf letra call escribir_LCD movlw 0x20 ;letra ' ' movwf letra call escribir_LCD movlw 0x4d ;letra M movwf letra call escribir_LCD movlw 0x45 ;letra E movwf letra call escribir_LCD movlw 0x4d ;letra M movwf letra call escribir_LCD movlw 0x4f ;letra O movwf letra call escribir_LCD movlw 0x52 ;letra R

Page 255: Manual

Anexo Programa ASM del Módulo 2 completo

CXIV

movwf letra call escribir_LCD movlw 0x49 ;letra I movwf letra call escribir_LCD movlw 0x41 ;letra A movwf letra call escribir_LCD movlw 0x3f ;letra ? movwf letra call escribir_LCD return escribir_DIREC ;funcion para escribir la direccion del dato a enviar movwf letraux ;inicializamos registros clrf digito call limpiar_LCD escribir_DIREC2 ;aquí camos restando 10 a la direccion dada movlw 0x10 ;cuando salga negativo el valor es que ya a subwf letraux ;terminado y por digito pasremos el valor a btfss STATUS,C ;escribir en el LCD goto DIREC_decenas movlw 1 addwf digito goto escribir_DIREC2 DIREC_decenas ;envio las dentenas movlw 0x10 ;incrementamos en 10 el reg auxiliar para addwf letraux ;tener el valor real y escribimos el valor movf digito,w ;de digito en la pantalla LCD addlw 0x30 movwf letra call escribir_LCD clrf digito DIREC_unidades movf letraux,w ;ahora en escribimos el valor del reg. Aux. addlw 0x30 ;que serán la unidades de la direccion a movwf letra ;a enviar call escribir_LCD return escribir_DATO ;ahora pasamos el valor del dato de la call RS0 ;direccion a enviar primero situamos el cursor movlw 0x87 ;y despues vamos a a funcion de escribir movwf letra ;un precio en la pantalla call escribir_LCD call RS1 movf DATO,w call pasar_a_LCD return escribir_PROD movlw 0x50 ;letra P movwf letra call escribir_LCD movlw 0x52 ;letra R

Page 256: Manual

Anexo Programa ASM del Módulo 2 completo

CXV

movwf letra call escribir_LCD movlw 0x4f ;letra O movwf letra call escribir_LCD movlw 0x44 ;letra D movwf letra call escribir_LCD movlw 0x20 ;ponemos espacio en blanco movwf letra call escribir_LCD return escribir_NUE movlw 0x4e ;letra N movwf letra call escribir_LCD movlw 0x55 ;letra U movwf letra call escribir_LCD movlw 0x45 ;letra E movwf letra call escribir_LCD return escribir_OK ;esto es si todo ha ido bien nos pone en la pantalla call RS0 ;OK para saberlo movlw 0xc8 ;situamos cursor en espacio 8 de la 2ª linea del LCD movwf letra call escribir_LCD call RS1 movlw 0x4f ;letra O movwf letra call escribir_LCD movlw 0x4b ;letra K movwf letra call escribir_LCD return escribir_COMUNICANDO ;cuando iniciamos la comunicación sacamos este mens movlw 0x43 ;letra C movwf letra call escribir_LCD movlw 0x4f ;letra O movwf letra call escribir_LCD movlw 0x4d ;letra M movwf letra call escribir_LCD movlw 0x55 ;letra U movwf letra call escribir_LCD movlw 0x4E ;letra N movwf letra call escribir_LCD movlw 0x49 ;letra I movwf letra

Page 257: Manual

Anexo Programa ASM del Módulo 2 completo

CXVI

call escribir_LCD movlw 0x43 ;letra C movwf letra call escribir_LCD movlw 0x41 ;letra A movwf letra call escribir_LCD movlw 0x4E ;letra N movwf letra call escribir_LCD movlw 0x44 ;letra D movwf letra call escribir_LCD movlw 0x4F ;letra O movwf letra call escribir_LCD return clear_display ;función para las instruciones de 1,53ms de la banksel TRISB ;pantalla de LCD movlw 0x87 movwf OPTION_REG banksel PORTA call RS0 call E1 clrf PORTC call E0

call E1 movf letra,w

movwf PORTC call E0 movlw 0x80 movwf TMR0 t0 btfsc TMR0,7 goto t0 call RS1 banksel TRISA movlw 0x83 movwf OPTION_REG banksel PORTA return escribir_LCD ;función para las instruccion de 49us de la pantalla LCD call E1 movf letra,w andlw 0xf0 movwf lauxil swapf lauxil,w movwf PORTC call E0 call E1 movlw 0x0f andwf letra,w movwf PORTC call E0 movlw 0xFC movwf TMR0

Page 258: Manual

Anexo Programa ASM del Módulo 2 completo

CXVII

t1 btfsc TMR0,7 goto t1 return E0 ;función para poner la entrada E del LCD a '0' bcf PORTB,5 return E1 ;función para poner la entrada E del LCD a '1' bsf PORTB,5 return RS0 ;función para poner la entrada RS del LCD a '0' bcf PORTB,4 return RS1 ;función para poner la entrada RS del LCD a '1' bsf PORTB,4 return limpiar_LCD ;función para dejar la pantalla sin nada call RS0 ;aqui hariamos un RETURN HOME movlw 0x02 movwf letra call clear_display movlw 0x01 ;aqui harimaos un CLEAR DISPLAY movwf letra call clear_display return pasar_a_LCD ;todo lo de abajo es para mostrar precio por el LCD movwf letraux clrf digito b_millares movlw D'200' subwf letraux btfss STATUS,C goto millar_no movlw 1 addwf digito goto millar_si millar_no movlw D'200' ;este es solo en caso q sea + de 10 euros addwf letraux millar_si movf digito,w addlw 0x30 movwf letra call escribir_LCD clrf digito b_centenas ;calculo las centenas de lo que he metido movlw D'20' subwf letraux btfss STATUS,C goto centenas movlw 1 addwf digito goto b_centenas

Page 259: Manual

Anexo Programa ASM del Módulo 2 completo

CXVIII

centenas ;envio las centenas movlw D'20' addwf letraux movf digito,w addlw 0x30 movwf letra call escribir_LCD movlw 0x2c ;escribo una coma para separar euros de centimos movwf letra call escribir_LCD clrf digito b_decenas ;y calculo decenas movlw D'2' subwf letraux btfss STATUS,C goto unidades movlw 1 addwf digito goto b_decenas unidades movf digito,w ;envio decenas addlw 0x30 movwf letra call escribir_LCD movlw D'2' addwf letraux movlw 0x30 btfsc letraux,0 ;calculo y envio unidades movlw 0x35 movwf letra call escribir_LCD clrf letraux return ;-------------------------------------------------------------------------- INTERRUPT ;funcion de interupcion banksel 0 L1 btfss PIR1,RCIF ;revisamos si es por recepción si no salimos goto L2 btfss RCSTA,2 ;miramos si hay error de framing si no continua goto ER1 movf RCREG,F ;si lo hay leemos RCREG y volvemos a ver siguiene goto L1 ;dato ER1 btfss RCSTA,1 ;miramos si hay error de overflow si no vamos a goto ver_recibido ;leer datorecibido de lo contrario ponemos CREN a bcf RCSTA,4 ;’1’ y luego volvemos a poner a ‘0’ bsf RCSTA,4 goto L1 ver_recibido ;pasamos el valor recibido al registro recibido movf RCREG,w movwf recibido

Page 260: Manual

Anexo Programa ASM del Módulo 2 completo

CXIX

btfss recibido,6 ;miramos si el bit ‘6’ de lo recibido esta a ‘1’ goto int_producto ;si es así es que pregutna o pide producto andlw 0x0f ;de lo contrario es una respuesta a lo enviado btfss STATUS,Z ;por nosotros si aquí el bit Z de status esta goto cancelar_precio ;activado es que todo va bien de lo contarario goto aceptar_precio ;es que a habido algún fallo y vamos a cancelar int_producto btfss recibido,7 ;dependiendo del bit ‘7’ de lo recibido abemos si goto preg_prod ;esta pidendo o preguntando por un producto goto pedir_prod pedir_prod ;si pide producto vendrá a esta función bsf PORTC,4 ;activaremos el LED de dar producto movf recibido,w ;pasaremoslos cuatro bits de menos peso movwf aux ;al portb para escribir la unidad del producto andlw 0x0f ;en el display de 7 segmentos movwf PORTB movf aux,w andlw 0xF0 ;y los cuatro de más peso al porta para escribir movwf PORTA ;las decenas del producto a dar call retardo ;hacemos pausa par poder ver lo que pasa bcf PORTC,4 ;apagomos el LED clrf PORTB ;y limpiamos los puertos para dejar todo como movlw 0xf ;estaba antes iorwf PORTA,f goto L1 preg_prod ;aqui preguntamos si hay producto call RX ;vamos a escribir el numero del producto en el btfss PORTC,5 ;display de 7 segementos y testeamos el interruptor goto no_producto ;de portc5 si esta a ‘1’ es quehay producto y de lo goto si_producto ;contrario es queno hay producto RX movf recibido,w ;pasamos el valor recibido a porta y portb para andlw 0x0f ;sacarlo por display 7 segmentos movwf PORTB movf recibido,w andlw 0xF0 movwf PORTA call retardo ;hacemos pausa para poder verlo return no_producto ;si no hay producto enviamos al otro micro la señal movlw CANC_PRO ;de que no hay producto movwf TXREG clrf PORTB ;limpiamos porta y portb clrf PORTA goto L1 si_producto movlw 0xF0 ;enviamos la señal de que hay producto movwf TXREG clrf PORTA ;limpiamos porta y portb clrf PORTB bcf PORTC,4

Page 261: Manual

Anexo Programa ASM del Módulo 2 completo

CXX

goto L1 aceptar_precio ;si hemos recibido la señal e todo esta bien bsf continuar,0 ;en el envio de la EEPROM activamos continuar bsf dato_recibido,0 ;y recibido goto L1 cancelar_precio ;si hemos recibido la señal de error activamos bcf continuar,0 ;recibido pero ponemos a ‘0’ el reg. continuar bsf dato_recibido,0 goto L1 ;----------------------------------------------- retardo ;diferentes retardos para diferentes pausas movlw 0x1f ;utilizadas durante la ejecucion movwf ret3 retardo3 decf ret3,f btfsc STATUS,Z return movlw 0xFF movwf ret1 movwf ret2 retardo1 decf ret1,f btfsc STATUS,Z goto retardo3 retardo2 decf ret2,f btfsc STATUS,Z goto retardo1 goto retardo2 ret_corto movlw 0xFF movwf ret1 movwf ret2 r1c decf ret1,f btfsc STATUS,Z return r2c decf ret2,f btfsc STATUS,Z goto r2c movlw 0xff movwf ret2 goto r1c retardo_rs232 movlw 0x10 movwf ret3 retardo_rs3 decf ret3,f btfsc STATUS,Z return movlw 0xFF movwf ret1

Page 262: Manual

Anexo Programa ASM del Módulo 2 completo

CXXI

movwf ret2 retardo_rs1 decf ret1,f btfsc STATUS,Z goto retardo_rs3 retardo_rs2 decf ret2,f btfsc STATUS,Z goto retardo_rs1 goto retardo_rs2 retardo_corto_rs232 movlw 0x3 movwf ret3 retardo_c_rs3 decf ret3,f btfsc STATUS,Z return movlw 0xFF movwf ret1 movwf ret2 retardo_c_rs1 decf ret1,f btfsc STATUS,Z goto retardo_c_rs3 retardo_c_rs2 decf ret2,f btfsc STATUS,Z goto retardo_c_rs1 goto retardo_c_rs2 retardo_ini movlw 0x80 movwf TMR0 b_r_ini btfsc TMR0,7 goto b_r_ini return L2 retfie end