TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: piojoadrian en 28 de Julio de 2009, 12:25:58

Título: Problema con el 18F2455, necesito resetearlo
Publicado por: piojoadrian en 28 de Julio de 2009, 12:25:58
Hola amigos,

En este caso, tengo un problemita.
Estoy encuestando el pic 18F2455 por el puerto serie, funciona, pero luego de un dia completo de funcionamiento, se tilda, como que deja de responder. Me gustaria saber alguna forma de resetearlo que este verificada que funciona.

Probe con el wdt, pero al parecer no obtengo resultado.
La alternativa que me queda, es implementar un reseteo a traves del MCLR, colocaria un timer para activar el flanco negativo que me resetea el PIC.

Espero puedan ayudarme!

Saludos cordiales!

pd: el sistema es de monitoreo, el que este interesado, lo puedo ayudar.
Título: Re: Problema con el 18F2455, necesito resetearlo
Publicado por: Suky en 28 de Julio de 2009, 12:52:39
Seguro que has implementado el Wdt correctamente? Porque puede ser que el problema no sea el software sino el hardware.


Saludos!
Título: Re: Problema con el 18F2455, necesito resetearlo
Publicado por: piojoadrian en 28 de Julio de 2009, 14:34:56
Citar
Seguro que has implementado el Wdt correctamente? Porque puede ser que el problema no sea el software sino el hardware.

Ante todo, gracias por responder e intentar ayudarme. Mi proyecto consta del monitoreo de varios canales del A/D.
El problema, es que luego de varias horas (en este caso luego de 2 dias, a veces menos) el PIC deja de contestar, es probable que este olvidando algo en el WDT o algun fuse.

Espero puedan ayudarme, aqui les dejo mi programa.

Desde ya muchas gracias


Código: [Seleccionar]
#include <18F2455.h>
#fuses HSPLL,WDT,WDT512,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#use delay(clock=48000000, restart_wdt)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)

#int_RDA
void  RDA_isr(void)
{
   char caracter;
   int8 canal0,canal1,canal2,canal3,canal4,canal8,canal9,canal10,canal11,canal12;
   
   caracter=getchar();

   if (caracter=='c')
   {
        restart_wdt()             //Canal 0
        set_adc_channel(0);
        delay_us(10);
        restart_wdt()
        canal0 = read_adc(); //read_adc(ADC_START_ONLY);
        delay_ms( 10 );
        restart_wdt()
        canal0 = read_adc(); //read_adc(ADC_READ_ONLY);
 
        restart_wdt()
        printf("00=%3u",canal0);
        restart_wdt()
       



        restart_wdt()             //Canal 1
        set_adc_channel(1);
        delay_us(10);
        restart_wdt()
        canal1 = read_adc();
        delay_ms( 10 );
        restart_wdt()
        canal1 = read_adc();
       
        restart_wdt()
        printf("01=%3u",canal1);
        restart_wdt()
       
       
       
       
        restart_wdt()              //Canal 2
        set_adc_channel(2);
        delay_us(10);
        restart_wdt()
        canal2 = read_adc();
        delay_ms( 10 );
        restart_wdt()
        canal2 = read_adc();
       
        restart_wdt()
        printf("02=%3u",canal2);
        restart_wdt()
       
       
       
        restart_wdt()               //Canal 3
        set_adc_channel(3);
        delay_us(10);
        restart_wdt()
        canal3 = read_adc();
        delay_ms( 10 );
        restart_wdt()
        canal3 = read_adc();
       
        restart_wdt()
        printf("03=%3u",canal3);
        restart_wdt()
       
       
       
        restart_wdt()               //Canal 4
        set_adc_channel(4);
        delay_us(10);
        restart_wdt()
        canal4 = read_adc();
        delay_ms( 10 );
        restart_wdt()
        canal4 = read_adc();
       
        restart_wdt()
        printf("04=%3u",canal4);
        restart_wdt()
     
     
     
        restart_wdt()               //Canal 8
        set_adc_channel(8);
        delay_us(10);
        restart_wdt()
        canal8 = read_adc();
        delay_ms( 10 );
        restart_wdt()
        canal8 = read_adc();
 
        restart_wdt()
        printf("08=%3u",canal8);
        restart_wdt()
       
       
       
        restart_wdt()               //Canal 9
        set_adc_channel(9);
        delay_us(10);
        restart_wdt()
        canal9 = read_adc();
        delay_ms( 10 );
        restart_wdt()
        canal9 = read_adc();
       
        restart_wdt()
        printf("09=%3u",canal9);
        restart_wdt()
     
     
     
        restart_wdt()                 //Canal 10
        set_adc_channel(10);
        delay_us(10);
        restart_wdt()
        canal10 = read_adc();
        delay_ms( 10 );.
        restart_wdt()
        canal10 = read_adc();
 
        restart_wdt()
        printf("10=%3u",canal10);
        restart_wdt()
       
       
       
       
        restart_wdt()                  //Canal 11
        set_adc_channel(11);
        delay_us(10);
        restart_wdt()
        canal11 = read_adc();
        delay_ms( 10 );
        restart_wdt()
        canal11 = read_adc();
 
       
        restart_wdt()
        printf("11=%3u",canal11);   
        restart_wdt()
       
       
       
       
        restart_wdt()                     //Canal 12
        set_adc_channel(12);
        delay_us(10);
        restart_wdt()
        canal12 = read_adc();
        delay_ms( 10 );
        restart_wdt()
        canal12 = read_adc();
       
        restart_wdt()
        printf("12=%3u\r",canal12);      //El ultimo canal termina con un retorno de carro;
        restart_wdt()
       
       
   }

   
}


void main(void) {
   
   setup_adc_ports(ALL_ANALOG|VSS_VDD);
   setup_adc(ADC_CLOCK_INTERNAL|ADC_TAD_MUL_2);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   

 
   while (TRUE) {}
 
}
Título: Re: Problema con el 18F2455, necesito resetearlo
Publicado por: piojoadrian en 28 de Julio de 2009, 14:48:51
Es probable que sea algo del BOR que no habilito?
Título: Re: Problema con el 18F2455, necesito resetearlo
Publicado por: Suky en 28 de Julio de 2009, 17:38:13
En el main deberia ir:
Código: C
  1. setup_wdt(WDT_ON);

Saludos!
Título: Re: Problema con el 18F2455, necesito resetearlo
Publicado por: piojoadrian en 28 de Julio de 2009, 18:12:57
Increible...

Como no me percate de eso...

Lo tuve en mente todo el tiempo, pero no lo puse...

:(

jeje

Espero sea esto, en la fabrica me estaba por matar...luego de un dia, por alguna interferencia que desconozco, me tildaba uno de los 5 PIC´s.



Esta si que fue una gran ayuda, mi proyecto consta de un sistema de monitoreo. Estoy utilizando unas Xbee. Cualquier consulta a tus ordenes!

Saludos