cordial saludo,,,
requiero salir de una función que a la vez a sido llamada desde otra función, esto es debido a que mientras esta ejecutando las instrucciones de de estas funciones, 2 pines de entrada pueden haber cambiado su estado, entonces requiero que haga tras cosas.
no puedo utilizar "pin on change" por que ya estos pines que tienen estas funciones los estoy utilizando en un puerto completo, es decir los pines que requiero chequear no los puedo usar para interrupciones.
lo único que me ha funcionado es "Reset_cpu();" creo entender que esto reinicia a partir del "void main" en adelante.
no se, si es perjudicial resetear tantas veces el pic y se dañe.
que podría hacer en este caso,, gracias de antemano.
si, comprendo..
he tratado de hacerlo de muchas formas pero llego al mismo problema, tratare de explicarlo en párrafos cortos.
* leo los pulsadores
* voy a una función que tiene swich con diferentes secuencias de led
* mientras ejecuta la secuencia de leds elegida (dentro de un for)
* llamo otra función para que revise de nuevo los pulsadores
* si hay un cambio entonces "Reset_cpu();"
tengo que preguntar dentro del for por los pulsadores por que necesito que si hay un cambio en los pulsadores cambiar la secuencia de inmediato y no esperar a que termine la que esta haciendo.
trate de duplicar dentro de otra función la lectura de los pulsadores pero me sale un error al parecer la pila detecta un trozo igual en el programa.
si hago "Reset_cpu();" todo va bien pero no se que daño pueda ocasionar, he tratado con break, return, exit y nada.
si, comprendo..
he tratado de hacerlo de muchas formas pero llego al mismo problema, tratare de explicarlo en párrafos cortos.
* leo los pulsadores
* voy a una función que tiene swich con diferentes secuencias de led
* mientras ejecuta la secuencia de leds elegida (dentro de un for)
* llamo otra función para que revise de nuevo los pulsadores
* si hay un cambio entonces "Reset_cpu();"
reset_cpu() no salta a main() sino a la dirección 0x0000 , dependiendo del micro, limpia algunos registros antes de saltar.hola eduardo gracias por responderme.
Esto significa que primeros se inicializarán variables y registros antes de ir a main().
Mas prolijo sería que la función salida() no sea void sino int8 o bool , y de acuerdo a lo que devuelva retornar a main().
Mas prolijo sería que la función salida() no sea void sino int8 o bool , y de acuerdo a lo que devuelva retornar a main().esta parte que me indicas no se como trabaja, podrías explicarme un poco por favor ademas, no se como saltar al main, y goto no quisiera usarlo por 2 razones:
gracias por la ayuda, tal vez así sea mas claro..
Código: C
void sw(); void salida(); void (main) { while (true) { if ((entradas==16)||(entradas==25)||(entradas==18)||(entradas==27)) { estado=1; estadoanterior=estado; valor2=read_eeprom(11);// valor para leer en swich h=read_eeprom(21); doble=read_eeprom(31); sw(); } if ((entradas==24)||(entradas==26)||(entradas==10)) { estado=2; estadoanterior=estado; valor2=read_eeprom(13); h=read_eeprom(23); //read_eeprom(30); doble=read_eeprom(33); sw(); } }//while (true }//void(main) //************************ void sw() { switch(valor2) { case 'a': // secuencia 1 for(j=0;j<=n;j++) { bit_set(mezcla,j) ; salida(); } } } //******************** void salida() { if ((entradas==16)||(entradas==25)||(entradas==18)||(entradas==27)) { estado=1; porta=mezcla; portb=mezcla; } if ((entradas==24)||(entradas==26)||(entradas==10)) { estado=2; porta=mezcla; portb=0xff; } If (estadoanterior!=estado) { Reset_cpu();// si hubo cambio en las entradas hago reinicio } } //****************************
gracias por la ayuda, tal vez así sea mas claro..
Código: C
void sw(); void salida(); void (main) { while (true) { if ((entradas==16)||(entradas==25)||(entradas==18)||(entradas==27)) { estado=1; estadoanterior=estado; valor2=read_eeprom(11);// valor para leer en swich h=read_eeprom(21); doble=read_eeprom(31); sw(); } if ((entradas==24)||(entradas==26)||(entradas==10)) { estado=2; estadoanterior=estado; valor2=read_eeprom(13); h=read_eeprom(23); //read_eeprom(30); doble=read_eeprom(33); sw(); } }//while (true }//void(main) //************************ void sw() { switch(valor2) { case 'a': // secuencia 1 for(j=0;j<=n;j++) { bit_set(mezcla,j) ; salida(); } } } //******************** void salida() { if ((entradas==16)||(entradas==25)||(entradas==18)||(entradas==27)) { estado=1; porta=mezcla; portb=mezcla; } if ((entradas==24)||(entradas==26)||(entradas==10)) { estado=2; porta=mezcla; portb=0xff; } If (estadoanterior!=estado) { Reset_cpu();// si hubo cambio en las entradas hago reinicio } } //****************************
Lo que entiendo es que deseas finalizar el for antes que se complete al máximo (j >n) cuando en salida se cumpla el If (estadoanterior!=estado)
Si es así, salida deberá retornar un valor, digamos true:Código: C
bool salida() { if ((entradas==16)||(entradas==25)||(entradas==18)||(entradas==27)) { estado=1; porta=mezcla; portb=mezcla; } if ((entradas==24)||(entradas==26)||(entradas==10)) { estado=2; porta=mezcla; portb=0xff; } If (estadoanterior!=estado) { return true;//Reset_cpu();// si hubo cambio en las entradas hago reinicio } return false;// para otra condición }
Y en el lazo for, cuando salida retorne un true, se lo finaliza antes de cumplir todas las iteracionesCódigo: C
void sw() { switch(valor2) { case 'a': // secuencia 1 for(j=0;j<=n;j++) { bit_set(mezcla,j) ; if (true == salida() { break; //un break dentro de un for finaliza antes de completar } } } }
...Ya DominusDDR dió un ejemplo del procedimiento.
esta parte que me indicas no se como trabaja, podrías explicarme un poco por favor ademas, no se como saltar al main,
y goto no quisiera usarlo por 2 razones:Lo que los programadores no lo aceptan es una cuestión meramente religiosa nacida de un artículo de Dijkstra. Un exceso de goto es tan ilegible como un exceso de anidamientos.
* los programadores expertos no lo aceptan
* y he leído que no se puede ir a goto estando dentro de una función.No se puede ir a cualquier parte porque se corrompe la pila (stack).