Estoy tratando de implementar la interrupción de los pines RB. Pero no funciona

0

Soy nuevo en la programación PIC. Hice un programa para obtener interrupción de los pines RB. pero no funciona Mi código es el siguiente:

int flag=0;
unsigned short temp = 0;

void interrupt(void)
{   
    if(flag==2)
    flag=0 ;
    else
    flag++;   

    if (INTCON.RBIF==1)
    {
        flag=9;
        temp = PORTB;
        PORTB = temp;
        INTCON.RBIF = 0;
    }

    INTCON.INTF = 0;
}

int i,j,k,mina,minb,seca,secb,hra,hrb;
void main()
{
    IOCB=1111110;
    TRISA=0  ;
    TRISC=0  ;
    PORTB=0;
    ADCON0=0;
    TRISB=1;
    ANSELB=0;
    INTCON=1;
    INTCON.RBIE=1;
    INTCON.RBIE = 1;

    INTCON.RBIF = 0;

    INTCON.GIE = 1;
    INTCON.INTE = 1;
    INTCON.PEIE = 0;
    OPTION_REG.INTEDG = 1;
    while(1)
    {
        for(i=0;i<59;i++)
        for(j=0;j<59;j++)
        for(k=0;k<59;k++)
        {
            seca=k/10;
            secb=k%10;
            mina=j/10;
            minb=j%10;
            hra=i/10;
            hrb=i%10;

            if(flag==0)
            {
                PORTA=mask(seca);
                PORTC=mask(secb);
            }
            else if(flag==1)
            {
                PORTA=mask(mina);
                PORTC=mask(minb);
            }
            else if(flag==2)
            {
                PORTA=mask(hra);
                PORTC=mask(hrb);
            }

            Delay_ms(100);
        }
    }
}

Todas las demás secciones funcionan, RB0 int también funciona ... Pero el botón de otras entradas (RB4..RB7) no funciona. El MCU que estoy usando es PIC16F722A.

    
pregunta Habeeb Rahman

3 respuestas

1

En tu ISR tienes esto:

    flag=9;
    temp = PORTB;
    PORTB = temp;

En primer lugar, establece la bandera en 9, pero solo está mirando si es 0, 1 o 2 en su bucle principal. Así que eso nunca va a tener ningún efecto.

Y en segundo lugar, ¿por qué lees el puerto B y luego escribes el valor directamente al puerto B? ¿Qué esperas lograr allí?

Además, no sé qué compilador está utilizando, pero en la mayoría de los compiladores existe el requisito de que todas las variables globales que se usan en ISR se marquen como "volátiles" o el compilador puede optimizarlas.

    
respondido por el Majenko
1

Tienes TRISB = 1; pero se debe establecer en 1 para cada bit de entrada. Si está utilizando todos los pines RB como entradas, TRISB = 0b11111111; si su compilador admite 0b para binario, o 0xFF para hexadecimal, que siempre es compatible.

También tienes IOCB = 1111110; que presumiblemente significa estar en un formato de número binario, los bits de IOCB deben ser 1 por cada pin RB que desea habilitar la interrupción en el cambio. Debería ser IOCB = 0b11111111 si desea que todos los pines RB se interrumpan al cambiar las entradas.

Los números sin un cero inicial se toman como decimales a menos que tenga un prefijo como 0b o 0x. Tenga en cuenta que un cero inicial en una constante significa que es octal (base 8).

    
respondido por el Martin
0

No he usado tu compilador en particular antes, pero lo que sospecho es que el problema es que no has especificado que tu controlador isr sea realmente tu controlador isr para tus interrupciones de RB.

Usaré Mirochips XC16 como ejemplo, ya que es lo que tengo a mano en este momento.

En uno de los encabezados proporcionados (interrupts.h específicamente), me da un resumen básico de las funciones.

