Hola, soy nuevo en esto de programar pics, soy autodidacta, estudio a través de un libro que encontré en la red, me sirve de mucho pero también me deja muchas dudas debido al lenguaje técnico que no domino, bueno el tema es que me puse a hacer un programa sencillo para manejar un lavar-ropas automático con el pic 16f84a, como no conozco a nadie que me pueda aconsejar o corregir acudo al foro para que me ayude.
Bueno la configuración de las entradas y salidas del pic es la siguiente, PortA como entradas y PortB como salidas, los tres primeros bits del Porta los uso para selección de programa, o sea el bit 0, el 1 y el 2; el bit 3 lo asigno al presostato, el bit 4 no lo utilizo. En las salidas: bit 0 electrovalvula, bit 1 Motor derecha, bit 2 Motor izquierda, bit 3 bomba de agua y bit 4 motor centrifugado el 5,6 y 7 no los utilizo.
Les dejo el Código de lo que voy haciendo hasta ahora, del programa y de las librerías y espero correcciones, consejos y toda la ayuda que me puedan brindar, porque en realidad me gusta mucho esto y quisiera saber si voy bien o si no entendí nada y estoy haciendo cualquier cosa, bueno desde ya muchas gracias
ya lo termine al program aqui lo dejo completo
;*****************************************Programador de Lavarropas*************************************
;
; Tabla de seleccion de programas
;
; 0 0 0 ---> Apagado (stand by) *
; 0 0 1 ---> Lavado largo
; 0 1 0 ---> Lavado medio
; 0 1 1 ---> Lavado corto
; 1 0 0 ---> Enjuage
; 1 0 1 ---> Desagote
; 1 1 0 ---> Centrifugado
; 1 1 1 ---> Pausa
;
;
;
; *
;********************************************************************************************************
;********************************************ZONA DE DATOS***********************************************
__CONFIG _CP_OFF&_WDT_OFF&_PWRTE_ON&_XT_OSC;Configuracion del grabador
LIST P=16F84A ;Procesador.
INCLUDE<P16F84A.INC>;Definicion de los operandos utilizados.
INCLUDE<carga.INC>
;**********************************************ZONA DE CODIGOS********************************************
CBLOCK 0x0c
Contador1
Contador2
Contador3
ENDC
ORG 0 ;El programa comienza en la dir. 0.
Inicio bsf STATUS,RP0 ;Pone a 1 el bit 5 del STATUS, Acceso al banco 1.
clrf TRISB ;El puerto B se configura como salidas.
movlw b'11111111' ;b'11111111--->(W)
movwf TRISA ;(W)------>(TRISA),El puerto A se configura como entradas.
bcf STATUS,RP0 ;Pone a 0 RP0 de STATUS. Acceso al banco 0.
Principal
movf PORTA,W ;(PORTA)--->(w)
andlw b'00000111' ;(w)AND b'00000111' Esto es para quedarse con el valor de lo 3 primeros bits
call TablaDeVerdad ;Llama a TablaDeVerdad
END ;Final del programa.
TablaDeVerdad
addwf PCL,f
call StandBy
call LavadoLargo
call LavadoMedio
call LavadoCorto
call Enjuage
call Desagote
call Centrifugado
call Pausa
return
StandBy
sleep
return
LavadoLargo
call carga ;Llama a la subrutina carga.
call PrimerLavado
Desagote
call desagote
SegundoLavado
movlw d'3'
movwf Contador3
call carga
decfsz Contador3
call PrimerLavado
centrifugado
call Centrifugado
return
LavadoMedio
movlw d'2'
movwf Contador3
call carga
call PrimerLavado
call desagote
decfsz Contador3
goto LavadoMedio
call centrifugado
return
LavadoCorto
movlw d'1'
movwf Contador3
call carga
call PrimerLavado
call desagote
decfsz Contador3
goto LavadoMedio
call centrifugado
return
Enjuage
call carga
call PrimerLavado
call desagote
call centrifugado
return
Desagote
call desagote
return
Centrifugado
call centrifugado
return
Pausa
sleep
return
Y esta es la libreria
;************************************Libreria lavarropas .inc**************************************
carga
#DEFINE electrovalvula PORTB,0 ;Asigna a la etiqueta "electrovalvula" el bit 0 del puertob
movf PORTA,W ;(PORTA)--->(W)
andlw b'00001000' ;(W)+B'00001000'--->(W) me quedo solo con el estado del bit3 del portA
bsf electrovalvula ;me pone a 1 el bit 0 del portB, activa la electrovalvula
sublw b'00001000' ;(W)-b'00001000 si esta operacion da 0 el reg Z de status cambia a 1
btfss STATUS,Z ;si Z=1 salta una linea
goto carga ;salta a carga
clrf PORTB ;apaga la electrovalvula
return
MotorDerecha
movlw b'00000010' ;00000010--->(W)
movwf PORTB ;(W)--->(PORTB)
call Retardo5s ;
clrf PORTB ;pone a cero el portb
return
MotorIzquierda
movlw b'00000100'
movwf PORTB
call Retardo5s
clrf PORTB
return
deasagote
movlw b'00001000' ;} b'00001000'--->(W)
movwf PORTB ;}(W)--->(PORTB) Estas dos ultimas instrucciones activan la bomba de agua
movf PORTA,W ;*
andlw b'00001000' ;*Estas instruccionan controlan la señal del presostato
sublw b'00001000' ;*
btfsc STATUS,Z ;*
goto Desagote ;
clrf PORTB ;Apaga la bomba de agua
return
centrifugado
call desagote
movlw b'00001100' ;activa la bomba de agua y motor ala izquierda
movwf PORTB
call Retardo10s ;mantiene activado la bomba y el mot izq por 10 seg
clrf PORTB ;apaga bomba y mot izq
call Retardo5s ;se detiene por 5 seg
movlw b'00001010' ;Activa bomba y mot der
movwf PORTB
call Retardo10s ;mantiene bomba y mot der por 10 seg
clrf PORTB ;apaga bomba y mot der
call Retardo5s
movlw b'00010010' ;activa bomba y centrifugado
movwf PORTB
Retardo
movlw d'24'
movwf Contador3
call Retardo20s
decfsz Contador3
goto Retardo
clrf PORTB
return
PrimerLavado
call Retardo5s ;Despues de la carga espera 5seg
movlw d'30' ;d'30-->(W) carga el contador
movwf Contador1 ;
call MotorIzquierda ;Llama a la subrutina Motor Izquierda
call Retardo5s
call MotorDerecha ; " " " " " Dererecha
decfsz Contador1 ;Decrementa el contador, cuando llega a 0 salta una instruccion
goto PrimerLavado ;Mientras Contador1 sea diferente de 0 salta a PrimerLavado
remojo
movlw d'30'
movwf Contador2
call Retardo20s
decfsz Contador2
goto remojo
return