MCU que pueden desencadenar una interrupción en una máscara de puerto

3

(Pasatiempo y aprendizaje, no una pregunta profesional).

Estoy diseñando un circuito que usa un CPLD para convertir media docena de entradas en una sola salida que activa una interrupción en un microcontrolador.

¿Hay algún microcontrolador donde una combinación de entradas (en un puerto) pueda provocar una interrupción? (Principalmente interesado en Cortex M0 / 3/4, pero considerará otros.)

por ejemplo Tenga una interrupción activada solo cuando el puerto A coincida con ?1110?01 . 11110001 causaría una interrupción, pero 11110000 no lo haría.

    
pregunta fadedbee

7 respuestas

5

Consulte la LPC800 :

Desde UM10601: "Se pueden seleccionar hasta ocho pines de todos los pines GPIO para contribuir a una expresión booleana. La expresión booleana consiste en niveles y / o transiciones especificados en varias combinaciones de estos pines".

    
respondido por el starblue
5

Nunca he oído hablar de uno así, no.

Normalmente, cada entrada se adjuntará a una interrupción por separado (las interrupciones por cambio de pin a menudo son buenas para eso, siempre y cuando no se trate de velocidades muy altas).

Todas esas interrupciones pueden ejecutar el mismo código ISR, que primero lee el valor del puerto, lo enmascara y lo compara con la máscara. Si coinciden, entonces ejecuta el código deseado, de lo contrario, simplemente vuelve.

Casi cualquier MCU con interrupciones de cambio de pin (o suficientes interrupciones de lo contrario) haría el trabajo.

O eso o usaría la lógica de cola externa (o la lógica de cola interna en esas MCU con bloques lógicos programables, como la serie Cypress PSoC) para combinar las entradas en una sola señal de interrupción.

    
respondido por el Majenko
5

Un problema al hacer coincidir un patrón en una entrada es preguntar cuánto tiempo debe estar presente el patrón antes de ser reconocido. Si el puerto A cambia de 11110000 a 11100001 , ¿hubo algún tiempo durante ese cambio cuando fue 11110001 , por lo que se debe provocar una interrupción? A menos que la fuente y el destino de estas señales sean síncronos, comparten un reloj y transfieren las señales de manera confiable en cada borde del reloj, entonces es difícil definir y verificar cuándo debe reconocerse el patrón.

    
respondido por el emrys57
4

No, pero las interrupciones y los puertos de lectura pueden ser muy rápidos. Establezca una interrupción en el cambio de pin para todos los pines de interés, luego, en la interrupción, borre la bandera, lea el puerto, compárelo, y realice la interrupción si es necesario, y regrese de la interrupción.

Por supuesto, esto requiere que su procesador sea significativamente más rápido que la velocidad del bus en el que está intentando detectar eventos. Si esto se convierte en un problema, puede emplear circuitos externos, o CPLD o FPGA.

Probablemente se podría hacer una buena solución utilizando dispositivos PSOC de Cypress . Los bloques de configuración digital son esencialmente dispositivos lógicos programables, y parece que podría construir el detector necesario en un chip. Es posible que no detecte el ancho completo de su activador deseado, pero reduciría significativamente la cantidad de interrupciones que deben manejarse, lo que puede dar al procesador el tiempo suficiente para procesar todas las interrupciones sin perder ninguna.

    
respondido por el Adam Davis
1

También hay expansores de puertos I2C que permiten agregar pines GPIO a casi cualquier MCU que admita el protocolo I2C. (El protocolo I2C podría ser un bloque de hardware en la MCU o pines IO de bit banged). Muchos expansores de puertos tienen un pin de salida de interrupción que puede conectarse a una entrada de interrupción de la MCU. Dentro de la parte del puerto de expansión hay registros que permiten la selección de qué pines de E / S contribuyen a la entrada de interrupción y los registros de selección de polaridad que seleccionan si los pines contribuyentes causan la interrupción en un nivel de pines alto o bajo.

Estos expansores de puerto están ordenados porque el bus I2C de 2 cables puede ejecutarse y es compatible con el chip expansor cerca de donde se necesitan las E / S en la placa. Se pueden tener expansores de puertos que soportan 4, 8 y 16 pines GPIO. Se pueden acomodar múltiples expansores de puertos en un solo bus I2C.

