Consejo de codigo para lavadora

Hola amigos
En mi casa hay una lavadora antigua pero funcionan todas las partes menos el control, entonces me di a la tarea de hacerla funcionar con un pic………. Y pues bueno, programe un ciclo de lavador y otro de centrifugado y funciono bien en lo físico, el problema que tengo es al momento de incorporarle un presostato con el cual mide el llenado del tanque pues bueno explico mi código


if ( input(PIN_A1)==1){//oprimo el boton de inico
output_high(llenado);//Comienza a llenar el tanque
delay_ms(500);
}

if ( input(PIN_A4)==1){//si el presostato esta lleno
output_low(llenado);//apago la electrovalvula
delay_ms(500);
//Lavado/////////////////////////////////////////////
output_high(lavado);
delay_ms(1000);
output_high(izq);
output_high(run);
delay_ms(600);

output_low(izq);
delay_ms(7000);
output_b(0x00);
delay_ms(10000);

//////////////////////////////////////////////////////
//Centrifugado///////////////////////////////////////
/////////////////////////////////////////////////////
output_high(centrifigado);
delay_ms(1000);
output_high(der);
output_high(run);
delay_ms(600);
output_low(der);
delay_ms(7000);
output_b(0x00);
delay_ms(1000);
}

En este punto acabo de lavar entonces necesita volver a llenar y enjuagar la ropa y acaba pero no sé cómo hacerlo intente hacerlo con if para que volviera a llenar lo hace pero se vuelve un bucle…… y necesito que con ayuda del presostato volver a llenar y acaba y que no se repita hasta cuando yo quiera (esta lavadora solo tiene un motor que hace bomba de desagüé)
Aclaro que soy un poco novato en la programación, pero agradezco cualquier aporte
 
A si ese ya lo vi........pero es con atmel y hay otro que lo hicieron con el 16f877a pero esta en basic y no tengo el programa para verlo y el otro es con ASM pero no se mucho ese lenguaje
 
Hola:

No se si lo podrás conseguir, intenté hacer esto hace tiempo y lo terminaré más adelante. Simplemente se comporta como un PLC, es decir, dependiendo el número de entrada como una tabla de la verdad obtienes una salida.

Código:
;********************************** Indexado_02.asm *************************************
;
;    ===================================================================
;      Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;      E. Palacios, F. Remiro y L. López.        www.pic16f84a.com
;       Editorial Ra-Ma.  www.ra-ma.es
;    ===================================================================
;
; Controla el nivel de un depósito de líquido. Utiliza (entre paréntesis las líneas del
; microcontrolador a la que se han conectado):
; -    Tres sondas detectoras: SV, Sonda de Vacío (RA0); SLL, Sonda de LLenado (RA1);
;    SR, Sonda de Rebose (RA2).
; -    Dos bombas de agua: B1 (RB5), B2 (RB6).
; - Cinco indicadores: Vacio (RB0), Llenandose (RB1), Lleno (RB2), Rebose (RB3),
;    Alarma (RB4).
;
; Su funcionamiento: 
; -    Cuando ninguna de las sondas está mojada se entiende que el depósito está vacío y
;    se accionarán las dos bombas. El indicador "Vacio" se iluminará .
; -    Cuando el nivel del líquido toque la sonda de vacío "SV" seguirá llenándose el
;     depósito con las dos bombas. El indicador "Llenandose" se ilumina.
; -    Cuando el nivel del líquido toca la sonda de llenado "SLL", para la bomba B2, quedando
;    B1 activada en modo mantenimiento. El indicador "Lleno" se ilumina.
; -    Si el nivel del líquido moja la sonda de rebose "SR" se apaga también la bomba B1,
;    quedando las dos bombas fuera de servicio. El indicador "Rebose" se enciende.
; -    Cuando se produce un fallo o mal funcionamiento en las sondas de entrada (por
;    ejemplo que se active la sonda de rebose y no active la de vacío) se paran
;    las dos bombas. El indicador "Alarma" se ilumina.
;
; Según el enunciado del problema, teniendo en cuenta las conexiones citadas y poniendo la
; salida no utilizada (RB7) siempre a cero, la tabla de verdad resultante es:
;
; RA2.. RA0 | RB7 ...          ... RB0
; ------------|--------------------------------
;  0   0   0  |  0   1   1   0   0   0   0   1    (Configuración 0. Estado "Vacio").
;  0   0   1  |  0   1   1   0   0   0   1   0    (Configuración 1. Estado "Llenandose").
;  0   1   0  |  0   0   0   1   0   0   0   0    (Configuración 2. Estado "Alarma").
;  0   1   1  |  0   0   1   0   0   1   0   0    (Configuración 3. Estado "Lleno").
;  1   0   0  |  0   0   0   1   0   0   0   0    (Configuración 4. Estado "Alarma").
;  1   0   1  |  0   0   0   1   0   0   0   0    (Configuración 5. Estado "Alarma").
;  1   1   0  |  0   0   0   1   0   0   0   0    (Configuración 6. Estado "Alarma").
;  1   1   1  |  0   0   0   0   1   0   0   0    (Configuración 7. Estado "Rebose").
;
; ZONA DE DATOS **********************************************************************

    LIST        P=16F84A
    INCLUDE        <P16F84A.INC>
    __CONFIG    _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

