2021-09-12 22:35:00 +02:00

3305 lines
116 KiB
HTML

<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&aacute;n integrados
las partes que componen un sistema con microprocesador, como la
CPU, los m&oacute;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&oacute;nica, disminuye costes y
un s&oacute;lo MCU puede sustituir a un circuito digital complejo,
que necesita de muchos C.I. (circuitos integrados), y tiempo para
su dise&ntilde;o. Incluyendo un MCU en un circuito de estas caracter&iacute;sticas
lo &uacute;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&iacute;a que ocupar un sistema digital
complejo, una circuiter&iacute;a convencional o un sistema con
microprocesador con todo lo que ello conlleva, como el espacio
necesario y la complejidad de dise&ntilde;ar un sistema m&iacute;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&aacute; 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&oacute;n
electr&oacute;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&oacute;n
del ST6 y una vez adquiridos los conocimientos necesarios hemos
empezado ha desarrollar pr&aacute;cticas con el para aplicar la
teor&iacute;a. Hemos desarrollado una placa de desarrollo para
realizar estas pr&aacute;cticas con m&aacute;s facilidad y una
aplicaci&oacute;n final (METEO),esta aplicaci&oacute;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&aacute;sicas, f&aacute;ciles de programar y bajo coste.
Todos MCU de esta familia est&aacute;n constituidos alrededor
de una misma CPU de 8 bits, rodeada de diversos perif&eacute;ricos
y dependiendo del modelo m&aacute;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&iacute;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&oacute;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&oacute;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&oacute;n</FONT></TT>
<P>
<TT><FONT FACE="Courier">- Salidas en colector abierto</FONT></TT>
<P>
<TT><FONT FACE="Courier">- Entradas anal&oacute;gicas<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">- 4 l&iacute;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&oacute;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&aacute;tico tras conexi&oacute;n
de alimentaci&oacute;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&uacute;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&aacute;n
en cuanto a l&iacute;neas de I/O, y memoria, ahora vamos a hacer
una descripci&oacute;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&iacute;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&eacute;ricos que estos llevan incluidos
en la misma pastilla, vamos a nombrarlos y 2 puntos m&aacute;s
adelante los trataremos m&aacute;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&iacute;neas de puertos I/O</FONT></TT>
<P>
<TT><FONT FACE="Courier">- Digital Watchdog/Timer<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">* Descripci&oacute;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&oacute;n. Vss es la conexi&oacute;n a masa
y Vdd la conexi&oacute;n a positivo. La tensi&oacute;n de alimentaci&oacute;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&aacute;n conectadas al oscilador interno del
chip, a estas patillas hay que conectar un circuito resonante,
una se&ntilde;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&aacute;s r&aacute;pido que el ST6.</FONT></TT>
<P>
<TT><FONT FACE="Courier">Un ciclo m&aacute;quina consta de 13
ciclos de reloj, 12 de los cuales se emplean en la b&uacute;squeda
del c&oacute;digo OP, decodificaci&oacute;n e incremento del PC
para localizar el operando o la siguiente instrucci&oacute;n y
el &uacute;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&oacute;gico el MCU entra en modo
de TEST, este test se realiza en fabrica. El usuario debe llevarla
a masa. Si es una versi&oacute;n EPROM y se lleva a 12.5V durante
la secuencia RESET se produce el modo de programaci&oacute;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&oacute;n no mascarable,
aunque en realidad se deber&iacute;a decir para ser m&aacute;s
exactos que es una interrupci&oacute;n de m&aacute;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&oacute;n es sensible al flanco descendente. En
los modelos EPROM este pin no esta conectado al positivo a trav&eacute;s
de una resistencia PULL-UP por lo que el usuario si lo necesita
deber&aacute; conectarla en el exterior. En las versiones ROM
se puede decidir si esta resistencia se incluye en f&aacute;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&iacute;nea I/O, esta patilla al igual que
la l&iacute;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&aacute; que conectarla el desde el exterior. Este
pin puede ser utilizado como I/O dependiendo del modo de funcionamiento
del timer. Si est&aacute; programada como entrada este pin ser&aacute;
la se&ntilde;al de reloj del preescaler, si act&uacute;a como
salida esta sacara el nivel l&oacute;gico preprogramado cuando
el timer termine su temporizaci&oacute;n.<BR>
<BR>
<BR>
<I>PA0-PA3, PA4-PA7 :</I> Estas 8 l&iacute;neas conforman las
l&iacute;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&oacute;n mascarable</FONT></TT>
<P>
<TT><FONT FACE="Courier">3. Salida en colector abierto o tambi&eacute;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&oacute;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&iacute;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&oacute;n mascarable</FONT></TT>
<P>
<TT><FONT FACE="Courier">3. Salida en colector abierto o tambi&eacute;n
en PUSH-PULL</FONT></TT>
<P>
<TT><FONT FACE="Courier">4. Entrada anal&oacute;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&iacute;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&oacute;n mascarable</FONT></TT>
<P>
<TT><FONT FACE="Courier">3. Salida en colector abierto o tambi&eacute;n
en PUSH-PULL</FONT></TT>
<P>
<TT><FONT FACE="Courier">4. Entrada anal&oacute;gica para el convertidor
A/D<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">Estas l&iacute;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&eacute;s de los buses.</FONT></TT>
<P>
<TT><FONT FACE="Courier">Cuando se genera un RESET bien a trav&eacute;s
de la patilla reset, a la secuencia de inicio tras la conexi&oacute;n
de la alimentaci&oacute;n o a trav&eacute;s del WATCHDOG, el PC
direcciona la memoria de programa. De esta forma se obtiene el
c&oacute;digo OP de la instrucci&oacute;n a ejecutar que se decodifica
en la unidad de control, y se generan las se&ntilde;ales necesarias.</FONT></TT>
<P>
<TT><FONT FACE="Courier">Dependiendo del tipo de instrucci&oacute;n,
el operando puede direccionar el &aacute;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&iacute; como los de control para los distintos
perif&eacute;ricos.</FONT></TT>
<P>
<TT><FONT FACE="Courier">La ALU realiza todas las operaciones
aritm&eacute;tico-l&oacute;gicas cl&aacute;sicas. Recibe los operandos
desde el &aacute;rea de programa y/o datos. <BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">Los resultados obtenidos pueden retornar
al &aacute;rea de datos o, incluso, dependiendo del tipo de instrucci&oacute;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 &aacute;rea de programa en busca de nuevas instrucciones para
ejecutar.</FONT></TT>
<P>
<CENTER><TT><FONT FACE="Courier">El STACK o pila se emplear&aacute;
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&oacute;sito general y se
emplea en las operaciones aritm&eacute;tico-l&oacute;gicas y manipulaci&oacute;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&oacute;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&eacute;n
como registros de prop&oacute;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&oacute;n
que se va a ejecutar. El PC al igual que el del Z80, se incrementa
nada m&aacute;s que la direcci&oacute;n ROM ha sido le&iacute;da.
Tras una interrupci&oacute;n el PC se guarda en el STACK y se
carga con el valor del VECTOR de la interrupci&oacute;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&oacute;n normal, interrupci&oacute;n
mascarable y interrupci&oacute;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&aacute;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&oacute;n
mascarable, CNMI y ZNMI son los FLAGS para el modo de interrupci&oacute;n
no mascarable (m&aacute;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 (&uacute;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&oacute;n
o un salto a subrutina el PC se guarda en la posici&oacute;n de
PILA correspondiente autom&aacute;ticamente, cuando la CPU ejecuta
una RET o una RETI el PC de la pila es autom&aacute;ticamente
recuperado. Es importante observar que el m&aacute;ximo nivel
entre interrupciones y subrutinas es 6, ya que si se sobrepasa
este n&uacute;mero el valor de la &uacute;ltima posici&oacute;n
del STACK se perder&iacute;a. Si el usuario necesita guardar el
valor de diversos registros en un salto a interrupci&oacute;n
o subrutina deber&aacute; hacerlo guardando los registros en posiciones
de memoria para despu&eacute;s recuperarlos. Si el STACK esta
vac&iacute;o y se ejecuta una RET o una RETI el programa no hace
nada y ejecuta la siguiente instrucci&oacute;n que se encuentre
detr&aacute;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 &aacute;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&oacute;n. Es direccionada por el PC. Las direcciones
para cada componente de la familia ST62 aqu&iacute; 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&oacute;n
0800h y en las de 4K en la 0000h. Las direcciones que no aparecen
en el anterior mapa no est&aacute;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&iacute;fica llamada
zona o &aacute;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&iacute; 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&oacute;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&eacute;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&iacute; 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&oacute;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&uacute;n
se programen controlan los diferentes perif&eacute;ricos.<BR>
<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">Las posiciones de la memoria de datos
est&aacute;n distribuidas como sigue :<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">040h-07Fh ----&gt; Ventana de datos constantes</FONT></TT>
<P>
<TT><FONT FACE="Courier">080h ----&gt; Registro Indice X</FONT></TT>
<P>
<TT><FONT FACE="Courier">081h ----&gt; Registro Indice Y</FONT></TT>
<P>
<TT><FONT FACE="Courier">082h ----&gt; Registro General V</FONT></TT>
<P>
<TT><FONT FACE="Courier">083h ----&gt; Registro General W</FONT></TT>
<P>
<TT><FONT FACE="Courier">084h-0BFh ----&gt; Ram de datos</FONT></TT>
<P>
<TT><FONT FACE="Courier">0C9h ----&gt; RDW</FONT></TT>
<P>
<TT><FONT FACE="Courier">0FFh ----&gt; Acumulador<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">Las direcciones de los registros de los
perif&eacute;ricos ser&aacute;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 &aacute;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&iacute;a pensar que no se podr&iacute;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&oacute;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&ntilde;a a la instrucci&oacute;n, resultando una direcci&oacute;n
de 12 bits que permite expresar cualquier posici&oacute;n f&iacute;sica
de la zona o &aacute;rea de programa EPROM.<BR>
<BR>
</FONT></I><FONT FACE="Courier">Ejemplo : Suponiendo que el RDW
valga 22h, y se ejecute una instrucci&oacute;n LD A,43 la porci&oacute;n
de memoria de programa f&iacute;sica reflejada en las posiciones
de la 40h a la 7Fh de la zona de datos, est&aacute; comprendida
entre la 880h y la 8BFh. As&iacute;, el acumulador se carga con
lo que hay en la 43h que es el reflejo de la posici&oacute;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&oacute;n
mascarable y una no mascarable de m&aacute;xima prioridad (NMI).
<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">Cada interrupci&oacute;n tiene asociado
un vector de interrupci&oacute;n, que contiene la direcci&oacute;n
de salto hacia la subrutina de atenci&oacute;n a la interrupci&oacute;n.
Estos vectores est&aacute;n localizados de forma fija en la memoria
EPROM. Cuando se produce una interrupci&oacute;n el PC se guarda
en el STACK y se carga con el valor de la direcci&oacute;n del
vector correspondiente, el PC ejecuta la instrucci&oacute;n que
hay en el vector de interrupci&oacute;n que deber&aacute; ser
normalmente una instrucci&oacute;n JP etiqueta, por lo tanto salta
a la subrutina de atenci&oacute;n de interrupci&oacute;n.<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">Los FLAGS conmutan al modo de interrupci&oacute;n
correspondiente. Cuando el programa de atenci&oacute;n a interrupci&oacute;n
termina ( con un RETI retorno de interrupci&oacute;n ) el PC se
recupera del STACK y los FLAGS conmutan al modo normal y la ejecuci&oacute;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&oacute;n</FONT></TT>
</TD><TD WIDTH=201><BR>
<TT><FONT FACE="Courier">N&uacute;mero de Vector</FONT></TT>
</TD><TD WIDTH=201><BR>
<TT><FONT FACE="Courier">Direcci&oacute;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&oacute;n NMI es la de m&aacute;xima prioridad, esta
interrupci&oacute;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 &uacute;ltima
a la n&uacute;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&oacute;n
0C8h de datos. Es un registro de s&oacute;lo escritura que no
puede accederse mediante instrucciones de manipulaci&oacute;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">&Auml;&Acirc;&Auml;&Auml;&Auml;&Auml;&Auml;&Auml;</FONT><FONT FACE="Courier">&gt;
ACTIVO : <I>ACTIVA TODAS INTERRUPCIONES</I></FONT></TT>
<P>
<TT><FONT FACE="MS LineDraw"> &#179;</FONT></TT>
<P>
<TT><FONT FACE="MS LineDraw"> &Agrave;&Auml;&Auml;&Auml;&Auml;&Auml;&Auml;</FONT><FONT FACE="Courier">&gt;
DESACTIVO : <I>DESACTIVA TODAS INTERRUPCIONES</I></FONT></TT>
<P>
<TT><FONT FACE="Courier">IOR5 </FONT><FONT FACE="MS LineDraw">&Auml;&Acirc;&Auml;&Auml;&Auml;&Auml;&Auml;&Auml;</FONT><FONT FACE="Courier">&gt;
ACTIVO : <I>INT.2 ACTIVA, FLANCO ASCENDENTE</I></FONT></TT>
<P>
<TT><FONT FACE="MS LineDraw"> &#179;</FONT></TT>
<P>
<TT><FONT FACE="MS LineDraw"> &Agrave;&Auml;&Auml;&Auml;&Auml;&Auml;&Auml;</FONT><FONT FACE="Courier">&gt;
DESACTIVO : <I>INT.2 ACTIVA, FLANCO DESCENDENTE</I></FONT></TT>
<P>
<TT><FONT FACE="Courier">IOR6 </FONT><FONT FACE="MS LineDraw">&Auml;&Acirc;&Auml;&Auml;&Auml;&Auml;&Auml;&Auml;</FONT><FONT FACE="Courier">&gt;
ACTIVO : <I>INT.1 ACTIVA, NIVEL LOGICO &quot;0&quot;</I></FONT></TT>
<P>
<TT><FONT FACE="MS LineDraw"> &#179;</FONT></TT>
<P>
<TT><FONT FACE="MS LineDraw"> &Agrave;&Auml;&Auml;&Auml;&Auml;&Auml;&Auml;</FONT><FONT FACE="Courier">&gt;
DESACTIVO : <I>INT.1 ACTIVA, FLANCO DESCENDENTE<BR>
</I></FONT></TT>
<P>
<TT><FONT FACE="Courier">Si hay varias l&iacute;neas de un mismo
puerto que pueden interrumpir, siempre que interrumpan sea la
l&iacute;nea que sea se salta a su correspondiente vector de puerto
y el usuario deber&aacute; ser el encargado en la subrutina de
tratamiento de la interrupci&oacute;n de determinar que l&iacute;nea
fue la que interrumpi&oacute;.<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&ntilde;al externa
aplicada por el PIN RESET</FONT></TT>
<P>
<TT><FONT FACE="Courier">2- De forma autom&aacute;tica, tras la
conexi&oacute;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&oacute;n de salto (JP) a la direcci&oacute;n de
comienzo de la rutina principal del sistema.<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">La CPU se pone autom&aacute;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&oacute;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&iacute;neas de I/O
se agrupan en tres puertas llamadas PA, PB y PC. Cada puerta est&aacute;
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&oacute;n
en el &aacute;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&aacute; asociado
a cada una de las l&iacute;neas de los puertos. As&iacute;, por
ejemplo el BIT 0 de DRPA, DDRPA y ORPA est&aacute; asociado con
la l&iacute;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&iacute;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&aacute;s de una entrada anal&oacute;gica
simult&aacute;neamente y la otra es que cuando una l&iacute;nea
se programa como entrada <I>SIN PULL-UP </I>ni interrupci&oacute;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&oacute;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&oacute;n que se desee realizar. Este registro
se va decrementando en cada flanco ascendente de la se&ntilde;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&oacute;n <I>D3h del &aacute;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&oacute;n <I>D2h del &aacute;rea de datos.</I>
Se trata tambi&eacute;n de un contador descendente que se decrementa
en los flancos ascendentes de la se&ntilde;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&ntilde;ales
obtenidas en la entrada del CLK del preescaler, en el bit 0, bit
1, en el 2,3,4,5,6 ser&aacute;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&iacute; como conocer el estado del mismo. Este registro
puede ser le&iacute;do y escrito en la posici&oacute;n <I>D4h
del &aacute;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&eacute; a
1, en caso contrario la temporizaci&oacute;n queda detenida.<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">2- Contador de Eventos : La patilla TIMER
act&uacute;a como entrada de CLK del TIMER y cuando los pulsos
contados sean iguales que el valor del contador la temporizaci&oacute;n
termina. La frecuencia m&aacute;xima de entrada por el TIMER ser&aacute;
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&oacute;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&oacute;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&oacute;n conocido como
de APROXIMACIONES SUCESIVAS, si el MCU trabaja a 8Mhz el tiempo
de conversi&oacute;n ser&aacute;n de unos 70uS. El conversor puede
tener varios canales de entrada, pero como ya se dijo s&oacute;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&oacute;n (ADR) y el otro establece
las diferentes formas de trabajo y control (ADC).</FONT></TT>
<P>
<TT><FONT FACE="Courier">La resoluci&oacute;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&iacute; pues si por ejemplo el MCU est&aacute; alimentado a
5V, la resoluci&oacute;n es de 19,5 mV.</FONT></TT>
<P>
<TT><FONT FACE="Courier">El RESET detiene, en el momento de producirse,
cualquier conversi&oacute;n que se est&eacute; 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&oacute;n
D1h del &aacute;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 &quot;colgado&quot; o entre en ciclos de espera excesivamente
largos. Se deber&aacute; 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&oacute;n SWD
y los de HARDWARE HWD. </FONT></TT>
<P>
<TT><FONT FACE="Courier">En el tipo HARDWARE el WATCHDOG se inicializa
autom&aacute;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&oacute;n SOFTWARE el usuario
controla el funcionamiento o no del WATCHDOG. En caso de no activarlo
se podr&aacute; 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&oacute;n D8h del area de datos y
se representa como WDR. <BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">El valor de temporizaci&oacute;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&ntilde;ado para aprovechar al m&aacute;ximo las posibilidades
del hardware usando la m&iacute;nima memoria posible. Por ello
gran parte de las instrucciones necesitan de un &uacute;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&ntilde;a
al c&oacute;digo OP de la instrucci&oacute;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&oacute;n de memoria donde se encuentra el dato a procesar,
se da en el operando de un byte que acompa&ntilde;a a la instrucci&oacute;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&oacute;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&oacute;n o test de una determinada condici&oacute;n.
Si esta se cumple el PC se puede desplazar 15 posiciones hacia
adelante o hacia atr&aacute;s desde la posici&oacute;n en que
se encuentre en ese momento. Si por el contrario dicha condici&oacute;n
no se cumple, se ejecuta la siguiente instrucci&oacute;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&oacute;digo OP se indica
el n&uacute;mero del bit a comprobar su estado l&oacute;gico y
seg&uacute;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&oacute;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&iacute;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&iacute;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&oacute;n debe de ir precedida por un signo menos, estas pueden
ser tanto en may&uacute;sculas como min&uacute;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&ntilde;ade un mapa de informaci&oacute;n
al final de name.LIS</FONT></TT>
<P>
<TT><FONT FACE="Courier">-S Crea una tabla con los s&iacute;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&oacute;n para la
m&aacute;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&oacute;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&eacute;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&oacute;nico : Cualquier mnem&oacute;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&iacute;mbolos y expresiones
: <BR>
</FONT></I></TT>
<P>
<TT><FONT FACE="Courier">N&uacute;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&uacute;mero es una cadena de d&iacute;gitos.
Por defecto los n&uacute;meros ser&aacute;n decimales.Ej : AFF
es un s&iacute;mbolo, 0AFFh es un n&uacute;mero.<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">Caracteres Constantes :</FONT></TT>
<P>
<TT><FONT FACE="Courier">El car&aacute;cter constante esta representado
por un car&aacute;cter ASCII entre comillas simples (ej: &#180;a&#180;).
El valor del car&aacute;cter constante es el c&oacute;digo ASCII
para ese car&aacute;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&aacute;cticamente al c&oacute;digo de una instrucci&oacute;n
m&aacute;quina, pero esta se usa para la generaci&oacute;n del
c&oacute;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&oacute;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&oacute;n
del bloque es determinada por la expresi&oacute;n en el campo
de operando. Si la etiqueta est&aacute; presente a esta se le
asigna la direcci&oacute;n de la primera posici&oacute;n del bloque
de memoria. Todos los s&iacute;mbolos de la expresi&oacute;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&oacute;n,[expresi&oacute;n]
<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">Esta directiva genera sucesivas palabras
de c&oacute;digo objeto en el espacio de programa. El byte menos
significativo se coloca en la direcci&oacute;n inferior y el byte
m&aacute;s significativo en la posici&oacute;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&oacute;n,[expresi&oacute;n]
<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">Esta directiva genera sucesivos bytes
de c&oacute;digo en el espacio de programa. El valor de la expresi&oacute;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 &quot;cadena&quot;</FONT></TT>
<P>
<TT><FONT FACE="Courier">[etiqueta] .ASCIZ &quot;cadena&quot;
<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&ntilde;ade un car&aacute;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&oacute;n,[R-MASK],[W-MASK],[V],[M]
<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">Esta directiva define las caracter&iacute;sticas
de la direcci&oacute;n del espacio de datos. Ej: valor .DEF 084h
, asigna a la etiqueta valor la direcci&oacute;n 084h del &aacute;rea
de datos.</FONT></TT>
<P>
<TT><FONT FACE="Courier">[M] coloca una marca en el fichero .DSD,
esa marca har&aacute; que mientras se est&aacute; simulando el
programa en el simulador, la posici&oacute;n definida se visualizara
en la ventana de registros. En esa ventana s&oacute;lo se visualizar&aacute;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&oacute;n
<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">Asigna el valor de la expresi&oacute;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&oacute;n
<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">Es muy similar a .EQU, la &uacute;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 &quot;name.asm&quot;
<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">A&ntilde;ade al fichero fuente el indicado
por .INPUT. Se suele utilizar para a&ntilde;adir a los ficheros
fuentes el fichero de definici&oacute;n de registros ya que este
es com&uacute;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 &quot;cadena&quot;
<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&iacute;neas presentes despu&eacute;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&oacute;n<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">Asigna el valor de la expresi&oacute;n
al contador de localizaci&oacute;n. Todos los s&iacute;mbolos
que aparezcan en expresi&oacute;n deben haber sido definidos previamente.
Esta directiva no funciona con la opci&oacute;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 &quot;cadena&quot;</FONT></TT>
<P>
<TT><FONT FACE="Courier">.WARNING &quot;cadena&quot;<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&oacute;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 &quot;ST6.ASM&quot; ;Entra definici&oacute;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&oacute;n apropiada para que en ;el &aacute;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&oacute;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&aacute;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&ntilde;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&ntilde;adir al AST6.EXE cuando se va a ensamblar el
programa a simular la opci&oacute;n -S, para que el simulador
carge el fichero nombre.SYS, es m&aacute;s f&aacute;cil de seguir
la simulaci&oacute;n ya que as&iacute; 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&oacute;n del ST6, (interrupciones,RDW,IOR) y no los
perif&eacute;ricos de I/O, ADC, TIMER, y WATCHDOG.</FONT></TT>
<P>
<TT><FONT FACE="Courier">Ahora pasamos a describir brevemente
los men&uacute;s m&aacute;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">&Auml;&Auml;&Acirc;&Auml;&Auml;&Auml;&Auml;&Auml;</FONT><FONT FACE="Courier">&gt;
DISPLAY *1</FONT></TT>
<P>
<TT><FONT FACE="MS LineDraw"> &#179;</FONT><FONT FACE="Courier">
</FONT></TT>
<P>
<TT><FONT FACE="MS LineDraw"> &#179;</FONT><FONT FACE="Courier">
</FONT></TT>
<P>
<TT><FONT FACE="MS LineDraw"> &Agrave;&Auml;&Auml;&Auml;&Auml;&Auml;</FONT><FONT FACE="Courier">&gt;
DISPLAY WRS *2<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">*1 DISPLAY : Tiene 3 ventanas, pregunta
a partir de que direcci&oacute;n se visualiza el espacio de datos.
Tambi&eacute;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&oacute;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&iacute;nea.</FONT></TT>
<P>
<TT><FONT FACE="Courier">SYMBOLS OPTION : Visualiza la tabla de
s&iacute;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 &uacute;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&oacute;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&oacute;n.</FONT></TT>
<P>
<TT><FONT FACE="Courier">BASE OPTION : Selecciona la base de conversi&oacute;n
(HEX, OCT, DEC).</FONT></TT>
<P>
<TT><FONT FACE="Courier">L.MODE OPTION : Pone el simulador en
interface de l&iacute;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&oacute; el PC.</FONT></TT>
<P>
<TT><FONT FACE="Courier">GO OPTION : Corre el programa a partir
de una direcci&oacute;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&oacute;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&oacute;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&Eacute;</FONT></B></TT>
<P>
<TT><FONT FACE="Courier">La placa de desarrollo del ST6 naci&oacute;
por la necesidad de un sistema con el cual se pudieran montar
practicas con el microcontrolador de una manera r&aacute;pida
y sencilla, adem&aacute;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&oacute; la posibilidad de poder aprovechar
todas las utilidades de PROMAX utilizadas anteriormente con el
Z80, para esto se decidi&oacute; el colocar el conector adecuado
con el patillaje del PIO del equipo TM-801 de PROMAX. Otra opci&oacute;n
recogida fue la de dotar a la placa de su propia fuente de alimentaci&oacute;n
estabilizada para aplicaciones digitales<B>. </B>Con todas estas
premisas se dise&ntilde;o el circuito descrito a continuaci&oacute;n.
<BR>
</FONT></TT>
<P>
<TT><B><FONT SIZE=2 FACE="Courier">V-b) ESQUEMAS Y DESCRIPCI&Oacute;N</FONT></B></TT>
<P>
<TT><FONT FACE="Courier">El esquema esta claramente dividido en
3 partes que son, la fuente de alimentaci&oacute;n, los switches
y leds y por ultimo el microcontrolador.<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">La fuente de alimentaci&oacute;n: Es
una fuente de alimentaci&oacute;n de tensi&oacute;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&aacute;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&oacute;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&oacute;n positiva de 5V capaz
de proporcionar 1 Amperio, para la m&aacute;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&aacute; proporcionar la corriente adecuada,
C3 y C4 son recomendados por el fabricante del 7805. El led D10
tiene como funci&oacute;n indicarnos si el sistema esta conectado
a la red R2 tiene como funci&oacute;n limitar la corriente que
pasa por D10.<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">Switches y leds: Tienen como funci&oacute;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&oacute;n la de poder simular sensores,
est&aacute;n constituidos por una tira de conector de 10 pines
(8 para los dips y dos para alimentaci&oacute;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&eacute;n abierto y limitar
la corriente cuando los dips est&eacute;n cerrados.<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">Los leds tienen como funci&oacute;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&oacute;calo de fuerza de inserci&oacute;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&oacute;calo de fuerza 0 corresponde
a U1, en el esquema apararece como un ST62E15 para evitar los
posibles errores de conexi&oacute;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&oacute;n
y al pulsar el pulsador, el circuito oscilador esta dise&ntilde;ado
para la frecuencia de oscilaci&oacute;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&iacute;neas del ST6 excepto
al reset, oscin y oscout adem&aacute;s de a las alimentaciones.
El conector de 50 patillas conserva la distribuci&oacute;n del
PIO del TM801, a este conector van solamente los puertos A y B
del ST6, adem&aacute;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&aacute;ginas siguientes.<BR>
<BR>
<B>V-c) PRACTICAS CON PLACA Y SUBRUTINAS &Uacute;TILES</B></FONT></TT>
<P>
<TT><FONT FACE="Courier">A continuaci&oacute;n est&aacute;n la
totalidad de programas realizados que han sido simulados, tambi&eacute;n
hay algunas subrutinas &uacute;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&eacute; Ignacio D&iacute;az
Beamud &amp; Jes&uacute;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&uacute;mero de
8 bits, el n&uacute;mero a convertir se encuentra en</FONT></TT>
<P>
<TT><FONT FACE="Courier">;'nn' (86h) y el resultado se deposita
en datal (n&uacute;mero bajo),datam (n&uacute;mero</FONT></TT>
<P>
<TT><FONT FACE="Courier">;medio ),datah (n&uacute;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&uacute;mero
a convertir en posici&oacute;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&uacute;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&lt;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&lt;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">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</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&eacute; Ignacio D&iacute;az
Beamud &amp; Jes&uacute;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&uacute;mero de 9 bits
(resultado de multiplicar uno de 8bits * 2)</FONT></TT>
<P>
<TT><FONT FACE="Courier">;en BCD.Este m&oacute;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&oacute;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&uacute;mero a convertir</FONT></TT>
<P>
<TT><FONT FACE="Courier">datcl .def 85h,0ffh,0ffh ;Parte baja
del n&uacute;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&iacute;nimo</FONT></TT>
<P>
<TT><FONT FACE="Courier">ldi datam,5 ;256 ya que 2^(9&#173;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&lt;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&lt;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&lt;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">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</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&eacute; Ignacio D&iacute;az
Beamud &amp; Jes&uacute;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&oacute;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&oacute;n.</FONT></TT>
<P>
<TT><FONT FACE="Courier">;Esto s&oacute;lo sera aplicable si VCC
= 5V ya que de esta forma la escala de</FONT></TT>
<P>
<TT><FONT FACE="Courier">;Conversi&oacute;n son m&aacute;s o menos
0.02V</FONT></TT>
<P>
<TT><FONT FACE="Courier">;El resultado podr&aacute; ser un n&uacute;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&oacute;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">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</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&uacute;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">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</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&uacute;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">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</FONT><FONT FACE="Courier">
</FONT><FONT FACE="MS LineDraw">&#179;&#179;</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 &quot;st6.asm&quot; <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&eacute; Ignacio D&iacute;az
Beamud &amp; Jes&uacute;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 &quot;Control de motor paso
a paso (J.Ignacio Diaz y J.Antonio Alquezar)&quot;<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&oacute;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 &quot;st6.asm&quot; ;Entra fichero
de definici&oacute;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&oacute;n
84h de datos como 'veces'</FONT></TT>
<P>
<TT><FONT FACE="Courier">tempo .def 85h,0ffh,0ffh ;Define la posici&oacute;n
85h de datos como 'tempo'</FONT></TT>
<P>
<TT><FONT FACE="Courier">segun .def 86h,0ffh,0ffh ;Define la posici&oacute;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&oacute;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&oacute;n y dem&aacute;s HI&#173;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&aacute;s HI&#173;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&oacute;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&oacute;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&oacute;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&#173;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&#173;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&oacute;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&oacute;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&#173;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&#173;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&oacute;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&oacute;n,despues
de dar 1 vuelta</FONT></TT>
<P>
<TT><FONT FACE="Courier">;**** Subrutina de atenci&oacute;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&aacute;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&oacute;n es m&aacute;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&eacute;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&iacute;a sido 0 retorna
de interrupci&oacute;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 ; |&#173;&#173;&#173;&#173;&gt; 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&oacute;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&eacute; Ignacio D&iacute;az
Beamud &amp; Jes&uacute;s Antonio Alquezar **** ***</FONT></TT>
<P>
<TT><FONT FACE="Courier">;*** ********************************
ST&#173;6 SGS&#173;THOMSON ***** ***</FONT></TT>
<P>
<TT><FONT FACE="Courier">;&#173;&#173;&#173; &#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;
&#173;&#173;&#173;</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 &quot;st6215&quot;</FONT></TT>
<P>
<TT><FONT FACE="Courier">.romsize 2</FONT></TT>
<P>
<TT><FONT FACE="Courier">.input &quot;6215_reg.asm&quot;<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&oacute;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&oacute;n con directivas ORG (definici&oacute;n
mapa vectores)<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">;*** ********************************************************
***</FONT></TT>
<P>
<TT><FONT FACE="Courier">;*** Jos&eacute; Ignacio D&iacute;az
Beamud &amp; Jes&uacute;s Antonio Alquezar Sierra ***</FONT></TT>
<P>
<TT><FONT FACE="Courier">;*** ********************************
ST&#173;6 SGS&#173;THOMSON ****** ***</FONT></TT>
<P>
<TT><FONT FACE="Courier">;&#173;&#173;&#173; &#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;&#173;
&#173;&#173;&#173;</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 &quot;6215_reg.asm&quot;<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&oacute;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&#173;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&eacute; Ignacio Diaz Beamud
&amp; Jes&uacute;s Antonio Alquezar</FONT></TT>
<P>
<TT><FONT FACE="Courier">;*****************************************************************************
<BR>
</FONT></TT>
<P>
<TT><FONT FACE="Courier">.input &quot;st62.asm&quot; ;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&oacute;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&aacute;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&oacute;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&uacute;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&oacute;n
a NMI(estado aver&iacute;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&oacute;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&uacute;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>