ayuda con retrasos en pic

#1
Hola q tal, recien estoy aprendiendo a usar pic y tengo un problema al hacer retrasos de 1 microsegundo. Estoy usando el PIC16F877A con un OSC de 20MHz.

Si quiero hacer un delay de sólo 1 microsegundo sería así:

;---líneas de código---
call microseg
;---líneas de código---

donde la rutina microseg es:

microseg
nop
return
Pero si quiero hacerlo para más microsegundos hago esto

;---líneas de código---
movlw .10
call ret_us
goto $ ; para simular en el mplab en esta linea aplico un breakpoint
;---líneas de código---

donde la rutina de ret_us es:

ret_us
movwf 20H
ret1
nop
nop
decfsz 20H
goto ret1
return
al hacer esto obtengo lo ingresado más un microsegundo, es decir si almaceno 10 (en decimal) en 20H el tiempo q transcurre es 11 microsegundos. Lo mismo sucede para números hasta 255.

Hay alguna forma de reducir ese exceso de 1 microsegundo?

Espero que me puedan ayudar

Gracias por adelantado
 
#2
Recuerda que por la arquitectura la Finterna seria 20Mhz/4 = 5Mhz y el periodo seria 0.2 mSEG, por lo tanto para un retardo de 1mSEG debes usar al menos 5 instrucciones (sin saltos) y lo otro puede ser porque cargas el valor en W antes de llamar la subrutina y luego la llamas, no se si me equivoco pero al hacer el llamado el PIC modifica el PC (contador de programa y usa el W) y ahi puede estar el error, llama la subrutina y dentro de ella carga el valor de W, proba y nos contas, chauuuuuuuu
 

el-rey-julien

Well-known-Perejil Trans
#5
hee cuando se compila eso no se ve ,mañana subo unas subrutinas de tiempo que quizás te sirvan,no las subo hoy porque estoy en casa y el cd lo tengo en la fabrica
saludos
 

el-rey-julien

Well-known-Perejil Trans
#7
PD:
acá lo tenia seguro te sirve es cuestión de probar nomas ,el oscilador es de 4 mhz
monas agrega en el mismo direcyorio este archivo y en el programa principal pone #include retardos.inc
luego en donde quieran el retardo invoca con call el tiempo deseado

ejemplo call Retardo_10micros
 

Adjuntos

Última edición:
Arriba