Autor Tema: DTMF ccs c  (Leído 3618 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re:DTMF ccs c
« Respuesta #30 en: 26 de Abril de 2023, 01:58:55 »
Código: C++
  1. if(contador>=6)
  2. {
  3. contador=0;
  4. if((Dig[0]==11)&&(Dig[1]==1)&&(Dig[2]==2)&&(Dig[3]==3)&&(Dig[4]==4)&&(Dig[5]==12)) { Led_verde    }       // * 1 2 3 4 #        
  5. if((Dig[0]==11)&&(Dig[1]==1)&&(Dig[2]==9)&&(Dig[3]==3)&&(Dig[4]==7)&&(Dig[5]==12)) { Led_naranja  }       // * 1 9 3 7 #        
  6. if((Dig[0]==11)&&(Dig[1]==4)&&(Dig[2]==8)&&(Dig[3]==6)&&(Dig[4]==2)&&(Dig[5]==12)) { Led_rojo     }       // * 4 8 6 2 #
  7. if((Dig[0]==11)&&(Dig[1]==2)&&(Dig[2]==6)&&(Dig[3]==8)&&(Dig[4]==4)&&(Dig[5]==12)) { Led_Apagados }       // * 2 6 8 4 #
  8.      
  9. else Dig[0]=0; Dig[1]=0; Dig[2]=0; Dig[3]=0; Dig[4]=0; Dig[5]=0;
  10. }


Tu programa tiene algunos errores de notación que pueden provocar que el funcionamiento no sea el que se desea. Básicamente después de cada instrucción debes poner ";", y los bloques que quieras que se ejecuten juntos, tienen que estar encerrados entre llaves.
Te falta el ";" al final de cada sentencia if, y te falta encerrar entre llaves el bloque en el que se inicializan los dígitos.
Aparte, aunque no afecta al funcionamiento, a mí me gusta poner cada instrucción en una línea, y las acciones después de los if en la línea posterior y con sangría, lo que mejora la legibilidad.
Quedaría así:

Código: C++
  1. if(contador>=6)
  2.    {
  3.    contador=0;
  4.    if((Dig[0]==11)&&(Dig[1]==1)&&(Dig[2]==2)&&(Dig[3]==3)&&(Dig[4]==4)&&(Dig[5]==12))
  5.       { Led_verde    };       // * 1 2 3 4 #        
  6.    if((Dig[0]==11)&&(Dig[1]==1)&&(Dig[2]==9)&&(Dig[3]==3)&&(Dig[4]==7)&&(Dig[5]==12))
  7.       { Led_naranja  };       // * 1 9 3 7 #        
  8.    if((Dig[0]==11)&&(Dig[1]==4)&&(Dig[2]==8)&&(Dig[3]==6)&&(Dig[4]==2)&&(Dig[5]==12))
  9.       { Led_rojo     };       // * 4 8 6 2 #
  10.    if((Dig[0]==11)&&(Dig[1]==2)&&(Dig[2]==6)&&(Dig[3]==8)&&(Dig[4]==4)&&(Dig[5]==12))
  11.       { Led_Apagados };       // * 2 6 8 4 #  
  12.    else {
  13.       Dig[0]=0;
  14.       Dig[1]=0;
  15.       Dig[2]=0;
  16.       Dig[3]=0;
  17.       Dig[4]=0;
  18.       Dig[5]=0;
  19.    }
  20. }

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 114
Re:DTMF ccs c
« Respuesta #31 en: 26 de Abril de 2023, 08:28:36 »

Así me marco error el compilador.
   
Citar
if(contador>=6)
   {
   contador=0;
   if((Dig[0]==11)&&(Dig[1]==1)&&(Dig[2]==2)&&(Dig[3]==3)&&(Dig[4]==4)&&(Dig[5]==12))
      { Led_verde    };       // * 1 2 3 4 #       
   if((Dig[0]==11)&&(Dig[1]==1)&&(Dig[2]==9)&&(Dig[3]==3)&&(Dig[4]==7)&&(Dig[5]==12))
      { Led_naranja  };       // * 1 9 3 7 #       
   if((Dig[0]==11)&&(Dig[1]==4)&&(Dig[2]==8)&&(Dig[3]==6)&&(Dig[4]==2)&&(Dig[5]==12))
      { Led_rojo     };       // * 4 8 6 2 #
   if((Dig[0]==11)&&(Dig[1]==2)&&(Dig[2]==6)&&(Dig[3]==8)&&(Dig[4]==4)&&(Dig[5]==12))
      { Led_Apagados };       // * 2 6 8 4 #   
   else {
      Dig[0]=0;
      Dig[1]=0;
      Dig[2]=0;
      Dig[3]=0;
      Dig[4]=0;
      Dig[5]=0;
   }
}


Deje el else fuera de la condición if(contador>=6) y ahora compila y acepta los ;. Espero este bien de esa manera.

Quedaría así...

Código: C++
  1. if(contador>=6)
  2.          {
  3.          contador=0;
  4.          if((Dig[0]==11)&&(Dig[1]==1)&&(Dig[2]==2)&&(Dig[3]==3)&&(Dig[4]==4)&&(Dig[5]==12))
  5.          { Led_verde    };       // * 1 2 3 4 #
  6.          if((Dig[0]==11)&&(Dig[1]==1)&&(Dig[2]==9)&&(Dig[3]==3)&&(Dig[4]==7)&&(Dig[5]==12))
  7.          { Led_naranja  };       // * 1 9 3 7 #
  8.          if((Dig[0]==11)&&(Dig[1]==4)&&(Dig[2]==8)&&(Dig[3]==6)&&(Dig[4]==2)&&(Dig[5]==12))
  9.          { Led_rojo     };       // * 4 8 6 2 #
  10.          if((Dig[0]==11)&&(Dig[1]==2)&&(Dig[2]==6)&&(Dig[3]==8)&&(Dig[4]==4)&&(Dig[5]==12))
  11.          { Led_Apagados };       // * 2 6 8 4 #
  12.          }
  13.          else {
  14.          Dig[0]=0;
  15.          Dig[1]=0;
  16.          Dig[2]=0;
  17.          Dig[3]=0;
  18.          Dig[4]=0;
  19.          Dig[5]=0;
  20.          }

« Última modificación: 26 de Abril de 2023, 08:32:26 por mariacontenis »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re:DTMF ccs c
« Respuesta #32 en: 26 de Abril de 2023, 08:30:06 »
¿Qué error?

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 114
Re:DTMF ccs c
« Respuesta #33 en: 26 de Abril de 2023, 08:38:09 »
Con el else fuera no enciende ningun led jejejeje, creo que por que si es menor de 6 digitos los eta limpiando. Por lo tanto esto que puese esta mal.  :( entonce el else si debe estar dentro del  if(contador>=6){.



Citar
if(contador>=6)
         {
         contador=0;
         if((Dig[0]==11)&&(Dig[1]==1)&&(Dig[2]==2)&&(Dig[3]==3)&&(Dig[4]==4)&&(Dig[5]==12))
         { Led_verde    };       // * 1 2 3 4 #
         if((Dig[0]==11)&&(Dig[1]==1)&&(Dig[2]==9)&&(Dig[3]==3)&&(Dig[4]==7)&&(Dig[5]==12))
         { Led_naranja  };       // * 1 9 3 7 #
         if((Dig[0]==11)&&(Dig[1]==4)&&(Dig[2]==8)&&(Dig[3]==6)&&(Dig[4]==2)&&(Dig[5]==12))
         { Led_rojo     };       // * 4 8 6 2 #
         if((Dig[0]==11)&&(Dig[1]==2)&&(Dig[2]==6)&&(Dig[3]==8)&&(Dig[4]==4)&&(Dig[5]==12))
         { Led_Apagados };       // * 2 6 8 4 #
         }
         else {
         Dig[0]=0;
         Dig[1]=0;
         Dig[2]=0;
         Dig[3]=0;
         Dig[4]=0;
         Dig[5]=0;
         }

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re:DTMF ccs c
« Respuesta #34 en: 26 de Abril de 2023, 10:40:12 »
Ok, ¿ya te funciona?

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 114
Re:DTMF ccs c
« Respuesta #35 en: 26 de Abril de 2023, 12:15:46 »
Citar
Ok, ¿ya te funciona?

No funciona, así como mente. Creo que mi código es muy básico y sigue sin funcionar si envío una secuencia por ejemplo 345 es decir, con menos dígitos.

Creo que faltan más condiciones.

Gracias por preguntar..

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:DTMF ccs c
« Respuesta #36 en: 26 de Abril de 2023, 12:21:52 »
Citar
Ok, ¿ya te funciona?

No funciona, así como mente. Creo que mi código es muy básico y sigue sin funcionar si envío una secuencia por ejemplo 345 es decir, con menos dígitos.

Creo que faltan más condiciones.

Gracias por preguntar..

Sube el desensamblado para ver si es problema del compilador
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re:DTMF ccs c
« Respuesta #37 en: 26 de Abril de 2023, 14:43:38 »
Citar
Ok, ¿ya te funciona?

No funciona, así como mente. Creo que mi código es muy básico y sigue sin funcionar si envío una secuencia por ejemplo 345 es decir, con menos dígitos.

Creo que faltan más condiciones.

Gracias por preguntar..


Pero cuéntanos qué debe ocurrir cuando se metan menos dígitos. ¿Cuál sería el objetivo deseable en ese caso?

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 114
Re:DTMF ccs c
« Respuesta #38 en: 26 de Abril de 2023, 15:09:34 »
Citar
Pero cuéntanos qué debe ocurrir cuando se metan menos dígitos. ¿Cuál sería el objetivo deseable en ese caso?

Bueno el sistema solo debe de encender uno de los LED si su código que entra es correcto.

Si entra un código incorrecto debe de ignorar. Ayer probando físicamente entiende el led correspondiente al código de entrada. Pero si entra una DTMF diferente o si no llega a leer correctamente el dtmf el pic ya no responde si vuelvo a enviar un código correcto.

Lo que quiero es que ignore cualquier.otro código que no sea el correcto al que enciende el led correspondiente. Y si llega cualquier código menor o mayor o diferente al correcto que lo ignore y que no se quede  bloqueado mi pic. Por qué vuelve a funcionar hasta que lo reinicie.

Una disculpa quizás hablo mucho y no me doy a entender..


Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re:DTMF ccs c
« Respuesta #39 en: 26 de Abril de 2023, 15:14:31 »
Vale, en ese caso, como la primera condición que tu programa comprueba es que el Contador sea mayor o igual que 6, al meter menos dígitos, no se ejecuta ese bloque.

Yo cambiaría esa condición por:
Código: C
  1. if(contador==6)
y abajo del todo pondría un
Código: C
  1. else {
  2.   // Aquí debes poner lo que quieras que ocurra cuando se pulsen menos o más dígitos
  3. }

Otra cosa que debes tener en cuenta es si este bloque de código se ejecuta siempre, mientras el usuario está tecleando, o sólo cuando ha terminado.
Si se trata de lo primero, ¿cómo sabemos que ha terminado de teclear?, ¿porque tarda demasiado o por meter el dígito #?

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:DTMF ccs c
« Respuesta #40 en: 26 de Abril de 2023, 16:07:22 »
Citar
Pero cuéntanos qué debe ocurrir cuando se metan menos dígitos. ¿Cuál sería el objetivo deseable en ese caso?

Bueno el sistema solo debe de encender uno de los LED si su código que entra es correcto.

Si entra un código incorrecto debe de ignorar. Ayer probando físicamente entiende el led correspondiente al código de entrada. Pero si entra una DTMF diferente o si no llega a leer correctamente el dtmf el pic ya no responde si vuelvo a enviar un código correcto.

Lo que quiero es que ignore cualquier.otro código que no sea el correcto al que enciende el led correspondiente. Y si llega cualquier código menor o mayor o diferente al correcto que lo ignore y que no se quede  bloqueado mi pic. Por qué vuelve a funcionar hasta que lo reinicie.

Una disculpa quizás hablo mucho y no me doy a entender..

Creo que deberías usar la tecla # como un "enter" es decir que cuando se ingrese una serie de números, el momento que presiones # se ejecute el analices de los datos ingresados, entonces si ingresas menos, por ejemplo 1, 3, la tecla # desencadena todo el proceso.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 114
Re:DTMF ccs c
« Respuesta #41 en: 27 de Abril de 2023, 09:29:19 »
Ya quedo solucionado :mrgreen:

Gracias Nocturno y gracias DominusDRR, por su apoyo, aunque esto sigue y espero no enfadarlos. Esto lo tome de los dos y así quedo la condición para que ya no se bloqueara:

Código: C++
  1. if(contador==6)

Código: C++
  1. if((contador>6 || Dig[0]!=11) || (Dig[5]!=12)){ goto inicio; }

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re:DTMF ccs c
« Respuesta #42 en: 27 de Abril de 2023, 09:31:24 »
Ya quedo solucionado :mrgreen:

Gracias Nocturno y gracias DominusDRR, por su apoyo, aunque esto sigue y espero no enfadarlos. Esto lo tome de los dos y así quedo la condición para que ya no se bloqueara:

Código: C++
  1. if(contador==6)

Código: C++
  1. if((contador>6 || Dig[0]!=11) || (Dig[5]!=12)){

Está raro ese compilador, solo por curiosidad quisiera ver el código ensamblador del proyecto que se quedaba "colgado"
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32