I-INTRODUCCION AL PROYECTO Y MICROCONTROLADORES

Un microcontrolador (MCU) es un circuito integrado en el que en una misma pastilla están integrados las partes que componen un sistema con microprocesador, como la CPU, los módulos de I/O y dependiendo del tipo de MCU hasta convertidores A/D, TIMERS y puertos SERIE.Esto dota al MCU de un gran potencial en la electrónica, disminuye costes y un sólo MCU puede sustituir a un circuito digital complejo, que necesita de muchos C.I. (circuitos integrados), y tiempo para su diseño. Incluyendo un MCU en un circuito de estas características lo único que necesitaremos es el MCU, unos pocos componentes externos y un programa adecuado.

El MCU es ampliamente utilizado actualmente en la industria, un MCU puede realizar tareas de complejidad baja,media de las que antes se tenía que ocupar un sistema digital complejo, una circuitería convencional o un sistema con microprocesador con todo lo que ello conlleva, como el espacio necesario y la complejidad de diseñar un sistema mínimo.

Por todo esto y el deseo de conocer un componente tan importante , con tan grande campo de aplicaciones y tanto futuro, hemos decidido dedicar este proyecto al estudio de un MCU que está ampliamente implantado en la industria, el ST-6 de SGS-THOMSOM, un componente con una gran capacidad y flexibilidad como para ser usado en cualquier aplicación electrónica que lo requiera.

En este proyecto de final de curso nos hemos centrado en el estudio de la arquitectura y programación del ST6 y una vez adquiridos los conocimientos necesarios hemos empezado ha desarrollar prácticas con el para aplicar la teoría. Hemos desarrollado una placa de desarrollo para realizar estas prácticas con más facilidad y una aplicación final (METEO),esta aplicación final supone un gran reto para nosotros debido a su media complejidad al comunicar un PC con el MCU.

II-EL ST6

ST6 es el nombre del la familia de microcontroladores que fabrica SGS-THOMSOM para el desarrollo de aplicaciones de control básicas, fáciles de programar y bajo coste. Todos MCU de esta familia están constituidos alrededor de una misma CPU de 8 bits, rodeada de diversos periféricos y dependiendo del modelo más o menos memoria. Hay diversas subfamilias que se adaptan a diversos sectores del mercado, todos los miembros de las diversas subfamilias tienen compatibilidad en el SOFTWARE debido a que la CPU es la misma en todos los casos. Nosotros trataremos en este proyecto la subfamilia ST62 y en concreto los modelos ST6210, ST6220,ST6215 y ST6225. Ahora pasamos a describir las características generales de estos cuatro modelos :

- CPU de 8 bits

- Rango de alimentación de 3V a 6V

- Reloj a 8Mhz

- 5 Vectores de interrupción

- 2K o 4K de memoria PROM/EPROM

- RAM 64 bytes

- 12/20 Patillas de I/O, programables como :

- Entradas con resistencia PULL-UP

- Entradas sin resistencia PULL-UP

- Entradas con interrupción

- Salidas en colector abierto

- Entradas analógicas

- 4 líneas de I/O pueden sacar una corriente de 10mA

para atacar directamente leds

- Contador de 8 bits con un preescaler de 7 bits

- Timer/Watchdog digital

- Convertidor A/D de 8 bits

- Una interrupción NMI externa

- STACK (LIFO) de 6 niveles

- 9 modos de direccionamiento

- Oscilador integrado en el circuito

- RESET automático tras conexión de alimentación


II-a) FAMILIA ST6

La familia de microcontroladores ST6 tienen en común la CPU de 8 bits, y por lo tanto son compatibles en cuanto a software y las diferencias de un miembro a otro están en cuanto a líneas de I/O, y memoria, ahora vamos a hacer una descripción de cada una de las diferencias entre los miembros 10,15,20 y 25 que son los tratados en este proyecto.


Tipo

ST6


EPROM

Kbytes


RAM

Bytes


Líneas

I/O


Alta

Intens

10mA


Num.

Canal

A/D


Ext.

Inter.


ST62E10

2K

64

12

4

8

13

ST62E15

2K

64

20

4

16

21

ST62E20

4K

64

12

4

8

13

ST62E25

4K

64

20

4

16

21

* En todos estos miembros expuestos en la tabla son comunes los periféricos que estos llevan incluidos en la misma pastilla, vamos a nombrarlos y 2 puntos más adelante los trataremos más detalladamente :

- Convertidor A/D

- Timer, temporizador

- Líneas de puertos I/O

- Digital Watchdog/Timer

* Descripción de patillas :

Vista de las patillas

Vdd y Vss : Patillas de alimentación. Vss es la conexión a masa y Vdd la conexión a positivo. La tensión de alimentación va desde 3V a 6V.

Oscin y Oscout : Estas patillas están conectadas al oscilador interno del chip, a estas patillas hay que conectar un circuito resonante, una señal de reloj externa, o un cristal de cuarzo. La forma de conectar el cristal es la mostrada en la Fig.3.3.


Oscin es la entrada del oscilador y Oscout es la salida.C1 y C2 deben estar entre los 15pF y 22 pF, para cristales de 4Mhz y 8Mhz. Aunque el reloj funciona a 8Mhz esto no se traduce en una gran velocidad, un Z80 a 4Mhz es casi un 300% más rápido que el ST6.

Un ciclo máquina consta de 13 ciclos de reloj, 12 de los cuales se emplean en la búsqueda del código OP, decodificación e incremento del PC para localizar el operando o la siguiente instrucción y el último para estabilizar los buses internos durante el direccionamiento de memoria.

Reset : Esta patilla a nivel bajo produce un reset en el microcontrolador.

Test/Vpp : Este pin se utiliza para poner al MCU en un modo especial de trabajo. Para que el MCU trabaje en un modo normal debe ser conectada a masa. Si se lleva a un uno lógico el MCU entra en modo de TEST, este test se realiza en fabrica. El usuario debe llevarla a masa. Si es una versión EPROM y se lleva a 12.5V durante la secuencia RESET se produce el modo de programación.

NMI : Esta patilla es una entrada de interrupción no mascarable, aunque en realidad se debería decir para ser más exactos que es una interrupción de máxima prioridad ya que decir que no es mascarable no es del todo correcto ya que con el registro IOR del que ya trataremos puede desconectarla. Esta interrupción es sensible al flanco descendente. En los modelos EPROM este pin no esta conectado al positivo a través de una resistencia PULL-UP por lo que el usuario si lo necesita deberá conectarla en el exterior. En las versiones ROM se puede decidir si esta resistencia se incluye en fábrica o no.

Timer : Esta patilla es una línea I/O, esta patilla al igual que la línea NMI no tiene conectada al positivo una resistencia

PULL-UP y si el usuario necesita utilizar este pin tendrá que conectarla el desde el exterior. Este pin puede ser utilizado como I/O dependiendo del modo de funcionamiento del timer. Si está programada como entrada este pin será la señal de reloj del preescaler, si actúa como salida esta sacara el nivel lógico preprogramado cuando el timer termine su temporización.


PA0-PA3, PA4-PA7 : Estas 8 líneas conforman las líneas del

puerto A, son programables independientemente como :

1. Entrada, con o sin resistencia al positivo

2. Entrada con interrupción mascarable

3. Salida en colector abierto o también en PUSH-PULL

PA0-PA3 pueden generar una corriente de salida de hasta 10mA, mientras que PA4-PA7 pueden programarse como entradas analógicas para el convertidor A/D. PA4-PA7 no existen en las versiones ST62E10 y ST62E20.

PB0-PB7 : Estas líneas conforman el puerto B, son programables independientemente como :

1. Entrada, con o sin resistencia al positivo

2. Entrada con interrupción mascarable

3. Salida en colector abierto o también en PUSH-PULL

4. Entrada analógica para el convertidor A/D

PC4-PC7 : Estas líneas conforman el puerto C de I/O. Se pueden programar independientemente al igual que los puerto anteriores como :

1. Entrada, con o sin resistencia al positivo

2. Entrada con interrupción mascarable

3. Salida en colector abierto o también en PUSH-PULL

4. Entrada analógica para el convertidor A/D

Estas líneas no existen en los modelos ST62E10 y ST62E20.

* Encapsulados : Las versiones 10 y 20 tienen 20 pines y las 15 y 25 son de 28.

III-b) ARQUITECTURA INTERNA

La CPU como ya hemos dicho es la misma para todos los miembros de la familia ST62XX. La CPU es por lo tanto como una unidad independiente que se comunica con el resto de los elementos a través de los buses.

