Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
Estás anidando rutinas dentro del bucle principal del programa y por eso se generan errores.Tengo varias dudas con el programa, hay ciertos conceptos que no soy capaz de resolver, simplemente no doy para mas, es más, usar interrupciones se me atraganta, y otros conceptos mas complicados pues aún más.
El programa seguro que tiene muchos errores en el código.
Lo único que pido es que me expliquéis el por que de esos errores para yo comprender mejor las cosas.
void inicio (void)
{
// mi código de inicialización.
}
void rutina_1 (void)
{
// Mi código de rutina 1
}
void rutina_2 (void)
{
// Mi código de rutina 2
}
void main (void) // Inicio del programa.
{
inicio (); // Invoco a rutina de inicio.
while (true) // Bucle del programa.
{
rutina_1(); // Invoco a rutina_1
rutina_2(); // Invoco a rutina_2
} // Fin del bucle.
} // Fin del programa.
Para saber lo que está ocurriendo con las rutinas del programa, usa el depurador (Debugger) de ISIS.al tirar el agua la bomba de desagüe, como baja la presión el presostato, este se desactiva, con lo que el microcontrolador sabe que está desactivado, y cuando termina de desaguar da la orden de activar la electrovalvula para que vuelva a entrar agua, y una vez se vuelve a activar el presostato se corta la entrada de agua y comienza el proceso de aclarado.
Aquí es donde se me genera el bucle cuando le doy al jumper, como si se activara el presostato.
Después de haberse vuelto a llenar el tanque, vuelve a comenzar el ciclo de lavado desde el principio y de hay no salgo.
Cuando de momento no vayas a usar librerías en el programa, debes comentarlas.En lo de las librerías no se a cuales te refieres ya que las 2 que no uso, de momento, son las referidas a temperatura que lo haré mas adelante.
No es complicado y mucho menos si lo haces con PCWHD Compiler.Esta es mi gran batalla !! Aprender a hacerlo ¡¡ Estoy en ello.Será necesario que utilices interrupciones.
Aquí te dejo un ejemplo usando interrupciones por RB0 y por RB4<>RB7, más un uso del bucle while.En esto te agradecería algún ejemplo que pueda comprender, si es posible.En vez de usar retardos uses bucles while para comprobar el llenado del tanque por medio de sensores.
te refieres a que al pulsar alguna de las interrupciones, salvo rb1 el programa de proteus se pone en pause?,si es asi yo tenia entendido que cuando se utiliza una interrupcion el programa se para para efectuar lo que esta en esa interrupcion y una vez ejecutado el programa continua con lo que estaba haciendo, aqui si no pulso play se queda parado, una vez pulsado play continua.aparecerá la ventana de depuración
Así es, pero eso lo hace el microcontrolador en tiempo real.Un par de preguntas. ¿Te refieres a que al pulsar alguna de las interrupciones, salvo rb1 el programa de proteus se pone en pause?
Si es así yo tenía entendido que cuando se utiliza una interrupción el programa se para para efectuar lo que esta en esa interrupción y una vez ejecutado el programa continúa con lo que estaba haciendo, aquí si no pulso play se queda parado, una vez pulsado play continúa.
Lo que pasa es que cada interrupción tiene su bit de activación/desactivación.La otra pregunta es dos preguntas dentro de una misma.
En el archivo main dentro de "void main (void)" aparece esta que he visto en muchos archivos pero que no comprendo.
1º si se pone enable_interrupts(global); ¿no serviría esta función para todas las interrupciones?
Si fuese así, ¿cual es el sentido de poner "enable_interrupts(int_rb);" y "enable_interrupts(int_ext);".
Y la última pregunta. Después de enable_interrupts(int_ext); la siguiente función es "ext_int_edge(H_TO_L);"
Aunque he leído sobre esto no entiendo lo de por flanco de subida o de bajada como es este caso.
¿Eso para qué se usa, o cual es su función concretamente?
Es decir, si usas la interrupción por RB0, necesitas configurar que el evento ocurra cuando el estado de RB0 pase de Alto a Bajo.
será necesario que tomes algún curso sobre ensamblador
Mal, volviste a ingresar subrutinas dentro del bucle principal del programa.Bueno D@rkbytes después de un tiempo intentando dar soluciones, de momento para salir del paso, esto es como llevo el tema.
¿Dime cómo lo ves, qué opinas de como lo llevo o si debo corregir algo?
Pregunta; ¿te refieres a cómo lo he hecho en el archivo que adjunto ahora?
Tienes que estructurar tu programa sin anidar las subrutinas dentro del bucle principal.
Posteriormente las puedes llamar dentro del bucle, pero no deben estar dentro.
Si no es así no me aclaro a que te refieres.
Mira la explicación de la estructura básica que te expuse en ese mensaje. (#88)