TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Gorgonas en 15 de Septiembre de 2007, 20:52:19
-
Hola he abierto un post en la seccion de c para pasar un proyecto de asm a c, pero bueno, la verdad es que es normal que a la gente no le apetezca lo mas minimo traducir rollos ke ni le interesan, asi que no me keda mas remedio que romperme la cabeza.
Abro este post aqui porke creo que es el sitio adecuado, la cosa es que hay trozos de asm que por mas que intento comprender no lo consigo, a ver si alguien me echa una manillo ;) con lo que por mas que intento no soy capaz de descifrar.
En esta rutina.
------------------------------------
Flash:
bsf PORTA,3
call Testlus
bcf PORTA,3
call Testlus
return
-------------------------------
primero enciende el bit 3 de puerto A. llama a testlus lo paga y vuelve a llamar a testlus. Pues bien testlus es esto
--------------------------
Testlus:
movlw H'FF'
movwf W1
movlw H'08'
movwf W2
movlw H'01'
movwf W3
call Testlusloop
--------------------------
Aki pone el valor FF a w1 08 a w2 y 01 a w3 y llama a testlusloop, que es la rutina que por mas que intento no llego a comprender como funciona realmente, en teoria es un retardo pero no se como funciona.
---------------------------
Testlusloop:
decfsz W1,F
goto Testlusloop
decfsz W2,F
goto Testlusloop
decfsz W3,F
goto Testlusloop
return
---------------------
van decreciendo todo el rato los registros w1 w2 y w3 e imagino que eso sera lo que hara perder tiempo y sera el retardo pero no se como conocer el tiempo de retardo de la primera funcion donde w1 era ff w2 08 y w3 01.
Para que os hagais una idea otras funciones de retardo que si tienen nombre dentro de la libreria toman los siguiente valores:
100ms w1 FF w2 dc w3 01
15ms w1 FF w2 01 w3 01
1ms w1 50 w2 01 w3 01
La duda de todo este rollo es poder saber cual es el tiempo de la 1 funcion de retardo llamada testlus. Si alguien me ayuda lo agradeceria muchisimo, es bastante complicado esto del asm y no hay tampoco mucha informacion.
Gracias a todo el que haya llegado hasta aqui.
-
La duda de todo este rollo es poder saber cual es el tiempo de la 1 funcion de retardo llamada testlus. Si alguien me ayuda lo agradeceria muchisimo, es bastante complicado esto del asm y no hay tampoco mucha informacion.
Gracias a todo el que haya llegado hasta aqui.
El retardo es que tu le programes, como bien te has dado cuenta el retardo depende del valor que hayan tomado cada uno de los registros.
Para sacar un valor super exacto, es algo tedioso y lo mejor es simularlo. Pero para que tengas una idea de cuanto duraría, te puedo decir que el ciclo de W3 veces se repetirá el ciclo W2, el cual a su vez obligará al ciclo que dura W1 veces a repetirse W2 veces.
En tu caso, se repetira 1 vez (ya que W3=1) la demora de la repetición de 8 veces del bucle W2 el cual hará repetir 255 veces al bucle W1.
Entonces, demorará 255 x 8 x 1 veces todo el bucle. Lo cual no es lo mismo que instrucciones ya que los goto's duran por ejemplo 2 instrucciones. Es por ello que te digo de simularlo.
Saludos
-
Hola Gorgonas.
Si renegás un poco(mucho), podés obtener la fórmula para calcular analíticamente la cantidad de instrucciones que lleva ejecturar uno de esos bucles.
En tu caso, la fórmula que yo desarrollé es:
cantidad instrucciones = W1*3-1 + (256*3-1) * (W2-1) + W2*3-1 + [(256*3-1)*256+3*256-1]*(W3-1) + W3*3-1
Haciendo la excepción que toda variable(W1,W2 o W3) que ingrese al algoritmo valiendo 0 debe ser ingresada a la fórmula con el valor 256.
Para calcular finalmente el tiempo que lleva en ejecutarse dichas instrucciones, simplemente hacer por ejemplo:
en microsegundos:
uS = cantidad instrucciones * 4/FOSC
o bien en milisengundos:
mS= uS / 1000
Ejemplo:
W1= .129
W2= .47
W3= .16
Según el MPLAB SIM lleva:
(http://ar.geocities.com/brunodini/demora.jpg)
2992640 instrucciones.
Comprobemos si mi fórmula es correcta:
cantidad instrucciones = W1*3-1 + (256*3-1) * (W2-1) + W2*3-1 + [(256*3-1)*256+3*256-1]*(W3-1) + W3*3-1 =
cantidad instrucciones = 129*3-1 + (256*3-1) * (47-1) + 47*3-1 + [(256*3-1)*256+3*256-1]*(16-1) + 16*3-1 =
cantidad instrucciones = 386 + 35282 + 140 + 2956785 + 47 =
cantidad instrucciones = 2992640
Lo que corrobora que mi fórmula es correcta.
-
En tu caso, la fórmula que yo desarrollé es:
Por suerte cuando uno está vago para hacer las cuentas (léase "yo") viene super Bruno y se pone con ello. :mrgreen: :mrgreen:
Felicitaciones
-
Gracias a los dos por responder y muchas gracias bruno por molestarte en hacer los calculos y poner la formula, ya entiendo perfectamente como funciona el sistema. :D
-
En tu caso, la fórmula que yo desarrollé es:
Por suerte cuando uno está vago para hacer las cuentas (léase "yo") viene super Bruno y se pone con ello. :mrgreen: :mrgreen:
Felicitaciones
Jaja! Lo hice más a manera de ayuda-memoria. Hacía rato que no calculaba el tiempo que demora un algoritmo en papel...
Gracias a los dos por responder y muchas gracias bruno por molestarte en hacer los calculos y poner la formula, ya entiendo perfectamente como funciona el sistema. :D
Me alegro que te haya servido. Exitos!
Saludos.
-
hola!! como estan necesito ayuda!! mi problema es en si en el mplab estoy trabajando con la version 7.5v estuve probando un programa de encender y apagar leds que saque del foro mis primeros pasos pasos con el 18f4550 me da perfecto al coilarlo pero cuando voy a buscar la ventana de simulacion para estimular los pines con bajos y altos no logro encontrar la ventana, me meti por ayuda del mplab y la ventana que sale en la misma no aparece en el program por favor cualquier ayuda agradeceria mucho. :g)
-
coromoto para simular estímulos de pines debes ir a
Debugger, Stimulus, New Workbook. Luego eliges la pestaña Asynch y allí puedes configurar estímulos asíncronos visualmente.