TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: juanchin en 17 de Enero de 2013, 11:21:18

Título: Problema con interrucion en PIC16F886
Publicado por: juanchin en 17 de Enero de 2013, 11:21:18
Hola a todos,

Estoy aprendiendo a utilizar interrupciones y he hecho un programita simple que debería prender y apagar un led cada vez que apretó un btón. El problema es que no hace nada!

¿Alguno me podría dar una mano?

Acá les dejo el código:

Código: [Seleccionar]
#include <htc.h>

#define _XTAL_FREQ 4000000

__CONFIG(FOSC_INTRC_NOCLKOUT); 
 

void interrupt ISR(void)
{
if(INTF)  //si se produce la interrupción externa
{
RC4 = ~RC4; // cambia el estado del pin RC4

INTF = 0;   // resetea la interrupción
}
}

void main(void)
{
TRISB0 = 1; //pin RB0 entrada
TRISC4 = 0; //pin RC4 salida
RC4 = 0;

INTCON     = 0x90;         // habilita la interrupción externa y la global
OPTION_REG = 0x40;         

while(1)
{
}
}

Mi idea era hacer un programa súper fácil solo para probar como funcionan las interrupciones, pero no hay caso, no lo puedo hacer andar. Cuando se aprieta el botón, debería cambiar el estado el pin RC4 ¿hay algún problema en el código? ¿me falta configurar algo? Cualquier ayuda va a ser bienvenida!!

También les dejo la simulación en proteus.

Desde ya, muchas gracias!!

Saludos



-juanchin
Título: Re: Problema con interrucion en PIC16F886
Publicado por: jukinch en 17 de Enero de 2013, 11:43:55
Hola Juanchin.
           Te aclaro que no he programado nunca en Hitech C.
Analizando el código veo que utilizás INTF dentro de la interrupción.
¿está predefinida por el compilador hitec C así?
Buscando ejemplos en la web veo que se utiliza como INT0IF
           Saludos.
                 Jukinch
Título: Re: Problema con interrucion en PIC16F886
Publicado por: juanchin en 17 de Enero de 2013, 13:31:39
Gracias por responder!!
Primero que nada, como bien decís, estoy usando Hi-Tech C como compilador y MPLAB como editor de texto, me olvide ese importante detalle jeje.

En cuanto a tu pregunta, INTF esta predefinida por Hi-Tech:

Código: [Seleccionar]

// dentro de 16f886.h

...
// Register: INTCON
volatile unsigned char           INTCON              @ 0x00B;
// bit and bitfield definitions
volatile bit RBIF                @ ((unsigned)&INTCON*8)+0;
volatile bit INTF                @ ((unsigned)&INTCON*8)+1;
volatile bit T0IF                @ ((unsigned)&INTCON*8)+2;
volatile bit RBIE                @ ((unsigned)&INTCON*8)+3;
volatile bit INTE                @ ((unsigned)&INTCON*8)+4;
volatile bit T0IE                @ ((unsigned)&INTCON*8)+5;
volatile bit PEIE                @ ((unsigned)&INTCON*8)+6;
volatile bit GIE                 @ ((unsigned)&INTCON*8)+7;
volatile bit TMR0IF              @ ((unsigned)&INTCON*8)+2;
volatile bit TMR0IE              @ ((unsigned)&INTCON*8)+5;
#ifndef _LIB_BUILD
volatile union {
    struct {
        unsigned RBIF                : 1;
        unsigned INTF                : 1;
        unsigned T0IF                : 1;
        unsigned RBIE                : 1;
        unsigned INTE                : 1;
        unsigned T0IE                : 1;
        unsigned PEIE                : 1;
        unsigned GIE                 : 1;
    };
    struct {
        unsigned                     : 2;
        unsigned TMR0IF              : 1;
        unsigned : 2;
        unsigned TMR0IE              : 1;
    };
} INTCONbits @ 0x00B;
#endif
...

Igualmente probé con INT0IF y me da error, me dice que ese identificador no esta definido!!

¿alguna otra idea?  :)

Desde ya, muchas gracias!!
Título: Re: Problema con interrucion en PIC16F886
Publicado por: jukinch en 17 de Enero de 2013, 13:41:13
El tema es que INTF es sólo un bit que forma parte de una estructura. Y para referenciar a ese bit debés inidicar previamente el nombre de la estructura a la que forma parte.

así: INTCONbits.INTF
Título: Re: Problema con interrucion en PIC16F886
Publicado por: Suky en 17 de Enero de 2013, 13:46:04
El tema es que INTF es sólo un bit que forma parte de una estructura. Y para referenciar a ese bit debés inidicar previamente el nombre de la estructura a la que forma parte.

así: INTCONbits.INTF


No necesariamente, en XC8 y Hitech existe el tipo de variable bit.

Me gustaría saber como lo esta probando, en hardware o en simulador? Estaría bueno agregarle una demora para evitar el efecto rebote que puede hacer que no veas el toggle


Saludos!
Título: Re: Problema con interrucion en PIC16F886
Publicado por: juanchin en 17 de Enero de 2013, 13:58:04
Buenas.

Efectivamente, con hi-tech no hace falta poner INTCONbits.INTF, el compilador reconoce el INTF solo.

Lo estoy probando con proteus. En el primer mensaje hay un archivo adjunto: sim.rar. Ahí esta el hex y el circuito montado. Ahora adjunto el proyecto del mplab también.

Gracias!!

Saludos!
Título: Re: Problema con interrucion en PIC16F886
Publicado por: AngelGris en 17 de Enero de 2013, 22:59:04
  Al simularlo y notar que no entraba en la interrupción recordé que en este pic los pines del puerto B pueden ser configurados como entradas analógicas. Justamente luego de un PowerOnReset quedan configurados de dicha forma. Tienes que modificar el registro ANSELH para configurar como se comportaran los pines del puerto B.
Título: Re: Problema con interrucion en PIC16F886
Publicado por: juanchin en 18 de Enero de 2013, 00:10:18
  Al simularlo y notar que no entraba en la interrupción recordé que en este pic los pines del puerto B pueden ser configurados como entradas analógicas. Justamente luego de un PowerOnReset quedan configurados de dicha forma. Tienes que modificar el registro ANSELH para configurar como se comportaran los pines del puerto B.

¡¡¡Ídolo!!! Tenias razón, era eso. Había que configurar el ANSELH y también, según lo que vi en la hoja de datos con respecto a las interrupciones del puerto b, el registro IOCB.

¡¡¡Muchas gracias a todos!!!

Saludos!!