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

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

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
DTMF ccs c
« en: 23 de Abril de 2023, 02:30:02 »
Tengo un código que enciende tres led (rojo, naranja y verde), uno a la ves con diferente código de 6 digitos.
Eneciende el led que quiero correctamecte.

Lo malo es que despues de encender el led seleccionado dura encendido algunos minutos y posteriormente se apaga solo.
Por favor me pueden ayudar y decirme por que se apaga solo?.

Código: C#
  1. #define StD pin_b0
  2.          #define Q1  pin_b4
  3.          #define Q2  pin_b3
  4.          #define Q3  pin_b2
  5.          #define Q4  pin_b1
  6.          
  7.          #define Led_Apagados    output_a(0);
  8.          #define Led_verde       output_a(1);
  9.          #define Led_naranja     output_a(2);
  10.          #define Led_rojo        output_a(4);
  11.          
  12.          int Dig[6]={0,0,0,0,0,0};
  13.          int numero=0, contador=0;
  14.          
  15.          void main()
  16.          {
  17.          porta=0x00; set_tris_a(0b00000000); portb=0x00; set_tris_b(0b11111111); portc=0x00; set_tris_c(0b00000000);
  18.          while(input(StD));
  19.    
  20.          while(TRUE)
  21.          {
  22.          if(input(StD)){
  23.          numero=0;
  24.  
  25.          while(input(StD));
  26.          if(input(Q1)){ numero += 1; }
  27.          if(input(Q2)){ numero += 2; }
  28.          if(input(Q3)){ numero += 4; }
  29.          if(input(Q4)){ numero += 8; }
  30.          Dig[contador]=numero;
  31.          contador++;
  32.          
  33.          if(contador>=6)
  34.          {
  35.          contador=0; numero=0;
  36.          if((Dig[0]==11)&&(Dig[1]==1)&&(Dig[2]==2)&&(Dig[3]==3)&&(Dig[4]==4)&&(Dig[5]==12)){ Led_verde    Dig[0]=0; Dig[1]=0; Dig[2]=0; Dig[3]=0; Dig[4]=0; Dig[5]=0; }      
  37.          if((Dig[0]==11)&&(Dig[1]==1)&&(Dig[2]==9)&&(Dig[3]==3)&&(Dig[4]==7)&&(Dig[5]==12)){ Led_naranja  Dig[0]=0; Dig[1]=0; Dig[2]=0; Dig[3]=0; Dig[4]=0; Dig[5]=0; }            
  38.          if((Dig[0]==11)&&(Dig[1]==4)&&(Dig[2]==8)&&(Dig[3]==6)&&(Dig[4]==2)&&(Dig[5]==12)){ Led_rojo     Dig[0]=0; Dig[1]=0; Dig[2]=0; Dig[3]=0; Dig[4]=0; Dig[5]=0; }      
  39.          if((Dig[0]==11)&&(Dig[1]==3)&&(Dig[2]==1)&&(Dig[3]==2)&&(Dig[4]==3)&&(Dig[5]==1 )){ Led_Apagados Dig[0]=0; Dig[1]=0; Dig[2]=0; Dig[3]=0; Dig[4]=0; Dig[5]=0; }      
  40.          
  41.          //Dig[0]=0; Dig[1]=0; Dig[2]=0; Dig[3]=0; Dig[4]=0; Dig[5]=0;
  42.          }
  43.          }
  44.          }
  45.          }
« Última modificación: 23 de Abril de 2023, 15:38:26 por mariacontenis »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re:DTMF ccs c
« Respuesta #1 en: 23 de Abril de 2023, 07:26:40 »
Si se apagan ellos solitos sin meter ningún código, puede que en realidad esté ocurriendo un RESET del micro.
Puedes confirmarlo metiendo al principio del programa una secuencia de luces, por ejemplo, rojo 1s, naranja 1s, y verde 1s. Así, si ves que se produce esta secuencia en medio del programa sabrás que ha habido un reset.

Otra cosa diferente es evitarlo: habría que ver qué micro es, cuál es el esquema, los fuses del programa, el watchdog...

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re:DTMF ccs c
« Respuesta #2 en: 23 de Abril de 2023, 10:20:54 »
Así es como tengo esta el encabezado del código.

