TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Bruno Mafra en 23 de Mayo de 2023, 18:34:55

Título: se me cruzan los ojos, jajaaj
Publicado por: Bruno Mafra en 23 de Mayo de 2023, 18:34:55
Alguien me sabe decir porque no me acaba de funcionar?

En un principio, la salida (D0) tiene que cambiar de 0-1 y 1-0 al pulsar (B0). esto funcionava hasta que añadí el contador, en que en una primera prueba, (D0) cambiaba de forma irregular, y el salto de (D1) a (D7) era tambien irregular. ahora no me funciona nada.. aparte de que (D1) empieza en estado 1 cuando deberia empezar en estado 0...... jajjajajajajajajaja

#include <16F877a.h>
#fuses XT,NOWDT,NOPUT,NOBROWNOUT,NOLVP,NOWRT
#use DELAY(CLOCK=20M)
#use fast_io(b)
#use fast_io(d)

int contador = 0;

void main()
{
    set_tris_b(0xff);
    set_tris_d(0x00);
    output_d(0x00);
   
    while(1)
    {
       if (input(pin_b0) == 1)
        {
         while ((input(pin_b0) == 1))
         delay_ms(10);
         output_toggle(pin_d0);
         }
               
         if (input(pin_b0) == 1)
         {
         contador++;
         }
         if (contador >6)
         {
         contador = 0;
         }
          switch (contador)
          {
           case 0:
           output_d(0b00000010);
           delay_ms(500);
           break;
           
           case 1:
           output_d(0b00000100);
           delay_ms(500);
           break;
           
           case 2:
           output_d(0b00001000);
           delay_ms(500);
           break;
           
           case 3:
           output_d(0b00010000);
           delay_ms(500);
           break;
           
           case 4:
           output_d(0b00100000);
           delay_ms(500);
           break;
           
           case 5:
           output_d(0b01000000);
           delay_ms(500);
           break;
           
           case 6:
           output_d(0b10000000);
           delay_ms(500);
           break;
         
          }
    }










Título: Re:se me cruzan los ojos, jajaaj
Publicado por: DominusDRR en 23 de Mayo de 2023, 18:42:44
Te sugeriría hacer un diagrama de flujo del proceso que deseas hacer, aunque no lo creas de mucha ayuda, sobre todo cuando aun no dominas la programación o el lenguaje que estás usando.
Título: Re:se me cruzan los ojos, jajaaj
Publicado por: Bruno Mafra en 23 de Mayo de 2023, 18:50:06
Te sugeriría hacer un diagrama de flujo del proceso que deseas hacer, aunque no lo creas de mucha ayuda, sobre todo cuando aun no dominas la programación o el lenguaje que estás usando.

Ok. Gracias
empezaré a hacerlo.
Título: Re:se me cruzan los ojos, jajaaj
Publicado por: DominusDRR en 23 de Mayo de 2023, 18:54:30
Pienso que tal vez te falta un ; en while ((input(pin_b0) == 1))

Es decir así:

Código: C
  1. while ((input(pin_b0) == 1));

Y estoy asumiendo que cuando presionas el pulsante, B0, cambia a 1 lógico, es decir su estado normal es cero.

Tendría revisar tu proyecto y tratar de comprender que intentas hacer, pero más tarde, u ojalá alguien con un poco más de tiempo,  pueda revisarlo.
Título: Re:se me cruzan los ojos, jajaaj
Publicado por: Bruno Mafra en 23 de Mayo de 2023, 19:15:56
Pienso que tal vez te falta un ; en while ((input(pin_b0) == 1))

Es decir así:

Código: C
  1. while ((input(pin_b0) == 1));

Y estoy asumiendo que cuando presionas el pulsante, B0, cambia a 1 lógico, es decir su estado normal es cero.

Tendría revisar tu proyecto y tratar de comprender que intentas hacer, pero más tarde, u ojalá alguien con un poco más de tiempo,  pueda revisarlo.

Si, correcto.
D0 es fluctuante, cambia de estado de 0 a 1 y de 1 a 0 cuando pulsas B0.
por su vez, cuando pulsas B0 tambiem activa el contador.

Esto seria al pulsar B0(varias veces):
B0=1, D0 y D1=1;
B0=0, D0=0 y D2=1;
B0=1, D0 y D3 =1;
B0=0, D0=0 y D4=1;
B0=1, D0 y D5=1;
B0=0, D0=0 y D6=1;
B0=1, D0 y D7 =1;
y vuelve a empezar.......
Título: Re:se me cruzan los ojos, jajaaj
Publicado por: Bruno Mafra en 23 de Mayo de 2023, 19:18:48
Pienso que tal vez te falta un ; en while ((input(pin_b0) == 1))

Es decir así:

Código: C
  1. while ((input(pin_b0) == 1));

Y estoy asumiendo que cuando presionas el pulsante, B0, cambia a 1 lógico, es decir su estado normal es cero.

Tendría revisar tu proyecto y tratar de comprender que intentas hacer, pero más tarde, u ojalá alguien con un poco más de tiempo,  pueda revisarlo.

no ha cambiado nada..
Título: Re:se me cruzan los ojos, jajaaj
Publicado por: DominusDRR en 23 de Mayo de 2023, 19:38:34
Entonces tu pulsador estaría "configurado" de la siguiente manera:

(https://blog.seeedstudio.com/wp-content/uploads/2020/02/image-39.png)

Suponiendo que los terminales están correctamente configurados como terminales digitales, (Comparador analógico y comparadores apagados)

Tu lo que debes tener en mente es que deseas desencadenar el proceso cuando presionas el pulsante, es decir:

Código: C
  1. while(1)
  2. {
  3.         if (input(pin_b0) == 1) //pulsante ha sido presionado
  4.         {
  5.            
  6.         }
  7. }

Luego que el pulsante ha sido presionado, esperas a que el usuario lo suelte, para eso usas el while:

Código: C
  1. while(1)
  2. {
  3.         if (input(pin_b0) == 1) //pulsante ha sido presionado
  4.         {
  5.                 while ((input(pin_b0) == 1)); // espero a que el usuario deje de presionar el pulsante
  6.                
  7.                
  8.         }
  9. }

El retardo de 10 ms, para eliminar el rebote, no pienso que sea importante, ya que vas usar retardos de 500ms, luego así que tu código podría quedar así:

Código: C
  1. void main()
  2. {
  3.     set_tris_b(0xff);
  4.     set_tris_d(0x00);
  5.     output_d(0x00);
  6.    
  7.     contador = 0x00; //inicializo el contador
  8.     while(1)
  9.     {
  10.                 if (input(pin_b0) == 1) //pulsante ha sido presionado
  11.                 {
  12.                         while ((input(pin_b0) == 1)); // espero a que el usuario deje de presionar el pulsante
  13.                         switch (contador)
  14.                         {
  15.                                 case 0: output_d(0b00000010); break;
  16.                                 case 1: output_d(0b00000100); break;
  17.                                 case 2: output_d(0b00001000); break;
  18.                                 case 3: output_d(0b00010000); break;
  19.                                 case 4: output_d(0b00100000); break;
  20.                                 case 5: output_d(0b01000000); break;
  21.                                 default:
  22.                                         output_d(0b10000000);
  23.                                         contador = 0x00;
  24.                                         break;
  25.                         }
  26.                         contador++;
  27.                         delay_ms(500);
  28.                 }
  29.     }
  30. }
Título: Re:se me cruzan los ojos, jajaaj
Publicado por: DominusDRR en 23 de Mayo de 2023, 19:41:26
Hay un error en el código cuando contador llega a 6, creo que es mejor así:

Código: C
  1. void main()
  2. {
  3.     set_tris_b(0xff);
  4.     set_tris_d(0x00);
  5.     output_d(0x00);
  6.    
  7.         contador = 0x00; //inicializo el contador
  8.         while(1)
  9.         {
  10.                 if (input(pin_b0) == 1) //pulsante ha sido presionado
  11.                 {
  12.                         while ((input(pin_b0) == 1)); // espero a que el usuario deje de presionar el pulsante
  13.                         switch (contador)
  14.                         {
  15.                                 case 0: output_d(0b00000010); break;
  16.                                 case 1: output_d(0b00000100); break;
  17.                                 case 2: output_d(0b00001000); break;
  18.                                 case 3: output_d(0b00010000); break;
  19.                                 case 4: output_d(0b00100000); break;
  20.                                 case 5: output_d(0b01000000); break;
  21.                                 default:output_d(0b10000000); break;
  22.                         }
  23.                         contador++;
  24.                         if (contador > 0x06) contador = 0x00;
  25.                         delay_ms(500);
  26.                 }
  27.        }
  28. }
Título: Re:se me cruzan los ojos, jajaaj
Publicado por: Bruno Mafra en 23 de Mayo de 2023, 20:05:55
Hay un error en el código cuando contador llega a 6, creo que es mejor así:

Código: C
  1. void main()
  2. {
  3.     set_tris_b(0xff);
  4.     set_tris_d(0x00);
  5.     output_d(0x00);
  6.    
  7.         contador = 0x00; //inicializo el contador
  8.         while(1)
  9.         {
  10.                 if (input(pin_b0) == 1) //pulsante ha sido presionado
  11.                 {
  12.                         while ((input(pin_b0) == 1)); // espero a que el usuario deje de presionar el pulsante
  13.                         switch (contador)
  14.                         {
  15.                                 case 0: output_d(0b00000010); break;
  16.                                 case 1: output_d(0b00000100); break;
  17.                                 case 2: output_d(0b00001000); break;
  18.                                 case 3: output_d(0b00010000); break;
  19.                                 case 4: output_d(0b00100000); break;
  20.                                 case 5: output_d(0b01000000); break;
  21.                                 default:output_d(0b10000000); break;
  22.                         }
  23.                         contador++;
  24.                         if (contador > 0x06) contador = 0x00;
  25.                         delay_ms(500);
  26.                 }
  27.        }
  28. }

Debo decir que tu codigo es bastante mas simple que el mio y que funciona perfectamente.
Pero le falta la primera parte del mio.

                         while ((input(pin_b0) == 1));    /* anti rebote
                         delay_ms(10);                          por software  */
                         output_toggle(pin_d0);          // salida variable entre 0 y 1 cada vez que se pulsa b0


El --- output_toggle(pin_do) ----- ni logro que funcione cuando funciona el contador (sin el, funciona perfectamente)
Título: Re:se me cruzan los ojos, jajaaj
Publicado por: Bruno Mafra en 23 de Mayo de 2023, 20:26:22
OK, veamos.. he logrado que funcione, añadiendo el "toggle" al fina de tu codigo. lo unico, que al hacer - default y volver a empezar, no me cuenta el pulso en el toggle.....

                       }
                        contador++;
                        if (contador > 0x06) contador = 0x00;
                        while (input(pin_b0) == 1)
                        delay_ms(10);
                        output_toggle(pin_d0);
                }
       }
}
Título: Re:se me cruzan los ojos, jajaaj
Publicado por: DominusDRR en 23 de Mayo de 2023, 20:47:24
OK, veamos.. he logrado que funcione, añadiendo el "toggle" al fina de tu codigo. lo unico, que al hacer - default y volver a empezar, no me cuenta el pulso en el toggle.....

                       }
                        contador++;
                        if (contador > 0x06) contador = 0x00;
                        while (input(pin_b0) == 1)
                        delay_ms(10);
                        output_toggle(pin_d0);
                }
       }
}
Si, he olvidé del cambio de estado en D0, pero en este momento me he dado cuenta que estás cambiando en dos lugares el estado del bit0 del puerto, el primero con toogle y luego dentro del switch.

