Control sustituto para lavadora automatica.

antiworldx
ya se que paso el tiempo, recien veo este tema , pero no pude dejar de decirte.....
exelente trabajo, no solo limpio sino muy util
 
Saludos antiworldx... no creas que no has ayudado... tu proyecto fue el precursor para el desarrollo de mi trabajo... Me basé en tu diagrama y desarrollé este que estoy subiendo ahora para aitor... Claro que tube que empezar de lo más básico ya que nunca pude estudiar electrónica, pero la necesidad de reparar una lavadora industrial me hizo perder varias noches de sueño hasta que logré este...
Aqui va el diagrama... yo creo que falta ordenarlo un poco, pero ésta es la idea general...
 

Adjuntos

  • Washer Machine 5.0.PDF
    137.9 KB · Visitas: 345
Justo el proyecto que necesito realizar sfano, pensaba en algo parecido con un 16F84, ya que la programación es mi principal problema, y de este hay bastante información, y gracias a antiworldx, por este hilo, ya me he propuesto llegar a comprender y dominar a estos bichejos. No obstante agradecería si ampliaras un poco mas la información del tuyo. Ahora despues de agradeceros no dejar morir el hilo, voy a revisar las diferencias de los pic.


PD: Antiworldx, me alegro de poder reencontrarte denuevo, espero que todas tus espectativas se cumplan, Un abrazo Amigo.
 
Muchas gracias, y si, todo va marchando hasta ahorita... con su respectivo esfuerzo.

Por otro lado, te recomiendo usar un pic mucho mas grande, por la cantidad de señales que necesitas. Un pic4011 pudiera ser un buen sustituto del 8051 y hay mas gente que lo domina.
La informacion que dispongo toda esta ahi, incluso el firmware del 8051 esta por ahi en uno de los post.
Saludos y sigo al pendiente en lo posible...
 
Que tal Aitor... Ahora te mando mi programa en Basic para que lo del circuito te funcione... Creo que tendras que hacer ciertas modificaciones de acuerdo a las funciones que quieras realice tu Maquina.
Heché un vistazo al diagrama que nombraste "variante" y si comparas con mi diagrama, yo no ocupo "cierre de puerta", "alarma de balanceo", ni tengo centrifugado alta velocidad ni achique... Asi que te va a tocar modificar el programa como sea...
Mi lavadora, al ser Industrial, no necesita mucha presision en la entrada de agua, asi que lo realiza por tiempo... Tengo un presostato que solo cumple la funcion de verificar si ha entrado un mínimo de agua para evitar que en el lavado entre al calentamiento de agua (que en esta máquina es por entrada de vapor) y prevenir un daño en la ropa que está lavando.
Tengo básicamente tres programas... Lavado largo, corto y sólo centrifugado, que se seleccionan a travez de tres diferentes pulsadores (cada uno asignado a una función)...
Mejor te mando el programa... revisalo y de ahi te voy respondiendo tus consultas, si hubiera alguna...
Ojala te ayude en algo... Y recuerda que la idea es que aprendas esto de la programación, no que te hagamos todo el trabajo...
El PIC que utilizo es el 16F877A... Si ocupas otro tendrás que modificar el valor de "CONFIG_WORD" que aparece al principio...
Suerte...

Encontrarás archivo ".bas" que es el programa en basic, ese es el que debes modificar para adaptarlo a tu Lavadora... el ".hex" es el lenguaje de máquina, que es programa que se carga al PIC
 

Adjuntos

  • Washer Machine.rar
    59 KB · Visitas: 192
Última edición:
Buenas, estoy intentando hacer un programa para mi lavadora en C por que se a quemado la tarjeta electrónica, mas en concreto un triac, aunque lo he sustituido por un equivalente supuestamente, no va, entra agua a golpes y cuando se supone que debe empezar el ciclo de lavado se queda esperando y no hace nada mas.
Después de varias comprobaciones creo que es la tarjeta, con el precio te quedas de piedra ya que para el modelo de mi lavadora el precio ronda los 230€.
Tengo varias dudas con el programa, hay ciertos conceptos que no soy capaz de resolver, simplemente no doy para mas, es mas, usar interrupciones se me atraganta, y otros conceptos mas complicados pues aun mas, 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.
Mi primer problema esta en que cuando se activa el presostato(esto es tanque lleno de agua) se pone a lavar, hace los ciclos de lavado luego desagua, aqui me falta solucionar lo del centrifugado, y vuelve a llenar el tanque asta que se activa el presostato, no se solucionar que el microprocesador sepa que, una vez llenado el tanque, con lo que vuelve a activarse el presostato y corta la entrada de agua, comience con el proceso de aclarado, digo esto por que me repite el ciclo como si empezase de nuevo, y claro esto me lleva de cabeza.
Y por otro lado pues no se como solucionar el tema del centrifugado ya que esta lavadora, cuando funcionaba bien, empieza poco a poco luego va subiendo de revoluciones y hace el centrifugado, y claro para esto supongo que habrá que usarse el pwm y hay ya se me hace oscuro, sobre todo por que utiliza triacs para todo, y según he leido en algun que otro tema, lo de subir o bajar revoluciones con triacs es complicado.
Pues eso si alguien me hecha un cable encantado y si nos pues a seguir leyendo toca, de todas formas solo por haberos leído esto ya me doy por contento.
Gracias de paso.
Añado el código y el programa en proteus.
Posdata: los 2 jampers simulan el cierre de puerta y el presostato.
 