/******************************************************************************/
/* Interrupt Vector Options                                                   */
/******************************************************************************/
/*                                                                            */
/* Refer to the C30 (MPLAB C Compiler for PIC24F MCUs and dsPIC33F DSCs) User */
/* Guide for an up to date list of the available interrupt options.           */
/* Alternately these names can be pulled from the device linker scripts.      */
/*                                                                            */
/* PIC24F Primary Interrupt Vector Names:                                     */
/*                                                                            */
/* _INT0Interrupt      _IC4Interrupt                                          */
/* _IC1Interrupt       _IC5Interrupt                                          */
/* _OC1Interrupt       _IC6Interrupt                                          */
/* _T1Interrupt        _OC5Interrupt                                          */
/* _Interrupt4         _OC6Interrupt                                          */
/* _IC2Interrupt       _OC7Interrupt                                          */
/* _OC2Interrupt       _OC8Interrupt                                          */
/* _T2Interrupt        _PMPInterrupt                                          */
/* _T3Interrupt        _SI2C2Interrupt                                        */
/* _SPI1ErrInterrupt   _MI2C2Interrupt                                        */
/* _SPI1Interrupt      _INT3Interrupt                                         */
/* _U1RXInterrupt      _INT4Interrupt                                         */
/* _U1TXInterrupt      _RTCCInterrupt                                         */
/* _ADC1Interrupt      _U1ErrInterrupt                                        */
/* _SI2C1Interrupt     _U2ErrInterrupt                                        */
/* _MI2C1Interrupt     _CRCInterrupt                                          */
/* _CompInterrupt      _LVDInterrupt                                          */
/* _CNInterrupt        _CTMUInterrupt                                         */
/* _INT1Interrupt      _U3ErrInterrupt                                        */
/* _IC7Interrupt       _U3RXInterrupt                                         */
/* _IC8Interrupt       _U3TXInterrupt                                         */
/* _OC3Interrupt       _SI2C3Interrupt                                        */
/* _OC4Interrupt       _MI2C3Interrupt                                        */
/* _T4Interrupt        _U4ErrInterrupt                                        */
/* _T5Interrupt        _U4RXInterrupt                                         */
/* _INT2Interrupt      _U4TXInterrupt                                         */
/* _U2RXInterrupt      _SPI3ErrInterrupt                                      */
/* _U2TXInterrupt      _SPI3Interrupt                                         */
/* _SPI2ErrInterrupt   _OC9Interrupt                                          */
/* _SPI2Interrupt      _IC9Interrupt                                          */
/* _IC3Interrupt                                                              */
/*                                                                            */
/* PIC24H Primary Interrupt Vector Names:                                     */
/*                                                                            */
/* _INT0Interrupt      _SPI2Interrupt                                         */
/* _IC1Interrupt       _C1RxRdyInterrupt                                      */
/* _OC1Interrupt       _C1Interrupt                                           */
/* _T1Interrupt        _DMA3Interrupt                                         */
/* _DMA0Interrupt      _IC3Interrupt                                          */
/* _IC2Interrupt       _IC4Interrupt                                          */
/* _OC2Interrupt       _IC5Interrupt                                          */
/* _T2Interrupt        _IC6Interrupt                                          */
/* _T3Interrupt        _OC5Interrupt                                          */
/* _SPI1ErrInterrupt   _OC6Interrupt                                          */
/* _SPI1Interrupt      _OC7Interrupt                                          */
/* _U1RXInterrupt      _OC8Interrupt                                          */
/* _U1TXInterrupt      _DMA4Interrupt                                         */
/* _ADC1Interrupt      _T6Interrupt                                           */
/* _DMA1Interrupt      _T7Interrupt                                           */
/* _SI2C1Interrupt     _SI2C2Interrupt                                        */
/* _MI2C1Interrupt     _MI2C2Interrupt                                        */
/* _CNInterrupt        _T8Interrupt                                           */
/* _INT1Interrupt      _T9Interrupt                                           */
/* _ADC2Interrupt      _INT3Interrupt                                         */
/* _IC7Interrupt       _INT4Interrupt                                         */
/* _IC8Interrupt       _C2RxRdyInterrupt                                      */
/* _DMA2Interrupt      _C2Interrupt                                           */
/* _OC3Interrupt       _DCIErrInterrupt                                       */
/* _OC4Interrupt       _DCIInterrupt                                          */
/* _T4Interrupt        _U1ErrInterrupt                                        */
/* _T5Interrupt        _U2ErrInterrupt                                        */
/* _INT2Interrupt      _DMA6Interrupt                                         */
/* _U2RXInterrupt      _DMA7Interrupt                                         */
/* _U2TXInterrupt      _C1TxReqInterrupt                                      */
/* _SPI2ErrInterrupt   _C2TxReqInterrupt                                      */
/*                                                                            */
/* PIC24E Primary Interrupt Vector Names:                                     */
/*                                                                            */
/* __INT0Interrupt     __C1RxRdyInterrupt      __U3TXInterrupt                */
/* __IC1Interrupt      __C1Interrupt           __USB1Interrupt                */
/* __OC1Interrupt      __DMA3Interrupt         __U4ErrInterrupt               */
/* __T1Interrupt       __IC3Interrupt          __U4RXInterrupt                */
/* __DMA0Interrupt     __IC4Interrupt          __U4TXInterrupt                */
/* __IC2Interrupt      __IC5Interrupt          __SPI3ErrInterrupt             */
/* __OC2Interrupt      __IC6Interrupt          __SPI3Interrupt                */
/* __T2Interrupt       __OC5Interrupt          __OC9Interrupt                 */
/* __T3Interrupt       __OC6Interrupt          __IC9Interrupt                 */
/* __SPI1ErrInterrupt  __OC7Interrupt          __DMA8Interrupt                */
/* __SPI1Interrupt     __OC8Interrupt          __DMA9Interrupt                */
/* __U1RXInterrupt     __PMPInterrupt          __DMA10Interrupt               */
/* __U1TXInterrupt     __DMA4Interrupt         __DMA11Interrupt               */
/* __AD1Interrupt      __T6Interrupt           __SPI4ErrInterrupt             */
/* __DMA1Interrupt     __T7Interrupt           __SPI4Interrupt                */
/* __NVMInterrupt      __SI2C2Interrupt        __OC10Interrupt                */
/* __SI2C1Interrupt    __MI2C2Interrupt        __IC10Interrupt                */
/* __MI2C1Interrupt    __T8Interrupt           __OC11Interrupt                */
/* __CM1Interrupt      __T9Interrupt           __IC11Interrupt                */
/* __CNInterrupt       __INT3Interrupt         __OC12Interrupt                */
/* __INT1Interrupt     __INT4Interrupt         __IC12Interrupt                */
/* __AD2Interrupt      __C2RxRdyInterrupt      __DMA12Interrupt               */
/* __IC7Interrupt      __C2Interrupt           __DMA13Interrupt               */
/* __IC8Interrupt      __DMA5Interrupt         __DMA14Interrupt               */
/* __DMA2Interrupt     __RTCCInterrupt         __OC13Interrupt                */
/* __OC3Interrupt      __U1ErrInterrupt        __IC13Interrupt                */
/* __OC4Interrupt      __U2ErrInterrupt        __OC14Interrupt                */
/* __T4Interrupt       __CRCInterrupt          __IC14Interrupt                */
/* __T5Interrupt       __DMA6Interrupt         __OC15Interrupt                */
/* __INT2Interrupt     __DMA7Interrupt         __IC15Interrupt                */
/* __U2RXInterrupt     __C1TxReqInterrupt      __OC16Interrupt                */
/* __U2TXInterrupt     __C2TxReqInterrupt      __IC16Interrupt                */
/* __SPI2ErrInterrupt  __U3ErrInterrupt        __ICDInterrupt                 */
/* __SPI2Interrupt     __U3RXInterrupt                                        */
/*                                                                            */
/*                                                                            */
/* For alternate interrupt vector naming, simply add 'Alt' between the prim.  */
/* interrupt vector name '_' and the first character of the primary interrupt */
/* vector name.  There are no Alternate or 'Alt' vectors for the 24E family.  */
/*                                                                            */
/* For example, the vector name _ADC2Interrupt becomes _AltADC2Interrupt in   */
/* the alternate vector table.                                                */
/*                                                                            */
/* Example Syntax:                                                            */
/*                                                                            */
/* void __attribute__((interrupt,auto_psv)) <Vector Name>(void)               */
/* {                                                                          */
/*     <Clear Interrupt Flag>                                                 */
/* }                                                                          */
/*                                                                            */
/* For more comprehensive interrupt examples refer to the C30 (MPLAB C        */
/* Compiler for PIC24 MCUs and dsPIC DSCs) User Guide in the                  */
/* <compiler installation directory>/doc directory for the latest compiler    */
/* release.                                                                   */
/*                                                                            */
/******************************************************************************/
/* Interrupt Routines                                                         */
/******************************************************************************/

Fíjate en lo último -

 /*  Example Syntax:                                                            */
                                                                                */
     void __attribute__((interrupt,auto_psv)) <Vector Name>(void)               */
     {                                                                          */
         <Clear Interrupt Flag>                                                 */
     }      

Entonces, si quisiera usar mi ISR Timer2 (asumiendo que lo haya configurado todos los registros necesarios), tendría algo como lo siguiente

void __attribute__((__interrupt__, __auto_psv__)) _T2Interrupt(void)
{

   //do something here
    _T2IF = 0; //clear int flag
}

Creo que lo que estás detectando es el enlace para cuando ocurre una interrupción en el lugar donde se supone que debe ir tu código, ya que las interrupciones son vectoriales y cada interrupción o un grupo de interrupciones comparten una dirección similar.

Revise sus archivos de encabezado, puede encontrar algo allí.

También, una búsqueda rápida en Google del ejemplo de interrupción de MicroC ha creado el siguiente enlace

enlace

    
respondido por el efox29

Lea otras preguntas en las etiquetas