TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado 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:
#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
-
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
-
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:
// 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!!
-
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
-
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!
-
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!
-
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.
-
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!!