Autor Tema: No se activa la interrupcion int_rb  (Leído 2074 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado morante

  • PIC10
  • *
  • Mensajes: 4
No se activa la interrupcion int_rb
« 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.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: No se activa la interrupcion int_rb
« Respuesta #1 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.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado morante

  • PIC10
  • *
  • Mensajes: 4
Re: No se activa la interrupcion int_rb
« Respuesta #2 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

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: No se activa la interrupcion int_rb
« Respuesta #3 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!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado morante

  • PIC10
  • *
  • Mensajes: 4
Re: No se activa la interrupcion int_rb
« Respuesta #4 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.


Desconectado morante

  • PIC10
  • *
  • Mensajes: 4
Re: No se activa la interrupcion int_rb
« Respuesta #6 en: 27 de Agosto de 2008, 19:23:54 »
Qué va!, soy de Sevilla capital.