Problema con PIC16f877 en el temporizador

buenas aqui tengo un problema con la programacion del pic
a partir de la entrada 5 comienza el problema ya que deberia de mandar un retardo de 10seg para que desacative la salida 3 y active la salida 4 y luego lo mismo con la salida 4 y la salida 5.
lo que pasa es que me desactiva todas las salidas aqui les mando el programita para ver si alguien me puede ayudar :D
la idea del programa es que se enciendan motores secuencialmente
el primero S1
luego cuando S1 esta activo puedo prender S2
luego S1 y S2 prendidos puedo prender S3
luego que S3 esta prendido pasan 10 seg y se apaga S3 y prende S4
luego que S4 esta prendido pasan 10 seg y se apaga S4 y prende S5
cada uno de los 3 motores tiene paradas
la parada de S3 solo desactiva S3 o S4 o S5
la parada de S2 desactiva lo desde S5 hasta S2
la parada de S1 desactiva todas las salidas
tambien tiene una entrada que te desactiva todo el proceso y te indica falla
para S3,S4 y S5 hay fallas por atascamiento
cuyas entradas desactivan dichos motores independientemente

bueno eso es todo si alguien puede me gustaria que revisase mi codigo para que me diga maso en que es mi error :D

Código:
list p=16f877
	INCLUDE	<P16F877.INC>
	INICIO EQU	0x20
	
	org 0
		
	BSF		STATUS,RP0		; CAMBIA DE BANCO A BANCO 1

	MOVLW 	b'00000110'
	MOVWF 	ADCON1

	MOVLW	B'11111111'		;CONFIGURA COMO ENTRADAS 1-8 PORTB
	MOVWF	TRISB

	MOVLW	B'00000011'		;CONFIGURA COMO ENTRADAS 9-10 PIN 0 Y 1
	MOVWF	TRISC

	CLRF	TRISD			;CONFIGURA	COMO SALIDAS 1-8 PORTD
	
	MOVLW	B'11111110'		;CONFIGURA RA0 COMO SALIDA 9
	MOVWF	TRISA
	
	BCF		STATUS,RP0		;CAMBIAS DE BANCO AL BANCO 0
	
	CLRF	PORTD			;PONE SALIDAS A 0
	CLRF	PORTA		
	
	MOVLW	B'00110000'		;CONFIGURAS EL TMR1 Y SU
							; PREDIVISOR SETEADO ENE EL MAXIMO PREDIVISOR
	MOVWF	T1CON

LAZO
	BTFSS	PORTB,0			;PREGUNTO SI RB0=1
	GOTO	LAZO
	BSF		PORTD,0
NEXT1   
	BTFSS   PORTB,1			;PREGUNTO SI RB1 = 1
	GOTO	NEXT2
	MOVLW	B'00000000'		;APAGO MOTOR 1
	MOVWF	PORTD
	BCF		PORTD,0
	GOTO	LAZO
NEXT2	
	BTFSS	PORTB,2			;SI ESTA RB2 = 1
	GOTO	NEXT1			;
	BSF		PORTD,1
NEXT3   
	BTFSS	PORTB,3			;SI RB3 =1
	GOTO 	NEXT4
	BCF		PORTD,1			;APAGO MOTOR 2
	BCF		PORTD,2
	GOTO	NEXT1
NEXT4
	BTFSS	PORTB,4			;SI ESTA RB4=1
	GOTO	NEXT3			
	BSF		PORTD,2			;PRENDO RD2 MOTOR 3
NEXT5						;RUTINAS DE RETARDOS
	BTFSS	PORTB,5			;SI ESTA RB5=1
	CALL	RETARDOS1		;SINO	VOY A RETARDO1
	BCF		PORTD,2			;SI ESTA APAGO MOTOR 3
	GOTO	NEXT3			;REGRESO A NEXT3
NEXT6
	BTFSS	PORTB,5			;SI ESTA RB5=1
	CALL	RETARDOS2		;SINO	VOY A RETARDO1
	BCF		PORTD,3			;SI ESTA APAGO MOTOR 4
	GOTO	NEXT3			;REGRESO A NEXT3