Cuando se genera un RESET bien a través de la patilla reset, a la secuencia de inicio tras la conexión de la alimentación o a través del WATCHDOG, el PC direcciona la memoria de programa. De esta forma se obtiene el código OP de la instrucción a ejecutar que se decodifica en la unidad de control, y se generan las señales necesarias.

Dependiendo del tipo de instrucción, el operando puede direccionar el área de datos. Esta se comporta de forma similar a una memoria de 256 posiciones y contiene datos de tipo constante, variables e incluso los registros de trabajo de la CPU, así como los de control para los distintos periféricos.

La ALU realiza todas las operaciones aritmético-lógicas clásicas. Recibe los operandos desde el área de programa y/o datos.

Los resultados obtenidos pueden retornar al área de datos o, incluso, dependiendo del tipo de instrucción, modificar el PC. El registro de estado (FLAGS) es de tan solo 2 bits, el de carry y el de cero. El PC es el encargado de direccionar el área de programa en busca de nuevas instrucciones para ejecutar.

El STACK o pila se empleará para contener las direcciones de retorno del PC cuando se produzcan interrupciones o llamadas a subrutinas.

Acumulador (A): Es el registro acumulador, es de propósito general y se emplea en las operaciones aritmético-lógicas y manipulación de datos. El acumulador al igual que todos los registros del ST6 se usan como si direcciones de memoria se tratase (RAM), se encuentra en la posición 0ffh.

Registros Indice (X,Y) : Estos dos registros se utilizan para el direccionamiento indirecto por registro, Ej : LD A,(X). Se pueden utilizar también como registros de propósito general. Se encuentran en las posiciones de memoria 80h (X) y 81h (Y).

Registros Generales (V,W) : Estos dos registros son uso general. Se encuentran en las posiciones de memoria 82h (V) y 82h (W).

Contador de programa (PC) : Se trata del contador de programa, es de 12 bits, lo que le permite direccionar 4 Kbytes de programa es decir de memoria ROM. El PC apunta a la siguiente instrucción que se va a ejecutar. El PC al igual que el del Z80, se incrementa nada más que la dirección ROM ha sido leída. Tras una interrupción el PC se guarda en el STACK y se carga con el valor del VECTOR de la interrupción correspondiente.

Flags (C,Z) : La CPU dispone de 3 pares de FLAGS, que corresponden a 3 situaciones diferentes de trabajo : situación normal, interrupción mascarable y interrupción no mascarable. Cada par tiene el flag de Carry (C) y el flag de cero (Z). Existen estos 3 pares de FLAGS para que cuando se pasa de un modo de trabajo a otro, el valor de los FLAGS no se altere, esta es una forma de no tener que salvar los FLAGS en el STACK como ocurre en algunos microprocesadores. La CPU utiliza directamente y automáticamente la pareja de FLAGS necesarios en cada momento. CN y ZN son los FLAGS para modo normal, CI y ZI son los FLAGS para modo de interrupción mascarable, CNMI y ZNMI son los FLAGS para el modo de interrupción no mascarable (máxima prioridad, NMI).

El STACK : Es una memoria tipo LIFO (último en entrar, primero en salir) gobernada mediante HARDWARE, lo que no hace necesario el habitual SP (stack pointer, puntero de pila). El stack del ST6 consiste en 6 posiciones de 12 bits, cuando se produce una interrupción o un salto a subrutina el PC se guarda en la posición de PILA correspondiente automáticamente, cuando la CPU ejecuta una RET o una RETI el PC de la pila es automáticamente recuperado. Es importante observar que el máximo nivel entre interrupciones y subrutinas es 6, ya que si se sobrepasa este número el valor de la última posición del STACK se perdería. Si el usuario necesita guardar el valor de diversos registros en un salto a interrupción o subrutina deberá hacerlo guardando los registros en posiciones de memoria para después recuperarlos. Si el STACK esta vacío y se ejecuta una RET o una RETI el programa no hace nada y ejecuta la siguiente instrucción que se encuentre detrás del RET o RETI.

AREAS DE MEMORIA : La CPU del microcontrolador opera en dos zonas de memoria diferentes : AREA DE DATOS y AREA DE PROGRAMA.

AREA de PROGRAMA : Es el área de programa ROM/EPROM del chip, esta memoria contiene las instrucciones de programa, tablas de datos de valores fijos y los vectores de interrupción. Es direccionada por el PC. Las direcciones para cada componente de la familia ST62 aquí estudiada son las siguientes :

Se puede observar en la figura que la memoria de programa en la versiones de 2K comienza en la posición 0800h y en las de 4K en la 0000h. Las direcciones que no aparecen en el anterior mapa no están implementadas o bien no son accesibles para el usuario.

NOTA : en las versiones OTP (one time programable, PROM) de 2K la memoria de programa comienza en la 0880h y las de 4K en la 0080h

AREA de DATOS : El juego de instrucciones de la CPU del ST6 opera sobre una zona específica llamada zona o área de datos. Se trata de una zona de memoria de 256 posiciones (000h-0FFh) facilmente accesible mediante un operando de 8 bits. Esta zona de memoria es igual en todas las versiones que aquí se estudian. En dicha zona de memoria podemos encontrar lo siguiente :

1- Datos constantes y de sólo lectura, procedentes gracias al registro RDW de la memoria EPROM, se pueden acceder a 64 bytes de este tipo. Este registro ya lo trataremos después.

2- 60 posiciones de memoria RAM que pueden contener variables o datos temporales.

3- Los registros de trabajo de la CPU X,Y,V y W, así como el acumulador A.

4- El propio registro de ventana RDW cuyo contenido permite reflejar en la zona de datos una porción de 64 bytes procedentes de la memoria de programa EPROM.

5- Los diversos registros que según se programen controlan los diferentes periféricos.

Las posiciones de la memoria de datos están distribuidas como sigue :

040h-07Fh ----> Ventana de datos constantes

080h ----> Registro Indice X

081h ----> Registro Indice Y

082h ----> Registro General V

083h ----> Registro General W

084h-0BFh ----> Ram de datos

0C9h ----> RDW

0FFh ----> Acumulador

Las direcciones de los registros de los periféricos serán dadas cuando se expliquen estos.

El registro RDW : Como ya hemos apuntado el ST6 trabaja con 2 áreas de memoria, la de programa y la de datos. Las instrucciones que operan con datos lo hacen directamente sobre el area de datos, por lo tanto se podría pensar que no se podrían tener tablas de datos permanentes ya que las instrucciones no operan con la memoria de programa EPROM. Para remediar esto existe un registro localizado en la posición C9h de la RAM (RDW). Gracias a este registro se pueden reflejar 64 bytes de la memoria EPROM en la RAM en las posiciones 40h-7Fh, modificando este registro se reflejan diferentes partes de la EPROM. La forma para conseguir esto se hace de la siguiente forma :

Los 6 bits de menor peso del registro RDW se concatenan con los 6 bits de menos peso del operando que acompaña a la instrucción, resultando una dirección de 12 bits que permite expresar cualquier posición física de la zona o área de programa EPROM.

Ejemplo : Suponiendo que el RDW valga 22h, y se ejecute una instrucción LD A,43 la porción de memoria de programa física reflejada en las posiciones de la 40h a la 7Fh de la zona de datos, está comprendida entre la 880h y la 8BFh. Así, el acumulador se carga con lo que hay en la 43h que es el reflejo de la posición 883h.

Para trabajar correctamente con este registro existen directivas de emsamblador de las que trataremos en el punto correspondiente.

LAS INTERRUPCIONES : La CPU puede manejar cuatro fuentes diferentes de interrupción mascarable y una no mascarable de máxima prioridad (NMI).

Cada interrupción tiene asociado un vector de interrupción, que contiene la dirección de salto hacia la subrutina de atención a la interrupción. Estos vectores están localizados de forma fija en la memoria EPROM. Cuando se produce una interrupción el PC se guarda en el STACK y se carga con el valor de la dirección del vector correspondiente, el PC ejecuta la instrucción que hay en el vector de interrupción que deberá ser normalmente una instrucción JP etiqueta, por lo tanto salta a la subrutina de atención de interrupción.

Los FLAGS conmutan al modo de interrupción correspondiente. Cuando el programa de atención a interrupción termina ( con un RETI retorno de interrupción ) el PC se recupera del STACK y los FLAGS conmutan al modo normal y la ejecución del programa continua donde fue interrumpida.

VECTORES de INTERRUPCIONES y RESET :


Fuente Interrupción

Número de Vector

Dirección

Patilla NMI

Vector N.0

FFCh - FFDh

Cualquier Pin PA

Vector N.1

FF6h - FF7h

Cualquier Pin PB