Código: C#
  1. #define VERSION "1.0"
  2.          #if getenv("VERSION") < 5.114                                                 // Realizado con compilador CCS v5.104
  3.          #Warning "COMPILADOR ANTIGUO, ESTE CODIGO FUE DESARROLLADO CON LA VERSION _5_114 DE CCS C"
  4.          #endif
  5.          #include <18f2550.h>                                                          // #include <18f2550.h>                              
  6.          #fuses HS,PROTECT,PUT,WDT,NOBROWNOUT,NOLVP,NOCPD,WRT,MCLR
  7.          #use delay(clock=20000000, crystal=20000000)  
  8.          #if getenv("CLOCK") != 20000000
  9.          #ERROR La velocidad del PIC debe ser de igual a 20Mhz
  10.          #endif

Citar
Si se apagan ellos solitos sin meter ningún código, puede que en realidad esté ocurriendo un RESET del micro.
Puedes confirmarlo metiendo al principio del programa una secuencia de luces, por ejemplo, rojo 1s, naranja 1s, y verde 1s. Así, si ves que se produce esta secuencia en medio del programa sabrás que ha habido un reset.
Me parare bien probar también de esta forma, lo voy hacer y comento.

Algo más en los #fuses si está el watchdog declarado aunque en el cuerpo del programa en ningún momento lo activo. No sé si con solo declararlo en los fuses está realizando el reset.
« Última modificación: 23 de Abril de 2023, 11:18:48 por mariacontenis »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re:DTMF ccs c
« Respuesta #3 en: 23 de Abril de 2023, 11:21:31 »
Este WDT es la respuesta a tu problema:
Código: [Seleccionar]
#fuses HS,PROTECT,PUT,WDT,NOBROWNOUT,NOLVP,NOCPD,WRT,MCLR
Como comentaba al principio, una de las posibilidades era que el watchdog te estuviera reseteando el micro.
Si el fuse WDT está activado, el watchdog está activo. Su misión es sacar al micro de un posible bucle infinito reseteándolo si no le "das de comer".
Por tanto, tienes dos opciones:
1.- Darle de comer: pones en medio de tu bucle principal el comando restart_wdt(). Yo lo pondría detrás del while (TRUE), como primer comando del bucle.
2.- Evitar que esté activo, cambiando ese fuse por NOWDT. Obviamente con esto perderás la posibilidad del reset si el micro se cuelga, por lo que la opción recomendable es la primera.

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re:DTMF ccs c
« Respuesta #4 en: 23 de Abril de 2023, 11:54:50 »
Gracias Mr. Nocturno. 

Por favor podrías indicarme en el código donde colocarle el restart_wdt(). Dices que detrás del while (true)... Entonces estaría dentro del Main()?.

O correcto como lo entendí?...

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re:DTMF ccs c
« Respuesta #5 en: 23 de Abril de 2023, 11:58:25 »
Sí, por ejemplo, aquí:

Código: C
  1. #define StD pin_b0
  2.          #define Q1  pin_b4
  3.          #define Q2  pin_b3
  4.          #define Q3  pin_b2
  5.          #define Q4  pin_b1
  6.          
  7.          #define Led_Apagados    output_a(0);
  8.          #define Led_verde       output_a(1);
  9.          #define Led_naranja     output_a(2);
  10.          #define Led_rojo        output_a(4);
  11.          
  12.          int Dig[6]={0,0,0,0,0,0};
  13.          int numero=0, contador=0;
  14.          
  15.          void main()
  16.          {
  17.          porta=0x00; set_tris_a(0b00000000); portb=0x00; set_tris_b(0b11111111); portc=0x00; set_tris_c(0b00000000);
  18.          while(input(StD));
  19.    
  20.          while(TRUE)
  21.          {
  22.          restart_wdt();
  23.          if(input(StD)){
  24.          numero=0;
  25.  
  26.          while(input(StD)) restart_wdt();;
  27.          if(input(Q1)){ numero += 1; }
  28.          if(input(Q2)){ numero += 2; }
  29.          if(input(Q3)){ numero += 4; }
  30.          if(input(Q4)){ numero += 8; }
  31.          Dig[contador]=numero;
  32.          contador++;
  33.          
  34.          if(contador>=6)
  35.          {
  36.          contador=0; numero=0;
  37.          if((Dig[0]==11)&&(Dig[1]==1)&&(Dig[2]==2)&&(Dig[3]==3)&&(Dig[4]==4)&&(Dig[5]==12)){ Led_verde    Dig[0]=0; Dig[1]=0; Dig[2]=0; Dig[3]=0; Dig[4]=0; Dig[5]=0; }       // * 1 2 3 4 #
  38.          if((Dig[0]==11)&&(Dig[1]==1)&&(Dig[2]==9)&&(Dig[3]==3)&&(Dig[4]==7)&&(Dig[5]==12)){ Led_naranja  Dig[0]=0; Dig[1]=0; Dig[2]=0; Dig[3]=0; Dig[4]=0; Dig[5]=0; }       // * 1 9 3 7 #        
  39.          if((Dig[0]==11)&&(Dig[1]==4)&&(Dig[2]==8)&&(Dig[3]==6)&&(Dig[4]==2)&&(Dig[5]==12)){ Led_rojo     Dig[0]=0; Dig[1]=0; Dig[2]=0; Dig[3]=0; Dig[4]=0; Dig[5]=0; }       // * 4 8 6 2 #
  40.          if((Dig[0]==11)&&(Dig[1]==3)&&(Dig[2]==1)&&(Dig[3]==2)&&(Dig[4]==3)&&(Dig[5]==1 )){ Led_Apagados Dig[0]=0; Dig[1]=0; Dig[2]=0; Dig[3]=0; Dig[4]=0; Dig[5]=0; }       // * 3 1 2 3 1
  41.          
  42.          //Dig[0]=0; Dig[1]=0; Dig[2]=0; Dig[3]=0; Dig[4]=0; Dig[5]=0;
  43.          }
  44.          }
  45.          }
  46.          }

