Paso 5: Software
Para obtener el Taylor de Darrel (DT) interrupciones configurar allí son dos cosas que hacer:
1.) incluye el DT_INTS-14.bas y ReEnterPBP.bas archivos en el código.
2.) copia y pega esto en tu código.
ASM
¿Macro INT_LIST, IntSource, etiqueta, tipo, ResetFlag?
INT_Handler RBC_INT, sí _ISR, PBP,
endm
INT_CREATE
ENDASM
Inserte las lengüetas y espacios como el gráfico al final del Instructable para que pueda ver las cosas un poco más fácil en el código. Necesitará modificar ligeramente para ajustarse a sus necesidades. Bajo etiqueta, reemplazar el ISR con el nombre de la subrutina que es el ISR No se olvide el carácter de subrayado. Lo necesite!
Para obtener las interrupciones de trabajo, hay dos cosas más que hacer:
1.) escribir el ISR. A escribir esto igual se va a escribir una subrutina PBP excepto que usted necesitará insertar @ INT_RETURN al final de la subrutina en lugar de retorno. Esto se reconoce la interrupción y ejecución del programa donde se quedó en el bucle principal.
Dentro de la ISR, es necesario borrar la bandera de interrupción por lo que el programa no consigue cogido en una interrupción de la recurrente. Simplemente leer PORTB es todo lo que necesita hacer para borrar la bandera de interrupción en el PIC16F877A. Cada microcontrolador diferente tiene una forma diferente de compensación banderas de interrupción. Revise la hoja de datos para el microcontrolador.
2.) al llegar el punto en el código que desea habilitar la interrupción, utilizar esta línea de código:
RBC_INT @ INT_ENABLE
Si desea deshabilitar la interrupción simplemente use:
RBC_INT @ INT_DISABLE
Hay un montón de cosas en lo apenas cubiertas por lo que te resumo rápidamente. Hasta ahora, el programa debería ser algo como esto:
; Es necesario establecer o código
INCLUYEN "DT_INTS-14.bas"
INCLUYEN "ReEnterPBP.bas"
ASM
¿Macro INT_LIST, IntSource, etiqueta, tipo, ResetFlag?
INT_Handler RBC_INT, _myISR, PBP, sí
endm
INT_CREATE
ENDASM
; Cualquier otro establecido o código
RBC_INT @ INT_ENABLE
; Código que necesita saber de que manera está girando la perilla de
RBC_INT @ INT_DISABLE
; Otro código
FINAL; Fin del programa
myISR:
Aquí el código ISR
@ INT_RETURN
(Conjunto de controlador de interrupción hasta la mesa)
Creo que aquí es donde cualquier persona que no está usando un PIC o interrupciones de DT pueden unirse otra vez. Ahora, tenemos que escribir realmente el ISR para que el microcontrolador sepa qué sentido está girando la perilla. Recordemos de la sección de teoría de software que podemos deducir el sentido de giro, si sabemos que la entrada que provocó la interrupción, su nuevo valor y el valor de la otra entrada. Este es el pseudocódigo:
Leer PORTB en una variable cero para borrar la bandera de interrupción
Compruebe si A causa de la interrupción.
Si es cierto,
Comparar A y B.
Compruebe si es diferente, si es diferente,
Fue girando
Otra cosa,
Fue hacia la izquierda
Endif
Comprobar si B causó la interrupción.
Si es cierto,
Comparar A y B
Compruebe si es diferente, a si mismo,
Fue girando
Otra cosa,
Fue hacia la izquierda
Endif
Retorno de interrupción
¿Cómo sabemos si un cambio en el A o B causó la interrupción? Es fácil descubrir el nuevo valor de la entrada cambiante y la otra entrada (sin cambios) porque podemos leer dentro de la ISR Necesitamos saber lo que el estado de cada uno fue antes de ejecución se envía a la ISR Esto sucede en la rutina principal. La rutina principal se sienta y espera a que una variable byte que llamamos CWflag se establece en 1 o a 0 por el ISR Después de que cada uno reconoce el cambio de la perilla o si no hay actividad de mando, la variable se establece en 5 para indicar el estado de inactividad. Si la bandera se ajuste o se borra, la rutina principal inmediatamente incrementa o disminuye la presión del punto de ajuste apropiadamente basada en la rotación y luego establece la variable CWflag de nuevo a 5 porque la perilla está ahora inactivo otra vez. Como la rutina principal es marcando el CWflag, también está documentando el estado de los valores A y B del conmutador. Esto es muy simple y se ve así:
oldA = A
oldB = B
Realmente no hay nada super lujo aquí. Sólo son esas dos líneas al principio del bucle que comprueba el CWflag para la rotación. Nosotros sólo estamos actualizando los valores de la lógica de las entradas de mando dentro del bucle de incremento/decremento en la rutina principal para que podamos ver qué entrada causó la interrupción cuando se ejecuta el ISR. Aquí está el código ISR:
ABchange:
cero = PORTB ' leer PORTB para borrar bandera de interrupción
' Si A causa de la interrupción, busque B dirección de la rotación
OldA IF! = A entonces
' Si A y B son diferentes, fue girando
IF A! = B ENTONCES
GOTO CW
' Era de otra manera, rotación en sentido antihorario
OTRA COSA
GOTO CCW
ENDIF
ENDIF
' Si B causa la interrupción, busque A dirección de la rotación
OldB IF! = B entonces
' Si A y B son iguales, era giro a la derecha
IF A == B ENTONCES
GOTO CW
' De lo contrario, fue girando contador
OTRA COSA
GOTO CCW
ENDIF
ENDIF
CW:
CWflag = 1
@ INT_RETURN
CCW:
CWflag = 0
@ INT_RETURN
He incluido el código ISR en un archivo de AB_ISR.bas porque las lengüetas en el código no están mostrando el camino que deben.
Ahora, porque el ISR tiene los viejos valores para las entradas A y B puede determinar que causó la interrupción de la entrada, compararla con la otra entrada (sin cambios) y determinar la dirección de la rotación. Todos la rutina principal tiene que ver es comprobar el CWflag para ver que dirección la perilla se ha convertido (si tiene) y el incremento o decremento de un punto de set, contador o lo que le gusta o necesita.
Espero que esto ayuda y no ha sido demasiado confusa. Este tipo de interfaz es especialmente útil si su sistema ya está utilizando interrupciones ya que esta es sólo una interrupción más para agregar. ¡ Disfrute!