manual altair

100
INDICE TEMA 1.- Introducción al sistema Altair 535……………………………….2 TEMA 2.- Primeros programas en el sistema Altair 535…………………...3 TEMA 3.- Organización de Memoria……………………………………….15 TEMA 4.- Convertidor A/D…………………………………………………32 TEMA 5.- Temporizadores………………………………………………….49 TEMA 6.- Interrupciones y Contadores…………………………………..54 TEMA 7.- Conexión de un Display LCD…………………………………..70 Sistema basado en microprocesador Altair 535 1

Upload: tomas-saavedra-fernandez

Post on 02-Aug-2015

283 views

Category:

Documents


5 download

TRANSCRIPT

Page 1: Manual Altair

INDICE

TEMA 1.- Introducción al sistema Altair 535……………………………….2

TEMA 2.- Primeros programas en el sistema Altair 535…………………...3

TEMA 3.- Organización de Memoria……………………………………….15

TEMA 4.- Convertidor A/D…………………………………………………32

TEMA 5.- Temporizadores………………………………………………….49

TEMA 6.- Interrupciones y Contadores…………………………………..54

TEMA 7.- Conexión de un Display LCD…………………………………..70

Sistema basado en microprocesador Altair 5351

Page 2: Manual Altair

TEMA 1.- INTRODUCCION AL SISTEMA BASADO EN MICROPROCESADOR ALTAIR 535

El sistema Altair 535 es un sistema basado en microprocesador. Un microprocesador no es utilizable por si solo, sino que es necesario una serie de componentes que le permitan funcionar, comunicarse con otros dispositivos auxiliares y con el exterior.

En este caso el sistema completo se llama Altair 535, y el microprocesador que utiliza este sistema se llama SAB 80C535 de Siemens. Puede realizar hasta un millón de instrucciones por segundo con un cristal de 12 MHz y está fabricado con la tecnología ACMOS, la cual permite un reducido consumo de corriente pudiendo ser alimentado por una simple batería.

Trabaja sólo con datos de 8 bits, lo que está muy lejos de los microprocesadores de PC actuales, la velocidad también es mucho más pequeña que en estos, pero en cambio ocupan muy poco espacio y son muy baratos, lo que unido a que son perfectamente capaces de realizar algunas tareas de control en la industria y en el mercado doméstico, son la solución perfecta para estas aplicaciones que hasta ahora se habían resuelto con lógica cableada.

Antes de continuar es preciso aclarar un pequeño matiz que se plantea al llegar a este punto. Aunque hasta ahora hemos llamado microprocesador al SAB 80C535, sería más correcto llamarlo Microcontrolador. Pero, ¿Qué diferencias hay entre uno y otro?. Un microcontrolador se puede definir como un microprocesador al que se le han añadido una serie de elementos que podría tener externamente un Microprocesador, por ejemplo un convertidor Analógico/Digital,un Temporizador, un módulo de comunicación serie, buffers de salida y entradas digitales. Es decir, un microcontrolador es un chip que tiene integrados un microprocesador y una serie de periféricos que le permiten ser casi “autosuficiente” en aplicaciones de control.

Estos “periféricos”, integrados en el microprocesador de un PC, limitarían mucho a este, ya que el trabajo de estos está más enfocado al trabajo masivo con datos y todas estas aplicaciones de Convertidores A/D, comunicación serie, etc, serían un estorbo y un encarecimiento de este, además de ser aplicaciones no utilizadas por la mayoría de los usuarios, por lo que se dejan para ampliaciones opcionales del PC a través de tarjetas.

En definitiva, los microcontroladores son sistemas ideales para realizar pequeñas tareas de control en múltiples aplicaciones, donde solo es necesario ejecutar un pequeño programa en el que sólo sea necesario medir unas pocas señales Digitales y/o Analógicas procedentes de sensores del sistema a controlar, y activar unas pocas señales también Digitales y/o Analógicas para activar los actuadores que permitan intervenir en el sistema físico.

Todo esto, como se ya se ha comentado, se hacía anteriormente con sistemas de control basados en lógica cableada, en la que la automatización de un proceso se realizaba a traves de automatismos o circuitos lógicos discretos. Esto limitaba las posibilidades del sistema de control ya que no era posible diseñar sistemas con demasiada “inteligencia” y además los diseños eran caros, voluminosos y de difícil mantenimiento.

Sistema basado en microprocesador Altair 5352

Page 3: Manual Altair

TEMA 2.- PRIMEROS PROGRAMAS CON ALTAIR 535.

La mejor forma de aprender a programar es programando, por ello vamos a empezar directamente realizando una serie de programas sencillos que permitan a las personas que no han programado nunca un equipo de estas características, familiarizarse con él lo antes posible.

La programación del Altair se realiza en lenguaje Ensamblador. Este se escribe en un editor de textos localizado en C:\Altair\Editor51. La utilización de este editor viene detallada en el tema 1 del manual de usuario, por lo que aquí solo recordaremos algunos detalles.

Una vez escrito el programa se debe de seguir el siguiente proceso para enviárselo al microprocesador:

PROGRAMA FUENTE PROGRAMA PROGRAMAOBJETO OBJETO COMPLETO

.S51 Ensamblar .O51 Enlazar .e51F9 F8

ENVIA EL PROGRAMA AL ALTAIR

Control + F9

-Programa fuente.- Es el programa o listado de texto que hacemos o vemos en el Editor. Este programa se almacena con la extensión .S51

- Programa Objeto.- Es el programa que hemos hecho en el editor pero convertido al lenguaje Código Máquina que entiende el microprocesador SAB535. Tiene la extensión .o51.

-Programa Objeto completo.- Es la inclusión en el programa objeto anterior de funciones y librerias utilizadas en nuestro programa. Tiene la extensión .e51

- Envío al Altair.- Se envía al Altair a través de un puerto serie (Com1 o Com2) configurado previamente en “Opciones”, el archivo final .e51.

Sistema basado en microprocesador Altair 5353

Page 4: Manual Altair

Cabecera de los programas.

Al inicio de los programas se suelen incluir varias líneas de código de cabecera. En nuestro caso siempre incluiremos las dos siguientes:

include ..\fuentes\reg515.deftext_org $8000

La primera se escribe para que se incluyan en el programa librerías o código que nos facilitan la elaboración del programa. La segunda línea hace que el programa cuando sea enviado, sea colocado en la memoria del Altair a partir de una posición fija (en este caso la $8000).

Principio y final.

Normalmente los programas no tienen un final determinado sino que siempre se están ejecutando. Para que puedan hacer esto hay que tener una estructura de programa cíclica:

inicio: ; Etiqueta de inicio de programa

programa

sjmp inicio ; Instrucción de salto a inicio

Los primeros programas.

Programa 1:

include ..\fuentes\reg515.deftext_org $8000