Lo he metido en dos sitios, porque ese bucle while que tienes dentro, podría quedarse dando vuelta mucho rato si el usuario deja alguna tecla pulsada mucho tiempo, y también provocaría un reset del micro.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:DTMF ccs c
« Respuesta #6 en: 23 de Abril de 2023, 12:01:38 »
Sí, por ejemplo, aquí:

Código: C
  1. #define StD pin_b0
  2.          #define Q1  pin_b4
  3.          #define Q2  pin_b3
  4.          #define Q3  pin_b2
  5.          #define Q4  pin_b1
  6.          
  7.          #define Led_Apagados    output_a(0);
  8.          #define Led_verde       output_a(1);
  9.          #define Led_naranja     output_a(2);
  10.          #define Led_rojo        output_a(4);
  11.          
  12.          int Dig[6]={0,0,0,0,0,0};
  13.          int numero=0, contador=0;
  14.          
  15.          void main()
  16.          {
  17.          porta=0x00; set_tris_a(0b00000000); portb=0x00; set_tris_b(0b11111111); portc=0x00; set_tris_c(0b00000000);
  18.          while(input(StD));
  19.    
  20.          while(TRUE)
  21.          {
  22.          restart_wdt();
  23.          if(input(StD)){
  24.          numero=0;
  25.  
  26.          while(input(StD)) restart_wdt();;
  27.          if(input(Q1)){ numero += 1; }
  28.          if(input(Q2)){ numero += 2; }
  29.          if(input(Q3)){ numero += 4; }
  30.          if(input(Q4)){ numero += 8; }
  31.          Dig[contador]=numero;
  32.          contador++;
  33.          
  34.          if(contador>=6)
  35.          {
  36.          contador=0; numero=0;
  37.          if((Dig[0]==11)&&(Dig[1]==1)&&(Dig[2]==2)&&(Dig[3]==3)&&(Dig[4]==4)&&(Dig[5]==12)){ Led_verde    Dig[0]=0; Dig[1]=0; Dig[2]=0; Dig[3]=0; Dig[4]=0; Dig[5]=0; }       // * 1 2 3 4 #
  38.          if((Dig[0]==11)&&(Dig[1]==1)&&(Dig[2]==9)&&(Dig[3]==3)&&(Dig[4]==7)&&(Dig[5]==12)){ Led_naranja  Dig[0]=0; Dig[1]=0; Dig[2]=0; Dig[3]=0; Dig[4]=0; Dig[5]=0; }       // * 1 9 3 7 #        
  39.          if((Dig[0]==11)&&(Dig[1]==4)&&(Dig[2]==8)&&(Dig[3]==6)&&(Dig[4]==2)&&(Dig[5]==12)){ Led_rojo     Dig[0]=0; Dig[1]=0; Dig[2]=0; Dig[3]=0; Dig[4]=0; Dig[5]=0; }       // * 4 8 6 2 #
  40.          if((Dig[0]==11)&&(Dig[1]==3)&&(Dig[2]==1)&&(Dig[3]==2)&&(Dig[4]==3)&&(Dig[5]==1 )){ Led_Apagados Dig[0]=0; Dig[1]=0; Dig[2]=0; Dig[3]=0; Dig[4]=0; Dig[5]=0; }       // * 3 1 2 3 1
  41.          
  42.          //Dig[0]=0; Dig[1]=0; Dig[2]=0; Dig[3]=0; Dig[4]=0; Dig[5]=0;
  43.          }
  44.          }
  45.          }
  46.          }