NEXT7
	BTFSS	PORTB,5			;SI ESTA RB5=1
	GOTO	NEXT8			;SINO PASO A NEXT8
	BCF		PORTD,4			;SI ES 1 APAGO MOTOR5
	GOTO	NEXT3
NEXT8
	BTFSS	PORTB,6			;PREGUNTO SI RB6 = 1 	X FALLA APAGO TODO Y DEJO INDICADOR DE FALLA EN RA0
	GOTO	FALLA1			;VOY A FALLA1
	CLRF	PORTD
	BSF		PORTA,0
	GOTO	NEXT1
FALLA1						;RUTINAS DE FALLAS
	BTFSS	PORTB,7
	GOTO 	FALLA2
	CLRF	PORTD
	BSF		PORTD,5
	GOTO	NEXT8
FALLA2
	BTFSS	PORTC,0
	GOTO 	FALLA3
	CLRF	PORTD
	BSF		PORTD,6
	GOTO	NEXT8
FALLA3 	
	BTFSS	PORTC,1
	GOTO	NEXT7
	CLRF	PORTD
	BSF		PORTD,7
	GOTO	NEXT8	

RETARDOS1
	movlw	.10
	movwf	R_VAR4
LAZO_RE4
	movlw	.4
	movwf	R_VAR5
LAZO_RE5
	movlw	.250
	call	RETms
	decfsz	R_VAR5
	goto	LAZO_RE5
	decfsz	R_VAR4
	goto	LAZO_RE4
	BSF		PORTD,3
	BCF		PORTD,2
	return

RETARDOS2
	movlw	.10
	movwf	R_VAR6
LAZO_RE6
	movlw	.4
	movwf	R_VAR7
LAZO_RE7
	movlw	.250
	call	RETms
	decfsz	R_VAR7
	goto	LAZO_RE7
	decfsz	R_VAR6
	goto	LAZO_RE6
	BSF		PORTD,4
	BCF		PORTD,3
	return

	INCLUDE<RETMS.INC>
END


y RETMS.INC esta aqui

Código:
	cblock
		contador1	;registro usado por retardo
		contador2	;registro usado por retardo		
		R_VAR1
		R_VAR2
		R_VAR3
		R_VAR4
		R_VAR5
		R_VAR6
		R_VAR7
	endc

;
t0		equ	0x82	;constante para generar aprox. 25ms
t4.6ms		equ	0x064	;constante para generar 4,6ms
t15.4ms		equ	0x144	;constante para generar 15,4ms
t200us		equ	0x01	;constante para generar aprox. 200us

;
retardo
	clrf	contador1	;aclara contador1
ret	decfsz	contador1,F	;
	goto 	ret
	decfsz	contador2,F
	goto	ret
	return	

ret50ms			;RETARDO 50 ms
	movlw	t0		
	movwf	contador2
	call 	retardo
	call	retardo
	return

ret100ms			;RETARDO 100 ms
	call	ret50ms		
	call	ret50ms
	return

ret300ms			;RETARDO 300 ms
	call	ret100ms
	call 	ret100ms
	call	ret100ms
	return

ret600ms			;RETARDO 600 ms
	call	ret300ms
	call	ret300ms
	return
;=================================
RETms
	movwf	R_VAR1
LAZO_RE1
	movlw	.250
	movwf	R_VAR2
LAZO_RE2
	movlw	.4
	movwf	R_VAR3
LAZO_RE3
	nop
	decfsz	R_VAR3
	goto	LAZO_RE3
	decfsz	R_VAR2
	goto	LAZO_RE2
	decfsz	R_VAR1
	goto	LAZO_RE1
	return
 
Hola. Primero recuerda configurar bien los resistores pullup del puerto b ya que lo estas utilizando como entrada y veo que trabajas con logica positiva. Lo de que te borra las salidas, puede ser que te falte un goto next 5 abajo del btfss portb,5 ... Sino te falta ningun testeo sino que asi es el programa, es porque rb3 esta en uno, hace el retardo, va a next3 y teniendo rb3 en uno, te borra todo y va a next1. Yo te aconsejaria apagar las pullup o dejarlas activadas pero eliminando resistores externos y utilizando logica de 0. Saludos.
 
Atrás
Arriba