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

Temas similares

20/10/2007 #1


Encender varios leds en C
como están quiero hacer un programa que cuando toque un pulsador se prendan varios led, alguien tiene algún modelo o me puede dar una idea de como se hace en lenguaje C
20/10/2007 #2


Hola, aqui te paso un ejemplo sencillo para encender un led al presionar un push button y un diagrama de como conectarlo, es un ejemplo muy básico (apenas voy empezando en esto de la programación C) pero te puede servir.
21/10/2007 #3


como esta amigo pic-man ese ejemplo me ayudo un poco pero lo que necesito es que cuando yo precione el push button el led se quede encendido hasta que yo lo precione de nuevo, osea que funcione como un interructor
23/10/2007 #4


J.D.R. dijo:
como esta amigo pic-man ese ejemplo me ayudo un poco pero lo que necesito es que cuando yo precione el push button el led se quede encendido hasta que yo lo precione de nuevo, osea que funcione como un interructor
Podes usar una variable auxiliar y que el LED siga a la variable auxiliar.

El punto es que tengas en cuenta el rebote del pulsador así como solamente tomar el cambio cuando el usuario pulse el boton pero no salir de la rutina hasta que no lo suelte, todo esto es para que no esté permanentemente cambiando el LED.

La salida puedes usar una XOR, si tienes tu pin definido puedes hacer algo asi como

PIN ^= 1;

Saludos
23/10/2007 #5


maunix yo intenté hacer lo que dijiste en el CCS pero el compilador me marcaba algunos errores, el problema es que no se programar en C y aunque ya estoy documentandome y leyendo un libro de C quisiera, si tuvieras tiempo, que me dijeras como se podría modificar el programa que yo hice para que el led se mantuviera encendido hasta que se volviera a presionar el botón, quiero aprender y ya estoy en ello pero muchas veces los ejemplos son buenos maestros
23/10/2007 #6


pic-man dijo:
maunix yo intenté hacer lo que dijiste en el CCS pero el compilador me marcaba algunos errores, el problema es que no se programar en C y aunque ya estoy documentandome y leyendo un libro de C quisiera, si tuvieras tiempo, que me dijeras como se podría modificar el programa que yo hice para que el led se mantuviera encendido hasta que se volviera a presionar el botón, quiero aprender y ya estoy en ello pero muchas veces los ejemplos son buenos maestros
pic-man, no uso CCS por ello no puedo compilar el proyecto pero si me dices qué errores te tira tal vez te pueda dar una mano.
23/10/2007 #7


El error ahora no lo recuerdo, pero ya logré solucionar el problema que planteó J.D.R. utilizando la función OUTPUT_TOGGLE() del compilador CCS, resultó ser muy sencillo, ahora al pulsar el botón se enciende el led y permanece encendido hasta que se vuelve a pulsar, este es el código:
Código:
void main()
{

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);
}
Adjunto de nuevo un archivo comprimido con el código y el esquemático para este proyecto.

maunix, qué compilador usas tú? Yo soy nuevo en esto y el CCS fue el primero que instalé pero me gustaría tambien probar otros para poder ver cual me funcionaría mejor, me puedes recomendar alguno?
Archivos Adjuntos
Tipo de Archivo: zip pulsador_116.zip (11,9 KB (Kilobytes), 782 visitas)
25/10/2007 #8


A mi me gusta le C18 para los 18F, y el Hi.tech para los 16F aunque no lo he usado mucho , en los 16f programo todo en assembly porque hace años lo hago y tengo muchas cosas ya desarrolladas, probadas y que sé que funcionan.

El defecto que le veo a tu soft es que si hay rebotes puede que se la pase titilando un buen rato solo. Yo que después de verificar el input, hago un retardo de tiempo y lo vuelvo a verificar, no se 5 veces y si en las 5 veces estuvo desactivado entonces es porque realmente se soltó la tecla.
27/10/2007 #9


comos les va probé ese programa en un protoboards y no me funciona lo hice con el 628A y el 84A y no me funciona y ya lo e armado y desarmado unas cuantas veces incluso lo cambie de protoboards y sigue igual no me da ninguna respuesta sera por el rebote del pulsador o que
28/10/2007 #10


