Si se apagan ellos solitos sin meter ningún código, puede que en realidad esté ocurriendo un RESET del micro.Me parare bien probar también de esta forma, lo voy hacer y comento.
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.
#fuses HS,PROTECT,PUT,WDT,NOBROWNOUT,NOLVP,NOCPD,WRT,MCLRSí, por ejemplo, aquí:Código: C
#define StD pin_b0 #define Q1 pin_b4 #define Q2 pin_b3 #define Q3 pin_b2 #define Q4 pin_b1 #define Led_Apagados output_a(0); #define Led_verde output_a(1); #define Led_naranja output_a(2); #define Led_rojo output_a(4); int Dig[6]={0,0,0,0,0,0}; int numero=0, contador=0; void main() { porta=0x00; set_tris_a(0b00000000); portb=0x00; set_tris_b(0b11111111); portc=0x00; set_tris_c(0b00000000); while(input(StD)); while(TRUE) { restart_wdt(); if(input(StD)){ numero=0; while(input(StD)) restart_wdt();; if(input(Q1)){ numero += 1; } if(input(Q2)){ numero += 2; } if(input(Q3)){ numero += 4; } if(input(Q4)){ numero += 8; } Dig[contador]=numero; contador++; if(contador>=6) { contador=0; numero=0; 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 # 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 # 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 # 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 //Dig[0]=0; Dig[1]=0; Dig[2]=0; Dig[3]=0; Dig[4]=0; Dig[5]=0; } } } }
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
while(input(StD)) { restart_wdt(); }
¿No debería estar también dentro de while(input(StD))?
Así:Código: C
while(input(StD)) { restart_wdt(); }
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.
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.
Entonces cuándo la tensión cae un porcentaje crítico, se activa la rutina de Back-Up. y los datos se guardan en cuestión de milisegundos, antes de que la tensión regulada caiga. :mrgreen:
Cuándo tengo que guardar datos en la EEPROM, lo que hago es monitorear la tensión SIN REGULAR de la fuente a través de un divisor resistivo, para acondicionarla al ADC.
En realidad luego del condensador de la fuente conecto un diodo y luego otro condensador que se dedica sólo a la alimentación del uP. Con sólo eso, sobra muchísimo tiempo para que el PIC almacene todo lo necesario.
Dije ADC, por dar un ejem. Pero cómodamente se puede hacer con el comparador interno o bien usando un op-amp externo y conectar a una entrada que dispare por interrupción.
Es una buena opción la EERAM. Nunca usé una como tal. Salvo la NVRAM, que incluyen los viejos RTC muy usados en los PCs 386.
Y la info está asegurada mientras la pila esté ok :D
En los proyectos que he hecho, y que he necesitado monitorear la red para saber cuándo salvaguardar, activaba la alerta por interrupción. Por lo tanto NO hay procesos que demanden más tiempo del debido. Ya que he calculado el tiempo que demanda una escritura completa de datos en EEPROM, para conocer el valor del condensador de respaldo, en función del consumo de esa etapa.
Tengo proyectos que llevan más de 10 años funcionando con ese mecanismo, sin problemas. No entiendo porque dices que NO es óptimo, sin tener un esquema electrónico de como lo implementé y sin analizar el código que utilicé.
Está claro, que con el tiempo, los condensadores se degraden y posiblemente haya problemas.
Pero utilizar una EERAM también está condenado al tiempo de vida útil de una pila. Pero eso ya es otra historia.
Aquí de nuevo.
E probado el código físicamente y funciona (pero con un pero...), por ahora e dejado aun lado la parte de la eeprom por que recién me di cuenta de un detalle que sucedió probando físicamente.
Les comento que cuando envió las secuencias por ejemplo *1234# enciendo mi LED, mas cuando envió una secuencia incorrecta por ejemplo *12344 el pic se me queda bloqueado y ya no obedece a nada hasta que no lo reinicio. Pense en limpiar el buffer o aplicar quizás el watchdog para reiniciarlo, mas me gustaría saber su opinión como gente de mucha mas experiencia.Código: C++
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; }
agregando ese else Dig[0]=0; Dig[1]=0; Dig[2]=0; Dig[3]=0; Dig[4]=0; Dig[5]=0;
o quizás este mal desde if(contador>=6) por que si envió una secuencia menor a 6 dígitos o mayor desde ahí tampoco se cumple la condición :?
Gracias por sus aportes, aprendo mucho de ustedes.
Por favor su ayuda...
¿Y agregando ese else (else Dig[0]=0; Dig[1]=0; Dig[2]=0; Dig[3]=0; Dig[4]=0; Dig[5]=0;), también se cuelga el micro? |
¿Y agregando ese else (else Dig[0]=0; Dig[1]=0; Dig[2]=0; Dig[3]=0; Dig[4]=0; Dig[5]=0;), también se cuelga el micro?
No e probado aún. Antes quince saber su opinión.
Código: C++
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; }
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;
}
}
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;
}
Ok, ¿ya te funciona?
CitarOk, ¿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..
CitarOk, ¿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?
CitarPero 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..
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++
if(contador==6)Código: C++
if((contador>6 || Dig[0]!=11) || (Dig[5]!=12)){