Interrupciones en XC8

Veo varios errores.
El primero en la selección del oscilador. #pragma config FOSC = EXTRC es para un oscilador externo RC
Si usas un cristal de 4 MHz. el fuse debería ser XT
El segundo es que estás configurando todo el puerto B como salidas con TRISB = 0;
Si usas la interrupción por RB0, entonces debería ser entrada. TRISB = 0b00000001; o TRISB = 1;
Habría que definir el flanco de interrupción si es que es necesario. (Ver hoja de datos)
El tercero está en el esquema. Los pines de entrada están flotando, o sea, no tienen una referencia lógica.

Lo demás, como esto, es redundante:
C:
    OPTION_REG=0b11100111;
    OPTION_REGbits.T0CS=0;
    OPTION_REGbits.INTEDG =1;
No usas las librerías stdio.h ni stdlib.h pero las tienes incluidas.
Y el servicio de interrupciones no tiene una estructura adecuada.

PD:
Esto debe generar un error de compilación:
pORTBbits.RB2
 
Gracias por responder. Tenía esas librerías porque estuve tratando de otras maneras, lo volví a cambiar:
C:
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)

#pragma config WDTE = OFF       // Watchdog Timer (WDT disabled)

#pragma config PWRTE = OFF      // Power-up Timer Enable bit (Power-up Timer is disabled)

#pragma config CP = OFF         // Code Protection bit (Code protection disabled)

#include <xc.h>

#include <pic16f84a.h>

#define _XTAL_FREQ 4000000

#define INT_TRCC

#define cont(x) TMR0 = 0; while(TMR0 < x);

bit salida = 0b0;

bit entrada = 0b0;

bit paro = 0b0;

void main ()

{

PORTA = 0b00011;

TRISA = 1;

PORTB = 0b00000001;

TRISB = 0b00000001;

ei();

OPTION_REG=0b11100111;

INTCONbits.GIE=1;

INTCONbits.TMR0IE=1;

INTCONbits.TMR0IF=0;

INTCONbits.INTE =1;

while (1)

  {

      if (PORTAbits.RA0 == 1)

      {

            PORTBbits.RB2 = 1;

            cont(150);

            PORTBbits.RB3 = 1;

            cont(150);

          

       }

      else

      {

       PORTBbits.RB2 = 0;

       PORTBbits.RB3 = 0;

      }

      if(PORTBbits.RB0 == 1)

      {

          PORTBbits.RB2 = 0;

        

          PORTBbits.RB3 = 0;

        

      }

      else

      {

       PORTBbits.RB5 = 1;

       cont(150);

      }

  }

}

void interrupt   tc_int  (void)       


{

        if(INTCONbits.T0IF && INTCONbits.T0IE)

    {                                   

                TMR0 -= 250;             

                INTCONbits.T0IF = 0;               

    }


}
 
No, no entiendo por qué no hace nada ahora.
C:
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)

#pragma config WDTE = OFF       // Watchdog Timer (WDT disabled)

#pragma config PWRTE = OFF      // Power-up Timer Enable bit (Power-up Timer is disabled)

#pragma config CP = OFF         // Code Protection bit (Code protection disabled)

#include <xc.h>

#include <pic16f84a.h>

#define _XTAL_FREQ 4000000

#define INT_TRCC

#define cont(x) TMR0 = 0; while(TMR0 < x);


int main ()

{

TRISA = 1;

TRISB = 0b00000001;

ei();

OPTION_REG=0b11100111;

INTCONbits.GIE=1;

INTCONbits.TMR0IE=1;

INTCONbits.TMR0IF=0;

INTCONbits.INTE =1;

while (1)

  {

      if (RA0 == 1)

      {

            RB2 = 1;

            RB3 = 1;

            cont(150);

          

       }

    

      if(RB0 == 1)

      {

          RB2 = 0;

          RB3 = 0;

          cont(150);

      }

      else

      {

       RB5 = 0;

       RB1 = 0;

       RB2 = 0;

       RB3 = 0;

       RB4 = 0;

       cont(150);

      }

  }

return 0;

}

void interrupt   tc_int  (void)       


{

        if(INTCONbits.T0IF && INTCONbits.T0IE)

    {                                   

                TMR0 = 255;             

                INTCONbits.T0IF = 0;               

    }


}
Supongo que funcionó. :rolleyes:
Pues se prende aunque no pulse el pulsador:
C:
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)

#pragma config WDTE = OFF       // Watchdog Timer (WDT disabled)

#pragma config PWRTE = OFF      // Power-up Timer Enable bit (Power-up Timer is disabled)

#pragma config CP = OFF         // Code Protection bit (Code protection disabled)

#include <xc.h>