En algunos escenarios de uso, el acceso para leer los estados de los pines en el momento de la interrupción puede demorar uno o dos milisegundos para acceder a través del bus I2C. Si esto es demasiado largo, considere usar una MCU que tenga el bloque de hardware para admitir el protocolo I2C. También seleccione la MCU y el expansor para admitir las velocidades de reloj I2C mucho más rápidas disponibles en estos días en comparación con las antiguas tasas convencionales de 100 kHz.

    
respondido por el Michael Karas
1

Sondeo para almacenar el historial de Pin

Si la entrada llega en serie y tiene suficientes recursos en el chip para almacenar algo de historia, podría interrumpir en un temporizador, sondear / leer el valor en el pin. Luego, cambie el nuevo valor a un byte (que eliminará el valor más antiguo al mismo tiempo). Ahora realice un AND a nivel de bits con las secuencias de interrupción que desee.

Básicamente, ya no está interrumpiendo los valores presentes en ese pin, sino que los está encuestando en algún intervalo y almacenando los últimos 8 valores. Cuando haya recopilado suficiente historial y coincida con la secuencia que desea, puede disparar su propia interrupción.

    
respondido por el Josh
1

Para la indagación del autobús, sugeriría usar un microcontrolador que, mientras observa el autobús, dedicará toda su energía a esa tarea; Si se necesita algún tipo de respuesta de interrupción mientras se supervisa el bus, use un procesador separado para la supervisión del bus y otras tareas. El procesador de monitoreo de bus probablemente podría actuar como un esclavo SPI mientras está monitoreando el bus, si ninguna de las cosas que se le pide que haga mientras monitorea el bus sería demasiado complicada [por ej. si lo único que el maestro desea que haga es decir si ha ocurrido algún ciclo de bus interesante y, si es así, qué datos se transfirieron entonces]. Tenga en cuenta que es probable que el firmware para el procesador de monitoreo de bus tenga que estar escrito en el código de la máquina y se vea así:

MAIN_LOOP:
    bl   R12                    ; Assume R12 holds address of bus-polling rou
    ldrb r0,[r11,#SPI_REGS_OFS] ; Assume R11 always holds base of SPI peripheral
    and  r0,r0,#SPI_READY_FLAG
    beq  MAIN_LOOP
    bl   R12
    ldrb r4,[r12,#SPI_DATA_REG]
    and  r0,r4,#15
    ldr  pc,[pc,r0,asl,#2]
    nop
    ; Insert table of 15 jump addresses here
    dc.w CMD00_HANDLER, CMD01_HANDLER, CMD02_HANDLER, ... etc.

CMD00_HANDLER:
    bl   R12
    sub  r0,r8,r9 ; Assume R8 and R9 are queue pointers
    strb r0,[r12,#SPI_DATA_REG]
    b    MAIN_LOOP

CMD01_HANDLER:
    bl   R12
    ldrb r0,[r8],#1
    bic  r8,#256 ; Assume queue is located at address of form xxxx0xxxxxxxx.
    strb r0,[r12,#SPI_DATA_REG]
    b    MAIN_LOOP

POLL_BUS:
    ldr  r5,[r10,#PORT_OFS]  ; Assume R10 always holds port base
    and  r0,r5,r7            ; Assume R7 always holds mask
    cmp  r0,r6               ; Assume R0 holds compare value
    addeq r12,#(POLL_BUS2-POLL_BUS)
    b    r14

POLL_BUS2:
    str  r5,[r9],#4
    bic  r9,#256 ; Assume queue is located at address of form xxxx0xxxxxxxx.
    add r12,#(POLL_BUS3-POLL_BUS2)

POLL_BUS3:
    ldr  r0,[r10,#PORT_OFS]  ; Assume R10 always holds port base
    cmp  r5,r6               ; See if anything changed
    addne r12,#(POLL_BUS-POLL_BUS3)
    b    r14

Tenga en cuenta que el código nunca pasa mucho tiempo sin un bl R12 que llama a una de las funciones POLL_BUS, y ninguno de ellos toma mucho tiempo antes de regresar. Mantener todo en registros dedicados permite que el código se ejecute mucho más rápido de lo que sería posible en C. El código anterior se diseñaría para capturar registros de cuatro bytes cada vez que el estado del bus cambie a un patrón particular; una vez que agarre algo, esperará hasta que algo en el puerto (ya sea enmascarado o no) cambie antes de agarrar el siguiente elemento.

    
respondido por el supercat

Lea otras preguntas en las etiquetas