inicio:Este es el cuerpo del programa, el resto ( lo que está en

Mov R0, #30 negrita) se va a repetir en todos los programas queMov P4, R0 se van a hacer por lo que se puede copiar de un programa

a otro.sjmp inicio

.end

Sistema basado en microprocesador Altair 5354

Page 5: Manual Altair

Este programa simplemente mueve el dato 30 decimal a un registro llamado R0. Los registros R0, R1, R2, R3, R4, R5, R6, R7, son registros de propósito general donde podemos guardar momentáneamente algún valor.

En la segunda línea se mueve el contenido de R0 al puerto P4. Si tenemos conectado dicho puerto a unos diodos led podemos ver en ellos el contenido actual de R0 y P4.

Programa 2:

También se puede cargar en un puerto directamente un dato en diferente tipo de numeración:

Mov P4, #$F0 ; Carga en P4 el dato hexadecimal F0Mov P4, #135 ; Carga en P4 el dato decimal 135Mov P4, #%10101001 ; Carga en P4 el dato binario 10101001

Instrucciones de Salto

Ya hemos visto anteriormente en el apartado “principio y final” una instrucción de salto “sjmp”, que permitia saltar al principio del programa cuando se llegua al final y volver a comenzar de nuevo para conseguir una ejecución cíclica.

Un programa es una ejecución de instrucciones ordenada y secuencial. Hay un dispositivo dentro del microprocesador que es quien lleva el control de la ejecución de las instrucciones o lo que es lo mismo, sabe en cada momento donde está la instrucción que se está ejecutando. Este es el Contador de Programa o Program Counter (PC).

Veamos esto con un ejemplo:

Programa 3:

include ..\fuentes\reg515.deftext_org $8000

inicio:mov P4,#%11111111nopnopmov P4, #%00000000nopnop

sjmp inicio

Sistema basado en microprocesador Altair 5355

Page 6: Manual Altair

Este programa simplemente pone a 1 todos los bits del puerto 4 y tras dos nop (no operación) que consumen un pequeño tiempo, ponen a 0 todos los bits del puerto 4. Después de otras dos nop se vuelve a saltar a la etiqueta de inicio y se vuelve a ejecutar el programa, repitiéndose éste cíclicamente.

Veamos como trabaja en este programa el PC (contador de programa). Cuando se transmite al Altair el programa este lo almacena en la memoria RAM a partir de la dirección de memoria $8000, gracias a la segunda línea de código (text_org $8000). Esto hace que la memoria del Altair quede como se ve a continuación:

ETIQUETAS INSTRUCCIONES DIRECCION DEMEMORIA

PC

Inicio Mov P4,#%11111111 $ 8000 $ 8000$ 8001

Nop $ 8002 $ 8002Nop $ 8003 $ 8003 Mov P4,#%00000000 $ 8004 $ 8004

$ 8005Nop $ 8006 $ 8006Nop $ 8007 $ 8007Sjmp inicio $ 8008 $ 8008

$ 8009$ 800A

Vemos como cada instrucción ocupa una o más posiciones de memoria (mov ocupa dos, nop una y sjmp tres). El contador de programa al principio se pone en el valor $8000, y entoces el micro ejecuta la instrucción a la que apunta (mov P4,#%11111111). Cuando se acaba de ejecutar esta instrucción el micro debe de ejecutar la siguiente instrucción, que debe de ser “apuntada” por el PC. Esto ocurre así porque a continuación el PC tiene el valor $8002, que es la dirección del primer nop, pero ¿Por qué ocurre así, y el PC no apunta a la siguiente dirección de memoria, la $8001?. Pues es porque el micro conoce que la instrucción a ejecutar (mov) siempre ocupa dos posiciones de memoria y cuando se ejecuta esta ordena al PC incrementarse en dos unidades en vez de en una.

Así se van ejecutando las instrucciones y el PC se va cargando con la dirección de memoria de la siguiente instrucción a ejecutar. Al final del programa se llegua a la instrucción de salto “sjmp”, donde el PC se carga con la dirección que corresponde a la etiqueta inicio ($8000), y así se vuelve a ejecutar el programa desde el principio. Es interesante ver este programa en el depurador.

La instrucción de salto sjmp es una instrucción de salto absoluto , es decir, siempre que se ejecuta esa instrucción se salta a la etiqueta indicada. Pero existen lo que se llaman saltos condicionales, en los que se salta a una etiqueta si se da una condición, y si no se da esa condición no se salta. Veamos el ejemplo siguiente:

Programa 4:

Este programa enciende o apaga un led situado en P4.0 si un bit de entrada P5.0 está activo o no.

Sistema basado en microprocesador Altair 5356

Page 7: Manual Altair

Inicio:jb P5.0, activo ; Salta a activo si P5.0 está a uno.clr P4.0 ; Pone a 0 P4.0

Activo:setb P4.0 ; Pone a uno P4.0

sjmp inicio ; salta a inicio

También existe la instrucción opuesta que salta a una dirección si el bit está a cero en vez de a uno. A continuación se expresan estas dos instrucciones de forma genérica, tal y como aparecen en la página 6.17 del manual de usuario, donde además vienen otras instrucciones de salto que es interesante consultar.

Jb bit, dirección -> Salta a la dirección especificada si el bit está a uno.Jnb bit, dirección -> Salta a la dirección especificada si el bit está a cero.

Existen otras dos instrucciones de salto condicional pero en estos casos la condición no es un determinado bit, sino el contenido de un registro.

Programa 5:

En este programa se verá una de estas instrucciones de salto condicional así como una instrucción de llamada a una subrutina ó subprograma. Se pretende que un bit de salida (P4.0) parpadee a intervalos de aproximadamente 1 segundo.

inicio:cpl P4.0 ;Complementa o invierte el estado de P4.0mov Acc, #200 ; Mueve al acumulador el valor 200lcall esp ; Llama a la subrutina espsjmp inicio ; Salta a inicio

esp: ; Empieza una subrutina o subprograma. mov R0, #248 ; Mueve el valor 248 al registro R0

esp1:nopnopdjnz R0,esp1 ; Salta a esp1 mientras que R0 no valga 0 y decrementa R0.djnz Acc,esp ; Salta a esp mientras que Acc no valga 0 y decrementa R0.ret ; Hace que se vuelva al programa principal a continuación de

donde se llamó a la subrutina.

En este programa hemos visto varias instrucciones nuevas:

cpl bit -> Esta instrucción complementa un bit, es decir, invierte su estado.

Sistema basado en microprocesador Altair 5357

Page 8: Manual Altair

Esto provoca el efecto de parpadeo del bit P4.0.

lcall dirección -> Esta instrucción realiza una llamada o salto a un subprograma o subrutina que se encuentre en una determinada dirección (etiqueta). El trabajo con este tipo de estructura de programa facilita la comprensión y elaboración de los programas.

ret -> Esta instrucción hace que se acabe la subrutina y se vuelva a la instrucción siguiente a su lcall correspondiente, para que se ejecute el programa por donde iba.

djnz registro, dirección -> Esta instrucción compara el valor del registro con el valor 0, si es 0 deja continuar al programa por donde iba, pero si no es 0, decrementa el registro en una unidad y salta a la dirección indicada.

En este programa el parpadeo se consigue de un modo muy sencillo ya que existe una instrucción que invierte el estado de un bit, lo que cuesta más trabajo es mantener al micro ocupado durante un tiempo sin hacer nada “util” entre cambio de estado del bit, para que se produzca el efecto visual del parpadeo. Para ello se han utilizado dos bucles con sendas instrucciones djnz que debido al alto valor de carga de sus respectivos registros (Acc=200 y R0=248) junto con el que los dos bucles están “anidados” (uno dentro de otro) con lo que el número de veces de ejecución de un bucle se multiplica por el del otro y el número total de ejecuciones del bucle es de 200x248.

Programa 6:

Modificar el programa anterior modificando el tiempo de parpadeo al introducir más instrucciones nop y más llamadas a subrutina (lcall).

Hacer aumentar el tiempo metiendo otro bucle djnz con otro registro, por ejemplo el R1.

Programa 7:

Modificar el programa 5 para que parpadeen 3 leds con diferentes tiempos de parpadeo cada uno.

Programa 8:

Modificar el programa 5 para que parpadeen dos leds de forma inversa uno a otro.

Programa 9:

Modificar el programa anterior para que parpadee uno u otro led en función del estado de un bit del puerto 5, utilizando una instrucción de salto condicional jb.

Programa 10:

Hacer un programa que saque el estado de P5 por P4 cuando se active el bit P5.7.

Sistema basado en microprocesador Altair 5358

Page 9: Manual Altair

Programa 11:

Utilizando una instrucción djnz hacer que el programa vaya sacando el valor del registro R0 por el puerto 4 y que este valor se vaya decrementando a intervalos de 1 segundo.

Programa 12:

En el programa 5 se vió la instrucción de salto condicional con registro djnz. Existe otra instrucción de salto condicional con registro cuyo formato es:

cjne Acc, dato , dirección ; compara el acumulador o un registro R con un dato

cjne Acc, B , dirección ; compara el acumulador con el registro B.

Esta instrucción compara el acumulador o un registro con un dato fijo o con otro registro y salta a la dirección si los dos datos son diferentes, si son iguales no se salta y se sigue el programa por donde iba.

Conociendo como funciona esta instrucción realizar un programa que active el bit P4.0 cuando se acierte una clave introducida por el puerto P5.

Programa 13:

Modificar el programa anterior para que el dato a adivinar pueda ser introducido por el puerto 5.

Operaciones con un operando.

Ya hemos visto las instrucciones :

clr bitsetb bitcpl bit

clr y cpl también funcionan a nivel de Bytes pero sólo con el registro acumulador.

Programa 14:

Hacer un programa que muestre por P4 el estado del P5 complementado.

Sistema basado en microprocesador Altair 5359

Page 10: Manual Altair

Operaciones de rotación.-

Estas operaciones permiten rotar el registro Acumulador. Vienen explicadas en las páginas 6.21 y 6.22 del manual de usuario.

Programa 15:

Realizar un programa que rote un led encendido por el puerto P4.

Programa 16:

Modificar el programa anterior para que el led invierta el sentido al activar P5.0

Programa 17:

Modificar el programa anterior para que el led rebote al llegar a cada lado.

Programa 18:

Modificar el programa anterior para que el led cambie de velocidad al irse activando P5.0, P5.1 y P5.2.

Programa 19:

Hacer un programa en el que dos leds roten en sentido inverso por el puerto P4 y se crucen.

Instrucciones de incremento y decremento.-

Estas instrucciones son:

inc registro ; Incrementa en una unidad el contenido de un registro.

dec registro ; Decrementa en una unidad el contenido de un registro.

Programa 20:

Hacer un programa que muestre en P4 el contenido de un registro y automáticamente se vaya incrementando o decrementando a intervalos de 1 segundo en función de si el bit P5.0 está activado o desactivado.

Sistema basado en microprocesador Altair 53510

Page 11: Manual Altair

Operaciones lógicas.

Anl -> Operación AND con bits o con Bytes.Onl -> Operación OR con bits o con Bytes.Xrl -> Operación EXOR con bytes.

En este tipo de operaciones cada operando tiene un nombre, el primero se llama D (destino) y el segundo O (origen), el resultado R se almacena en el registro Destino. En las operaciones a nivel de Bytes el byte Destino y por lo tanto el resultado tiene que ser siempre el Acumulador. En operaciones de bits el bit destino y por lo tanto el resultado debe ser el registro C (carry).

Ejemplo:

anl c, A.0 o orl c, P4.5

Con el símbolo \ se invierte el estado del operador origen. Ejemplo:

anl c, B.0

Programa 21:

Hacer un programa que realice las operaciones AND, OR y EXOR entre el dato %01101010 y el puerto P5.

Programa 22:

Realizar alguna función lógica realizada en el módulo de electrónica digital, y comprobar que se cumple la tabla de verdad.

Programa 23:

Utilizando operaciones lógicas y de rotación realizar un programa que haga correr un led por el puerto 4 desde P4.7 hasta P4.0 y se quede en el, después otro hasta P4.1 y así hasta que se complete todo el puerto. Después se repetirá el proceso cíclicamente.

Operaciones aritméticas.

Las instrucciones correspondientes a operaciones aritméticas vienen a partir de la página 6.28 del manual de usuario. Se pueden realizar la suma, resta, división y multiplicación entre registros de 8 bits. Si se van a realizar operaciones con números mayores hay que realizar subrutinas especiales que permitan operar con estos. Para estos casos se utiliza el bit C (carry). En el manual de usuario viene un ejemplo de operaciones con 16 bits para cada operación aritmética.Sistema basado en microprocesador Altair 535

11

Page 12: Manual Altair

Programa 24:

Realizar cuatro programas que realicen la suma, resta, multiplicación y división entre un dato fijo y el dato que exista en el P5, y el resultado sea mostrado por el puerto 4.

Programa 25:

Realizar un programa en el que se puedan meter datos por el puerto P5, si el dato es menor que otro fijo que abrá que adivinar se activará P4.0, si es mayor P4.1, y si se acierta se activa de modo intermitente P4.7.

Diagramas de flujo.-

Es una forma de representar el programa. Se suele realizar antes de empezar éste para tener un esquema de lo que tenemos que hacer. Consta de:

OO lflllflfll SÍOperación Trama de decisión o pregunta

NO

Línea de flujo

Ejemplo sencillo: Cargar un registro con el valor 38 y decrementarlo hasta que el el valor sea 0.

Sistema basado en microprocesador Altair 53512

Operación

Terminal

Page 13: Manual Altair

No

Si

Sistema basado en microprocesador Altair 53513

Inicio

Cargar un registro con el valor 38

Decrementa el contenido del registro

¿Es 0 el contenido del registro ?

Fin

Page 14: Manual Altair

En este caso es sencillo y el diagrama de flujo se puede adaptar muy bien al enunciado del problema, pero en caso de problemas más complejos el diagrama se complica.

Programa 26:

Para alguno de los programas realizados anteriormente realizar un diagrama de flujo y después pasarlo a programa. Compararlo con el programa primero que se hizo.

Sistema basado en microprocesador Altair 53514

Page 15: Manual Altair

TEMA 3: ORGANIZACIÓN DE LA MEMORIA EN EL ALTAIR 535.-

El SAB 80C535 puede direccionar cuatro áreas de memoria diferentes:

* Hasta 64 kbytes de memoria externa de programa.* Hasta 64 k bytes de memoria externa de datos.* 256 bytes de memoria de datos.* 128 bytes que actúan como área de registros de funciones especiales (SFR).

En la explicación de cómo funcionaba el microprocesador, vimos cómo existía una zona ( las primeras posiciones de memoria ) donde estaban las instrucciones y otra zona en donde se leían y escribían datos.

Normalmente en las aplicaciones, la memoria de programa es una EPROM, donde está cargado el sistema operativo Altair y el programa de la aplicación.

Después existe una memoria RAM que se utiliza de memoria de datos ( para cargar datos que nos manden de algún equipo vía serie, resultado de conversiones A/D, resultados de operaciones aritméticas y lógicas, etc. ).

Estos dos mapas de memoria son independientes, es decir, existe una forma de distinguir por el programador, el acceder a la memoria de programa o a la de datos. En el Hardware, esto se puede realizar a una línea que permite activar una memoria u otra.

FFFF FFFF

Mmm

64 K

0000 0000

/PSEN

Configuración aprovechando la memoria al máximo ( 64K + 64K ).

Pero a nosotros esta configuración no nos conviene, ya que tendríamos que grabar mediante una grabadora de EPROMS el programa que hiciéramos. Teniendo en cuenta de

Sistema basado en microprocesador Altair 53515

SISTEMA OPERATIVO

PROGRAMA DE LA APLICACIÓN (Realizado previamente en ensamblador)

MEMORIA DE DATOS

Page 16: Manual Altair

que nunca salen a la primera, se perdería mucho tiempo en desarrollar un programa al tener que grabar y borrar EPROMS constantemente.Además, ello supondría un coste económico elevado, ya que harían falta los grabadores de EPROMS, borradores y muchas EPROMS, ya que éstas no se pueden grabar y borrar indefinidamente.

Para que podamos probar nuestros programas cuantas veces queramos rápida y eficazmente, el sistema Altair nos ofrece un método muy útil.

En el sistema Altair existen dos memorias:

* Una memoria de programa de 32 Kbytes, en donde se encuentra el sistema operativo.

*Una memoria RAM que es compartida como memoria de programa y de datos.

64 k (Memoria de programa (EPROM).

32 K de memoría de datos.

32 K de memoría de Programa y datos. Se comparte, se hacen solapar los mapas de memoría.

64 K (Memoría de datos) (RAM).

32 K de memoría de datos.

Esto ya veremos como se hace desde el punto de vista Hardware. Desde el punto de vista Software sólo debemos tener en cuenta que el direccionamiento de memoria queda como se indica a continuación:

Sistema basado en microprocesador Altair 53516

Page 17: Manual Altair

$0000 $0000

$00FF

Sólo memoría EPROM de programa.

$7000

4 Kbytes$7FFF $8000

Ejemplo. $9000 Memoría RAM compartida de Programa y datos.

$FFFF $FFFF

Con esta configuración podemos tener en la EPROM el sistema operativo, el cual nos permite, unido a los programas en PC de IBERCOM, realizar programas en ensamblador y pasarlos a través del puerto serie al ALTAIR y cargarlos en la memoria RAM compartida.

El sistema operativo hará correr el programa y podremos comprobar si funciona sin tener que grabar una EPROM. El programa si no ocupa todos los 32K de RAM, puede utilizar la zona que le quede libre para almacenar datos. Pero hay que tener en cuenta que estando el programa en la RAM, éste se borra si se le corta la alimentación, aunque se le puede mantener con una batería, pero ésta tiene su tiempo.

Normalmente el usuario no se fía de esto, aparte de que si hay que almacenar el equipo durante demasiado tiempo, habría que volver a grabar otra vez el programa en la RAM. Por ello, lo normal en todas las aplicaciones es que, una vez depurado y comprobado el programa, éste se graba en la zona de usuario de la EPROM.

Memoria de datos interna.-

El SAB 80C535 posee una memoria RAM interna, pequeña, pero que es muy útil a la hora de programar. Está dividida físicamente en tres bloques:

$FF Como comparten direcciones de memoria iguales, existe un modo diferente para acceder

Sistema basado en microprocesador Altair 53517

vectores de inte

ESPACIO RESERVADO PARA APLICACIONES USUARIO.

SISTEMA OPERATIVO ALTAIR.

Programa prueba de aplicación.

Zona de Datos del programa de prueba.

Bloque

superior

Page 18: Manual Altair

a cada una de ellas. 128 bytes $FF

$80 $80

$7F Registros de

función especial (SFR)

128 bytes.

$00

En el área SFR están los registros de función especial. Estos son registros de muy diversas utilidades que ya iremos viendo. Por poner un ejemplo están:

- PSW: Registro de estado de programa.- ACC : Acumulador.- P1, P2, P3, P4, P5: Puertos.- Etc.

Para acceder a ellas se podrían utilizar sus direcciones de memoria ( pág. 2. 12 ) pero el lenguaje ensamblador nos permite nombrarlos por su símbolo y tener con ello un acceso directo. Ejemplo P6V P4, # 20.

Hay instrucciones que permiten mover y trabajar con datos de las memorias de datos interna y externa. Hay direcciones que coinciden, incluso triplemente, ya que están los registros de función especial. Esto quiere decir que el µP se podría volver loco al existir direcciones de las memorias de datos interna y externa que coinciden. Por ello, debe existir algún método que permita diferenciar a qué memoria se accede.

Memoria de datos interna de Registros de Función Especial.-

En esta memoria RAM interna están, como su propio nombre indica, los registros de función especial.Estos son: - ACC: Acumulador. $FF

- B: Registro temporal. - SP: Stack Pointer. Acceso directo. - DPTR: DPL

DPH.- P6,…,P0: Puertos. $80

No hay problema porque ni nos enteramos a qué memoria accedemos, ya que ponemos símbolos de registros. A estos registros el acceso es directo, es decir, para realizar algo con ellos sólo hay que indicar su símbolo.

Sistema basado en microprocesador Altair 53518

Bloque

inferior

128 bytes

Page 19: Manual Altair

Ejemplo: en la instrucción MOV ( mover )

MOV P1, # 30 -> Mueve a P1 el dato 30. MOV P5, P4 -> Mueve P4 a P5.

Aunque estos registros tengan una dirección de memoria en la memoria interna, ésta no se menciona.

Memoria de datos interna que no es SFR.-

$FF Acceso indirecto.

$80$7F

Acceso directo.32 primeras $1Fposiciones. $00

$1F Banco 3

Banco 2

Banco 1

$07

Banco 0

$00

Las 32 primeras posiciones contienen los registros de propósito general.(Los registros R, R0,…..,R7.).

Las 32 posiciones están divididas en grupos de 8 registros llamados bancos. Existen cuatro bancos: 0, 1, 2 y 3 pero sólo uno de ellos puede estar activo al mismo tiempo, es decir, si accedemos al R5 tenemos que saber a qué banco estamos accediendo porque existen 4 registros R5. El establecimiento del banco activo se realiza mediante el registro PSW ( Registro de Estado ). Ya se ha comentado de este registro que es un registro en el que sus bits son independientes y cada uno sirve para algo diferente ( comparar, bit de paridad, …). Existen dos bits en este registro que indican el banco activo:

Sistema basado en microprocesador Altair 53519

Parte alta.

(126 bytes)

Parte baja.

(126 bytes)

R7

R0

R7

R0

R7

R0R7

R3

R2

R1R0

Page 20: Manual Altair

PSN.4 PSN.3 Banco 0

Banco 1 Banco 2 Banco 3

Ejemplo: PSW = 0Si y está seleccionado el banco 1. PSW = 1

Bancos.Si realizamos la instrucción : MOV R3, #28 3 Cargamos el dato 28 en el registro 3 del banco 1: 2

R3 1

0

Si realizamos la instrucción: MOV R3,#28, cargamos el dato 28 en el Registro 3 del banco 1.

Para poder cambiar la selección del banco sabemos que el registro de estado ( PSW) es un registro de la memoria de registros de función especial y, por lo tanto se trabaja con él de un modo directo. Por ejemplo, para establecer el banco 3 podríamos realizar la operación:

MOV PSW, # 24

0 0 0 1 1 0 0 0

Pero esto pondría a 0 el resto de bits que pueden estar dando una información en ese momento o en todo caso hay algunos que no sabemos para qué sirven y no debemos modificarlos.

Podemos seleccionar bancos modificando el PSW bit a bit , ya que esto con este registro es posible.

Setb PSW. 3Setb PSW. 4

1- Realizar un programa que vaya cargando en todos los registros " R " los datos de 0 al 32, y luego los muestre en P4.

Sistema basado en microprocesador Altair 53520

0 00 11 0

1 1

28

Page 21: Manual Altair

Como hemos visto en muchos programas hasta ahora, la forma de utilizar los registros " R " es directa, es decir, es como los registros especiales SFR, no hay que especificar la posición de memoria donde están para trabajar con ellos, sino que tienen su nombre.

Ej.: MOV R0, # 22

Pero si nos fijamos en el mapa de memoria de la memoria interna, queda por ver una parte de la memoria baja que es direccionable directamente e indirectamente y la memoria alta que es indirecta. De lo que queda de la memoria baja que se puede direccionar directamente nos vamos a olvidar, pero se realizaría de la siguiente forma:

MOV P4, $ 08 -> Con esto moveríamos al acumulador lo que hay en la posición 08 de la memoria interna.

2.- Modificar el programa anterior para realizar lo mismo pero con direccionamiento directo sin nomenclatura R0, R1, R2,…etc., sino con direcciones de memoria.

De este modo se podrían utilizar los 128 bytes bajos de la memoria RAM interna.

Otro modo de acceder a estos 128 bytes bajos y los 128 bytes altos, es lo que se llama direccionamiento o acceso indirecto.

MOV R0, #$08 -> Se carga el dato 08 hexadecimal en R0.MOV P4, @R0 -> En P4 se carga lo que hay en la dirección apuntada por R0

( $ 08 ).El registro R0 es un puntero que apunta a la dirección que se le cargue, aunque se le

carga como un dato, no como una dirección.

R0 $08

$00

Cuando se quiere ver lo que hay en esa dirección se utiliza el símbolo @ seguido de R0 trasvasando a un registro SFR.* Sólo se pueden utilizar R0 y R1.

3.- Modificar el programa anterior para que las 32 primeras posiciones sean cargadas y leidas en el P4 con direccionamiento indirecto.

Tener en cuenta que según el esquema de memoria, con este sistema ( direccionamiento indirecto ) podríamos acceder también a los 128 bytes altos.

Sistema basado en microprocesador Altair 53521

00001000 00000001

Page 22: Manual Altair

Estableciendo estas formas de direccionamiento directo o indirecto, ya el µP sabe distinguir entre la memoria alta interna y la memoria SFR. La memoria baja es posible direccionarla de un modo u otro ya que sólo hay una. ( Ver esquema de memoria ).

Todo esto está muy bien saberlo, pero en principio, el modo de utilizar estas memorias va a ser un poco diferente. Cuando el µP arranca, coloca el puntero de pila en la dirección correspondiente a R0 del banco 1, es decir, en la posición $08, ya que la pila utiliza la memoria RAM interna.

¿ Quiere decir esto que ya no podemos utilizar los demás bancos y no se puede hacer lo que hemos visto ?. Al arrancar, el µP selecciona el banco 0 y pone el SP en la dirección $08. Si nosotros necesitamos utilizar otro banco lo especificamos en el PSW y el sistema operativo normalmente nos traslada el SP por detrás del banco.

FF

SP $08

Banco 0.

4.- Comprobarlo.

Sistema basado en microprocesador Altair 53522

R1

R0

Page 23: Manual Altair

Todo esto, y que además el sistema operativo del Altair utiliza algunas zonas de memoria superiores a las de los 4 bancos y que la pila es superimportante.

Se podría desbordar la pila.

SP

Cuando se adquiere un cierto nivel se trabaja mucho con subrutinas y con la pila, por lo que el tamaño de ésta puede llegar incluso a ser pequeño.

Por todo ello NORMAS:

-> En principio utilizar el banco 0 y todo el resto de la memoria interna dejarlo para la pila. El SFR utilizarlo normalmente pero sólo para los registros que conocemos y con los nombres conocidos ( P0, ACC, etc. ).

-> Si nos es imprescindible, utilizar más bancos.

Acceso a la memoria externa de datos.-

-> Fijándose en el esquema de memoria podemos ver que es accesible indirectamente. $0000 $FFFF

-> Sólo puede tener como origen y destino de datos el Registro acumulador.

-> En vez de los registros R0 y R1 se utiliza el registro DPTR que es de 16 bits ( $8000 a $FFFF ).

-> En vez de la instrucción MOV se utiliza MOVX.

Sistema basado en microprocesador Altair 53523

Page 24: Manual Altair

Ejemplo: MOV DPTR, #$905 A; Carga en DPTR la dirección 905 A. $8000

905A DPTR 905A $FFFF

Ejemplo: Ahora vamos a ver cómo se hacía lo contrario.

905A

MOV DPTR, #$905 AMOVX @DPTR, ACC

5.- Realizar un programa que cargue 20 datos ( del 0 al 19 ) a partir de la dirección $B000 y los lea mostrándolos en P4.

Otra forma de acceder a la memoria de datos externa es la de direccionamiento base más registro índice. Este modo permite acceder a una posición de memoria a través de un puntero que se calcula a través de la suma del registro base ( DPTR ) más el índice.

El ejemplo lo vamos a ver con la instrucción MOVC que es igual que MOVX pero que trabaja sólo con la memoria de programa. Como la zona $8000 - $FFFF es memoria de programa y datos, en esta zona también puede acceder pero sólo para leer, ya que se supone en principio que de la memoria de programa o del programa, sólo se va a querer leer algo.

Esta instrucción y el modo de direccionamiento base más índice se ha establecido en este µP porque muchas veces en el mismo programa se incluye una tabla de datos que es necesaria para la aplicación.

Ejemplo: Supongamos que ya sabemos manejar el Display, y queremos que al principio, nada más arrancar el µP, saque un mensaje por pantalla diciendo " Hola ".

Este mensaje no lo crea el programa espontáneamente. La palabra " hola " debe estar almacenada en algún sitio. Lo normal es que esté en la misma memoria de programa codificada en código ASCII.

Podría estar en la RAMestuviera en la RAM. $1090

$1091 EPROM $1092 $1093

RAM

Sistema basado en microprocesador Altair 53524

DATOS ACC

ACC(DATOS)

PROGRAMA

H- 58O- 32L- 48A- 81

DATOS

Page 25: Manual Altair

El proceso sería el que el programa iría mandando dato a dato al display para que este lo vaya sacando en pantalla.( Se mandaría al display a través del puerto 4 ).

Se podría hacer de la siguiente forma:

MOV DPTR, #$1090 De esta forma hay que realizar tres instrucciones para MOVC ACC, @DPTR cada letra, y hay que ir poniendo posición a posición MOV P4, ACC de memoria.MOV ACC, @DPTR Lo ideal sería realizar un bucle que nos mandara todos MOV P4, ACC los caracteres sin tener que escribir tanto ( imaginarse

que hay que mandar 100 caracteres ). · · ·

y así dos veces más y tantas veces como caracteres tuviera el mensaje.

MOV R0, #100MOV DPTR, #$1090 Sólo se puede realizar el incremento y la carga Bucle: MOV ACC, R0 con el acumulador.

MOVC ACC, @ACC + DPTR Comprobar si también se puede hacer con MOV P4, ACC MOVX para cargar y leer datos.Djnz R0, bucle

6.- Realizar un programa que lea 32 bits del mismo programa ( salida en P4 ).

7.- Realizar un programa que cargue con este modo de direccionamiento 20 datos en la parte libre de la RAM y luego los lea.

SALTOS Y LLAMADAS A SUBRUTINAS.- ( pág. 6.11 ).

SUBRUTINAS.-

Ya se ha visto el manejo de subrutinas con la instrucción lcall dirección. Esta instrucción es una forma de llamar a una especie de subprograma para que se ejecute.

Lo normal cuando se realicen programas de más envergadura es utilizar bastante las subrutinas. Es mucho más fácil y ahorra tiempo tener las cosas ordenadas en subrutinas, por ejemplo podríamos tener:

Sistema basado en microprocesador Altair 53525

PROGRAMA PRINCIPAL

lcall espera

SUBRRUTINA

espera:

ret

Page 26: Manual Altair

-> Una subrutina que nos sume números de 16 bits.-> Una subrutina de delay, que espere 1 segundo.-> Una subrutina que nos mande un dato por el cable serie.···etc.

El utilizar subrutinas, además de permitirnos tener una organización de programa mejor, nos ahorra tiempo en el programa que estemos realizando, ya que no hay que repetir rutinas ( ejemplo " lcall espera " ), y nos ahorra tiempo en sucesivos programas ya que podemos copiar subrutinas de programas anteriores, sólo hay que tener claro lo que hacen. Pero las subrutinas pueden dar un problema:

Si no estuviera la llamada a " suma ", se sumaría a R0 el valor 34, pero esto no ocurre, ya que la subrutina suma como vimos en su momento, modifica el contenido de R0 y del Acumulador, además de otros.

Por ello debe de existir un método para guardar el contenido de los registros más importantes antes de saltar a una rutina y después dejarlas como estaban.

Esto se realiza gracias a una memoria interna del µP llamada PILA. Esta tiene una estructura tipo LIFO ( Last Input First Output , último que entra primero en salir ).

03 SP 02 (Stack pointer) 01 En el ejemplo primero habría que sacar el dato

4 que es el último que se ha metido.00 (puerto de pila)

Esta área de memoria interna de µP es apuntada por un registro interno del µP parecido al PC ( contador de programa ) pero en este caso se llama SP ( Stack Pointer ), y se incrementa cada vez que se mete un dato en la pila. Es decir, si se mete un dato se pone a 01, si se meten 10 se pone a 10. Cuando se saca un dato se decrementa en 1.

Existen dos instrucciones para manejar la pila:

Push: mete un dato en la pila e incrementa SP.

Sistema basado en microprocesador Altair 53526

Programa principal

MOV A,#34lcall sumaADD A,R0

Suma: ;Subrutinas que suman datos de 16 bits.

ret

Se utiliza el Acumulador

Dato 4

Dato 3

Dato 2

Dato 1

Page 27: Manual Altair

Pop: saca el último dato de la pila y decrementa SP.

Para que no hubiera problemas con subrutinas como en el caso anterior, deberíamos hacer lo siguiente:

Pueden darse dos fallos ( ver cómo queda la pila ):

1) Si se recuperan en distinto orden a como se han introducido los registros, recuperamos datos diferentes.

2) Si ponemos distinto número de " pop " que de " push " la instrucción " ret ", no recoge el contenido de PC antes de saltar a la subrutina. Esto implica que cuando se llegue a " ret " se volverá a una dirección de memoria aleatoria, lo que supone un error fatal.