Pienso que lo que quieres hacer con D0 debe ser en el bit de otro puerto, o realizar el movimiento de los leds desde el bit 1 al bit 7 del puerto, manteniendo intacto el estado de D0.
Título: Re:se me cruzan los ojos, jajaaj
Publicado por: DominusDRR en 23 de Mayo de 2023, 20:58:31
Para que le veas más claro, y sin recurrir a enmascaramientos, tal vez sea así el código:

Código: C
  1. void main()
  2. {
  3.     set_tris_b(0xff);
  4.     set_tris_d(0x00);
  5.     output_d(0x00);
  6.    
  7.         contador = 0x00; //inicializo el contador
  8.         output_d(0b00000000); // pongo a cero todos los bits de d
  9.         while(1)
  10.         {
  11.                 if (input(pin_b0) == 1) //pulsante ha sido presionado
  12.                 {
  13.                         while ((input(pin_b0) == 1)); // espero a que el usuario deje de presionar el pulsante
  14.                         delay_ms(10);
  15.                         output_toggle(pin_d0);
  16.                         switch (contador)
  17.                         {
  18.                                 case 0: output_clear(pin_d7); output_set(pin_d1); break;
  19.                                 case 1: output_clear(pin_d1); output_set(pin_d2):break;
  20.                                 case 2: output_clear(pin_d2); output_set(pin_d3);break;
  21.                                 case 3: output_clear(pin_d3); output_set(pin_d4);break;
  22.                                 case 4: output_clear(pin_d4); output_set(pin_d5);break;
  23.                                 case 5: output_clear(pin_d5); output_set(pin_d6);break;
  24.                                 default:output_clear(pin_d6); output_set(pin_d7); break;
  25.                         }
  26.                         contador++;
  27.                         if (contador > 0x06) contador = 0x00;
  28.                         delay_ms(500);
  29.                 }
  30.        }
  31. }