Vector N.2

FF4h - FF5h

Cualquier Pin PC

Vector N.2

FF4h - FF5h

TIMER

Vector N.3

FF2h - FF3h

Convertidor A/D

Vector N.4

FF0h - FF1h

RESET

Vector Reset

FFEh - FFFh

LA PRIORIDAD EN LAS INTERRUPCIONES : La interrupción NMI es la de máxima prioridad, esta interrupción puede incluso interrumpir el tratamiento de cualquiera de las otras cuatro, en cualquier momento. Sin embargo, las restantes interrupciones no pueden interrumpir ni cancelar ninguna otra ni su correspondiente tratamiento. En caso de que haya varias interrupciones pendientes de ser atendidas, el orden que establece la CPU es atender primero a la 1 y la última a la número 4. Esta prioridad es fija y se establece por HARDWARE.

El registro de opciones de interrupciones IOR es un registro de 8 bits localizado en la posición 0C8h de datos. Es un registro de sólo escritura que no puede accederse mediante instrucciones de manipulación de bits.

IOR (POSICION 0C8h)


IOR7

IOR6

IOR5

IOR4

IOR3

IOR4

IOR5

IOR6

De los 8 bits que tiene el registro IOR solamente 3 de ellos se utilizan, estos son IOR4, IOR5 y IOR6, y tienen asignadas las siguientes funciones :

IOR4 ÄÂÄÄÄÄÄÄ> ACTIVO : ACTIVA TODAS INTERRUPCIONES

³

ÀÄÄÄÄÄÄ> DESACTIVO : DESACTIVA TODAS INTERRUPCIONES

IOR5 ÄÂÄÄÄÄÄÄ> ACTIVO : INT.2 ACTIVA, FLANCO ASCENDENTE

³

ÀÄÄÄÄÄÄ> DESACTIVO : INT.2 ACTIVA, FLANCO DESCENDENTE

IOR6 ÄÂÄÄÄÄÄÄ> ACTIVO : INT.1 ACTIVA, NIVEL LOGICO "0"

³

ÀÄÄÄÄÄÄ> DESACTIVO : INT.1 ACTIVA, FLANCO DESCENDENTE

Si hay varias líneas de un mismo puerto que pueden interrumpir, siempre que interrumpan sea la línea que sea se salta a su correspondiente vector de puerto y el usuario deberá ser el encargado en la subrutina de tratamiento de la interrupción de determinar que línea fue la que interrumpió.

EL RESET : Sirve para inicializar el microcontrolador y tiene tres formas de generarse :

1- Mediante una señal externa aplicada por el PIN RESET

2- De forma automática, tras la conexión de la VCC

3- Por el controlador de secuencias WATCHDOG

Cuando se produce un RESET se produce una secuencia de inicio. El STACK se restaura y se coloca en el primer nivel. El contador de programa PC acude a las posiciones del VECTOR RESET, situadas en FFEh y FFFh, donde se encuentra una instrucción de salto (JP) a la dirección de comienzo de la rutina principal del sistema.

La CPU se pone automáticamente en el modo de trabajo NMI con objeto de evitar falsas interrupciones en la secuencia de inicio. Por ello, tras realizar la rutina principal se debe incluir la instrucción RETI para que la CPU pase a trabajar en modo normal.

III-c) PERIFERICOS DEL ST6

LAS PUERTAS DE ENTRADA/SALIDA : Todas las líneas de I/O se agrupan en tres puertas llamadas PA, PB y PC. Cada puerta está asociada con tres registros mediante los cuales se establecen las diferentes formas de trabajo. Estos son :

- Registro de datos

- Registro de direcciones

- Registro de opciones

Cada uno de los 3 registros anteriores ocupa una posición en el área de datos :


PUERTA

Reg.Datos

Reg.Direcc.

Reg.Opciones

PA

DRPA (C0h)

DDRPA (C4h)

ORPA (CCh)

PB

DRPB (C1h)

DDRPB (C5h)

ORPB (CDh)

PC

DRPC (C2h)

DDRPC (C6h)

ORPC (CEh)

El bit de cada registro está asociado a cada una de las líneas de los puertos. Así, por ejemplo el BIT 0 de DRPA, DDRPA y ORPA está asociado con la línea PA0 del puerto PA.

Durante la secuencia de inicio del MCU, tras el RESET, todos los registros se borran, de forma que las líneas de las tres puertas quedan configuradas como entradas en PULL-UP, sin poder provocar interrupciones.

Los puertos se programan poniendo los adecuados valores en sus 3 registros, ahora 2 consideraciones : no se pueden tener más de una entrada analógica simultáneamente y la otra es que cuando una línea se programa como entrada SIN PULL-UP ni interrupción es lo mismo que si estuviera en alta impedancia.

EL TIMER : Es un temporizador compuesto por un contador de 8 bits con un preescaler programable de 7 bits, permitiendo cuentas de hasta 215 eventos, y toda la lógica de control necesaria para configurar tres modos diferentes de trabajo.

Los registros de TIMER : el timer tiene 3 registros, el contador, el preescaler y otro el de estado y control.

El TCR : El registro contador de tiempos TCR es el temporizador programable de 8 bits, se carga con el valor de la temporización que se desee realizar. Este registro se va decrementando en cada flanco ascendente de la señal CLK aplicada a su entrada hasta que valga 0, momento en el cual se activa el bit TMZ del registro de control/estado. El TCR se encuentra en la posición D3h del área de datos.

El PSC : Es un registro de 7 bits que se encuentra en la posición D2h del área de datos. Se trata también de un contador descendente que se decrementa en los flancos ascendentes de la señal CLK aplicada a su entrada. Como es sabido, la frecuencia obtenida en el bit 0, es la mitad de la de la entrada. De esta manera, las señales obtenidas en la entrada del CLK del preescaler, en el bit 0, bit 1, en el 2,3,4,5,6 serán de 1/2, 1/4, 1/8, 1/16, 1/64 y 1/128 de la frecuencia de entrada, respectivamente. Mediante un multiplexor de 8 a 1, se aplica una de ellas al contador TCR como frecuencia de CLK de trabajo del mismo.

El TSCR : Se trata del registro de estado y control con el cual se puede programar los distintos modos del TIMER, así como conocer el estado del mismo. Este registro puede ser leído y escrito en la posición D4h del área de datos.

MODOS de TRABAJO : Mediante los correspondientes bits del registro TSCR se pueden programar 3 modos de trabajo.

1- Modo Controlado : El preescaler se decrementa mientras la patilla de entrada TIMER esté a 1, en caso contrario la temporización queda detenida.

2- Contador de Eventos : La patilla TIMER actúa como entrada de CLK del TIMER y cuando los pulsos contados sean iguales que el valor del contador la temporización termina. La frecuencia máxima de entrada por el TIMER será de 2Mhz si el MCU trabaja a 8Mhz.

3- Modo Salida : El pin TIMER queda configurado como salida y saca el nivel lógico que el usuario programe, cuando la cuente llegue a 0.

La INTERRUPCION TIMER : El TIMER si esta habilitado para ello puede provocar una interrupción de nivel 3, cuando la cuenta llegue a 0.

EL CONVERSOR A/D : Es un convertidor con el proceso de conversión conocido como de APROXIMACIONES SUCESIVAS, si el MCU trabaja a 8Mhz el tiempo de conversión serán de unos 70uS. El conversor puede tener varios canales de entrada, pero como ya se dijo sólo puede tener activo uno, de lo contrario se pueden producir fallos en el CHIP. El conversor tiene 2 registros diferentes. Uno es el resultado de la conversión (ADR) y el otro establece las diferentes formas de trabajo y control (ADC).

La resolución es la siguiente :

Vdd-Vss

---------= Resolucion

256
Así pues si por ejemplo el MCU está alimentado a 5V, la resolución es de 19,5 mV.

El RESET detiene, en el momento de producirse, cualquier conversión que se esté realizando. Todos los registros del A/D se ponen a 0.

El registro ADC se encuentra en la posición D1h del área de datos y el ADR en la D0h.

EL WATCHDOG : El WATCHDOG o controlador de secuencias consiste en un temporizador capaz de generar un RESET cada cierto tiempo, dando comienzo la secuencia de inicio del sistema. Esto evita que el microcontrolador se quede "colgado" o entre en ciclos de espera excesivamente largos. Se deberá recargar cada cierto tiempo evitando que llegue a 0, si no se desea que genere un RESET. Existen dos tipos de WATCHDOG uno activable por SOFTWARE y otra por HARDWARE. En las versiones de MCU EPROM se comercializan los dos tipos, los que se activan por SOFTWARE llevan la inscripción SWD y los de HARDWARE HWD.