yo tambien soy un novatillo en esto, pero he estado practicando, hice un pequeño programa para encender y apagar un led cuando pulsas el pulsador, pero tuve en cuenta un pequeño rebote, lo pongo aqui, en la simulación lo probé y funciona, supongo que a la hora de la verdad también funcionara. El microcontrolador es el pic16f84
Código:
//// Programa para encender y apagar un led pulsando un pulsador ////

#include <16f84a.h>                 // incluimos la libreria para este pic
#fuses XT,NOWDT,NOPROTECT           // configuramos los fusibles de programacion
                                    // XT - cristal de cuarzo
                                    // NOWDWT - no perro guardian
                                    // NOPROTECT - no protegido
#use delay(clock=4000000)           // velocidad de reloj en HZ



//// Declaración de variables ////

#byte pb = 6   // puerto B
#byte pa = 5   // puerto A

//// Configuramos salidas y entradas ////


void main (void)
{
pb = 0;
set_tris_b (0x00);                  // Declaramos puerto B como salida
set_tris_a (0x1F);                  // Declaramos puerto A como entrada

   DO
   {
      If (!input (PIN_A0))          // Si la entrada es 0
      {  delay_ms (10);             // esperamos 10 ms
         If (!input (PIN_A0))       // comprobamos otra vez la entrada sea 0, por temas de rebote
         {  do { } while (!input (PIN_A0));  // esperar a soltar el boton
            pb = ~pb;               // el puerto b cambia al complementario.
         }
         
      }
   } WHILE (TRUE);                  // Bucle infinito 
}
05/11/2007 #11


Pregunta
Buena Tardes,

tambien soy novato en estos temas, me gustaria conocer con programa quemo el pic.
saludes.
22/12/2010 #12


encender varios led en c#
hola amigo he leido tu trabajo y te felicito he visto que has trabajado mucho y el proyecto se entiende.
Por casualidad sabras hacer lo mismo en visual c# pero apagar y ensender un led desde el pc, osea si en pulsador? seria interesante, mas aun si lo logras explicar todo como lo has hecho con este proyecto. De antemano muchas gracias...
28/01/2011 #13


Aguno de ustedes me podria ayudar a hacer esto mismo pero con Pic Basic Pro, estoy aprendiendo apenas a utlizar este compilador y me gustaria tambien poder implementarlo. O si en PBP existe alguna instruccion como la que comenta en el programa para que cambie al complementario.

pb = ~pb; // el puerto b cambia al complementario.
28/01/2011 #14

Avatar de gzaloprgm

No deberías haber respondido en el mismo thread, pero en PBP es bastante sencillo hacerlo:

Código:
LED VAR PORTB.0 'Declaramos la dirección de LED

Toggle LED 'Invertimos el estado de led
Led = 0 'Apagamos led
Led = 1 'Prendemos led
Un saludo,
Gonzalo
30/05/2011 #15


Alguno de ustedes me podría ayudar a contar la cantidad de veces que se ha pulsado el pulsador y que mientras sea menos de dos veces no se encienda el led?. Gracias y saludos
28/09/2011 #16


Buenas a todos, pues yo siempre me complico mucho y me salio este codigo, estoy empezando como todos vosotros, eso si, yo lo que hago es contar las pulsaciones para apagarlo y encenderlo:

#include <16F628A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#use delay(clock=4000000,RESTART_WDT)
#byte puerto_a = 5
#byte puerto_b = 6

void main()
{ int a;
SET_TRIS_A ( 0b01100 );
SET_TRIS_B ( 0b00000011 );
puerto_a=0; //reincio puerto a 0
puerto_b=0 ; //reincio puerto a 0

while ( TRUE ){

if (input(pin_b1)==1){
delay_ms(400); //antirebote
a=a+1;}

if (a==1){
output_high(PIN_B2);}


if (a==2){
output_low(PIN_B2);
a=0;}
}
}
23/05/2012 #17


Hola a todos. Me acabo de registrar , porque me parece interesante ese foro.
tengo una pregunta y espero que alguen sepa resolvermela :

#include <16f877A.H>
#use delay (clock=4000000)
//-----------------------------------------------------------
#byte port_a = 5
#byte port_b = 6
#byte port_c = 7
#byte port_d = 8
#byte port_e = 9

//---------------Programa Principal---------------------------------
void main ()
{
set_tris_b(0x00); // Salida
set_tris_d(0xFF); // Entradas
do
{
if(input(pin_d0))
{
output_toggle(pin_b0);
delay_ms(250);
}
}
while(TRUE);
}