Título: Re:se me cruzan los ojos, jajaaj
Publicado por: Bruno Mafra en 23 de Mayo de 2023, 21:12:07
Para que le veas más claro, y sin recurrir a enmascaramientos, tal vez sea así el código:

Código: C
  1. void main()
  2. {
  3.     set_tris_b(0xff);
  4.     set_tris_d(0x00);
  5.     output_d(0x00);
  6.    
  7.         contador = 0x00; //inicializo el contador
  8.         output_d(0b00000000); // pongo a cero todos los bits de d
  9.         while(1)
  10.         {
  11.                 if (input(pin_b0) == 1) //pulsante ha sido presionado
  12.                 {
  13.                         while ((input(pin_b0) == 1)); // espero a que el usuario deje de presionar el pulsante
  14.                         delay_ms(10);
  15.                         output_toggle(pin_d0);
  16.                         switch (contador)
  17.                         {
  18.                                 case 0: output_clear(pin_d7); output_set(pin_d1); break;
  19.                                 case 1: output_clear(pin_d1); output_set(pin_d2):break;
  20.                                 case 2: output_clear(pin_d2); output_set(pin_d3);break;
  21.                                 case 3: output_clear(pin_d3); output_set(pin_d4);break;
  22.                                 case 4: output_clear(pin_d4); output_set(pin_d5);break;
  23.                                 case 5: output_clear(pin_d5); output_set(pin_d6);break;
  24.                                 default:output_clear(pin_d6); output_set(pin_d7); break;
  25.                         }
  26.                         contador++;
  27.                         if (contador > 0x06) contador = 0x00;
  28.                         delay_ms(500);
  29.                 }
  30.        }
  31. }

