TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: flara en 20 de Diciembre de 2007, 21:17:06
-
Buen dia
Señores estoy realizando un proyecto que consiste en un pulsador conectado a RA0 y todas los otros pines de los puertos estan programados como salidas, lo que hace el sistema es que cada vez que oprimo el pulsador se debe prender una salida por 1 segundo, lo anterior lo esta haciendo perfecto, ahora necesito es que si oprimo nuevamente el pulsador durante el tiempo que esta encendida una salida, prenda la siguiente durante 1 segundo y si oprimo otra dentro de este tiempo se prenda otra salida.
Espero haberme hecho entender.
-
Podrias comenzar posteando el codigo que usaste para lo primero , y ahi se podria ver que modificaciones hacerle
Saludos
-
comparto la misma opinion que Sander, para poder orientarte :D
-
Este es el codigo del programa
#include "P16F84a.INC"
LIST P = 16F84a
__config _XT_OSC & _WDT_OFF & _PWRTE_ON
RADIX HEX
TMR0_OPT EQU 0X01
CONTA0 EQU 0x20
SALIDA1 EQU 0X21
SALIDA2 EQU 0X22
NSALIDAS EQU 0X32 ;numero de salidas
TIEMPO EQU 0X35 ;numero de segundos
TEMPO1 EQU 0X0E
ORG 0
goto inicio
inicio bcf STATUS,RP1
bsf STATUS,RP0 ;seleccion banco 1
clrf TRISB ;definir puerta B como salidas
movlw b'00000001'
movwf TRISA
movlw b'00000111' ;mover siete a registros TMR0 y OPTION
movwf TMR0_OPT ;para indicar predivisor 256
bcf STATUS,RP0
movlw 0X03 ;NUMERO DE SALIDA
movwf NSALIDAS
movlw b'11111111'
movwf PORTA
movwf PORTB
call DELAYS
clrf PORTA
clrf PORTB
PULSADOR btfss PORTA,0 ;pulsador on
goto $-1 ;no, volver a verificar
movlw 0x05 ;si, carga cinco en W retardo de 60us
movwf CONTA0 ;carga cinco en CONTA0
decfsz CONTA0,1 ;decrementa hasta cero
goto $-1 ;no, vuelve a decrementar CONTA0
btfsc SALIDA1,0 ;si, salida 1 ya se activo?
goto OUT2 ;si, ver salida 2
bsf PORTB,0 ;no, salida 1 en ON
bsf SALIDA1,0 ;flag de salida 1 a ON
call DELAYS ;llamar tiempo
bcf PORTB,0 ;apargar salida 1
movlw 0X01
subwf NSALIDAS,0 ;resto Nº salida programada - 1 = W
btfsc STATUS,Z ;Nº de salida es 1 W=0
clrf SALIDA1
goto PULSADOR
OUT2 btfsc SALIDA1,1
goto OUT3
bsf PORTB,1
bsf SALIDA1,1
call DELAYS
bcf PORTB,1
movlw 0X02
subwf NSALIDAS,0 ;resto 1 - Nº salida programada = W
btfsc STATUS,Z ;Nº de salida es 1 W=0
clrf SALIDA1
goto PULSADOR
OUT3 btfsc SALIDA1,2
goto OUT4
bsf PORTB,2
bsf SALIDA1,2
call DELAYS
bcf PORTB,2
movlw 0X03
subwf NSALIDAS,0 ;resto 1 - Nº salida programada = W
btfsc STATUS,Z ;Nº de salida es 1 W=0
clrf SALIDA1
goto PULSADOR
OUT4 btfss SALIDA1,3
goto PULSADOR
bsf PORTB,3
bsf SALIDA1,3
call DELAYS
bcf PORTB,3
movlw 0X04
subwf NSALIDAS,0 ;resto 1 - Nº salida programada = W
btfsc STATUS,Z ;Nº de salida es 1 W=0
clrf SALIDA1
goto PULSADOR
DELAYS movlw 0X01 ;NUMERO DE SEGUNDOS
movwf TIEMPO
DELAY btfsc PORTA,0 ;pulsador on
movlw 0X64
movwf TEMPO1
VOLVER bcf INTCON,2
movlw 0XD9
movwf TMR0_OPT
btfss INTCON,2
goto $-1
decfsz TEMPO1,F
goto VOLVER
decfsz TIEMPO,1
goto DELAY
return ;volver al programa segun la pila
end
-
Viendo tu codigo creo que es muy "lineal" , por decirlo de alguna forma, me explico, cuando prendes una de las salidas vas una rutina de retardo y el microcontrolador se queda ahi esperando que pase un segundo sin hacer nada, y luego vuelves para apagar la salida y volver a revisar el teclado.
Para el problema que planteas debes seguir revisando el teclado mientras te encuentras realizando el retardo , para esto podrias convertir las rutinas que usas para prender las salidas en subrutinas , y asi llamarlas mediante call de acuerdo al estado del pulsador y las otras salidas, todo esto mientras estas en la rutina de retardo.
Otra opcion seria usar la interrupcion del TMR0 para controlar el retardo de 1 seg, pero en la rutina de interrupcion ir controlando el inicio y el fin del retardo para cada salida.
En realidad no es un problema tan simple como pareceria a primera vista, pero tampoco es irresoluble.
Saludos.