# Problema con el encendido de un led mediante el PIC18F4550



## mario90210 (Ene 12, 2009)

Hola a todos, estoy haciendo algunas pruebas con el pic pero tengo duda en el código, el compilador pcw no me marca errores, pero en la sumulación con Proteus no me prende el led y no tiene caso probarlo físicamente.

Utilizo enteramente el puerto B, en B0 tengo el switch y en B1 el led únicamente


```
#include <18F4550.h>
#fuses XT,NOWDT
#use delay( clock = 4000000 )   // Reloj  de 4 MHz
#BYTE TRISB = 0x86            // TRISB en 86h.
#BYTE PORTB = 0x06            // PORTB en 06h.
#BYTE OPTION_REG = 0x81      //OPTION_REG en 81h.

void main() {
   bit_clear(OPTION_REG,7);      // Habilitación Pull-up
   bit_set(TRISB,0);            //B0 como entrada
   bit_clear(TRISB,1);         // B1 como salida
   bit_clear(PORTB,1);         // apaga LED
   while (1) {
   if (bit_test(portb,0) == 1 )  //Si RB0 es 1 apaga el LED
      bit_clear(portb,1);                        
   else
      bit_set(portb,1);         //Si RB0=0 enciende el LED
   }
}
```

Gracias de antemano por la atención.


----------



## Romyggar (Ene 18, 2009)

no se si te sirva mi respuesta, pero en alguna ocasión tuve un problema similar con un pic16f877a. estuve como 1 hora tratando de encontrar un error en el programa, o una mala conexión en el circuito aramado en una protoboard. al final resultó que tenía habilitado el fusible BOREN en el WinPic, y esto no dejaba que el pic iniciara a ejecutar el programa.

mi sugerencia es, revisa este fusible cuando quemes el pic


----------



## Moyano Jonathan (Ene 18, 2009)

Este es el código arreglado para que te funcione. El problema está en los fusibles mal configurados.


```
#include <18f4550.h>  //archivo de cabecera
#fuses HSPLL,MCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,NOVREGEN
// HSPLL = cristal de 20Mhz.
#use delay(clock=48000000) // Frecuencia de trabajo del pic usando el PLL.

void main() {
    set_tris_a(0x0);	
    set_tris_b(0x01);   // Todo el puerto B como salida menos RB0.
    set_tris_c(0x0);
    set_tris_d(0x0);
    set_tris_e(0x0);
//----------------------------------   
   disable_interrupts(global);
   disable_interrupts(int_timer1);
   disable_interrupts(int_rda);
   disable_interrupts(int_ext);
   disable_interrupts(int_ext1);
   disable_interrupts(int_ext2);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(FALSE);
   setup_psp(PSP_DISABLED);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   port_b_pullups(FALSE);    
//---------------------------   
	output_a (0);    // saca un nivel bajo de salida en los puertos
	output_c (0);
	output_d (0);
	output_e (0);
while(true) {
		if(input(PIN_B0)) {
                                  output_b(0x00);
                                    }
                                 else {
                                  output_b(0x01);
                                  }
}
}
```

Bueno fijate si ahí te anda si no mandame un MP


----------



## Moyano Jonathan (Ene 18, 2009)

Para usarlo con un cristal de 4.00Mhz , tenes que cambiar el fusible HSPLL por XTPLL y PLL5 por PLL1


----------



## mario90210 (Ene 19, 2009)

¡Ok! Gracias por las respuestas, checaré lo de los fuses.


----------



## Moyano Jonathan (Ene 19, 2009)

Cometí un error , donde puse : 
	
	



```
else { 
                                  output_b(0x01); 
                                  }
```

va: 
	
	



```
else { 
                                  output_b(0x02); // Así enciende RB1. 
                                  }
```


----------



## gelitojr (Jun 24, 2011)

Que tal, 

bueno tengo un problema con este código que puso el amigo moyano que he adaptado para hacer parpadear un led con el 18f4550. Ya había intentado con uno propio pero no lo logré como hubiera querido, así que copié tal cual el código que está arriba y añadí un delay en el "if" de 250 ms para encender y otro delay de 250 ms para apagar, lo compilé y hasta aquí sin problemas (estoy usando el CCS 4.114). Entonces me puse a probarlo en el circuito y pues si funcionó, solo que la frecuencia con la que se enciende y apaga el led no corresponde con la que del código. Es decir para estos 250 ms de delay tengo al led encendido durante 12 segundos y el mismo intervalo cuando está apagado. Para el circuito uso el mismo cristal de 20 MHz. Intenté variando las configuraciones de los fuses para los osciladores, intenté con otra configuracion de programación, distintas instrucciones, etc. y con diferentes cristales (20 y 4 Mhz) y el resultado es el mismo, no hay coincidencia entre los tiempos maracados en el programa y los que tengo físicamente. Espero puedan ayudarme.


----------

