Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

12/01/2009 #1


Problema con el encendido de un led mediante el PIC18F4550
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

Código:
#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.
18/01/2009 #2

Avatar de Romyggar

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
18/01/2009 #3

Avatar de Moyano Jonathan

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

Código:
#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
18/01/2009 #4

Avatar de Moyano Jonathan

Para usarlo con un cristal de 4.00Mhz , tenes que cambiar el fusible HSPLL por XTPLL y PLL5 por PLL1
19/01/2009 #5


¡Ok! Gracias por las respuestas, checaré lo de los fuses.
19/01/2009 #6

Avatar de Moyano Jonathan

Cometí un error , donde puse :
Código:
else { 
                                  output_b(0x01); 
                                  }
va:
Código:
else { 
                                  output_b(0x02); // Así enciende RB1. 
                                  }
24/06/2011 #7


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.
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.