3305 lines
116 KiB
HTML
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án integrados
|
|
las partes que componen un sistema con microprocesador, como la
|
|
CPU, los módulos de I/O y dependiendo del tipo de MCU hasta
|
|
convertidores A/D, TIMERS y puertos SERIE.Esto dota al MCU de
|
|
un gran potencial en la electrónica, disminuye costes y
|
|
un sólo MCU puede sustituir a un circuito digital complejo,
|
|
que necesita de muchos C.I. (circuitos integrados), y tiempo para
|
|
su diseño. Incluyendo un MCU en un circuito de estas características
|
|
lo único que necesitaremos es el MCU, unos pocos componentes
|
|
externos y un programa adecuado.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">El MCU es ampliamente utilizado actualmente
|
|
en la industria, un MCU puede realizar tareas de complejidad baja,media
|
|
de las que antes se tenía que ocupar un sistema digital
|
|
complejo, una circuitería convencional o un sistema con
|
|
microprocesador con todo lo que ello conlleva, como el espacio
|
|
necesario y la complejidad de diseñar un sistema mínimo.
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Por todo esto y el deseo de conocer un
|
|
componente tan importante , con tan grande campo de aplicaciones
|
|
y tanto futuro, hemos decidido dedicar este proyecto al estudio
|
|
de un MCU que está ampliamente implantado en la industria,
|
|
el ST-6 de SGS-THOMSOM, un componente con una gran capacidad y
|
|
flexibilidad como para ser usado en cualquier aplicación
|
|
electrónica que lo requiera.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">En este proyecto de final de curso nos
|
|
hemos centrado en el estudio de la arquitectura y programación
|
|
del ST6 y una vez adquiridos los conocimientos necesarios hemos
|
|
empezado ha desarrollar prácticas con el para aplicar la
|
|
teoría. Hemos desarrollado una placa de desarrollo para
|
|
realizar estas prácticas con más facilidad y una
|
|
aplicación final (METEO),esta aplicación final supone
|
|
un gran reto para nosotros debido a su media complejidad al comunicar
|
|
un PC con el MCU. <BR>
|
|
<BR>
|
|
<B>II-EL ST6</B></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ST6 es el nombre del la familia de microcontroladores
|
|
que fabrica SGS-THOMSOM para el desarrollo de aplicaciones de
|
|
control básicas, fáciles de programar y bajo coste.
|
|
Todos MCU de esta familia están constituidos alrededor
|
|
de una misma CPU de 8 bits, rodeada de diversos periféricos
|
|
y dependiendo del modelo más o menos memoria. Hay diversas
|
|
subfamilias que se adaptan a diversos sectores del mercado, todos
|
|
los miembros de las diversas subfamilias tienen compatibilidad
|
|
en el SOFTWARE debido a que la CPU es la misma en todos los casos.
|
|
Nosotros trataremos en este proyecto la subfamilia ST62 y en concreto
|
|
los modelos ST6210, ST6220,ST6215 y ST6225. Ahora pasamos a describir
|
|
las características generales de estos cuatro modelos :
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- CPU de 8 bits</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- Rango de alimentación de 3V
|
|
a 6V</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- Reloj a 8Mhz</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- 5 Vectores de interrupción</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- 2K o 4K de memoria PROM/EPROM</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- RAM 64 bytes</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- 12/20 Patillas de I/O, programables
|
|
como :<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- Entradas con resistencia PULL-UP</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- Entradas sin resistencia PULL-UP</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- Entradas con interrupción</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- Salidas en colector abierto</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- Entradas analógicas<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- 4 líneas de I/O pueden sacar
|
|
una corriente de 10mA</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">para atacar directamente leds</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- Contador de 8 bits con un preescaler
|
|
de 7 bits</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- Timer/Watchdog digital</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- Convertidor A/D de 8 bits</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- Una interrupción NMI externa</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- STACK (LIFO) de 6 niveles</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- 9 modos de direccionamiento</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- Oscilador integrado en el circuito</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- RESET automático tras conexión
|
|
de alimentación<BR>
|
|
<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><B><FONT SIZE=2 FACE="Courier">II-a) FAMILIA ST6</FONT></B></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">La familia de microcontroladores ST6
|
|
tienen en común la CPU de 8 bits, y por lo tanto son compatibles
|
|
en cuanto a software y las diferencias de un miembro a otro están
|
|
en cuanto a líneas de I/O, y memoria, ahora vamos a hacer
|
|
una descripción de cada una de las diferencias entre los
|
|
miembros 10,15,20 y 25 que son los tratados en este proyecto.
|
|
<BR>
|
|
<BR>
|
|
|
|
</FONT></TT>
|
|
<P>
|
|
<CENTER><BODY BACKGROUND="../fondo.jpg"></CENTER><CENTER>
|
|
<TABLE BORDER=2>
|
|
<TR><TD WIDTH=97><BR>
|
|
<TT><FONT FACE="Courier">Tipo </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ST6</FONT></TT>
|
|
</TD><TD WIDTH=85><BR>
|
|
<TT><FONT FACE="Courier">EPROM<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Kbytes</FONT></TT>
|
|
</TD><TD WIDTH=75><BR>
|
|
<TT><FONT FACE="Courier">RAM <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Bytes</FONT></TT>
|
|
</TD><TD WIDTH=85><BR>
|
|
<TT><FONT FACE="Courier">Líneas<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">I/O</FONT></TT>
|
|
</TD><TD WIDTH=85><BR>
|
|
<TT><FONT FACE="Courier">Alta</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Intens</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">10mA</FONT></TT>
|
|
</TD><TD WIDTH=75><BR>
|
|
<TT><FONT FACE="Courier">Num.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Canal</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">A/D</FONT></TT>
|
|
</TD><TD WIDTH=91><BR>
|
|
<TT><FONT FACE="Courier">Ext.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Inter.</FONT></TT>
|
|
</TD></TR>
|
|
<TR><TD WIDTH=97><BR>
|
|
<TT><FONT FACE="Courier">ST62E10</FONT></TT>
|
|
</TD><TD WIDTH=85><BR>
|
|
<TT><FONT FACE="Courier">2K</FONT></TT>
|
|
</TD><TD WIDTH=75><BR>
|
|
<TT><FONT FACE="Courier">64</FONT></TT>
|
|
</TD><TD WIDTH=85><BR>
|
|
<TT><FONT FACE="Courier">12</FONT></TT>
|
|
</TD><TD WIDTH=85><BR>
|
|
<TT><FONT FACE="Courier">4</FONT></TT>
|
|
</TD><TD WIDTH=75><BR>
|
|
<TT><FONT FACE="Courier">8</FONT></TT>
|
|
</TD><TD WIDTH=91><BR>
|
|
<TT><FONT FACE="Courier">13</FONT></TT>
|
|
</TD></TR>
|
|
<TR><TD WIDTH=97><BR>
|
|
<TT><FONT FACE="Courier">ST62E15</FONT></TT>
|
|
</TD><TD WIDTH=85><BR>
|
|
<TT><FONT FACE="Courier">2K</FONT></TT>
|
|
</TD><TD WIDTH=75><BR>
|
|
<TT><FONT FACE="Courier">64</FONT></TT>
|
|
</TD><TD WIDTH=85><BR>
|
|
<TT><FONT FACE="Courier">20</FONT></TT>
|
|
</TD><TD WIDTH=85><BR>
|
|
<TT><FONT FACE="Courier">4</FONT></TT>
|
|
</TD><TD WIDTH=75><BR>
|
|
<TT><FONT FACE="Courier">16</FONT></TT>
|
|
</TD><TD WIDTH=91><BR>
|
|
<TT><FONT FACE="Courier">21</FONT></TT>
|
|
</TD></TR>
|
|
<TR><TD WIDTH=97><BR>
|
|
<TT><FONT FACE="Courier">ST62E20</FONT></TT>
|
|
</TD><TD WIDTH=85><BR>
|
|
<TT><FONT FACE="Courier">4K</FONT></TT>
|
|
</TD><TD WIDTH=75><BR>
|
|
<TT><FONT FACE="Courier">64</FONT></TT>
|
|
</TD><TD WIDTH=85><BR>
|
|
<TT><FONT FACE="Courier">12 </FONT></TT>
|
|
</TD><TD WIDTH=85><BR>
|
|
<TT><FONT FACE="Courier">4</FONT></TT>
|
|
</TD><TD WIDTH=75><BR>
|
|
<TT><FONT FACE="Courier">8</FONT></TT>
|
|
</TD><TD WIDTH=91><BR>
|
|
<TT><FONT FACE="Courier">13</FONT></TT>
|
|
</TD></TR>
|
|
<TR><TD WIDTH=97><BR>
|
|
<TT><FONT FACE="Courier">ST62E25</FONT></TT>
|
|
</TD><TD WIDTH=85><BR>
|
|
<TT><FONT FACE="Courier">4K</FONT></TT>
|
|
</TD><TD WIDTH=75><BR>
|
|
<TT><FONT FACE="Courier">64</FONT></TT>
|
|
</TD><TD WIDTH=85><BR>
|
|
<TT><FONT FACE="Courier">20</FONT></TT>
|
|
</TD><TD WIDTH=85><BR>
|
|
<TT><FONT FACE="Courier">4</FONT></TT>
|
|
</TD><TD WIDTH=75><BR>
|
|
<TT><FONT FACE="Courier">16 </FONT></TT>
|
|
</TD><TD WIDTH=91><BR>
|
|
<TT><FONT FACE="Courier">21</FONT></TT>
|
|
</TD></TR>
|
|
</TABLE>
|
|
</CENTER>
|
|
<P>
|
|
<TT><FONT FACE="Courier">* En todos estos miembros expuestos en
|
|
la tabla son comunes los periféricos que estos llevan incluidos
|
|
en la misma pastilla, vamos a nombrarlos y 2 puntos más
|
|
adelante los trataremos más detalladamente :<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- Convertidor A/D</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- Timer, temporizador</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- Líneas de puertos I/O</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- Digital Watchdog/Timer<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">* Descripción de patillas :<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<CENTER><IMG SRC="IMG00002.GIF" ALT="Vista de las patillas" ALIGN="ABSMIDDLE"></CENTER>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">Vdd y Vss :</FONT></I><FONT FACE="Courier">
|
|
Patillas de alimentación. Vss es la conexión a masa
|
|
y Vdd la conexión a positivo. La tensión de alimentación
|
|
va desde 3V a 6V.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">Oscin y Oscout :</FONT></I><FONT FACE="Courier">
|
|
Estas patillas están conectadas al oscilador interno del
|
|
chip, a estas patillas hay que conectar un circuito resonante,
|
|
una señal de reloj externa, o un cristal de cuarzo. La
|
|
forma de conectar el cristal es la mostrada en la Fig.3.3.<BR>
|
|
</FONT></TT>
|
|
<HR>
|
|
<P>
|
|
<IMG SRC="IMG00003.GIF">
|
|
<P>
|
|
<TT><FONT FACE="Courier">Oscin es la entrada del oscilador y Oscout
|
|
es la salida.C1 y C2 deben estar entre los 15pF y 22 pF, para
|
|
cristales de 4Mhz y 8Mhz. Aunque el reloj funciona a 8Mhz esto
|
|
no se traduce en una gran velocidad, un Z80 a 4Mhz es casi un
|
|
300% más rápido que el ST6.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Un ciclo máquina consta de 13
|
|
ciclos de reloj, 12 de los cuales se emplean en la búsqueda
|
|
del código OP, decodificación e incremento del PC
|
|
para localizar el operando o la siguiente instrucción y
|
|
el último para estabilizar los buses internos durante el
|
|
direccionamiento de memoria. <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">Reset :</FONT></I><FONT FACE="Courier">
|
|
Esta patilla a nivel bajo produce un reset en el microcontrolador.
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">Test/Vpp :</FONT></I><FONT FACE="Courier">
|
|
Este pin se utiliza para poner al MCU en un modo especial de trabajo.
|
|
Para que el MCU trabaje en un modo normal debe ser conectada a
|
|
masa. Si se lleva a un uno lógico el MCU entra en modo
|
|
de TEST, este test se realiza en fabrica. El usuario debe llevarla
|
|
a masa. Si es una versión EPROM y se lleva a 12.5V durante
|
|
la secuencia RESET se produce el modo de programación.
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">NMI :</FONT></I><FONT FACE="Courier">
|
|
Esta patilla es una entrada de interrupción no mascarable,
|
|
aunque en realidad se debería decir para ser más
|
|
exactos que es una interrupción de máxima prioridad
|
|
ya que decir que no es mascarable no es del todo correcto ya que
|
|
con el registro IOR del que ya trataremos puede desconectarla.
|
|
Esta interrupción es sensible al flanco descendente. En
|
|
los modelos EPROM este pin no esta conectado al positivo a través
|
|
de una resistencia PULL-UP por lo que el usuario si lo necesita
|
|
deberá conectarla en el exterior. En las versiones ROM
|
|
se puede decidir si esta resistencia se incluye en fábrica
|
|
o no.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">Timer :</FONT></I><FONT FACE="Courier">
|
|
Esta patilla es una línea I/O, esta patilla al igual que
|
|
la línea NMI no tiene conectada al positivo una resistencia
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">PULL-UP y si el usuario necesita utilizar
|
|
este pin tendrá que conectarla el desde el exterior. Este
|
|
pin puede ser utilizado como I/O dependiendo del modo de funcionamiento
|
|
del timer. Si está programada como entrada este pin será
|
|
la señal de reloj del preescaler, si actúa como
|
|
salida esta sacara el nivel lógico preprogramado cuando
|
|
el timer termine su temporización.<BR>
|
|
<BR>
|
|
<BR>
|
|
<I>PA0-PA3, PA4-PA7 :</I> Estas 8 líneas conforman las
|
|
líneas del </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">puerto A, son programables independientemente
|
|
como :<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">1. Entrada, con o sin resistencia al
|
|
positivo</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">2. Entrada con interrupción mascarable</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">3. Salida en colector abierto o también
|
|
en PUSH-PULL<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">PA0-PA3 pueden generar una corriente
|
|
de salida de hasta 10mA, mientras que PA4-PA7 pueden programarse
|
|
como entradas analógicas para el convertidor A/D. PA4-PA7
|
|
no existen en las versiones ST62E10 y ST62E20.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">PB0-PB7 :</FONT></I><FONT FACE="Courier">
|
|
Estas líneas conforman el puerto B, son programables independientemente
|
|
como :<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">1. Entrada, con o sin resistencia al
|
|
positivo</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">2. Entrada con interrupción mascarable</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">3. Salida en colector abierto o también
|
|
en PUSH-PULL</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">4. Entrada analógica para el convertidor
|
|
A/D<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">PC4-PC7 :</FONT></I><FONT FACE="Courier">
|
|
Estas líneas conforman el puerto C de I/O. Se pueden programar
|
|
independientemente al igual que los puerto anteriores como :<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">1. Entrada, con o sin resistencia al
|
|
positivo</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">2. Entrada con interrupción mascarable</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">3. Salida en colector abierto o también
|
|
en PUSH-PULL</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">4. Entrada analógica para el convertidor
|
|
A/D<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Estas líneas no existen en los
|
|
modelos ST62E10 y ST62E20.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">* Encapsulados : Las versiones 10 y 20
|
|
tienen 20 pines y las 15 y 25 son de 28.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><B><FONT SIZE=2 FACE="Courier">III-b) ARQUITECTURA INTERNA</FONT></B></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">La CPU como ya hemos dicho es la misma
|
|
para todos los miembros de la familia ST62XX. La CPU es por lo
|
|
tanto como una unidad independiente que se comunica con el resto
|
|
de los elementos a través de los buses.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Cuando se genera un RESET bien a través
|
|
de la patilla reset, a la secuencia de inicio tras la conexión
|
|
de la alimentación o a través del WATCHDOG, el PC
|
|
direcciona la memoria de programa. De esta forma se obtiene el
|
|
código OP de la instrucción a ejecutar que se decodifica
|
|
en la unidad de control, y se generan las señales necesarias.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Dependiendo del tipo de instrucción,
|
|
el operando puede direccionar el área de datos. Esta se
|
|
comporta de forma similar a una memoria de 256 posiciones y contiene
|
|
datos de tipo constante, variables e incluso los registros de
|
|
trabajo de la CPU, así como los de control para los distintos
|
|
periféricos.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">La ALU realiza todas las operaciones
|
|
aritmético-lógicas clásicas. Recibe los operandos
|
|
desde el área de programa y/o datos. <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Los resultados obtenidos pueden retornar
|
|
al área de datos o, incluso, dependiendo del tipo de instrucción,
|
|
modificar el PC. El registro de estado (FLAGS) es de tan solo
|
|
2 bits, el de carry y el de cero. El PC es el encargado de direccionar
|
|
el área de programa en busca de nuevas instrucciones para
|
|
ejecutar.</FONT></TT>
|
|
<P>
|
|
<CENTER><TT><FONT FACE="Courier">El STACK o pila se empleará
|
|
para contener las direcciones de retorno del PC cuando se produzcan
|
|
interrupciones o llamadas a subrutinas.<BR>
|
|
<IMG SRC="IMG00004.GIF"></FONT></TT></CENTER>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">Acumulador (A):</FONT></I><FONT FACE="Courier">
|
|
Es el registro acumulador, es de propósito general y se
|
|
emplea en las operaciones aritmético-lógicas y manipulación
|
|
de datos. El acumulador al igual que todos los registros del ST6
|
|
se usan como si direcciones de memoria se tratase (RAM), se encuentra
|
|
en la posición 0ffh.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">Registros Indice (X,Y) :</FONT></I><FONT FACE="Courier">
|
|
Estos dos registros se utilizan para el direccionamiento indirecto
|
|
por registro, Ej : LD A,(X). Se pueden utilizar también
|
|
como registros de propósito general. Se encuentran en las
|
|
posiciones de memoria 80h (X) y 81h (Y).<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">Registros Generales (V,W) :
|
|
</FONT></I><FONT FACE="Courier">Estos dos registros son uso general.
|
|
Se encuentran en las posiciones de memoria 82h (V) y 82h (W).
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">Contador de programa (PC) :
|
|
</FONT></I><FONT FACE="Courier">Se trata del contador de programa,
|
|
es de 12 bits, lo que le permite direccionar 4 Kbytes de programa
|
|
es decir de memoria ROM. El PC apunta a la siguiente instrucción
|
|
que se va a ejecutar. El PC al igual que el del Z80, se incrementa
|
|
nada más que la dirección ROM ha sido leída.
|
|
Tras una interrupción el PC se guarda en el STACK y se
|
|
carga con el valor del VECTOR de la interrupción correspondiente.
|
|
<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">Flags (C,Z) : </FONT></I><FONT FACE="Courier">La
|
|
CPU dispone de 3 pares de FLAGS, que corresponden a 3 situaciones
|
|
diferentes de trabajo : situación normal, interrupción
|
|
mascarable y interrupción no mascarable. Cada par tiene
|
|
el flag de Carry (C) y el flag de cero (Z). Existen estos 3 pares
|
|
de FLAGS para que cuando se pasa de un modo de trabajo a otro,
|
|
el valor de los FLAGS no se altere, esta es una forma de no tener
|
|
que salvar los FLAGS en el STACK como ocurre en algunos microprocesadores.
|
|
La CPU utiliza directamente y automáticamente la pareja
|
|
de FLAGS necesarios en cada momento. CN y ZN son los FLAGS para
|
|
modo normal, CI y ZI son los FLAGS para modo de interrupción
|
|
mascarable, CNMI y ZNMI son los FLAGS para el modo de interrupción
|
|
no mascarable (máxima prioridad, NMI).<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">El STACK : </FONT></I><FONT FACE="Courier">Es
|
|
una memoria tipo LIFO (último en entrar, primero en salir)
|
|
gobernada mediante HARDWARE, lo que no hace necesario el habitual
|
|
SP (stack pointer, puntero de pila). El stack del ST6 consiste
|
|
en 6 posiciones de 12 bits, cuando se produce una interrupción
|
|
o un salto a subrutina el PC se guarda en la posición de
|
|
PILA correspondiente automáticamente, cuando la CPU ejecuta
|
|
una RET o una RETI el PC de la pila es automáticamente
|
|
recuperado. Es importante observar que el máximo nivel
|
|
entre interrupciones y subrutinas es 6, ya que si se sobrepasa
|
|
este número el valor de la última posición
|
|
del STACK se perdería. Si el usuario necesita guardar el
|
|
valor de diversos registros en un salto a interrupción
|
|
o subrutina deberá hacerlo guardando los registros en posiciones
|
|
de memoria para después recuperarlos. Si el STACK esta
|
|
vacío y se ejecuta una RET o una RETI el programa no hace
|
|
nada y ejecuta la siguiente instrucción que se encuentre
|
|
detrás del RET o RETI.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">AREAS DE MEMORIA : </FONT></I><FONT FACE="Courier">La
|
|
CPU del microcontrolador opera en dos zonas de memoria diferentes
|
|
: <I>AREA DE DATOS y AREA DE PROGRAMA.<BR>
|
|
</I></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">AREA de PROGRAMA : Es el área
|
|
de programa ROM/EPROM del chip, esta memoria contiene las instrucciones
|
|
de programa, tablas de datos de valores fijos y los vectores de
|
|
interrupción. Es direccionada por el PC. Las direcciones
|
|
para cada componente de la familia ST62 aquí estudiada
|
|
son las siguientes :<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<CENTER><IMG SRC="IMG00005.GIF"></CENTER>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Se puede observar en la figura que la
|
|
memoria de programa en la versiones de 2K comienza en la posición
|
|
0800h y en las de 4K en la 0000h. Las direcciones que no aparecen
|
|
en el anterior mapa no están implementadas o bien no son
|
|
accesibles para el usuario.</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">NOTA : en las versiones OTP
|
|
(one time programable, PROM) de 2K la memoria de programa comienza
|
|
en la 0880h y las de 4K en la 0080h</FONT></I></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">AREA de DATOS : El juego de instrucciones
|
|
de la CPU del ST6 opera sobre una zona específica llamada
|
|
zona o área de datos. Se trata de una zona de memoria de
|
|
256 posiciones (000h-0FFh) facilmente accesible mediante un operando
|
|
de 8 bits. Esta zona de memoria es igual en todas las versiones
|
|
que aquí se estudian. En dicha zona de memoria podemos
|
|
encontrar lo siguiente :<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">1- Datos constantes y de sólo
|
|
lectura, procedentes gracias al registro RDW de la memoria EPROM,
|
|
se pueden acceder a 64 bytes de este tipo. Este registro ya lo
|
|
trataremos después.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">2- 60 posiciones de memoria RAM que pueden
|
|
contener variables o datos temporales.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">3- Los registros de trabajo de la CPU
|
|
X,Y,V y W, así como el acumulador A.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">4- El propio registro de ventana RDW
|
|
cuyo contenido permite reflejar en la zona de datos una porción
|
|
de 64 bytes procedentes de la memoria de programa EPROM.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">5- Los diversos registros que según
|
|
se programen controlan los diferentes periféricos.<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Las posiciones de la memoria de datos
|
|
están distribuidas como sigue :<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">040h-07Fh ----> Ventana de datos constantes</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">080h ----> Registro Indice X</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">081h ----> Registro Indice Y</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">082h ----> Registro General V</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">083h ----> Registro General W</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">084h-0BFh ----> Ram de datos</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">0C9h ----> RDW</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">0FFh ----> Acumulador<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Las direcciones de los registros de los
|
|
periféricos serán dadas cuando se expliquen estos.
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">El registro RDW : </FONT></I><FONT FACE="Courier">Como
|
|
ya hemos apuntado el ST6 trabaja con 2 áreas de memoria,
|
|
la de programa y la de datos. Las instrucciones que operan con
|
|
datos lo hacen directamente sobre el area de datos, por lo tanto
|
|
se podría pensar que no se podrían tener tablas
|
|
de datos permanentes ya que las instrucciones no operan con la
|
|
memoria de programa EPROM. Para remediar esto existe un registro
|
|
localizado en la posición C9h de la RAM (RDW). Gracias
|
|
a este registro se pueden reflejar 64 bytes de la memoria EPROM
|
|
en la RAM en las posiciones 40h-7Fh, modificando este registro
|
|
se reflejan diferentes partes de la EPROM. La forma para conseguir
|
|
esto se hace de la siguiente forma :<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">Los 6 bits de menor peso del
|
|
registro RDW se concatenan con los 6 bits de menos peso del operando
|
|
que acompaña a la instrucción, resultando una dirección
|
|
de 12 bits que permite expresar cualquier posición física
|
|
de la zona o área de programa EPROM.<BR>
|
|
<BR>
|
|
</FONT></I><FONT FACE="Courier">Ejemplo : Suponiendo que el RDW
|
|
valga 22h, y se ejecute una instrucción LD A,43 la porción
|
|
de memoria de programa física reflejada en las posiciones
|
|
de la 40h a la 7Fh de la zona de datos, está comprendida
|
|
entre la 880h y la 8BFh. Así, el acumulador se carga con
|
|
lo que hay en la 43h que es el reflejo de la posición 883h.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Para trabajar correctamente con este
|
|
registro existen directivas de emsamblador de las que trataremos
|
|
en el punto correspondiente.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">LAS INTERRUPCIONES :</FONT></I><FONT FACE="Courier">
|
|
La CPU puede manejar cuatro fuentes diferentes de interrupción
|
|
mascarable y una no mascarable de máxima prioridad (NMI).
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Cada interrupción tiene asociado
|
|
un vector de interrupción, que contiene la dirección
|
|
de salto hacia la subrutina de atención a la interrupción.
|
|
Estos vectores están localizados de forma fija en la memoria
|
|
EPROM. Cuando se produce una interrupción el PC se guarda
|
|
en el STACK y se carga con el valor de la dirección del
|
|
vector correspondiente, el PC ejecuta la instrucción que
|
|
hay en el vector de interrupción que deberá ser
|
|
normalmente una instrucción JP etiqueta, por lo tanto salta
|
|
a la subrutina de atención de interrupción.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Los FLAGS conmutan al modo de interrupción
|
|
correspondiente. Cuando el programa de atención a interrupción
|
|
termina ( con un RETI retorno de interrupción ) el PC se
|
|
recupera del STACK y los FLAGS conmutan al modo normal y la ejecución
|
|
del programa continua donde fue interrumpida.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">VECTORES de INTERRUPCIONES y RESET :
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<CENTER><TABLE BORDERCOLOR=#000000 BORDER=1>
|
|
<TR><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">Fuente Interrupción</FONT></TT>
|
|
</TD><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">Número de Vector</FONT></TT>
|
|
</TD><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">Dirección</FONT></TT>
|
|
</TD></TR>
|
|
<TR><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">Patilla NMI</FONT></TT>
|
|
</TD><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">Vector N.0</FONT></TT>
|
|
</TD><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">FFCh - FFDh</FONT></TT>
|
|
</TD></TR>
|
|
<TR><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">Cualquier Pin PA</FONT></TT>
|
|
</TD><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">Vector N.1</FONT></TT>
|
|
</TD><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">FF6h - FF7h</FONT></TT>
|
|
</TD></TR>
|
|
<TR><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">Cualquier Pin PB</FONT></TT>
|
|
</TD><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">Vector N.2</FONT></TT>
|
|
</TD><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">FF4h - FF5h</FONT></TT>
|
|
</TD></TR>
|
|
<TR><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">Cualquier Pin PC</FONT></TT>
|
|
</TD><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">Vector N.2</FONT></TT>
|
|
</TD><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">FF4h - FF5h</FONT></TT>
|
|
</TD></TR>
|
|
<TR><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">TIMER</FONT></TT>
|
|
</TD><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">Vector N.3</FONT></TT>
|
|
</TD><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">FF2h - FF3h</FONT></TT>
|
|
</TD></TR>
|
|
<TR><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">Convertidor A/D</FONT></TT>
|
|
</TD><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">Vector N.4</FONT></TT>
|
|
</TD><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">FF0h - FF1h</FONT></TT>
|
|
</TD></TR>
|
|
<TR><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">RESET</FONT></TT>
|
|
</TD><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">Vector Reset</FONT></TT>
|
|
</TD><TD WIDTH=201><BR>
|
|
<TT><FONT FACE="Courier">FFEh - FFFh</FONT></TT>
|
|
</TD></TR>
|
|
</TABLE>
|
|
</CENTER>
|
|
<P>
|
|
<TT><FONT FACE="Courier">LA PRIORIDAD EN LAS INTERRUPCIONES :
|
|
La interrupción NMI es la de máxima prioridad, esta
|
|
interrupción puede incluso interrumpir el tratamiento de
|
|
cualquiera de las otras cuatro, en cualquier momento. Sin embargo,
|
|
las restantes interrupciones no pueden interrumpir ni cancelar
|
|
ninguna otra ni su correspondiente tratamiento. En caso de que
|
|
haya varias interrupciones pendientes de ser atendidas, el orden
|
|
que establece la CPU es atender primero a la 1 y la última
|
|
a la número 4. Esta prioridad es fija y se establece por
|
|
HARDWARE.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">El registro de opciones de interrupciones
|
|
IOR es un registro de 8 bits localizado en la posición
|
|
0C8h de datos. Es un registro de sólo escritura que no
|
|
puede accederse mediante instrucciones de manipulación
|
|
de bits.<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">IOR (POSICION 0C8h)<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<CENTER><TABLE BORDERCOLOR=#000000 BORDER=1>
|
|
<TR><TD WIDTH=66><BR>
|
|
<TT><FONT FACE="Courier">IOR7</FONT></TT>
|
|
</TD><TD WIDTH=66><BR>
|
|
<TT><FONT FACE="Courier">IOR6</FONT></TT>
|
|
</TD><TD WIDTH=66><BR>
|
|
<TT><FONT FACE="Courier">IOR5</FONT></TT>
|
|
</TD><TD WIDTH=66><BR>
|
|
<TT><FONT FACE="Courier">IOR4</FONT></TT>
|
|
</TD><TD WIDTH=66><BR>
|
|
<TT><FONT FACE="Courier">IOR3</FONT></TT>
|
|
</TD><TD WIDTH=66><BR>
|
|
<TT><FONT FACE="Courier">IOR4</FONT></TT>
|
|
</TD><TD WIDTH=66><BR>
|
|
<TT><FONT FACE="Courier">IOR5</FONT></TT>
|
|
</TD><TD WIDTH=75><BR>
|
|
<TT><FONT FACE="Courier">IOR6</FONT></TT>
|
|
</TD></TR>
|
|
</TABLE>
|
|
</CENTER>
|
|
<P>
|
|
<TT><FONT FACE="Courier">De los 8 bits que tiene el registro IOR
|
|
solamente 3 de ellos se utilizan, estos son IOR4, IOR5 y IOR6,
|
|
y tienen asignadas las siguientes funciones :<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">IOR4 </FONT><FONT FACE="MS LineDraw">ÄÂÄÄÄÄÄÄ</FONT><FONT FACE="Courier">>
|
|
ACTIVO : <I>ACTIVA TODAS INTERRUPCIONES</I></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="MS LineDraw"> ³</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="MS LineDraw"> ÀÄÄÄÄÄÄ</FONT><FONT FACE="Courier">>
|
|
DESACTIVO : <I>DESACTIVA TODAS INTERRUPCIONES</I></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">IOR5 </FONT><FONT FACE="MS LineDraw">ÄÂÄÄÄÄÄÄ</FONT><FONT FACE="Courier">>
|
|
ACTIVO : <I>INT.2 ACTIVA, FLANCO ASCENDENTE</I></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="MS LineDraw"> ³</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="MS LineDraw"> ÀÄÄÄÄÄÄ</FONT><FONT FACE="Courier">>
|
|
DESACTIVO : <I>INT.2 ACTIVA, FLANCO DESCENDENTE</I></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">IOR6 </FONT><FONT FACE="MS LineDraw">ÄÂÄÄÄÄÄÄ</FONT><FONT FACE="Courier">>
|
|
ACTIVO : <I>INT.1 ACTIVA, NIVEL LOGICO "0"</I></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="MS LineDraw"> ³</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="MS LineDraw"> ÀÄÄÄÄÄÄ</FONT><FONT FACE="Courier">>
|
|
DESACTIVO : <I>INT.1 ACTIVA, FLANCO DESCENDENTE<BR>
|
|
</I></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Si hay varias líneas de un mismo
|
|
puerto que pueden interrumpir, siempre que interrumpan sea la
|
|
línea que sea se salta a su correspondiente vector de puerto
|
|
y el usuario deberá ser el encargado en la subrutina de
|
|
tratamiento de la interrupción de determinar que línea
|
|
fue la que interrumpió.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">EL RESET : </FONT></I><FONT FACE="Courier">Sirve
|
|
para inicializar el microcontrolador y tiene tres formas de generarse
|
|
:<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">1- Mediante una señal externa
|
|
aplicada por el PIN RESET</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">2- De forma automática, tras la
|
|
conexión de la VCC</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">3- Por el controlador de secuencias WATCHDOG
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Cuando se produce un RESET se produce
|
|
una secuencia de inicio. El STACK se restaura y se coloca en el
|
|
primer nivel. El contador de programa PC acude a las posiciones
|
|
del VECTOR RESET, situadas en FFEh y FFFh, donde se encuentra
|
|
una instrucción de salto (JP) a la dirección de
|
|
comienzo de la rutina principal del sistema.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">La CPU se pone automáticamente
|
|
en el modo de trabajo NMI con objeto de evitar falsas interrupciones
|
|
en la secuencia de inicio. Por ello, tras realizar la rutina principal
|
|
se <B>debe incluir la instrucción RETI</B> para que la
|
|
CPU pase a trabajar en modo normal.<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><B><FONT SIZE=2 FACE="Courier">III-c) PERIFERICOS DEL ST6</FONT></B></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">LAS PUERTAS DE ENTRADA/SALIDA
|
|
: </FONT></I><FONT FACE="Courier">Todas las líneas de I/O
|
|
se agrupan en tres puertas llamadas PA, PB y PC. Cada puerta está
|
|
asociada con tres registros mediante los cuales se establecen
|
|
las diferentes formas de trabajo. Estos son :<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- Registro de datos</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- Registro de direcciones</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- Registro de opciones<BR>
|
|
<BR>
|
|
Cada uno de los 3 registros anteriores ocupa una posición
|
|
en el área de datos :<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<CENTER><TABLE BORDERCOLOR=#000000 BORDER=1>
|
|
<TR><TD WIDTH=102><BR>
|
|
<TT><FONT FACE="Courier">PUERTA</FONT></TT>
|
|
</TD><TD WIDTH=150><BR>
|
|
<TT><FONT FACE="Courier">Reg.Datos</FONT></TT>
|
|
</TD><TD WIDTH=150><BR>
|
|
<TT><FONT FACE="Courier">Reg.Direcc.</FONT></TT>
|
|
</TD><TD WIDTH=150><BR>
|
|
<TT><FONT FACE="Courier">Reg.Opciones</FONT></TT>
|
|
</TD></TR>
|
|
<TR><TD WIDTH=102><BR>
|
|
<TT><FONT FACE="Courier">PA</FONT></TT>
|
|
</TD><TD WIDTH=150><BR>
|
|
<TT><FONT FACE="Courier">DRPA (C0h)</FONT></TT>
|
|
</TD><TD WIDTH=150><BR>
|
|
<TT><FONT FACE="Courier">DDRPA (C4h)</FONT></TT>
|
|
</TD><TD WIDTH=150><BR>
|
|
<TT><FONT FACE="Courier">ORPA (CCh)</FONT></TT>
|
|
</TD></TR>
|
|
<TR><TD WIDTH=102><BR>
|
|
<TT><FONT FACE="Courier">PB</FONT></TT>
|
|
</TD><TD WIDTH=150><BR>
|
|
<TT><FONT FACE="Courier">DRPB (C1h)</FONT></TT>
|
|
</TD><TD WIDTH=150><BR>
|
|
<TT><FONT FACE="Courier">DDRPB (C5h)</FONT></TT>
|
|
</TD><TD WIDTH=150><BR>
|
|
<TT><FONT FACE="Courier">ORPB (CDh)</FONT></TT>
|
|
</TD></TR>
|
|
<TR><TD WIDTH=102><BR>
|
|
<TT><FONT FACE="Courier">PC</FONT></TT>
|
|
</TD><TD WIDTH=150><BR>
|
|
<TT><FONT FACE="Courier">DRPC (C2h)</FONT></TT>
|
|
</TD><TD WIDTH=150><BR>
|
|
<TT><FONT FACE="Courier">DDRPC (C6h)</FONT></TT>
|
|
</TD><TD WIDTH=150><BR>
|
|
<TT><FONT FACE="Courier">ORPC (CEh)</FONT></TT>
|
|
</TD></TR>
|
|
</TABLE>
|
|
</CENTER>
|
|
<P>
|
|
<TT><FONT FACE="Courier">El bit de cada registro está asociado
|
|
a cada una de las líneas de los puertos. Así, por
|
|
ejemplo el BIT 0 de DRPA, DDRPA y ORPA está asociado con
|
|
la línea PA0 del puerto PA.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Durante la secuencia de inicio del MCU,
|
|
tras el RESET, todos los registros se borran, de forma que las
|
|
líneas de las tres puertas quedan configuradas como entradas
|
|
en PULL-UP, sin poder provocar interrupciones.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Los puertos se programan poniendo los
|
|
adecuados valores en sus 3 registros, ahora 2 consideraciones
|
|
: no se pueden tener más de una entrada analógica
|
|
simultáneamente y la otra es que cuando una línea
|
|
se programa como entrada <I>SIN PULL-UP </I>ni interrupción
|
|
es lo mismo que si estuviera en alta impedancia.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">EL TIMER : </FONT></I><FONT FACE="Courier">Es
|
|
un temporizador compuesto por un contador de 8 bits con un preescaler
|
|
programable de 7 bits, permitiendo cuentas de hasta 2<SUP>15</SUP>
|
|
eventos, y toda la lógica de control necesaria para configurar
|
|
tres modos diferentes de trabajo.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Los registros de TIMER : el timer tiene
|
|
3 registros, el contador, el preescaler y otro el de estado y
|
|
control.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">El TCR : El registro contador de tiempos
|
|
TCR es el temporizador programable de 8 bits, se carga con el
|
|
valor de la temporización que se desee realizar. Este registro
|
|
se va decrementando en cada flanco ascendente de la señal
|
|
CLK aplicada a su entrada hasta que valga 0, momento en el cual
|
|
se activa el bit TMZ del registro de control/estado. El TCR se
|
|
encuentra en la posición <I>D3h del área de datos.
|
|
<BR>
|
|
</I></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">El PSC : Es un registro de 7 bits que
|
|
se encuentra en la posición <I>D2h del área de datos.</I>
|
|
Se trata también de un contador descendente que se decrementa
|
|
en los flancos ascendentes de la señal CLK aplicada a su
|
|
entrada. Como es sabido, la frecuencia obtenida en el bit 0, es
|
|
la mitad de la de la entrada. De esta manera, las señales
|
|
obtenidas en la entrada del CLK del preescaler, en el bit 0, bit
|
|
1, en el 2,3,4,5,6 serán de 1/2, 1/4, 1/8, 1/16, 1/64 y
|
|
1/128 de la frecuencia de entrada, respectivamente. Mediante un
|
|
multiplexor de 8 a 1, se aplica una de ellas al contador TCR como
|
|
frecuencia de CLK de trabajo del mismo.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">El TSCR : Se trata del registro de estado
|
|
y control con el cual se puede programar los distintos modos del
|
|
TIMER, así como conocer el estado del mismo. Este registro
|
|
puede ser leído y escrito en la posición <I>D4h
|
|
del área de datos.<BR>
|
|
</I></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">MODOS de TRABAJO : Mediante los correspondientes
|
|
bits del registro TSCR se pueden programar 3 modos de trabajo.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">1- Modo Controlado : El preescaler se
|
|
decrementa mientras la patilla de entrada TIMER esté a
|
|
1, en caso contrario la temporización queda detenida.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">2- Contador de Eventos : La patilla TIMER
|
|
actúa como entrada de CLK del TIMER y cuando los pulsos
|
|
contados sean iguales que el valor del contador la temporización
|
|
termina. La frecuencia máxima de entrada por el TIMER será
|
|
de 2Mhz si el MCU trabaja a 8Mhz.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">3- Modo Salida : El pin TIMER queda configurado
|
|
como salida y saca el nivel lógico que el usuario programe,
|
|
cuando la cuente llegue a 0.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">La INTERRUPCION TIMER : El TIMER si esta
|
|
habilitado para ello puede provocar una interrupción de
|
|
nivel 3, cuando la cuenta llegue a 0.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">EL CONVERSOR A/D : </FONT></I><FONT FACE="Courier">Es
|
|
un convertidor con el proceso de conversión conocido como
|
|
de APROXIMACIONES SUCESIVAS, si el MCU trabaja a 8Mhz el tiempo
|
|
de conversión serán de unos 70uS. El conversor puede
|
|
tener varios canales de entrada, pero como ya se dijo sólo
|
|
puede tener activo uno, de lo contrario se pueden producir fallos
|
|
en el CHIP. El conversor tiene 2 registros diferentes. Uno es
|
|
el resultado de la conversión (ADR) y el otro establece
|
|
las diferentes formas de trabajo y control (ADC).</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">La resolución es la siguiente
|
|
:<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Vdd-Vss</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">---------= Resolucion</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">256<BR>
|
|
Así pues si por ejemplo el MCU está alimentado a
|
|
5V, la resolución es de 19,5 mV.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">El RESET detiene, en el momento de producirse,
|
|
cualquier conversión que se esté realizando. Todos
|
|
los registros del A/D se ponen a 0.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">El registro ADC se encuentra en la posición
|
|
D1h del área de datos y el ADR en la D0h.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">EL WATCHDOG :</FONT></I><FONT FACE="Courier">
|
|
El WATCHDOG o controlador de secuencias consiste en un temporizador
|
|
capaz de generar un RESET cada cierto tiempo, dando comienzo la
|
|
secuencia de inicio del sistema. Esto evita que el microcontrolador
|
|
se quede "colgado" o entre en ciclos de espera excesivamente
|
|
largos. Se deberá recargar cada cierto tiempo evitando
|
|
que llegue a 0, si no se desea que genere un RESET. Existen dos
|
|
tipos de WATCHDOG uno activable por SOFTWARE y otra por HARDWARE.
|
|
En las versiones de MCU EPROM se comercializan los dos tipos,
|
|
los que se activan por SOFTWARE llevan la inscripción SWD
|
|
y los de HARDWARE HWD. </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">En el tipo HARDWARE el WATCHDOG se inicializa
|
|
automáticamente tras el RESET sin necesidad de ser activado
|
|
por el usuario. En este caso, siempre esta activado y no se puede
|
|
emplear como temporizador. En la versión SOFTWARE el usuario
|
|
controla el funcionamiento o no del WATCHDOG. En caso de no activarlo
|
|
se podrá emplear como temporizador.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">El WATCHDOG como tal es un contador descendente
|
|
al que se accede en la posición D8h del area de datos y
|
|
se representa como WDR. <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">El valor de temporización se establece
|
|
mediante el valor cargado en los 6 bits de mayor peso del registro,
|
|
que se va decrementando en unidades de intervalos de tiempo. De
|
|
esta manera, si antes no se recarga, llegara a 0 produciendo el
|
|
RESET. <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><B><FONT SIZE=2 FACE="Courier">III-d) TIPOS DE DIRECCIONAMIENTO
|
|
</FONT></B></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">El software de la familia ST62XX esta
|
|
diseñado para aprovechar al máximo las posibilidades
|
|
del hardware usando la mínima memoria posible. Por ello
|
|
gran parte de las instrucciones necesitan de un único byte
|
|
que contiene el cogido OP y el propio operando.</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">DIRECCIONAMIENTO INMEDIATO
|
|
:</FONT></I><FONT FACE="Courier"> El operando que acompaña
|
|
al código OP de la instrucción es el propio dato
|
|
a procesar. <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">DIRECTO :</FONT></I><FONT FACE="Courier">
|
|
La dirección de memoria donde se encuentra el dato a procesar,
|
|
se da en el operando de un byte que acompaña a la instrucción.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">DIRECTO CORTO : S emplea en aquellas
|
|
instrucciones en las que el operando es cualquiera de los registros
|
|
de trabajo X,Y,V y W.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">EXTENDIDO :</FONT></I><FONT FACE="Courier">
|
|
Lo emplean las instrucciones de salto (JP,CALL) que necesitan
|
|
de un operando de 12 bits para definir la dirección de
|
|
memoria a la que hay que acudir.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">RELATIVO AL PC : </FONT></I><FONT FACE="Courier">Se
|
|
emplea en las instrucciones de salto condicional. Estas realizan
|
|
la comprobación o test de una determinada condición.
|
|
Si esta se cumple el PC se puede desplazar 15 posiciones hacia
|
|
adelante o hacia atrás desde la posición en que
|
|
se encuentre en ese momento. Si por el contrario dicha condición
|
|
no se cumple, se ejecuta la siguiente instrucción.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">DIRECTO A BIT :</FONT></I><FONT FACE="Courier">
|
|
Empleado por las instrucciones destinadas al activo o borrado
|
|
de bits individuales.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">COMPROBACION DE BITS Y SALTO
|
|
:</FONT></I><FONT FACE="Courier"> En el código OP se indica
|
|
el número del bit a comprobar su estado lógico y
|
|
según su estado generar un salto de +/- 128 posiciones
|
|
o no.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">INDIRECTO :</FONT></I><FONT FACE="Courier">
|
|
El dato a manipular se encuentra en la posición marcada
|
|
por cualquiera de los registros indicies.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">INHERENTE O IMPLICADO : </FONT></I><FONT FACE="Courier">Lo
|
|
emplean aquellas instrucciones que no necesitan de operando alguno.
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><B><FONT SIZE=2 FACE="Courier">IV-EQUIPO DE PROGRAMACION USADO
|
|
</FONT></B></TT>
|
|
<P>
|
|
<TT><B><FONT SIZE=2 FACE="Courier">IV-a) INTRODUCCION AL EQUIPO
|
|
</FONT></B></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">El equipo usado en este proyecto es el,
|
|
equipo de desarrollo de ST6 de SGS-THOMSOM. Consta de un programador
|
|
de ST6 por medio del puerto paralelo de un PC, software para el
|
|
programador, un simulador de software y cuatro MCU ST6.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><B><FONT SIZE=2 FACE="Courier">IV-b) SOFTWARE :<BR>
|
|
</FONT></B></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">El software del equipo consta de un simulador
|
|
de la CPU del ST6, de un programa para el programador, y un ensamblador
|
|
y linkador. Ahora pasaremos a describir el ensamblador y el simulador.
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><B><FONT SIZE=2 FACE="Courier">IV-b,I) ENSAMBLADOR (DIRECTIVAS
|
|
Y OPCIONES) </FONT></B></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">-EL AST6.EXE (ENSAMBLADOR)
|
|
:</FONT></I><B><FONT SIZE=2 FACE="Courier"> </FONT></B><FONT FACE="Courier">AST6
|
|
es un ensamblador que trabaja con ficheros ASCII. Se ejecuta desde
|
|
la línea de comandos del DOS. Forma :</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">C:\ST6\AST6 [-opciones] fichero1 [fichero2...]</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Esta orden expuesta ensamblaría
|
|
fichero1.asm creando por defecto un fichero1.hex y fichero1.dsd.
|
|
Los ficheros de salida son producidos de acuerdo a las opciones
|
|
elegidas. Las opciones se especifican antes del fichero. Cada
|
|
opción debe de ir precedida por un signo menos, estas pueden
|
|
ser tanto en mayúsculas como minúsculas.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">Opciones del AST6 :<BR>
|
|
</FONT></I></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">-L Crea un fichero de salida con el listado
|
|
(name.LIS)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">-X Crea un fichero con una tabla de referencias
|
|
cruzadas (name.X)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">-M Añade un mapa de información
|
|
al final de name.LIS</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">-S Crea una tabla con los símbolos
|
|
en el fichero name.SYM</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">-O Crea un fichero objeto (name.obj)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">-E Crea un fichero con una lista de errores
|
|
(name.ERR)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">-F Introduce la trayectoria completa
|
|
(nombre) en los mensajes de error</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">-D Inserta información para la
|
|
máscara de ROM en el fichero name.HEX</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">-Z Cambia el formato de los ficheros
|
|
.DSD y .SYM para los componentes de la familia ST60<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Los ficheros .DSD son información
|
|
para el simulador (SIMST6.EXE).</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Por defecto AST6 crea los ficheros .HEX
|
|
y .DSD.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">Formato del programa fuente
|
|
:<BR>
|
|
</FONT></I></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">El formato de fichero fuente .ASM debe
|
|
de ser de texto ASCII.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Formas : </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">label LD A,055h ; Carga en el acumulador
|
|
05h</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">----- --------- ----------------------------</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">etiq. mnémonico. comentario <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Campo etiqueta : Cualquier nombre que
|
|
no sea una palabra reservada.(no va seguido de dos puntos)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Campo mnemónico : Cualquier mnemónico
|
|
admitido</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Comentario : Precedido por (;), lo que
|
|
le sigue no se tiene en cuenta.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">Símbolos y expresiones
|
|
: <BR>
|
|
</FONT></I></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Números : b o B, binarios</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">o o O, Octales</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">h o H, hexadecimales<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Un número es una cadena de dígitos.
|
|
Por defecto los números serán decimales.Ej : AFF
|
|
es un símbolo, 0AFFh es un número.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Caracteres Constantes :</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">El carácter constante esta representado
|
|
por un carácter ASCII entre comillas simples (ej: ´a´).
|
|
El valor del carácter constante es el código ASCII
|
|
para ese carácter.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Cadenas Constantes :</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Son cadenas de caracteres constantes
|
|
encerrados entre comillas dobles. Si se quiere poner en la cadena
|
|
las comillas estas deben ir precedidas por la BACKSLASH ( \ ).
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">DIRECTIVAS DE ENSAMBLADOR :
|
|
<BR>
|
|
</FONT></I></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Una directiva de ensamblador es similar
|
|
sintácticamente al código de una instrucción
|
|
máquina, pero esta se usa para la generación del
|
|
código objeto. Todas las directivas son identificadores
|
|
que comienzan con un punto. (Ej: tabla .DEF 084h)<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- DEFINICION DE DATOS EN EL ESPACIO DE
|
|
PROGRAMA<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">a) Directiva <B>.BLOCK<BR>
|
|
</B></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sintaxis : [etiqueta] .BLOCK expresión
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Esta directiva reserva un bloque de localizaciones
|
|
de memoria contiguas en espacio de memoria de programa. La dimensión
|
|
del bloque es determinada por la expresión en el campo
|
|
de operando. Si la etiqueta está presente a esta se le
|
|
asigna la dirección de la primera posición del bloque
|
|
de memoria. Todos los símbolos de la expresión tienen
|
|
que haber sido definidos anteriormente.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">b) Directiva <B>.WORD<BR>
|
|
</B></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sintaxis : [etiqueta] .WORD expresión,[expresión]
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Esta directiva genera sucesivas palabras
|
|
de código objeto en el espacio de programa. El byte menos
|
|
significativo se coloca en la dirección inferior y el byte
|
|
más significativo en la posición mayor. Las expresiones
|
|
tienen que estar separadas por espacios, tabuladores o comas.
|
|
<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">c) Directiva <B>.BYTE<BR>
|
|
</B></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sintaxis : [etiqueta] .BYTE expresión,[expresión]
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Esta directiva genera sucesivos bytes
|
|
de código en el espacio de programa. El valor de la expresión
|
|
es truncada a los 8 primeros bits.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">d) Directiva <B>.ASCII Y .ASCIZ<BR>
|
|
</B></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sintaxis : [etiqueta] .ASCII "cadena"</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">[etiqueta] .ASCIZ "cadena"
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Estas directivas se usan para definir
|
|
una cadena de caracteres en el espacio de programa, .ASCIZ es
|
|
igual que .ASCII pero añade un carácter NULL al
|
|
final de la cadena.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">e) Directiva <B>.DEF<BR>
|
|
</B></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sintaxis : [etiqueta] .DEF dirección,[R-MASK],[W-MASK],[V],[M]
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Esta directiva define las características
|
|
de la dirección del espacio de datos. Ej: valor .DEF 084h
|
|
, asigna a la etiqueta valor la dirección 084h del área
|
|
de datos.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">[M] coloca una marca en el fichero .DSD,
|
|
esa marca hará que mientras se está simulando el
|
|
programa en el simulador, la posición definida se visualizara
|
|
en la ventana de registros. En esa ventana sólo se visualizarán
|
|
los registros que lleven esa marca.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- DIRECTIVAS DE DEFINICION DE SIMBOLOS
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">a) Directiva <B>.EQU<BR>
|
|
</B></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sintaxis : [etiqueta] .EQU expresión
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Asigna el valor de la expresión
|
|
a la etiqueta, una vez utilizada esta directiva, la etiqueta ya
|
|
no puede volver a ser redefinida.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">b) Directiva <B>.SET<BR>
|
|
</B></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sintaxis : [etiqueta] .SET expresión
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Es muy similar a .EQU, la única
|
|
diferencia es que una etiqueta definida con .SET puede ser otra
|
|
vez redefinida con .SET.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">c) Directiva <B>.INPUT<BR>
|
|
</B></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sintaxis : .INPUT "name.asm"
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Añade al fichero fuente el indicado
|
|
por .INPUT. Se suele utilizar para añadir a los ficheros
|
|
fuentes el fichero de definición de registros ya que este
|
|
es común a todos ellos.<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- OTRAS DIRECTIVAS<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">a) Directiva <B>.DISPLAY<BR>
|
|
</B></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sintaxis : .DISPLAY "cadena"
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Durante el ensamblado imprime la cadena
|
|
en la pantalla.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">b) Directiva <B>.END<BR>
|
|
</B></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sintaxis : .END<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Ultima directiva del fichero fuente,
|
|
indica el final. Todas las líneas presentes después
|
|
de esta directiva son ignoradas.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">c) Directiva <B>.ORG<BR>
|
|
</B></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sintaxis : .ORG expresión<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Asigna el valor de la expresión
|
|
al contador de localización. Todos los símbolos
|
|
que aparezcan en expresión deben haber sido definidos previamente.
|
|
Esta directiva no funciona con la opción -O del AST6.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">d) Directivas <B>.ERROR </B>Y <B>.WARNING
|
|
<BR>
|
|
</B></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sintaxis : .ERROR "cadena"</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.WARNING "cadena"<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Generan un mensaje (cadena) en el fichero
|
|
de errores (-E) o en la salida de errores en pantalla.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">- DIRECTIVAS PARA EL USO DEL REGISTRO
|
|
RDW<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">a) Directiva <B>.W_ON<BR>
|
|
</B></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sintaxis : .W_ON<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Esta directiva debe incluirse en el fichero
|
|
fuente, si en el espacio de datos existe una ventana de datos
|
|
constantes.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">b) Directivas etiqueta<B>.W</B> y etiqueta<B>.D
|
|
<BR>
|
|
</B></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sintaxis : etiqueta<B>.W</B></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">etiqueta<B>.D<BR>
|
|
</B></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Deben utilizarse si .W_ON ha sido puesta
|
|
antes.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Ejemplo de su utilización :<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.W_ON <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">tabla .BYTE 0ffh,21h,42h,32h ;Bloque
|
|
fijo en EPROM<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.input "ST6.ASM" ;Entra definición
|
|
de registros<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi rdw,tabla<B>.W</B> ;Carga en el registro
|
|
RDW la ;dirección apropiada para que en ;el área
|
|
de datos se quede ;representado el bloque de datos ;constantes
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi x,tabla<B>.D</B> ;Carga en X la dirección
|
|
de ;memoria RAM donde se encuentra ;el primer valor de la tabla
|
|
de ;datos (0ffh)<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.END<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Un programa en el cual hemos utilizado
|
|
estas directivas de control de RDW es el del control de semáforos.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Las directivas de ensamblado condicional
|
|
y macros no se especifican por ser su tratamiento complejo y no
|
|
ser necesarias para este proyecto.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">El ST6.EXE (linkador) : </FONT></I><FONT FACE="Courier">LST6
|
|
combina los objetos de ST6 creados por separado. Esta especialmente
|
|
diseñado para soportar a los miembros de la familia ST6
|
|
que tienen la memoria paginada. Por ello no lo utilizaremos.<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><B><FONT SIZE=2 FACE="Courier">IV-b,II) SIMULADOR ST6 </FONT></B></TT>
|
|
<P>
|
|
<TT><I><FONT SIZE=2 FACE="Courier">Para utilizar el simulador
|
|
es mejor añadir al AST6.EXE cuando se va a ensamblar el
|
|
programa a simular la opción -S, para que el simulador
|
|
carge el fichero nombre.SYS, es más fácil de seguir
|
|
la simulación ya que así se visualiza el programa
|
|
en el simulador con las etiquetas.</FONT></I></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">El simulador (SIMST6.EXE) simula el funcionamiento
|
|
del corazón del ST6, (interrupciones,RDW,IOR) y no los
|
|
periféricos de I/O, ADC, TIMER, y WATCHDOG.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Ahora pasamos a describir brevemente
|
|
los menús más importantes del simulador en INTERFACE
|
|
GRAFICO.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><B><FONT SIZE=2 FACE="Courier">- MENU FILE<BR>
|
|
</FONT></B></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">LOAD : carga ficheros a simular (.HEX,
|
|
.DSD) y si existe .SYS.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">SAVE : salva el contenido de memoria
|
|
en un fichero.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">OPEN LOG OPTION : salva todas las salidas
|
|
del simulador a un fichero de texto.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">CLOSE LOG OPTION : cierra el fichero
|
|
abierto.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">EXIT : sale del simulador.</FONT></TT>
|
|
<P>
|
|
<TT><B><FONT SIZE=2 FACE="Courier">- MENU WATCH </FONT></B></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">REGISTER </FONT><FONT FACE="MS LineDraw">ÄÄÂÄÄÄÄÄ</FONT><FONT FACE="Courier">>
|
|
DISPLAY *1</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="MS LineDraw"> ³</FONT><FONT FACE="Courier">
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="MS LineDraw"> ³</FONT><FONT FACE="Courier">
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="MS LineDraw"> ÀÄÄÄÄÄ</FONT><FONT FACE="Courier">>
|
|
DISPLAY WRS *2<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">*1 DISPLAY : Tiene 3 ventanas, pregunta
|
|
a partir de que dirección se visualiza el espacio de datos.
|
|
También se puede cambiar el PC y algunos FLAGS.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">*2 DISPLAY WRS : Visualiza todos los
|
|
registros que estan declarados como de trabajo, es decir con la
|
|
marca [m] en su definición.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">DUMP PROG OPTION : Muestra y modifica
|
|
el espacio de programa.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ASSEMBLER OPTION : Ensambla y desensambla
|
|
en un editor en línea.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">SYMBOLS OPTION : Visualiza la tabla de
|
|
símbolos, cargada del fichero .SYS.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">WINDOW OPTION : Visualiza un bloque de
|
|
64 bytes del espacio de datos.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">SEARCH OPTION : Busca bytes en memoria.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">TRACE OPTION : Visualiza las últimas
|
|
instrucciones ejecutadas.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><B><FONT SIZE=2 FACE="Courier">- MENU UTILITY <BR>
|
|
</FONT></B></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">COMPARE OPTION : Compara 2 bloques de
|
|
memoria.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">MOVE OPTION : Mueve un bloque de memoria
|
|
a otra dirección.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">USE OPTION : Ejecuta los comandos que
|
|
estan en un fichero .CMD</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">FILL OPTION : Rellena un bloque de memoria
|
|
con un patrón.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">BASE OPTION : Selecciona la base de conversión
|
|
(HEX, OCT, DEC).</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">L.MODE OPTION : Pone el simulador en
|
|
interface de línea de comandos.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><B><FONT SIZE=2 FACE="Courier">- MENU RUN <BR>
|
|
</FONT></B></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">GO (CONTINUE) OPTION : Corre el programa
|
|
donde se quedó el PC.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">GO OPTION : Corre el programa a partir
|
|
de una dirección.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">NEXT OPTION : Ejecuta paso a paso.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">RESET OPTION : Resetea el STATUS interno
|
|
del simulador.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">SET OPTION : Pone el FULL-TRACE.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><B><FONT SIZE=2 FACE="Courier">- MENU BREAKPOINTS<BR>
|
|
</FONT></B></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">DISPLAY OPTION : Visualiza todos los
|
|
modos de BREAKPOINTS si estan abilitados.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">PRESET OPTION : Preestablece las opciones
|
|
de los BREAKPOINTS.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">SET/ADDR OPTION : Coloca un breakpoint
|
|
en una dirección del espacio de datos o de programa.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">DELETE/ALL OPTION : Borra todos los BREAKPOINTS.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">DEL/ADDR OPTION : Borra BREAKPOINTS de
|
|
una sola dirección.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">BRK ENABLE OPTION : Abilita/Desabilita
|
|
los BREAKPOINTS.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><B><FONT SIZE=2 FACE="Courier">- MENU CONF<BR>
|
|
</FONT></B></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Muestra los tiempos de usuario y sistema
|
|
y el estado de las interrupciones.<BR>
|
|
<BR>
|
|
<BR>
|
|
<B>V-PLACA DE DESARROLLO ST6</B>V-PLACA DE DESARROLLO ST6 <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><B><FONT SIZE=2 FACE="Courier">V-a) EL PORQUÉ</FONT></B></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">La placa de desarrollo del ST6 nació
|
|
por la necesidad de un sistema con el cual se pudieran montar
|
|
practicas con el microcontrolador de una manera rápida
|
|
y sencilla, además de evitar la rotura de los pines del
|
|
ST6 en el momento de insertar y sacar el ST6 de la BOARD. Una
|
|
vez nacida la idea surgió la posibilidad de poder aprovechar
|
|
todas las utilidades de PROMAX utilizadas anteriormente con el
|
|
Z80, para esto se decidió el colocar el conector adecuado
|
|
con el patillaje del PIO del equipo TM-801 de PROMAX. Otra opción
|
|
recogida fue la de dotar a la placa de su propia fuente de alimentación
|
|
estabilizada para aplicaciones digitales<B>. </B>Con todas estas
|
|
premisas se diseño el circuito descrito a continuación.
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><B><FONT SIZE=2 FACE="Courier">V-b) ESQUEMAS Y DESCRIPCIÓN</FONT></B></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">El esquema esta claramente dividido en
|
|
3 partes que son, la fuente de alimentación, los switches
|
|
y leds y por ultimo el microcontrolador.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">La fuente de alimentación: Es
|
|
una fuente de alimentación de tensión fija de 5V
|
|
y que es capaz de proporcionar hasta 1 amperio de corriente. El
|
|
transformador es un transformador en encapsulado de resina que
|
|
transforma los 220V de red en 12V, la máxima corriente
|
|
que es capaz de soportar es 1 amperio. Para el rectificador se
|
|
opto por un PUENTE DE WIEN encapsulado, por su mayor facilidad
|
|
de reparación y de montaje frente a los 4 diodos tradicionales,
|
|
Es capaz de soportar la corriente de un amperio. El filtro esta
|
|
constituido por C5 que es un condensador electrolitico de 4.500</FONT></TT><FONT FACE="Symbol">m</FONT><TT><FONT FACE="Courier">F.
|
|
La etapa estabilizadora y reguladora esta basada en el popular
|
|
7805 que es un regulador de tensión positiva de 5V capaz
|
|
de proporcionar 1 Amperio, para la máxima corriente es
|
|
recomendable dotar al integrado de su correspondiente radiador,
|
|
ya que al estar dotado de un protector contra sobrecalentamiento
|
|
sin el radiador no podrá proporcionar la corriente adecuada,
|
|
C3 y C4 son recomendados por el fabricante del 7805. El led D10
|
|
tiene como función indicarnos si el sistema esta conectado
|
|
a la red R2 tiene como función limitar la corriente que
|
|
pasa por D10.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Switches y leds: Tienen como función
|
|
el poder comprobar mediante sencillos cableados el correcto funcionamiento
|
|
de un programa en caso de no poder disponer del sistema a controlar.
|
|
Los switches tienen como función la de poder simular sensores,
|
|
están constituidos por una tira de conector de 10 pines
|
|
(8 para los dips y dos para alimentación) un circuito buffer
|
|
74HC245 configurado par que los datos pasen de A a B, de 1 pack
|
|
de 8 resistencias y de los dips, las resistencias tienen como
|
|
fin el asegurar el 1 cuando los dip estén abierto y limitar
|
|
la corriente cuando los dips estén cerrados.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Los leds tienen como función visualizar
|
|
los datos de los controles de mando, esta constituido por una
|
|
tira de conector de 8 pines, de un circuito de buffers configurado
|
|
para que los datos pasen de A a B ,de un pack de resistencias
|
|
para limitar la corriente de los led y de 8 led para visualizar
|
|
los datos.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Parte principal: Esta constituida por
|
|
un zócalo de fuerza de inserción nula, de un circuito
|
|
de RESET, del oscilador, de una tira de conectores de 22 pins
|
|
y de un conector de 50 patillas.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">El zócalo de fuerza 0 corresponde
|
|
a U1, en el esquema apararece como un ST62E15 para evitar los
|
|
posibles errores de conexión de patillas, hay que advertir
|
|
que solo vale esta placa para los encapsulados de 28 patillas,
|
|
el circuito de reset funciona de dos maneras al encender la alimentación
|
|
y al pulsar el pulsador, el circuito oscilador esta diseñado
|
|
para la frecuencia de oscilación de 8 Mhz a la cual puede
|
|
funcionar cualquier miembro de la familia ST6. Mediante la tira
|
|
de pins se puede acceder a todas las líneas del ST6 excepto
|
|
al reset, oscin y oscout además de a las alimentaciones.
|
|
El conector de 50 patillas conserva la distribución del
|
|
PIO del TM801, a este conector van solamente los puertos A y B
|
|
del ST6, además de la masa.<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Sobre la placa de circuito impreso existe
|
|
sitio suficiente para la colocacion de dos placas tipo board.
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Los esquemas y fotolitos se encuentran
|
|
en las dos páginas siguientes.<BR>
|
|
<BR>
|
|
<B>V-c) PRACTICAS CON PLACA Y SUBRUTINAS ÚTILES</B></FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">A continuación están la
|
|
totalidad de programas realizados que han sido simulados, también
|
|
hay algunas subrutinas útiles.(NOTA: en el comienzo de
|
|
cada programa hay que definir los registros) <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;****************************************************************************</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* Proyecto de Practicas ST6 *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* Programa : Convierte en BCD
|
|
un numero de 8 bits *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* ******* ;******* *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* José Ignacio Díaz
|
|
Beamud & Jesús Antonio Alquezar Sierra *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;****************************************************************************
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;Convierte en BCD un número de
|
|
8 bits, el número a convertir se encuentra en</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;'nn' (86h) y el resultado se deposita
|
|
en datal (número bajo),datam (número</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;medio ),datah (número alto)<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">datal .def 84h,0ffh,0ffh ;Parte baja
|
|
del resultado (BCD)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">datam .def 85h,0ffh,0ffh ;Parte media
|
|
del resultado (BCD)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">datah .def 86h,0ffh,0ffh ;Parte alta
|
|
del resultado (BCD)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">nn .def 86h,0ffh,0ffh ;Número
|
|
a convertir en posición 86h<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">conver ldi datal,00 </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi datam,00</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi datah,00 ;Pone a 0 las posiciones
|
|
del resultado</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi a,nn ;Carga en A el número
|
|
a convertir</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal2 cpi a,100 ;Y lo compara con 100</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrc sal1 ;Si es menor (nn<100) salta
|
|
a sal1</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">subi a,100 ;De lo contrario resta a A
|
|
100</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inc datah ;Y incrementa datah</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jp sal2 ;Salta a sal2</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal1 cpi a,10 ;Compara A con 10</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrc sal3 ;Si es menor (nn<10) salta
|
|
a sal3 </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">subi a,10 ;De lo contrario resta a A
|
|
10</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inc datam ;Y incrementa datam</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jp sal1 ;Salta a sal1</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal3 ld datal,a ;El resultado restante
|
|
(unidades) se deja en datal</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">; </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">; \/ \/ \/ \/ \/</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;****************************************************************************</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* Proyecto de Practicas ST6 *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* Programa : Convierte en BCD
|
|
un numero de 9 bits *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* ******* </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* José Ignacio Díaz
|
|
Beamud & Jesús Antonio Alquezar Sierra *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;****************************************************************************
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;Convierte un número de 9 bits
|
|
(resultado de multiplicar uno de 8bits * 2)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;en BCD.Este módulo se puede emplear
|
|
para convertir el resultado del </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;convertidor A/D (ya debidamente multiplicado
|
|
por 2 sólo si VCC = 5V) a BCD</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;y poder sacar el resultado a visualizadores
|
|
7 segmentos.<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">datch .def 84h,0ffh,0ffh ;Parte alta
|
|
del número a convertir</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">datcl .def 85h,0ffh,0ffh ;Parte baja
|
|
del número a convertir</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">datal .def 86h,0ffh,0ffh ;Parte baja
|
|
del resultado (BCD)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">datam .def 87h,0ffh,0ffh ;Parte media
|
|
del resultado (BCD)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">datah .def 88h,0ffh,0ffh ;Parte alta
|
|
del resultado (BCD)<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">conv9b ldi datal,00</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi datam,00</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi datah,00 ;Pone a 0 las posiciones
|
|
del resultado</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrr 0,datch,sal1 ;Salta a sal1 si el
|
|
bit 0 del datch es 0</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi datal,6 ;De lo contrario el resultado
|
|
ya es como mínimo</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi datam,5 ;256 ya que 2^(9­1)=256</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi datah,2</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal1 ld a,datcl ;Carga en A la parte
|
|
baja del dato a convertir</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal3 cpi a,100 ;La compara con 100</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrc sal2 ;Si es menor salta a sal2 (datcl<100)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">subi a,100 ;De lo contrario restale 100</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inc datah ;Y incrementa datah</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jp sal3 ;Salta a sal3</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal2 cpi a,10 ;Compara A con 10</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrc sal4 ;Y si este es menor (A<10)
|
|
salta a sal4</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">subi a,10 ;De lo contrario resta a A
|
|
10</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inc datam ;Incrementa datam</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jp med ;Salta a med</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal4 jp sa ;Salta a sa</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrr 3,datam,sal5 ;Salta a sal5 si el
|
|
bit 3 de datam es 0</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrr 1,datam,sal5 ;O si el bit 1 de datam
|
|
es 0</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;Verifica si datam es igual a 9 </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi datam,0 ;De lo contraria pon a 0
|
|
datam</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inc datah ;Y incrementa datah</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal5 jp sal2 ;Salta a sal2</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sa add a,datal ;Suma a A datal</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld datal,a ;Y lo lleva a datal</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">cpi a,10 ;Lo compara con 10</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrc sa2 ;Si es menor salta a sa2 (A<10)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">subi a,10 ;Resta a A 10</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld datal,a ;Y lleva A a datal</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jp p1 ;Salta a p1</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sa2 jp sal6 ;Salta a sal6</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">p1 inc datam ;Incrementa datam</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrr 3,datam,sal6 ;Salta a sal6 si el
|
|
bit 3 de datam es 0</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrr 1,datam,sal6 ;O si el bit 1 de datam
|
|
es 0</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;Verifica si datam es igual a 9</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi datam,0 ;Pon datam a 0</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inc datah ;Incrementa datah</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal6 nop ;No opera</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">nop ;No opera <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">; </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">; \/ \/ \/ \/ \/</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;<BR>
|
|
<BR>
|
|
<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;****************************************************************************</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* Proyecto de Practicas ST6 *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* Programa : Convertidor de A/D
|
|
a valor V correspondiente *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* ******* </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* José Ignacio Díaz
|
|
Beamud & Jesús Antonio Alquezar Sierra *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;****************************************************************************
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;Despues de una conversión del
|
|
A/D el resultado de ADR se multiplica por 2</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;Para obtener el resultado en voltios
|
|
de la conversión.</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;Esto sólo sera aplicable si VCC
|
|
= 5V ya que de esta forma la escala de</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;Conversión son más o menos
|
|
0.02V</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;El resultado podrá ser un número
|
|
de 9 bits<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">datah .def 084h,0ffh,0ffh ;Parte alta
|
|
del resultado</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">datal .def 085h,0ffh,0ffh ;Parte baja
|
|
del resultado<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ca/d ldi datah,0 ;Pone datah a 0 </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld a,adr ;Carga el resultado de la conversión
|
|
en A</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sla a ;y lo multiplica por 2</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrnc sal1 ;Si no hay carry salta a sal1</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inc datah ;De lo contraria pon datah
|
|
a 1</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal1 ld datal,a ;Y lleva A (multiplicado
|
|
por 2) a datal</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">nop ;No opera</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">nop ;No opera <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">; </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">; \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/
|
|
\/ \/ \/ \/ \/ \/ \/ \/</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;***** DEFINE REGISTROS</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;***** Utilizar con .INPUT <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">x .def 80h,m </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">y .def 81h,m </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">v .def 82h,m </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">w .def 83h,m </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">a .def 0ffh,m <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">drpa .def 0c0h,m </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">drpb .def 0c1h,m </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">drpc .def 0c2h,m <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ddrpa .def 0c4h,m </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ddrpb .def 0c5h,m </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ddrpc .def 0c6h,m <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ior .def 0c8h,m </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">rdw .def 0c9h,m <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">orpa .def 0cch,m </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">orpb .def 0cdh,m </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">orpc .def 0ceh,m <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">adr .def 0d0h,m </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">adcr .def 0d1h,m <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">psc .def 0d2h,m </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">tcr .def 0d3h,m </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">tscr .def 0d4h,m <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">wdr .def 0d8h,m <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******************* Temporizador de
|
|
undidad de 1 segundo</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******************* El número
|
|
de segundos se cargan en el acumulador</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******************* entonces si el acumulador
|
|
es 0 sale temporizador<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">segundos .equ 01h<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reset reti</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal3 ldi a,segundos</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrnz inic</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jp fin</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inic ldi v,0ach</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal2 ldi w,0ffh</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal1 nop</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">nop</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">nop</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">nop</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">dec w</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrnz sal1</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">dec v </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrnz sal2</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">dec a</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrz fin</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jp sal3</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">fin nop</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">nop<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">; </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">; \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/
|
|
\/ \/ \/ \/ \/ \/ \/ \/</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;<BR>
|
|
<BR>
|
|
<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******************* Temporizador de
|
|
undidad de 1 segundo para watchdog HWD</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******************* El número
|
|
de segundos se cargan en el acumulador</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******************* entonces si el acumulador
|
|
es 0 sale temporizador<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">segundos .equ 01h<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reset reti</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal3 ldi a,segundos</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrnz inic</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jp fin</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inic ldi v,0ach</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal2 ldi w,0ffh</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal1 ldi wdr,0feh</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">nop</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">nop</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">dec w</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrnz sal1</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">dec v </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrnz sal2</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">dec a</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrz fin</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jp sal3</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">fin nop</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">nop<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">; </FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT><FONT FACE="Courier">
|
|
</FONT><FONT FACE="MS LineDraw">³³</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">; \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/ \/
|
|
\/ \/ \/ \/ \/ \/ \/ \/</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;<BR>
|
|
<BR>
|
|
<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;***** VECTORES ****************************************************
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.org 0ff0h<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">adc nop ;Vector conv. A/D</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reti</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">timer nop ;Vector del timer</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reti</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">int2 nop ;Vector de PB y PC</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reti</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">int1 nop ;Vector de PA</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reti<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.org 0ffch<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">nmi nop ;Vector de NMI</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reti</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">res jp reset ;Vector de RESET <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.end<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">Programas realizados para la placa de
|
|
desarrollo<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******************************************************************</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* Programa para ST6215 *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* Entra un dato por PA y lo saca
|
|
seguidamente por PB *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******************************************************************</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;***** Define Registros ********************************************
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.input "st6.asm" <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;***** Define puertos ********************************************</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;***** PA(ent) y PB(sal) *******************************************
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.org 0880h<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reset reti ;Retorna a modo normal desues
|
|
del reset</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi ddrpa,0h</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi orpa,0h</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi drpa,0h ;El puerto A es configurado
|
|
como entrada</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi ddrpb,0ffh</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi orpa,0ffh</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi drpa,0ffh ;Y el puerto B como salida
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;***** RUTINA PRINCIPAL ********************************************
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inicio ld a,drpa ;Carga lo que hay en
|
|
los pines de PA en A</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld drpb,a ;Para sacarlos por PB</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jp inicio ;Repite BUCLE <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;***** VECTORES ****************************************************
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.org 0ff0h<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">adc nop ;Vector conv. A/D</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reti</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">timer nop ;Vector del timer</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reti</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">int2 nop ;Vector de PB y PC</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reti</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">int1 nop ;Vector de PA</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reti<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.org 0ffch<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">nmi nop ;Vector de NMI</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reti</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">res jp reset ;Vector de RESET <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.end<BR>
|
|
<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;****************************************************************************</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* Proyecto de Practicas ST6 *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* Programa : Control de motor
|
|
PASO A PASO *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* ******* </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;******* José Ignacio Díaz
|
|
Beamud & Jesús Antonio Alquezar Sierra *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;****************************************************************************</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.display "Control de motor paso
|
|
a paso (J.Ignacio Diaz y J.Antonio Alquezar)"<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;Puerto B como salida (4 lineas de menor
|
|
peso)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;Puerto A linea PA7 como entrada con
|
|
interrupción</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;El resto de lineas de puertos PA,PB
|
|
y PC quedan en estado de alta impedancia</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;Si se produce una NMI la salida TIMER
|
|
se activa intermitentemente un tiempo<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.input "st6.asm" ;Entra fichero
|
|
de definición de registros </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.org 800h ;Ensambla a partir de la 800h</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">veces .def 84h,0ffh,0ffh ;Define la posición
|
|
84h de datos como 'veces'</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">tempo .def 85h,0ffh,0ffh ;Define la posición
|
|
85h de datos como 'tempo'</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">segun .def 86h,0ffh,0ffh ;Define la posición
|
|
86h de datos como 'segun'<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reset ldi wdr,0feh ;Recarga el watchdog</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reti ;Retorna de interrupción
|
|
despues del reset</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi ddrpa,0</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi orpa,10000000b</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi drpa,01111111b ;Programa PA7 como
|
|
interrupción y demás HI­Z </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi ddrpb,00001111b </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi orpb,00001111b</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi drpb,11110000b ;Progrma PB3 a PB0
|
|
como salidas y demás HI­Z<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi ior,00110000b ;Abilita interrupciones
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi wdr,0feh ;Recarga el watchdog<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">re1 ldi wdr,0feh ;Recarga el watchdog
|
|
y entra en un bucle cerrado</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jp re1 ;Y entra en un bucle cerrado</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;Hasta que se produce un interrupción
|
|
en PA</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;y entonces salta a re2<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;**** Subrutina de antención de
|
|
PA ******************************************</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;**** Ahora el motor dara una vuelta
|
|
en un sentido **************************<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">re2 ldi veces,48 ;Carga la posición
|
|
veces con 48 pasos( 1 vuelta) </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">re3 ldi a,0f8h </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld drpb,a ;Saca a las 4 lineas de menor
|
|
peso de PB un 0</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;las cuatro superiores en HI­Z</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">call tem ;LLama a un temporizador</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi a,0fah</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld drpb,a ;Saca a las 4 lineas de menor
|
|
peso de PB un 2</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;las cuatro superiores en HI­Z</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">call tem ;LLama a un temporizador</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">dec veces ;Decrementa la posición
|
|
veces (n.de pasos)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrnz re3 ;Si no es cero salta a re3 de
|
|
lo contrario sigue</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;**** El motor a dado una vuelta y ahora
|
|
la dara en sentido contrario *******</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi veces,48 ;Carga la posición
|
|
veces con 48 pasos( 1 vuelta)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">re4 ldi a,0f9h</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld drpb,a ;Saca a las 4 lineas de menor
|
|
peso de PB un 1</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;las cuatro superiores en HI­Z</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">call tem ;LLama a un temporizador</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi a,11111011b</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld drpb,a ;Saca a las 4 lineas de menor
|
|
peso de PB un 3</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;las cuatro superiores en HI­Z </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">call tem ;LLama a un temporizador </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">dec veces ;Decrementa la posición
|
|
veces (n.de pasos) </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrnz re4 ;Si no es cero salta a re3 de
|
|
lo contrario sigue </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi a,0f0h </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld drpb,a ;Pone la salida de PB=0 (4
|
|
lineas de menor peso)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reti ;Retorna de interrupción,despues
|
|
de dar 1 vuelta</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;**** Subrutina de atención a
|
|
NMI *******************************************<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inmi ldi segun,6 ;Intermitente 6 veces</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inmi2 ldi tempo,20 ;Carga 'veces' con
|
|
20 (20 * 0.04892 = 0.978 sg)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal1 ldi tcr,0ffh ;Carga contador con
|
|
255 (valor máximo)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi tscr,00111111b ;Pone el preescaler
|
|
a 128 y DOUT a 1</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;La temporización es máxima
|
|
= 0.04892 sg</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">loop1 jrr 7,tscr,loop1 ;Espera a que
|
|
el contador llege a 0</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">dec tempo ;Decrementa 'tempo'</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrnz sal1 ;Repite hasta que 'tempo' =
|
|
0</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi tempo,20</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal2 ldi tcr,0ffh</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi tscr,00101111b ;Hace lo mismo que
|
|
el bloque anterior escepto </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;que ahora DOUT = 0,También temporiza
|
|
0.978 sg. </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">loop2 jrr 7,tscr,loop2</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">dec tempo</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrnz sal2</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">dec segun ;Decrementa segun</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrz sal3 ;Si es 0 salta a sal3</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jp inmi2 ;De lo contrario a inmi (repite)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal3 reti ;Si había sido 0 retorna
|
|
de interrupción</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;**** Temporizador **********************************************************
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">tem ldi v,0ffh</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">tem1 ldi wdr,0feh ; \</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">tem2 nop ; |</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">nop ; |­­­­> Bucle
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">nop ; |</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">dec v ; /</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrnz tem1 ;Repite el bucle 255 veces</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ret ;Retorno de subrutina<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;***** VECTORES ****************************************************
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.org 0ff0h<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">adc nop ;Vector conv. A/D</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reti</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">timer nop ;Vector del timer</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reti</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">int2 nop ;Vector de PB y PC</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reti</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">int1 jp re2 ;Vector de PA</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.org 0ffch<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">nmi jp inmi ;Vector de NMI</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">res jp reset ;Vector de RESET <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.end<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">; Versión con uso de directivas
|
|
(pp_on y section) **********<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;*** *******************************************************
|
|
***</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;*** José Ignacio Díaz
|
|
Beamud & Jesús Antonio Alquezar **** ***</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;*** ********************************
|
|
ST­6 SGS­THOMSON ***** ***</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;­­­ ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
|
|
­­­</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;*** Ordena tabla en orden posicion mas
|
|
alta valor menor *** ***</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;*** *******************************************************
|
|
***<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.PP_on</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.pl 60</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.vers "st6215"</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.romsize 2</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.input "6215_reg.asm"<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;*** Define etiquetas **********************************
|
|
***<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">nfin .def 90h</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">adat .def 91h<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;*** Programa principal ********************************
|
|
***</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.section 1<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.org 080h<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reset reti ;Coloca NMI a 0 despues del
|
|
reset</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi w,0ah ;Carga primer contador con
|
|
0Ah (longitud tabla)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inibu ldi y,0ah ;Carga segundo contador
|
|
con 0Ah (longitud tabla)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi nfin,00h ;Pone posicion 090h a 00
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi x,084h ;Carga puntero X con inicio
|
|
tabla</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal2 ld a,(x) ;Carga en A el numero que
|
|
apunta X</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inc x ;Incrementa X</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">cp a,(x) ;Compara A con la posicion que
|
|
indica X actualmente</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrz sal1 ;Si la comparacion es 0 salta</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrnc sal1 ;Si no hay carry tambien salta</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld v,a ;En caso contrario intercambiar,salvaguarda
|
|
A en V</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld a,(x) ;Carga en A el numero que apunta
|
|
X</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">dec x ;Decrementa X</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld (x),a ;Carga A en la direccion indicada
|
|
por el puntero</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inc x ;Vuelve a incrementar X</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld a,v ;Devuelve el antiguo valor a A</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld (x),a ;Y lo deposita en la direccion
|
|
que apunta X</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jp sal3 ;Salto fin de intercambio</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal1 inc nfin ;Tratamiento no intercambio,incrementa
|
|
(090h)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld adat,a ;Salva el valor de A en (091h)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jp inter2 ;Salto intermedio</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inter jp sal2 ;Salto intermedio</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inter2 ld a,nfin ;Coge el valor contenido
|
|
en (090h)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jp inter4 ;Salto intermedio</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inter3 jp inibu ;Salto intermedio </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inter4 cpi a,0ah ;Compara A con longitud
|
|
tabla,el contenido de (090h)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;contiene las veces que no se encuentra
|
|
desorden en la</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;tabla por cada escaneo,si la posicion
|
|
llega a 0A </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;significa que la tabla esta ya ordenada
|
|
y no es </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;necesario continuar el programa<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrz fin ;Si (090h) es igual a 0A acaba
|
|
programa</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld a,adat ;Recupera valor de A</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal3 dec y ;Decrementa Y (primer bucle)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrnz inter ;Si no es 0 repite</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">dec w ;De lo contrario decrementa W (segundo
|
|
bucle)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrnz inter3 ;Si no es 0 repite</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">fin nop ;NO OPERA</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">stop ;STOP<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;*************************************
|
|
Sección de vector interrupciones ****<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.section 32</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.org 0eh<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">res jp reset ;Vector de RESET <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.end<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">; Versión con directivas ORG (definición
|
|
mapa vectores)<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;*** ********************************************************
|
|
***</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;*** José Ignacio Díaz
|
|
Beamud & Jesús Antonio Alquezar Sierra ***</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;*** ********************************
|
|
ST­6 SGS­THOMSON ****** ***</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;­­­ ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
|
|
­­­</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;*** Ordena tabla en orden posicion mas
|
|
alta valor menor **** ***</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;*** ********************************************************
|
|
***<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.input "6215_reg.asm"<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;*** Define etiquetas **********************************
|
|
***<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">nfin .def 90h</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">adat .def 91h<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;*** Programa principal ********************************
|
|
***<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.org 0800h<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reset reti ;Coloca NMI a 0 despues del
|
|
reset</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi w,0ah ;Carga primer contador con
|
|
0Ah (longitud tabla)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inibu ldi y,0ah ;Carga segundo contador
|
|
con 0Ah (longitud tabla)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi nfin,00h ;Pone posicion 090h a 00
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi x,084h ;Carga puntero X con inicio
|
|
tabla</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal2 ld a,(x) ;Carga en A el numero que
|
|
apunta X</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inc x ;Incrementa X</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">cp a,(x) ;Compara A con la posicion que
|
|
indica X actualmente</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrz sal1 ;Si la comparacion es 0 salta</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrnc sal1 ;Si no hay carry tambien salta</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld v,a ;En caso contrario intercambiar,salvaguarda
|
|
A en V</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld a,(x) ;Carga en A el numero que apunta
|
|
X</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">dec x ;Decrementa X</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld (x),a ;Carga A en la direccion indicada
|
|
por el puntero</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inc x ;Vuelve a incrementar X</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld a,v ;Devuelve el antiguo valor a A</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld (x),a ;Y lo deposita en la direccion
|
|
que apunta X</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jp sal3 ;Salto fin de intercambio</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal1 inc nfin ;Tratamiento no intercambio,incrementa
|
|
(090h)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld adat,a ;Salva el valor de A en (091h)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jp inter2 ;Salto intermedio</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inter jp sal2 ;Salto intermedio</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inter2 ld a,nfin ;Coge el valor contenido
|
|
en (090h)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jp inter4 ;Salto intermedio</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inter3 jp inibu ;Salto intermedio </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inter4 cpi a,0ah ;Compara A con longitud
|
|
tabla,el contenido de (090h)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;contiene las veces que no se encuentra
|
|
desorden en la</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;tabla por cada escaneo,si la posicion
|
|
llega a 0A </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;significa que la tabla esta ya ordenada
|
|
y no es </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;necesario continuar el programa</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrz fin ;Si (090h) es igual a 0A acaba
|
|
programa</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld a,adat ;Recupera valor de A</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal3 dec y ;Decrementa Y (primer bucle)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrnz inter ;Si no es 0 repite</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">dec w ;De lo contrario decrementa W (segundo
|
|
bucle)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrnz inter3 ;Si no es 0 repite</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">fin nop ;NO OPERA</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">stop ;STOP<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;*************************************
|
|
Sección de vector interrupciones ****<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.org 0ffeh<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">res jp reset ;Vector de RESET <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.end<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">; ***************************************************************</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">; ** ****** ****** Control de Semaforo
|
|
para ST­6 ****** ****** **</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">; ***************************************************************
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">; Semaforo para ST6215 <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">; Por José Ignacio Diaz Beamud
|
|
& Jesús Antonio Alquezar</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;*****************************************************************************
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.input "st62.asm" ;Define registros
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.W_ON ;Abilita el trabajo con RDW<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">num .def 084h,0ffh,0ffh ;Define num como
|
|
posición 84h de datos<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;*****************************************************
|
|
Tabla de datos **<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.org 800h<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">datos .byte 00110001b,00101111b,00110001b,0fh,00110001b,00101111b</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.byte 00110001b,0fh,01010001b,00101111b,10010010b,11001111b</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.byte 10010010b,11011111b,10010010b,11001111b
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.byte 10010010b,11011111b,10010010b,11001111b,10010010b,11011111b</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.byte 10010010b,11001111b,10010010b,11011111b,10010010b,11001111b</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.byte 10000100b,11001111b,10000100b,01001111b,10000100b,11001111b</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.byte 10000100b,01001111b,10000100b,11001111b,10001001b,01001111b
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">tempo .byte 7,1,1,1,1,1,1,1,1,1,1,1,1,1,7,1,1,1,1,1
|
|
<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;****************************** Rutina
|
|
de inicio y programacion de puertos **<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reset ldi wdr,0feh ;Carga el wathchdog
|
|
con su valor máximo </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reti ;Retorna al modo normal despues
|
|
del reset</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi ior,10h ;Desabilita todas las interrupciones</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi rdw,datos.w ;Pone en el RDW el valor
|
|
apropiado</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi ddrpa,0ffh ;Programa el puerto A
|
|
como salida y saca 00</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi orpa,0ffh</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi drpa,00</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi ddrpb,0f0h ;Programa el puerto B
|
|
como salida y las lineas de</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi orpb, 0f0h ;interruptores quedan
|
|
en alta impedancia</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi drpb, 00fh<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;**************************************
|
|
Programa principal ******************<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">s2 ldi num,20 ;Carga en la posicion num
|
|
el numero de estados</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi x,datos.d ;Carga en X el valor apropiado
|
|
de puntero</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi y,tempo.d ;Carga en Y el valor apropiado
|
|
de puntero</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">s1 ld a,(x) ;Carga lo que hay en la posicion
|
|
apuntada por X en A</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld drpa,a ;y lo lleva al puerto A de
|
|
datos</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inc x ;Incrementa el puntero X</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld a,(x) ;y lleva el siguiente dato al
|
|
acumulador</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld drpb,a ;para llevarlo al puerto B
|
|
de datos (hay que tener</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;cuidado ya que los 4 bits menos significativos
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;tienen que estar a 1 para mantener el
|
|
estado de </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;alta impedancia de esas lineas)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld a,(y) ;Carga en A el tiempo a temporizar</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">call temp ;Y llama a subrutina de temporización</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inc x ;Incrementa puntero X</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inc y ;Incrementa puntero Y</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">dec num ;Decrementa el número
|
|
de estados</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrnz s1 ;Si no es 0 repite el bucle</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jp s2 ;Si es 0 comienza de nuevo<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;**********************************************
|
|
Subrutina temporizador ******<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">temp jrnz inic</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jp fin</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inic ldi v,0ach</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal2 ldi w,0ffh</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">sal1 ldi wdr,0feh ;Recarga el WATCHDOG
|
|
para que no llege a ser 0</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">nop ;y se produzca un reset</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">nop</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">dec w</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrnz sal1</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">dec v </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrnz sal2</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">dec a</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrz fin</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jp temp</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">fin ret<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;*********************** Subrutina atención
|
|
a NMI(estado avería)****<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inmi ldi ior,00</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi wdr,0feh</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi rdw,datos2.w<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">is2 ldi num,2 ;Carga en la posicion num
|
|
el numero de estados</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi x,datos2.d ;Carga en X el valor apropiado
|
|
de puntero</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ldi y,tempo2.d ;Carga en Y el valor apropiado
|
|
de puntero<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">is1 ld a,(x) ;Carga lo que hay en la
|
|
posicion apuntada por X en A</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld drpa,a ;y lo lleva al puerto A de
|
|
datos</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inc x ;Incrementa el puntero X</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld a,(x) ;y lleva el siguiente dato al
|
|
acumulador</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld drpb,a ;para llevarlo al puerto B
|
|
de datos (hay que tener</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;cuidado ya que los 4 bits menos significativos
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;tienen que estar a 1 para mantener el
|
|
estado de </FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;alta impedancia de esas lineas)</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">ld a,(y) ;Carga en A el tiempo a temporizar</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">call temp ;Y llama a subrutina de temporización</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inc x ;Incrementa puntero X</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">inc y ;Incrementa puntero Y</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">dec num ;Decrementa el número
|
|
de estados</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jrnz is1 ;Si no es 0 repite el bucle</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">jp is2 ;Si es 0 comienza de nuevo<BR>
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">datos2 .byte 01001000b,10101111b,0,10111111b</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">tempo2 .byte 1,1<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">;***** VECTORES ****************************************************
|
|
<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.org 0ff0h<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">adc nop ;Vector conv. A/D</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reti</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">timer nop ;Vector del timer</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reti</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">int2 nop ;Vector de PB y PC</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reti</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">int1 nop ;Vector de PA</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">reti<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.org 0ffch<BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">nmi jp inmi ;Vector de NMI</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">res jp reset ;Vector de RESET <BR>
|
|
</FONT></TT>
|
|
<P>
|
|
<TT><FONT FACE="Courier">.end</FONT></TT>
|
|
<HR>
|
|
<P>
|
|
<CENTER><FONT SIZE=1>pagina finalizada 27/3/1997</FONT></CENTER>
|
|
<CENTER><EMBED SRC="st6.mid" WIDTH=140 HEIGHT=60 AUTOSTART="true" LOOP="infinite"></EMBED>
|
|
</BODY>
|
|
</HTML>
|