SP

Sistema basado en microprocesador Altair 53527

Programa principal

mov A, #34

lcall suma

ADD A, R0

Suma; Subrutina que suma datos de 16 bits.

push ACCpush B Guarda en la pila registros que push R0 utilice la subrutina.push R1

pop R1pop R0pop B Restaura el contenido de pop ACC los registros.

ret

PILA

R1 R0 B ACC Contenido de PC (cont. de pág.)

Page 28: Manual Altair

SP1001

1002

1003seses se recupera

en vez de

8.- Realizar un programa que muestre en P4 dos números de 4 bits procedentes de dos registros diferentes. Con una entrada P5.0, deben de intercambiarse los números utilizando las instrucciones push y pop.

* Es importante en las subrutinas que creemos, por lo menos en las importantes, en las que sabemos que vamos a utilizar en otros programas, utilizar las instrucciones push y pop para salvar los registros que utilicemos en esa subrutina. ( Pero tampoco es bueno pasarse porque la pila es limitada ).

Otro repaso a saltos y llamadas a subrutinas.-

- Subrutinas:

Ya sabemos lo que son subrutinas, pero la única instrucción que hemos utilizado hasta ahora ha sido LCALL. También existe otra que se llama ACALL.

La diferencia entre ambas es que ACALL ocupa sólo dos bytes, pero sólo puede saltar en la página de 2 Kbytes donde se esté ejecutando y LCALL ocupa tres bytes pero puede saltar en todo el programa. Menos mal que si hay un fallo de elección nos da un mensaje el compilador.

