TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Mady en 04 de Junio de 2007, 16:01:48
-
En el proyecto que estoy haciendo, recibo por la USART del 16F877 una serie de bytes, número total de bytes es variable.
Para almacenar los bytes, uso el modo indirecto y todo va bien. EL problema es que tengo que volver a recibir esos bytes, que tambien lo hago con modo indirecto maracando una nueva dirección de inicio para el puntero. En resumen,al final tengo dos tablas en mmemoria y ahora tengo que comparar ambas para ver si son identicas o no.
He intententado hacerme yo punteros, pero no sirve, y no sé si existe alguna otra técnica para comparar dos tablas, en definitiva ir recorriendo paralelamente cada posicion de cada tabla y compararlas.
Saludos y gracias de antemano
-
En el pic que mencionas, debes saber tú el inicio de cada tabla y luego el "offset" debiera ser el mismo para ambos ya que compararías la posicion 1 de la tabla 1, con la posición 1 de la tabla 2.
Sencillamente puedes usar el mismo FSR pero teniendo en cuenta que en un caso será INICIOTABLA1+offset y en el otro será INICIOTABLA2+offset
Guardas la primer lectura en una tercer variable temporal y la 2da lectura la puedes dejar en WREG. Allí las comparas y puedes determinar si son iguales (y continuar la comparación) o si son diferentes (y terminar allí mismo).
Saludos
-
Es lo que intenté hacer primero, pero al ir variando FSR, cuando tenia que incrementar la direccion a la que apuntaba, ya tenia el valor de inicio de la 2ª tabla, pero el de la priemra se habia machacado.
-
Es lo que intenté hacer primero, pero al ir variando FSR, cuando tenia que incrementar la direccion a la que apuntaba, ya tenia el valor de inicio de la 2ª tabla, pero el de la priemra se habia machacado.
Pero eso significa que tu código estaba mal hecho, y no que no se pueda.
Ahora si quieres más precisiones, sube el código.
-
Muchas gracias Maunix, revise el código y efectivamente se puede hacer sin problemas. Lo adjunto por si a alguien le sirve:
De nuevo decir, que ste foro es uan grandisima ayuda para los que estamos aprendiendo. Saludos
movlw 0x60
movwf tabla1 ;Asigna la primera dirección de tabla1
movlw 0x70
movwf tabla2 ;Asigna la primera dirección de tabla2
in_comp movf tabla1,W
movwf FSR ;Puntero a la 1º dir de tabla1
movf INDF,w ;Contenido de la 1ºdir de tabla 1-->w
movwf temp1 ;w-->temp1 (se vuelve a usar w y FSR)
movf tabla2,W
movwf FSR ;Puntero a la 1º dir de tabla2
movf INDF,w ;Contenido de la 1ºdir de tabla2-->w
subwf temp1,F ;w-temp1-->temp1
btfss STATUS,Z ;¿Ha sido 0 el resultado anterior?
goto distinto ;NO
goto iguales ;SI
distinto bsf F_COMP_RX; Avisa con la flag de que ya ha encontrado
; un byte no coincidente
return
iguales bcf F_COMP_RX ; Es 'z', ultimo byte
sublw 'z' ; Comprueba si el caracter comprobado es el último
; acordado (aqui 'z')
btfss STATUS,Z ;¿Es el último?
goto comp_nofin ; No es 'z'
return
comp_nofin incf tabla1; Incrementa a la siguiente dir a apuntar de tabla1
incf tabla2; Igual para tabla2
goto in_comp ;continua la comparación
-
Muchas gracias Maunix, revise el código y efectivamente se puede hacer sin problemas.
Me alegro que te haya funcionado, y muchos se alegrarán de que hayas compartido tu código.
Saludos