; ZONA DE CÓDIGOS ********************************************************************

    ORG     0                    ; El programa comienza en la dirección 0.
Inicio
    clrf    PORTB                ; Debe estar a cero cuando el puerto se configure como salida.
    bsf        STATUS,RP0            ; Acceso al Banco 1.
    clrf    TRISB                ; Las líneas del Puerto B se configuran como salida.
    movlw    b'00011111'            ; Las 5 líneas del Puerto A se configuran como entrada.
    movwf    TRISA
    bcf        STATUS,RP0            ; Acceso al Banco 0.
Principal
    movf    PORTA,W                ; Lee los sensores.
    andlw    b'00000111'            ; Máscara para quedarse con el valor de los sensores.
    addwf    PCL,F                ; Salta a la configuración adecuada.
    goto    Configuracion0
    goto    Configuracion1
    goto    Configuracion2
    goto    Configuracion3
    goto    Configuracion4
    goto    Configuracion5
    goto    Configuracion6
    goto    Configuracion7
Configuracion0
    movlw     b'01100001'            ; Estado "Vacio" (configuración 0).
    goto    ActivaSalida
Configuracion1
    movlw     b'01100010'            ; Estado "Llenándose" (configuración 1).
    goto    ActivaSalida
Configuracion2
    movlw     b'00010000'            ; Estado "Alarma" (configuración 2).
    goto    ActivaSalida
Configuracion3
    movlw     b'00100100'            ; Estado "Lleno" (configuración 3).
    goto    ActivaSalida
Configuracion4
    movlw     b'00010000'            ; Estado "Alarma" (configuración 4).
    goto    ActivaSalida
Configuracion5
    movlw     b'00010000'            ; Estado "Alarma" (configuración 5).
    goto    ActivaSalida
Configuracion6
    movlw     b'00010000'            ; Estado "Alarma" (configuración 6).
    goto    ActivaSalida
Configuracion7
    movlw     b'00001000'            ; Estado "Rebose" (configuración 7).
ActivaSalida
    movwf    PORTB                ; Visualiza por el puerto de salida.
    goto     Principal

    END
Otro ejemplo:
Código:
/*                        

Entradas/salidas digitales: Programa combinacional

Programa combinacional. Según el estado de los interruptores RA0 y RA1, activar
los leds RB0-RB7 conectados a la puerta B, conforme a la siguiente tabla de
la verdad:

RA1 RA0  RB7 RB6 RB5 RB4 RB3 RB2 RB1 RB0
--- ---  --- --- --- --- --- --- --- ---
 0   0    1   0   1   0   1   0   1   0
 0   1    0   1   0   1   0   1   0   1
 1   0    0   0   0   0   1   1   1   1
 1   1    1   1   1   1   0   0   0   0
*/

#include <16f886.h>

/* Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades */

#fuses     NOLVP,PUT,NOWDT,EC_IO,NOFCMEN,NOBROWNOUT    //Palabra 1 de configuración
#fuses    NOWRT,BORV40                                //Palabra 2 de configuración

/* Con estas directivas las funciones "input" y "output_bit" no reprograman
 el pin de la puerta cada vez que son utilizadas. Si no se indica el
modo fast_io se asume por defecto standard_io el cual reprograma el pin
siempre antes de ser utilizadas estas funciones. */

#use fast_io (A)
#use fast_io (B)

main()
{
      output_b(0x0);                    //Borra las salidas
    setup_adc_ports(NO_ANALOGS);    //Puertas A y B digitales
      set_tris_a(0x3F);                //Puerta A entrada
      set_tris_b(0x00);                //Puerta B salida

      while(1)
    {
            switch(input_a() & 0b00000011)// Máscara para RA0 y RA1
        {
              case 0: output_b(0b10101010); break;
              case 1: output_b(0b01010101); break;
              case 2: output_b(0b00001111); break;
              case 3: output_b(0b11110000); break;
            default:;
        }
    }
}
Más adelante seguiré con mi investigación de hacer una placa de mi lavadora o una genérica, lo que no se si me atreveré hacerlo con Arduino Uno que parece muy fácil programarlo y no me pego media vida como los PIC en asm.

Un saludo.
 
Última edición:
Atrás
Arriba