TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: nacha4 en 23 de Abril de 2006, 02:36:40

Título: retraso de 500, 50, 20 y 10 micro
Publicado por: nacha4 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
Título: Re: retraso de 500, 50, 20 y 10 micro
Publicado por: antoniof 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.
Título: Re: retraso de 500, 50, 20 y 10 micro
Publicado por: migsantiago 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:

Título: Re: retraso de 500, 50, 20 y 10 micro
Publicado por: Yosupicprog en 24 de Abril de 2006, 11:32:21
Gracias miqsantiago....

Ese software esta muy bueno para mis pupilos....