- Saltos incondicionales:

Existen AJMP, LJMP, SJMP.SJMP -> Salto en + 127 bytes alrededor ( salto corto ) ( 2 bytes ).AJMP-> Salto en página de 2 Kbytes en donde esté ( salto medio ) ( 2 bytes ).

Sistema basado en microprocesador Altair 53528

lcall

pushpushpushpush

poppoppop

ret

B R1 R0

ACC 1002

lcall

push R0push R1

pop R1pop R0

ret

Page 29: Manual Altair

LJMP-> Salto a cualquier posición ( salto largo ) ( 3 bytes ).

Hay una instrucción que también puede saltar a cualquier posición. Ej: JMP @A + DPTR

La dirección a la que salta es la suma de lo que hay en el acumulador y el registro DPTR.

Ejemplo: ( pág. 6.12) ( comprobar ).inicio:

mov DPTR, # tabla_de_saltos. ( carga la dirección de memoria de la etiqueta )

jmp @A + DPTR ( salto indirecto con índice).··

tabla_de _saltos:ajmp programa0 ; ACC=0ajmp programa1 ; ACC=2 ( Va de dos en dos porque la instrucciónajmp programa2 ; ACC=4 ajmp ocupa 2 bytes ).··

Otra instrucción de salto absoluto o incondicional ( igual que sjmp pero tiene más alcance ).

9.- Realizar un programa que con tres entradas del P5 elija uno de 4 programas diferentes y que cada uno muestre algo en P4 ( uno de los programas diferentes que ya hemos realizado ).

- Saltos condicionales:

jz -> Salta si A=0jnz-> Salta si A0jc -> Salta si C=1jnc -> Salta si C=0jb -> Salta si bit=1jnb -> Salta si bit=0jbc -> Salta si bit=1 y pone bit a 0.djnz -> Salta si Registro=0, si no lo decrementa.

Volvamos a ver el programa de la pág. 6.20.

Se utiliza la instrucción cjne para ver si el nº ACC es igual o distinto que el nº de B. Para ver si el nº es mayor o menor se utiliza la instrucción de salto condicional jc,

Sistema basado en microprocesador Altair 53529

Page 30: Manual Altair

ya que la instrucción cjne activa el bit de comp si el operando 1 es menor que el 2 y no lo activa si ocurre lo contrario.

