TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: juatopic en 18 de Enero de 2011, 19:04:41

Título: Problema con interrupciones mediante un pulsador PIC18f4520
Publicado por: juatopic en 18 de Enero de 2011, 19:04:41
El problema reside en que PROTEUS me manda unos Warnings (Logic contention(s) detected on net B0, GND) cuando pulso mi interruptor.

Aquí les dejo el código, y la imagen del diseño esquemático en Proteus (Obviamente, ese oputput B0 va conectado a un input que va al puerto RB0).
Código: [Seleccionar]

#include <18F4520.h>

#fuses HS, NOWDT, WDT2048, NOPROTECT, BROWNOUT, PUT, NOLVP, NOXINST
#use delay(clock=8000000,RESTART_WDT)

...


int estado; // Variable que usaremos para saber si estamos en SLEEP (0) o no (1).


//Vamos a usar una interrupción externa por el puerto RB0 para despertar al PIC de su estado de SLEEP mediante un pulsador.

#int_ext
DespertarPic(){

estado=1;
clear_interrupt(INT_EXT);
}



Acceder_Menu(){   // Función que estará disponible al despertar al PIC

   
   //aquí va este método, da igual lo que sea, no llega hasta aquí y no sé por qué (sé que no llega a hacer la interrupción)
   
}


void main() {

ext_int_edge(L_TO_H);         // interrupción para comparacion flanco de subida
enable_interrupts(INT_EXT);   //Se habilitan las interrupciones externas.
enable_interrupts(GLOBAL);    //Habilitadas interrupciones globales.

// portB como entradas.
set_tris_b(255);         

lcd_init();


setup_adc_ports(AN0_TO_AN3); //RA0 a RA3 entradas analógicas (ver 18F4520.h)


bienvenida();


   while(1){

   control_temperatura();

   estado=0;

    while(estado==0){

 
         lcd_send_byte(LCD_COMANDO,LCD_CLEAR);
         lcd_putc("ESTADO: OFF");
         
       


         SETUP_WDT(WDT_ON);
         SLEEP();
         SETUP_WDT(WDT_OFF);
         lcd_send_byte(LCD_COMANDO,LCD_CLEAR);

         delay_ms(500);
         mostrar_fecha();
         delay_ms(1000);
         lcd_send_byte(LCD_COMANDO,LCD_CLEAR);
         mostrar_temperatura();
         delay_ms(500);
         lcd_send_byte(LCD_COMANDO,LCD_CLEAR);
    }
   
    Acceder_Menu();


}


}



