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