Hola Bar-Tolo, que bien que ya le entendiste. bueno esta es la respuesta que estaba por publicar pero ya paque' no se como cancelarla SALUDOS
El programa de retardo esta bien. Cuando empezamos a programar pics y por ende a hacer retardos en ensamblador se suele confundir uno con los lazos anidados.
Ejemplo RETARDO CHICO:
Si queremos un retardo de aproximadamente 255 ciclos ¿que podemos hacer?... pues lo siguiente:
Retardo
movlw .255 ;en estos dos renglones cargamos reg3 con 255 en decimal
movwf reg_3 ;
ciclo1
decfsz reg_3,F ;decrementamos reg3 y saltamos si vale 0, aqui se encicla 255 veces
goto ciclo1
return
Si hasta aqui no hay problema le seguimos, podemos imaginar el ejemplo anterior como un BLOQUE NEGRO que se queda travado ahi dentro durante 255 ciclos sin hacer nada. Ahora bien, si queremos un retardo de digamos 2550 ciclos (osea 10 veces mas grande) ¿como le hacemos si los registros solo llegan hasta 255?... pues entonces tenemos que repetir el retardo anterior 10 veces, osea repetir el BLOQUE NEGRO 10 veces... ¿como le hacemos?... de la misma manera:
EJEMPLO2 (RETARDO MEDIO):
Retardo
movlw .10 ;Cargamos con el 10 al registro reg_2 para que
movwf reg_2 ;el retardito de 255 se repita 10 veces finalmente
ciclo2
;-----------------------------------------
movlw .255 ;En estos dos renglones cargamos reg3 con 255 en decimal
movwf reg_3
ciclo1
decfsz reg_3,F ;Decrementamos reg3 si NO es cero se encicla en "ciclo1"¿cuantas veces?... pues 255 veces
goto ciclo1
;----------------------------------------
decfsz reg_2,F ;Decrementa reg_2, si NO es cero se encicla en "ciclo2" ¿cuantas veces?... pues 10 veces
goto ciclo2 ;porque reg_2 lo cargamos al inicio con 10.
return
De esta manera hacemos que el primer retardo del ejemplo1 se repita 10 veces, osea que ahora tenemos un retardote de 10x255 ciclos = 2550, es decir, hicimos que el BLOQUE NEGRO se repitiera 10 veces. Pero que pasa si quieres un retardo aun mayor, digamos 25500 osea 10x2550... pues otravez, podemos imaginar el RETARDO MEDIO como nuestro NUEVO BLOQUE NEGRO y hay que repetirlo 10 veces de la misma forma otravez.
EJEMPLO 3 (RETARDO GRANDE):
Visualizamos el EJEMPLO2 (RETARDO MEDIO) como un bloque negro que se tiene que repetir N veces, en este caso 10 veces, y se procede de la misma forma que en las anteriores:
Retardo
movlw .10 ;Cargamos con 10 al reg_1
movwf reg_1 ;para que el retardo medio se repita 10 veces
ciclo3
;*****************************************************************
movlw .10 ;Cargamos con el 10 al registro reg_2 para que
movwf reg_2 ;el retardito de 255 se repita 10 veces al final
ciclo2
;-----------------------------------------
movlw .255 ;En estos dos renglones cargamos reg3 con 255 en decimal
movwf reg_3
ciclo1
decfsz reg_3,F ;Decrementamos reg3 si NO es cero se encicla en "ciclo1"¿cuantas veces?... pues 255 veces
goto ciclo1
;----------------------------------------
decfsz reg_2,F
goto ciclo2
;********************************************************************
decfsz reg_1,F
goto ciclo3
return
Asi tenemos un retardo GRANDE de 10x10x255, supongo que entonces ya te imaginas que se debe hacer si quieres un retardo aun MAYOR, y supongo que te imaginaras porque se llaman LAZOS ANIDADOS.
Los nombres RETARDO CHICO, MEDIO Y GRANDE solo son para explicar, lo mas correcto es llamarlos BUCLE 1, BUCLE 2, BUCLE 3 ... ETC.
En tu PROGRAMA tienes 3 registros de 10 20 y 30 osea que tienes un retardo de aprox 10x20x30=6000 ciclos, APROXIMADAMENTE.
Otro dato es que cada ciclo = 1microsegundo con un oscilador de 4MHz.
Hay formulas para calcular retardos en ENSAMBLADOR que despues te paso, va.
No dudes en preguntar, en estos foros aprendemos muuuuchas cosas.
Un saludo cordial