Lo he metido en dos sitios, porque ese bucle while que tienes dentro, podría quedarse dando vuelta mucho rato si el usuario deja alguna tecla pulsada mucho tiempo, y también provocaría un reset del micro.

¿No debería estar también dentro de while(input(StD))?

Así:

Código: C
  1. while(input(StD))
  2. {
  3.    restart_wdt();
  4. }
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re:DTMF ccs c
« Respuesta #7 en: 23 de Abril de 2023, 12:04:25 »
Gracias, lo pruebo y comento que pasa. La verdad me estubo dando vueltas la cabeza toda la noche y me hizo levantar muy temprano para comentar dónde podría estar el error. Gracias nuevamente.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re:DTMF ccs c
« Respuesta #8 en: 23 de Abril de 2023, 12:07:12 »
¿No debería estar también dentro de while(input(StD))?

Así:

Código: C
  1. while(input(StD))
  2. {
  3.    restart_wdt();
  4. }


Se podría poner también ahí, pero he considerado que daría más o menos lo mismo porque en ese bucle sólo se entra si, cuando el micro se enciende por primera vez, el usuario está manteniendo una tecla pulsada. Si eso ocurriera, daría lo mismo que se provocara un RESET porque el programa todavía no ha entrado en el bucle principal.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:DTMF ccs c
« Respuesta #9 en: 23 de Abril de 2023, 13:30:36 »
¿No debería estar también dentro de while(input(StD))?

Así:

Código: C
  1. while(input(StD))
  2. {
  3.    restart_wdt();
  4. }


Se podría poner también ahí, pero he considerado que daría más o menos lo mismo porque en ese bucle sólo se entra si, cuando el micro se enciende por primera vez, el usuario está manteniendo una tecla pulsada. Si eso ocurriera, daría lo mismo que se provocara un RESET porque el programa todavía no ha entrado en el bucle principal.

No he analizado el código, pero el OP debería determinar cuando tiempo se queda el CP en ese bucle y también el tiempo de desborde del perro guardián.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re:DTMF ccs c
« Respuesta #10 en: 23 de Abril de 2023, 15:52:25 »
Gracias Sr. Nocturno
Ahí estaba el detalle diría Cantinflas #fuses WDT  :mrgreen: me estaba reseteando el PIC.

Ya quedo funcionando como requiero.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re:DTMF ccs c
« Respuesta #11 en: 23 de Abril de 2023, 16:27:08 »
Me alegro

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re:DTMF ccs c
« Respuesta #12 en: 24 de Abril de 2023, 09:33:00 »
Cómo casi siempre, me surge otra pregunta... ❓.

Cómo hacerle para guardar los estados de los tres led en la eeprom del pic?....

Código: C#
  1. #define Led_verde       output_a(1);
  2.          #define Led_naranja     output_a(2);
  3.          #define Led_rojo        output_a(4);

En el código una vez confirmado el dato correcto con IF, enciende o apagó alguno de los 3 led. Ahora sí el equipo se apaga por cualquier razón como guardo el estado del led encendido en eeprom para cuando vuelva a energizar se quede en su último estado?.



Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re:DTMF ccs c
« Respuesta #13 en: 24 de Abril de 2023, 10:28:47 »
Lo haces con el comando write_eeprom y luego recuperas lo escrito con read_eeprom.

La escritura tarda un poco, ten cuidado si tienes interrupciones en tu código que puedan ocurrir durante el proceso.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1982
    • Sicoy
Re:DTMF ccs c
« Respuesta #14 en: 24 de Abril de 2023, 10:42:04 »
Lo haces con el comando write_eeprom y luego recuperas lo escrito con read_eeprom.

La escritura tarda un poco, ten cuidado si tienes interrupciones en tu código que puedan ocurrir durante el proceso.

¿Qué pasa si cuando esté guardando la info, hay un corte de energía? Me imagino que existe la posibilidad de que se grabe cualquier cosa (datos corrompidos) en la eeprom  ;-)
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32