Autor Tema: se me cruzan los ojos, jajaaj  (Leído 4111 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Bruno Mafra

  • PIC10
  • *
  • Mensajes: 33
se me cruzan los ojos, jajaaj
« 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;
         
          }
    }










Bruno Mafra

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:se me cruzan los ojos, jajaaj
« Respuesta #1 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.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Bruno Mafra

  • PIC10
  • *
  • Mensajes: 33
Re:se me cruzan los ojos, jajaaj
« Respuesta #2 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.
Bruno Mafra

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:se me cruzan los ojos, jajaaj
« Respuesta #3 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.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Bruno Mafra

  • PIC10
  • *
  • Mensajes: 33
Re:se me cruzan los ojos, jajaaj
« Respuesta #4 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.......
Bruno Mafra

Desconectado Bruno Mafra

  • PIC10
  • *
  • Mensajes: 33
Re:se me cruzan los ojos, jajaaj
« Respuesta #5 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..
Bruno Mafra

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:se me cruzan los ojos, jajaaj
« Respuesta #6 en: 23 de Mayo de 2023, 19:38:34 »
Entonces tu pulsador estaría "configurado" de la siguiente manera:



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. }
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:se me cruzan los ojos, jajaaj
« Respuesta #7 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. }
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Bruno Mafra

  • PIC10
  • *
  • Mensajes: 33
Re:se me cruzan los ojos, jajaaj
« Respuesta #8 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)
Bruno Mafra

Desconectado Bruno Mafra

  • PIC10
  • *
  • Mensajes: 33
Re:se me cruzan los ojos, jajaaj
« Respuesta #9 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);
                }
       }
}
Bruno Mafra

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:se me cruzan los ojos, jajaaj
« Respuesta #10 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.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:se me cruzan los ojos, jajaaj
« Respuesta #11 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. }
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Bruno Mafra

  • PIC10
  • *
  • Mensajes: 33
Re:se me cruzan los ojos, jajaaj
« Respuesta #12 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
Bruno Mafra

Desconectado Bruno Mafra

  • PIC10
  • *
  • Mensajes: 33
Re:se me cruzan los ojos, jajaaj
« Respuesta #13 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);
                        }
}

 

* img 2.png
(167.25 kB, 1610x963 - visto 262 veces)


 

* img 2.png
(167.25 kB, 1610x963 - visto 262 veces)


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.
Bruno Mafra

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:se me cruzan los ojos, jajaaj
« Respuesta #14 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)
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32