Obvien las funciones que se ejecutan ahí, es sólo parte de un gran código, pero lo que no va son las interrupciones.
(http://s2.subirimagenes.com/imagen/previo/thump_5813260conector.png)


Gracias de antemano
Título: Re: Problema con interrupciones mediante un pulsador PIC18f4520
Publicado por: jhozate en 18 de Enero de 2011, 20:18:41
ponle una resistencia de las normales de 10K a ver si ya no tira el warning
Título: Re: Problema con interrupciones mediante un pulsador PIC18f4520
Publicado por: juatopic en 18 de Enero de 2011, 20:54:04
No, no tira el warning poniéndole una resistencia normal de 10K, pero eso no consigue que la interrupción funcione.
Título: Re: Problema con interrupciones mediante un pulsador PIC18f4520
Publicado por: MLO__ en 18 de Enero de 2011, 20:58:27
ton ya es cosa del isisssss  :mrgreen:
Título: Re: Problema con interrupciones mediante un pulsador PIC18f4520
Publicado por: jhozate en 18 de Enero de 2011, 21:07:31
segun veo el pic en el isis el pin B0 tambien funciona como entrada analoga, habria que asegurarse que ese pin sera digital y de entrada. Por otro lado, utilizas el WDT o no lo utilizas??
Título: Re: Problema con interrupciones mediante un pulsador PIC18f4520
Publicado por: bmb en 18 de Enero de 2011, 21:19:20
Hola juatopic, también puedes revisar la configuración de tus fuses, ya que ese PIC después de un Power-on Reset deja los pines RB0 a RB4 del puerto B como entradas análogas.  Te veo un set_tris_b(255); pero si no pones el fuse NOPBADEN, esta instrucción no va a tener ningún efecto en los pines mencionados.  Ya como comentario, porque no lo tengo claro, se me hace algo extraña la forma en que tienes los fuses para el WDT y su posterior uso.

Saludos!


Edito:  disculpa jhozate, ya lo habias dicho...  Saludos!
Título: Re: Problema con interrupciones mediante un pulsador PIC18f4520
Publicado por: juatopic en 18 de Enero de 2011, 21:36:21
he puesto el NOPBADEN, como habeis mencionado, pero sigue sin funcionar, los warnings siguen saliendo con la resistencia de pullup. Con la resistencia de 10k siguen sin salirme warnings, pero la variable 'estado' no cambia a 1.

el WDT sí lo uso, auqnue soy bastante novato en esto, lo tengo configurado para que se encienda y se apague cada cierto tiempo para así hacer unas comprobaciones, o al menos eso creo. Pero ése no es el problema, no?

Muchas gracias por los aportes, a ver si logramos solucionarlo entre todos
Título: Re: Problema con interrupciones mediante un pulsador PIC18f4520
Publicado por: bmb en 18 de Enero de 2011, 21:53:42
Hola, bueno habría ahora que ver el contenido de la función: DespertarPic().  Para que estás usando al final de la rutina de interrupción esta instrucción:  clear_interrupt(INT_EXT);?
Lo que pasa es que el problema puede estar donde menos te lo imaginas y si solo se ve una parte del código es muy difícil.

Saludos!
Título: Re: Problema con interrupciones mediante un pulsador PIC18f4520
Publicado por: juatopic en 18 de Enero de 2011, 22:01:25
la función DespertarPic() lo único que hace es poner estado=1, y mirando en el debug del proteus, en ningún momento esa variable cambia.

clear_interrupt(INT_EXT) lo he puesto para deshabilitar las interrupciones después de haber cambiado ese estado, auqnue esto no influye, ya que he probado también quitándolo y no pasa nada. La función Acceder_Menu es solo un printf
Título: Re: Problema con interrupciones mediante un pulsador PIC18f4520
Publicado por: bmb en 18 de Enero de 2011, 22:14:27
Ahhh ahora veo, es la función de la interrupción en si.  No la había visto, disculpa.  lo que veo de momento es que tienes un bucle while() en el main en donde continuamente estás ejecutando esta instrucción: estado=0;  es posible que la interrupción si esté funcionando, pero inmediatamente el bucle while pone esta variable a 0.  Por otro lado, que instrucciones realiza el código cuando estado=1?  No se ven en el código...

Saludos!
Título: Re: Problema con interrupciones mediante un pulsador PIC18f4520
Publicado por: juatopic en 18 de Enero de 2011, 22:27:57
Sí que se ven. Si te fijas, dentro del bucle while(1) hay otro bucle while(estado==0), por lo que, si cambiase el valor de estado a 1, debería salirse de ese segundo bucle y continuar con el while(1), es decir, con la función Acceder_Menu. El problema está en que nunca llega ahí, y ya no sé si es problema del Proteus y sus warnings o del programa en sí.
Título: Re: Problema con interrupciones mediante un pulsador PIC18f4520
Publicado por: juatopic en 18 de Enero de 2011, 22:32:02
Aquí dejo la captura del Proteus por si el error fuera tan claro que soy incapaz de verlo..
(http://s3.subirimagenes.com:81/imagen/previo/thump_5814169captura.png)
Título: Re: Problema con interrupciones mediante un pulsador PIC18f4520
Publicado por: bmb en 18 de Enero de 2011, 22:48:01
Si, tienes razón.  Sin embargo no se el contenido de  Acceder_Menu, por lo tanto no se si se alcanzará a ver su ejecución antes que estado sea nuevamente igual a 0 en el siguiente ciclo del while(). 

No se ve bien el diagrama.

Saludos!
Título: Re: Problema con interrupciones mediante un pulsador PIC18f4520
Publicado por: juatopic en 18 de Enero de 2011, 23:00:12
el contenido de Acceder_Menu es una función que no tiene nada que ver con el valor de estado, son varios printf de comprobación.
Aquí esta la captura en grande:
(http://img171.imageshack.us/img171/1749/capturarb.png)

Título: Re: Problema con interrupciones mediante un pulsador PIC18f4520
Publicado por: bmb en 18 de Enero de 2011, 23:21:19
Si efectivamente como dices son solo unos printf, sin delays o algo que detenga por un momento la ejecución del programa para poder leerlos, es muy posible que no alcances a ver nada cuando ya estado valdrá 0 en el siguiente ciclo del while.

Saludos!
Título: Re: Problema con interrupciones mediante un pulsador PIC18f4520
Publicado por: juatopic en 18 de Enero de 2011, 23:22:49
Sí hay delays, de hecho hay varios if tambien para leer por teclado, de modo que eso no puede ser. El error debe de estar en el programa o en el diagrama de proteus
Título: Re: Problema con interrupciones mediante un pulsador PIC18f4520
Publicado por: jhozate en 19 de Enero de 2011, 13:45:15
acabo de hacer un código muy simple para probar la interrupción externa, lo he simulado y me funciona. Entonces el problema esta solo en tu codigo