Adjuntos

  • lavadora.rar
    21.8 KB · Visitas: 62
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.
Estás anidando rutinas dentro del bucle principal del programa y por eso se generan errores.
Tienes que colocarlas fuera del bucle principal y después invocarlas.
También tienes rutinas repetidas o con el mismo nombre y no puede haber rutinas que se llamen igual.

La estructura básica que tienes que hacer, viene siendo así:
Código:
   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.
También puedes inicializar algunas cosas antes de entrar al bucle del programa y realizar otras dentro del bucle.
Si quieres colocar las rutinas en otra parte del programa, tienes que declararlas en la cabecera.

Por ejemplo así:
void rutina_1 (void);
O así cuando es una función:
void funcion_1 (intX param_1, char param_2, etc, etc);

También te faltó agregar las librerías que estás usando, y eso es importante porque no todos las tenemos.

Suerte.
 
En lo de las rutinas repetidas es un error por que se me olvido poner a presostato, presostato _1 y el _2, con esto queria decir aclarado_1 y aclarado_2, despiste mio, ahora he puesto lavado, aclarado_1 y aclarado_2.
En lo de la extructura basica si lo hago como dices tu colocando por un lado el inicio y dentro del while el bucle principal no va, cuando pulso D6 que es como si estubiese seleccionando un programa no obedece, pero si lo coloco dentro del bucle principal si, pero entonces es mas o menos parecido a lo que tenia yo, con lo que se repite el mismo problema, esto es, al tirar el agua la bomba de desagüe, como baja la presion el presostato, este se desactiva con lo que el microprocesador sabe que esta desactivado y cuando termina de desgüar 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, aqui es donde se me genera el bucle cuando le doy al jamper, como si se activa el presostato despues de haberse vuelto a llenar el tanque, vuelve a comenzar el ciclo de lavado desde el principio y de hay no salgo.
En lo de las librerias no se a cuales te refieres ya que las 2 que no uso, de momento, son las referidas a temperatura que lo hare mas adelante, de todas maneras por si lo que quieres decir es poner las del lcd, 1Wire y DS18B20-2.1 pues adjunto un nuevo archivo tal como lo he dejado ahora y con esas librerias.
 

Adjuntos

  • lavadora.rar
    25.3 KB · Visitas: 27
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.
Para saber lo que está ocurriendo con las rutinas del programa, usa el depurador (Debugger) de ISIS.
Así podrás ir siguiendo paso por paso las instrucciones del programa.
Coloca un punto de ruptura (Break Point) justo donde quieres comenzar la depuración.

Lo que puedo notar, es que te hace falta realizar mas comprobaciones durante el ciclo inicial y final, porque el programa continúa pase lo que pase.
Revisa bien la configuración de los pines que usarás como entradas y salidas, pues al iniciar con el jumper de cierre de puerta abierto, existen contenciones lógicas.
También te hace falta colocar resistencias pull-down en los pines de los sensores.
Y para un programa así, si será necesario que utilices interrupciones y que en vez de usar retardos uses bucles while para comprobar el llenado del tanque por medio de sensores.
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.
Cuando de momento no vayas a usar librerías en el programa, debes comentarlas.
¿Por qué? Porque pueden tener rutinas o nombres de variables que se repitan y podrían entrar en conflicto.
(No en este caso, pero es una recomendación.)

También te recomiendo que uses la librería LCD420.C que ya viene con el PCWHD Compiler de CCS.
No sé que versión tengas, pero creo que esa librería viene incluida desde hace tiempo.
Esto te lo menciono porque al ejecutar la simulación existen contenciones lógicas al usar la que adjuntas.

