5 votos

PORTB Interrupción En el Cambio de los cambios de estado involuntariamente

Estoy ejecutando a continuación el código en un PIC16F887 que funciona a 20 MHz. Me alimento PORTB.0 una señal de 1 KHz de mi generador de señal. Sin embargo, cuando la señal es baja, PORTC.1 cambia a una velocidad de ~5usec o ~10usec. También, he conectado un OP-AMP de salida que da 0V-4V, que sigue siendo el mismo.

He intentado habilitar débil pull ups en el interior, no funciona.

El microcontrolador es en un EasyPIC5 desarrollo de la junta, así que puede activar y desactivar cualquiera de pull-up o pull-down de resistencias que son de 10K. No funciona, tampoco.

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

Aquí está una captura de pantalla del osciloscopio que las sondas PORTC.1:

enter image description here

enter image description here

Aquí está mi código, por favor omite el off-topic parte de ella:

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)
     {
     }
}

8voto

Shog9 Puntos 315

Usted necesita leer PORTB antes de borrar la RBIF bandera en el interior de interrupción(), de lo contrario la falta de coincidencia seguirá existiendo y la RBIF bandera no se borrarán. Véase la sección 3.4.3 INTERRUPCIÓN-EN-el CAMBIO en la hoja de datos del PIC:

Para habilitada la interrupción en el cambio de pines, el valor actual se compara con el valor antiguo enclavada en la última lectura de PORTB para determinar qué elementos han cambiado o que no coincide el valor antiguo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X