<HTML> <HEAD> <TITLE>CARACTERISTICAS DEL ST6</TITLE> <META NAME="GENERATOR" CONTENT="Internet Assistant for Microsoft Word 2.0z"> </HEAD> <BODY> <P> <TT><B><FONT SIZE=2 FACE="Courier">I-INTRODUCCION AL PROYECTO Y MICROCONTROLADORES</FONT></B></TT> <P> <TT><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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. <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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. <BR> <BR> <B>II-EL ST6</B></FONT></TT> <P> <TT><FONT FACE="Courier">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 : <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">- CPU de 8 bits</FONT></TT> <P> <TT><FONT FACE="Courier">- Rango de alimentación de 3V a 6V</FONT></TT> <P> <TT><FONT FACE="Courier">- Reloj a 8Mhz</FONT></TT> <P> <TT><FONT FACE="Courier">- 5 Vectores de interrupción</FONT></TT> <P> <TT><FONT FACE="Courier">- 2K o 4K de memoria PROM/EPROM</FONT></TT> <P> <TT><FONT FACE="Courier">- RAM 64 bytes</FONT></TT> <P> <TT><FONT FACE="Courier">- 12/20 Patillas de I/O, programables como :<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">- Entradas con resistencia PULL-UP</FONT></TT> <P> <TT><FONT FACE="Courier">- Entradas sin resistencia PULL-UP</FONT></TT> <P> <TT><FONT FACE="Courier">- Entradas con interrupción</FONT></TT> <P> <TT><FONT FACE="Courier">- Salidas en colector abierto</FONT></TT> <P> <TT><FONT FACE="Courier">- Entradas analógicas<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">- 4 líneas de I/O pueden sacar una corriente de 10mA</FONT></TT> <P> <TT><FONT FACE="Courier">para atacar directamente leds</FONT></TT> <P> <TT><FONT FACE="Courier">- Contador de 8 bits con un preescaler de 7 bits</FONT></TT> <P> <TT><FONT FACE="Courier">- Timer/Watchdog digital</FONT></TT> <P> <TT><FONT FACE="Courier">- Convertidor A/D de 8 bits</FONT></TT> <P> <TT><FONT FACE="Courier">- Una interrupción NMI externa</FONT></TT> <P> <TT><FONT FACE="Courier">- STACK (LIFO) de 6 niveles</FONT></TT> <P> <TT><FONT FACE="Courier">- 9 modos de direccionamiento</FONT></TT> <P> <TT><FONT FACE="Courier">- Oscilador integrado en el circuito</FONT></TT> <P> <TT><FONT FACE="Courier">- RESET automático tras conexión de alimentación<BR> <BR> <BR> </FONT></TT> <P> <TT><B><FONT SIZE=2 FACE="Courier">II-a) FAMILIA ST6</FONT></B></TT> <P> <TT><FONT FACE="Courier">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. <BR> <BR> </FONT></TT> <P> <CENTER><BODY BACKGROUND="../fondo.jpg"></CENTER><CENTER> <TABLE BORDER=2> <TR><TD WIDTH=97><BR> <TT><FONT FACE="Courier">Tipo </FONT></TT> <P> <TT><FONT FACE="Courier">ST6</FONT></TT> </TD><TD WIDTH=85><BR> <TT><FONT FACE="Courier">EPROM<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">Kbytes</FONT></TT> </TD><TD WIDTH=75><BR> <TT><FONT FACE="Courier">RAM <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">Bytes</FONT></TT> </TD><TD WIDTH=85><BR> <TT><FONT FACE="Courier">Líneas<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">I/O</FONT></TT> </TD><TD WIDTH=85><BR> <TT><FONT FACE="Courier">Alta</FONT></TT> <P> <TT><FONT FACE="Courier">Intens</FONT></TT> <P> <TT><FONT FACE="Courier">10mA</FONT></TT> </TD><TD WIDTH=75><BR> <TT><FONT FACE="Courier">Num.</FONT></TT> <P> <TT><FONT FACE="Courier">Canal</FONT></TT> <P> <TT><FONT FACE="Courier">A/D</FONT></TT> </TD><TD WIDTH=91><BR> <TT><FONT FACE="Courier">Ext.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">Inter.</FONT></TT> </TD></TR> <TR><TD WIDTH=97><BR> <TT><FONT FACE="Courier">ST62E10</FONT></TT> </TD><TD WIDTH=85><BR> <TT><FONT FACE="Courier">2K</FONT></TT> </TD><TD WIDTH=75><BR> <TT><FONT FACE="Courier">64</FONT></TT> </TD><TD WIDTH=85><BR> <TT><FONT FACE="Courier">12</FONT></TT> </TD><TD WIDTH=85><BR> <TT><FONT FACE="Courier">4</FONT></TT> </TD><TD WIDTH=75><BR> <TT><FONT FACE="Courier">8</FONT></TT> </TD><TD WIDTH=91><BR> <TT><FONT FACE="Courier">13</FONT></TT> </TD></TR> <TR><TD WIDTH=97><BR> <TT><FONT FACE="Courier">ST62E15</FONT></TT> </TD><TD WIDTH=85><BR> <TT><FONT FACE="Courier">2K</FONT></TT> </TD><TD WIDTH=75><BR> <TT><FONT FACE="Courier">64</FONT></TT> </TD><TD WIDTH=85><BR> <TT><FONT FACE="Courier">20</FONT></TT> </TD><TD WIDTH=85><BR> <TT><FONT FACE="Courier">4</FONT></TT> </TD><TD WIDTH=75><BR> <TT><FONT FACE="Courier">16</FONT></TT> </TD><TD WIDTH=91><BR> <TT><FONT FACE="Courier">21</FONT></TT> </TD></TR> <TR><TD WIDTH=97><BR> <TT><FONT FACE="Courier">ST62E20</FONT></TT> </TD><TD WIDTH=85><BR> <TT><FONT FACE="Courier">4K</FONT></TT> </TD><TD WIDTH=75><BR> <TT><FONT FACE="Courier">64</FONT></TT> </TD><TD WIDTH=85><BR> <TT><FONT FACE="Courier">12 </FONT></TT> </TD><TD WIDTH=85><BR> <TT><FONT FACE="Courier">4</FONT></TT> </TD><TD WIDTH=75><BR> <TT><FONT FACE="Courier">8</FONT></TT> </TD><TD WIDTH=91><BR> <TT><FONT FACE="Courier">13</FONT></TT> </TD></TR> <TR><TD WIDTH=97><BR> <TT><FONT FACE="Courier">ST62E25</FONT></TT> </TD><TD WIDTH=85><BR> <TT><FONT FACE="Courier">4K</FONT></TT> </TD><TD WIDTH=75><BR> <TT><FONT FACE="Courier">64</FONT></TT> </TD><TD WIDTH=85><BR> <TT><FONT FACE="Courier">20</FONT></TT> </TD><TD WIDTH=85><BR> <TT><FONT FACE="Courier">4</FONT></TT> </TD><TD WIDTH=75><BR> <TT><FONT FACE="Courier">16 </FONT></TT> </TD><TD WIDTH=91><BR> <TT><FONT FACE="Courier">21</FONT></TT> </TD></TR> </TABLE> </CENTER> <P> <TT><FONT FACE="Courier">* 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 :<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">- Convertidor A/D</FONT></TT> <P> <TT><FONT FACE="Courier">- Timer, temporizador</FONT></TT> <P> <TT><FONT FACE="Courier">- Líneas de puertos I/O</FONT></TT> <P> <TT><FONT FACE="Courier">- Digital Watchdog/Timer<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">* Descripción de patillas :<BR> </FONT></TT> <P> <CENTER><IMG SRC="IMG00002.GIF" ALT="Vista de las patillas" ALIGN="ABSMIDDLE"></CENTER> <P> <TT><I><FONT SIZE=2 FACE="Courier">Vdd y Vss :</FONT></I><FONT FACE="Courier"> 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.<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">Oscin y Oscout :</FONT></I><FONT FACE="Courier"> 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.<BR> </FONT></TT> <HR> <P> <IMG SRC="IMG00003.GIF"> <P> <TT><FONT FACE="Courier">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.</FONT></TT> <P> <TT><FONT FACE="Courier">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. <BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">Reset :</FONT></I><FONT FACE="Courier"> Esta patilla a nivel bajo produce un reset en el microcontrolador. <BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">Test/Vpp :</FONT></I><FONT FACE="Courier"> 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. <BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">NMI :</FONT></I><FONT FACE="Courier"> 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.<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">Timer :</FONT></I><FONT FACE="Courier"> Esta patilla es una línea I/O, esta patilla al igual que la línea NMI no tiene conectada al positivo una resistencia </FONT></TT> <P> <TT><FONT FACE="Courier">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.<BR> <BR> <BR> <I>PA0-PA3, PA4-PA7 :</I> Estas 8 líneas conforman las líneas del </FONT></TT> <P> <TT><FONT FACE="Courier">puerto A, son programables independientemente como :<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">1. Entrada, con o sin resistencia al positivo</FONT></TT> <P> <TT><FONT FACE="Courier">2. Entrada con interrupción mascarable</FONT></TT> <P> <TT><FONT FACE="Courier">3. Salida en colector abierto o también en PUSH-PULL<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">PB0-PB7 :</FONT></I><FONT FACE="Courier"> Estas líneas conforman el puerto B, son programables independientemente como :<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">1. Entrada, con o sin resistencia al positivo</FONT></TT> <P> <TT><FONT FACE="Courier">2. Entrada con interrupción mascarable</FONT></TT> <P> <TT><FONT FACE="Courier">3. Salida en colector abierto o también en PUSH-PULL</FONT></TT> <P> <TT><FONT FACE="Courier">4. Entrada analógica para el convertidor A/D<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">PC4-PC7 :</FONT></I><FONT FACE="Courier"> Estas líneas conforman el puerto C de I/O. Se pueden programar independientemente al igual que los puerto anteriores como :<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">1. Entrada, con o sin resistencia al positivo</FONT></TT> <P> <TT><FONT FACE="Courier">2. Entrada con interrupción mascarable</FONT></TT> <P> <TT><FONT FACE="Courier">3. Salida en colector abierto o también en PUSH-PULL</FONT></TT> <P> <TT><FONT FACE="Courier">4. Entrada analógica para el convertidor A/D<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">Estas líneas no existen en los modelos ST62E10 y ST62E20.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">* Encapsulados : Las versiones 10 y 20 tienen 20 pines y las 15 y 25 son de 28.<BR> </FONT></TT> <P> <TT><B><FONT SIZE=2 FACE="Courier">III-b) ARQUITECTURA INTERNA</FONT></B></TT> <P> <TT><FONT FACE="Courier">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.</FONT></TT> <P> <TT><FONT FACE="Courier">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.</FONT></TT> <P> <TT><FONT FACE="Courier">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.</FONT></TT> <P> <TT><FONT FACE="Courier">La ALU realiza todas las operaciones aritmético-lógicas clásicas. Recibe los operandos desde el área de programa y/o datos. <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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.</FONT></TT> <P> <CENTER><TT><FONT FACE="Courier">El STACK o pila se empleará para contener las direcciones de retorno del PC cuando se produzcan interrupciones o llamadas a subrutinas.<BR> <IMG SRC="IMG00004.GIF"></FONT></TT></CENTER> <P> <TT><I><FONT SIZE=2 FACE="Courier">Acumulador (A):</FONT></I><FONT FACE="Courier"> 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.<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">Registros Indice (X,Y) :</FONT></I><FONT FACE="Courier"> 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).<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">Registros Generales (V,W) : </FONT></I><FONT FACE="Courier">Estos dos registros son uso general. Se encuentran en las posiciones de memoria 82h (V) y 82h (W). <BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">Contador de programa (PC) : </FONT></I><FONT FACE="Courier">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. <BR> <BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">Flags (C,Z) : </FONT></I><FONT FACE="Courier">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).<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">El STACK : </FONT></I><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">AREAS DE MEMORIA : </FONT></I><FONT FACE="Courier">La CPU del microcontrolador opera en dos zonas de memoria diferentes : <I>AREA DE DATOS y AREA DE PROGRAMA.<BR> </I></FONT></TT> <P> <TT><FONT FACE="Courier">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 :<BR> </FONT></TT> <P> <CENTER><IMG SRC="IMG00005.GIF"></CENTER> <P> <TT><FONT FACE="Courier">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.</FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">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</FONT></I></TT> <P> <TT><FONT FACE="Courier">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 :<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">2- 60 posiciones de memoria RAM que pueden contener variables o datos temporales.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">3- Los registros de trabajo de la CPU X,Y,V y W, así como el acumulador A.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">5- Los diversos registros que según se programen controlan los diferentes periféricos.<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">Las posiciones de la memoria de datos están distribuidas como sigue :<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">040h-07Fh ----> Ventana de datos constantes</FONT></TT> <P> <TT><FONT FACE="Courier">080h ----> Registro Indice X</FONT></TT> <P> <TT><FONT FACE="Courier">081h ----> Registro Indice Y</FONT></TT> <P> <TT><FONT FACE="Courier">082h ----> Registro General V</FONT></TT> <P> <TT><FONT FACE="Courier">083h ----> Registro General W</FONT></TT> <P> <TT><FONT FACE="Courier">084h-0BFh ----> Ram de datos</FONT></TT> <P> <TT><FONT FACE="Courier">0C9h ----> RDW</FONT></TT> <P> <TT><FONT FACE="Courier">0FFh ----> Acumulador<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">Las direcciones de los registros de los periféricos serán dadas cuando se expliquen estos. <BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">El registro RDW : </FONT></I><FONT FACE="Courier">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 :<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">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.<BR> <BR> </FONT></I><FONT FACE="Courier">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.</FONT></TT> <P> <TT><FONT FACE="Courier">Para trabajar correctamente con este registro existen directivas de emsamblador de las que trataremos en el punto correspondiente.<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">LAS INTERRUPCIONES :</FONT></I><FONT FACE="Courier"> La CPU puede manejar cuatro fuentes diferentes de interrupción mascarable y una no mascarable de máxima prioridad (NMI). <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">VECTORES de INTERRUPCIONES y RESET : <BR> </FONT></TT> <P> <CENTER><TABLE BORDERCOLOR=#000000 BORDER=1> <TR><TD WIDTH=201><BR> <TT><FONT FACE="Courier">Fuente Interrupción</FONT></TT> </TD><TD WIDTH=201><BR> <TT><FONT FACE="Courier">Número de Vector</FONT></TT> </TD><TD WIDTH=201><BR> <TT><FONT FACE="Courier">Dirección</FONT></TT> </TD></TR> <TR><TD WIDTH=201><BR> <TT><FONT FACE="Courier">Patilla NMI</FONT></TT> </TD><TD WIDTH=201><BR> <TT><FONT FACE="Courier">Vector N.0</FONT></TT> </TD><TD WIDTH=201><BR> <TT><FONT FACE="Courier">FFCh - FFDh</FONT></TT> </TD></TR> <TR><TD WIDTH=201><BR> <TT><FONT FACE="Courier">Cualquier Pin PA</FONT></TT> </TD><TD WIDTH=201><BR> <TT><FONT FACE="Courier">Vector N.1</FONT></TT> </TD><TD WIDTH=201><BR> <TT><FONT FACE="Courier">FF6h - FF7h</FONT></TT> </TD></TR> <TR><TD WIDTH=201><BR> <TT><FONT FACE="Courier">Cualquier Pin PB</FONT></TT> </TD><TD WIDTH=201><BR> <TT><FONT FACE="Courier">Vector N.2</FONT></TT> </TD><TD WIDTH=201><BR> <TT><FONT FACE="Courier">FF4h - FF5h</FONT></TT> </TD></TR> <TR><TD WIDTH=201><BR> <TT><FONT FACE="Courier">Cualquier Pin PC</FONT></TT> </TD><TD WIDTH=201><BR> <TT><FONT FACE="Courier">Vector N.2</FONT></TT> </TD><TD WIDTH=201><BR> <TT><FONT FACE="Courier">FF4h - FF5h</FONT></TT> </TD></TR> <TR><TD WIDTH=201><BR> <TT><FONT FACE="Courier">TIMER</FONT></TT> </TD><TD WIDTH=201><BR> <TT><FONT FACE="Courier">Vector N.3</FONT></TT> </TD><TD WIDTH=201><BR> <TT><FONT FACE="Courier">FF2h - FF3h</FONT></TT> </TD></TR> <TR><TD WIDTH=201><BR> <TT><FONT FACE="Courier">Convertidor A/D</FONT></TT> </TD><TD WIDTH=201><BR> <TT><FONT FACE="Courier">Vector N.4</FONT></TT> </TD><TD WIDTH=201><BR> <TT><FONT FACE="Courier">FF0h - FF1h</FONT></TT> </TD></TR> <TR><TD WIDTH=201><BR> <TT><FONT FACE="Courier">RESET</FONT></TT> </TD><TD WIDTH=201><BR> <TT><FONT FACE="Courier">Vector Reset</FONT></TT> </TD><TD WIDTH=201><BR> <TT><FONT FACE="Courier">FFEh - FFFh</FONT></TT> </TD></TR> </TABLE> </CENTER> <P> <TT><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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.<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">IOR (POSICION 0C8h)<BR> </FONT></TT> <P> <CENTER><TABLE BORDERCOLOR=#000000 BORDER=1> <TR><TD WIDTH=66><BR> <TT><FONT FACE="Courier">IOR7</FONT></TT> </TD><TD WIDTH=66><BR> <TT><FONT FACE="Courier">IOR6</FONT></TT> </TD><TD WIDTH=66><BR> <TT><FONT FACE="Courier">IOR5</FONT></TT> </TD><TD WIDTH=66><BR> <TT><FONT FACE="Courier">IOR4</FONT></TT> </TD><TD WIDTH=66><BR> <TT><FONT FACE="Courier">IOR3</FONT></TT> </TD><TD WIDTH=66><BR> <TT><FONT FACE="Courier">IOR4</FONT></TT> </TD><TD WIDTH=66><BR> <TT><FONT FACE="Courier">IOR5</FONT></TT> </TD><TD WIDTH=75><BR> <TT><FONT FACE="Courier">IOR6</FONT></TT> </TD></TR> </TABLE> </CENTER> <P> <TT><FONT FACE="Courier">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 :<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">IOR4 </FONT><FONT FACE="MS LineDraw">ÄÂÄÄÄÄÄÄ</FONT><FONT FACE="Courier">> ACTIVO : <I>ACTIVA TODAS INTERRUPCIONES</I></FONT></TT> <P> <TT><FONT FACE="MS LineDraw"> ³</FONT></TT> <P> <TT><FONT FACE="MS LineDraw"> ÀÄÄÄÄÄÄ</FONT><FONT FACE="Courier">> DESACTIVO : <I>DESACTIVA TODAS INTERRUPCIONES</I></FONT></TT> <P> <TT><FONT FACE="Courier">IOR5 </FONT><FONT FACE="MS LineDraw">ÄÂÄÄÄÄÄÄ</FONT><FONT FACE="Courier">> ACTIVO : <I>INT.2 ACTIVA, FLANCO ASCENDENTE</I></FONT></TT> <P> <TT><FONT FACE="MS LineDraw"> ³</FONT></TT> <P> <TT><FONT FACE="MS LineDraw"> ÀÄÄÄÄÄÄ</FONT><FONT FACE="Courier">> DESACTIVO : <I>INT.2 ACTIVA, FLANCO DESCENDENTE</I></FONT></TT> <P> <TT><FONT FACE="Courier">IOR6 </FONT><FONT FACE="MS LineDraw">ÄÂÄÄÄÄÄÄ</FONT><FONT FACE="Courier">> ACTIVO : <I>INT.1 ACTIVA, NIVEL LOGICO "0"</I></FONT></TT> <P> <TT><FONT FACE="MS LineDraw"> ³</FONT></TT> <P> <TT><FONT FACE="MS LineDraw"> ÀÄÄÄÄÄÄ</FONT><FONT FACE="Courier">> DESACTIVO : <I>INT.1 ACTIVA, FLANCO DESCENDENTE<BR> </I></FONT></TT> <P> <TT><FONT FACE="Courier">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ó.<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">EL RESET : </FONT></I><FONT FACE="Courier">Sirve para inicializar el microcontrolador y tiene tres formas de generarse :<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">1- Mediante una señal externa aplicada por el PIN RESET</FONT></TT> <P> <TT><FONT FACE="Courier">2- De forma automática, tras la conexión de la VCC</FONT></TT> <P> <TT><FONT FACE="Courier">3- Por el controlador de secuencias WATCHDOG <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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 <B>debe incluir la instrucción RETI</B> para que la CPU pase a trabajar en modo normal.<BR> <BR> </FONT></TT> <P> <TT><B><FONT SIZE=2 FACE="Courier">III-c) PERIFERICOS DEL ST6</FONT></B></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">LAS PUERTAS DE ENTRADA/SALIDA : </FONT></I><FONT FACE="Courier">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 :<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">- Registro de datos</FONT></TT> <P> <TT><FONT FACE="Courier">- Registro de direcciones</FONT></TT> <P> <TT><FONT FACE="Courier">- Registro de opciones<BR> <BR> Cada uno de los 3 registros anteriores ocupa una posición en el área de datos :<BR> </FONT></TT> <P> <CENTER><TABLE BORDERCOLOR=#000000 BORDER=1> <TR><TD WIDTH=102><BR> <TT><FONT FACE="Courier">PUERTA</FONT></TT> </TD><TD WIDTH=150><BR> <TT><FONT FACE="Courier">Reg.Datos</FONT></TT> </TD><TD WIDTH=150><BR> <TT><FONT FACE="Courier">Reg.Direcc.</FONT></TT> </TD><TD WIDTH=150><BR> <TT><FONT FACE="Courier">Reg.Opciones</FONT></TT> </TD></TR> <TR><TD WIDTH=102><BR> <TT><FONT FACE="Courier">PA</FONT></TT> </TD><TD WIDTH=150><BR> <TT><FONT FACE="Courier">DRPA (C0h)</FONT></TT> </TD><TD WIDTH=150><BR> <TT><FONT FACE="Courier">DDRPA (C4h)</FONT></TT> </TD><TD WIDTH=150><BR> <TT><FONT FACE="Courier">ORPA (CCh)</FONT></TT> </TD></TR> <TR><TD WIDTH=102><BR> <TT><FONT FACE="Courier">PB</FONT></TT> </TD><TD WIDTH=150><BR> <TT><FONT FACE="Courier">DRPB (C1h)</FONT></TT> </TD><TD WIDTH=150><BR> <TT><FONT FACE="Courier">DDRPB (C5h)</FONT></TT> </TD><TD WIDTH=150><BR> <TT><FONT FACE="Courier">ORPB (CDh)</FONT></TT> </TD></TR> <TR><TD WIDTH=102><BR> <TT><FONT FACE="Courier">PC</FONT></TT> </TD><TD WIDTH=150><BR> <TT><FONT FACE="Courier">DRPC (C2h)</FONT></TT> </TD><TD WIDTH=150><BR> <TT><FONT FACE="Courier">DDRPC (C6h)</FONT></TT> </TD><TD WIDTH=150><BR> <TT><FONT FACE="Courier">ORPC (CEh)</FONT></TT> </TD></TR> </TABLE> </CENTER> <P> <TT><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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.</FONT></TT> <P> <TT><FONT FACE="Courier">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 <I>SIN PULL-UP </I>ni interrupción es lo mismo que si estuviera en alta impedancia.<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">EL TIMER : </FONT></I><FONT FACE="Courier">Es un temporizador compuesto por un contador de 8 bits con un preescaler programable de 7 bits, permitiendo cuentas de hasta 2<SUP>15</SUP> eventos, y toda la lógica de control necesaria para configurar tres modos diferentes de trabajo.</FONT></TT> <P> <TT><FONT FACE="Courier">Los registros de TIMER : el timer tiene 3 registros, el contador, el preescaler y otro el de estado y control.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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 <I>D3h del área de datos. <BR> </I></FONT></TT> <P> <TT><FONT FACE="Courier">El PSC : Es un registro de 7 bits que se encuentra en la posición <I>D2h del área de datos.</I> 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.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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 <I>D4h del área de datos.<BR> </I></FONT></TT> <P> <TT><FONT FACE="Courier">MODOS de TRABAJO : Mediante los correspondientes bits del registro TSCR se pueden programar 3 modos de trabajo.</FONT></TT> <P> <TT><FONT FACE="Courier">1- Modo Controlado : El preescaler se decrementa mientras la patilla de entrada TIMER esté a 1, en caso contrario la temporización queda detenida.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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.</FONT></TT> <P> <TT><FONT FACE="Courier">La INTERRUPCION TIMER : El TIMER si esta habilitado para ello puede provocar una interrupción de nivel 3, cuando la cuenta llegue a 0.<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">EL CONVERSOR A/D : </FONT></I><FONT FACE="Courier">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).</FONT></TT> <P> <TT><FONT FACE="Courier">La resolución es la siguiente :<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">Vdd-Vss</FONT></TT> <P> <TT><FONT FACE="Courier">---------= Resolucion</FONT></TT> <P> <TT><FONT FACE="Courier">256<BR> Así pues si por ejemplo el MCU está alimentado a 5V, la resolución es de 19,5 mV.</FONT></TT> <P> <TT><FONT FACE="Courier">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.</FONT></TT> <P> <TT><FONT FACE="Courier">El registro ADC se encuentra en la posición D1h del área de datos y el ADR en la D0h.<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">EL WATCHDOG :</FONT></I><FONT FACE="Courier"> 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. </FONT></TT> <P> <TT><FONT FACE="Courier">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.</FONT></TT> <P> <TT><FONT FACE="Courier">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. <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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. <BR> </FONT></TT> <P> <TT><B><FONT SIZE=2 FACE="Courier">III-d) TIPOS DE DIRECCIONAMIENTO </FONT></B></TT> <P> <TT><FONT FACE="Courier">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.</FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">DIRECCIONAMIENTO INMEDIATO :</FONT></I><FONT FACE="Courier"> El operando que acompaña al código OP de la instrucción es el propio dato a procesar. <BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">DIRECTO :</FONT></I><FONT FACE="Courier"> 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.</FONT></TT> <P> <TT><FONT FACE="Courier">DIRECTO CORTO : S emplea en aquellas instrucciones en las que el operando es cualquiera de los registros de trabajo X,Y,V y W.<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">EXTENDIDO :</FONT></I><FONT FACE="Courier"> 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.<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">RELATIVO AL PC : </FONT></I><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">DIRECTO A BIT :</FONT></I><FONT FACE="Courier"> Empleado por las instrucciones destinadas al activo o borrado de bits individuales.<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">COMPROBACION DE BITS Y SALTO :</FONT></I><FONT FACE="Courier"> 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.<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">INDIRECTO :</FONT></I><FONT FACE="Courier"> El dato a manipular se encuentra en la posición marcada por cualquiera de los registros indicies.<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">INHERENTE O IMPLICADO : </FONT></I><FONT FACE="Courier">Lo emplean aquellas instrucciones que no necesitan de operando alguno. <BR> </FONT></TT> <P> <TT><B><FONT SIZE=2 FACE="Courier">IV-EQUIPO DE PROGRAMACION USADO </FONT></B></TT> <P> <TT><B><FONT SIZE=2 FACE="Courier">IV-a) INTRODUCCION AL EQUIPO </FONT></B></TT> <P> <TT><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><B><FONT SIZE=2 FACE="Courier">IV-b) SOFTWARE :<BR> </FONT></B></TT> <P> <TT><FONT FACE="Courier">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. <BR> </FONT></TT> <P> <TT><B><FONT SIZE=2 FACE="Courier">IV-b,I) ENSAMBLADOR (DIRECTIVAS Y OPCIONES) </FONT></B></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">-EL AST6.EXE (ENSAMBLADOR) :</FONT></I><B><FONT SIZE=2 FACE="Courier"> </FONT></B><FONT FACE="Courier">AST6 es un ensamblador que trabaja con ficheros ASCII. Se ejecuta desde la línea de comandos del DOS. Forma :</FONT></TT> <P> <TT><FONT FACE="Courier">C:\ST6\AST6 [-opciones] fichero1 [fichero2...]</FONT></TT> <P> <TT><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">Opciones del AST6 :<BR> </FONT></I></TT> <P> <TT><FONT FACE="Courier">-L Crea un fichero de salida con el listado (name.LIS)</FONT></TT> <P> <TT><FONT FACE="Courier">-X Crea un fichero con una tabla de referencias cruzadas (name.X)</FONT></TT> <P> <TT><FONT FACE="Courier">-M Añade un mapa de información al final de name.LIS</FONT></TT> <P> <TT><FONT FACE="Courier">-S Crea una tabla con los símbolos en el fichero name.SYM</FONT></TT> <P> <TT><FONT FACE="Courier">-O Crea un fichero objeto (name.obj)</FONT></TT> <P> <TT><FONT FACE="Courier">-E Crea un fichero con una lista de errores (name.ERR)</FONT></TT> <P> <TT><FONT FACE="Courier">-F Introduce la trayectoria completa (nombre) en los mensajes de error</FONT></TT> <P> <TT><FONT FACE="Courier">-D Inserta información para la máscara de ROM en el fichero name.HEX</FONT></TT> <P> <TT><FONT FACE="Courier">-Z Cambia el formato de los ficheros .DSD y .SYM para los componentes de la familia ST60<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">Los ficheros .DSD son información para el simulador (SIMST6.EXE).</FONT></TT> <P> <TT><FONT FACE="Courier">Por defecto AST6 crea los ficheros .HEX y .DSD.<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">Formato del programa fuente :<BR> </FONT></I></TT> <P> <TT><FONT FACE="Courier">El formato de fichero fuente .ASM debe de ser de texto ASCII.</FONT></TT> <P> <TT><FONT FACE="Courier">Formas : </FONT></TT> <P> <TT><FONT FACE="Courier">label LD A,055h ; Carga en el acumulador 05h</FONT></TT> <P> <TT><FONT FACE="Courier">----- --------- ----------------------------</FONT></TT> <P> <TT><FONT FACE="Courier">etiq. mnémonico. comentario <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">Campo etiqueta : Cualquier nombre que no sea una palabra reservada.(no va seguido de dos puntos)</FONT></TT> <P> <TT><FONT FACE="Courier">Campo mnemónico : Cualquier mnemónico admitido</FONT></TT> <P> <TT><FONT FACE="Courier">Comentario : Precedido por (;), lo que le sigue no se tiene en cuenta.<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">Símbolos y expresiones : <BR> </FONT></I></TT> <P> <TT><FONT FACE="Courier">Números : b o B, binarios</FONT></TT> <P> <TT><FONT FACE="Courier">o o O, Octales</FONT></TT> <P> <TT><FONT FACE="Courier">h o H, hexadecimales<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">Caracteres Constantes :</FONT></TT> <P> <TT><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">Cadenas Constantes :</FONT></TT> <P> <TT><FONT FACE="Courier">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 ( \ ). <BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">DIRECTIVAS DE ENSAMBLADOR : <BR> </FONT></I></TT> <P> <TT><FONT FACE="Courier">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)<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">- DEFINICION DE DATOS EN EL ESPACIO DE PROGRAMA<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">a) Directiva <B>.BLOCK<BR> </B></FONT></TT> <P> <TT><FONT FACE="Courier">sintaxis : [etiqueta] .BLOCK expresión <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">b) Directiva <B>.WORD<BR> </B></FONT></TT> <P> <TT><FONT FACE="Courier">sintaxis : [etiqueta] .WORD expresión,[expresión] <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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. <BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">c) Directiva <B>.BYTE<BR> </B></FONT></TT> <P> <TT><FONT FACE="Courier">sintaxis : [etiqueta] .BYTE expresión,[expresión] <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">d) Directiva <B>.ASCII Y .ASCIZ<BR> </B></FONT></TT> <P> <TT><FONT FACE="Courier">sintaxis : [etiqueta] .ASCII "cadena"</FONT></TT> <P> <TT><FONT FACE="Courier">[etiqueta] .ASCIZ "cadena" <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">e) Directiva <B>.DEF<BR> </B></FONT></TT> <P> <TT><FONT FACE="Courier">sintaxis : [etiqueta] .DEF dirección,[R-MASK],[W-MASK],[V],[M] <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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.</FONT></TT> <P> <TT><FONT FACE="Courier">[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.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">- DIRECTIVAS DE DEFINICION DE SIMBOLOS <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">a) Directiva <B>.EQU<BR> </B></FONT></TT> <P> <TT><FONT FACE="Courier">sintaxis : [etiqueta] .EQU expresión <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">Asigna el valor de la expresión a la etiqueta, una vez utilizada esta directiva, la etiqueta ya no puede volver a ser redefinida.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">b) Directiva <B>.SET<BR> </B></FONT></TT> <P> <TT><FONT FACE="Courier">sintaxis : [etiqueta] .SET expresión <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">Es muy similar a .EQU, la única diferencia es que una etiqueta definida con .SET puede ser otra vez redefinida con .SET.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">c) Directiva <B>.INPUT<BR> </B></FONT></TT> <P> <TT><FONT FACE="Courier">sintaxis : .INPUT "name.asm" <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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.<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">- OTRAS DIRECTIVAS<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">a) Directiva <B>.DISPLAY<BR> </B></FONT></TT> <P> <TT><FONT FACE="Courier">sintaxis : .DISPLAY "cadena" <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">Durante el ensamblado imprime la cadena en la pantalla.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">b) Directiva <B>.END<BR> </B></FONT></TT> <P> <TT><FONT FACE="Courier">sintaxis : .END<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">Ultima directiva del fichero fuente, indica el final. Todas las líneas presentes después de esta directiva son ignoradas.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">c) Directiva <B>.ORG<BR> </B></FONT></TT> <P> <TT><FONT FACE="Courier">sintaxis : .ORG expresión<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">d) Directivas <B>.ERROR </B>Y <B>.WARNING <BR> </B></FONT></TT> <P> <TT><FONT FACE="Courier">sintaxis : .ERROR "cadena"</FONT></TT> <P> <TT><FONT FACE="Courier">.WARNING "cadena"<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">Generan un mensaje (cadena) en el fichero de errores (-E) o en la salida de errores en pantalla.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">- DIRECTIVAS PARA EL USO DEL REGISTRO RDW<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">a) Directiva <B>.W_ON<BR> </B></FONT></TT> <P> <TT><FONT FACE="Courier">sintaxis : .W_ON<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">Esta directiva debe incluirse en el fichero fuente, si en el espacio de datos existe una ventana de datos constantes.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">b) Directivas etiqueta<B>.W</B> y etiqueta<B>.D <BR> </B></FONT></TT> <P> <TT><FONT FACE="Courier">sintaxis : etiqueta<B>.W</B></FONT></TT> <P> <TT><FONT FACE="Courier">etiqueta<B>.D<BR> </B></FONT></TT> <P> <TT><FONT FACE="Courier">Deben utilizarse si .W_ON ha sido puesta antes.</FONT></TT> <P> <TT><FONT FACE="Courier">Ejemplo de su utilización :<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.W_ON <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">tabla .BYTE 0ffh,21h,42h,32h ;Bloque fijo en EPROM<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.input "ST6.ASM" ;Entra definición de registros<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">ldi rdw,tabla<B>.W</B> ;Carga en el registro RDW la ;dirección apropiada para que en ;el área de datos se quede ;representado el bloque de datos ;constantes <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">ldi x,tabla<B>.D</B> ;Carga en X la dirección de ;memoria RAM donde se encuentra ;el primer valor de la tabla de ;datos (0ffh)<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.END<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">Un programa en el cual hemos utilizado estas directivas de control de RDW es el del control de semáforos.</FONT></TT> <P> <TT><FONT FACE="Courier">Las directivas de ensamblado condicional y macros no se especifican por ser su tratamiento complejo y no ser necesarias para este proyecto.<BR> </FONT></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">El ST6.EXE (linkador) : </FONT></I><FONT FACE="Courier">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.<BR> <BR> </FONT></TT> <P> <TT><B><FONT SIZE=2 FACE="Courier">IV-b,II) SIMULADOR ST6 </FONT></B></TT> <P> <TT><I><FONT SIZE=2 FACE="Courier">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.</FONT></I></TT> <P> <TT><FONT FACE="Courier">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.</FONT></TT> <P> <TT><FONT FACE="Courier">Ahora pasamos a describir brevemente los menús más importantes del simulador en INTERFACE GRAFICO.<BR> </FONT></TT> <P> <TT><B><FONT SIZE=2 FACE="Courier">- MENU FILE<BR> </FONT></B></TT> <P> <TT><FONT FACE="Courier">LOAD : carga ficheros a simular (.HEX, .DSD) y si existe .SYS.</FONT></TT> <P> <TT><FONT FACE="Courier">SAVE : salva el contenido de memoria en un fichero.</FONT></TT> <P> <TT><FONT FACE="Courier">OPEN LOG OPTION : salva todas las salidas del simulador a un fichero de texto.</FONT></TT> <P> <TT><FONT FACE="Courier">CLOSE LOG OPTION : cierra el fichero abierto.</FONT></TT> <P> <TT><FONT FACE="Courier">EXIT : sale del simulador.</FONT></TT> <P> <TT><B><FONT SIZE=2 FACE="Courier">- MENU WATCH </FONT></B></TT> <P> <TT><FONT FACE="Courier">REGISTER </FONT><FONT FACE="MS LineDraw">ÄÄÂÄÄÄÄÄ</FONT><FONT FACE="Courier">> DISPLAY *1</FONT></TT> <P> <TT><FONT FACE="MS LineDraw"> ³</FONT><FONT FACE="Courier"> </FONT></TT> <P> <TT><FONT FACE="MS LineDraw"> ³</FONT><FONT FACE="Courier"> </FONT></TT> <P> <TT><FONT FACE="MS LineDraw"> ÀÄÄÄÄÄ</FONT><FONT FACE="Courier">> DISPLAY WRS *2<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">*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.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">*2 DISPLAY WRS : Visualiza todos los registros que estan declarados como de trabajo, es decir con la marca [m] en su definición.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">DUMP PROG OPTION : Muestra y modifica el espacio de programa.</FONT></TT> <P> <TT><FONT FACE="Courier">ASSEMBLER OPTION : Ensambla y desensambla en un editor en línea.</FONT></TT> <P> <TT><FONT FACE="Courier">SYMBOLS OPTION : Visualiza la tabla de símbolos, cargada del fichero .SYS.</FONT></TT> <P> <TT><FONT FACE="Courier">WINDOW OPTION : Visualiza un bloque de 64 bytes del espacio de datos.</FONT></TT> <P> <TT><FONT FACE="Courier">SEARCH OPTION : Busca bytes en memoria.</FONT></TT> <P> <TT><FONT FACE="Courier">TRACE OPTION : Visualiza las últimas instrucciones ejecutadas.<BR> </FONT></TT> <P> <TT><B><FONT SIZE=2 FACE="Courier">- MENU UTILITY <BR> </FONT></B></TT> <P> <TT><FONT FACE="Courier">COMPARE OPTION : Compara 2 bloques de memoria.</FONT></TT> <P> <TT><FONT FACE="Courier">MOVE OPTION : Mueve un bloque de memoria a otra dirección.</FONT></TT> <P> <TT><FONT FACE="Courier">USE OPTION : Ejecuta los comandos que estan en un fichero .CMD</FONT></TT> <P> <TT><FONT FACE="Courier">FILL OPTION : Rellena un bloque de memoria con un patrón.</FONT></TT> <P> <TT><FONT FACE="Courier">BASE OPTION : Selecciona la base de conversión (HEX, OCT, DEC).</FONT></TT> <P> <TT><FONT FACE="Courier">L.MODE OPTION : Pone el simulador en interface de línea de comandos.<BR> </FONT></TT> <P> <TT><B><FONT SIZE=2 FACE="Courier">- MENU RUN <BR> </FONT></B></TT> <P> <TT><FONT FACE="Courier">GO (CONTINUE) OPTION : Corre el programa donde se quedó el PC.</FONT></TT> <P> <TT><FONT FACE="Courier">GO OPTION : Corre el programa a partir de una dirección.</FONT></TT> <P> <TT><FONT FACE="Courier">NEXT OPTION : Ejecuta paso a paso.</FONT></TT> <P> <TT><FONT FACE="Courier">RESET OPTION : Resetea el STATUS interno del simulador.</FONT></TT> <P> <TT><FONT FACE="Courier">SET OPTION : Pone el FULL-TRACE.<BR> </FONT></TT> <P> <TT><B><FONT SIZE=2 FACE="Courier">- MENU BREAKPOINTS<BR> </FONT></B></TT> <P> <TT><FONT FACE="Courier">DISPLAY OPTION : Visualiza todos los modos de BREAKPOINTS si estan abilitados.</FONT></TT> <P> <TT><FONT FACE="Courier">PRESET OPTION : Preestablece las opciones de los BREAKPOINTS.</FONT></TT> <P> <TT><FONT FACE="Courier">SET/ADDR OPTION : Coloca un breakpoint en una dirección del espacio de datos o de programa.</FONT></TT> <P> <TT><FONT FACE="Courier">DELETE/ALL OPTION : Borra todos los BREAKPOINTS.</FONT></TT> <P> <TT><FONT FACE="Courier">DEL/ADDR OPTION : Borra BREAKPOINTS de una sola dirección.</FONT></TT> <P> <TT><FONT FACE="Courier">BRK ENABLE OPTION : Abilita/Desabilita los BREAKPOINTS.<BR> </FONT></TT> <P> <TT><B><FONT SIZE=2 FACE="Courier">- MENU CONF<BR> </FONT></B></TT> <P> <TT><FONT FACE="Courier">Muestra los tiempos de usuario y sistema y el estado de las interrupciones.<BR> <BR> <BR> <B>V-PLACA DE DESARROLLO ST6</B>V-PLACA DE DESARROLLO ST6 <BR> </FONT></TT> <P> <TT><B><FONT SIZE=2 FACE="Courier">V-a) EL PORQUÉ</FONT></B></TT> <P> <TT><FONT FACE="Courier">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<B>. </B>Con todas estas premisas se diseño el circuito descrito a continuación. <BR> </FONT></TT> <P> <TT><B><FONT SIZE=2 FACE="Courier">V-b) ESQUEMAS Y DESCRIPCIÓN</FONT></B></TT> <P> <TT><FONT FACE="Courier">El esquema esta claramente dividido en 3 partes que son, la fuente de alimentación, los switches y leds y por ultimo el microcontrolador.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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.500</FONT></TT><FONT FACE="Symbol">m</FONT><TT><FONT FACE="Courier">F. 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.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">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.</FONT></TT> <P> <TT><FONT FACE="Courier">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.</FONT></TT> <P> <TT><FONT FACE="Courier">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.<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">Sobre la placa de circuito impreso existe sitio suficiente para la colocacion de dos placas tipo board. <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">Los esquemas y fotolitos se encuentran en las dos páginas siguientes.<BR> <BR> <B>V-c) PRACTICAS CON PLACA Y SUBRUTINAS ÚTILES</B></FONT></TT> <P> <TT><FONT FACE="Courier">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) <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;****************************************************************************</FONT></TT> <P> <TT><FONT FACE="Courier">;******* Proyecto de Practicas ST6 *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******* *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******* Programa : Convierte en BCD un numero de 8 bits *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******* ******* ;******* *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******* José Ignacio Díaz Beamud & Jesús Antonio Alquezar Sierra *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******* *******</FONT></TT> <P> <TT><FONT FACE="Courier">;**************************************************************************** <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;Convierte en BCD un número de 8 bits, el número a convertir se encuentra en</FONT></TT> <P> <TT><FONT FACE="Courier">;'nn' (86h) y el resultado se deposita en datal (número bajo),datam (número</FONT></TT> <P> <TT><FONT FACE="Courier">;medio ),datah (número alto)<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">datal .def 84h,0ffh,0ffh ;Parte baja del resultado (BCD)</FONT></TT> <P> <TT><FONT FACE="Courier">datam .def 85h,0ffh,0ffh ;Parte media del resultado (BCD)</FONT></TT> <P> <TT><FONT FACE="Courier">datah .def 86h,0ffh,0ffh ;Parte alta del resultado (BCD)</FONT></TT> <P> <TT><FONT FACE="Courier">nn .def 86h,0ffh,0ffh ;Número a convertir en posición 86h<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">conver ldi datal,00 </FONT></TT> <P> <TT><FONT FACE="Courier">ldi datam,00</FONT></TT> <P> <TT><FONT FACE="Courier">ldi datah,00 ;Pone a 0 las posiciones del resultado</FONT></TT> <P> <TT><FONT FACE="Courier">ldi a,nn ;Carga en A el número a convertir</FONT></TT> <P> <TT><FONT FACE="Courier">sal2 cpi a,100 ;Y lo compara con 100</FONT></TT> <P> <TT><FONT FACE="Courier">jrc sal1 ;Si es menor (nn<100) salta a sal1</FONT></TT> <P> <TT><FONT FACE="Courier">subi a,100 ;De lo contrario resta a A 100</FONT></TT> <P> <TT><FONT FACE="Courier">inc datah ;Y incrementa datah</FONT></TT> <P> <TT><FONT FACE="Courier">jp sal2 ;Salta a sal2</FONT></TT> <P> <TT><FONT FACE="Courier">sal1 cpi a,10 ;Compara A con 10</FONT></TT> <P> <TT><FONT FACE="Courier">jrc sal3 ;Si es menor (nn<10) salta a sal3 </FONT></TT> <P> <TT><FONT FACE="Courier">subi a,10 ;De lo contrario resta a A 10</FONT></TT> <P> <TT><FONT FACE="Courier">inc datam ;Y incrementa datam</FONT></TT> <P> <TT><FONT FACE="Courier">jp sal1 ;Salta a sal1</FONT></TT> <P> <TT><FONT FACE="Courier">sal3 ld datal,a ;El resultado restante (unidades) se deja en datal</FONT></TT> <P> <TT><FONT FACE="Courier">; </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT></TT> <P> <TT><FONT FACE="Courier">; \/ \/ \/ \/ \/</FONT></TT> <P> <TT><FONT FACE="Courier">;<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;****************************************************************************</FONT></TT> <P> <TT><FONT FACE="Courier">;******* Proyecto de Practicas ST6 *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******* *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******* Programa : Convierte en BCD un numero de 9 bits *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******* ******* </FONT></TT> <P> <TT><FONT FACE="Courier">;******* *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******* José Ignacio Díaz Beamud & Jesús Antonio Alquezar Sierra *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******* *******</FONT></TT> <P> <TT><FONT FACE="Courier">;**************************************************************************** <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;Convierte un número de 9 bits (resultado de multiplicar uno de 8bits * 2)</FONT></TT> <P> <TT><FONT FACE="Courier">;en BCD.Este módulo se puede emplear para convertir el resultado del </FONT></TT> <P> <TT><FONT FACE="Courier">;convertidor A/D (ya debidamente multiplicado por 2 sólo si VCC = 5V) a BCD</FONT></TT> <P> <TT><FONT FACE="Courier">;y poder sacar el resultado a visualizadores 7 segmentos.<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">datch .def 84h,0ffh,0ffh ;Parte alta del número a convertir</FONT></TT> <P> <TT><FONT FACE="Courier">datcl .def 85h,0ffh,0ffh ;Parte baja del número a convertir</FONT></TT> <P> <TT><FONT FACE="Courier">datal .def 86h,0ffh,0ffh ;Parte baja del resultado (BCD)</FONT></TT> <P> <TT><FONT FACE="Courier">datam .def 87h,0ffh,0ffh ;Parte media del resultado (BCD)</FONT></TT> <P> <TT><FONT FACE="Courier">datah .def 88h,0ffh,0ffh ;Parte alta del resultado (BCD)<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">conv9b ldi datal,00</FONT></TT> <P> <TT><FONT FACE="Courier">ldi datam,00</FONT></TT> <P> <TT><FONT FACE="Courier">ldi datah,00 ;Pone a 0 las posiciones del resultado</FONT></TT> <P> <TT><FONT FACE="Courier">jrr 0,datch,sal1 ;Salta a sal1 si el bit 0 del datch es 0</FONT></TT> <P> <TT><FONT FACE="Courier">ldi datal,6 ;De lo contrario el resultado ya es como mínimo</FONT></TT> <P> <TT><FONT FACE="Courier">ldi datam,5 ;256 ya que 2^(9­1)=256</FONT></TT> <P> <TT><FONT FACE="Courier">ldi datah,2</FONT></TT> <P> <TT><FONT FACE="Courier">sal1 ld a,datcl ;Carga en A la parte baja del dato a convertir</FONT></TT> <P> <TT><FONT FACE="Courier">sal3 cpi a,100 ;La compara con 100</FONT></TT> <P> <TT><FONT FACE="Courier">jrc sal2 ;Si es menor salta a sal2 (datcl<100)</FONT></TT> <P> <TT><FONT FACE="Courier">subi a,100 ;De lo contrario restale 100</FONT></TT> <P> <TT><FONT FACE="Courier">inc datah ;Y incrementa datah</FONT></TT> <P> <TT><FONT FACE="Courier">jp sal3 ;Salta a sal3</FONT></TT> <P> <TT><FONT FACE="Courier">sal2 cpi a,10 ;Compara A con 10</FONT></TT> <P> <TT><FONT FACE="Courier">jrc sal4 ;Y si este es menor (A<10) salta a sal4</FONT></TT> <P> <TT><FONT FACE="Courier">subi a,10 ;De lo contrario resta a A 10</FONT></TT> <P> <TT><FONT FACE="Courier">inc datam ;Incrementa datam</FONT></TT> <P> <TT><FONT FACE="Courier">jp med ;Salta a med</FONT></TT> <P> <TT><FONT FACE="Courier">sal4 jp sa ;Salta a sa</FONT></TT> <P> <TT><FONT FACE="Courier">jrr 3,datam,sal5 ;Salta a sal5 si el bit 3 de datam es 0</FONT></TT> <P> <TT><FONT FACE="Courier">jrr 1,datam,sal5 ;O si el bit 1 de datam es 0</FONT></TT> <P> <TT><FONT FACE="Courier">;Verifica si datam es igual a 9 </FONT></TT> <P> <TT><FONT FACE="Courier">ldi datam,0 ;De lo contraria pon a 0 datam</FONT></TT> <P> <TT><FONT FACE="Courier">inc datah ;Y incrementa datah</FONT></TT> <P> <TT><FONT FACE="Courier">sal5 jp sal2 ;Salta a sal2</FONT></TT> <P> <TT><FONT FACE="Courier">sa add a,datal ;Suma a A datal</FONT></TT> <P> <TT><FONT FACE="Courier">ld datal,a ;Y lo lleva a datal</FONT></TT> <P> <TT><FONT FACE="Courier">cpi a,10 ;Lo compara con 10</FONT></TT> <P> <TT><FONT FACE="Courier">jrc sa2 ;Si es menor salta a sa2 (A<10)</FONT></TT> <P> <TT><FONT FACE="Courier">subi a,10 ;Resta a A 10</FONT></TT> <P> <TT><FONT FACE="Courier">ld datal,a ;Y lleva A a datal</FONT></TT> <P> <TT><FONT FACE="Courier">jp p1 ;Salta a p1</FONT></TT> <P> <TT><FONT FACE="Courier">sa2 jp sal6 ;Salta a sal6</FONT></TT> <P> <TT><FONT FACE="Courier">p1 inc datam ;Incrementa datam</FONT></TT> <P> <TT><FONT FACE="Courier">jrr 3,datam,sal6 ;Salta a sal6 si el bit 3 de datam es 0</FONT></TT> <P> <TT><FONT FACE="Courier">jrr 1,datam,sal6 ;O si el bit 1 de datam es 0</FONT></TT> <P> <TT><FONT FACE="Courier">;Verifica si datam es igual a 9</FONT></TT> <P> <TT><FONT FACE="Courier">ldi datam,0 ;Pon datam a 0</FONT></TT> <P> <TT><FONT FACE="Courier">inc datah ;Incrementa datah</FONT></TT> <P> <TT><FONT FACE="Courier">sal6 nop ;No opera</FONT></TT> <P> <TT><FONT FACE="Courier">nop ;No opera <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">; </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT></TT> <P> <TT><FONT FACE="Courier">; \/ \/ \/ \/ \/</FONT></TT> <P> <TT><FONT FACE="Courier">;<BR> <BR> <BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;****************************************************************************</FONT></TT> <P> <TT><FONT FACE="Courier">;******* Proyecto de Practicas ST6 *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******* *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******* Programa : Convertidor de A/D a valor V correspondiente *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******* ******* </FONT></TT> <P> <TT><FONT FACE="Courier">;******* *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******* José Ignacio Díaz Beamud & Jesús Antonio Alquezar Sierra *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******* *******</FONT></TT> <P> <TT><FONT FACE="Courier">;**************************************************************************** <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;Despues de una conversión del A/D el resultado de ADR se multiplica por 2</FONT></TT> <P> <TT><FONT FACE="Courier">;Para obtener el resultado en voltios de la conversión.</FONT></TT> <P> <TT><FONT FACE="Courier">;Esto sólo sera aplicable si VCC = 5V ya que de esta forma la escala de</FONT></TT> <P> <TT><FONT FACE="Courier">;Conversión son más o menos 0.02V</FONT></TT> <P> <TT><FONT FACE="Courier">;El resultado podrá ser un número de 9 bits<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">datah .def 084h,0ffh,0ffh ;Parte alta del resultado</FONT></TT> <P> <TT><FONT FACE="Courier">datal .def 085h,0ffh,0ffh ;Parte baja del resultado<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">ca/d ldi datah,0 ;Pone datah a 0 </FONT></TT> <P> <TT><FONT FACE="Courier">ld a,adr ;Carga el resultado de la conversión en A</FONT></TT> <P> <TT><FONT FACE="Courier">sla a ;y lo multiplica por 2</FONT></TT> <P> <TT><FONT FACE="Courier">jrnc sal1 ;Si no hay carry salta a sal1</FONT></TT> <P> <TT><FONT FACE="Courier">inc datah ;De lo contraria pon datah a 1</FONT></TT> <P> <TT><FONT FACE="Courier">sal1 ld datal,a ;Y lleva A (multiplicado por 2) a datal</FONT></TT> <P> <TT><FONT FACE="Courier">nop ;No opera</FONT></TT> <P> <TT><FONT FACE="Courier">nop ;No opera <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">; </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT></TT> <P> <TT><FONT FACE="Courier">; \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/</FONT></TT> <P> <TT><FONT FACE="Courier">;<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;***** DEFINE REGISTROS</FONT></TT> <P> <TT><FONT FACE="Courier">;***** Utilizar con .INPUT <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">x .def 80h,m </FONT></TT> <P> <TT><FONT FACE="Courier">y .def 81h,m </FONT></TT> <P> <TT><FONT FACE="Courier">v .def 82h,m </FONT></TT> <P> <TT><FONT FACE="Courier">w .def 83h,m </FONT></TT> <P> <TT><FONT FACE="Courier">a .def 0ffh,m <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">drpa .def 0c0h,m </FONT></TT> <P> <TT><FONT FACE="Courier">drpb .def 0c1h,m </FONT></TT> <P> <TT><FONT FACE="Courier">drpc .def 0c2h,m <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">ddrpa .def 0c4h,m </FONT></TT> <P> <TT><FONT FACE="Courier">ddrpb .def 0c5h,m </FONT></TT> <P> <TT><FONT FACE="Courier">ddrpc .def 0c6h,m <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">ior .def 0c8h,m </FONT></TT> <P> <TT><FONT FACE="Courier">rdw .def 0c9h,m <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">orpa .def 0cch,m </FONT></TT> <P> <TT><FONT FACE="Courier">orpb .def 0cdh,m </FONT></TT> <P> <TT><FONT FACE="Courier">orpc .def 0ceh,m <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">adr .def 0d0h,m </FONT></TT> <P> <TT><FONT FACE="Courier">adcr .def 0d1h,m <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">psc .def 0d2h,m </FONT></TT> <P> <TT><FONT FACE="Courier">tcr .def 0d3h,m </FONT></TT> <P> <TT><FONT FACE="Courier">tscr .def 0d4h,m <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">wdr .def 0d8h,m <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;******************* Temporizador de undidad de 1 segundo</FONT></TT> <P> <TT><FONT FACE="Courier">;******************* El número de segundos se cargan en el acumulador</FONT></TT> <P> <TT><FONT FACE="Courier">;******************* entonces si el acumulador es 0 sale temporizador<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">segundos .equ 01h<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">reset reti</FONT></TT> <P> <TT><FONT FACE="Courier">sal3 ldi a,segundos</FONT></TT> <P> <TT><FONT FACE="Courier">jrnz inic</FONT></TT> <P> <TT><FONT FACE="Courier">jp fin</FONT></TT> <P> <TT><FONT FACE="Courier">inic ldi v,0ach</FONT></TT> <P> <TT><FONT FACE="Courier">sal2 ldi w,0ffh</FONT></TT> <P> <TT><FONT FACE="Courier">sal1 nop</FONT></TT> <P> <TT><FONT FACE="Courier">nop</FONT></TT> <P> <TT><FONT FACE="Courier">nop</FONT></TT> <P> <TT><FONT FACE="Courier">nop</FONT></TT> <P> <TT><FONT FACE="Courier">dec w</FONT></TT> <P> <TT><FONT FACE="Courier">jrnz sal1</FONT></TT> <P> <TT><FONT FACE="Courier">dec v </FONT></TT> <P> <TT><FONT FACE="Courier">jrnz sal2</FONT></TT> <P> <TT><FONT FACE="Courier">dec a</FONT></TT> <P> <TT><FONT FACE="Courier">jrz fin</FONT></TT> <P> <TT><FONT FACE="Courier">jp sal3</FONT></TT> <P> <TT><FONT FACE="Courier">fin nop</FONT></TT> <P> <TT><FONT FACE="Courier">nop<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">; </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT></TT> <P> <TT><FONT FACE="Courier">; \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/</FONT></TT> <P> <TT><FONT FACE="Courier">;<BR> <BR> <BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;******************* Temporizador de undidad de 1 segundo para watchdog HWD</FONT></TT> <P> <TT><FONT FACE="Courier">;******************* El número de segundos se cargan en el acumulador</FONT></TT> <P> <TT><FONT FACE="Courier">;******************* entonces si el acumulador es 0 sale temporizador<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">segundos .equ 01h<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">reset reti</FONT></TT> <P> <TT><FONT FACE="Courier">sal3 ldi a,segundos</FONT></TT> <P> <TT><FONT FACE="Courier">jrnz inic</FONT></TT> <P> <TT><FONT FACE="Courier">jp fin</FONT></TT> <P> <TT><FONT FACE="Courier">inic ldi v,0ach</FONT></TT> <P> <TT><FONT FACE="Courier">sal2 ldi w,0ffh</FONT></TT> <P> <TT><FONT FACE="Courier">sal1 ldi wdr,0feh</FONT></TT> <P> <TT><FONT FACE="Courier">nop</FONT></TT> <P> <TT><FONT FACE="Courier">nop</FONT></TT> <P> <TT><FONT FACE="Courier">dec w</FONT></TT> <P> <TT><FONT FACE="Courier">jrnz sal1</FONT></TT> <P> <TT><FONT FACE="Courier">dec v </FONT></TT> <P> <TT><FONT FACE="Courier">jrnz sal2</FONT></TT> <P> <TT><FONT FACE="Courier">dec a</FONT></TT> <P> <TT><FONT FACE="Courier">jrz fin</FONT></TT> <P> <TT><FONT FACE="Courier">jp sal3</FONT></TT> <P> <TT><FONT FACE="Courier">fin nop</FONT></TT> <P> <TT><FONT FACE="Courier">nop<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">; </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier"> </FONT><FONT FACE="MS LineDraw">³³</FONT></TT> <P> <TT><FONT FACE="Courier">; \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/</FONT></TT> <P> <TT><FONT FACE="Courier">;<BR> <BR> <BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;***** VECTORES **************************************************** <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.org 0ff0h<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">adc nop ;Vector conv. A/D</FONT></TT> <P> <TT><FONT FACE="Courier">reti</FONT></TT> <P> <TT><FONT FACE="Courier">timer nop ;Vector del timer</FONT></TT> <P> <TT><FONT FACE="Courier">reti</FONT></TT> <P> <TT><FONT FACE="Courier">int2 nop ;Vector de PB y PC</FONT></TT> <P> <TT><FONT FACE="Courier">reti</FONT></TT> <P> <TT><FONT FACE="Courier">int1 nop ;Vector de PA</FONT></TT> <P> <TT><FONT FACE="Courier">reti<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.org 0ffch<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">nmi nop ;Vector de NMI</FONT></TT> <P> <TT><FONT FACE="Courier">reti</FONT></TT> <P> <TT><FONT FACE="Courier">res jp reset ;Vector de RESET <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.end<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">Programas realizados para la placa de desarrollo<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;******************************************************************</FONT></TT> <P> <TT><FONT FACE="Courier">;******* Programa para ST6215 *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******* *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******* Entra un dato por PA y lo saca seguidamente por PB *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******* *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******************************************************************</FONT></TT> <P> <TT><FONT FACE="Courier">;***** Define Registros ******************************************** <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.input "st6.asm" <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;***** Define puertos ********************************************</FONT></TT> <P> <TT><FONT FACE="Courier">;***** PA(ent) y PB(sal) ******************************************* <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.org 0880h<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">reset reti ;Retorna a modo normal desues del reset</FONT></TT> <P> <TT><FONT FACE="Courier">ldi ddrpa,0h</FONT></TT> <P> <TT><FONT FACE="Courier">ldi orpa,0h</FONT></TT> <P> <TT><FONT FACE="Courier">ldi drpa,0h ;El puerto A es configurado como entrada</FONT></TT> <P> <TT><FONT FACE="Courier">ldi ddrpb,0ffh</FONT></TT> <P> <TT><FONT FACE="Courier">ldi orpa,0ffh</FONT></TT> <P> <TT><FONT FACE="Courier">ldi drpa,0ffh ;Y el puerto B como salida <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;***** RUTINA PRINCIPAL ******************************************** <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">inicio ld a,drpa ;Carga lo que hay en los pines de PA en A</FONT></TT> <P> <TT><FONT FACE="Courier">ld drpb,a ;Para sacarlos por PB</FONT></TT> <P> <TT><FONT FACE="Courier">jp inicio ;Repite BUCLE <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;***** VECTORES **************************************************** <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.org 0ff0h<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">adc nop ;Vector conv. A/D</FONT></TT> <P> <TT><FONT FACE="Courier">reti</FONT></TT> <P> <TT><FONT FACE="Courier">timer nop ;Vector del timer</FONT></TT> <P> <TT><FONT FACE="Courier">reti</FONT></TT> <P> <TT><FONT FACE="Courier">int2 nop ;Vector de PB y PC</FONT></TT> <P> <TT><FONT FACE="Courier">reti</FONT></TT> <P> <TT><FONT FACE="Courier">int1 nop ;Vector de PA</FONT></TT> <P> <TT><FONT FACE="Courier">reti<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.org 0ffch<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">nmi nop ;Vector de NMI</FONT></TT> <P> <TT><FONT FACE="Courier">reti</FONT></TT> <P> <TT><FONT FACE="Courier">res jp reset ;Vector de RESET <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.end<BR> <BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;****************************************************************************</FONT></TT> <P> <TT><FONT FACE="Courier">;******* Proyecto de Practicas ST6 *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******* *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******* Programa : Control de motor PASO A PASO *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******* ******* </FONT></TT> <P> <TT><FONT FACE="Courier">;******* *******</FONT></TT> <P> <TT><FONT FACE="Courier">;******* José Ignacio Díaz Beamud & Jesús Antonio Alquezar Sierra *******</FONT></TT> <P> <TT><FONT FACE="Courier">;****************************************************************************</FONT></TT> <P> <TT><FONT FACE="Courier">;</FONT></TT> <P> <TT><FONT FACE="Courier">.display "Control de motor paso a paso (J.Ignacio Diaz y J.Antonio Alquezar)"<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;Puerto B como salida (4 lineas de menor peso)</FONT></TT> <P> <TT><FONT FACE="Courier">;Puerto A linea PA7 como entrada con interrupción</FONT></TT> <P> <TT><FONT FACE="Courier">;El resto de lineas de puertos PA,PB y PC quedan en estado de alta impedancia</FONT></TT> <P> <TT><FONT FACE="Courier">;Si se produce una NMI la salida TIMER se activa intermitentemente un tiempo<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.input "st6.asm" ;Entra fichero de definición de registros </FONT></TT> <P> <TT><FONT FACE="Courier">.org 800h ;Ensambla a partir de la 800h</FONT></TT> <P> <TT><FONT FACE="Courier">veces .def 84h,0ffh,0ffh ;Define la posición 84h de datos como 'veces'</FONT></TT> <P> <TT><FONT FACE="Courier">tempo .def 85h,0ffh,0ffh ;Define la posición 85h de datos como 'tempo'</FONT></TT> <P> <TT><FONT FACE="Courier">segun .def 86h,0ffh,0ffh ;Define la posición 86h de datos como 'segun'<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">reset ldi wdr,0feh ;Recarga el watchdog</FONT></TT> <P> <TT><FONT FACE="Courier">reti ;Retorna de interrupción despues del reset</FONT></TT> <P> <TT><FONT FACE="Courier">ldi ddrpa,0</FONT></TT> <P> <TT><FONT FACE="Courier">ldi orpa,10000000b</FONT></TT> <P> <TT><FONT FACE="Courier">ldi drpa,01111111b ;Programa PA7 como interrupción y demás HI­Z </FONT></TT> <P> <TT><FONT FACE="Courier">ldi ddrpb,00001111b </FONT></TT> <P> <TT><FONT FACE="Courier">ldi orpb,00001111b</FONT></TT> <P> <TT><FONT FACE="Courier">ldi drpb,11110000b ;Progrma PB3 a PB0 como salidas y demás HI­Z<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">ldi ior,00110000b ;Abilita interrupciones <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">ldi wdr,0feh ;Recarga el watchdog<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">re1 ldi wdr,0feh ;Recarga el watchdog y entra en un bucle cerrado</FONT></TT> <P> <TT><FONT FACE="Courier">jp re1 ;Y entra en un bucle cerrado</FONT></TT> <P> <TT><FONT FACE="Courier">;Hasta que se produce un interrupción en PA</FONT></TT> <P> <TT><FONT FACE="Courier">;y entonces salta a re2<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;**** Subrutina de antención de PA ******************************************</FONT></TT> <P> <TT><FONT FACE="Courier">;**** Ahora el motor dara una vuelta en un sentido **************************<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">re2 ldi veces,48 ;Carga la posición veces con 48 pasos( 1 vuelta) </FONT></TT> <P> <TT><FONT FACE="Courier">re3 ldi a,0f8h </FONT></TT> <P> <TT><FONT FACE="Courier">ld drpb,a ;Saca a las 4 lineas de menor peso de PB un 0</FONT></TT> <P> <TT><FONT FACE="Courier">;las cuatro superiores en HI­Z</FONT></TT> <P> <TT><FONT FACE="Courier">call tem ;LLama a un temporizador</FONT></TT> <P> <TT><FONT FACE="Courier">ldi a,0fah</FONT></TT> <P> <TT><FONT FACE="Courier">ld drpb,a ;Saca a las 4 lineas de menor peso de PB un 2</FONT></TT> <P> <TT><FONT FACE="Courier">;las cuatro superiores en HI­Z</FONT></TT> <P> <TT><FONT FACE="Courier">call tem ;LLama a un temporizador</FONT></TT> <P> <TT><FONT FACE="Courier">dec veces ;Decrementa la posición veces (n.de pasos)</FONT></TT> <P> <TT><FONT FACE="Courier">jrnz re3 ;Si no es cero salta a re3 de lo contrario sigue</FONT></TT> <P> <TT><FONT FACE="Courier">;**** El motor a dado una vuelta y ahora la dara en sentido contrario *******</FONT></TT> <P> <TT><FONT FACE="Courier">ldi veces,48 ;Carga la posición veces con 48 pasos( 1 vuelta)</FONT></TT> <P> <TT><FONT FACE="Courier">re4 ldi a,0f9h</FONT></TT> <P> <TT><FONT FACE="Courier">ld drpb,a ;Saca a las 4 lineas de menor peso de PB un 1</FONT></TT> <P> <TT><FONT FACE="Courier">;las cuatro superiores en HI­Z</FONT></TT> <P> <TT><FONT FACE="Courier">call tem ;LLama a un temporizador</FONT></TT> <P> <TT><FONT FACE="Courier">ldi a,11111011b</FONT></TT> <P> <TT><FONT FACE="Courier">ld drpb,a ;Saca a las 4 lineas de menor peso de PB un 3</FONT></TT> <P> <TT><FONT FACE="Courier">;las cuatro superiores en HI­Z </FONT></TT> <P> <TT><FONT FACE="Courier">call tem ;LLama a un temporizador </FONT></TT> <P> <TT><FONT FACE="Courier">dec veces ;Decrementa la posición veces (n.de pasos) </FONT></TT> <P> <TT><FONT FACE="Courier">jrnz re4 ;Si no es cero salta a re3 de lo contrario sigue </FONT></TT> <P> <TT><FONT FACE="Courier">ldi a,0f0h </FONT></TT> <P> <TT><FONT FACE="Courier">ld drpb,a ;Pone la salida de PB=0 (4 lineas de menor peso)</FONT></TT> <P> <TT><FONT FACE="Courier">reti ;Retorna de interrupción,despues de dar 1 vuelta</FONT></TT> <P> <TT><FONT FACE="Courier">;**** Subrutina de atención a NMI *******************************************<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">inmi ldi segun,6 ;Intermitente 6 veces</FONT></TT> <P> <TT><FONT FACE="Courier">inmi2 ldi tempo,20 ;Carga 'veces' con 20 (20 * 0.04892 = 0.978 sg)</FONT></TT> <P> <TT><FONT FACE="Courier">sal1 ldi tcr,0ffh ;Carga contador con 255 (valor máximo)</FONT></TT> <P> <TT><FONT FACE="Courier">ldi tscr,00111111b ;Pone el preescaler a 128 y DOUT a 1</FONT></TT> <P> <TT><FONT FACE="Courier">;La temporización es máxima = 0.04892 sg</FONT></TT> <P> <TT><FONT FACE="Courier">loop1 jrr 7,tscr,loop1 ;Espera a que el contador llege a 0</FONT></TT> <P> <TT><FONT FACE="Courier">dec tempo ;Decrementa 'tempo'</FONT></TT> <P> <TT><FONT FACE="Courier">jrnz sal1 ;Repite hasta que 'tempo' = 0</FONT></TT> <P> <TT><FONT FACE="Courier">ldi tempo,20</FONT></TT> <P> <TT><FONT FACE="Courier">sal2 ldi tcr,0ffh</FONT></TT> <P> <TT><FONT FACE="Courier">ldi tscr,00101111b ;Hace lo mismo que el bloque anterior escepto </FONT></TT> <P> <TT><FONT FACE="Courier">;que ahora DOUT = 0,También temporiza 0.978 sg. </FONT></TT> <P> <TT><FONT FACE="Courier">loop2 jrr 7,tscr,loop2</FONT></TT> <P> <TT><FONT FACE="Courier">dec tempo</FONT></TT> <P> <TT><FONT FACE="Courier">jrnz sal2</FONT></TT> <P> <TT><FONT FACE="Courier">dec segun ;Decrementa segun</FONT></TT> <P> <TT><FONT FACE="Courier">jrz sal3 ;Si es 0 salta a sal3</FONT></TT> <P> <TT><FONT FACE="Courier">jp inmi2 ;De lo contrario a inmi (repite)</FONT></TT> <P> <TT><FONT FACE="Courier">sal3 reti ;Si había sido 0 retorna de interrupción</FONT></TT> <P> <TT><FONT FACE="Courier">;**** Temporizador ********************************************************** <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">tem ldi v,0ffh</FONT></TT> <P> <TT><FONT FACE="Courier">tem1 ldi wdr,0feh ; \</FONT></TT> <P> <TT><FONT FACE="Courier">tem2 nop ; |</FONT></TT> <P> <TT><FONT FACE="Courier">nop ; |­­­­> Bucle </FONT></TT> <P> <TT><FONT FACE="Courier">nop ; |</FONT></TT> <P> <TT><FONT FACE="Courier">dec v ; /</FONT></TT> <P> <TT><FONT FACE="Courier">jrnz tem1 ;Repite el bucle 255 veces</FONT></TT> <P> <TT><FONT FACE="Courier">ret ;Retorno de subrutina<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;***** VECTORES **************************************************** <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.org 0ff0h<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">adc nop ;Vector conv. A/D</FONT></TT> <P> <TT><FONT FACE="Courier">reti</FONT></TT> <P> <TT><FONT FACE="Courier">timer nop ;Vector del timer</FONT></TT> <P> <TT><FONT FACE="Courier">reti</FONT></TT> <P> <TT><FONT FACE="Courier">int2 nop ;Vector de PB y PC</FONT></TT> <P> <TT><FONT FACE="Courier">reti</FONT></TT> <P> <TT><FONT FACE="Courier">int1 jp re2 ;Vector de PA</FONT></TT> <P> <TT><FONT FACE="Courier">.org 0ffch<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">nmi jp inmi ;Vector de NMI</FONT></TT> <P> <TT><FONT FACE="Courier">res jp reset ;Vector de RESET <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.end<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">; Versión con uso de directivas (pp_on y section) **********<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;*** ******************************************************* ***</FONT></TT> <P> <TT><FONT FACE="Courier">;*** José Ignacio Díaz Beamud & Jesús Antonio Alquezar **** ***</FONT></TT> <P> <TT><FONT FACE="Courier">;*** ******************************** ST­6 SGS­THOMSON ***** ***</FONT></TT> <P> <TT><FONT FACE="Courier">;­­­ ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ ­­­</FONT></TT> <P> <TT><FONT FACE="Courier">;*** Ordena tabla en orden posicion mas alta valor menor *** ***</FONT></TT> <P> <TT><FONT FACE="Courier">;*** ******************************************************* ***<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.PP_on</FONT></TT> <P> <TT><FONT FACE="Courier">.pl 60</FONT></TT> <P> <TT><FONT FACE="Courier">.vers "st6215"</FONT></TT> <P> <TT><FONT FACE="Courier">.romsize 2</FONT></TT> <P> <TT><FONT FACE="Courier">.input "6215_reg.asm"<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;*** Define etiquetas ********************************** ***<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">nfin .def 90h</FONT></TT> <P> <TT><FONT FACE="Courier">adat .def 91h<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;*** Programa principal ******************************** ***</FONT></TT> <P> <TT><FONT FACE="Courier">.section 1<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.org 080h<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">reset reti ;Coloca NMI a 0 despues del reset</FONT></TT> <P> <TT><FONT FACE="Courier">ldi w,0ah ;Carga primer contador con 0Ah (longitud tabla)</FONT></TT> <P> <TT><FONT FACE="Courier">inibu ldi y,0ah ;Carga segundo contador con 0Ah (longitud tabla)</FONT></TT> <P> <TT><FONT FACE="Courier">ldi nfin,00h ;Pone posicion 090h a 00 </FONT></TT> <P> <TT><FONT FACE="Courier">ldi x,084h ;Carga puntero X con inicio tabla</FONT></TT> <P> <TT><FONT FACE="Courier">sal2 ld a,(x) ;Carga en A el numero que apunta X</FONT></TT> <P> <TT><FONT FACE="Courier">inc x ;Incrementa X</FONT></TT> <P> <TT><FONT FACE="Courier">cp a,(x) ;Compara A con la posicion que indica X actualmente</FONT></TT> <P> <TT><FONT FACE="Courier">jrz sal1 ;Si la comparacion es 0 salta</FONT></TT> <P> <TT><FONT FACE="Courier">jrnc sal1 ;Si no hay carry tambien salta</FONT></TT> <P> <TT><FONT FACE="Courier">ld v,a ;En caso contrario intercambiar,salvaguarda A en V</FONT></TT> <P> <TT><FONT FACE="Courier">ld a,(x) ;Carga en A el numero que apunta X</FONT></TT> <P> <TT><FONT FACE="Courier">dec x ;Decrementa X</FONT></TT> <P> <TT><FONT FACE="Courier">ld (x),a ;Carga A en la direccion indicada por el puntero</FONT></TT> <P> <TT><FONT FACE="Courier">inc x ;Vuelve a incrementar X</FONT></TT> <P> <TT><FONT FACE="Courier">ld a,v ;Devuelve el antiguo valor a A</FONT></TT> <P> <TT><FONT FACE="Courier">ld (x),a ;Y lo deposita en la direccion que apunta X</FONT></TT> <P> <TT><FONT FACE="Courier">jp sal3 ;Salto fin de intercambio</FONT></TT> <P> <TT><FONT FACE="Courier">sal1 inc nfin ;Tratamiento no intercambio,incrementa (090h)</FONT></TT> <P> <TT><FONT FACE="Courier">ld adat,a ;Salva el valor de A en (091h)</FONT></TT> <P> <TT><FONT FACE="Courier">jp inter2 ;Salto intermedio</FONT></TT> <P> <TT><FONT FACE="Courier">inter jp sal2 ;Salto intermedio</FONT></TT> <P> <TT><FONT FACE="Courier">inter2 ld a,nfin ;Coge el valor contenido en (090h)</FONT></TT> <P> <TT><FONT FACE="Courier">jp inter4 ;Salto intermedio</FONT></TT> <P> <TT><FONT FACE="Courier">inter3 jp inibu ;Salto intermedio </FONT></TT> <P> <TT><FONT FACE="Courier">inter4 cpi a,0ah ;Compara A con longitud tabla,el contenido de (090h)</FONT></TT> <P> <TT><FONT FACE="Courier">;contiene las veces que no se encuentra desorden en la</FONT></TT> <P> <TT><FONT FACE="Courier">;tabla por cada escaneo,si la posicion llega a 0A </FONT></TT> <P> <TT><FONT FACE="Courier">;significa que la tabla esta ya ordenada y no es </FONT></TT> <P> <TT><FONT FACE="Courier">;necesario continuar el programa<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">jrz fin ;Si (090h) es igual a 0A acaba programa</FONT></TT> <P> <TT><FONT FACE="Courier">ld a,adat ;Recupera valor de A</FONT></TT> <P> <TT><FONT FACE="Courier">sal3 dec y ;Decrementa Y (primer bucle)</FONT></TT> <P> <TT><FONT FACE="Courier">jrnz inter ;Si no es 0 repite</FONT></TT> <P> <TT><FONT FACE="Courier">dec w ;De lo contrario decrementa W (segundo bucle)</FONT></TT> <P> <TT><FONT FACE="Courier">jrnz inter3 ;Si no es 0 repite</FONT></TT> <P> <TT><FONT FACE="Courier">fin nop ;NO OPERA</FONT></TT> <P> <TT><FONT FACE="Courier">stop ;STOP<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;************************************* Sección de vector interrupciones ****<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.section 32</FONT></TT> <P> <TT><FONT FACE="Courier">.org 0eh<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">res jp reset ;Vector de RESET <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.end<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">; Versión con directivas ORG (definición mapa vectores)<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;*** ******************************************************** ***</FONT></TT> <P> <TT><FONT FACE="Courier">;*** José Ignacio Díaz Beamud & Jesús Antonio Alquezar Sierra ***</FONT></TT> <P> <TT><FONT FACE="Courier">;*** ******************************** ST­6 SGS­THOMSON ****** ***</FONT></TT> <P> <TT><FONT FACE="Courier">;­­­ ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ ­­­</FONT></TT> <P> <TT><FONT FACE="Courier">;*** Ordena tabla en orden posicion mas alta valor menor **** ***</FONT></TT> <P> <TT><FONT FACE="Courier">;*** ******************************************************** ***<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.input "6215_reg.asm"<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;*** Define etiquetas ********************************** ***<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">nfin .def 90h</FONT></TT> <P> <TT><FONT FACE="Courier">adat .def 91h<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;*** Programa principal ******************************** ***<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.org 0800h<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">reset reti ;Coloca NMI a 0 despues del reset</FONT></TT> <P> <TT><FONT FACE="Courier">ldi w,0ah ;Carga primer contador con 0Ah (longitud tabla)</FONT></TT> <P> <TT><FONT FACE="Courier">inibu ldi y,0ah ;Carga segundo contador con 0Ah (longitud tabla)</FONT></TT> <P> <TT><FONT FACE="Courier">ldi nfin,00h ;Pone posicion 090h a 00 </FONT></TT> <P> <TT><FONT FACE="Courier">ldi x,084h ;Carga puntero X con inicio tabla</FONT></TT> <P> <TT><FONT FACE="Courier">sal2 ld a,(x) ;Carga en A el numero que apunta X</FONT></TT> <P> <TT><FONT FACE="Courier">inc x ;Incrementa X</FONT></TT> <P> <TT><FONT FACE="Courier">cp a,(x) ;Compara A con la posicion que indica X actualmente</FONT></TT> <P> <TT><FONT FACE="Courier">jrz sal1 ;Si la comparacion es 0 salta</FONT></TT> <P> <TT><FONT FACE="Courier">jrnc sal1 ;Si no hay carry tambien salta</FONT></TT> <P> <TT><FONT FACE="Courier">ld v,a ;En caso contrario intercambiar,salvaguarda A en V</FONT></TT> <P> <TT><FONT FACE="Courier">ld a,(x) ;Carga en A el numero que apunta X</FONT></TT> <P> <TT><FONT FACE="Courier">dec x ;Decrementa X</FONT></TT> <P> <TT><FONT FACE="Courier">ld (x),a ;Carga A en la direccion indicada por el puntero</FONT></TT> <P> <TT><FONT FACE="Courier">inc x ;Vuelve a incrementar X</FONT></TT> <P> <TT><FONT FACE="Courier">ld a,v ;Devuelve el antiguo valor a A</FONT></TT> <P> <TT><FONT FACE="Courier">ld (x),a ;Y lo deposita en la direccion que apunta X</FONT></TT> <P> <TT><FONT FACE="Courier">jp sal3 ;Salto fin de intercambio</FONT></TT> <P> <TT><FONT FACE="Courier">sal1 inc nfin ;Tratamiento no intercambio,incrementa (090h)</FONT></TT> <P> <TT><FONT FACE="Courier">ld adat,a ;Salva el valor de A en (091h)</FONT></TT> <P> <TT><FONT FACE="Courier">jp inter2 ;Salto intermedio</FONT></TT> <P> <TT><FONT FACE="Courier">inter jp sal2 ;Salto intermedio</FONT></TT> <P> <TT><FONT FACE="Courier">inter2 ld a,nfin ;Coge el valor contenido en (090h)</FONT></TT> <P> <TT><FONT FACE="Courier">jp inter4 ;Salto intermedio</FONT></TT> <P> <TT><FONT FACE="Courier">inter3 jp inibu ;Salto intermedio </FONT></TT> <P> <TT><FONT FACE="Courier">inter4 cpi a,0ah ;Compara A con longitud tabla,el contenido de (090h)</FONT></TT> <P> <TT><FONT FACE="Courier">;contiene las veces que no se encuentra desorden en la</FONT></TT> <P> <TT><FONT FACE="Courier">;tabla por cada escaneo,si la posicion llega a 0A </FONT></TT> <P> <TT><FONT FACE="Courier">;significa que la tabla esta ya ordenada y no es </FONT></TT> <P> <TT><FONT FACE="Courier">;necesario continuar el programa</FONT></TT> <P> <TT><FONT FACE="Courier">jrz fin ;Si (090h) es igual a 0A acaba programa</FONT></TT> <P> <TT><FONT FACE="Courier">ld a,adat ;Recupera valor de A</FONT></TT> <P> <TT><FONT FACE="Courier">sal3 dec y ;Decrementa Y (primer bucle)</FONT></TT> <P> <TT><FONT FACE="Courier">jrnz inter ;Si no es 0 repite</FONT></TT> <P> <TT><FONT FACE="Courier">dec w ;De lo contrario decrementa W (segundo bucle)</FONT></TT> <P> <TT><FONT FACE="Courier">jrnz inter3 ;Si no es 0 repite</FONT></TT> <P> <TT><FONT FACE="Courier">fin nop ;NO OPERA</FONT></TT> <P> <TT><FONT FACE="Courier">stop ;STOP<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;************************************* Sección de vector interrupciones ****<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.org 0ffeh<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">res jp reset ;Vector de RESET <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.end<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">; ***************************************************************</FONT></TT> <P> <TT><FONT FACE="Courier">; ** ****** ****** Control de Semaforo para ST­6 ****** ****** **</FONT></TT> <P> <TT><FONT FACE="Courier">; *************************************************************** <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">; Semaforo para ST6215 <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">; Por José Ignacio Diaz Beamud & Jesús Antonio Alquezar</FONT></TT> <P> <TT><FONT FACE="Courier">;***************************************************************************** <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.input "st62.asm" ;Define registros <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.W_ON ;Abilita el trabajo con RDW<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">num .def 084h,0ffh,0ffh ;Define num como posición 84h de datos<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;***************************************************** Tabla de datos **<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.org 800h<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">datos .byte 00110001b,00101111b,00110001b,0fh,00110001b,00101111b</FONT></TT> <P> <TT><FONT FACE="Courier">.byte 00110001b,0fh,01010001b,00101111b,10010010b,11001111b</FONT></TT> <P> <TT><FONT FACE="Courier">.byte 10010010b,11011111b,10010010b,11001111b </FONT></TT> <P> <TT><FONT FACE="Courier">.byte 10010010b,11011111b,10010010b,11001111b,10010010b,11011111b</FONT></TT> <P> <TT><FONT FACE="Courier">.byte 10010010b,11001111b,10010010b,11011111b,10010010b,11001111b</FONT></TT> <P> <TT><FONT FACE="Courier">.byte 10000100b,11001111b,10000100b,01001111b,10000100b,11001111b</FONT></TT> <P> <TT><FONT FACE="Courier">.byte 10000100b,01001111b,10000100b,11001111b,10001001b,01001111b <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">tempo .byte 7,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1 <BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;****************************** Rutina de inicio y programacion de puertos **<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">reset ldi wdr,0feh ;Carga el wathchdog con su valor máximo </FONT></TT> <P> <TT><FONT FACE="Courier">reti ;Retorna al modo normal despues del reset</FONT></TT> <P> <TT><FONT FACE="Courier">ldi ior,10h ;Desabilita todas las interrupciones</FONT></TT> <P> <TT><FONT FACE="Courier">ldi rdw,datos.w ;Pone en el RDW el valor apropiado</FONT></TT> <P> <TT><FONT FACE="Courier">ldi ddrpa,0ffh ;Programa el puerto A como salida y saca 00</FONT></TT> <P> <TT><FONT FACE="Courier">ldi orpa,0ffh</FONT></TT> <P> <TT><FONT FACE="Courier">ldi drpa,00</FONT></TT> <P> <TT><FONT FACE="Courier">ldi ddrpb,0f0h ;Programa el puerto B como salida y las lineas de</FONT></TT> <P> <TT><FONT FACE="Courier">ldi orpb, 0f0h ;interruptores quedan en alta impedancia</FONT></TT> <P> <TT><FONT FACE="Courier">ldi drpb, 00fh<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;************************************** Programa principal ******************<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">s2 ldi num,20 ;Carga en la posicion num el numero de estados</FONT></TT> <P> <TT><FONT FACE="Courier">ldi x,datos.d ;Carga en X el valor apropiado de puntero</FONT></TT> <P> <TT><FONT FACE="Courier">ldi y,tempo.d ;Carga en Y el valor apropiado de puntero</FONT></TT> <P> <TT><FONT FACE="Courier">s1 ld a,(x) ;Carga lo que hay en la posicion apuntada por X en A</FONT></TT> <P> <TT><FONT FACE="Courier">ld drpa,a ;y lo lleva al puerto A de datos</FONT></TT> <P> <TT><FONT FACE="Courier">inc x ;Incrementa el puntero X</FONT></TT> <P> <TT><FONT FACE="Courier">ld a,(x) ;y lleva el siguiente dato al acumulador</FONT></TT> <P> <TT><FONT FACE="Courier">ld drpb,a ;para llevarlo al puerto B de datos (hay que tener</FONT></TT> <P> <TT><FONT FACE="Courier">;cuidado ya que los 4 bits menos significativos </FONT></TT> <P> <TT><FONT FACE="Courier">;tienen que estar a 1 para mantener el estado de </FONT></TT> <P> <TT><FONT FACE="Courier">;alta impedancia de esas lineas)</FONT></TT> <P> <TT><FONT FACE="Courier">ld a,(y) ;Carga en A el tiempo a temporizar</FONT></TT> <P> <TT><FONT FACE="Courier">call temp ;Y llama a subrutina de temporización</FONT></TT> <P> <TT><FONT FACE="Courier">inc x ;Incrementa puntero X</FONT></TT> <P> <TT><FONT FACE="Courier">inc y ;Incrementa puntero Y</FONT></TT> <P> <TT><FONT FACE="Courier">dec num ;Decrementa el número de estados</FONT></TT> <P> <TT><FONT FACE="Courier">jrnz s1 ;Si no es 0 repite el bucle</FONT></TT> <P> <TT><FONT FACE="Courier">jp s2 ;Si es 0 comienza de nuevo<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;********************************************** Subrutina temporizador ******<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">temp jrnz inic</FONT></TT> <P> <TT><FONT FACE="Courier">jp fin</FONT></TT> <P> <TT><FONT FACE="Courier">inic ldi v,0ach</FONT></TT> <P> <TT><FONT FACE="Courier">sal2 ldi w,0ffh</FONT></TT> <P> <TT><FONT FACE="Courier">sal1 ldi wdr,0feh ;Recarga el WATCHDOG para que no llege a ser 0</FONT></TT> <P> <TT><FONT FACE="Courier">nop ;y se produzca un reset</FONT></TT> <P> <TT><FONT FACE="Courier">nop</FONT></TT> <P> <TT><FONT FACE="Courier">dec w</FONT></TT> <P> <TT><FONT FACE="Courier">jrnz sal1</FONT></TT> <P> <TT><FONT FACE="Courier">dec v </FONT></TT> <P> <TT><FONT FACE="Courier">jrnz sal2</FONT></TT> <P> <TT><FONT FACE="Courier">dec a</FONT></TT> <P> <TT><FONT FACE="Courier">jrz fin</FONT></TT> <P> <TT><FONT FACE="Courier">jp temp</FONT></TT> <P> <TT><FONT FACE="Courier">fin ret<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;*********************** Subrutina atención a NMI(estado avería)****<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">inmi ldi ior,00</FONT></TT> <P> <TT><FONT FACE="Courier">ldi wdr,0feh</FONT></TT> <P> <TT><FONT FACE="Courier">ldi rdw,datos2.w<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">is2 ldi num,2 ;Carga en la posicion num el numero de estados</FONT></TT> <P> <TT><FONT FACE="Courier">ldi x,datos2.d ;Carga en X el valor apropiado de puntero</FONT></TT> <P> <TT><FONT FACE="Courier">ldi y,tempo2.d ;Carga en Y el valor apropiado de puntero<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">is1 ld a,(x) ;Carga lo que hay en la posicion apuntada por X en A</FONT></TT> <P> <TT><FONT FACE="Courier">ld drpa,a ;y lo lleva al puerto A de datos</FONT></TT> <P> <TT><FONT FACE="Courier">inc x ;Incrementa el puntero X</FONT></TT> <P> <TT><FONT FACE="Courier">ld a,(x) ;y lleva el siguiente dato al acumulador</FONT></TT> <P> <TT><FONT FACE="Courier">ld drpb,a ;para llevarlo al puerto B de datos (hay que tener</FONT></TT> <P> <TT><FONT FACE="Courier">;cuidado ya que los 4 bits menos significativos </FONT></TT> <P> <TT><FONT FACE="Courier">;tienen que estar a 1 para mantener el estado de </FONT></TT> <P> <TT><FONT FACE="Courier">;alta impedancia de esas lineas)</FONT></TT> <P> <TT><FONT FACE="Courier">ld a,(y) ;Carga en A el tiempo a temporizar</FONT></TT> <P> <TT><FONT FACE="Courier">call temp ;Y llama a subrutina de temporización</FONT></TT> <P> <TT><FONT FACE="Courier">inc x ;Incrementa puntero X</FONT></TT> <P> <TT><FONT FACE="Courier">inc y ;Incrementa puntero Y</FONT></TT> <P> <TT><FONT FACE="Courier">dec num ;Decrementa el número de estados</FONT></TT> <P> <TT><FONT FACE="Courier">jrnz is1 ;Si no es 0 repite el bucle</FONT></TT> <P> <TT><FONT FACE="Courier">jp is2 ;Si es 0 comienza de nuevo<BR> <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">datos2 .byte 01001000b,10101111b,0,10111111b</FONT></TT> <P> <TT><FONT FACE="Courier">tempo2 .byte 1,1<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">;***** VECTORES **************************************************** <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.org 0ff0h<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">adc nop ;Vector conv. A/D</FONT></TT> <P> <TT><FONT FACE="Courier">reti</FONT></TT> <P> <TT><FONT FACE="Courier">timer nop ;Vector del timer</FONT></TT> <P> <TT><FONT FACE="Courier">reti</FONT></TT> <P> <TT><FONT FACE="Courier">int2 nop ;Vector de PB y PC</FONT></TT> <P> <TT><FONT FACE="Courier">reti</FONT></TT> <P> <TT><FONT FACE="Courier">int1 nop ;Vector de PA</FONT></TT> <P> <TT><FONT FACE="Courier">reti<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.org 0ffch<BR> </FONT></TT> <P> <TT><FONT FACE="Courier">nmi jp inmi ;Vector de NMI</FONT></TT> <P> <TT><FONT FACE="Courier">res jp reset ;Vector de RESET <BR> </FONT></TT> <P> <TT><FONT FACE="Courier">.end</FONT></TT> <HR> <P> <CENTER><FONT SIZE=1>pagina finalizada 27/3/1997</FONT></CENTER> <CENTER><EMBED SRC="st6.mid" WIDTH=140 HEIGHT=60 AUTOSTART="true" LOOP="infinite"></EMBED> </BODY> </HTML>