desktop

Problema con rutina de retardo en un PIC16F84

Tengo dudas de como hacer una subrutina de tiempo.
Mis compañeros de clase me pasaron una, pero estoy seguro de que no esta bien porque el código no se ejecuta como debe de ser.
Les adjunto el código para que me ayuden a ver cual es el problema.
De antemano se los agradezco mucho.
Código:
LIST	P=16F84
#INCLUDE	P16F84.INC
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC 
	
CONTA1	EQU 0CH
CONTA2	EQU 0DH
CONTA3	EQU 0EH	
	
	ORG	00H
	BSF	STATUS,RP0
	MOVLW	0FH
	MOVWF	PORTA
	MOVLW	00H
	MOVWF	PORTB
	BCF	STATUS,RP0

CERO	MOVLW	81H
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	MOVLW	42H
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
COMP1	BTFSS	PORTA,2
	GOTO	SIGUE
	GOTO	DOS
SIGUE	MOVLW	24H
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	MOVLW	18H
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	MOVLW	24H
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	BTFSS	PORTA,1
	GOTO	SIGUE2
	GOTO	UNO
SIGUE2	MOVLW	42H
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	BTFSS	PORTA,3
	GOTO	CERO
	GOTO	TRES
UNO	MOVLW	1H
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	MOVLW	2H
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	BTFSS	PORTA,2
	GOTO	SIGUE3
	GOTO	DOS
SIGUE3	MOVLW	4H
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	MOVLW	8H
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	MOVLW	10H
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	MOVLW	20H
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	MOVLW	40H
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	MOVLW	80H	
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	BTFSS	PORTA,3
	GOTO	SIGUE4
	GOTO	TRES
SIGUE4	MOVLW	40H
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	MOVLW	40H
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	MOVLW	20H	
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	MOVLW	10H
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	MOVLW	8H
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	MOVLW	4H
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	MOVLW	2H
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	MOVLW	1H	
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	BTFSS	PORTA,0
	GOTO	UNO
	GOTO 	CERO
DOS	MOVLW	55H
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	BTFSS	PORTA,1
	GOTO	SIGUE5
	GOTO	UNO
SIGUE5	MOVLW	0AAH
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	BTFSS	PORTA,3
	GOTO	IMG1
	GOTO	TRES
IMG1	BTFSS	PORTA,0
	GOTO	DOS
	GOTO	CERO
TRES	MOVLW	0FFH
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	BTFSS	PORTA,0
	GOTO	SIGUE6
	GOTO	CERO
SIGUE6	MOVLW	00H
	MOVWF	PORTB
	MOVLW	.10
	CALL	TIEMPO
	BTFSS	PORTA,1
	GOTO	MAX2
	GOTO	UNO
MAX2	BTFSS	PORTA,2
	GOTO	TRES
	GOTO	DOS

TIEMPO	MOVWF	CONTA3
LOOP3	MOVLW	.130
	MOVWF	CONTA2
LOOP2	MOVLW	0FFH
	MOVWF	CONTA1
LOOP1	DECFSZ	CONTA2,F
	GOTO	LOOP1
	DECFSZ	CONTA2,F
	GOTO	LOOP2
	DECFSZ	CONTA3
	GOTO	LOOP3
	RETURN
	
	END
...
 
a que te refieres que no ejecuta "como debe ser"?
y COMO DEBE SER?

no hay comentarios en el codigo.. tampoco lo he analizado...
podrias dar mas ideas?

en otro tema.. ya corregiste tu error con la directiva __CONFIG, y ahora otra vez..jeje borra las "amp;"
no hace falta explicar el motivo,
que tal si lees un poco mas sobre algunos puntos! que no entiendes??
 
Última edición:
Bueno.. Se que son necesarios los comentarios pero es que me de cierta flojera escribir todos..
Es una secuencia como de focos de arbol de navidad.. Si Ya se corrigió lo de __CONFIG

Y las amp! En el proyecto no están! No se porque aquí aparecieron! :S



O me podrías ayudar con un ejemplo de tiempo con un led que prenda y apague cada segundo!?
Para ver que es lo que haces y estudiarlo para aplicarlo en el proyecto.
 
Última edición:
Bsf status,rp0
movlw 0fh
movwf trisa
movlw 00h
movwf trisb
bcf status,rp0

...
DECFSZ CONTA3,F
GOTO LOOP3
RETURN

END

aclaro que no la rutina de retardo no anda :)
 
Última edición:
Gracias. Deja checarlo de ese modo.
Pero como me gustaría aprenderlo es con la etiqueta CALL como está en el código. Es que veo ejemplos en internet y no les entiendo ya sea porque los ponen en el código con el que se enseñaron.
 
Ahhh me estoy loqueando con la rutina de temporizacion...
de hecho qeu re estan reeescribiendo los registros y nunca va a acabar..

me estoy complicando con 3 simples registros de retardos por ciclos de reloj..jaja
cuanto tiempo querias?.. estoy con tu codigo .. mmm
sabes?
retardos con PIC en asm..
ya hay subrutinas hechas. y hasta programas que te generar una rutina.. segun el retardo que quieras,
un ejemplo:
http://www.todopic.com.ar/foros/index.php?topic=24720.msg201398#msg201398

y te recomiendas que des una revisada a ese tutorial completo, es muy bueno..

CALL:
no es una etiqueta, es una instruccion...
salta a una direccion y empieza a ejecutar el programa que haya a partir de ahi
hasta encontrar la instruccion RETURN y regresa a la posicion original+1 antes que ejecutaras el CALL

para que lo entiendas.. no es conveniente pegar toda la rutina de retardo cada ves que quieras ejecutarlo.. entre cada cambio de luces en el PuertoB.
solo haces un CALL RETARDO, ejecuta el retardo y regresa, envia otra secuencia al puerto B y llamas otra vez a RETARDO hasta que acabes..
 
Última edición:
Bueno.. Se que son necesarios los comentarios pero es que me de cierta flojera escribir todos..

Si a ti te da flojera escribir los comentarios... imaginate lo que nos da a nosotros al tratar de interpretar tu codigo.... los comentarios no solo son para hacer un programa mas entendible... son para que otros programadores puedan entenderlo y mejorarlo dando sus propias ideas

Ademas de que es tambien ayuda para ti... de aqui a 6 meses podras volver a leer ese codigo y entender lo que TU quisiste hacer...
 
TIEMPO
MOVWF CONTA3; //Cargas conta3 con el valor de W
LOOP3
MOVLW .130
MOVWF CONTA2; //Cargas conta2
LOOP2
MOVLW 0FFH
MOVWF CONTA1; //Cargas conta1
LOOP1
DECFSZ CONTA2,F; //Decrementa conta2 y salta si es 0
GOTO LOOP1;
DECFSZ CONTA2,F; Decrementa conta2 y salta si es 0 ???
GOTO LOOP2
DECFSZ CONTA3; //Decrementa conta3 y salta si es 0.
GOTO LOOP3
RETURN.

Estas haciendo un loop continuo al decrementar y condicionar contab2. creo que primeramente deberias decrementar contab1.

saludos.
 
pablinza. Muchas gracias, cambie el primer CONTA2 a CONTA1 y funcionó :))!! (Según el maestro estaba bien :( )

Ahora solo no cambia de secuencia>.<!! Checaré el programa para ver que puede ser el problema.



Les comparto un vídeo de una pequeña práctica para ensallar.
 
Última edición:
Atrás
Arriba