No, amigo..

14 errores con la nueva modificacion..

output clear & output set
Título: Re:se me cruzan los ojos, jajaaj
Publicado por: Bruno Mafra en 23 de Mayo de 2023, 21:21:15
#include <16F877a.h>
#fuses XT,NOWDT,NOPUT,NOBROWNOUT,NOLVP,NOWRT
#use DELAY(CLOCK=20M)
#use fast_io(b)
#use fast_io(d)

int contador = 0;

void main()
{
    set_tris_b(0xff);
    set_tris_d(0x00);
    output_d(0x00);
   
    while(1)
    {
       
                if (input(pin_b0) == 1) //pulsante ha sido presionado
                {
                         
                         
                        while ((input(pin_b0) == 1)); // espero a que el usuario deje de presionar el pulsante
                        switch (contador)
                       
                        {
                                case 0: output_d(0b00000011); break;
                                case 1: output_d(0b00000100); break;
                                case 2: output_d(0b00001001); break;
                                case 3: output_d(0b00010000); break;
                                case 4: output_d(0b00100001); break;
                                case 5: output_d(0b01000000); break;
                                default:output_d(0b10000001); break;
                        }
                        contador++;
                       
                        if (contador > 0x06) contador = 0x00;
                       
                       
                }
       }
}
void toggle()
{                       
                        if (input(pin_b0) == 1)
                        {
                       
                        while (input(pin_b0) == 1)
                        delay_ms(10);
                        output_toggle(pin_d0);
                        }
}

  - Tienes que ingresar para ver archivos adjuntos -  

  - Tienes que ingresar para ver archivos adjuntos -  