El bit de comp o bit CY o bit de acarreo, ya hemos visto en muchas instrucciones como utilizarlo ( ej. en instrucciones de rotación ), pero en este caso activa lo que se llama una bandera de estado, es decir, es un indicador de lo que ocurre al realizarse una operación, en este caso la comparación de dos datos.

El bit C está en un registro llamado PSW, Status Register o Registro de banderas de estado, donde existen otros bits que al igual que el C realizan indicaciones diferentes.

REGISTRO PSW

PSW.7 PSW.6 PSW.5 PSW.4 PSW.3 PSW.2 PSW.1 PSW.0

CY AC F0 RS1 RS0 OV F1 P

En la página 6.16 se tiene la utilidad de cada bit del registro PSW. Los registros de banderas son: - CY

- AC - OV - P

- CY ya lo hemos visto.- AC y OV lo veremos más adelante.- P es activado si la suma de los 8 bits del acumulador es impar y es desactivado

cuando el resultado es par.

10.- Realizar una rutina a la que le lleguen datos de 7 bits ( 0 - 128 ) y calcule el bit de paridad y se lo añada en el bit 7. Debe mostrar los datos en P4.

Sistema basado en microprocesador Altair 53530

Page 31: Manual Altair

11.- Problema.

S0 S7

P5 PPP P

Validación de dato

12.- Ordenar una tabla de 10 datos de mayor a menor.

Sistema basado en microprocesador Altair 53531

.

Elección de banco de registro R0

Elección de registro

Dato de 3 bits.

Page 32: Manual Altair

TEMA 4 : CONVERTIDOR A/D DEL ALTAIR 535.-

Veamos el esquema eléctrico del sistema Altair 535 que está al final del tema 2. Vemos que el SAB 80C535 dispone de un puerto P6 de entradas analógicas.

AN0,….AN7 o Puerto 6: En muchas aplicaciones industriales es necesario utilizar convertidores A/D. Estos convierten una señal analógica en una señal digital. El cómo lo hacen lo veremos más adelante, ahora sólo hay que tener en cuenta de que el convertidor A/D nos permite la traducción de la información que suministra un sensor en forma analógica, a información en forma digital.Ej: Supongamos que tenemos un sensor de temperatura:

SENSOR

V(v) 5

3,75 2,5

1,25

0 25 50 75 100 T(ºC)

12 v.Registro de Al. Datos.

RegistroConvertidor A/D

Salida 0 - 5v.

Líneas de comunicación entreµP y A/D.

Sistema basado en microprocesador Altair 53532

D7

µP

D0

A/DSensor Temperat.

Page 33: Manual Altair

Datos(256 posibles estados)

11111111Convertidor A/D

10000000

00000000 0 2,5 5 V(v)

El resultado es 0 ( en esta aplicación ):

111……1

Gráfica sensor + = 100……0Gráfica convertidor A/D

000…….0 0 50 100 T(ºC)

Si en el registro del convertidor A/D hay un 00000000 sabemos que la temperatura que está marcando el sensor es de 0 ºC y puede actuar en consecuencia.

En el SAP 80C535 el convertidor A/D está ya incorporado. Además dispone de un multiplexor que permite seleccionar 8 canales de entrada.

AN0 (P6.0)

Puerto 6

AN7 (P6.7)

Conmutador activado Digitalmente.

0 0 0 · · ·

1 1 1

Sistema basado en microprocesador Altair 53533

µC

Registro conversión

A/D

U.control

Multiplex.Analógico

Page 34: Manual Altair

Estos terminales del µC los tenemos en el CON3 convenientemente numerados. Hay que tener en cuenta que habría que introducir la tensión entre cada terminal y masa.

Existen muchos tipos de convertidores con diferentes rangos de tensión de entrada ( 0 - 10v., 0 - 5v., -5 - +5v., etc. ).

En este caso en modo normal, el convertidor tiene un rango de entrada de 0 - 5v. aunque se le puede modificar.

Un factor importante en los convertidores es la resolución. Es decir:Si tenemos un rango de entrada de 0 - 5v. y un solo bit de resolución, poca

información tendríamos.

1

0 0 (0ºC) 5v. (100ºC)

Si tenemos la información en dos bits ( resolución )

Dato

11

10

01

00 1,7 3,33 5 v.(33,3ºC) (66,3ºC) (100ºC)

Vemos como mientras más bits de resolución tengamos, más precisa y exacta será la información. Esta ecuación responde a la siguiente fórmula:

Rango tensión de entrada ( voltios )Resolución en = voltios 2 n

( n= número de bits de resolución)

En el caso del Altair en modo normal:

Rv = 5v. 28 = 5 256 = 0,0195 voltios.

Sistema basado en microprocesador Altair 53534

Page 35: Manual Altair

Es decir, con un rango de entrada de 0 - 5 v. y una resolución de 8 bits, el convertidor A/D del Altair puede distinguir diferentes estados en escalones de tensión de 0,0195 voltios.

Datos ( 256 datos posibles ) 11111111

00000011

00000010

00000001Entrada A/D

00000000

0,0195 0,0391 0,0586 5 v.

256 escalones de tensión

Situación más desfavorable.

Con esto podríamos hacer, por ejemplo, fácilmente un polímetro que midiera tensiones entre 0 y 5 voltios.

En nuestro caso aparecería la tensión con un error de: 0,0195 2 , que sería la situación más desfavorable que se podría dar y es que la

tensión real estuviera en medio de un escalón.

+ Pinzas

Displays

lectura

Sistema basado en microprocesador Altair 53535

µC

M

P4 UC

P5

A/D M

Page 36: Manual Altair

La patilla + VAREF y VAGND están relacionadas con la conversión A/D. En el convertidor A/D del Altair se puede elegir el rango de entrada con la condición de que el negativo no sea inferior a 0v. y el positivo no sea superior a 5 v. Esto se realiza para encoger el rango y así poder tener una resolución más alta.Ver ejemplo:

5256 3256

0 v. 5 v. 0 v. 4 v.

Escalones más pequeños.

Esto, por supuesto, se puede realizar en unas tensiones ya previstas con unos valores determinados y con una configuración previa para que el dispositivo conozca qué rango va a tener, de lo contrario cometeríamos un error grave:

Rango Real Rango de entrada A/D

0 v. 5v.1 v. 4 v. No trabajar

con estas zo-nas.

La lectura es errónea ya que el rangoestá encogido.

En principio si están conectados los puentes JP2 y JP3 el convertidor tiene el rango de entrada de la alimentación que es con el que vamos a trabajar normalmente, y con una resolución de 8 bits que es suficiente para las aplicaciones que vamos a realizar.

VAREF y VAGND también están en CON 3 para que pudiéramos poner en estos terminales una tensión de referencia distinta a la de alimentación como se ha comentado anteriormente. Para ello habría que tener quitados los puentes JP2 y JP3 ya que si no

Sistema basado en microprocesador Altair 53536

Page 37: Manual Altair

pondríamos en la alimentación otra fuente. Esto podría acarrear repercusiones imprevisibles.

Otros motivos que se podrían tener para poner una tensión de referencia interna podría ser:

-> Evitar que los ruidos y fluctuaciones de la F.A. afecten a la conversión. ( Verlo de forma exagerada suponiendo que hace bajar la tensión a 4 v. ).

-> Evitar el unir masas analógicas y digitales, por el ruido en estas últimas. Aunque en este caso no se daría demasiado al estar la masa físicamente en la placa unida a través de un gran conductor ( la patilla JP3 que va a masa ).

Convertidor Analógico - Digital del Altair 535.- ( pág. 3.24 )

-> Ver por encima las características del convertidor A/D del SAB80C535.El registro que se utiliza para controlar el convertidor A/D es el ADCON.

-> Con los tres primeros bits mx0, mx1, mx2 se elige el canal analógico: AN0,…..,AN7.

-> Bit ADM -> Modo de conversión. 1 -> Modo de conversión continua. 0 -> Sólo realiza una conversión.

-> Bit BSY -> Bandera de ocupado. ( Bit de sólo lectura ). 1 -> Realizando conversión. 0 -> No hay conversión.

Nos indica cuando se está realizando una conversión y cuando ha acabado.

-> El resultado de la conversión lo obtenemos en el registro de función especial ADDAT. -> La orden de comienzo de una conversión se realiza escribiendo sobre el

registro de función especial DAPR. Con este registro se pueden elegir los voltajes de referencia internos ( rango ), a través de los voltajes de referencia externos.Ej: Imaginarse que tuviéramos que recibir dos señales analógicas de dos sensores distintos. Uno nos dá la información en un rango de 0 - 5 v. y otro en rango de 0 - 2,5 v.En principio, tendríamos que escoger la VAREF y VAGND para adecuarlas al rango de la mayor.

VAREF = 5 v.VAGND = 0 v.

Sistema basado en microprocesador Altair 53537

Page 38: Manual Altair

S1 AN0

( 0 - 5 v. ) ( 0 - 100 º C )

S2

AN1

( 0 - 2,5 v.) (0 - 100º C )

GND

¿ Cuáles serían los escalones de tensión que tendríamos en ambos casos ?.S1

FF VR = 5256 = 0,0195 v.

Resolución de tensión256

000 5 v.

GR = 100256 = 0,391 ºC

0º C 100º C Resolución de grados

S2

FF VAREF. 128

VR = 2,5128 = 0,0195 v.256 7F

128 GR = 100128 = 0,782 ºC

00 0 v. 2,5 v.

Zona de trabajo

0 ºC 100 ºC

-> Podemos ver tres cosas:

Sistema basado en microprocesador Altair 53538

Page 39: Manual Altair

a) Ahora los rangos de temperatura están cambiados respecto a los de tensión, por lo que hay que tener cuidado desde el punto de vista software de adecuar el rango y tener en cuenta que, por ejemplo, el dato 7F indica 100 ºC, no 50 ºC como antes.

b) Vemos como los escalones de tensión son iguales en ambos casos, ya que , aunque nuestro rango es de la mitad, eso el A/D no lo sabe y él convierte con respecto a VAREF = 5 v. con lo que asigna también la mitad de escalones lógicos a la conversión. La mitad 7F -> FF, no se utiliza, se desaprovecha.

c) La resolución de grados que es al final lo que nos interesa que sea lo mayor posible ha disminuido, ya que ahora tiene menos valores lógicos para representar el mismo rango que antes. El SAB 80C535 aporta a esto una solución, y es que permite adecuar el rango de entrada al rango del sensor a través de una serie de resistencias internas. De ese modo podría dejar el voltaje de referencia externo para la conversión del canal AN0 ( Rango 0 - 5 v. ), y cuando fuera a realizar la conversión en el AN1 hacer lo siguiente:

VAREF. SAB 80C535 5v. Divisor de tensión

por software.

2,5 v.

S2

AN1

Tensión de referencia Tensión de referenciaExterna. Interna.

de este modo:

FF GR = 100256 = 0,391 ºC

256

0 Volvemos a tener la0 2,5 mejor resolución.

0 ºC 100 ºC

Sistema basado en microprocesador Altair 53539

A/DVref.

Vin.

Page 40: Manual Altair