Suerte.
 
Cuanta razon tienes, ya me habia dado cuenta con " falta realizar mas comprobaciones durante el ciclo inicial y final, porque el programa continúa pase lo que pase.", lo tengo mal configurado, es lo primero que voy a intentar areglar.
Nunca pense en eso "Cuando de momento no vayas a usar librerías en el programa, debes comentarlas."
"También te hace falta colocar resistencias pull-down en los pines de los sensores." Esto no lo hecho nunca mirare para ver como hacerlo.
"Para saber lo que está ocurriendo con las rutinas del programa, usa el depurador (Debugger) de ISIS.
Así podrás ir siguiendo paso por paso las instrucciones del programa.
Coloca un punto de ruptura (Break Point) justo donde quieres comenzar la depuración." no se hacerlo, voy a leer sobre el tema.
"será necesario que utilices interrupciones", esta es mi gran batalla !! aprender hacerlo ¡¡. estoy en ello.
" en vez de usar retardos uses bucles while para comprobar el llenado del tanque por medio de sensores." en esto te agradeceria algun ejemplo que pueda comprender, si es posible.
De todas maneras tampoco quiero pecar de ser un pesao.
En lo que me defienda voy a intentar hacerlo y en lo que no comprenda, ya que me has dado ideas, voy a leer mas.
Gracias.
 
Será necesario que utilices interrupciones.
Esta es mi gran batalla !! Aprender a hacerlo ¡¡ Estoy en ello.
No es complicado y mucho menos si lo haces con PCWHD Compiler.
En vez de usar retardos uses bucles while para comprobar el llenado del tanque por medio de sensores.
En esto te agradecería algún ejemplo que pueda comprender, si es posible.
Aquí te dejo un ejemplo usando interrupciones por RB0 y por RB4<>RB7, más un uso del bucle while.
También puedes usar las interrupciones de los timers y otros periféricos.

Nota:
El ejemplo contiene una simulación preparada con depuración.
Cuando se ejecute el evento donde se colocaron los puntos de ruptura, aparecerá la ventana de depuración.

Suerte.
 

Adjuntos

  • 16F877A Bucle While + Ints.rar
    50.1 KB · Visitas: 41
Última edición:
Un par de preguntas,
aparecerá la ventana de depuración
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.
La otra pregunta es dos preguntas dentro de una misma, en el archivo main dentro de "void main (void)" aparece esta que visto en muchos archivos pero que no comprendo 1º si se pone enable_interrupts(global); ¿no serviria esta funcion para todas las interrupciones? si fuese asi, ¿cual es el sentido de poner "enable_interrupts(int_rb);" y "enable_interrupts(int_ext);".
Y la ultima pregunta, despues de enable_interrupts(int_ext); la siguiente funcion es "ext_int_edge(H_TO_L);",aunque he leido sobre esto no entiendo lo de por flanco de subida o de bajada como es este caso, ¿eso para que se usa, o cual es su funcion concretamente?.
estoy con lo de configurar el incio, nada mas lo tenga te lo enseñare para ver que te parece, es que voy un poco liado con el trabajo y voy teniendo pocos ratos libres.
Venga.
 
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.
Así es, pero eso lo hace el microcontrolador en tiempo real.
Cuando estás depurando un programa, lo que detiene la secuencia es el depurador.
Y sólo lo hace precisamente sobre los puntos de ruptura puestos, no exclusivamente sobre las interrupciones.
Los puntos de ruptura se colocan en este caso sobre las instrucciones del programa. (Código escrito)
Y esto se hace dando doble click sobre la instrucción o usando los botones de la ventana de depuración.
Para comprender más acerca de esto, si será necesario que tomes algún curso sobre ensamblador.
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?
Lo que pasa es que cada interrupción tiene su bit de activación/desactivación.
Aquí tienes que leer la hoja de datos para saber en que registro se encuentran.

Enable_Interrupts (Global); Habilita todas las interrupciones que se hayan activado.
Es como un switch de activación general que actúa sobre el bit 7 (GIE) del registro INTCON
Posiblemente también actúe sobre el bit 6 (PEIE) del mismo registro INTCON (Interrupts Control)
Y no se habilitan todas, pues cada una se activa/desactiva de forma independiente.

Disable_Interrupts (Global); Lo hace de forma inversa.
Y también actúa únicamente sobre las interrupciones que hayan sido activadas con su respectivo bit.

