TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: morante en 19 de Agosto de 2008, 13:59:53

Título: No se activa la interrupcion int_rb
Publicado por: morante en 19 de Agosto de 2008, 13:59:53
Lo primero, un saludo a todos. Hace poco que he empezado con esto de los PIC, así que llevo unas semanas leyendo , y me está sirviendo de mucho.
Ya he hecho algún programilla en ensamblador, así que me he decidido a programar en C. Estoy haciendo un sencillito programa de un deposito con dos sensores que produzcan una interrupcion por cambio de estado (INT_RB). El problema es que en la simulación con proteus, no consigo que entre en la interrupción, y no sé a que puede deberse. El codigo es:

----------------------------------------------------------------------------------------------------------------------------
#include <16F84a.h>      ////Dispositivo que utilizo.
#fuses XT,NOWDT,NOPUT,NOPROTECT   ////Configuracion de fusibles.
#use delay(clock=4000000)   ////cristal a 4MHZ.
#byte port_b=0x06         /*Asigna port_B con un objeto
            en la direccion 6 de la memoria(puerto B).*/
///#byte port_a=0x05
#use fast_io(b)


#int_rb
void IntPortB4_7()
{
if (pin_b6==1)      ///si el deposito esta vacio
   {
output_bit(pin_a0,1);
   }
if (pin_b7==0)      ///si el deposito esta lleno
   {
output_bit(pin_a0,0);
   }
}


void main (void)          ////funcion principal.
{
port_b_pullups(TRUE);      ////Habilitadas resistencias pull-ups
SET_TRIS_B(0xFF);      ////Declaro el puerto B como entrada.
SET_TRIS_A(0x00);      ////Declaro el puerto A como salida.
///output_bit(pin_a0,0);
enable_interrupts(INT_RB);   ////Hablilito la interrupcion externa.
enable_interrupts(GLOBAL);
sleep();
}
---------------------------------------------------------------------------------------------

Algo que me extraña es que al realizar la depuración en proteus, al ver el codigo C, las lineas de la funcion de interrupcion no tienen dirección asignada. No se si esto es indicativo de algo.
Espero vuestra ayuda.
Título: Re: No se activa la interrupcion int_rb
Publicado por: BrunoF en 19 de Agosto de 2008, 14:08:28
Hola. Bienvenido al foro.

Varias cositas...en lugar de usar una condición if(pin==1) o if(pin==0) me parece que sería mejor que hagas if(input(pin)) o if(!input(pin))
Segundo: la interr por cambio de estado en RB0 tiene un flanco. Podes configurar la interr para que interrumpa en un cambio de flanco de bajo a alto o de alto a bajo. Asegurate que estés cambiando el estado del RB0 según la config que hayas elegido.
Tercero: Como no hay nada después del sleep() supongo que al producirse la interr y salir de la mísma, el programa probablemente ejecute todas las líneas de memoria flash, luego se resetee. Tal vez esto produzca comportamientos inadecuados. Pone un bucle después del sleep().

Saludos.
Título: Re: No se activa la interrupcion int_rb
Publicado por: morante en 19 de Agosto de 2008, 14:23:55
Ok, probaré todo lo que me dices. Lo que no entendí es lo del sleep.
Yo suponía que el micro permanece en sleep hasta que se produce una interrupción. En ese instante realiza la funcion int y vuelve al modo sleep, no???
si no es así que, cómo tendría que ponerlo???

Mil gracias de nuevo
Título: Re: No se activa la interrupcion int_rb
Publicado por: vszener en 19 de Agosto de 2008, 20:07:29
Para hacer un bucle infinito y que el programa no termine existen varios métodos.

Mediante la instrucción for.
Código: [Seleccionar]
for (; ;)
{
    sleep();
}

Mediante la instrucción while.
Código: [Seleccionar]
while (1)
{
    sleep();
}

Mediante la instrucción do-while.
Código: [Seleccionar]
do
{
    sleep();

} while(1);

Por cierto, en el post fijo de este subforo existen varios temas con multitud de ejemplos, entre los cuales podrás encontrar el de como tratar interrupciones del puerto B.


Suerte!!! ;)
Título: Re: No se activa la interrupcion int_rb
Publicado por: morante en 20 de Agosto de 2008, 15:10:58
ya solucioné el problema de las interrupciones. El fallo estaba en las condiciones if que no eran muy correctas, como ya me corrigió BrunoF. Gracias a ambos.
Título: [*] Re: No se activa la interrupcion int_rb
Publicado por: Nocturno en 25 de Agosto de 2008, 02:02:58
¿Eres de La Puebla?
Título: Re: No se activa la interrupcion int_rb
Publicado por: morante en 27 de Agosto de 2008, 19:23:54
Qué va!, soy de Sevilla capital.