Esto tiene ciertas restricciones y limitaciones. La programación de la tensión de la tensión de referencia interna se realiza con el registro DAPR ( pág. 3.27 ).

Nosotros todo esto no lo vamos a utilizar en principio. Tendremos tensiones de referencia externas 0 - 5 v., aprovechando la tensión de alimentación de la placa y tendremos entradas con rango 0 - 5 v. o por lo menos lo procuraremos. Para ello iniciaremos una conversión diciendo que queremos los rangos de tensión externos ( 0 - 5 v. ); con la instrucción:

mov DAPR, #00

Antes de iniciar la conversión tendremos que seleccionar el canal al que queramos realizarle la conversión A/D. Esto lo hacemos con el registro de función especial ADCON.

En este registro en el bit 3 tenemos que elegir el tipo de conversión:

1 -> Continua.0 -> Una sola conversión.

El modo continuo se utiliza cuando se necesita conocer en cada instante el valor de una señal o cuando ésta varía rápidamente y queremos conocer todas sus variaciones.Ej:

Período de muestreo muy corto.

En estas aplicaciones el µP está casi dedicado a esta tarea, al requerirse tiempos muy cortos de muestreo.

En otras muchas aplicaciones, la variación de la señal a medir es bastante lenta, por lo que no es necesario estar continuamente muestreando.Ej:

Sistema basado en microprocesador Altair 53540

Page 41: Manual Altair

ºC100

27 25

0 1 m. 1 m.

Se puede realizar una conversión cada ciclo de programa, por ejemplo:

Hay dos formas de enterarnos de que una conversión ha terminado:- Por " polling ".- Por interrupción.

Por " polling ":Se utiliza el bit BSY ( ADCON. 4 ). Sabemos que este bit se pone a 1 mientras se

realiza la conversión. Podemos mantener el programa en un bucle cerrado hasta que este bit se ponga a 0, indicando que se ha terminado la conversión.

Sistema basado en microprocesador Altair 53541

INICIOINICIO

SELECCIÓN CANAL

SELECCIÓN CANAL

COMENZARCONVERSIÓN

COMENZARCONVERSIÓN

RECOGER CONVERSIÓN

RECOGER CONVERSIÓN

TAREA 1TAREA 1

TAREA 2TAREA 2

Page 42: Manual Altair

No

Continuación

El bucle se puede hacer fácilmente con la instrucción:

jb BSY, ! Ojb ADCON. 4, ! Es lo mismo, las dos están definidas en el include.

Retiene al programa hasta que se cumpla la condición. Nos ahorramos la etiqueta. Etiqueta: jb ADCON. 4, etiqueta

Por interrupción:Por este método el convertidor activa un bit llamado IRCON. 0 que está en un

registro llamado IADC cuando se finaliza una conversión.Este registro es de banderas de estado de interrupciones de los periféricos y es

chequeado continuamente por el µP para vigilar que se produzca una interrupción. Si se habilitara esta interrupción en concreto del convertidor A/D ( ya lo veremos en el tema 4 ), cuando se produjera ésta, el programa saltaría a una zona de programa en la que recogeríamos el resultado de la conversión y haríamos lo que hiciera falta con él.

Sistema basado en microprocesador Altair 53542

Inicia conversión

BSY=1 ¿?

Selecciona canal

Page 43: Manual Altair

Inic. Conver.Inicio conversión

T

Entrada Señal

LíneaPeticiónInterrup.

De este modo nos ahorramos el tiempo " t " que en el modo de " polling " en el que este tiempo habría estado " parado " el µP.

De todas formas, como no hemos visto todavía el tema 4 de manejo de interrupciones no vamos a utilizar este último método. Además el tiempo " t " es muy pequeño, 13 ciclos máquina 13µseg., por lo que en la mayoría de las ocasiones no merece la pena realizarlo con interrupciones. Por lo tanto ya podemos perfilar cómo se realizaría una conversión A/D:

Sistema basado en microprocesador Altair 53543

Convertidor A/D

Interrupción A/D

Recoge conversión.Almacénala en dirección $xxxxSi valor> #110 P4.0=1 Activa relé

Si valor < #110 P4.0= 0

Page 44: Manual Altair

mov R0, #0 ( canal 0 )

lcall sel_canal

clr ADCON. 3modo lecturas sueltas

mov DAPR, #00 Vref(interna)=Vref(externa)= 0 - 5 v.

jb ADCON. 4, !

No

mov R1, ADDAT

El resultado se carga en R1.

Sistema basado en microprocesador Altair 53544

Inicia conversión

¿Fin convers.?

Leer la conversión

Tarea a realizar con el resultado de l a conversión.

Selecciona modo

Selecciona canal

Tarea

Page 45: Manual Altair

sel_canal:

mov B, ADCON Deja ADCON en B, como estaba, pero con los anl B, #F8 bits de selección de canal a 0.

mov A, R0add A, B Añade a ADCON los tres últimos bits con el mov ADCON, A valor del canal elegido.

ret

Con ello no se modifican los bits restantes de ADCON que no conocemos y que no tenemos por qué tocar.

Problema.-Realizar un programa que lea un canal analógico y lo muestre en el P4.

Problema.-Ahora con dos canales de entrada analógicos y que se vea uno ú otro en el P4 según la entrada P 5.0 ( uno por polling y otro por interrupción ).

Problema.-El sistema de la figura debe de procurar mantener las temperaturas de consigna establecidas.-> Para la sala de control se utilizará la climatización 1.-> Para las máquinas la climatización 2.-> Modo verano: si CL1 no es suficiente se puede abrir COMP1 para que CL2 ayude si y sólo si ésta puede mantener la temperatura.Si no puede se cierra COMP1 y se abre COMP3, entrando a funcionar CL3.CL3 también puede entrar a ayudar a sala de máquinas abriendo COMP2, e incluso cerrando COMP3 si el riesgo en la sala de máquinas es alto ( siempre prioridad sala de máquinas ).-> Modo invierno: entra CL1 para sala de control, también puede entrar CL3 si no es necesitada por la sala de máquinas.En sala de máquinas no entra nunca calor, da igual que la temperatura esté muy por debajo.

P5 Indicadores de estado en P4 ( Estará activo el de más peso activado en ese momento).

Muestran en P4:

0 -> Estado de máquinas : C / F

Sistema basado en microprocesador Altair 53545

7 6 5 4 3 2 1 0

Page 46: Manual Altair

Estado de compuertas.1-> Conversión A/D de S1.2-> Traducción a grados de S1.3-> Conversión A/D de S2.4-> Traducción a grados de S2.5-> Alarmas:

Mostrarán en intermitencias en P4:-> No se puede bajar a Tc en sala máquinas.-> No se puede bajar a Tc en sala de control.-> No se puede subir a Tc en sala de control.

C1 F1

F2

Comp.1

Comp.2

Comp.3 C3 F3

Sistema basado en microprocesador Altair 53546

Tc=20 ºC S2(0ºC-50ºC)

MÁQUINAS

SALA DE CONTROL

TC=25ºc S1(0º-50º)

Climat. 1 F/C

Climat. 2 Sólo F

Climat. 3 F/C

Page 47: Manual Altair

Problema.-En cada sala:< 18 ºC -> C1< 16 ºC -> C2> 28 ºC -> V1>30 ºC -> V2

< 25 ºC ->M/C -> P5.6 activo -> Sala 1> 25 ºC ->M/F -> P5.7 activo -> Sala 2

C1

F1

C2

F2

P5 Elección de indicadores en P4. Se activará sólo el de mayor peso.

En P4

Sistema basado en microprocesador Altair 53547

S1 (0-50 ºC)

SALA 1

S2 (0-50 ºC)

SALA 2

V1

C1

V2

C2

C1

C2

V1

V2

M1

M2

7 6 5 4 3 2 1 0

Page 48: Manual Altair

M1/F

M1/F M1/C C2 C1 V2 V1

0 -> Visualizar conversión en S1.1 -> Visualizar en P4 grados S1.2 -> Visualizar estado Sala 1.3 -> Visualización en P4 conversión S2.4 -> Visualización en P4 grados S2.5

Sistema basado en microprocesador Altair 53548

7 6 5 4 3 2 1 0

Page 49: Manual Altair

TEMA 5.- TEMPORIZADORES.-

Temporizador 0 y Temporizador 1.- ( pág. 3.18)

Pueden funcionar como temporizadores y como contadores.

Como temporizador: cada ciclo de máquina es incrementado en una unidad ( 1 MHz ).

Como contador: el registro es incrementado en flancos descendentes en las patillas de entrada T0 ó T1 ( P 3.4 y P 3.5 ).La velocidad de muestreo es de dos ciclos de máquina ( 500 KHz ).El estado de cuenta aparece en los registros:

TH0 y TL0 para T0TH1 y TL1 para T1

La configuración y control de ambos se realiza mediante los registros especialesde función TMOD ( pág. 3.13 ) y TCON ( pág. 4.6 ). En TCON también están los bits de bandera de interrupción de estos temporizadores.

TMOD

TIMER 1 TIMER 0

TCON

Banderas de interrupción.

Los modos 0 y 1 sólo se diferencian en:Modo 0: 13 bits.Modo 1: 16 bits.

En el circuito se pueden dar tres configuraciones:

Sistema basado en microprocesador Altair 53549

GATE C/ M1 M0 GATE C/ M1 M0

TF1 TR1 TF0 TR0

Page 50: Manual Altair

C/=0

C/=1P3.4 / T0 INT

T0 TR0

GATEP3.6 / -INT 0 Dispara el temporizador y

el contador.

CONF. 1: C/ =0 y GATE =1

Inhabilita la entrada P 3.6 /-INT 0

Temporizador.

CONF. 2: C/ =1 y GATE =1

Contador

CONF. 3: C/ =0 y GATE =1

Habilita entrada -INT 0

-INT 0

Está activado el temporizador. Se cuenta el tiempo del ancho del pulso.

Sistema basado en microprocesador Altair 53550

OSC %12

TH6 TL0 TF0

Page 51: Manual Altair

.include .. \ fuentes\reg515.def

.text_org $80001jmp inicio.ds .b $800B- ; Reserva hasta dirección de subrutina de interrupción.

interrupcion_T0 :

setb TCON . 4 ; Activa TR0, es decir, vuelve a dispararT0. 65536 ciclos x 15 = 1 segundo.

inc R0 ; Incrementa R0cjne R0 , #15, no_incrementar ; Incrementa R1 al pasar 1 segundo y mov R0 , #00 reinicializa el contador R0.inc R1cjne R1 , #5, no_incrementar ; Incrementa R2 al pasar #dato x 1 mov R1 , #00 segundo. Reinicializa el contador

R1.inc R2 no_incrementar:

clr TCON. 5 ; Limpia la barrera de interrupción, TFO.reti

inicio:mov P4 ,#00 ; Inicializa P4, R1 y R0.mov R0 , #00mov R1 , #00mov R2 , #00setb IENO.7 ; Habilita la posibilidad de tener

interrupciones.setb IENO.1 ; Habilita la interrupción de T0.mov TMOD , #$01 ; Establece el modo 1 ( 16 bits ),