Sobre los flancos de subida o bajada H_TO_L y L_TO_H, no es difícil entenderlo.
Por ejemplo; tienes un sensor que al accionarse da un pulso negativo.
Entonces requieres que la detección de la interrupción ocurra por flanco descendente.
H_TO_L = High To Low o Alto a Bajo o de 1 a 0.

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.

Y para el caso de L_TO_H es todo lo contrario a lo anterior.
Esta selección en el PIC16F877A se establece en el bit 6 (INTEDG) del registro OPTION_REG
Y es precisamente sobre este bit donde actúa la instrucción Ext_Int_Edge (X_TO_X);

Por esto, siempre es bueno que le den una buena leída a la hoja de datos del PIC con el que se va a trabajar.

PD:
Los documentos de ayuda de PCWHD Compiler y PROTEUS, también contienen bastante información.

Saludos.
 
Última edición:
Código:
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.
Gracias, ahora si lo he entendido. alto quiere decir que al hacer la interrupcion le pones, al pin en cuestion, en este caso RB0, tension (5 voltios o los que se consideren) y bajo, que el pin lo ponemos, en la interrupcion, a masa o negativo.
Código:
será necesario que tomes algún curso sobre ensamblador
mirare de leer sobre ensamblador pero no me quiero liar mucho por que con lo que me cuesta aprenderrrr, mas que nada por que gusta mucho C.
 
Bueno D@rkbytes despues de un tiempo intentando dar soluciones, de momento para salir del paso, esto es como llevo el tema, tengo que decir que aun me falta incorporar el tema de temperatura, centrifugado, lavado normal, ropa sucia, muy sucia.
Dime como lo ves, que opinas de como lo llevo o si devo corregir algo.
Los tiempos son a mero modo de ejemplo.
 

Adjuntos

  • lavadora-1.rar
    25.3 KB · Visitas: 28
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?
Mal, volviste a ingresar subrutinas dentro del bucle principal del programa.
Ya te había explicado sobre eso.

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.
 
Pregunta, te refieres a como lo hecho en el archivo que adjunto ahora?, si no es asi no me aclaro a que te refieres.
 

Adjuntos

  • lavadora-2.rar
    21.9 KB · Visitas: 26
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)

Anteriormente ya habías sacado las subrutinas del bucle principal, pero nuevamente las volviste a colocar.

Lo que tienes que hacer, es colocar las subrutinas fuera del bucle, pero no las incluyas dentro de él.

Mira la foto adjunta para que veas el error que aparece cuando haces eso.
Ahora en este programa sólo te falta sacar un subrutina, en el programa anterior las incluiste todas.
 

Adjuntos

  • Nested Function.jpg
    Nested Function.jpg
    117.7 KB · Visitas: 28
Eso lo habia entendido, creo yo, pero resulta que el compilador que tengo, yo, no me marca ningun error y compila bien y al probarlo en proteus va todo correcto, por eso primero los habia puesto dentro del while, aunque tu me indicaste fuera, y luego cuando me digiste pense que querias decir que las rutinas menos importantes las dejase fuera del while y la que realiza la funcion principal dentro, todo habiendo entendido lo que decias, pero como probe por que me surgia un problema no recuerdo, en concreto, ahora cual, pues lo puse asi y el compilador tiraba bien.
Bueno ahora me acuerdo el problema me venia dado por que quiero poner el tiempo en cada proceso de lavado y no me salia como hacerlo, creo que tengo la solucion pero estoy haciendo pruebas.
Esto biene dado por que tengo otra lavadora que es con la que estoy tomando las referencias y en esta me marca el tiempo que cuesta cada clase de lavado, aunque me podido darme cuenta que tambien los buenos programadores cometen algunos despistes, digo esto por que contando el tiempo de lavado vi que tiene 3 errores en los tiempos ya que de 22' salta a 19', cuando deveria pasar a 21' y luego de 10' pasa a 8' y cuando termina de lavar, que en teoria deve estar en 0 minutos, esperar un tiempo, despues del cual desconecta el seguro de puerta, pues se queda un rato luego desconecta el seguro y luego se pone a 0 minutos.
Adjunto el archivo de como esta ahora que creo entender es lo que me explicastes.
Vuelvo a repetir que los tiempos que pongo son a modo de ejemplo solo.



Una cosa que se me olvida, como haces para poner, cuando quieres referirte a una parte del texto de otro miembro del foro, eso que sale con los simbolos el nombre al que te refieres y luego "dijo:->"
 

Adjuntos

  • lavadora-2.rar
    22 KB · Visitas: 26
Última edición:
Atrás
Arriba