PORTB Interrupción en los cambios cambia el estado de forma involuntaria

5

Estoy ejecutando debajo del código en un PIC16F887 que se ejecuta a 20 MHz. Alimino a PORTB.0 una señal de 1 KHz desde mi generador de señales. Sin embargo, cuando la señal es baja, PORTC.1 cambia a una velocidad de ~ 5usec o ~ 10usec. Además, he conectado una salida de OP-AMP que da 0V-4V, igual.

He intentado habilitar pull ups débiles en el interior, no funcionó.

El microcontrolador está en una EasyPIC5 , así que habilite y deshabilite las resistencias de pull-up o pull-down que son 10K. Tampoco funcionó.

¿Se trata de algún tipo de problema de silicio (?) o hay un error en mi código?

Aquí hay una captura de pantalla del osciloscopio que sondea PORTC.1 :

Aquí está mi código, omita parte del tema fuera de él:

volatile unsigned int fiftymicros=0;
volatile unsigned int milis=0;
volatile unsigned char fiftymicroscounter=0;
volatile unsigned int data_time=0;
volatile unsigned int milis_ctr=0;
unsigned long int data_bar[20]={0};
void interrupt()
{
     if(INTCON.T0IF)
     {
      TMR0=198;
      INTCON.T0IF=0;
      fiftymicros++;
      if(++fiftymicroscounter==40) { fiftymicroscounter=0; milis++; }
     }
     if(INTCON.RBIF)
     {
      PORTC.F1=~PORTC.F1;
      INTCON.RBIF=0;
     }
}
void main()
{
     ANSEL =0;
     ANSELH=0;
     TRISA=0; PORTA=0;
     TRISB=0x01; PORTB=0;
     TRISC=0; PORTC=0;
     TRISD=0; PORTD=0;
     TRISE=0; PORTE=0;
     OPTION_REG.INTEDG=1;
     OPTION_REG.T0CS=0;
     OPTION_REG.PSA=0;
     OPTION_REG.PS0=1;
     OPTION_REG.PS1=0;
     OPTION_REG.PS2=0;
     //OPTION_REG.B7=0;
     //WPUB=0x80;
     INTCON.TMR0IE=0;
     INTCON.RBIE=1;
     IOCB.B0=1;
     INTCON.GIE=1;
     UART1_Init(9600);
     Delay_ms(100);
     milis_ctr=milis;
     while(1)
     {
     }
}
    

1 respuesta

5

Debe leer PORTB antes de borrar el indicador RBIF dentro de interrupt (), de lo contrario, la discrepancia seguirá existiendo y el indicador RBIF no se borrará. Consulte la sección 3.4.3 INTERRUPCIÓN DE CAMBIO en la hoja de datos del PIC:

  

Para los pines de interrupción en cambio habilitados, se compara el valor presente   con el valor anterior bloqueado en la última lectura de PORTB para determinar   qué bits han cambiado o no coinciden con el valor anterior.

    
respondido por el user3812

Lea otras preguntas en las etiquetas