Autor Tema: retraso de 500, 50, 20 y 10 micro  (Leído 2572 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado nacha4

  • PIC16
  • ***
  • Mensajes: 113
retraso de 500, 50, 20 y 10 micro
« en: 23 de Abril de 2006, 02:36:40 »
Hola necesito hacer un retraso de 500, 50, 20 y 10 micro lo que yo hice me parese medio a lo bruto quisiera saber si esto anda o si hay alguna forma mas sensilla de hacerlo

Retardo_10micros
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   nop
   return
Retardo_20micros
   call Retardo_10micros
   call Retardo_10micros
   return
Retardo_50micros
   call Retardo_20micros
   call Retardo_20micros
   call Retardo_10micros
   return
Retardo_500micros
   call Retardo_50micros
   call Retardo_50micros
   call Retardo_50micros
   call Retardo_50micros
   call Retardo_50micros
   call Retardo_50micros
   call Retardo_50micros
   call Retardo_50micros
   call Retardo_50micros
   call Retardo_50micros
   return

desde ya muchas gracias
nacha

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
Re: retraso de 500, 50, 20 y 10 micro
« Respuesta #1 en: 23 de Abril de 2006, 06:01:33 »
Buenas.

Tus rutinas estan bien, pero ocupan mucha memoria de programa, en comparación con estas:

Código: ASM
  1. ;RETARDO: Retardo de 10us = (3*2+4)*1us = 10us 
  2.                
  3. retardo_10micros
  4.         movlw   d'2'
  5.         movwf   contador1
  6. b10u    decfsz  contador1,f
  7.         goto    b10u
  8.         return

Te explico: El bucle 'b10u' tarda en ejecutarse 3 instrucciones, es decir, 1 para el 'decfsz' y 2 para el 'goto'. Este bucle se repite tantas veces como valor tenga el registro 'contador1'. En este caso, contdor1 vale 2, pues tenemos 2*3 instrucciones. El 4 final se suma por las 2 instrucciones que se ejecutan al cargar el valor del contador y las otras 2 del return. EL resto es igual:

Código: ASM
  1. ;RETARDO: Retardo de 20us = (3*5+4+1)*1us = 20us       
  2.                
  3. retardo_20micros
  4.         movlw   d'5'
  5.         movwf   contador1
  6.         nop
  7. b20u    decfsz  contador1,f
  8.         goto    b20u
  9.         return

Aqui se le pone un nop para que exactamente sean 20 microsegundos.

Código: ASM
  1. ;RETARDO: Retardo de 50us = (3*15+4+1)*1us = 50us      
  2.                
  3. retardo_50micros
  4.         movlw   d'15'
  5.         movwf   contador1
  6.         nop
  7. b50u    decfsz  contador1,f
  8.         goto    b50u
  9.         return

Código: ASM
  1. ;RETARDO: Retardo de 500us = (3*165+4+1)*1us = 500us   
  2.                
  3. retardo_500micros
  4.         movlw   d'165'
  5.         movwf   contador1
  6.         nop
  7. b500u   decfsz  contador1,f
  8.         goto    b500u
  9.         return

Espero que te sirva. Todo esto es suponiendo un cristal de 4MHz. Para otro cristal ya no se multiplica por 1us si no por el que corresponda, y habría que modificar los valores que se cargan en el contador.
« Última modificación: 23 de Abril de 2006, 06:38:11 por antoniof »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: retraso de 500, 50, 20 y 10 micro
« Respuesta #2 en: 23 de Abril de 2006, 13:04:08 »
Hola, si deseas que la PC calcule los retardos por ti y te genere el código de la subrutina para que tú nadamás copies y pegues, revisa el adjunto  :wink:


Desconectado Yosupicprog

  • PIC10
  • *
  • Mensajes: 36
Re: retraso de 500, 50, 20 y 10 micro
« Respuesta #3 en: 24 de Abril de 2006, 11:32:21 »
Gracias miqsantiago....

Ese software esta muy bueno para mis pupilos....
Ing. Yosu Izaguirre R.
yosupicprog@yahoo.com
yosupicprog@hotmail.com
Maracaibo Estado Zulia, VENEZUELA..¡

PROGRAMARLOS ES MI HOBBYE-EL LIMITE ES TU IMAGINACION