si te fijas, al llegar a D7, D0 estan encendidos. pero al volver a empezar, cuando D1 se enciende, D0 tendria que estar apagado, al ser impar.
Título: Re:se me cruzan los ojos, jajaaj
Publicado por: DominusDRR en 23 de Mayo de 2023, 21:32:55
Para que le veas más claro, y sin recurrir a enmascaramientos, tal vez sea así el código:

Código: C
  1. void main()
  2. {
  3.     set_tris_b(0xff);
  4.     set_tris_d(0x00);
  5.     output_d(0x00);
  6.    
  7.         contador = 0x00; //inicializo el contador
  8.         output_d(0b00000000); // pongo a cero todos los bits de d
  9.         while(1)
  10.         {
  11.                 if (input(pin_b0) == 1) //pulsante ha sido presionado
  12.                 {
  13.                         while ((input(pin_b0) == 1)); // espero a que el usuario deje de presionar el pulsante
  14.                         delay_ms(10);
  15.                         output_toggle(pin_d0);
  16.                         switch (contador)
  17.                         {
  18.                                 case 0: output_clear(pin_d7); output_set(pin_d1); break;
  19.                                 case 1: output_clear(pin_d1); output_set(pin_d2):break;
  20.                                 case 2: output_clear(pin_d2); output_set(pin_d3);break;
  21.                                 case 3: output_clear(pin_d3); output_set(pin_d4);break;
  22.                                 case 4: output_clear(pin_d4); output_set(pin_d5);break;
  23.                                 case 5: output_clear(pin_d5); output_set(pin_d6);break;
  24.                                 default:output_clear(pin_d6); output_set(pin_d7); break;
  25.                         }
  26.                         contador++;
  27.                         if (contador > 0x06) contador = 0x00;
  28.                         delay_ms(500);
  29.                 }
  30.        }
  31. }

No, amigo..

14 errores con la nueva modificacion..

output clear & output set

me imagino que el error (errores que no indicas que dicen o que son) es porque las instrucciones output_clear y output_set me las he sacado del sombrero, ya que nunca has mencionado que compilador estás usando.

Debe existir una instrucción para poner en 1 lógico a un bit de un puerto (output_set) y de igual manera para limpiarlo (output_clear)
Título: Re:se me cruzan los ojos, jajaaj
Publicado por: Bruno Mafra en 24 de Mayo de 2023, 05:31:49
PIC C compiler

  - Tienes que ingresar para ver archivos adjuntos -  
Título: Re:se me cruzan los ojos, jajaaj
Publicado por: Bruno Mafra en 24 de Mayo de 2023, 07:16:51
OK, finalmente he conseguido el efecto que queria, pero he tenido que usar la salida de otro puerto.(no se bien porque).

void main()
{
    set_tris_b(0xff);
    set_tris_d(0x00);
    output_d(0x00);
    set_tris_c(0x00);
    output_c(0x00);   
    while(1)
    {
                        if (input(pin_b0) == 1) //pulsante ha sido presionado
                {
                         
                         
                        while ((input(pin_b0) == 1)); // espero a que el usuario deje de presionar el pulsante
                        switch (contador)
                       
                        {
                                case 0: output_d(0b00000010);output_toggle(pin_c0); break;
                                case 1: output_d(0b00000100);output_toggle(pin_c0); break;
                                case 2: output_d(0b00001000);output_toggle(pin_c0); break;
                                case 3: output_d(0b00010000);output_toggle(pin_c0); break;
                                case 4: output_d(0b00100000);output_toggle(pin_c0); break;
                                case 5: output_d(0b01000000);output_toggle(pin_c0); break;
                                default:output_d(0b10000000);output_toggle(pin_c0); break;
                        }
                        contador++;
                       
                        if (contador > 0x06) contador = 0x00;
                       
                       
                }
       }
}
Título: Re:se me cruzan los ojos, jajaaj
Publicado por: DominusDRR en 24 de Mayo de 2023, 10:04:43
PIC C compiler

  - Tienes que ingresar para ver archivos adjuntos -

