|
TABLA
3-6 Lista de comandos
de
usuario. |
|
|
|
|
Descripción de los
programas
Módulos principales
|
|
|
Inicio:
Inicialización del
sistema.
|
|
|
Instrucción |
Comentario |
Inicio: MOVX
@RST,LOW |
Envía
reset |
CALL Delay_15 |
Espera 1.5
mseg |
CALL Bit_b |
Lectura del
byte
de estado |
SUBB A,#C4h |
ACC-C4h
C4h=1100
010 0 |
JNC Cnt |
Si la
diferencia
es 0, ve a Continua... |
CALL Bit_b |
Lectura del
byte
de estado |
SUBB A,#84h |
ACC-84h
84h=1000
010 0 |
JNC Cnt |
Si la
diferencia
es 0, ve a Continua... |
JMP Inicio |
... si no,
vuelve
a Inicio |
Cnt: CALL Bit_b |
|
MOVX @P0,RSTI |
Envía
clear interrupciones al MPID |
CALL Bit_b |
Lectura del
byte
de estado |
SUBB A,#C0h |
ACC-C0h
C0h=1100
000 0 |
JNC Fin |
Si la
diferencia
es 0, ve a Fin |
CALL Bit_b |
Lectura del
byte
de estado |
SUBB A,#80h |
ACC-80h
80h=1000
000 0 |
JNC Fin |
Si la
diferencia
es 0, ve a Fin ... |
JMP Inicio |
... si no,
vuelve
a inicio |
Fin: RET |
|
|
|
|
Comentarios:
Nótese que en todas las
comparaciones el Bit_busy es 0.
|
|
|
|
|
ESPERA:
Mantener reset al menos 1.5 milisegundos.
|
|
|
Instrucción |
Comentario |
Delay_15 |
|
MOV TL1,#TL1 |
Precarga
inferior
contador |
MOV TH1,#TL1 |
Precarga
superior
contador |
SETB ET1 |
Habilita
interrupción de contador |
SETB PT1 |
Da prioridad
1 |
CALL Bit_b |
Lectura del
byte
de estado |
SETB TR1 |
Comienza la
cuenta |
ORL PCON,1 |
Modo bajo
consumo |
CLR TR1 |
Para contador |
CLR PT1 |
Desactiva
prioridad |
CLR ET1 |
Deshabilita
interrupción |
RET |
|
Fin: RET |
|
|
|
|
Comentarios:
Durante el delay, se pasa a modo IDLE, bajo consumo, porque la
única operación es contar.
Obtención de la precarga.
Precarga = osc (Khz)
* Tiempo espera (msg) / 12
|
|
|
|
|
LECTURA_SB:
Lectura del Byte de estado.
|
|
|
Instrucción |
Comentario |
Bit_b: MOVX @CS,LOW |
|
MOVX @PS,LOW |
Pon a 0 TTL
/CS Y
/PS |
MOVX A,@ P0 |
Lee PUERTO 0 |
JB @B0,Bit_b |
Si B0 es
diferente
de 0, repite |
RET |
MPID no
ocupado |
|
|
|
Comentarios:
La instrucción "hardware" RDSTAT se ejecuta poniendo a 0 TTL
/CS, /PS y /RD, pero en MOVX está implícito /RD a
0 TTL.
Por otro lado, se pasa a Acumulador el byte entero, aunque se usa solo
el Bit_busy, para poder utilizar la información acumulada
posteriormente.
El programa se asegura de que el MPID no está ocupado.
|
|
|
|
|
Flt_pid:
CARGA de COEFICIENTES del
FILTRO PID.
|
|
|
Instrucción |
Comentario |
Flt_pid: CALL
Bit_b |
Lectura byte
de
estado |
MOVX @P0,LFIL |
Envía
comando LFIL al MPID |
CALL Bit_b |
Lectura byte
de
estado |
MOVX @P0,P_c |
Envía
palabra de control al MPID |
CALL C_pid |
Envía
coeficientes al buffer primario |
CALL Bit_b |
Lectura byte
de
estado (OPCIONAL) |
MOVX @P0,UDF |
Actualiza
datos
del filtro (OPCIONAL) |
RET |
|
|
|
|
Comentarios:
La descripción de comandos, coeficientes y palabras de
control
se explican en otro apartado.
Las líneas opcionales se deben a que se puede proceder a la
carga inmediatamente, o mantenerlas guardadas en buffer primario del
MPID para actualizar con UDF con posterioridad, mientras el
µC realiza otra tarea.
|
|
|
|
|
Try:
CARGA de TRAYECTORIA
|
|
|
Instrucción |
Comentario |
Try: CALL Bit_b |
Lectura byte
de
estado |
MOVX @P0,LTRJ |
Envía
comando LTRJ al MPID |
CALL Bit_b |
Lectura byte
de
estado |
MOVX @P0,P_c |
Envía
palabra de control al MPID |
CALL T_try |
Envía
datos de trayectoria al buffer primario |
CALL Bit_b |
Lectura byte
de
estado (OPCIONAL) |
MOVX @P0,STT |
Inicia
trayectoria
(OPCIONAL) |
RET |
|
|
|
|
Comentarios:
Las líneas opcionales, como en el filtro PID, se deben a que
se puede proceder al arranque inmediatamente, o mantener los datos
guardados en buffer primario del MPID para arrancar con STT con
posterioridad, mientras el µC realiza otra tarea.
|
|
|
|
|
T_try:
DATOS de TRAYECTORIA: Decodificación de palabra de control y
envío de datos.
|
|
|
Instrucción |
Comentario |
T_try: JB B5,Bit_3 |
Si bit 5 = 0
salta
a Bit_3 |
CALL Bit_b |
Lectura byte
de
estado |
MOVX @P0,Ac |
Envía
dato de aceleración |
Bit_3: JB B3,Bit_1 |
Si bit 3 = 0
salta
a Bit_1 |
CALL Bit_b |
Lectura byte
de
estado |
MOVX @P0,Vel |
Envía
dato velocidad |
Bit_1: JB B1,Bit_0 |
Si bit 1 = 0
salta
a Bit_0 |
CALL Bit_b |
Lectura byte
de
estado |
MOVX @P0,Pos |
Envía
dato posición |
Bit_0: RET |
|
|
|
|
Comentarios:
Puede no ser enviado ningún dato.
|
|
|
|
|
|
|
IV
Posibles interrupciones del MPID
|
|
|
|
|
|
Solicitud de RDSTAT
|
|
|
Al solicitar un RDSTAT, con
motivo del envió por parte del MPID de una
interrupción, obtenemos la información en el byte
de estado compuesta por 8 bits.
De todos ellos, algunos
son
útiles tan solo en fase de
depuración; otros son informativos y el bit 0 (Busy_bit), se
utiliza como consulta.
A
continuación se
hace una breve descripción de
cada uno, y se evalúa su uso o su enmascaramiento, con MSKI.
Hay que considerar que
el
enmascaramiento afecta a la
generación o no de la interrupción HI, pero la
información se genera en el BYTE en cualquier caso. Salvo el
bit 7 y el 0, todos generan interrupción (HI) y se pueden
limpiar, bit a bit o en grupo, con RSTI.
Todos son activos en lógica 1.
Bit 7: |
Motor
apagado. Se
pone a 1 lógico cuando el motor se apaga. Esto sucede al
enviar un reset, por un excesivo error de posición si se
envió LPES, o si se usa LTRJ en una parada manual.
El comando de arranque STT limpia el bit (lo pone a cero).
No genera interrupción, luego será
sólo consultivo.
Esta información se encuentra también en bit 2.
|
Bit 6: |
Breakpoint
alcanzado. Se pone a 1 lógico al alcanzar una
posición prefijada por SBPA o SBPR.
Se usa en depuración. No lo vamos a considerar y
será enmascarado. |
Bit 5: |
Error de
posición excesivo.
Viene determinado en sus limites por los comandos LPEI o LPES. |
Bit
4: |
Desbordamiento
numérico.
Sucede al excederse la capacidad de posición de datos en los
cálculos en modo velocidad.
La información almacenada será
errónea, y se debe corregir.
La solución será volver a una
situación preestablecida y reiniciar o, si se repitiera,
modificar los datos. |
Bit 3: |
Llegada de
pulso
índice. Se activa si se envió SIP.
Se utiliza en depuración. Será enmascarado. |
Bit 2: |
Trayectoria
completada.
Indica el fin con éxito de los comandos de trayectoria LTRJ,
STT.
Se usará para verificar el fin correcto.
Es la OR de los bits 7 y 10. |
Bit 1: |
Error de
comando.
Cuando se intenta leer datos y procede una escritura o viceversa.
Sólo se usará en depuración. |
Bit 0: |
Ya descrito
en
otros apartados, indica cuándo es o no posible la
comunicación con el MPID, y se usa continuamente.
No genera interrupción. |
Además, mediante el comando
RDSIGS,
obtenemos
información adicional, que no genera
interrupción HI:
Los bits 1 a 7 replican el byte de estado.
El bit 0 se activa al enviar un comando SIP.
Bit 8: |
Modo salida
de 8 o
12 bits.
No es aplicable en nuestro modelo.
|
Bit 9: |
Apagado en
caso de
error de posición excesivo.
Se activa al ejecutar LPES y lo limpia LPEI. Solo útil en
depuración. |
Bit 10: |
Indica
objetivo
cumplido tras enviar STT.
Esta
información
se encuentra en bit 2.
|
Bit
11: |
Modo
velocidad.
Indica esta selección.
No es aplicable en nuestro modelo, porque el control va a ser
automático, resultando un dato inútil. |
Bit 12: |
Forward
Direction.
Solo en modo velocidad. Informativo. |
Bit 13: |
Ejecutado
UDF.
Indica actualización de coeficientes del filtro, sin
ejecución.
Aplicable sólo en depuración. |
Bit 14: |
Aceleración
cargada, pero no ejecutada. Caso similar al bit 13. |
Bit 15: |
"Host
Interrupt".
(HI). Es redundante, en "software" de la señal HI. |
En definitiva, para una
programación normal y ya depurada, solo nos interesa
detectar la información de los bits 2, 4, 5 y
periódicamente el bit 0.
Podemos enmascarar los bits 1, 3, 6 y 7 y prescindir del comando RDSIGS.
Esto nos deja como significativos en el byte de estado:
Trayectoria completada (bit
2),
Desbordamiento (bit 4), Error de posición (bit 5), que
pueden ser leídos bit a bit. Las combinaciones posibles
serán:
MSB |
|
|
|
|
|
|
LSB |
|
7 |
6 |
5
|
4
|
3 |
2
|
1 |
0
|
HEX |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0h |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
4h |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
10h |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
14h |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
20h |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
24h |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
30h |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
34h |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
80h |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
84h |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
90h |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
94h |
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
A0h |
1 |
0 |
1 |
0 |
0 |
1 |
0 |
0 |
A4h |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
0 |
B0h |
1 |
0 |
1 |
1 |
0 |
1 |
0 |
0 |
B4h |
Para
nuestro objetivo es suficiente
considerar el byte de estado, que leemos y pasamos a acumulador con la
subrutina Bit_b.
|
|
|
|
|
|
|
|
V
Decodificación de interrupciones MPID (HI)
|
|
|
Este
módulo verifica y analiza las interrupciones de estado, y
actúa en consecuencia.
Tamaño aproximado 34 bytes.
|
|
|
Instrucción |
Comentario |
I_MPID: CALL Bit_b |
Ejecuta
Busy_bit;
acumulador cargado con puerto 0. |
MOVX @P1,Er_4 |
Envía
al puerto 1 (display) mensaje de error desconocido. |
MOV B,A |
Pasa la
información del acumulador al registro B. |
CALL Bit_b |
|
MOVX @P0,RSTI |
Envía
clear interrupciones al MPID |
MOV A,B |
Carga
acumulador
con registro B (byte de estado) |
JB @B2,E0 |
Si bit 2 es
cero
salta a E1. |
MOVX @P1,Er_1 |
Envía
al puerto 1 (display) mensaje de trayectoria completada. |
RET |
Vuelve a
programa
principal. No hay opción de 4 o 5. |
E1: JB @B4,E2 |
Si bit 4 es
cero,
salta a E2. |
MOVX @P1,Er_2 |
Envía al puerto 1 (display) mensaje de error de
desbordamiento. |
JB
@B5,E2 |
Verifica si esta activado error de
posición. |
JMP Flt_pid |
Si no, salta a cargar datos de nuevo. |
E2: JB @B5,E3 |
Si bit 5 es cero salta a E3. |
MOVX @P1,Er_3 |
Envía al puerto 1 (display)
mensaje de error de posición |
E3: MOVX @RST,
LOW |
Envía reset al MPID |
HALT |
Detén programa; espera RESET
general manual. Reinicio. |
JMP |
Inicio |
|
|
|
Comentarios:
Primero se pasa a registro B la información del byte de
estado, porque el acumulador va a ser usado de nuevo, y queremos antes
que nada limpiar las interrupciones.
Luego se devuelve la información al acumulador para operar y
se envía al display mensaje de error desconocido, que se
modificara solo si aparece otro identificado.
Si la interrupción se produjo por trayectoria completada, se
excluyen las otras y no queda sino retornar a programa principal,
indicando en display la incidencia.
Si se activo por desbordamiento, primero se verifica si se ha activado
también error de posición, lo que resetea el
sistema.
En otro caso se repite la operación de carga de datos y
arranque, reflejando la incidencia en display.
Puede suceder que se repita el error:
Si no se activa otra interrupción al repetir, se trata de la
introducción de datos erróneos en la
grabación del chip o en los cálculos.
Si se activó error de posición o no sabemos
cuál es la causa de la interrupción, se
envía el mensaje al display y en ambos caso se resetea el
MPID.
Si permanece activado el error desconocido, se debe investigar la causa
antes de continuar.
|
|
|
|
|
|
|
VI
Lectura y errores de corrientes máxima y media
|
|
|
Los
siguientes
módulos leen las corrientes máxima y media y
envian el correspondiente código de error, cuando procede.
Lectura de las corrientes
(21 bytes) |
|
|
Instrucción |
Comentario |
Lee_I: MOVX A,@P2 |
Lee
PUERTO 2, Imax y pasa a acumulador (ACC) |
SUBB A,#Imax |
ACC-Imaxima; diferencia
lectura y valor prefijado |
JNB AC,I_med |
Si bit AC en
PSW
es 1 (negativo) I máxima correcta, lee I media |
CALL EI_max |
si es 0
(positivo), llama a error Imaxima. |
I_med: MOVX @ADS,LOW |
escribe 0 en
ADS
(P1.0) para direccionar el A/D en I media |
MOVX A,@P2 |
Lee PUERTO
2, Imed
y pasa a acumulador (ACC) |
SUBB A,#Imed |
ACC-Imedia;
diferencia lectura y valor prefijado |
JNB AC,Fin |
Si bit AC en
PSW
es 1 (negativo) I media correcta, acaba. |
CALL EI_med |
si es 0
(positivo), llama a error Imedia. |
Fin: MOVX @ADS, HIGH |
Escribe
1 en ADS (P1.0) para direccionar el A/D en I max. |
RET |
Retorno a programa principal. |
Errores
Error de corriente máxima
Instrucción |
Comentario |
EI_max: MOVX @RST,LOW |
Envía
reset al MPID |
MOVX @P1,Er_Imx |
Envía
al puerto 1 (display) mensaje de error de I máxima. |
HALT |
Detén
programa; espera RESET general manual. Reinicio. |
JMP |
Inicio |
Error de corriente media
Instrucción |
Comentario |
EI_med: MOVX @RST,LOW |
Envía
reset al MPID |
MOVX @P1,Er_Imd |
Envía
al puerto 1 (display) mensaje de error de I media. |
HALT |
Detén
programa; espera RESET general manual. Reinicio. |
JMP |
Inicio |
|
|
|
Comentarios:
Preseleccionado por "hardware" el convertidor A/D en lectura de I
máxima, se toma la lectura y se compara con la grabada en la
posición Imax.
Se consulta el bit AC de la palabra de estado (PWS) para ver si la
bandera de acarreo indica positivo, lo que significaría que
la lectura es mayor que la prefijada y por tanto esta fuera de
tolerancia.
En este caso, se envía el programa a secuencia de
error de Imaxima.
Si el acarreo es negativo, I máxima correcta, se
selecciona en A/D la salida de Imedia y se procede igual que en el caso
anterior.
Si ambas son correctas, se vuelve a seleccionar A/D en I
máxima para siguiente lectura, y se vuelve a programa
principal.
|
Comentarios:
En ambos casos, se resetea el MPID, se envía el mensaje de
error correspondiente al display y se detiene el programa, para
reiniciar con RESET general manual cuando el operador lo estime.
Con reset el programa se reiniciará en la
posición Inicio; la última línea es
una precaución.
|
|
|
|
|
|
|
|
|
VIII
Consideraciones finales
|
|
|
Consideraciones
sobre el volumen de software necesario y su
soporte físico, hardware.
|
|
|
El programa
ocupa unos 220 bytes,
250
aportando espacios de seguridad, e incluyendo
los códigos de error del display, es decir 2 kbs, y la
memoria
dispone de 16 kbs, lo que supone 14
Kbs libres.
El MPID necesita como máximo 9 bytes en cada trayectoria
mas
2
bytes para las corrientes estimadas por trayectoria, espaciando, 15
bytes, se pueden programar datos para unas 100 trayectorias,
añadiendo un programa que las lea secuencialmente, y tras la
depuración de datos y coeficientes de cada una.
Con /EA a
nivel alto, el procesador ejecuta instrucciones desde la EPROM
interna hasta
4096 (4Kbytes), y las superiores a externa, por si
fuera necesario ampliar el volumen de la memoria con un soporte
externo, o bien derivar datos del historial del funcionamiento en
periodos de tiempo programados.
|
|
|
|
|
|
|
|
|
|