Autor Tema: rutina de resta con contador high y low, ayuda!.  (Leído 3029 veces)

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

Desconectado josearrow

  • PIC10
  • *
  • Mensajes: 40
rutina de resta con contador high y low, ayuda!.
« 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

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: rutina de resta con contador high y low, ayuda!.
« Respuesta #1 en: 01 de Marzo de 2007, 09:45:24 »
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


a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado josearrow

  • PIC10
  • *
  • Mensajes: 40
Re: rutina de resta con contador high y low, ayuda!.
« Respuesta #2 en: 01 de Marzo de 2007, 10:30:46 »
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.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: rutina de resta con contador high y low, ayuda!.
« Respuesta #3 en: 01 de Marzo de 2007, 10:51:55 »
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.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado josearrow

  • PIC10
  • *
  • Mensajes: 40
Re: rutina de resta con contador high y low, ayuda!.
« Respuesta #4 en: 01 de Marzo de 2007, 11:30:42 »
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.


Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: rutina de resta con contador high y low, ayuda!.
« Respuesta #5 en: 01 de Marzo de 2007, 11:36:23 »
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!!  :-/
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado Lupin

  • PIC12
  • **
  • Mensajes: 81
Re: rutina de resta con contador high y low, ayuda!.
« Respuesta #6 en: 01 de Marzo de 2007, 18:01:49 »
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

Desconectado josearrow

  • PIC10
  • *
  • Mensajes: 40
Re: rutina de resta con contador high y low, ayuda!.
« Respuesta #7 en: 02 de Marzo de 2007, 13:33:33 »
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.

Desconectado josearrow

  • PIC10
  • *
  • Mensajes: 40
Re: rutina de resta con contador high y low, ayuda!.
« Respuesta #8 en: 02 de Marzo de 2007, 15:23:58 »
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.

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: rutina de resta con contador high y low, ayuda!.
« Respuesta #9 en: 03 de Marzo de 2007, 00:56:20 »
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.  :-/
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com


 

anything