En el tipo HARDWARE el WATCHDOG se inicializa automáticamente tras el RESET sin necesidad de ser activado por el usuario. En este caso, siempre esta activado y no se puede emplear como temporizador. En la versión SOFTWARE el usuario controla el funcionamiento o no del WATCHDOG. En caso de no activarlo se podrá emplear como temporizador.

El WATCHDOG como tal es un contador descendente al que se accede en la posición D8h del area de datos y se representa como WDR.

El valor de temporización se establece mediante el valor cargado en los 6 bits de mayor peso del registro, que se va decrementando en unidades de intervalos de tiempo. De esta manera, si antes no se recarga, llegara a 0 produciendo el RESET.

III-d) TIPOS DE DIRECCIONAMIENTO

El software de la familia ST62XX esta diseñado para aprovechar al máximo las posibilidades del hardware usando la mínima memoria posible. Por ello gran parte de las instrucciones necesitan de un único byte que contiene el cogido OP y el propio operando.

DIRECCIONAMIENTO INMEDIATO : El operando que acompaña al código OP de la instrucción es el propio dato a procesar.

DIRECTO : La dirección de memoria donde se encuentra el dato a procesar, se da en el operando de un byte que acompaña a la instrucción.

DIRECTO CORTO : S emplea en aquellas instrucciones en las que el operando es cualquiera de los registros de trabajo X,Y,V y W.

EXTENDIDO : Lo emplean las instrucciones de salto (JP,CALL) que necesitan de un operando de 12 bits para definir la dirección de memoria a la que hay que acudir.

RELATIVO AL PC : Se emplea en las instrucciones de salto condicional. Estas realizan la comprobación o test de una determinada condición. Si esta se cumple el PC se puede desplazar 15 posiciones hacia adelante o hacia atrás desde la posición en que se encuentre en ese momento. Si por el contrario dicha condición no se cumple, se ejecuta la siguiente instrucción.

DIRECTO A BIT : Empleado por las instrucciones destinadas al activo o borrado de bits individuales.

COMPROBACION DE BITS Y SALTO : En el código OP se indica el número del bit a comprobar su estado lógico y según su estado generar un salto de +/- 128 posiciones o no.

INDIRECTO : El dato a manipular se encuentra en la posición marcada por cualquiera de los registros indicies.

INHERENTE O IMPLICADO : Lo emplean aquellas instrucciones que no necesitan de operando alguno.

IV-EQUIPO DE PROGRAMACION USADO

IV-a) INTRODUCCION AL EQUIPO

El equipo usado en este proyecto es el, equipo de desarrollo de ST6 de SGS-THOMSOM. Consta de un programador de ST6 por medio del puerto paralelo de un PC, software para el programador, un simulador de software y cuatro MCU ST6.

IV-b) SOFTWARE :

El software del equipo consta de un simulador de la CPU del ST6, de un programa para el programador, y un ensamblador y linkador. Ahora pasaremos a describir el ensamblador y el simulador.

IV-b,I) ENSAMBLADOR (DIRECTIVAS Y OPCIONES)

-EL AST6.EXE (ENSAMBLADOR) : AST6 es un ensamblador que trabaja con ficheros ASCII. Se ejecuta desde la línea de comandos del DOS. Forma :

C:\ST6\AST6 [-opciones] fichero1 [fichero2...]

Esta orden expuesta ensamblaría fichero1.asm creando por defecto un fichero1.hex y fichero1.dsd. Los ficheros de salida son producidos de acuerdo a las opciones elegidas. Las opciones se especifican antes del fichero. Cada opción debe de ir precedida por un signo menos, estas pueden ser tanto en mayúsculas como minúsculas.

Opciones del AST6 :

-L Crea un fichero de salida con el listado (name.LIS)

-X Crea un fichero con una tabla de referencias cruzadas (name.X)

-M Añade un mapa de información al final de name.LIS

-S Crea una tabla con los símbolos en el fichero name.SYM

-O Crea un fichero objeto (name.obj)

-E Crea un fichero con una lista de errores (name.ERR)

-F Introduce la trayectoria completa (nombre) en los mensajes de error

-D Inserta información para la máscara de ROM en el fichero name.HEX

-Z Cambia el formato de los ficheros .DSD y .SYM para los componentes de la familia ST60

Los ficheros .DSD son información para el simulador (SIMST6.EXE).

Por defecto AST6 crea los ficheros .HEX y .DSD.

Formato del programa fuente :

El formato de fichero fuente .ASM debe de ser de texto ASCII.

Formas :

label LD A,055h ; Carga en el acumulador 05h

----- --------- ----------------------------

etiq. mnémonico. comentario

Campo etiqueta : Cualquier nombre que no sea una palabra reservada.(no va seguido de dos puntos)

Campo mnemónico : Cualquier mnemónico admitido

Comentario : Precedido por (;), lo que le sigue no se tiene en cuenta.

Símbolos y expresiones :

Números : b o B, binarios

o o O, Octales

h o H, hexadecimales

Un número es una cadena de dígitos. Por defecto los números serán decimales.Ej : AFF es un símbolo, 0AFFh es un número.

Caracteres Constantes :

El carácter constante esta representado por un carácter ASCII entre comillas simples (ej: ´a´). El valor del carácter constante es el código ASCII para ese carácter.

Cadenas Constantes :

Son cadenas de caracteres constantes encerrados entre comillas dobles. Si se quiere poner en la cadena las comillas estas deben ir precedidas por la BACKSLASH ( \ ).

DIRECTIVAS DE ENSAMBLADOR :

Una directiva de ensamblador es similar sintácticamente al código de una instrucción máquina, pero esta se usa para la generación del código objeto. Todas las directivas son identificadores que comienzan con un punto. (Ej: tabla .DEF 084h)

- DEFINICION DE DATOS EN EL ESPACIO DE PROGRAMA

a) Directiva .BLOCK

sintaxis : [etiqueta] .BLOCK expresión

Esta directiva reserva un bloque de localizaciones de memoria contiguas en espacio de memoria de programa. La dimensión del bloque es determinada por la expresión en el campo de operando. Si la etiqueta está presente a esta se le asigna la dirección de la primera posición del bloque de memoria. Todos los símbolos de la expresión tienen que haber sido definidos anteriormente.

b) Directiva .WORD

sintaxis : [etiqueta] .WORD expresión,[expresión]

Esta directiva genera sucesivas palabras de código objeto en el espacio de programa. El byte menos significativo se coloca en la dirección inferior y el byte más significativo en la posición mayor. Las expresiones tienen que estar separadas por espacios, tabuladores o comas.

c) Directiva .BYTE

sintaxis : [etiqueta] .BYTE expresión,[expresión]

Esta directiva genera sucesivos bytes de código en el espacio de programa. El valor de la expresión es truncada a los 8 primeros bits.

d) Directiva .ASCII Y .ASCIZ

sintaxis : [etiqueta] .ASCII "cadena"

[etiqueta] .ASCIZ "cadena"

Estas directivas se usan para definir una cadena de caracteres en el espacio de programa, .ASCIZ es igual que .ASCII pero añade un carácter NULL al final de la cadena.

e) Directiva .DEF

sintaxis : [etiqueta] .DEF dirección,[R-MASK],[W-MASK],[V],[M]

Esta directiva define las características de la dirección del espacio de datos. Ej: valor .DEF 084h , asigna a la etiqueta valor la dirección 084h del área de datos.

[M] coloca una marca en el fichero .DSD, esa marca hará que mientras se está simulando el programa en el simulador, la posición definida se visualizara en la ventana de registros. En esa ventana sólo se visualizarán los registros que lleven esa marca.

- DIRECTIVAS DE DEFINICION DE SIMBOLOS

a) Directiva .EQU

sintaxis : [etiqueta] .EQU expresión

Asigna el valor de la expresión a la etiqueta, una vez utilizada esta directiva, la etiqueta ya no puede volver a ser redefinida.

b) Directiva .SET

sintaxis : [etiqueta] .SET expresión

Es muy similar a .EQU, la única diferencia es que una etiqueta definida con .SET puede ser otra vez redefinida con .SET.

c) Directiva .INPUT

sintaxis : .INPUT "name.asm"

Añade al fichero fuente el indicado por .INPUT. Se suele utilizar para añadir a los ficheros fuentes el fichero de definición de registros ya que este es común a todos ellos.

- OTRAS DIRECTIVAS

a) Directiva .DISPLAY

sintaxis : .DISPLAY "cadena"

Durante el ensamblado imprime la cadena en la pantalla.

b) Directiva .END

sintaxis : .END

