TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: josearrow en 01 de Marzo de 2007, 07:55:14
-
Hola,
Estoy empezando a entender el codigo asm, y tengo una rutina que no acabo de entender.
Esta pequeña rutina, lo que hace es ver si el contador esta dentro de unos limites, si no es así vuelve a loop a la espera de un conteo que se encuentre dentro de los límites para continuar...
clrf STATUS ; limpia Status
movfw perh ; carga perh to w
movwf aargb0 ; carga al aargb0 (high)
movfw perl ; carga perl al w
movwf aargb1 ;carga w a aargb1 (low)
clrf bargb0 ; limpia bargb0
movlw D'57' ; carga valor 57 a w
movwf bargb1 ; carga w a bargb1
movf bargb1,W ; mueve bargb1 al W
subwf aargb1,F ; resta aargb1(counter_low) - w(57) pone valor FileReg bargb1
movf bargb0,W ; mueve bargb0 al w
btfss STATUS,C ; Si resta < 0 entonces
incf bargb0,W ; incrementa bargb0+1
subwf aargb0,F ; resta aargb0(counter_high) - w pone valor FileReg aargb0
btfss STATUS,C ; Si H/L counter < 57 entonces
goto LOOP ; vuelve al loop
Lo que me gustaría es que alguien me explicara que es lo que hace esta rutina paso a paso, no se si los comentarios estan correctos, los puse yo. Las primeras instrucciones creo que están claras. Carga el valor de perh al aargb0 y el perl al aargb1.
Luego limpia bargb0, y pone el valor 57 en bargb1, mueve ese valor al acumulador y hace la resta, el valor del contador low - 57. Luego no tengo muy claro donde se guarda ese valor ??.
Entonces mueve el valor bargb0 al acumulador, que se supone = 0 porque lo ha limpiado antes!.
Luego va a comprobar cmo esta el flag C, si el valor es negativo se pone C=0, por tanto no saltará la proxima instruccion.
Entonces incrementaría bargb0+1, que si era 0 ahora será 1??. resta el valor del contadorhigh - el acumulador que será 1 en teoría, y lo guarda en aarb0??, al ser valido valores >57, el contador high debería ser 0, 0-1, sería negativo C=0 y entonces en el btfss iria al goto y volvería al loop?. No lo entiendo y me lio mucho.
Si por ejemplo tuvieramos valor perl=57 y perh=0, serían 57 conteos del timer, con lo cual la primera resta = 0, C=1 y saltaría, luego restaría perh - 0 = 0 , C=1 saltaría y seguiría con el programa porque sería un conteo valido ok!, Creo que está bien interpretado, no es asi??.
Luego imaginemos que tenemos perl=57 y perh=1 (que sería fuera de rango aceptado), la primera resta sería = 0, C=1 y saltaría, luego la segunda serían perh = 1 - 0 (del bargb0) = 1 C=1, y saltaría pero no debe saltar porque ese contador esta fuera de rango, creo que lo interpreto mal, me gustaría que me explicase algun alma caritativa, lo que va haciendo paso a paso con las restas y los contadores high y low. Creo que no lo entiendo bien...
Espero que alguien me de un poco de luz, gracias
-
es una resta de 16bits, AARGB - BARGB = AARGB y el resultado se guarda en este registro, y se basa en el bit C del STATUS para determinar si esa resta es negativa, segun el programa le carga un valor 57, entocnes quedaria asi: AARGB - d'57' = AARGB. :mrgreen: eso nomas era.
PD:
AARGB = aargb0 aargb1
BARGB = bargb0 bargb1
-
Hola, micro-cadaver...
Gracias por la respuesta, Ya se que es una resta de 16bits, pero no entiendo perfectamente cada instruccion, el barrido de cada una de ellas.
Serías tan amable de explicarme que hace cada instruccion con un ejemplo practico de perl=57 y perh=1??.
Es una forma de comprender mucho mejor el esquema de las instrucciones.
Gracias.
-
Hola, micro-cadaver...
Gracias por la respuesta, Ya se que es una resta de 16bits, pero no entiendo perfectamente cada instruccion, el barrido de cada una de ellas.
Serías tan amable de explicarme que hace cada instruccion con un ejemplo practico de perl=57 y perh=1??.
Es una forma de comprender mucho mejor el esquema de las instrucciones.
Gracias.
josearrow, sabes usar el simulador de MPLAB?
Te aconsejo que lo hagas usando eso. Ahí puedes cargar variables con determinados valores y de esa forma ir viendo todas las posibles alternativas.
Te puedo asegurar que eso y el datasheet con la explicación de qué hace cada instrucción a mano es la mejor forma de entender cómo funciona un código.
-
Hola maunix,
No, no se usarlo. Solo lo uso para compilar.
Sabes de algun manual para usar el simulador?. Yo tengo el mplab 7.10, y me sería de gran utilidad hacer lo que comentas.
Quiero entender perfectamente que hace en cada instruccion, se lo que hace esa pequeña rutina, pero quiero verlo claramente.
Un saludo.
-
m......... si puedes actualiza el mplab estaen la 7.5... creo, sino normal igual da, pucha busca en el foro algun post donde eseñen me parecio q por habia uno, no lo recuerdo bien, si no lo hayas nos avisas y vere como te puedo ayudar. exitos!! :-/
-
hola josearrow.
Los comentarios que aparecen a la derecha del codigo tienen un gran problema.. y es que no explican lo que hace, solamente dice en castellano lo que hace la instruccion puntualmente..
Esos comentarios, seria igual si no estuviesen ya que a mi entender la idea de comentar un programa es que al leerlo despues de algun tiempo, me de mas informacion que la que se puede sacar de solo traducir instrucciones.
Volviendo al tema de la simulacion.. lo que podes hacer es ir a debugger..select tool..MPLAB SIM.
Despues de copilar el programa, con F6 te posicionas en el inicio y con F7 te moves paso a paso.
Para ver que va pasando con los registros, podes habrir un View..Watch. y ahi elegir los registros que queres observar.
Tambien podes posicionarte con el mouse encima del registro (o variable) que quieras y aparecera el valor que tiene.
Saludos
-
Hola,
Gracias por la ayuda!, finalmente pude comprender bien lo que hacia. Estaba interprentandolo mal, ya que lo unico que hace esa rutina es restar los valores del contador a 57, para ver si son menores que 57. Es la unica condicion para que salte el goto. Aqui era donde yo lo mal interpretaba.
Puse el simulador y paso a paso, le di un valor a mano en el registro del timer0, a perl y perh, asi pude ver como hace la resta y probe varias condiciones. Solo volverá al loop si es <57 y el contador alto es 0, sino saltará a la siguente instrucción.
Lupin, el comentario lo puse yo, y esta mal claro!, ahora lo pondré mejor.
Ahora tengo otra duda.
1- Si es posible en el simulador meter por el pin3 un pulso de una frecuencia fija para testear el contador y demás variabes???.
2- Estoy intentando poner el contador con un valor fijo, y que vaya contando desde éste, hasta el acarreo, porque quiero que sea de 100us los intervalos, asi que como uso 16Mhz de crystal , 16/4= 4Mhz de instruccions . 0,25us cada instrucción y con prescaler 1:4, cada incremento seria de 1us, a mi me interesa que sea de 100us sin tocar el prescaler, asi que pensé en algo que vi, poner el contador TMR0 a 156 fijo, y que cuente desde 156 a 255 = 100 x 1us de cada incremento del contador = 100us.
Pongo parte del código, a ver si me podeis dar una pequeña ayuda.
;*****************************************************************************
; Program start
;*****************************************************************************
START clrf STATUS ; Clear Status
clrf INTCON ; Disable interrupts
clrf PCLATH ; Keep in lower KByte
clrf PORTA ; Clear ports
clrf PORTB
bsf STATUS,RP0 ; Select bank 1
movlw B'00010000' ; i/o port value
movwf TRISA
movlw B'00000001' ; i/o port value
movwf TRISB
movlw B'10000001' ; pullup off, prescaler=4,
movwf OPTION_REG ; Set the OPTION register
bcf STATUS, RP0 ; Select bank 0
clrf tmr0h ; clear high timer
clrf TMR0 ; clear timer
; 100uS loop time
; 16MHz clock / 4 = 4MHz instruction cycle
; prescaler set to divide by 4
; preset TMR0 = 156, when = 0 = 100uS
; 156 to 255 = 100 x 4(prescaler) = 100us
movlw .156 ;put 156 in TMR0
movwf TMR0
bsf INTCON,T0IE ; unmask the timer0 interrupt
bsf INTCON,GIE ; and enable interrupt.
LOOP btfsc INP
goto LOOP ; Wait for pulse Low
waitHigh btfss INP ;
goto waitHigh ; Wait for pulse high
---------------------------------------------------------------------------------------------------------------------------------------
Lo que no se es si está bien puesto ahi o debería ponerlo antes, y creo que debo ponerlo tb al empezar el loop.
Que os parece?.
Otra cosa, que es INP???.
Si es posible meter como un pulso por la pata3, ya podría verlo en el simulador y hacer pruebas hasta que rule...
Gracias.
-
Perdon, lo del INP es la entrada que me entra en el pin3 ra4 ls pulsos que cuenta el contador para saber su frecuencia.
ME interesa saber como es posible meterle al simulador esa entrada simulada de una frecuencia, es posible?.
El tema del contador tambien, pero si puedo hacer eso, intentaré probar...
Gracias.
-
si se puede, tienes q ir a la pestaña debugger y a la opcion pin stimulus, pero te confieso q a mi no me gusta la inteface del mplab te sugiero usar el proteus, en ese soft puedes colocar un pulsador fisico y de paso ver los registros en tiempo real y como se desarrolla tu programa tambien. :-/