Autor Tema: retados en asm  (Leído 22004 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado pedrolo21

  • PIC10
  • *
  • Mensajes: 2
retados en asm
« en: 22 de Junio de 2005, 06:13:00 »
hola os pregunte una pregunta el otro dia y creo q esta muy liada y por eso no me podeis contestar.

documentandome en varios sitios veo q los retardos los en asm se acen de la siguente manera (mas o menos) si no fuera corecto decirmelo tambien.

retardo
             clrwdt
              movlw   valor1
              movwf     contador_retardo_1
retardo_1
              movlw   valor2
              movwf   contador_retardo_2
retardo_2
              decfsz    contador_retardo_2,f
              goto        retardo_2
               decfsz   contador_retado_1,f
               goto       retardo_1
                retlw 0

mi pregunta seria q numero pondria en valor1 y en valor2  he visto otras rutinas de retado pero son = o muy parecidas a esta y no consigo saber de dnd salen estos valores.

a mi me gustaria trasnmitir  2400 baudios, 8 bits , con bit de stop y el oscilador
interno del pic 12f683 a 4mhz.

pero me gustaria seber si es una formula o como se obtiene ese valor para poder cambiar ese retardo.

1 saludo y haber si me podeis ayudar q no se como .
PD:si teneis otro metodo para hacer retardos no dudeis en decirmelo.





Desconectado guchipas

  • PIC10
  • *
  • Mensajes: 1
RE: retados en asm
« Respuesta #1 en: 09 de Julio de 2005, 21:52:00 »
Hola, Existe un programita muy bueno que te calcula los retardos y te genera el codigo de una forma sencilla. Basta ingresar la velocidad de nuestro oscilador (MHz) y el tiempo que se requiere demorar. Este programa se encarga de generar el c�digo fuente en ASM necesario para agregar en el programa y lograr as� la demora necesitada. Es muy preciso y confiable.
Lo consiges en la siguiente direccion:
http://www.pablin.com.ar/electron/download/picdel.zip

Espero te sirva.

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: retados en asm
« Respuesta #2 en: 10 de Julio de 2005, 03:21:00 »
Yo utilizo la siguiente formula para los retardos:

Retardo = (((256*3+3)*256+3)*valor3+8) * Tiempo de instrucción

El tiempo de instrucción es 4 veces mayor que el periodo de oscilación. Por ejemplo, si tienes un cuarzo de 4MHz, el tiempo de instrucción es 1us.

La rutina de retardos es la siguiente:

Codigo:
delayXX   clrf   contador1
   clrf   contador2
   movlw   valor3
   movwf   contador3
bucle   decfsz   contador1,f
   goto   bucle
   decfsz   contador2,f
   goto   bucle
   decfsz   contador3,f
   goto   bucle
   return


Aqui un ejemplo de retardo de un segundo:

Codigo:
;DELAY1S Retardo de 1 seg = ((256*3+3)*256+3)*5+8 = 986903us @ 4MHz

delay1s   clrf   contador1
   clrf   contador2
   movlw   d"5"
   movwf   contador3
dly1   decfsz   contador1,f
   goto   dly1
   decfsz   contador2,f
   goto   dly1
   decfsz   contador3,f
   goto   dly1
   return

Desconectado pocher

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: retados en asm
« Respuesta #3 en: 11 de Julio de 2005, 10:43:00 »
antoniof estaba un tanto aburrido esta tarde y se me ha ocurrido quitarle las telarañas a mi ensamblador.

La fórmula para el cálculo del retardo usando 3 bucles ¿no sería esta?:

Bucle1: valor1*3+2

Bucle2: ((valor1*3+2)+3)*valor2+2

Bucle3: ((((valor1*3+2)+3)*valor2+2)+3)*valor3+2

Retardo = ((((valor1*3+2)+3)*valor2+2)+3)*valor3+2+8) * Tiempo de instrucción

Simplificándola:

Retardo = (((valor1*3+5)*valor2+5)*valor3+10) * Tiempo de instrucción

Pégale un vistazo haber que te parece.

Un saludo

PD. Otra forma de conseguir retardos sería mediante un TMR, por ejemplo el TMR0 testeando el bit T0IF del registro INTCON. Esta forma para mi gusto es mucho más rápida de programar y más entendible que la de los bucles anidados, eso sí necesitas gastar un TMR.

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: retados en asm
« Respuesta #4 en: 12 de Julio de 2005, 08:41:00 »
Con la rutina de pedrolo21 esa sería la fórmula. En vez de sumar 3 hay que sumar 5 cada vez que se repite un bucle. En la mía se me ha ido la pinza. Yo siempre la utilizo poniendo a cero el contador 1 y el contador 2, jugando con el 3 para el retardo. Ya he modificado los mensajes. La primera rutina sería la más precisa entonces.

Desconectado micropics

  • PIC10
  • *
  • Mensajes: 2
Re: retados en asm
« Respuesta #5 en: 05 de Septiembre de 2009, 02:54:42 »
No soy muy experto pero creo que la forma mas rapida es utilizar una libreria pueden descargar de esta web http://www.dackenperu.com/librerias-assembler.php asi realizamos mas rapido un retardo que estar creando

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: retados en asm
« Respuesta #6 en: 08 de Septiembre de 2009, 06:36:05 »
La mejor formula es la que esta en este segundo post, el "picdel", que tambien la teneis en el primer hilo de este subforo, las temporizaciones son perfectas no fallan ni una millonesima y te da el codigo hecho, yo lo uso siempre y en las simulaciones en el MPLAB nunca tuve un desvio ni de 1us, cuando en un programa se ponen varias demoras hay que tener cuidado, pues hay que cambiar los nombres de las etiquetas y de los rgistros de RAM:

DEMORA                        ; demora 1ms
        movlw     .248      ; 1 set numero de repeticion
        movwf     PDel0     ; 1 |
PLoop0  clrwdt              ; 1 clear watchdog
        decfsz    PDel0, 1  ; 1 + (1) es el tiempo 0  ?
        goto      PLoop0    ; 2 no, loop
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.




DEMORA1                     ; demora 500ms
        movlw     .239      ; 1 set numero de repeticion  (B)
        movwf     PDel1     ; 1 |
PLoop1  movlw     .232      ; 1 set numero de repeticion  (A)
        movwf     PDel2     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
PDelL3  goto PDelL2         ; 2 ciclos delay
PDelL4  goto PDelL3         ; 2 ciclos delay
PDelL5  clrwdt              ; 1 ciclo delay
        decfsz    PDel2, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel1,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
PDelL6  goto PDelL5         ; 2 ciclos delay
PDelL7  goto PDelL6         ; 2 ciclos delay
PDelL8  goto PDelL7         ; 2 ciclos delay
PDelL9  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.