TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: NITITA en 11 de Mayo de 2008, 13:36:02
-
Hola! necesito ayuda en una parte de una practica que esoy haciendo. El caso es que tengo que hacer la comprobacion del checksum y el problema es que no acabo de comprender exactamenteel direccionamiento indirecto ( que es con lo que lo tengo que hacer)
En principio lo que tengo que hacer es sumar dos campos ( destino y datos)
movlw 0x0c
movwf 0x04;fsr
addwf 0x0d; <---------aki es donde ya me pierdo un poko porque realmetne no se si hago bien metiendo otra direccion de memoria para okuparme del segundo operando que me hace falta para sumar.. pero si pongo eso de que manera estoy metiendome en "INDF"?
ya despues de hacer eso llamo a una funcion acarreo para comprobar si tengo que sumar o no uno.. y paso al siguiente octeto de numeros.. para sumar.. y realmente no se si tengo que cambiar de posicion de memoria o sigo
trabajando en la misma... si alguien me ayuda,, estaria muy agradecida.
un saludo
-
BIENVENIDA AL FORO!!! NITITA :-/ :-/ :-/
Voy a tratar de darte un poco de ayuda aunque no soy muy bueno explicando.... :mrgreen:
El direccionamiento indirecto consta en acceder a cualguiera de los registros de la ram a travez de un solo registro (INDF) direccionando su ubicacion por medio de un puntero,en el cual se le carga la direccion del registro deseado (FSR).
ejemplo: quieres borrar todos los registros desde la ubicacion h'2e' a la h'32'...
......................
...................
MOVLW H'2E' ;DIRECCION DEL PRIMER REGISTRO
MOVWF FSR
CLEAR CLRF INDF
INCF FSR,F
MOVLW H'33' ;ULTIMO REGISTRO +1
SUBWF FSR,W
BTFSS STATUS,Z
CALL CLEAR
...................
..............
ed y tado... :mrgreen:
-
Saludos!
Nitita, bienvenida al foro! :-/
El direccionamiento indirecto consta en acceder a cualguiera de los registros de la ram a travez de un solo registro(incf) direccionando su ubicacion por medio de un puntero,en el cual se le carga la direccion del registro deseado (fsr).
Buena explicación picNIC!, pero el registro sería indf no? (colocaste incf, te lo resalté en negrilla)... más adelante sí lo escribiste bien, pero deberías corregirlo para que no se preste a confusión...
En principio lo que tengo que hacer es sumar dos campos ( destino y datos)
movlw 0x0c
movwf 0x04;fsr
addwf 0x0d; <---------aki es donde ya me pierdo un poko porque realmetne no se si hago bien metiendo otra direccion de memoria para okuparme del segundo operando que me hace falta para sumar.. pero si pongo eso de que manera estoy metiendome en "INDF"?
Se ve más elegante que declares al inicio de tu programa:
fsr equ 0x04
indf equ 0x00
temp equ 0x20 ;variable temporal
w equ 0
f equ 1
Entonces me imagino que quieres sumar los registros 0x0C + 0x0D mediante direccionamiento indirecto...
Sería:
movlw 0x0c
movwf fsr
movf indf,w ; Aquí se carga el valor del registro 0x0c (donde apunta fsr) a W
movwf temp ; cargas el valor de 0x0c en un registro temporal
movlw 0x0d
movwf fsr
movf temp,w ;mueve el valor de 0x0c que estaba en registro temporal a W
addwf indf,w ;suma el valor del registro 0x0d (donde está apuntando fsr) y guarda en w
movwf temp ; mueve el resultado a la variable temporal
Ok espero haberme explicado...
Si quieres volver a sumar dos registros lo que tienes que hacer es cambiar las direcciones de la primera y quinta línea... y listo, funcionará de lo lindo... y recuerda que el resultado siempre lo vas a tener en el registro 0x20, que yo llamé temp... por supuesto, eso lo puedes cambiar... si quieres asigna otro registro con otro nombre... como tú quieras! :D
Dale pues, nos leemos! :mrgreen:
-
Bueno una observación! :lol:
Si vas a sumar siempre registros sucesivos (como 0x0c y 0x0d), puedes sustituir la cuarta y quinta línea por un "incf fsr,f"... tal como en el ejemplo que te colocó picNic para borrar registros consecutivos de la RAM.
Además, no haría falta incluir movimientos a la variable temporal, y el resultado de la suma quedaría en W, que luego podrías pasar a un registro donde guardes el resultado (no es bueno dejarlo en W).
Así:
fsr equ 0x04
indf equ 0x00
result equ 0x20
w equ 0
f equ 1
movlw 0x0c ;valor del primer registro
movwf fsr ;lo mueves al puntero fsr
movf indf,w ; Aquí se carga el valor del registro 0x0c (donde apunta fsr) a W
incf fsr,f ; incrementas fsr (ahora apunta a 0x0c+1=0x0d)
addwf indf,w ;suma el reg 0x0d (donde está apuntando fsr) con el valor de 0x0c (que está en W) y guarda en w
movwf result ; guarda el resultado
He simulado los dos códigos que te he puesto con el mplab y funcionan de maravilla...
Ok nos leemos! :mrgreen:
-
Mil graciasss lo he entendido perfeeeect :P
-
De mi parte, siempre a tu orden!
Para eso estamos aquí, para ayudarnos unos a otros!
Nos leemos! :mrgreen:
-
UPSSSS.... perdon no me di cuenta... no volvera a suceder :( :( :( :mrgreen:
Buen ojo firepic!!!
Sal u 2
-
Ey no te preocupes picNIC! :D
La idea era que lo corrigieras y ya, es decir, que modificaras el mensaje...
Lo puedes hacer dándole en tu mensaje a este ícono:
(http://www.todopic.com.ar/foros/Themes/babylon/images/icons/modify_inline.gif)
Corriges y listo, no ha pasado nada...
Ok nos leemos! :mrgreen: