rb4: rb7 en cambio de interrupción

0

Estoy usando una foto 6f628a y quiero usar la interrupción "en cambio" en los pines RB4: RB7 También quiero usar dos interrupciones diferentes en los pines RB4 y amp; RB5, por lo tanto, cuando cualquiera de los pines tenga un cambio válido, la bandera se establecerá > > > Mi problema es cómo diferenciar entre las dos interrupciones provenientes de RB4 y RB5. Quiero verificar la bandera de RB4 o RB5 pero no sé cómo escribir esta línea del código.

    
pregunta omar elsebaey

2 respuestas

1

Usted verificará el estado de los pines PORTB que le interesan. También puede almacenar su estado en una variable global para comparar la próxima vez, esto le permitirá determinar qué pines han cambiado. Aquí hay una muestra de cómo podría ser su CN ISR:

void __attribute__((interrupt,auto_psv)) _CNInterrupt(void)
{
    unsigned char ChangeVector;

    IFS1bits.CNIF = 0;  //clear interrupt flag

    ChangeVector = (PORTB&0xf0)^LastPortB;  //bit vector of changed pins of interest
    LastPortB = PORTB&0xf0; //store value of PORTB pins of interest for the next ISR

    if (ChangeVector&0x10)  // routine for RB4
    {<do stuff here>}
    if (ChangeVector&0x20)  // routine for RB5
    {<do stuff here>}
    <...repeat for other pins>
}
    
respondido por el kjgregory
0

Ese PIC tiene un solo indicador de interrupción para la funcionalidad de interrupción en cambio. No registra qué pin se cambió.

Entonces, suponiendo que su rutina de servicio de interrupción se maneje antes de que los pines vuelvan a su estado inactivo, haría lo siguiente en el ISR:

(perdone el pseudocódigo, por el momento no estoy en mi computadora)

  1. ¿Se ha establecido el indicador de interrupción al cambiar?
  2. Si es así, lea el estado actual del registro PORTB en una variable.
  3. Ahora, evalúa la variable para ver qué pin ha cambiado.
  4. Borrar la bandera de interrupción.
respondido por el bitsmack

Lea otras preguntas en las etiquetas