#include <pic16f84a.h>

#define _XTAL_FREQ 4000000

#define INT_TRCC

#define cont(x) TMR0 = 0; while(TMR0 < x);


int main ()

{

TRISA = 1;

TRISB = 0b00000001;

ei();

OPTION_REG=0b11100111;

INTCONbits.GIE=1;

INTCONbits.TMR0IE=1;

INTCONbits.TMR0IF=0;

INTCONbits.INTE =1;

while (1)

  {

      if (RA0 == 1)

      {   

            __delay_ms(100);

            RB2 = 1;

            RB3 = 1;

            cont(150);

          

       }

    

      if(RB0 == 1)

      {

          __delay_ms(100);

          RB2 = 0;

          RB3 = 0;

          cont(150);

      }

      else

      {

       RB5 = 0;

       RB1 = 0;

       RB2 = 0;

       RB3 = 0;

       RB4 = 0;

       cont(150);

      }

  }

return 0;

}

void interrupt   tc_int  (void)       


{

        if(INTCONbits.T0IF && INTCONbits.T0IE)

    {                                   

                TMR0 = 255;             

                INTCONbits.T0IF = 0;               

    }


}
 
No, no entiendo por qué no hace nada ahora.
¿Y qué se supone que debe hacer el programa?
Es que con la explicación que diste en tu post #20 no sirve de mucho para comprender el funcionamiento del circuito.
Pues se prende aunque no pulse el pulsador
¿Qué cosa se prende?

Te recomiendo que comentes tu programa para que se pueda entender lo que pretendes.
Si no lo haces, con el tiempo ni tú mismo vas a saber lo que estabas tratando de hacer.
Y si explicas mejor qué cosa quieres hacer, también serviría bastante para que se te pueda brindar un mejor asesoramiento.
Algo que también es conveniente aparte de comentar las líneas de tu programa, es que incluyas tu proyecto completo dentro de un archivo comprimido.
 
Ok. Así es la cosa.
Mi intención es que A0 active el motor y los LED que se encuentran en RB2 y RB3 que indica "salida" y con RB0 apagar todo, con A1 prender RB4 y RB1 que indican "entrada"
El programa ya obedece a A0 pero con A1 no pasa nada.
C:
#pragma config FOSC = XT        // Oscillator Selection bits (XT oscillator)

#pragma config WDTE = OFF       // Watchdog Timer (WDT disabled)

#pragma config PWRTE = OFF      // Power-up Timer Enable bit (Power-up Timer is disabled)

#pragma config CP = OFF         // Code Protection bit (Code protection disabled)

#include <xc.h>

#include <pic16f84a.h>

#define _XTAL_FREQ 4000000

#define INT_TRCC

#define cont(x) TMR0 = 0; while(TMR0 < x);

#define salida PORTAbits.RA0

#define entrada PORTAbits.RA1

#define led_salida PORTBbits.RB2

#define motor1 PORTBbits.RB3

#define paro PORTBbits.RB0

#define led_entrada PORTBbits.RB1

#define motor2 PORTBbits.RB4

#define led_paro PORTBbits.RB5

int main ()

{

TRISA = 1;

TRISB = 0b00000001;

ei();

OPTION_REG=0b11100111;

INTCONbits.GIE=1;

INTCONbits.TMR0IE=1;

INTCONbits.TMR0IF=0;

INTCONbits.INTE =1;

while (1)

  {

      if (salida == 1)

      {   

            led_salida = 1;

            __delay_ms(100);

            motor1 = 1;

            __delay_ms(100);

            led_salida = 0;

       }

      else

      {

          led_salida = 0;

          motor1 = 0;

        

      }

      if(entrada == 1)

      {

        led_entrada = 1;

        __delay_ms(50);

        motor2 = 1;

        __delay_ms(50);

      }

      else

      {

        led_entrada = 0;

        motor2 = 0;

      }

      if(paro == 1)

      {

          motor1 = 0;

          cont(150);

          led_salida = 0;

          cont(150);

          motor2 = 0;

          cont(150);

          led_entrada =0;

          cont(150);

          led_paro =1;

          __delay_ms(100);

        

       }

      else

      {

       led_paro = 0;

       led_entrada = 0;

       led_salida = 0;

       motor1 = 0;

       motor2 = 0;

       //cont(150);

      }

  }

return 0;

}

void interrupt   tc_int  (void)       


{

        if(INTCONbits.T0IF && INTCONbits.T0IE)

    {                                   

                TMR0 = 255;             

                INTCONbits.T0IF = 0;               

    }


}
 

Adjuntos

  • aa.png
    aa.png
    58.3 KB · Visitas: 7
Atrás
Arriba