Encender led con push boton PIC18f4550

Hola que tal, estoy intentando encender un led como dice el titulo con un push boton pero no lo consigo, estoy usando una tarjeta entrenadora bootloader que tiene el pic18f4550 ya e hecho otras cosas con la tarjeta pero no e conseguido lograr usar push boton, quería ver si alguien me puede decir en que me equivoco.
Estoy conectando un push boton a el pin B0 del pic y el led a encender sera cualquier otro pin B1 por ejemplo, mi programa en C es el siguiente, muchas gracias de antemano por la ayuda.


Código:
/*CONFIGURACION PIC*/

#include "18f4550.h"


#use delay(clock=48000000)

#build(reset=0x01000,interrupt=0x01008)
#org 0x0000,0x0FFF {}


//-------------------------------------------------------------------------------



#byte puerto_b = 06

void main(void)
{


set_tris_b( 0x01 );           // RB0 como entrada y lo demás del puerto B como salida

puerto_b = 0;                 // Limpia puerto B



DO{

   IF (INPUT(PIN_B0)){        // Si se presiona RB0
      output_toggle(PIN_B1);  // cambia el estado del pin RB1
      WHILE (INPUT(PIN_B0));  // Espera a que se suelte el botón
      }
   }
WHILE(TRUE);

}
 
Última edición por un moderador:
Aquí está el código, he modificado tu programa, pero ahora funciona.

Código:
#include <18f4550.h>
#fuses nowdt                    //no watch dog timer
#fuses hs                       //hs > 4mhz
#fuses noput                    //no power up timer
#fuses noprotect                //code not protected from reading
#fuses nodebug                  //no debug mode for icd
#fuses nobrownout               //no reset when brownout detected
#fuses nolvp                    //no low voltage programming on b3(pic16) or b5(pic18)
#fuses nocpd                    //no ee protection
#fuses nowrt                    //program memory not write protected
#use delay(clock = 20000000)    //libreria para generar retardos con un cristal de 20 mhz
#byte puerto_b = 06

void main(void)
{


set_tris_b( 0x01 ); // RB0 como entrada y lo demás del puerto B como salida
port_b_pullups(true);

while(true)
{
    while(INPUT(PIN_B0)==0)
    {                                     // Si se presiona RB0
        output_toggle(PIN_B1);       // cambia el estado del pin RB1
        while(input(pin_b0)==0);
    }
}
}

Nota: También he adjuntado el código y la simulación en proteus.
Saludos.
 

Adjuntos

  • EX0_Toggle.rar
    34 KB · Visitas: 162
Última edición por un moderador:
Aqui esta el codigo, he modificado tu programa, pero ahora funciona

Código:
#include <18f4550.h>
#fuses nowdt                    //no watch dog timer
#fuses hs                       //hs > 4mhz
#fuses noput                    //no power up timer
#fuses noprotect                //code not protected from reading
#fuses nodebug                  //no debug mode for icd
#fuses nobrownout               //no reset when brownout detected
#fuses nolvp                    //no low voltage programming on b3(pic16) or b5(pic18)
#fuses nocpd                    //no ee protection
#fuses nowrt                    //program memory not write protected
#use delay(clock = 20000000)    //libreria para generar retardos con un cristal de 20 mhz
#byte puerto_b = 06

void main(void)
{


set_tris_b( 0x01 ); // RB0 como entrada y lo demás del puerto B como salida
port_b_pullups(true);

while(true)
{
    while(INPUT(PIN_B0)==0)
    {                                     // Si se presiona RB0
        output_toggle(PIN_B1);       // cambia el estado del pin RB1
        while(input(pin_b0)==0);
    }
}
}
Este programa lo he copiado para utilizarlo en mi pic, pero no funciona, se lo cargo después de generar el archivo hex y no funciona, tengo dos pic con tarjeta entrenadora.
¿No sé qué pueda estar mal? Si me podrían ayudar se los agradecería mucho. :)
 
Última edición por un moderador:
Este programa lo he copiado para utilizarlo en mi pic, pero no funciona, se lo cargo después de generar el archivo hex y no funciona, tengo dos pic con tarjeta entrenadora.
¿No sé qué pueda estar mal? Si me podrían ayudar se los agradecería mucho. :)
En ese programa está mal la palabra de configuración para trabajar a 20MHz.
Aunque por estar activo el fuse FCMEN debe trabajar a 4MHz al activarse automáticamente el oscilador interno.

Prueba de esta forma:
Código:
#include <18f4550.h>
#fuses   nowdt,nofcmen,noieso,nopbaden,novregen,nobrownout
#use     delay(crystal = 20MHz)

void main(void)
{

port_b_pullups(true);

while(true)
{
   while(!input(PIN_B0))
   {                                // Si se presiona RB0
      output_toggle(PIN_B1);        // Cambia el estado del pin RB1
         delay_ms(100);                // Retardo antirebotes
      while(!input(PIN_B0));
   }
 }
}
Aquí ya está corregida la palabra de configuración para trabajar con un cristal de 20MHz.
El programa funciona perfectamente montado sobre un protoboard.
Si no funciona en tu tarjeta, verifica que la resistencia del pin RB0 no sea Pull-Down.
Nota que en el programa se están usando las resistencias Pull-Up internas del puerto B.

Suerte.
 
Hola; gracias ya pude hacer que funcionara pero no sé si me puedas ayudar con una explicación.
Lo que pasa es que mande un correo al proveedor que me las vendio, y me mando estos datos.

Con esta versión de firmware podrás reactivar tu entrenador, aunque no tendrás disponible la versión del programador.

Para los códigos de aplicación de usuario deberás re ubicar los vectores de reset e interrupción a las direcciones que se muestran a continuación, de lo contrario no funcionarán tus programas:

Código:
/*CONFIGURACION PIC*/

#include "18f4550.h"

#use delay(clock=48000000)
#build(reset=0x01000,interrupt=0x01008)
#org 0x0000,0xFFF {}
Entonces lo que hice fue un copy paste de esto al programa, claro que borré el # use delay 20 mhz que habías puesto y con esto funcionó.

¿No sé si me podrías decir a que hace referencia el # org 0x0000,0xFFF {} y si es posible usar esta configuración para el porta y portc, y si siempre tengo que poner #build(reset=0x01000,interrupt=0x01008)?
De antemano muchas gracias, un saludo.



Hice este programa, pero lo que pasa es que el led está encendido y cuando presiono el botón se apaga.
¿No sé si me podrías ayudar con esto a que lo haga de forma inversa?
¿O me podrías orientar en que estoy haciendo mal?
Tu programa me sirvo mucho y quería también preguntarte sobre este elemento output_toggle que pusiste en tu programa.

Código:
#include <18f4550.h>
#fuses nowdt,nofcmen,noieso,nopbaden,novregen,nobrownout

#use delay(clock=48000000)
#build(reset=0x01000,interrupt=0x01008)
#org 0x0000,0xFFF {}

 void main ()  {

 while (true) {
 
 if (input (pin_b0)) {
 output_low (pin_b4) ;

 }
 
 if (!input (pin_b0) ) {
 output_high (pin_b4); }
 }
 
 
 }
Muchas gracias por tu ayuda.
 
Última edición por un moderador:
¿No sé si me podrías decir a que hace referencia el # org 0x0000,0xFFF {} y si es posible usar esta configuración para el porta y portc, y si siempre tengo que poner #build(reset=0x01000,interrupt=0x01008)?
Esas directivas y más, están explicadas en el documento de ayuda del compilador de CCS.
Cuando tengas dudas sobre algo que no entiendas, dale una leída. :cool:

Vienen siendo algo así:
Como las directivas tienen varios parámetros solo pondré el propósito.
La ayuda de CCS sobre #BUILD dijo:
Los dispositivos PIC18FXXX con ROM externa o dispositivos PIC18XXX sin ROM interna pueden dirigir al compilador para utilizar la memoria ROM al enlazar múltiples unidades de compilación.
Esta directiva debe aparecer exactamente igual en cada unidad de compilación.
La ayuda de CCS sobre #ORG dijo:
Esta directiva fijará la siguiente función, declaración de constante o ROM en un área específica ROM.
End puede omitirse si un segmento se define previamente si solo deseas agregar otra función para el segmento.

Siga el ORG con un { } sólo para reservar la zona con nada insertado por el compilador.

La memoria RAM para una función ORG'd puede restablecerse a menor memoria para las variables locales y variables scratch se colocan en la memoria baja.
Esto sólo se debe usar si la función ORG'd no regresará a la persona que llama.
La memoria RAM utilizada se superpondrá a la memoria RAM del programa principal.
Añadir una AUTO = 0 al final de la línea #ORG.

Si la palabra clave DEFAULT se utiliza este rango de direcciones se utiliza para todas las funciones de usuario y compilador generado a partir de este punto en el archivo hasta que un DEFAULT #ORG se encuentra (sin rango de direcciones).
Si una función de compilación se llama desde el código generado mientras DEFAULT es en efecto el compilador genera una nueva versión de la función dentro del rango de direcciones especificado.

#ORG se puede utilizar para localizar los datos en la memoria ROM.
#ORG se puede utilizar para localizar los datos en la memoria ROM.
como las CONSTANTES se implementan como funciones de #ORG debe proceder la CONSTANTE y necesita una dirección de inicio y fin.
Para una declaración ROM sólo se debe especificar la dirección inicial .

Al vincular varias unidades de compilación tenga en cuenta esta directiva se aplica al archivo objeto final. Es un error si cualquier # ORG solapamientos entre los archivos a menos que el # ORG coincide exactamente.

Hice este programa, pero lo que pasa es que el led está encendido y cuando presiono el botón se apaga.
¿No sé si me podrías ayudar con esto a que lo haga de forma inversa?
¿O me podrías orientar en que estoy haciendo mal?
Tu programa me sirvo mucho y quería también preguntarte sobre este elemento output_toggle que pusiste en tu programa.
Tu programa funciona bien montado sobre un protoboard.
El led permanece apagado al iniciar el programa y cuando se presiona el botón se enciende.
Si al iniciar el PIC el led te aparece encendido, debe ser porque tu tarjeta usa resistencias pull-down en el puerto B y activas RB0 con positivo. Checa eso para que salgas de dudas.
Invierte la lógica del programa para que lo haga al revés. ;)

La instrucción OUTPUT_TOGGLE () lo que hace es cambiar de estado un pin.
Si estaba en 0 lo pone en 1 y viceversa.

Saludos.
 
muchas gracias de veras, gracias por tu ayuda, una ultima cosa no sabes de un libro o si en esta msima pag. podre encontrar informacion sobre los comando para la programación de pic en c, es que quiero seguir aprendiendo mas y claro hacer mas proyectos, muchas gracias por tus respuestas :)......saludosssssssssssssss
 
¿Sabes de un libro o si en esta misma página podré encontrar información sobre los comandos para la programación de pic en c?
Es que quiero seguir aprendiendo más y claro hacer mas proyectos.
En el Foro existen muchos proyectos y ejemplos en PICC que puedes encontrar a través del Buscador.

También puedes leer y consultar sobre estos temas por ejemplo:
Curso de programación en C para microcontroladores PIC

Programas para Pic C Compiler (Tutorial)


muchas gracias de veras, gracias por tu ayuda
De nada, suerte. (y)
 
Atrás
Arriba