Ultima directiva del fichero fuente, indica el final. Todas las líneas presentes después de esta directiva son ignoradas.

c) Directiva .ORG

sintaxis : .ORG expresión

Asigna el valor de la expresión al contador de localización. Todos los símbolos que aparezcan en expresión deben haber sido definidos previamente. Esta directiva no funciona con la opción -O del AST6.

d) Directivas .ERROR Y .WARNING

sintaxis : .ERROR "cadena"

.WARNING "cadena"

Generan un mensaje (cadena) en el fichero de errores (-E) o en la salida de errores en pantalla.

- DIRECTIVAS PARA EL USO DEL REGISTRO RDW

a) Directiva .W_ON

sintaxis : .W_ON

Esta directiva debe incluirse en el fichero fuente, si en el espacio de datos existe una ventana de datos constantes.

b) Directivas etiqueta.W y etiqueta.D

sintaxis : etiqueta.W

etiqueta.D

Deben utilizarse si .W_ON ha sido puesta antes.

Ejemplo de su utilización :

.W_ON

tabla .BYTE 0ffh,21h,42h,32h ;Bloque fijo en EPROM

.input "ST6.ASM" ;Entra definición de registros

ldi rdw,tabla.W ;Carga en el registro RDW la ;dirección apropiada para que en ;el área de datos se quede ;representado el bloque de datos ;constantes

ldi x,tabla.D ;Carga en X la dirección de ;memoria RAM donde se encuentra ;el primer valor de la tabla de ;datos (0ffh)

.END

Un programa en el cual hemos utilizado estas directivas de control de RDW es el del control de semáforos.

Las directivas de ensamblado condicional y macros no se especifican por ser su tratamiento complejo y no ser necesarias para este proyecto.

El ST6.EXE (linkador) : LST6 combina los objetos de ST6 creados por separado. Esta especialmente diseñado para soportar a los miembros de la familia ST6 que tienen la memoria paginada. Por ello no lo utilizaremos.

IV-b,II) SIMULADOR ST6

Para utilizar el simulador es mejor añadir al AST6.EXE cuando se va a ensamblar el programa a simular la opción -S, para que el simulador carge el fichero nombre.SYS, es más fácil de seguir la simulación ya que así se visualiza el programa en el simulador con las etiquetas.

El simulador (SIMST6.EXE) simula el funcionamiento del corazón del ST6, (interrupciones,RDW,IOR) y no los periféricos de I/O, ADC, TIMER, y WATCHDOG.

Ahora pasamos a describir brevemente los menús más importantes del simulador en INTERFACE GRAFICO.

- MENU FILE

LOAD : carga ficheros a simular (.HEX, .DSD) y si existe .SYS.

SAVE : salva el contenido de memoria en un fichero.

OPEN LOG OPTION : salva todas las salidas del simulador a un fichero de texto.

CLOSE LOG OPTION : cierra el fichero abierto.

EXIT : sale del simulador.

- MENU WATCH

REGISTER ÄÄÂÄÄÄÄÄ> DISPLAY *1

³

³

ÀÄÄÄÄÄ> DISPLAY WRS *2

*1 DISPLAY : Tiene 3 ventanas, pregunta a partir de que dirección se visualiza el espacio de datos. También se puede cambiar el PC y algunos FLAGS.

*2 DISPLAY WRS : Visualiza todos los registros que estan declarados como de trabajo, es decir con la marca [m] en su definición.

DUMP PROG OPTION : Muestra y modifica el espacio de programa.

ASSEMBLER OPTION : Ensambla y desensambla en un editor en línea.

SYMBOLS OPTION : Visualiza la tabla de símbolos, cargada del fichero .SYS.

WINDOW OPTION : Visualiza un bloque de 64 bytes del espacio de datos.

SEARCH OPTION : Busca bytes en memoria.

TRACE OPTION : Visualiza las últimas instrucciones ejecutadas.

- MENU UTILITY

COMPARE OPTION : Compara 2 bloques de memoria.

MOVE OPTION : Mueve un bloque de memoria a otra dirección.

USE OPTION : Ejecuta los comandos que estan en un fichero .CMD

FILL OPTION : Rellena un bloque de memoria con un patrón.

BASE OPTION : Selecciona la base de conversión (HEX, OCT, DEC).

L.MODE OPTION : Pone el simulador en interface de línea de comandos.

- MENU RUN

GO (CONTINUE) OPTION : Corre el programa donde se quedó el PC.

GO OPTION : Corre el programa a partir de una dirección.

NEXT OPTION : Ejecuta paso a paso.

RESET OPTION : Resetea el STATUS interno del simulador.

SET OPTION : Pone el FULL-TRACE.

- MENU BREAKPOINTS

DISPLAY OPTION : Visualiza todos los modos de BREAKPOINTS si estan abilitados.

PRESET OPTION : Preestablece las opciones de los BREAKPOINTS.

SET/ADDR OPTION : Coloca un breakpoint en una dirección del espacio de datos o de programa.

DELETE/ALL OPTION : Borra todos los BREAKPOINTS.

DEL/ADDR OPTION : Borra BREAKPOINTS de una sola dirección.

BRK ENABLE OPTION : Abilita/Desabilita los BREAKPOINTS.

- MENU CONF

Muestra los tiempos de usuario y sistema y el estado de las interrupciones.


V-PLACA DE DESARROLLO ST6V-PLACA DE DESARROLLO ST6

V-a) EL PORQUÉ

La placa de desarrollo del ST6 nació por la necesidad de un sistema con el cual se pudieran montar practicas con el microcontrolador de una manera rápida y sencilla, además de evitar la rotura de los pines del ST6 en el momento de insertar y sacar el ST6 de la BOARD. Una vez nacida la idea surgió la posibilidad de poder aprovechar todas las utilidades de PROMAX utilizadas anteriormente con el Z80, para esto se decidió el colocar el conector adecuado con el patillaje del PIO del equipo TM-801 de PROMAX. Otra opción recogida fue la de dotar a la placa de su propia fuente de alimentación estabilizada para aplicaciones digitales. Con todas estas premisas se diseño el circuito descrito a continuación.

V-b) ESQUEMAS Y DESCRIPCIÓN

El esquema esta claramente dividido en 3 partes que son, la fuente de alimentación, los switches y leds y por ultimo el microcontrolador.

La fuente de alimentación: Es una fuente de alimentación de tensión fija de 5V y que es capaz de proporcionar hasta 1 amperio de corriente. El transformador es un transformador en encapsulado de resina que transforma los 220V de red en 12V, la máxima corriente que es capaz de soportar es 1 amperio. Para el rectificador se opto por un PUENTE DE WIEN encapsulado, por su mayor facilidad de reparación y de montaje frente a los 4 diodos tradicionales, Es capaz de soportar la corriente de un amperio. El filtro esta constituido por C5 que es un condensador electrolitico de 4.500mF. La etapa estabilizadora y reguladora esta basada en el popular 7805 que es un regulador de tensión positiva de 5V capaz de proporcionar 1 Amperio, para la máxima corriente es recomendable dotar al integrado de su correspondiente radiador, ya que al estar dotado de un protector contra sobrecalentamiento sin el radiador no podrá proporcionar la corriente adecuada, C3 y C4 son recomendados por el fabricante del 7805. El led D10 tiene como función indicarnos si el sistema esta conectado a la red R2 tiene como función limitar la corriente que pasa por D10.

Switches y leds: Tienen como función el poder comprobar mediante sencillos cableados el correcto funcionamiento de un programa en caso de no poder disponer del sistema a controlar. Los switches tienen como función la de poder simular sensores, están constituidos por una tira de conector de 10 pines (8 para los dips y dos para alimentación) un circuito buffer 74HC245 configurado par que los datos pasen de A a B, de 1 pack de 8 resistencias y de los dips, las resistencias tienen como fin el asegurar el 1 cuando los dip estén abierto y limitar la corriente cuando los dips estén cerrados.

Los leds tienen como función visualizar los datos de los controles de mando, esta constituido por una tira de conector de 8 pines, de un circuito de buffers configurado para que los datos pasen de A a B ,de un pack de resistencias para limitar la corriente de los led y de 8 led para visualizar los datos.

Parte principal: Esta constituida por un zócalo de fuerza de inserción nula, de un circuito de RESET, del oscilador, de una tira de conectores de 22 pins y de un conector de 50 patillas.

