Académique Documents
Professionnel Documents
Culture Documents
Addy Gabriela Ceballos Gmez Ricardo del Rayo Ochoa Felipe Mijangos Manrique Angel Manuel Montes de oca Segura Emmanuel Vera Tun 12 de marzo de 2012
ndice general
INTRODUCCIN
Microprocesador Z80 Caractersticas principales del Z80 . . . . Diagrama y descripcin de pines del Z80 . Registros internos del Z80 . . . . . . . . . Registros de uso general . . . . . . . Registros de uso especico en el Z80 El registro de estado . . . . . . . . . Las interrupciones en el Z80 . . . . . . . . Interrupcin no enmascarable (NMI) Interrupcin enmascarable(INT) . . Tipos de direccionamiento . . . . . . . . . Unidad Aritmtica-Lgica . . . . . . Ciclos o tiempos . . . . . . . . . . . . . . INTERFAZ DE PERIFRICOS 8255 DESCRIPCIN DEL INTEGRADO. . DESCRIPCIN FUNCIONAL . . . . . PROGRAMACIN DEL 8255 . . . . . MODOS DE OPERACIN DEL 8255 . ROM (AT28C64B) RAM (IS61LV256) Generador de Reloj RESET Selector de dispositivos(GAL16V8D) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3
5 5 6 8 8 8 9 10 10 10 11 11 12 14 14 15 15 16 18 19 20 22 23
27 27 32
INTRODUCCIN
Un ordenador es una mquina fundamentalmente secuencial. Esto quiere decir que realiza sus tareas una detrs de otra, siguiendo el orden en el que estn las instrucciones para realizarlas. Sus componentes bsicos sern, por tanto, un lugar donde almacenar las instrucciones y datos (Memoria) y un elemento encargado de ejecutar los procesos indicados por esas instrucciones (Unidad Central de Proceso o CPU). La CPU debe incluir todos los componentes necesarios para leer la memoria, decodicar las instrucciones y ejecutar clculos aritmticos y lgicos. En los ordenadores de pequeo tamao (minis y micros), la CPU est integrada dentro de un solo chip de silicio, a este chip se le conoce por el nombre de microprocesador.
Microprocesador Z80
El Z80 es uno de los uP mas importantes dentro de la rama de los 8 bits. Fabricado por la casa Zilog, fue empleado en muchos ordenadores personales. Se encuentra comercializado desde 1976 y al igual que el uP intel 8085, el Z80 es tambin similar al intel 8080 pero con mejoras notables.
* Instrucciones de copia y comparacin a nivel de bloque. En la gura 1 podemos observar el diagrama de bloques del uP Z80.
Figura 2: Diagrama de pines del Z80 El uP Z80 (gura 2) se encuentra encapsulado en el formato DIP de 40 terminales, como la mayora de los uP de 8 bits. Las funciones de sus terminales 6
son: A0-A15: D0-D7: WR: RD: MREQ: M1: HALT: WAIT: RESET: Bus de direcciones compuesto de 16 bits para alcanzar 64 Kb de memoria. Bus de datos, compuesto de 8 bits (Memory Write). Cuando este terminal esta a cero el uP indica al exterior la operacin de escritura. (Memory Read). Cuando se hace cero indica la operacin de lectura. (Memory Request). Cuando se pone en estado bajo, indica al exterior que la direccin del bus de direcciones es valida para leer o escribir. (Machine Cycle One) por este terminal el uP indica al exterior el primer tiempo de ejecucin de una instruccin (Ciclo de bsqueda) Cuando es cero, indica en que momento se detiene, como consecuencia de la instruccin HALT de un programa. Es por donde los perifricos y memorias lentas detienen al uP, para sincronizarse con el, esto ocurre cuando se lleva a cero. Llevando a cero esta entrada se produce el borrado del contador del programa, de modo que al retirarse el uP arranca en la direccin 0000. Es una salida de refresco, cuando se hace cero indica que los 7 bits de menor peso del bus de direcciones contienen la direccin de refresco para las memorias dinmicas que se pueden conectar al uP. (Input/Output Request) Cuando esta en estado bajo indica que el uP no se dirige a la memoria principal, sino a los dispositivos de entrada/salida. (Interrupt Request) Entrada por donde los perifricos hacen la peticin de interrupcin al uP. Se produce cuando se lleva a cero lgico. Entrada de interrupcin no enmascarada. Se activa por anco, concretamente con el anco de bajada de la interrupcin que se aplique por este terminal. La interrupcin ingresada por este terminal tiene prioridad total sobre la anterior (INT). Cuando se activa la NMI, el uP termina la ejecucin de la instruccin en curso e independientemente del contenido del registro de estado, bifurca a la direccin 0066 en hexadecimal. Esta direccin es la primera linea en que ha de esta ubicada la subrutina de tratamiento de la interrupcin. (Bus Request) Entrada por donde se lleva a alta impedancia las salidas del bus de datos, de direcciones y las salidas de control. El uP lleva sus buses a alta impedancia despus de ejecutar la instruccin en curso. 7
RFSH:
IORQ:
INT: NMI:
BUSRQ:
BUSACK: (Bus Acknowledge) Salida por donde se indica al exterior que el uP esta desconectado como consecuencia de la instruccin anterior (BUSRQ). Esto ocurre cuando la salida se hace cero lgico. CLK: Entrada del reloj, que para este uP es de una sola fase.
VCC-GND: Entradas nicas de 5V y GND que habr de ser aplicada entre los pines 11 y 29.
SP:
dato guardado es el primero en recuperarse. El uP dispone de dos instrucciones, llamadas PUSH y POP que se encargan de introducir y sacar datos de este stack. IX,IY: Son dos registros ndice independientes entre si y de 16 bits cada uno de ellos. Son usados por el uP como ndice para ejecutar operaciones con direccionamiento indexado.
Este modo de direccionamiento simplica la confeccin de un programa en especial cuando se accede a tablas de datos. I: Denominado Interrupt Page Adress Register. Es un registro de ocho bits y puede ser usado donde una llamada indirecta a una posicin de memoria sea necesaria como consecuencia de una interrupcin. Denominado Memory Refresh Register. Tambin es de ocho bits y puede ser usado para acceder a memorias dinmicas. El contenido de este registro es automticamente incrementado despus de cada instruccin de bsqueda.
R:
Estos ocho bits pueden salir al exterior por la parte baja del bus de direcciones para refrescar continuamente la memoria RAM dinmica a donde se desea acceder.
El registro de estado
En este uP el registro de estado es de 8 bits, de los cuales solo seis tienen signicado propio. Bit0=C (Carry). Indica cuando existe acarreo en la parte mas alta del registro acumulador. Es usado en operaciones de adicin y de sustraccin, as como en instrucciones de rotacin. (Zero) Este bit es puesto a uno si la operacin ejecutada tiene como resultado cero o si ha sido cargado un cero en el acumulador, de lo contrario sera siempre cero. (Signe) Este bit indica el signo del dato contenido en el acumulador, se pondr a uno cuando el dato sea negativo, y a cero cuando sea positivo (un dato es negativo cuando su bit siente es un uno)
Bit6=Z
Bit7=S
Bit2=P/O (Parity/Overow) Indica dos funciones distintas: la paridad de un resultado entregado en el acumulador cuando ha sido ejecutada una instruccin lgica (Paridad Par=1, Impar=0) y el overow o desbordamiento cuando ha ejecutado una operacin aritmtica. Bit4 Bit1 (H) es el bit que indica el acarreo de medio byte cuando se opera en BCD. Es decir el acarreo de los cuatro bits de menor peso del byte. (N) este bit indica que tipo de instruccin se ha ejecutado: suma o resta, operando en BCD. 9
Interrupcin enmascarable(INT)
Se trata de la interrupcin ms usada en el Z-80 ya que permite denir el vector de interrupcin, y lo que es ms importante, decidir por software si se atiende o no la peticin. Se denomina vector de interrupcin a la direccin de memoria a que se salta para ejecutar la rutina de servicio a la interrupcin. En el Z-80 existe un "miniregistro" de un solo bit que se denomina ip/op de aceptacin de interrupcin. Si este registro est a "1", la peticin de interrupcin es aceptada, y si est a "0" es ignorada. Cuando el ip/op de aceptacin est a "0", se dice que la interrupcin est enmascarada. Existen dos instrucciones en el Z-80 que nos permiten enmascarar o habilitar la interrupcin, estas interrupciones son: "DI" (Disable Interrupt) y "EI" (Enable Interrupt), se vern detalladamente cuando se estudien las instrucciones de control de la CPU. Si la interrupcin est habilitada, y el microprocesador decide aceptarla, podr responder de tres modos distintos. Estos tres modos de interrupcin, tambin se seleccionan por software, mediante las instrucciones: "IM0", "IM1" e "IM2" (Interrupt Mode 0, 1 y 2). Estos modos de respuesta se denominan respectivamente: MODO 0, MODO 1 y MODO 2. MODO 0 En este modo de interrupcin, el microprocesador deja libre el bus de datos para permitir que el dispositivo que ha solicitado la interrupcin inserte el cdigo de operacin correspondiente a una instruccin que ser ejecutada seguidamente por el microprocesador.
10
MODO 1 En este modo de interrupcin, el microprocesador responde a la interrupcin, simplemente, saltando a la posicin de memoria 0038h. En este caso se dice que el vector de interrupcin es jo. MODO 2 Es el modo de interrupcin ms complejo del Z-80, y el que deberemos utilizar para nuestros nes. En este caso, el microprocesador responde de una forma bastante compleja que conviene analizar detenidamente: primero toma el contenido del registro "I", lo considera como un octeto superior de una direccin, el octeto inferior deber suministrarlo el dispositivo que ha solicitado la interrupcin (si no lo suministra, se entiende que es FFh). Acto seguido, lee el nmero almacenado en esa direccin y la siguiente, lo carga en el "PC", y contina la ejecucin desde ese punto.
Tipos de direccionamiento
El Z80 dispone de los siguientes modos de direccionamiento: Inmediato: Es usado en instrucciones de dos bytes, el primero es el de la instruccin a tratar, y el segundo es el del operando o dato a tratar. Inmediato-Extendido: Es usado en instrucciones de tres bytes, donde el operando ocupa dos de ellos. Relativo: Es usado para operar en las proximidades de la instruccin en curso. Esta relacionado con el contador del programa. Es de dos bytes.
Extendido: Es usado en instrucciones en que se determina la direccin efectiva. Es de tres bytes. Indexado: La direccin efectiva se obtiene sumando el contenido de los registros ndice con el del tercer byte. Es de tres bytes. De registros: Es usado en operaciones de tratamiento de registros. Indirecto: La direccin efectiva se encuentra en el lugar de memoria indicado por la instruccin.
Unidad Aritmtica-Lgica
Otro componente fundamental del microprocesador es la ALU o Unidad Aritmtica-Lgica que es la encargada de realizar todas las operaciones en el interior del microprocesador. Las operaciones que puede realizar son: Desplazamiento Comparacin Puesta a uno de bit
11
Puesta a cero de bit Prueba de bit AND OR OR exclusivo (XOR) Incremento Decremento Suma Resta Ajuste decimal El desplazamiento consiste en una rotacin, bit a bit, de un registro o una posicin de memoria, puede incluir el indicador de acarreo del registro F. El efecto de rotar a la izquierda es el de multiplicar el nmero por 2, y el de rotarlo a la derecha es el de dividirlo por 2. La comparacin consiste en cotejar el acumulador con otro nmero y alterar los indicadores del registro F de acuerdo con el resultado de la comparacin, permaneciendo inalterado el contenido del acumulador. Probar un bit consiste en ver si es "uno" o "cero" y anotar el resultado en el indicador de cero del registro F. Incrementar es sumar "1", decrementar es restar "1". La suma y la resta pueden ser con o sin acarreo. El ajuste decimal consiste en transformar el nmero Hexa contenido en el acumulador y comprendido entre "00" y "FF", en un nmero decimal codicado en binario (BCD) comprendido entre "00" y "99".
Ciclos o tiempos
Para realizar las operaciones secuencialmente, el Z-80 necesita sincronizar todas sus seales internas y externas y disponer, por tanto, de un patrn de tiempo. Es lo que se denomina: Reloj del microprocesador. Cabe sealar que existen varias versiones del microprocesador Z80, las cuales tienen diferente frecuencia mxima de operacin. La versin original trabaja a una frecuencia de 2.5 MHz. A continuacin se presenta las diferentes versiones con su velocidad mxima de operacin.
12
Cuadro 1: Frecuencias mximas de las versiones del Z80 Se denomina Ciclo de instruccin al tiempo durante el cual el microprocesador ejecuta una instruccin completa. El ciclo de instruccin se subdivide a su vez, en ciclos de mquina. Un ciclo de mquina es el tiempo durante el cual el microprocesador realiza una operacin elemental. Cada ciclo de mquina emplea varios ciclos (impulsos) de reloj. Se denomina "M1" al ciclo de mquina correspondiente a la bsqueda del cdigo de operacin, durante el cual, la pata M1 del microprocesador se coloca a nivel bajo. El ciclo de mquina M1 ocupa 4 ciclos de reloj. Un ciclo de memoria es una operacin de lectura o escritura en memoria, emplea 3 ciclos de reloj.
13
RESET: Esta seal borra el registro de control y todos los puertos (A, B y C) son colocados en modo entrada. RD: Utilizada por la CPU para leer informacin de estado o datos procedentes del 8255. W R: Utilizada por la CPU para enviar palabras de control o datos al 8255. A0-A1: Lneas de direccin: permiten seleccionar uno de los tres puertos o el registro de control. PA0-PA7: Puerto A: puerto de entrada/salida de 8 bits. PB0-PB7: Puerto B: puerto de entrada/salida de 8 bits. PC0-PC7: Puerto C: puerto de entrada/salida de 8 bits.
DESCRIPCIN FUNCIONAL
Las dos lneas de direcciones denen cuatro puertos de E/S en el ordenador: los tres primeros permiten acceder a los puertos A, B y C; el cuarto sirve para leer o escribir la palabra de control. El 8255 est dividido en dos grupos internos: el grupo A, formado por el puerto A y los 4 bits ms signicativos del puerto C; y el grupo B, constituido por el puerto B junto a los 4 bits menos signicativos del puerto C. El puerto C est especialmente diseado para ser dividido en dos mitades y servir de apoyo a los puertos A y B en algunos sistemas.
15
Figura 4: Palabra 1 de conguracin del 8255A Si el bit ms signicativo de la palabra de control est borrado, es tratada entonces como un comando especial que permite activar o inhibir selectivamente los bits del puerto C:
Figura 5: Palabra 2 de conguracin del 8255A Esto es particularmente til para los modos 1 y 2, donde las interrupciones generadas por las lneas del puerto C pueden ser activadas o inhibidas simplemente poniendo a 1 0, respectivamente, el ip-op interno INTE correspondiente a la interrupcin que se trate. Todos son puestos a cero tras establecer el modo.
por seales de control a travs del puerto C. Este modo slo puede operar en el Grupo A. Tanto las entradas como salidas son almacenadas en latch. NOTA: Existen varias combinaciones posibles de estos modos, en las que las lneas del puerto C que no son empleadas como seales de control pueden actuar como entradas o salidas normales, quedando las lneas de control fuera del rea de inuencia de los comandos que afectan a las restantes.
17
ROM (AT28C64B)
El AT28C64B (gura 6) es una EEPROM con 64K(8K X 8) de memoria, con un tiempo de acceso a lectura de 150ns
Figura 6: Diagrama de pines del AT28C64B Descripcin de pines: A0-A12: Bus de direcciones CE: Chip Enable OE: Output Enable I/O0-I/O7: Bus de Datos de Entrada y Salida NC: No conectado DC: No conectar
18
RAM (IS61LV256)
El IS61LV256 (gura 7) es una memoria SRAM de 32K X 8 de capacidad
19
Generador de Reloj
Para que el microprocesador pudiese funcionar adecuadamente, el circuito de generacin de reloj deba cumplir con las caractersticas mencionadas con anterioridad en la parte de descripcin del microprocesador. Para ello se uso un cristal de 4MHz.
Figura 8: Circuito generador de reloj Dicha seal debe cumplir con las caractersticas que se muestran en la imagen.
20
Figura 9: Seal de reloj Para medir los tiempos de ejecucin de las instrucciones se tomo en cuenta lo siguiente: Fosc = 4MHz por lo que el tiempo de los T-states es de 1/4MHz = 0.25 microSegundos (us).
21
RESET
El circuito que genera la seal de reset se muestra en la gura.
Figura 10: Circuito Reset Este tipo de circuito es necesario para retardar el inicio de operacin del microprocesador, mantenindolo en tri-state mientras la fuente de poder supera su transitorio inicial al encendido. De esta manera evitamos que el microprocesador empiece a operar cuando la alimentacin todava no alcanza un nivel adecuado, previniendo as una operacin incorrecta. La salida que est entre los inversores va conectado a reset del controlador de perifricos (8255) y la salida nal va conectado al reset del Z80. Las especicaciones del Z80 exigen que la seal de RESET este activa en 0 lgico por lo menos durante 3 ciclos de reloj (1.2 s) para una frecuencia de 2.5 MHz, por lo que al calcular la constante de tiempo del circuito RC es necesario tener en cuenta el tiempo de restablecimiento de las seales (en el orden de los 20 ms), por lo que RC debe ser mayor de 30 ms. Los trigger Schmitt (7414) aumenta la conabilidad del diseo al introducir histresis y acelerar la transicin entre niveles lgicos. El uso del diodo tiene por objetivo descargar rpidamente el capacitor, para asegurar la generacin del pulso de restablecimiento aun en los casos en que se apague y se vuelva a encender en un lapso de tiempo muy corto.
22
Selector de dispositivos(GAL16V8D)
Figura 11: Diagrama de pines GAL16V8D Para realizar la seleccin de dispositivos, es decir, si se lea/escriba a puerto o memoria (RAM/ROM) se puede utilizar la GAL16V8D (gura 11). El GAL16V8D es un PLD (Dispositivo Lgico Programable), en el cual se puede programar una tabla de verdad, esto facilitara la seleccin de dispositivos.
23
Cuadro 2: Tabla de verdad del GAL16V8D El A15 del Z80 se uso para seleccionar entre la memoria RAM y ROM si era 0 se selecciona la memoria ROM y si es 1 se selecciona la memoria RAM. El 24
IORQ si es 0 habilita el chip select del 8255 y deshabilita las memoria y tambin se toma en cuenta para la seleccin del puerto A12 al A15 ya que la direccin de puertos solo va del 00H al 03H. El LCD fue conectado de la siguiente manera. LCD D0-D7 RS R/W E Z80 PB0-PB7 PC5 PC6 PC7
Esquemtico Final
A continuacin se muestra el esquemtico nal del sistema.
25
26
Cdigos
Cdigo del GAL16V8D
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 Name Z80 ; PartNo 00 ; Date 08/12/2011 ; Revision 01 ; Designer Mi croproce sadores ; Company Microp rocesado res ; Assembly None ; Location FMAT ; Device G16v8 ; /* *************** INPUT PINS * * * * * * * * * * * * * * * * * * * * * / PIN 1= A2 ; PIN 2= A3 ; PIN 3= A4 ; PIN 4= A5 ; PIN 5= A6 ; PIN 6= A7 ; PIN 7= IORQ ; PIN 8= MREQ ; PIN 9= A15 ; PIN 11= WR ; PIN 19= RD ; /* *************** OUTPUT PINS * * * * * * * * * * * * * * * * * * * * * / PIN 12= ROMCE ; PIN 13= RAMCE ; PIN 14= RDPORT ; PIN 15= WRPORT ; PIN 16= RWMEM ; PIN 17= RDMEM ; PIN 18= PORTCE /* *************** LOGICA * * * * * * * * * * * * * * * * * * * * * * * * * * / ROMCE =! IORQ # MREQ # A15 ; RAMCE =! IORQ # MREQ #! A15 ; PORTCE = A2 # A3 # A4 # A5 # A6 # A7 # IORQ #! MREQ ; RDPORT = IORQ #! MREQ # RD #! WR ; WRPORT = IORQ #! MREQ #! RD # WR ; RDMEM =! IORQ # MREQ # RD #! WR ; RWMEM =! IORQ # MREQ #! RD # WR ;
27
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
;RAM 8000H FFFFH ;PUERTOS: ; 0000H PuertoA (NADA) ; 0001H PuertoB (BUS DE DATOS LCD) ; 0002H PuertoC (CONTROL LCD) ; 0003H CONFIGURACION 8255 ; 0000H ;PUERTO B ; PB0 ; PB1 ; PB2 ; PB3 ; PB4 ; PB5 ; PB6 ; PB7 ; 0002H ;PUERTO C ; PC5 ; PC6 ; PC7 BUS DE DATOS LCD D0 D1 D2 D3 D4 D5 D6 D7 CONTROL LCD RS R/W_n E
; : : : DEFINICION DE NOMBRES QUE SE USARAN EN EL CODIGO : : : ; .....PALABRAS PARA EL 8255 . . . . . PORTS_OUT: EQU 80H ; P a l a b r a q u e c o n f i g u r a t o d o s l o s p u e r t o s d e l 8255 como PORTA_IN : EQU 90H ; e l p u e r t o A d e l 8255 como e n t r a d a , l o s r e s t a n t e s como ; ..Palabras de configuracion EQU 30H de LCD.... salida salidas
LCD_8b_1L_5x8 :
; P a l a b r a de c o n f i g u r a c i o n d e l LCD ; ( 8 b i t s , 1 Linea , C a r a c t e r 5 x8 ) ; Usada p a r a l a i n i c i a l i z a c i o n ; 0 0 1 DL N F ; DL=1 N=0 F=0 ; DL : Ancho de Datos , N: ; P a l a b r a de c o n f i g u r a c i o n u s a d a ; ( 8 b i t s , 2 L i n e a s , C a r a c t e r 5 x8 ) ; 0 0 1 DL N F ; DL=1 N=1 F=1 ; DL : Ancho de Datos , N:
Lineas , F :
Fuente
LCD_8b_2L_5x8 :
EQU 3FH
Lineas , F :
Fuente
DISPLAY_ON : EQU 0C H
Binking
DISPLAY_OFF :
EQU 08H
; P a l a b r a de c o n f i g u r a c i o n p a r a a p a g a r e l LCD ; cursor off , b l i n k i n g o f f ;0 0 0 0 1 D C B ; D=0 C=0 B=0 ; D: D i s p l a y on/ o f f , C : Cu r s o r on / o f f , B : B i n k i n g ; Palabra para l i m p i a r ; 0 0 0 0 0 0 0 1 el Display d e l LCD
CLEAR_LCD:
EQU 01H
; P a l a b r a p a r a e n t r a r a l modo SET ; a u t o i n c r e m e n t o ( Derecha ) no s h i f t ; 0 0 0 0 0 1 I /D S ; I /D=1 S=0 ; I /D: d e r e c h a / i z q u i e r d a , ; Palabra que pone el cursor al inicio ,
S:
Shift
on / o f f
0 0 0 0 0 0 1
; ..DEFINICION DE LAS DIRECCIONES DE LOS PUERTOS . . . . . . BUS_DATOS_LCD: EQU 01H ; D e f i n i c i o n d e l b u s da d a t o s d e l LCD ; D i r e c c i o n 00H d e l Z80 y b 0 0 d e l 8 2 5 5 (PUERTO A) CONTROL_LCD: EQU 02H ; D e f i n i c i o n de l a d i r de ; 01H d e l Z80 y b 0 1 d e l l a s l i n e a s de c o n t r o l 8 2 5 5 (PUERTO C) la comfiguracion d e l LCD del 8255
CONFIG_8255 :
EQU 03H
; . . . . P I N E S DE CONTROL DEL LCD (PUERTO C) . . . . . LCD_RS : EQU 5 ; R e g i s t e r S e l e c t d e l LCD, 0 i n s t r u c c i o n , 1 ; BIT 5 CONTROL_LCD q u e d e f i n e s i s e o p e r a n LCD_RW: EQU 6 LCD_E : EQU 7 ;R=1 W =0 L e c t u r a y escritura d e l LCD ::::
instrucciones
d e l CONTROL_LCD
sirve e l contenido
la el
direccion control
8000H d e l LCD
28
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
REG_DATOS_LCD:
EQU 8 0 0 1H
; Registro
usado
para
guardar
lo
que
se
enviara
en
e l LCD
; : : : : : : : : PROGRAMA PRINCIPAL : : : : : : : : : : : org 0 0 0 0H ; Vector de RESET e l LCD d i r e c c i o n de NOMBRES l o s nombres y a p u n t a a la primera letra
; Inicializa
de REG_DATOS_LCD
; Envia e l d a t o almacenado en REG_DATOS_LCD ; Espera 4 m i l i s e g u n d o s ; Espera 4 m i l i s e g u n d o s ; I n c r e m e n t a IX p a r a p a s a r a l s i g u i e n t e c a r a c t e r ; V e r i f i c a m o s s i no hemos l l e g a d o a l f i n a l d e l ; t e r m i n a cuando e n c u e n t r o e l d e l i m i t a d o r 0 ; Suma e l r e g i s t r o A con A ; s i s e a c t i v a l a b a n d e r a de ZEROS q u i e r e d e c i r ; l l e g a m o s a l f i n a l d e l nombre ; S i no e s c e r o m u e s t r a e l c a r a c t e r ; Movemos e l v a l o r de 130 ; para e s p e r a r aprx 2 s e g para imprimir el nombre que
siguiente
nombre
l d A,CLEAR_LCD ; Movemos l a p a l a b r a p a r a l i m p i a r e l LCD l d (REG_DATOS_LCD) ,A ; Movemos l a p a l a b r a a l b u s de d a t o s c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l LCD_ENVIA_COMANDO ; Envia e l comando a l LCD c a l l DELAY_15ms ; Esperamos 15 ms c a l l DELAY_15ms ; Esperamos 15 ms c a l l DELAY_15ms ; Esperamos 15 ms ; VERIFICAREMOS S I YA SE ESCRIBIERON TODOS LOS NOMBRES i n c IX ; Incrementamos d o s v e c e s IX ; p a r a c o l o c a r n o s en l a s i g u i e n t e l i n e a de nombres i n c IX l d A , ( IX +0) ; Cargamos l o q u e e s t a en IX a A sub A, 0 FFH ; Restamos a A 0FFH q u e e s e l d e l i m i t a d o r f i n a l de l o s nombres j r NZ ,MUESTRA ; Muestra e l s i g u i e n t e nombre s i no ha l l e g a d o a l f i n j p NOMBRE_INI NOMBRES: ; E l 0 a l f i n a l de l o s nombre i n d i c a e l f i n a l de una c a d e n a DB "MICRO : Z80 " , 0 DB "PROFESOR : " , 0 DB "OTILIO SANTOS " , 0 DB "ALUMNOS: " , 0 DB "ADDY CEBALLOS " , 0 DB "FELIPE MIJANGOS " , 0 DB "ANGEL MONTES " , 0 DB "RICARDO DEL R. " , 0 DB "EMMANUEL VERA " , 0 DB "CAL : 1 0 0 " , 0 DB 0FFH j p END_PROGRAM ; : : FUNCIONES USADAS EN EL PROGRAMA : : : : : : : : ; ...CONFIGURA PUERTOS C M SALIDA EN EL M D 0 . . . . . . . . O O O O CONFIG_PORTS_OUT: l d A,PORTS_OUT ; Carga a A l a c o n f i g u r a c i o n d e l 8255 p a r a q u e ; t o d o s l o s p u e r t o s s e a n de s a l i d a en modo 0 c a l l DELAY_15ms out ( CONFIG_8255 ) ,A ; E s c r i b e l a c o n f i g u r a c i o n a l 8255 ret ; % % %INICIALIZACION DEL LCD % % % % % % % %% INIT_LCD : c a l l DELAY_15ms ; Esperamos un t i e m p o c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms l d A, 0 1H l d (REG_CONTROL_LCD) ,A l d HL ,REG_CONTROL_LCD ; D e l i m i t a d o r d e l f i n a l de l o s nombres ; e s t e numero no t i e n e v a l o r ASCII
por
el
voltaje
de
rizo
; Guarda
la
direccion
de
control
d e l LCD
29
185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275
; Configura
todos
los
p u e r t o s como
l d (REG_DATOS_LCD) ,A c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l LCD_ENVIA_COMANDO ; Mandamos e s t a i n s t r u c c i o n c a l l DELAY_15ms ; Esperamos t i e m p o p a r a mandar c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l LCD_ENVIA_COMANDO ; Envia e l comando p o r 2 da v e z c a l l DELAY_4ms ; Esperamos t i e m p o c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_4ms c a l l LCD_ENVIA_COMANDO ; Enviamos e l comando de nuevo c a l l DELAY_4ms ; Esperamos t i e m p o c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms
la
siguiente
instruccion
l d A, LCD_8b_2L_5x8 ; Cargamos a A l a c o n f i g u r a c i o n nueva p a r a e l LCD l d (REG_DATOS_LCD) ,A ; Cargamos l a c o n f i g u r a c i o n a l b u s de DATOS d e l LCD c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l LCD_ENVIA_COMANDO ; Enviamos e s t a i n s t r u c c i o n c a l l DELAY_4ms ; Esperamos t i e m p o c a l l DELAY_15ms c a l l DELAY_15ms l d A, DISPLAY_OFF ; Cargamos a A l a c o n f i g u r a c i o n de APAGADO d e l D i s p l a y l d (REG_DATOS_LCD) ,A ; Cargamos e s t a c o n f i g u r a c i o n a l b u s de d a t o s d e l LCD c a l l LCD_ENVIA_COMANDO ; Enviamos e s t e comando a l LCD c a l l DELAY_4ms ; Esperamos o t r o s 4 ms p a r a mandar e l s i g u i e n t e comando c a l l DELAY_15ms c a l l DELAY_15ms l d A,CLEAR_LCD l d (REG_DATOS_LCD) ,A c a l l LCD_ENVIA_COMANDO c a l l DELAY_4ms c a l l DELAY_15ms c a l l DELAY_15ms l d A,LCD_MODO_SET l d (REG_DATOS_LCD) ,A c a l l LCD_ENVIA_COMANDO c a l l DELAY_4ms c a l l DELAY_15ms c a l l DELAY_15ms l d A,LCD_MODO_SET l d (REG_DATOS_LCD) ,A c a l l LCD_ENVIA_COMANDO c a l l DELAY_4ms c a l l DELAY_15ms c a l l DELAY_15ms l d A,LCD_HOME l d (REG_DATOS_LCD) ,A c a l l LCD_ENVIA_COMANDO c a l l DELAY_4ms c a l l DELAY_15ms c a l l DELAY_15ms l d A, DISPLAY_ON l d (REG_DATOS_LCD) ,A c a l l LCD_ENVIA_COMANDO c a l l DELAY_4ms c a l l DELAY_15ms c a l l DELAY_15ms ret ; Cargamos l a c o n f i g u r a c i o n a A p a r a ; Cargamos e s t a c o n f i g u r a c i o n a l b u s ; Enviamos e s t e comando a l LCD ; Esperamos t i e m p o l i m p i a r e l LCD de d a t o s d e l LCD
entrar b u s de
de
datos
d e l LCD
encender e l d i s p l a y b u s de d a t o s d e l LCD
; ...MANDA UN PULSO AL LCD EN EL PIN DE ENABLE.... LCD_E_SIGNAL : c a l l DELAY_4ms r e s LCD_E, (HL) ; Pone a 0 e l b i t LCD_E d e l r e g i s t r o de CONTROL_LCD l d A , ( HL) ; Carga a A e s t a c o n f i g u r a c i o n out (CONTROL_LCD) ,A ; Mandamos e s t a c o n f i g u r a c i o n a l b u s de c o n t r o l d e l LCD
30
276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365
c a l l DELAY_4ms s e t LCD_E, ( HL) l d A , ( HL) out (CONTROL_LCD) ,A c a l l DELAY_4ms r e s LCD_E, ( HL) l d A , ( HL) out (CONTROL_LCD) ,A c a l l DELAY_4ms ret ; . . . . . E N V I A INSTRUCCION AL LCD QUE ESTA EN REGISTRO REG_DATOS_LCD.... LCD_ENVIA_COMANDO: call call call res DELAY_15ms DELAY_15ms DELAY_15ms LCD_RS, ( HL) ; Pone a 0 e l b i t LCD_E d e l r e g i s t r o ; Carga a A e s t a c o n f i g u r a c i o n ; Mandamos e s t a c o n f i g u r a c i o n a l b u s de CONTROL_LCD de control d e l LCD ; Ponemos a 1 e l ; Cargamos e s t a ; Sacamos en e l b i t LCD_E d e l r e g i s t r o de CONTROL_LCD configuracion a A b u s de c o n t r o l d e l LCD
r e s LCD_RW, ( HL) l d A , ( HL) c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms out (CONTROL_LCD) ,A c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms l d A, (REG_DATOS_LCD) c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms out (BUS_DATOS_LCD) ,A c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l LCD_E_SIGNAL ret
registro
de CONTROL_LCD
de CONTROL_LCD
; Mandamos e s t a
seal
al
bus
de
control
d e l LCD
; Cargamos
esta
configuracion
a A
; Mandamos e s t a
configuracion
a l LCD
; Mandamos
el
pulso
de ENABLE d e l LCD
; . . . . E N V I A DATO AL LCD QUE ESTA EN REGISTRO REG_DATOS_LCD........ LCD_ENVIA_DATO: c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms s e t LCD_RS, ( HL) ; Ponemos en 1 e l b i t LCD_RS ; p a r a mandar un d a t o a l LCD d e l b u s de CONTROL_LCD r e s LCD_RW, ( HL) ; Ponemos a 0 e l b i t L D R C _ W p a r a e s c r i b i r en e l LCD l d A , ( HL) ; Cargamos e s t a c o n f i g u r a c i o n a A c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms out (CONTROL_LCD) ,A ; Mandamos e s t a c o n f i g u r a c i o n a l b u s de c o n t r o l de LCD c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms l d A , (REG_DATOS_LCD) ; Cargamos e s t a c o n f i g u r a c i o n a A c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms out (BUS_DATOS_LCD) ,A ; Cargamos en e l BUS de d a t o s d e l LCD l o q u e mandaremos c a l l DELAY_15ms c a l l DELAY_15ms c a l l DELAY_15ms c a l l LCD_E_SIGNAL ; Manda e l p u l s o de ENABLE p a r a q u e l o a c e p t e e l LCD ret ; ..DELAY DE 15 ms DELAY_15ms : l d B , 0 EH ..... ; Cargamos e l r e s i t r o B con e l ; esta instruccion = 7 T s t a t e s ; T1 = 70 . 2 5 u s = 1 . 7 5 u s v a l o r 14 o 0EH en h e x y se ejecutara 1 vez hex
LOOP1_15ms : l d C, 0EDH
LOOP2_15ms : dec C
; Decrementamos e l r e g i s t r o C ; son 4 T s t a t e s y s e e j e c u t a 23714 v e c e s ; T3 = 2371440 . 2 5 u s = 3 . 3 1 8 ms nop ; Espera 4 T s t a t e s y s e e j e c u t a 23714 v e c e s ; T4 = 2371440 . 2 5 u s = 3 . 3 1 8 ms j p NZ , LOOP2_15ms ; S a l t a a LOOP2_15ms s i no s e l e v a n t a l a b a n d e r a de ZEROS ; s e e j e c u t a 23714 v e c e s y e q u i v a l e a 10 T s t a t e s ; T5 = 23714100 . 2 5 u s = 8 . 2 9 5 0 ms dec B ; Decrementa e l r e g i s t r o B, son 4 T s t a t e s y s e e j e c u t a 14 veces
31
366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399
j p NZ , LOOP1_15ms
de ZEROS
ret ; ..DELAY DE 4 ms DELAY_4ms : l d B, 0 4H ..... ; Cargamos e l r e s i t r o B con e l ; esta instruccion = 7 T s t a t e s ; T1 = 70 . 2 5 u s = 1 . 7 5 u s v a l o r 04 o 04H en h e x y se ejecutara 1 vez
LOOP1_4ms : l d C, 0DDH
; Cargamos e l r e g i s t r o C con e l v a l o r de 221 o DDH en h e x ; esta instruccion = 7 T s t a t e s s e e j e c u t a 04 v e c e s ; T2 = 0470 . 2 5 u s = 7 u s veces ; Decrementamos el r e g i s t r o C, son 4 T s t a t e s y se ejecuta
j p NZ , LOOP2_4ms
; T3 = 2210440 . 2 5 u s = 884 u s ; Espera 4 T s t a t e s y s e e j e c u t a 22104 v e c e s ; T4 = 2210440 . 2 5 u s = 884 u s ; S a l t a a LOOP2_4ms s i no s e l e v a n t a l a b a n d e r a de ZEROS ; s e e j e c u t a 22104 v e c e s y e q u i v a l e a 10 T s t a t e s ; T5 = 22104100 . 2 5 u s = 2 . 2 1 ms ; Decrementa e l r e g i s t r o B, son 4 T s t a t e s y s e e j e c u t a ; T6 = 0440 . 2 5 u s = 4 u s ; S a l t a a LOOP1_4ms s i no s e l e v a n t a l a b a n d e r a ; s e e j e c u t a 04 v e c e s y e q u i v a l a a 10 T s t a t e s ; T7 = 04100 . 2 5 u s = 10 u s ; T = T1+T2+T3+T4+T5+T6+T7 = 4 . 0 0 0 7 ms de ZEROS
04
Software til
Compilacin z80asm en GNU/Linux y Winculp en Windows para la GAL Simulacin ZIM (gura 13) en GNU/Linux y Z80 IDE (gura 14)
32
33
34
Bibliografa
[1] S. Ciarcia. Build your own Z80 computer: design guidelines and application notes. Byte, 1981. [2] R.S. Gaonkar. The Z80 microprocessor. Macmillan Press, 2000. [3] JC Matthews. Building a z80 minimum system computer. Physics experiments and projects for students, 2:177, 1989. http://en.wikipedia.org/wiki/Zilog_Z80 http://www.natmac.net/zim/ Z80 Datasheet
35