modo temporizador. Con -Int0 deshabilitada. La configuración del temporizador no puede rea- lizarse con operaciones de bit.

setb TCON.4 ; Dispara por primera vez T0( ac- tiva TR0 ).

programa_principal_0:mov P4, R2sjmp programa_principal_0

Sistema basado en microprocesador Altair 53551

Page 52: Manual Altair

.include ..\fuentes\reg515.def

.text_org $8000

1jmp inicio

.ds.b $800B- ; Reserva hasta dirección de subrutina de interrupción.

interrupcion_CONTO:

setb TCON. 4 ; Activa TR0, es decir, vuelve a dispararT0.

clr TCON. 5 ; Limpia la barrera de interrupción TF0.reti

inicio:mov P4, #00 ; Inicializa P4, R1 y R0.mov R0, #00setb IENO. 7 ; Habilita la posibilidad de tener interrupciones.setb IENO. 1 ; Habilita la interrupción de T0.mov TMOD, #$05 setb TCON. 4 ; Activa por primera vez T0 ( Activa TR0 ).

programa_principal_0:mov P4, TL0sjmp programa_principal_0

Sistema basado en microprocesador Altair 53552

Page 53: Manual Altair

Problema 1.-Realizar un programa que cuente los segundos y los minutos. En P4 debe mostrar los segundos y los minutos parpadeando.

P4

OR

Intermitente 7 minutos.

Problema 2.-Programa que cuente el tiempo que se tarda en cerrar el interruptor.

C / =0

S1

TR0

GATE =1

-INT 0

S0

T

El disparo de TR0 se puede realizar a través de otro interruptor.

Problema 3.-Hacer un reloj que ponga hora y que tenga todos los servicios de cronómetro, alarma, etc.Sistema basado en microprocesador Altair 535

53

5 segundos

Page 54: Manual Altair

TEMA 6 : INTERRUPCIONES Y CONTADORES.-

P1.0,…P1.4 y P3.2 y P3.3.-

Estos bits de los puertos 1 y 2 la segunda utilidad que tienen es de interrupción.¿ Qué es una interrupción ?Hay muchas tareas que el µC puede hacer pero le ocupan demasiado tiempo y le

impiden hacer otras cosas. Ej:Analicemos el programa en el que poníamos un led intermitente:

No

1 segundo

Si

Este bucle lo único que hacía era perder tiempo, es decir, mantener al µC ocupado un tiempo exacto para establecer un ciclo. Si queríamos que el led parpadeara con unos tiempos de ciclo exactos teníamos que calcular el tiempo de ejecución de las instrucciones.

¿ Qué pasaría si esta es sólo una de las 100 cosas que hacer que tiene que hacer el µC?. ¿ Sólo podría realizar esto ?.

Podríamos empezar a pensar en meter otra tarea dentro del bucle. Por ejemplo, si se tiene que estar pendiente de P5.0 y cuando esté a 1 de poner a 1 P4.1 y P 4.2. Estas instrucciones habría que incluirlas en el bucle:

Sistema basado en microprocesador Altair 53554

Inicio

Invierte P4.0

¿ Se ha cumplido tiempo ?

Page 55: Manual Altair

Con esto sólo se miraría P5.0 al final de cada ciclo.

Si quisiéramos mirar más frecuentemente:

No

De cualquier forma existen tres problemas:

1- Al incluir una tarea dentro de otra tarea que no tiene nada que ver complicamos el programa al no ser independientes y no estar en bloques separados.

Sistema basado en microprocesador Altair 53555

Inicio

Invierte P4.0

Mira P5.0

?

Inicio

Invierte P4.0

?

Mira P5.0

Page 56: Manual Altair

2- Al querer que los tiempos de ciclo sean exactos habría que estar calculando los tiempos de ejecución de la tarea " Mira P5.0 " y quitándoselos al bucle de espera, ya que si no éste se alargaría. Y esto no sería una solución perfecta, ya que esta tarea puede tener bifurcaciones y cada una de ellas tener un tiempo de ejecución distinto.

Tarea " Mira P5.0 "

T1>T2

3- Si hay que seguir aumentando el nº de tareas e ir incluyéndolas dentro del bucle llegará un momento que incluso ocupen más tiempo que el de espera, por lo que se complica mucho el programa:

t1= 0,2 seg.

t1+t2= 1 seg.t2= 0,8 seg.

t3= 0.4 seg.

t3+t4= 1 seg.t4= 0,6 seg.

Sistema basado en microprocesador Altair 53556

T1

T2 No

Mira P5.0

Activa P4.1, P4.2

P5.0=1 ?

Inicio

Tarea 1

Tarea 2

Invierte P4.0

Tarea 3.Mira P5.0

Tarea 4

Invierte P4.0

Tarea 5

Page 57: Manual Altair

Para evitar que el µC tenga que desaprovechar demasiado tiempo ocupado con tareas que no necesariamente tiene que realizarlas él, están las interrupciones.Ejemplo:

El µC tiene incorporado un temporizador. Este a grandes rasgos funciona de la siguiente forma:

Periférico interno

Disparo Interrupción internaINT 16

El temporizador se programa con un tiempo a través de un registro interno. A través del programa el usuario carga el registro y cuando quiere dispara el µP.

Mientras el temporizador está contando el tiempo establecido, el µC puede estar realizando otra labor. Cuando el temporizador acabe, activará la línea de interrupción interna INT 16, esto hace al µC dejar lo que esté haciendo e irse a un programita en el que nosotros le habremos puesto una tarea.Ejemplo:

INT 16

1 segundo

Como una subrutina que se llama por interrupción.

1 segundo

Sistema basado en microprocesador Altair 53557

TEMPORIZADOR

Registro 8 bits

Inicio

Tarea 1

Tarea 2

Tarea 3

Tarea 4

-Carga registro temporizador con 10.-Dispáralo.

INT 16

- Invierte led.- Vuelve a disparar

el temporizador.- ret.

Page 58: Manual Altair

Esto es un ejemplo de interrupción interna, ya que la realiza un dispositivo interno de la CPU. Pero también se pueden tener interrupciones externas, por ejemplo para la aplicación de " Mira P5.0 " sería muy útil.

P1.1/INT 4 S1

Normalmente a 0.

En la aplicación se tenía un 0 en P5.0 y cuando se pasaba a 1 se debían activar P4.1 y P4.2. En este caso se conecta la señal S1 a explorar, directamente a INT 4 que es activo en alta, cuando S1 pase a 1 se activará la interrupción INT 4 y a partir de ahí se sigue el mismo proceso que con la interrupción interna.

De esta forma fijarse lo fácil, comprensible, cómodo, rápido y útil que queda el programa.

Es necesario decir que P1.1 no va a ser E/S digital, sino INT 4.

APARTE

El programa acudirá a estas tareas sólo cuando sea necesario.

Sistema basado en microprocesador Altair 53558

Inicio

Configura P1.1 como INT 4

Carga temporizador con dato 10.Dispáralo.

Resto del programa.

Programa interrupción INT 4

( P1.1 )

Programa interrupción INT 16 ( temporizador )

Page 59: Manual Altair

-> Las interrupciones pueden ser de dos tipos: - Externas.- Internas.

-> Las internas sería como la del caso del temporizador, es decir, la petición de interrupción la realiza un dispositivo interno.

-> Las externas serían como en el caso de entrada que debe ser vigilada.

Vectores de interrupciones.-

Cuando se produce una interrupción lo que ocurre se puede dividir en varios pasos:a) La interrupción activa un bit de un registro de función especial.

7 6 5 4 3 2 1 0

( Registro de interrupción 1 ) 0 -> 1 ( Registros de banderas de solicitud de

interrupción).b) El registro continuamente está siendo chequeado por un dispositivo interno

llamado " servidor de interrupciones ". Cuando éste detecta la activación de una bandera avisa al µC de que se ha producido una interrupción.

c) Si esta interrupción está habilitada:

7 6 5 4 3 2 1 0

Registro banderas de interrupción.

7 6 5 4 3 2 1 0

Registro de habilitación de interrupciones.

El µC salta al vector de interrupción de dicha interrupción. El que en el registro de banderas se active un bit no quiere decir que se produzca una interrupción, ya que tiene que estar habilitada.

Primeras direcciones de la EPROMd)

Vectores de interrupción

EPROM

Sistema basado en microprocesador Altair 53559

µC

Page 60: Manual Altair

Entre la primera y la segunda hay 8 posiciones de memoria. Pero esas posiciones son muy pocas para poder desarrollar el subprograma de la interrupción, por lo que normalmente hay una instrucción de salto a otra posición.

En el sistema Altair, para que podamos utilizar las interrupciones al estar éstas en las posiciones de la EPROM son " sacadas " a la memoria RAM, desplazadas $8000 posiciones más arriba.

$0003

Interrup. 1 EPROM

$000BInterrup.2

$8003 RAM

$800B

e) Una vez se salta al vector, allí el programador deberá tener previsto un subprograma de interrupción o una instrucción de salto si queremos dejar libre la zona de vectores.

$8003

$800B

$8013

$806B

Límite zona de vectores si utilizamos

instrucciones de $806Esalto. programa_int0

programa_temp0

Sistema basado en microprocesador Altair 53560

ljmp $8003

Vector interrupción Interrup. externa 0

ljmp programa_intext0

ljmp programa_temp0

último vector.

Page 61: Manual Altair

Fijarse cómo ya no tenemos que especificar la dirección del programa de la interrupción, ya que ponemos como dirección de salto una etiqueta.

f) Se ejecutará el programa o subprograma de la interrupción cuando ésta se produzca, teniendo en cuenta de que antes de saltar guarda el contenido del contador de programa en la pila para saber dónde tiene que volver.

Sólo guarda el PC, por lo que si se alteran otros registros deben ser guardados en la pila mediante instrucciones PUSH y POP.Al final del subprograma debe de estar la instrucción " Reti ", que devuelve el control del programa a la rutina principal.No confundir con instrucción " Ret " de subrutinas, ya que puede provocar fallos en el programa por razones que se explicarán más adelante.Durante la ejecución se debe desactivar el bit de bandera que dio origen a la interrupción, si no es de los que se desactivan por hardware ( CPU ) al ser recogida su petición.

Niveles de prioridad.-

-> Puede ocurrir que cuando se esté ejecutando una interrupción la CPU reciba la petición de ejecutar otra o que, sin estar ejecutándose ninguna, lleguen dos peticiones a la vez.

-> Para solucionar estos problemas existen los " Niveles de prioridad ", es decir, el servidor de interrupciones tiene ordenadas las interrupciones según unos niveles de prioridad que pueden verse en la pág. 4.10.Las interrupciones están ordenadas en parejas del mismo nivel de prioridad. El orden va de mayor ( arriba ) a menor ( abajo ).

-> Si se estuviera ejecutando un programa de interrupción y se realizara la petición de otra interrupción, ésta sólo podría interrumpir a la que está ejecutándose si es de nivel superior, nunca si es de nivel inferior o igual.