El zócalo de fuerza 0 corresponde a U1, en el esquema apararece como un ST62E15 para evitar los posibles errores de conexión de patillas, hay que advertir que solo vale esta placa para los encapsulados de 28 patillas, el circuito de reset funciona de dos maneras al encender la alimentación y al pulsar el pulsador, el circuito oscilador esta diseñado para la frecuencia de oscilación de 8 Mhz a la cual puede funcionar cualquier miembro de la familia ST6. Mediante la tira de pins se puede acceder a todas las líneas del ST6 excepto al reset, oscin y oscout además de a las alimentaciones. El conector de 50 patillas conserva la distribución del PIO del TM801, a este conector van solamente los puertos A y B del ST6, además de la masa.

Sobre la placa de circuito impreso existe sitio suficiente para la colocacion de dos placas tipo board.

Los esquemas y fotolitos se encuentran en las dos páginas siguientes.

V-c) PRACTICAS CON PLACA Y SUBRUTINAS ÚTILES

A continuación están la totalidad de programas realizados que han sido simulados, también hay algunas subrutinas útiles.(NOTA: en el comienzo de cada programa hay que definir los registros)

;****************************************************************************

;******* Proyecto de Practicas ST6 *******

;******* *******

;******* Programa : Convierte en BCD un numero de 8 bits *******

;******* ******* ;******* *******

;******* José Ignacio Díaz Beamud & Jesús Antonio Alquezar Sierra *******

;******* *******

;****************************************************************************

;Convierte en BCD un número de 8 bits, el número a convertir se encuentra en

;'nn' (86h) y el resultado se deposita en datal (número bajo),datam (número

;medio ),datah (número alto)

datal .def 84h,0ffh,0ffh ;Parte baja del resultado (BCD)

datam .def 85h,0ffh,0ffh ;Parte media del resultado (BCD)

datah .def 86h,0ffh,0ffh ;Parte alta del resultado (BCD)

nn .def 86h,0ffh,0ffh ;Número a convertir en posición 86h

conver ldi datal,00

ldi datam,00

ldi datah,00 ;Pone a 0 las posiciones del resultado

ldi a,nn ;Carga en A el número a convertir

sal2 cpi a,100 ;Y lo compara con 100

jrc sal1 ;Si es menor (nn<100) salta a sal1

subi a,100 ;De lo contrario resta a A 100

inc datah ;Y incrementa datah

jp sal2 ;Salta a sal2

sal1 cpi a,10 ;Compara A con 10

jrc sal3 ;Si es menor (nn<10) salta a sal3

subi a,10 ;De lo contrario resta a A 10

inc datam ;Y incrementa datam

jp sal1 ;Salta a sal1

sal3 ld datal,a ;El resultado restante (unidades) se deja en datal

; ³³ ³³ ³³ ³³ ³³

; \/ \/ \/ \/ \/

;

;****************************************************************************

;******* Proyecto de Practicas ST6 *******

;******* *******

;******* Programa : Convierte en BCD un numero de 9 bits *******

;******* *******

;******* *******

;******* José Ignacio Díaz Beamud & Jesús Antonio Alquezar Sierra *******

;******* *******

;****************************************************************************

;Convierte un número de 9 bits (resultado de multiplicar uno de 8bits * 2)

;en BCD.Este módulo se puede emplear para convertir el resultado del

;convertidor A/D (ya debidamente multiplicado por 2 sólo si VCC = 5V) a BCD

;y poder sacar el resultado a visualizadores 7 segmentos.

datch .def 84h,0ffh,0ffh ;Parte alta del número a convertir

datcl .def 85h,0ffh,0ffh ;Parte baja del número a convertir

datal .def 86h,0ffh,0ffh ;Parte baja del resultado (BCD)

datam .def 87h,0ffh,0ffh ;Parte media del resultado (BCD)

datah .def 88h,0ffh,0ffh ;Parte alta del resultado (BCD)

conv9b ldi datal,00

ldi datam,00

ldi datah,00 ;Pone a 0 las posiciones del resultado

jrr 0,datch,sal1 ;Salta a sal1 si el bit 0 del datch es 0

ldi datal,6 ;De lo contrario el resultado ya es como mínimo

ldi datam,5 ;256 ya que 2^(9­1)=256

ldi datah,2

sal1 ld a,datcl ;Carga en A la parte baja del dato a convertir

sal3 cpi a,100 ;La compara con 100

jrc sal2 ;Si es menor salta a sal2 (datcl<100)

subi a,100 ;De lo contrario restale 100

inc datah ;Y incrementa datah

jp sal3 ;Salta a sal3

sal2 cpi a,10 ;Compara A con 10

jrc sal4 ;Y si este es menor (A<10) salta a sal4

subi a,10 ;De lo contrario resta a A 10

inc datam ;Incrementa datam

jp med ;Salta a med

sal4 jp sa ;Salta a sa

jrr 3,datam,sal5 ;Salta a sal5 si el bit 3 de datam es 0

jrr 1,datam,sal5 ;O si el bit 1 de datam es 0

;Verifica si datam es igual a 9

ldi datam,0 ;De lo contraria pon a 0 datam

inc datah ;Y incrementa datah

sal5 jp sal2 ;Salta a sal2

sa add a,datal ;Suma a A datal

ld datal,a ;Y lo lleva a datal

cpi a,10 ;Lo compara con 10

jrc sa2 ;Si es menor salta a sa2 (A<10)

subi a,10 ;Resta a A 10

ld datal,a ;Y lleva A a datal

jp p1 ;Salta a p1

sa2 jp sal6 ;Salta a sal6

p1 inc datam ;Incrementa datam

jrr 3,datam,sal6 ;Salta a sal6 si el bit 3 de datam es 0

jrr 1,datam,sal6 ;O si el bit 1 de datam es 0

;Verifica si datam es igual a 9

ldi datam,0 ;Pon datam a 0

inc datah ;Incrementa datah

sal6 nop ;No opera

nop ;No opera

; ³³ ³³ ³³ ³³ ³³

; \/ \/ \/ \/ \/

;



;****************************************************************************

;******* Proyecto de Practicas ST6 *******

;******* *******

;******* Programa : Convertidor de A/D a valor V correspondiente *******

;******* *******

;******* *******

;******* José Ignacio Díaz Beamud & Jesús Antonio Alquezar Sierra *******

;******* *******

;****************************************************************************

;Despues de una conversión del A/D el resultado de ADR se multiplica por 2

;Para obtener el resultado en voltios de la conversión.

;Esto sólo sera aplicable si VCC = 5V ya que de esta forma la escala de

;Conversión son más o menos 0.02V

;El resultado podrá ser un número de 9 bits

datah .def 084h,0ffh,0ffh ;Parte alta del resultado

datal .def 085h,0ffh,0ffh ;Parte baja del resultado

ca/d ldi datah,0 ;Pone datah a 0

ld a,adr ;Carga el resultado de la conversión en A

sla a ;y lo multiplica por 2

jrnc sal1 ;Si no hay carry salta a sal1

inc datah ;De lo contraria pon datah a 1

sal1 ld datal,a ;Y lleva A (multiplicado por 2) a datal

nop ;No opera

nop ;No opera

; ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³

; \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/

;

;***** DEFINE REGISTROS

;***** Utilizar con .INPUT

x .def 80h,m

y .def 81h,m

v .def 82h,m

w .def 83h,m

a .def 0ffh,m

drpa .def 0c0h,m

drpb .def 0c1h,m

drpc .def 0c2h,m

ddrpa .def 0c4h,m

ddrpb .def 0c5h,m

ddrpc .def 0c6h,m

ior .def 0c8h,m

rdw .def 0c9h,m

orpa .def 0cch,m

orpb .def 0cdh,m

orpc .def 0ceh,m

adr .def 0d0h,m

adcr .def 0d1h,m

psc .def 0d2h,m

tcr .def 0d3h,m

tscr .def 0d4h,m

wdr .def 0d8h,m

;******************* Temporizador de undidad de 1 segundo

;******************* El número de segundos se cargan en el acumulador

;******************* entonces si el acumulador es 0 sale temporizador

segundos .equ 01h

reset reti

sal3 ldi a,segundos

jrnz inic

jp fin

inic ldi v,0ach

sal2 ldi w,0ffh

sal1 nop

nop

nop

nop

dec w

jrnz sal1

dec v

jrnz sal2

dec a

jrz fin

jp sal3

fin nop

nop

; ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³

; \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/

;



;******************* Temporizador de undidad de 1 segundo para watchdog HWD

;******************* El número de segundos se cargan en el acumulador

;******************* entonces si el acumulador es 0 sale temporizador

segundos .equ 01h

reset reti

sal3 ldi a,segundos

jrnz inic

jp fin

inic ldi v,0ach

sal2 ldi w,0ffh

sal1 ldi wdr,0feh

nop

nop

dec w

jrnz sal1

dec v

