Autor Tema: Problema con interrucion en PIC16F886  (Leído 2812 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado juanchin

  • PIC10
  • *
  • Mensajes: 8
Problema con interrucion en PIC16F886
« 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

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Problema con interrucion en PIC16F886
« Respuesta #1 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
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado juanchin

  • PIC10
  • *
  • Mensajes: 8
Re: Problema con interrucion en PIC16F886
« Respuesta #2 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!!

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Problema con interrucion en PIC16F886
« Respuesta #3 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
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problema con interrucion en PIC16F886
« Respuesta #4 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!
No contesto mensajes privados, las consultas en el foro

Desconectado juanchin

  • PIC10
  • *
  • Mensajes: 8
Re: Problema con interrucion en PIC16F886
« Respuesta #5 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!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Problema con interrucion en PIC16F886
« Respuesta #6 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado juanchin

  • PIC10
  • *
  • Mensajes: 8
Re: Problema con interrucion en PIC16F886
« Respuesta #7 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!!


 

anything