-> Si se solicitan más de una interrupción a la vez de diferente prioridad, se irán ejecutando por orden de prioridades.

-> Si son de la misma prioridad se sigue el orden horizontal establecido en la figura 4.8.

-> Quien anula la petición de interrupción en el servidor para que no entre otra rutina de nivel más bajo es la instrucción " Reti " al terminar de ejecutarse la interrupción, por lo que el no ponerla hace que no se atiendan en adelante interrupciones del mismo nivel o superior.

Interrupciones externas.-

Sistema basado en microprocesador Altair 53561

Programa_int0

reti

Page 62: Manual Altair

En el siguiente ejemplo se muestra el control de una interrupción externa ( -INT0 ).

Configuración:-> setb IEN0.7 -> Se habilita la posibilidad de tener interrupciones ( pág. 4.4 ). ( EAL = 1 )-> setb INE0.0 -> Habilita particularmente la interrupción externa -INT0. ( EXO = 1 )-> setb TCON.0 -> Byte de elección para tener la interrupción por flanco de

bajada o por nivel bajo ( al principio viene por flanco de subida ).

-> clr TCON.1 -> En este ejemplo limpia la bandera aunque en el libro dice que lo hace el hardware.

mov A, b -> dirección $8001..ds.b 5 -> Reserva 5 bytes $8002 a $8006.mov b, A -> Dirección $8007clr A -> $8001.ds.b $8100-! -> Reserva hasta $80FF. Se ponen a FF.

Sirve para poner subrutinas en direcciones fijas que son llamadas directamente. Esto es muy útil para utilizar los vectores de interrupción.

Problema.-Transmisión Altair 1 -> Altair 2

Altair 1 Altair 2

INT1 INT1INT0 INT0

Se activa la transmisión cuando éste reciba un 1 en su INT1 ( mientras estará parpadeando ).Comenzará a mandar dato por salida 3.

Sistema basado en microprocesador Altair 53562

Page 63: Manual Altair

7 bits 1 segundo bit de paridad

El emisor debe de ir mostrando en P4 el dato a través de un solo led. Debe de haber otro de sincronismo que parpadee a intervalos de 1 segundo.El emisor antes de transmisión tendrá bit intermitente y durante la transmisión más intermitente. Al final debe mostrar el dato con su bit de paridad.

.include ../fuentes/reg515.def

.text_org $8000

Sistema basado en microprocesador Altair 53563

Page 64: Manual Altair

; Programa que utiliza una interrupción para contar impulsos ( INTO -> P3.2 ); 1ª versión: el estado de cuenta se muestra en el mismo programa de interrupción.; 2ª versión: el estado de cuenta se muestra en el programa principal.

direccion_8000:

ljmp inicio ; inutiliza las direcciones.ds.b $8003-! ; desde donde acaba " ljmp inicio "

; hasta $8003 ( en este caso sólo; $8002, ya que ljmp utiliza; 3 bytes.

interrupcion_0: ; Comienza interrupción; Está en dirección $8003

inc R0 ; Incrementa contador de pulsosmov P4, R0 ; 1ª versión.

; El resultado de la cuenta de los; pulsos aparece instantáneamente.

clr TCON.1 ; Limpia bandera de interrupción.reti ; Devuelve el control a la rutina

; principal.

inicio:mov R0,#00 ; Inicializa el contador de pulsos.setb IENO.7 ; EAL = 1 => Habilita ( en general ) la

; posibilidad; de habilitar interrupciones ( aunque; se ha probado que se habilita al; arrancar ).

setb IENO.0 ; Habilita ( particularmente ) la; interrupción externa -INT0

setb TCON.0 ; La interrupción se producirá por; flanco de bajada.

programa_principal:

mov P4, R0 ; 2ª versión:; el resultado de la cuenta de los; pulsos no aparece instantáneamente .

setb P4.0lcall esperaclr P4.0lcall esperasjmp programa_principal

espera:mov R1,#5

espera1:mov R2,#250

Sistema basado en microprocesador Altair 53564

Page 65: Manual Altair

espera2:mov R3,#250

espera3:nopnopdjnz R3,espera3djnz R2,espera2djnz R1,espera1ret

Problema.-Detector de teclado.

Sistema basado en microprocesador Altair 53565

Page 66: Manual Altair

5 v.

-INT0

P5.0P5.1

Que con los pulsadores desplace el led encendido para un lado o para otro.

Problema.-Hacer un programa que tenga en el puerto P4 dos números introducidos desde teclado.

Al pulsar un nuevo número éste desplazará a la izquierda el 8 y se situará en la derecha. El 5 se perderá.

Problema.-Al mismo problema anterior añadirle que con otra interrupción INT1 se ponga a 0.

TECLADO

* -> A- d - F

Sistema basado en microprocesador Altair 53566

AND

5 8

1 2 3

4 5 6

7 8 9

0 #

Page 67: Manual Altair

0 -> d- F - G A# -> d- F - H B7 -> A- d - e C8 -> D- E - G D9 -> D- E - H E4 -> A- C - D F5 -> C- D - G G 6-> C- D - H H1 -> A- B - D2 -> B- D - G3 -> B- D - H

B - D

C - D

D - E

D - F

A G H

Bcomún

A

CONTROL DE TECLADO.

Sistema basado en microprocesador Altair 53567

Page 68: Manual Altair

1 2 3 Común

4 5 6

7 8 9

* 0 # 5 V 5 V F0

F1 C 0 C 1 C 2 F2 INT0 F3 C 0 C 0 F 0 C 1 F 1 C 2 Común F 0

F 2 F 1 F 3 F 2 C 1 F 3 C 2

Para simular con caja de pruebas.Sistema basado en microprocesador Altair 535

68

1 2 3

4 5 6

7 8 9

# 0 *

0

1

2

3

4

5

6

Page 69: Manual Altair

F0 F1 F2 F3 C0 C1 C2 INT0

Sistema basado en microprocesador Altair 53569

Page 70: Manual Altair

TEMA 7 : DISPLAY.-

El display Hitachi ( LCD -> Cristal líquido ), tiene dos líneas de 16 caracteres. El conexionado para acoplarlo al Altair viene en la pág. 8.108 ( Tomo 2 ). Pueden distinguirse tres tipos de líneas:

-> Alimentación ( 1, 2, 3 ). Se conecta a 5 voltios. La patilla 3 recibe la alimentación a través de un potenciómetro con el que se regula el contraste.

-> Control ( 4, 5, 6 ). Se utilizan para controlar el display.E -> Habilitación del display.R/W -> Lectura o escritura en memorias internas del display.RS ->Selección de registro ( memoria interna de datos ) / instrucción ( el

display tiene una especie de microcontrolador).

-> Datos ( 7, 8, 9, 10 ) y ( 11, 12, 13, 14 ). Son ocho líneas para la comunicación de datos. Hay una instrucción que permite reducir las líneas al grupo ( 11, 12, 13, 14 ) con lo que se deben mandar los datos en dos grupos de 4 bits.

El display posee básicamente una memoria RAM de 80 posiciones, una para cada carácter del display, y otra memoria EPROM con parte del código ASCII que permite que sean representados en pantalla todos los símbolos más usuales en un texto.

Carácter inicial.

2 líneas

Carácter final. 40 caracteres

Memoria

Carácter final

80 bytesCarácter inicial 2ª fila

Carácter inicial 1ª fila

Sistema basado en microprocesador Altair 53570

Page 71: Manual Altair

Visor2

líneas

16 caracteres

En la pantalla realmente sólo se ven 2 x 16 caracteres, y el resto quedan ocultos en principio, aunque se puede desplazar el display y se pueden llegar a ver todos.

Los caracteres a enviar al display se suelen almacenar en la memoria del Altair con la directiva .dc. b . Ej:

$9000 .dc. b $43, 82, ' E ', " ABC " , 0$9001 -> $ 43 -> Equivalente a C mayúscula.$9002 -> $XX -> 82 -> Equivalente a R mayúscula.$9003 -> $45 -> Equivalente a E mayúscula.$9004 -> $41 -> " " A " .$9005 -> $42 -> " " B " .$9006 -> $43 -> " " C " .$9007 -> $00 -> Valor 0.

Como puede verse hay tres formas de representar los caracteres:- Por su valor del código ASCII ( ya sea en hexadecimal o binario).- Por su símbolo entre comas ' E '.- Como una cadena de texto entre comillas " ABC ".

El valor 0 es importante porque cuando se manda una cadena de texto al display, éste en un principio no sabe cuál es el final de la cadena. En el programa que vamos a utilizar para manejar el display se espera un valor 0 como final de la cadena.Ej:

.dc. b " Hola pepe " , 0

RAM Altair H O L A

P E P E 0

Indicará al programa el final de cadena.

Sistema basado en microprocesador Altair 53571

Page 72: Manual Altair

El programa va leyendo carácter a carácter del Altair y lo pasa al display. Cuando llega al valor 0 para de mandar caracteres.

¡ No confundir valor 0 del código ASCII con carácter numérico 0, cuyo sitio en la tabla del código ASCII es el 48.!. Es distinto 0 de ' 0' ó " 0 ".

-> A continuación cargar el programa Display .551 y ver lo que hace.En este programa existen varias funciones para controlar el display.En el programa de demostración algunas de estas funciones no se utilizan.A continuación realizar modificaciones en el programa ( salvando siempre con

nombres diferentes ), para que se realicen las siguientes operaciones con el display:

-> Acortar la primera línea. Alargar la primera línea. Alargar la segunda fila ( para que haya más de 80 caracteres ).-> A través de una entrada el display se desplaza a izquierda o a derecha.-> A través de dos entradas elegir 4 textos diferentes.-> A través de dos entradas hacer moverse a un texto hacia abajo o hacia arriba. Se puede hacer a lo bestia, es decir, escribiendo los 6 posibles mensajes en pantalla.

6 líneas

16 caracteres

-> Con una entrada mover el cursor de un lado a otro de la pantalla constantemente.-> Con dos entradas mover el cursor de un lado a otro a impulsos.-> Con dos entradas situar cursor y con una tercera ordenar la escritura de un carácter ( uno por cada activación ). Los caracteres a introducir estarán en una tabla.-> Menú para modificación de parámetros.

Deben de ir saliendode uno en uno y servisualizados con dosinterruptores a modode cursores.

Con otro interruptor ( Enter ) se podrá elegir cada una de las opciones. Las dos primeras opciones deben mostrar el mensaje: Opción vacía.

Sistema basado en microprocesador Altair 53572

Opción 1

Opción 2

Opción 3

Opción 4

Page 73: Manual Altair

La opción 3 debe de mostrar:

0 ->Apagado led.

Modos: 1 -> Activado led. 2 -> Parpadeo led.

Ejemplo

Pulsando Enter se deja como estaba y se sale de opción. Pulsando cursores se recorren los posibles Modos. Cuando se tenga el modo elegido pulsar Enter para confirmar y salir de opción.

La opción 4 debe de indicar sólo el estado del led con un mensaje tipo texto.

Sistema basado en microprocesador Altair 53573

Configurar P3.5 Modo actual: 1