jrnz sal2

dec a

jrz fin

jp sal3

fin nop

nop

; ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³ ³³

; \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/

;



;***** VECTORES ****************************************************

.org 0ff0h

adc nop ;Vector conv. A/D

reti

timer nop ;Vector del timer

reti

int2 nop ;Vector de PB y PC

reti

int1 nop ;Vector de PA

reti

.org 0ffch

nmi nop ;Vector de NMI

reti

res jp reset ;Vector de RESET

.end

Programas realizados para la placa de desarrollo

;******************************************************************

;******* Programa para ST6215 *******

;******* *******

;******* Entra un dato por PA y lo saca seguidamente por PB *******

;******* *******

;******************************************************************

;***** Define Registros ********************************************

.input "st6.asm"

;***** Define puertos ********************************************

;***** PA(ent) y PB(sal) *******************************************

.org 0880h

reset reti ;Retorna a modo normal desues del reset

ldi ddrpa,0h

ldi orpa,0h

ldi drpa,0h ;El puerto A es configurado como entrada

ldi ddrpb,0ffh

ldi orpa,0ffh

ldi drpa,0ffh ;Y el puerto B como salida

;***** RUTINA PRINCIPAL ********************************************

inicio ld a,drpa ;Carga lo que hay en los pines de PA en A

ld drpb,a ;Para sacarlos por PB

jp inicio ;Repite BUCLE

;***** VECTORES ****************************************************

.org 0ff0h

adc nop ;Vector conv. A/D

reti

timer nop ;Vector del timer

reti

int2 nop ;Vector de PB y PC

reti

int1 nop ;Vector de PA

reti

.org 0ffch

nmi nop ;Vector de NMI

reti

res jp reset ;Vector de RESET

.end


;****************************************************************************

;******* Proyecto de Practicas ST6 *******

;******* *******

;******* Programa : Control de motor PASO A PASO *******

;******* *******

;******* *******

;******* José Ignacio Díaz Beamud & Jesús Antonio Alquezar Sierra *******

;****************************************************************************

;

.display "Control de motor paso a paso (J.Ignacio Diaz y J.Antonio Alquezar)"

;Puerto B como salida (4 lineas de menor peso)

;Puerto A linea PA7 como entrada con interrupción

;El resto de lineas de puertos PA,PB y PC quedan en estado de alta impedancia

;Si se produce una NMI la salida TIMER se activa intermitentemente un tiempo

.input "st6.asm" ;Entra fichero de definición de registros

.org 800h ;Ensambla a partir de la 800h

veces .def 84h,0ffh,0ffh ;Define la posición 84h de datos como 'veces'

tempo .def 85h,0ffh,0ffh ;Define la posición 85h de datos como 'tempo'

segun .def 86h,0ffh,0ffh ;Define la posición 86h de datos como 'segun'

reset ldi wdr,0feh ;Recarga el watchdog

reti ;Retorna de interrupción despues del reset

ldi ddrpa,0

ldi orpa,10000000b

ldi drpa,01111111b ;Programa PA7 como interrupción y demás HI­Z

ldi ddrpb,00001111b

ldi orpb,00001111b

ldi drpb,11110000b ;Progrma PB3 a PB0 como salidas y demás HI­Z

ldi ior,00110000b ;Abilita interrupciones

ldi wdr,0feh ;Recarga el watchdog

re1 ldi wdr,0feh ;Recarga el watchdog y entra en un bucle cerrado

jp re1 ;Y entra en un bucle cerrado

;Hasta que se produce un interrupción en PA

;y entonces salta a re2

;**** Subrutina de antención de PA ******************************************

;**** Ahora el motor dara una vuelta en un sentido **************************

re2 ldi veces,48 ;Carga la posición veces con 48 pasos( 1 vuelta)

re3 ldi a,0f8h

ld drpb,a ;Saca a las 4 lineas de menor peso de PB un 0

;las cuatro superiores en HI­Z

call tem ;LLama a un temporizador

ldi a,0fah

ld drpb,a ;Saca a las 4 lineas de menor peso de PB un 2

;las cuatro superiores en HI­Z

call tem ;LLama a un temporizador

dec veces ;Decrementa la posición veces (n.de pasos)

jrnz re3 ;Si no es cero salta a re3 de lo contrario sigue

;**** El motor a dado una vuelta y ahora la dara en sentido contrario *******

ldi veces,48 ;Carga la posición veces con 48 pasos( 1 vuelta)

re4 ldi a,0f9h

ld drpb,a ;Saca a las 4 lineas de menor peso de PB un 1

;las cuatro superiores en HI­Z

call tem ;LLama a un temporizador

ldi a,11111011b

ld drpb,a ;Saca a las 4 lineas de menor peso de PB un 3

;las cuatro superiores en HI­Z

call tem ;LLama a un temporizador

dec veces ;Decrementa la posición veces (n.de pasos)

jrnz re4 ;Si no es cero salta a re3 de lo contrario sigue

ldi a,0f0h

ld drpb,a ;Pone la salida de PB=0 (4 lineas de menor peso)

reti ;Retorna de interrupción,despues de dar 1 vuelta

;**** Subrutina de atención a NMI *******************************************

inmi ldi segun,6 ;Intermitente 6 veces

inmi2 ldi tempo,20 ;Carga 'veces' con 20 (20 * 0.04892 = 0.978 sg)

sal1 ldi tcr,0ffh ;Carga contador con 255 (valor máximo)

ldi tscr,00111111b ;Pone el preescaler a 128 y DOUT a 1

;La temporización es máxima = 0.04892 sg

loop1 jrr 7,tscr,loop1 ;Espera a que el contador llege a 0

dec tempo ;Decrementa 'tempo'

jrnz sal1 ;Repite hasta que 'tempo' = 0

ldi tempo,20

sal2 ldi tcr,0ffh

ldi tscr,00101111b ;Hace lo mismo que el bloque anterior escepto

;que ahora DOUT = 0,También temporiza 0.978 sg.

loop2 jrr 7,tscr,loop2

dec tempo

jrnz sal2

dec segun ;Decrementa segun

jrz sal3 ;Si es 0 salta a sal3

jp inmi2 ;De lo contrario a inmi (repite)

sal3 reti ;Si había sido 0 retorna de interrupción

;**** Temporizador **********************************************************

tem ldi v,0ffh

tem1 ldi wdr,0feh ; \

tem2 nop ; |

nop ; |­­­­> Bucle

nop ; |

dec v ; /

jrnz tem1 ;Repite el bucle 255 veces

ret ;Retorno de subrutina

;***** VECTORES ****************************************************

.org 0ff0h

adc nop ;Vector conv. A/D

reti

timer nop ;Vector del timer

reti

int2 nop ;Vector de PB y PC

reti

int1 jp re2 ;Vector de PA

.org 0ffch

nmi jp inmi ;Vector de NMI

res jp reset ;Vector de RESET

.end

; Versión con uso de directivas (pp_on y section) **********

;*** ******************************************************* ***

;*** José Ignacio Díaz Beamud & Jesús Antonio Alquezar **** ***

;*** ******************************** ST­6 SGS­THOMSON ***** ***

;­­­ ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ ­­­

;*** Ordena tabla en orden posicion mas alta valor menor *** ***

;*** ******************************************************* ***

.PP_on

.pl 60

.vers "st6215"

.romsize 2

.input "6215_reg.asm"

;*** Define etiquetas ********************************** ***

nfin .def 90h

adat .def 91h

;*** Programa principal ******************************** ***

.section 1

.org 080h

reset reti ;Coloca NMI a 0 despues del reset

ldi w,0ah ;Carga primer contador con 0Ah (longitud tabla)

inibu ldi y,0ah ;Carga segundo contador con 0Ah (longitud tabla)

ldi nfin,00h ;Pone posicion 090h a 00

ldi x,084h ;Carga puntero X con inicio tabla

sal2 ld a,(x) ;Carga en A el numero que apunta X

inc x ;Incrementa X

cp a,(x) ;Compara A con la posicion que indica X actualmente

jrz sal1 ;Si la comparacion es 0 salta

jrnc sal1 ;Si no hay carry tambien salta

ld v,a ;En caso contrario intercambiar,salvaguarda A en V

ld a,(x) ;Carga en A el numero que apunta X

dec x ;Decrementa X

ld (x),a ;Carga A en la direccion indicada por el puntero

inc x ;Vuelve a incrementar X

ld a,v ;Devuelve el antiguo valor a A

ld (x),a ;Y lo deposita en la direccion que apunta X

jp sal3 ;Salto fin de intercambio

sal1 inc nfin ;Tratamiento no intercambio,incrementa (090h)