PORQUE NO FUNCIONA??
23/08/2012 #18


yo trabajo en algo parecido . como hacer esto con un pulsador en cada entrada puertos b y varios leds en las salidas puertos a y que cada uno controle el led correspondiente pulsador en pin_A0) controla led en pin_b0) . pin_A) controla led en pin_b1) etc..
30/08/2012 #19


Hola a todos, al igual que muchos soy novato en esto de la programacion de PIC´s, estoy trabajando con pic-c compiler e hice este codigo para encender y apagar un led con un pulsador, pero no he podido incluir mas pulsadores u leds, necesito prender 4 leds con cuatro pulsadores, alguno me puede dar una idea?. Quedo atento a sus comentarios.

Código:
#include <Ejercicio1-D.h>
#use delay (clock=4MHz)
#byte puerto_c=0x07
#byte trisc=0x87
#byte puerto_d=0x08
#byte trisd=0x88
//#byte OPTION_REG = 0X70    //Deshabilitar Resistencias de Pull-up en los Bits
                           // de menor peso.

void main()
{
set_tris_C(0);             // Puerto C como Entrada 
puerto_c = 0xF0;           // Puerto C bits de menor peso 
set_tris_D(0);             // Puerto D como salidas digitales
puerto_d = 0x0F;           // Puerto D bits de menor peso 

DO
 {
  IF (INPUT(PIN_C0))      // Si se presiona RC0
    {
    output_toggle(PIN_D0);  // cambia el estado del pin RD0
    // Esta función cambia de estado el LED por medio de la instrucción interna 
    // del compiladoroutput_toggle() que simplemente cambia el estado actual, 
    // si esta en 1, se cambia a 0; si estuviera en 0 a 1.
    
   (INPUT(PIN_C0));  // Espera a que se suelte el botón
    }
}

WHILE(TRUE);
}
17/10/2012 #20


PIC16F877a encendido y apagado de 8 LED's en lenguaje C
Saludos colegas,

Voy empezando a trabajar con los microcontroladores y en este caso me hice de un PIC16F877a porque lo necesito para la escuela.

En fin, estoy usando el PCW para programar y necesito ayuda porque he estado viendo algunos tutoriales pero son únicamente para simulaciones en proteus, que al implementarlos no funcionan. En base a los tutoriales vistos yo realice el programa que más abajo les anexo y que no funciona implementado porque me faltan declarar muchas cosas como entradas y salidas, por ejemplo. Quisiera saber si alguien me puede ayudar con el programa, este consiste en que si la entrada RB0 recibe una señal a través de un push button, la salida RC0 nos de una señal que encienda un LED, si la entrada RB1 recibe una señal, el RC1 encienda un LED y así sucesivamente hasta completar del RB0 al RB7 y del RC0 al REC7 y de esta forma si presionamos el push buttom 1 se prende el LED 1, pero que solo se encienda mientras lo mantengamos oprimido, si lo soltamos que se apague y así con los demás push buttoms y LED's.

Código:
void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); //Todos estos setup yo no los declare,
   setup_timer_1(T1_DISABLED);                         al utilizar el wizard me los arrojo
   setup_timer_2(T2_DISABLED,0,1);                    por default.
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

while (true) {

if (input (pin_b0)) {
output_high(pin_c0);
}
if (!input (pin_b0)) {
output_low(pin_c0);
}

if (input (pin_b1)) {
output_high(pin_c1);
}
if (!input (pin_b1)) {
output_low(pin_c1);
}
if (input (pin_b2)) {
output_high(pin_c2);
}
if (!input (pin_b2)) {
output_low(pin_c2);
}
if (input (pin_b3)) {
output_high(pin_c3);
}
if (!input (pin_b3)) {
output_low(pin_c3);
}
if (input (pin_b4)) {
output_high(pin_c4);
}
if (!input (pin_b4)) {
output_low(pin_c4);
}
if (input (pin_b5)) {
output_high(pin_c5);
}
if (!input (pin_b5)) {
output_low(pin_c5);
}
if (input (pin_b6)) {
output_high(pin_c6);
}
if (!input (pin_b6)) {
output_low(pin_c6);
}
if (input (pin_b7)) {
output_high(pin_c7);
}
if (!input (pin_b7)) {
output_low(pin_c7);
}

}
}
De antemano, gracias.

Saludos.
¿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 - 2014, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.