Ayuda con Secuencial de Luces en Pic 16F84A

Estimados,

Estoy haciendo un proyecto con el Pic 16F84A que hace lo siguiente. El puerto B está conectado a 8 led, y el RA0 está conectado a un switch. Cuando el switch está abierto, los led del puerto B encienden secuencialmente de RB0 a RB7 (con delay de 1 segundo), si enciendo el switch los led encenderan secuencialmente de RB7 a RB0. Mi problema es en el retardo, dado que se activa el led RB0, pero la rutina de retardo no sigue la secuencia. No se me ocurre como hacerlo.

Dejo el código en Assembler.
PHP:
INCLUDE <P16F84A.INC>
	LIST	P=16F84A
	
	CBLOCK	0x0c
	reg1
	reg2
	ENDC

	org	0
	goto inicio

inicio
	bsf		STATUS,RP0  	;Entro al banco 1
	bsf		TRISA,0			;Configuro el RA0 como entrada
	clrf	TRISB			;Dejo en cero el registro TRISB dejando como salida
	bcf		STATUS,RP0		;vuelvo al banco 0


switch
	movlw	b'00000001'		; Esta rutina escanea el puerto A, donde esta
	subwf	PORTA,0			; conectado el switch al RA0.	
	btfsc	STATUS,Z		
	call	secuencia_2		
	call	secuencia_1
	goto 	switch			
	
secuencia_1
	movlw	b'00000001'
	movwf	PORTB
	call	retardo_1s
	movlw	b'00000010'
	movwf	PORTB
	call	retardo_1s
	movlw	b'00000100'
	movwf	PORTB
	call	retardo_1s
	movlw	b'00001000'
	movwf	PORTB
	call	retardo_1s
	movlw	b'00010000'
	movwf	PORTB
	call	retardo_1s
	movlw	b'00100000'
	movwf	PORTB
	call	retardo_1s
	movlw	b'01000000'
	movwf	PORTB
	call	retardo_1s
	movlw	b'10000000'
	movwf	PORTB
	call	retardo_1s
	goto	switch

secuencia_2
	movlw	b'10000000'
	movwf	PORTB
	call	retardo_1s
	movlw	b'01000000'
	movwf	PORTB
	call	retardo_1s
	movlw	b'00100000'
	movwf	PORTB
	call	retardo_1s
	movlw	b'00010000'
	movwf	PORTB
	call	retardo_1s
	movlw	b'00001000'
	movwf	PORTB
	call	retardo_1s
	movlw	b'00000100'
	movwf	PORTB
	call	retardo_1s
	movlw	b'00000010'
	movwf	PORTB
	call	retardo_1s
	movlw	b'00000001'
	movwf	PORTB
	call	retardo_1s
	goto	switch



retardo_1s
	movlw	0xF8
	movwf	reg2
	nop
	nop
	nop
bucle_1
	nop
	decfsz	reg2
	call	retardo_1ms
	return
		
retardo_1ms
	movlw	0xF8
	movwf	reg1
	nop
	nop
	nop
bucle
	nop
	decfsz	reg1
	goto	bucle
	goto	bucle_1
	
	end
 
Estas cometiendo un error desde la rutina retardo_1ms mandas a una etiqueta que esta en otro lado y te metes nuevamente en la rutina retardo_1ms

eso no se puede hacer pues creas un conflicto de direccionamiento, la rutina retardo_1ms debes ejecutarla pero mandarla a otro lado y eso lo haces cuando llamas etiqueta bucle_1, miralo, chauuuuuuuuu

PD: la rutina retardo_1ms no tiene el RETURN
 
Última edición:
Aunque el problema no esta en la forma como sacas los datos, te recomiendo que le des una leida a las instruciones de rotacion de datos, rlf y rrf, con eso consigues el efecto de desplazamiento que necesitas.
 
Aunque el problema no esta en la forma como sacas los datos, te recomiendo que le des una leida a las instruciones de rotacion de datos, rlf y rrf, con eso consigues el efecto de desplazamiento que necesitas.

Bueno la forma de programar es muy personal, yo tambien usaria la instruccion de rotar hacia izq o derech, es mas sencillo y menos instrucciones se usan, pero igual el resultado es el mismo, la forma como lee el switch tambien es muy larga se podria hacer testeando el BIT simplemente, chauuuuuu
 
Bueno la forma de programar es muy personal, yo tambien usaria la instruccion de rotar hacia izq o derech, es mas sencillo y menos instrucciones se usan, pero igual el resultado es el mismo, la forma como lee el switch tambien es muy larga se podria hacer testeando el BIT simplemente, chauuuuuu

Totalmente deacuerdo, pero con cosas asi se puede lograr un codigo mucho mas compacto, eficiente y entendible. :cool:
 
Tambien te sugiero para los retardos usa un programita sencillo llamdo PICDELAY te hace el retardo y no te complicas con ello, chauuuuuuuuu
 

Adjuntos

  • Picdel_sp.rar
    83.7 KB · Visitas: 133
Podrian explicar como funciona el programa picdelay
Es muy sencillo.
1.- Se establece la frecuencia del oscilador en Mhz.
2.- Se establece el tiempo que se desea de retardo en Milisegundos. P.E (1000 Ms = 1 Segundo)
3.- Presionar Calcular Ciclos
4.- Presionar Genera Código (El programa empezara a generar el código)
5.- Se copia el código generado al programa.
6.- Se declaran las variables que el programa genera,
ya sea con PDel0 EQU 0xXX o dentro de un Bloque de variables CBLOCK 0xXX
(El mismo programa muestra como usar la función) CALL DEMORA

Adjunto un sencillo código de ejemplo para que quede más claro.
Suerte y hasta luego.
 

Adjuntos

  • Delay5.rar
    14.3 KB · Visitas: 84
Atrás
Arriba