Secuencia binaria de 4 bits con pic16f84a

#1
Buen dia amigos, hice un programa donde al pulsar un boton se encienden respectivamente cada led dependiendo del valor de una variable contador... o sea la variable contador en su primer momento vale 0 y lo muestra en la salida, luego vale 1 y lo muestra en la salida, y asi sucesivamente hasta llegar a 15 que es cuando se encienden los 4 led's y de ahí llego al final, lo que no he podido hacer es como hacer que se detenga cuando llegue a 15, y no se como comparar el valor de la variable con el valor 15..

Dejo adjunto la programacion y el esquematico.
 

Adjuntos

#2
Al igual que en el otro ejercicio que te corregía tiene muchos errores de código, pero ya funciona perfectamente. Fijate bien en la rutina retardo, ya que te cambie mucho codigo. Tienes que pulsar el botón seguido, supongo que lo quieres así. Por compara el valor 15 no te preocupes que cuando sea igual a 16 a efectos visuales va a ser lo mismo ya que es "0x00010000". No te entiendo en lo que dices de parar, ya que si estas pulsando seguido aun que lo pares, entra en el bucle otra vez. Lo tendrías que corregir detectando solamente la pulsación. Se puede comprobar se es 15 así:

btfss PORTB,0
goto salto
btfss PORTB,1
goto salto
btfss PORTB,2
goto salto
btfss PORTB,3
goto salto
movlw 0x00
movfw PORTB
goto Inicio

salto aqui continuas el programa por que aun no es 15

Gracias a ti, me desoxide un poco con ensambrado, casi lo tenía olvidado. Un saludo
 

Adjuntos

Última edición:
#3
hey gracias, pero ya consegui resolverlo, y lo hice haciendo pruebas y analizando paso a paso las instrucciones... Pero lo que me dices del debug me interesa bastante, utilizo un libro, pero es que hay cosas que no me quedan claras y por eso debo recurrir aqui.. Voy a colgar el corregido y asi lo testean y me dicen que tal!!.

Como se podran dar de cuenta cuando lo prueben, no arranca desde el bit 1, se pasa al 2 y comienza...
 

Adjuntos

Última edición:
#5
Por cierto, en la simulación para dejar el pulsador activado mientras estas haciendo el debug, le pulsas con el boton derecho y le seleccionas "TOGGLE". Un saludo
 
#6
Bueno si bien es cierto es mejor comparar el valor del contador con el numero 15, se hace restando el contador con W (previamente cargado con 15) y el resultado colocandolo en W, luego se verifica la bandera de cero, si esta en 1 es igual a 15 y no permites que se incremente el contador, si esta en 0 no son iguales y permites incrementar el contador, chauuuuu
 
#7
Bueno si bien es cierto es mejor comparar el valor del contador con el numero 15, se hace restando el contador con W (previamente cargado con 15) y el resultado colocandolo en W, luego se verifica la bandera de cero, si esta en 1 es igual a 15 y no permites que se incremente el contador, si esta en 0 no son iguales y permites incrementar el contador, chauuuuu
movlw 0x15
subwf variable,w

Si Z=1, variable es igual a 15
 
Última edición:
#8
Código:
movlw     0x0f    ; si es decimal si seria .15
bcf       status,zero     ;me aseguro que esta en cero antes de la resta
subwf     variable,w
btfss       status,zero
goto        contar uno mas
goto        no contar
Perdon copie mal , correjido
 
Última edición:
#9
Hey que bien, por lo menos pensé igual que ustedes.
Lo que no logro resolver es porque el programa no enciende el led con numero 1, y en la simulación se toma su tiempo, como si mandase la señal pero no lo prende y enciende el 2 y sigue ahí en adelante. Colocare el codigo completo para que lo vean, ya arreglado solo con el detalle del bit 1.
PHP:
; **** CABECERA****
	list p=16F84A
	#include P16F84A.inc
	__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
SALIDA		EQU		1
ENTRADA		EQU 	0
cont1 		EQU		0x0c
cont2		EQU		0x0d
cont3		EQU		0x0e
valor		EQU		0x1c

Reset 		org 	0x00
			goto 	Inicio
			org		0x05

Inicio		
	bsf		STATUS,RP0
			movlw	0xff
			movwf 	TRISA
			movlw	0x00
			movwf	TRISB
			bcf		STATUS,RP0
			bcf		PORTA,ENTRADA
					
			clrf	valor
inicio2
			btfss	PORTA,ENTRADA
			goto 	apagar
	aqui  	incf 	valor,1
			movwf	PORTB
			call	retardo
			call	apagar2
			call	retardo

			movlw	0x0f
			bcf		STATUS,Z	
			subwf	valor,w
	
			btfss	STATUS,2
			goto	aqui
			goto	apagar3
;---------------------------------
apagar		movlw	0x00
			movwf	PORTB
			clrf	valor
			goto	inicio2
;---------------------------------
apagar2		movlw	0x00
			movwf	PORTB
			return
;---------------------------------
apagar3		movlw	0x00
			movwf	PORTB
			clrf	valor
			goto	fin
;---------------------------------
retardo		movlw	d'5'
			movwf	cont3
			movlw	d'255'
			movwf	cont2
			movlw	d'255'
			movwf	cont1
			nop
			decfsz	cont1,F
			goto	$-.2
			decfsz	cont2,F
			goto	$-.6
			decfsz	cont3,F
			goto	$-.10
			return			
fin
end
 
#11
Lo que veo es que haces BCF PORTA, entrada, si es una entrada NO SE PUEDE borrar por soft porque depende del exterior, lo unico que puedes borra son salidas, lo de la demora puede ser que nunca pasas el valor del contador a w para pasarlo al PORTB y ademas usa una instruccion RETURN que solo se usa en subrutinas, ademas sin comentarios es imposible seguir el hilo, chauuuuuuuu
 
Arriba