problema con un bucle de retencion

hola ando programando un emulador de contro remoto para camaras reflex nikon (ml-23)

la secuencia anda bien, sin embargo la idea es que al apretar el boton envie envie las pulsaciones una sola vez, eso es lo que haria el programa en teoria, sin embargo algo falla

la ultima parte ( las ultimas 4 lineas ) mantiene el microcontrolador en un bucle hasta que se suelta el boton, de ahi vuelve a la primera parte, a esperar que se apriete de nuevo para repetir el proceso.

sin embargo al apretar, la secuencia se empieza a repetir infinitamente, y no logro encontrar la causa.

les dejo la fuente, gracias por su ayuda


Código:
STATUS      equ       03h              ; Dirección del registro STATUS

TRISA       equ       85h              ; Dirección del registro tri-estado para el Puerto A.

PORTA       equ       05h              ; Dirección del Puerto A.
PDel0       equ       08h              ; direccion de un registro de proposito general
PDel1       equ       09h              ; direccion de otro registro de proposito general
;****************************************************////////////////////////****************************************

	bsf	STATUS,5	; cambio al banco 1
	movlw	01h	; pongo 0001 en w
	movwf	TRISA	; pongo w en trisa
	bcf	STATUS,5	; vuelvo al banco 0

pulsa	btfss	PORTA,0	; si el pin o esta en estdo 1 
	goto	pulso	; si esta en 0 (pulsado) voy a pulso
	goto	pulsa	; salto a este pedazo que me vuelve al inicio

;****************************************************************************
pulso	bsf	PORTA,1	; prendo el led                                     *
;                                                                           *
;***************///-- espero 1999 ciclos --///******************            *  


	movlw     .249      ; 1 set numero de repeticion 
      	movwf     PDel0     ; 1 |
PLoop0	clrwdt              ; 1 clear watchdog
PDelL1	goto PDelL2         ; 2 ciclos delay
PDelL2	goto PDelL3         ; 2 ciclos delay
PDelL3 
      	decfsz    PDel0, 1  ; 1 + (1) es el tiempo 0  ?
        goto      PLoop0    ; 2 no, loop
PDelL4	goto PDelL5         ; 2 ciclos delay
PDelL5	


;***************///-- termina la espera   --///*****************


	bcf	PORTA,1     ; apago el led


;***************///-- espero 27829 ciclos --///*****************
        movlw     .37       ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop11  movlw     .187      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop21  clrwdt              ; 1 clear watchdog
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop21    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop11    ; 2 no, loop
;***************///--  termina la espera  --///*****************

	bsf	PORTA,1	; prendo el led 

;***************///--  espero 389 ciclos  --///*****************
        movlw     .96       ; 1 set numero de repeticion 
        movwf     PDel0     ; 1 |
PLoop02  clrwdt              ; 1 clear watchdog
        decfsz    PDel0, 1  ; 1 + (1) es el tiempo 0  ?
        goto      PLoop02    ; 2 no, loop
;***************///--  termina la espera  --///*****************

	bcf	PORTA,1	; lo apago

;***************///--  espero 1579 ciclos --///*****************
        movlw     .224      ; 1 set numero de repeticion 
        movwf     PDel0     ; 1 |
PLoop03  clrwdt              ; 1 clear watchdog
PDelL13  goto PDelL23         ; 2 ciclos delay
PDelL23  clrwdt              ; 1 ciclo delay
        decfsz    PDel0, 1  ; 1 + (1) es el tiempo 0  ?
        goto      PLoop03    ; 2 no, loop
PDelL33  goto PDelL43         ; 2 ciclos delay
PDelL43  goto PDelL53         ; 2 ciclos delay
PDelL53  goto PDelL63         ; 2 ciclos delay
PDelL63  
;***************///--  termina la espera  --///*****************

	bsf	PORTA,1	; lo prendo otra vez

;***************///--  espero 409 ciclos  --///*****************
        movlw     .101      ; 1 set numero de repeticion 
        movwf     PDel0     ; 1 |
PLoop04  clrwdt              ; 1 clear watchdog
        decfsz    PDel0, 1  ; 1 + (1) es el tiempo 0  ?
        goto      PLoop04    ; 2 no, loop
;***************///--  termina la espera  --///*****************

	bcf	PORTA,1 ; lo apago otra vez

;***************///--  espero 3579 ciclos --///*****************
        movlw     .19       ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop15  movlw     .46       ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop25  clrwdt              ; 1 clear watchdog
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop25    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop15    ; 2 no, loop
PDelL15  goto PDelL25         ; 2 ciclos delay
PDelL25  
;***************///--  termina la espera  --///*****************

	bsf	PORTA,1	; prendo el led 

;***************///--  espero 399 ciclos  --///*****************
DEMORA  movlw     .98       ; 1 set numero de repeticion 
        movwf     PDel0     ; 1 |
PLoop06  clrwdt              ; 1 clear watchdog
        decfsz    PDel0, 1  ; 1 + (1) es el tiempo 0  ?
        goto      PLoop0    ; 2 no, loop
PDelL16  goto PDelL26         ; 2 ciclos delay
PDelL26  
;***************///--  termina la espera  --///*****************

	bcf	PORTA,1	; apago el led por ultima vez en la secuencia

espero	btfsc	PORTA,0	; espero a que se suelte el boton para volver al inicio
	goto	pulsa	; sino tendria un chorrete infinito de obturaciones (lo que sucede)
	goto	espero
	end

ah me falto un detalle, esto no lo probe en el pic en si, sino en un simulador, no creo que sea el problema por que ha sico muy preciso con otras cosas.

esto lo hago simplemente por que todavia no tengo programador (a construir en un futuro cercano)
 
Última edición:
que tal amigo diego.

creo que tu problema es manejar muchas etiquetas con el mismo criterio de nombre.

En el ultimo ciclo que tienes comentado como espero 399 ciclos. en la parte donde decrementas la variable PDEL0 haces un salto a el inicio de todo con un goto PLoop0 y creo que lo que querias hacer era un goto PLoop06.

Para evitar esto te recomendaria generar mejor un retardo con bases de tiempo prefijadas y buscar hacer mutiplos de esos retardos, asi seria mas legible el codigo.

un saludo
 
si, voy a reconstruir los retardos, en realidad tienen etiquetas similares por que los hice con un generador, igual ahora ya entendi como hacerlos manualmente

muchas gracias che!
 
por que todavia me falta aprender a usarlas

XD

che muchas gracias a todos, esto ya funciona!
despues cuando aprenda todas las instrucciones del asm de los pic voy a ir mejorando esto y haciendo otras cosas pero para empezar cumple su funcion y eso sirve y mucho!

espero cuando tenga mas experiencia poderles ser util tambien
 
Última edición:
Atrás
Arriba