Es lo que te dije, está claro, esas funciones no existen, y leyendo el manual, (algo que deberías hacer) las función pra poner en 1 lógico es output_high y para poner en cero lógico es output_low; es decir quedaría así:

Código: C
  1. case 0: output_low(pin_d7);output_high(pin_d1); break;
  2. case 1: output_low(pin_d1); output_high(pin_d2):break;
  3. case 2: output_low(pin_d2); output_high(pin_d3);break;
  4. case 3: output_low(pin_d3); output_high(pin_d4);break;
  5. case 4: output_low(pin_d4); output_high(pin_d5);break;
  6. case 5: output_low(pin_d5); output_high(pin_d6);break;
  7. default:output_low(pin_d6); output_high(pin_d7);


Título: Re:se me cruzan los ojos, jajaaj
Publicado por: DominusDRR en 24 de Mayo de 2023, 10:17:06
OK, finalmente he conseguido el efecto que queria, pero he tenido que usar la salida de otro puerto.(no se bien porque).

void main()
{
    set_tris_b(0xff);
    set_tris_d(0x00);
    output_d(0x00);
    set_tris_c(0x00);
    output_c(0x00);   
    while(1)
    {
                        if (input(pin_b0) == 1) //pulsante ha sido presionado
                {
                         
                         
                        while ((input(pin_b0) == 1)); // espero a que el usuario deje de presionar el pulsante
                        switch (contador)
                       
                        {
                                case 0: output_d(0b00000010);output_toggle(pin_c0); break;
                                case 1: output_d(0b00000100);output_toggle(pin_c0); break;
                                case 2: output_d(0b00001000);output_toggle(pin_c0); break;
                                case 3: output_d(0b00010000);output_toggle(pin_c0); break;
                                case 4: output_d(0b00100000);output_toggle(pin_c0); break;
                                case 5: output_d(0b01000000);output_toggle(pin_c0); break;
                                default:output_d(0b10000000);output_toggle(pin_c0); break;
                        }
                        contador++;
                       
                        if (contador > 0x06) contador = 0x00;
                       
                       
                }
       }
}

No me parece un código optimizado, output_toggle lo usas a cada rato similar al código original que tenía muchos delayMS(500), cuando puedes tener uno solo.
Si deseas usarlo deberías hacerlo así:


Código: C
  1. switch (contador)
  2. {
  3.               case 0: output_d(0b00000010); break;
  4.                                 case 1: output_d(0b00000100); break;
  5.                                 case 2: output_d(0b00001000); break;
  6.                                 case 3: output_d(0b00010000); break;
  7.                                 case 4: output_d(0b00100000); break;
  8.                                 case 5: output_d(0b01000000); break;
  9.                                 default:output_d(0b10000000); break;
  10.                         }
  11.                         output_toggle(pin_c0);
  12.                         contador++;

Otro consejo, vi que usas el proteus para simular tu hardware, podrías usarlo para depurar (debugging) y podrías ir paso a paso en tu código y ver hasta donde llega.

Título: Re:se me cruzan los ojos, jajaaj
Publicado por: Bruno Mafra en 24 de Mayo de 2023, 10:59:17
Gracias. Todo ayuda, tan solo hace 4 dias que empecé a "estudiar" lenguaje C para PICs. Youtube, libros que me habéis recomendado y otros que busco yo.
Estoy seguro del largo camino que me queda adelante, por eso les agradezco a cada uno la paciencia y las ayudas de cada dia.

Sois los mejores ((:-))