ld adat,a ;Salva el valor de A en (091h)

jp inter2 ;Salto intermedio

inter jp sal2 ;Salto intermedio

inter2 ld a,nfin ;Coge el valor contenido en (090h)

jp inter4 ;Salto intermedio

inter3 jp inibu ;Salto intermedio

inter4 cpi a,0ah ;Compara A con longitud tabla,el contenido de (090h)

;contiene las veces que no se encuentra desorden en la

;tabla por cada escaneo,si la posicion llega a 0A

;significa que la tabla esta ya ordenada y no es

;necesario continuar el programa

jrz fin ;Si (090h) es igual a 0A acaba programa

ld a,adat ;Recupera valor de A

sal3 dec y ;Decrementa Y (primer bucle)

jrnz inter ;Si no es 0 repite

dec w ;De lo contrario decrementa W (segundo bucle)

jrnz inter3 ;Si no es 0 repite

fin nop ;NO OPERA

stop ;STOP

;************************************* Sección de vector interrupciones ****

.section 32

.org 0eh

res jp reset ;Vector de RESET

.end

; Versión con directivas ORG (definición mapa vectores)

;*** ******************************************************** ***

;*** José Ignacio Díaz Beamud & Jesús Antonio Alquezar Sierra ***

;*** ******************************** ST­6 SGS­THOMSON ****** ***

;­­­ ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ ­­­

;*** Ordena tabla en orden posicion mas alta valor menor **** ***

;*** ******************************************************** ***

.input "6215_reg.asm"

;*** Define etiquetas ********************************** ***

nfin .def 90h

adat .def 91h

;*** Programa principal ******************************** ***

.org 0800h

reset reti ;Coloca NMI a 0 despues del reset

ldi w,0ah ;Carga primer contador con 0Ah (longitud tabla)

inibu ldi y,0ah ;Carga segundo contador con 0Ah (longitud tabla)

ldi nfin,00h ;Pone posicion 090h a 00

ldi x,084h ;Carga puntero X con inicio tabla

sal2 ld a,(x) ;Carga en A el numero que apunta X

inc x ;Incrementa X

cp a,(x) ;Compara A con la posicion que indica X actualmente

jrz sal1 ;Si la comparacion es 0 salta

jrnc sal1 ;Si no hay carry tambien salta

ld v,a ;En caso contrario intercambiar,salvaguarda A en V

ld a,(x) ;Carga en A el numero que apunta X

dec x ;Decrementa X

ld (x),a ;Carga A en la direccion indicada por el puntero

inc x ;Vuelve a incrementar X

ld a,v ;Devuelve el antiguo valor a A

ld (x),a ;Y lo deposita en la direccion que apunta X

jp sal3 ;Salto fin de intercambio

sal1 inc nfin ;Tratamiento no intercambio,incrementa (090h)

ld adat,a ;Salva el valor de A en (091h)

jp inter2 ;Salto intermedio

inter jp sal2 ;Salto intermedio

inter2 ld a,nfin ;Coge el valor contenido en (090h)

jp inter4 ;Salto intermedio

inter3 jp inibu ;Salto intermedio

inter4 cpi a,0ah ;Compara A con longitud tabla,el contenido de (090h)

;contiene las veces que no se encuentra desorden en la

;tabla por cada escaneo,si la posicion llega a 0A

;significa que la tabla esta ya ordenada y no es

;necesario continuar el programa

jrz fin ;Si (090h) es igual a 0A acaba programa

ld a,adat ;Recupera valor de A

sal3 dec y ;Decrementa Y (primer bucle)

jrnz inter ;Si no es 0 repite

dec w ;De lo contrario decrementa W (segundo bucle)

jrnz inter3 ;Si no es 0 repite

fin nop ;NO OPERA

stop ;STOP

;************************************* Sección de vector interrupciones ****

.org 0ffeh

res jp reset ;Vector de RESET

.end

; ***************************************************************

; ** ****** ****** Control de Semaforo para ST­6 ****** ****** **

; ***************************************************************

; Semaforo para ST6215

; Por José Ignacio Diaz Beamud & Jesús Antonio Alquezar

;*****************************************************************************

.input "st62.asm" ;Define registros

.W_ON ;Abilita el trabajo con RDW

num .def 084h,0ffh,0ffh ;Define num como posición 84h de datos

;***************************************************** Tabla de datos **

.org 800h

datos .byte 00110001b,00101111b,00110001b,0fh,00110001b,00101111b

.byte 00110001b,0fh,01010001b,00101111b,10010010b,11001111b

.byte 10010010b,11011111b,10010010b,11001111b

.byte 10010010b,11011111b,10010010b,11001111b,10010010b,11011111b

.byte 10010010b,11001111b,10010010b,11011111b,10010010b,11001111b

.byte 10000100b,11001111b,10000100b,01001111b,10000100b,11001111b

.byte 10000100b,01001111b,10000100b,11001111b,10001001b,01001111b

tempo .byte 7,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1

;****************************** Rutina de inicio y programacion de puertos **

reset ldi wdr,0feh ;Carga el wathchdog con su valor máximo

reti ;Retorna al modo normal despues del reset

ldi ior,10h ;Desabilita todas las interrupciones

ldi rdw,datos.w ;Pone en el RDW el valor apropiado

ldi ddrpa,0ffh ;Programa el puerto A como salida y saca 00

ldi orpa,0ffh

ldi drpa,00

ldi ddrpb,0f0h ;Programa el puerto B como salida y las lineas de

ldi orpb, 0f0h ;interruptores quedan en alta impedancia

ldi drpb, 00fh

;************************************** Programa principal ******************

s2 ldi num,20 ;Carga en la posicion num el numero de estados

ldi x,datos.d ;Carga en X el valor apropiado de puntero

ldi y,tempo.d ;Carga en Y el valor apropiado de puntero

s1 ld a,(x) ;Carga lo que hay en la posicion apuntada por X en A

ld drpa,a ;y lo lleva al puerto A de datos

inc x ;Incrementa el puntero X

ld a,(x) ;y lleva el siguiente dato al acumulador

ld drpb,a ;para llevarlo al puerto B de datos (hay que tener

;cuidado ya que los 4 bits menos significativos

;tienen que estar a 1 para mantener el estado de

;alta impedancia de esas lineas)

ld a,(y) ;Carga en A el tiempo a temporizar

call temp ;Y llama a subrutina de temporización

inc x ;Incrementa puntero X

inc y ;Incrementa puntero Y

dec num ;Decrementa el número de estados

jrnz s1 ;Si no es 0 repite el bucle

jp s2 ;Si es 0 comienza de nuevo

;********************************************** Subrutina temporizador ******

temp jrnz inic

jp fin

inic ldi v,0ach

sal2 ldi w,0ffh

sal1 ldi wdr,0feh ;Recarga el WATCHDOG para que no llege a ser 0

nop ;y se produzca un reset

nop

dec w

jrnz sal1

dec v

jrnz sal2

dec a

jrz fin

jp temp

fin ret

;*********************** Subrutina atención a NMI(estado avería)****

inmi ldi ior,00

ldi wdr,0feh

ldi rdw,datos2.w

is2 ldi num,2 ;Carga en la posicion num el numero de estados

ldi x,datos2.d ;Carga en X el valor apropiado de puntero

ldi y,tempo2.d ;Carga en Y el valor apropiado de puntero

is1 ld a,(x) ;Carga lo que hay en la posicion apuntada por X en A

ld drpa,a ;y lo lleva al puerto A de datos

inc x ;Incrementa el puntero X

ld a,(x) ;y lleva el siguiente dato al acumulador

ld drpb,a ;para llevarlo al puerto B de datos (hay que tener

;cuidado ya que los 4 bits menos significativos

;tienen que estar a 1 para mantener el estado de

;alta impedancia de esas lineas)

ld a,(y) ;Carga en A el tiempo a temporizar

call temp ;Y llama a subrutina de temporización

inc x ;Incrementa puntero X

inc y ;Incrementa puntero Y

dec num ;Decrementa el número de estados

jrnz is1 ;Si no es 0 repite el bucle

jp is2 ;Si es 0 comienza de nuevo

datos2 .byte 01001000b,10101111b,0,10111111b

tempo2 .byte 1,1

;***** VECTORES ****************************************************

.org 0ff0h

adc nop ;Vector conv. A/D

reti

timer nop ;Vector del timer

reti

int2 nop ;Vector de PB y PC

reti

int1 nop ;Vector de PA

reti

.org 0ffch

nmi jp inmi ;Vector de NMI

res jp reset ;Vector de RESET

.end


pagina finalizada 27/3/1997