PIC18f458 se resetea y no esta conectado a etapa de potencia.

Hola chavos!!

Tengo un problema que ya me esta dando dolor de cabeza desde hace varios dias. Tengo un microcontrolador y lo he programado para una simple rutina de prueba: prende puerto D1 y apagalo despues de 1s, esa es la rutina.

Lo raro esque el micro como que se resetea, se ve que oscila el led pero a una frecuencia mucho muy alta en comparacion a lo que le pido, yo me imagino que se esta reseteando por algo!! lo raro esque cuando lo alimentaba con el usb de la laptop y la tierra la conectaba con la probeta negativa de mi osciloscopio el pic hacia la secuencia!! ya probe con mas fuentes, le pise capacitor y nada!! no quiere funcionar y esque necesito obviamente el pic para un programa mas complejo pero no quiere funcionar ni este que esta super sencillo!!!, el MCLR esta conectado a5V y tengo los capacitores en el oscilador, el WDT esta deshabilitado y todo como debe ser!! pero aun asi no funciona!!!!! yo creo que debe ser algo muy sencillo que quiza este olvidando!! :eek:

Muchas gracias y saludines desde Mexico
 
Hola!! muchas gracias...
Aqui esta el código, es muy sencillo lo que tiene que hacer, funciona a veces pero como que solo si no se resetea!!! la verdad no se que sea, por que se resetee :cry:

Código:
#include <18f458.h>

#device adc=8
#use delay(clock=20000000)

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES HS                       //High speed Osc (> 4mhz)
#FUSES PROTECT                  //Code protected from reads
#FUSES NOOSCSEN                 //Oscillator switching is disabled, main oscillator is source
#FUSES NOBROWNOUT                 //Reset when brownout detected
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES PUT                    //No Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES LVP                      //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads




void main()
{
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_low_volt_detect(FALSE);
   setup_oscillator(False);
   
   set_tris_D(0x00);
   
   
   while(TRUE)
   {
      output_low(PIN_D0);
      output_high(PIN_D1);
      
      delay_ms(1000);
      output_low(PIN_D1);
      output_high(PIN_D0);
      delay_ms(1000);
   }
   
   
}
 
Última edición por un moderador:
Sin tanto código innecesario, prueba solamente así...
Código:
#include <18f458.h>
#fuses HS
#use delay(clock=20000000)

void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_comparator(NC_NC_NC_NC);
   
   while(TRUE)
   {
      output_toggle(PIN_D0);
      delay_ms(1000);
      output_toggle(PIN_D1);
   }
}
El puerto D no es análogo, así que las primeras instrucciones se pueden quitar.
Suerte.
 
Última edición:
Sin tanto código innecesario, prueba solamente así...
Código:
#include <18f458.h>
#fuses HS
#use delay(clock=20000000)

void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_comparator(NC_NC_NC_NC);
   
   while(TRUE)
   {
      output_toggle(PIN_D0);
      delay_ms(1000);
      output_toggle(PIN_D1);
   }
}
El puerto D no es análogo, así que las primeras instrucciones se pueden quitar.
Suerte.

Oh por Dios!! ya funciona bien!! ahora si podre usar mis sensores de distancia, son para un robot!!, obviamente habiliatare las interrupciones porque son como 5, mmmm, no se si me convenga usar los 5 en un solo mcro, crees que sea mejor poner 5 pics conectados porSerial o i2c??? weno eso lo checare, muchas gracias por su ayuda!!! solo que me quedo con la duda, porque el micro hacia eso cuando le ponpia todo ese código?? un maestro nos dijo una vez que ere necesario configurar todos los fuses y deshabilitar lo que no ocuparamos,etc!!!

Ojala pueda tener tu respuesta o Grande señor jajajaja, Muchas gracias!!!:aplauso:
 
habilitare las interrupciones porque son como 5, mmmm, no se si me convenga usar los 5 en un solo micro,
crees que sea mejor poner 5 pics conectados por serial o i2c???
Es mejor que solo trabajes con un solo microcontrolador de ser posible.
solo que me quedo con la duda, porque el micro hacia eso cuando le ponía todo ese código??
un maestro nos dijo una vez que era necesario configurar todos los fuses y deshabilitar lo que no ocupáramos,etc!!!
En tu código estableces varios fuses que no son necesarios, aparte de contraponerlos.
Es decir, no tiene caso que establezcas...
#FUSES NOWDT // No Watch Dog Timer
#FUSES WDT128 // Y aquí otra vez lo actives

#FUSES NOBROWNOUT // No Reset when brownout detected
#FUSES BORV20 // Y aquí lo configuras para un reset al bajar VDD a 2V

No es necesario configurar todos los fuses, solamente los necesarios.
¿Por qué?
Porque el compilador establece algunos que ya tiene predeterminados.
¿Como saber cuales establecer y cuales quitar?
Sencillo. Compila tu programa sin establecerlos.
Mira los fuses de tu archivo *.HEX con algún programa que los pueda leer (P.E. WinPIC 800)
Esos fuses que verás al abrir tu archivo, son los que el compilador establece por default.
Entonces podrás saber cuales te conviene quitar y cuales establecer.

En si, por ese lado no fue tanto el problema, ya que el compilador establece los valores por secuencia.
En este caso tomaría WDT128 y BORV20 únicamente como válidos.

El problema podría estar cuando configuras los módulos en el main de tu programa.
También ahí tienes configuraciones que no son necesarias.
Yo pienso que setup_oscillator(False); fue el causante del problema.
No tengo ese PIC para hacer alguna prueba físicamente, pero podrías experimentar.

Muchas gracias!!!:aplauso:

De nada. Suerte.
 
Última edición:
Atrás
Arriba