Autor Tema: Direccionamiento directo e indirecto?  (Leído 15219 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Eggar_Felipe

  • PIC10
  • *
  • Mensajes: 45
Direccionamiento directo e indirecto?
« en: 11 de Marzo de 2005, 16:28:00 »
Pues bien no entiendo muy bien lo que leeo sobre el direccionamiento direccto e indirecto:

Direccionamiento Directo. El operando que utiliza la instruccion en curso se referencia mediante su direccion, que viene incluida en el codigo OP ¿OP? de la misma, concretamente en los 7 bits de menos peso. El banco a acceder lo determinan los bits RP0 y RP1 del registro de ESTADO.

Podrian explicamerme con palitos y piedritas y usar un ejemplo en lenguaje asm?

Direccionamiento Indirecto. Este modo se usa cuando en una instruccion se utiliza como operando en registro INDF, que ocupa la direccion 0 de ambos bancos. En realidad el registro INDF no esta implementado fisicamente y cuando se le hace referencia, se accede a la direccion de un banco especificada con los 7 bits de menos peso del registro FSR. El bit de mas peso del FSR junto al bit IRP del registro ESTADO se encarga del banco a acceder, mientras que los 7 bits de menos peso del FSR apuntan a la posicion, el bit IRP=0 siempre.

Podrian explicamerme con palitos y piedritas y usar un ejemplo en lenguaje asm?

"Muchas gracias por la atencion"

Desconectado fer_zone

  • PIC12
  • **
  • Mensajes: 74
RE: Direccionamiento directo e indirecto?
« Respuesta #1 en: 14 de Marzo de 2005, 19:43:00 »
Hola, no te preocupes, tu duda creo que es la primera que tienen todos los que empiezan a programar un micro sin experiencia previa de programación.

Para empezar: OP es el codigo conocido como opcode o en otras palabras es la instrucción traducida de ensamblador a codigo de maquina, por ejemplo, la serie pic 16 tiene un opcode de 14bits de largo (cada linea de instrucción ocupa una palabra de 14 bits) (la serie pic 18 ocupa 16bits), por eso en el 16f84 se dice que tiene una memoria de 1Kx14.
Entonces direccionamiento "directo" significa que la dirección de memoria (ram) a la cual "apunta" la instrucción, esta contenida en ese opcode. Ejemplo:

     movf      rr,W       ;mover el contenido del registro rr a W.
El opcode seria algo por el estilo: xxxxxxxrrrrrrr    ;donde x sera el valor que corresponde a la instrucción movf    r,W y r la dirección fisica del registro rr, teniendo siempre presente el arreglo de bancos en la mem. ram

Hasta aca me imagino que todo esta claro, ahora imagina que esos 7 bits de la dirección de memoria en ves de estar contenido en el opcode esten en "otro" registro de memoria, registro que puedes "manipular" como cualquier otro espacio de memoria. Esto significa: en el registro INDF (registro virtual) tienes el contenido del registro cuya dirección corresponde a los 7 bits de menor peso del registro FSR.
(teniendo en cuenta nuevamente el cambio en la asignación de los bancos de memoria)
Esto es:
   movlw     06h            ;cargo 06h en W
   movwf     FSR            ;lo guardo en FSR
   movf        INDF,W      ;guardo en W el contenido del registro cuya dirección es 06h

Al principio puedes preguntarte ¿para que quiero hacer esto? o ¿para que me sirve?

La forma más facil de responder es: qué pasa si en tu programa quieres borrar toda la memoria ram, o cargar 100 registros con el mismo valor.
Con direccionamiento indirecto solo tendrias que hacer un loop, incrementar FSR y cargar siempre el valor en INDF, como se ve estas trabajando con memoria, pero por medio de otros registros, esto se conoce como direccionamiento indirecto.
(si tienes acceso a manuales de programación puedes buscar temas como "punteros" o "vectores" que te mostraran lo potente que puede ser la programación con manejo indirecto de memoria)




Desconectado Eggar_Felipe

  • PIC10
  • *
  • Mensajes: 45
RE: Direccionamiento directo e indirecto?
« Respuesta #2 en: 14 de Marzo de 2005, 23:12:00 »
Muchas gracias por contestar fer_zone, a quedado muy claro.

Saludos y Gracias.

Desconectado Eggar_Felipe

  • PIC10
  • *
  • Mensajes: 45
RE: Direccionamiento directo e indirecto?
« Respuesta #3 en: 16 de Marzo de 2005, 15:26:00 »
Me salio otra duda, en el direccionamiento indirecto ponen un ejemplo que no entiendo:

EJEMPLO

Usando el modo de direccionado indirecto poner a 0 las posiciones de la memoria de datos comprendidas entre la dirección 0x0c y 0x27 del banco 0 en un PIC16F84.

SOLUCIÓN

En el modo de direccionamiento indirecto actúa como puntero el contenido del registro FSR, ¿que en este ejercicio se irá incrementando desde  0x0c hasta el valor 0x28 H, en el que su bit 3 pasa a valer 1.?

Codigo:
     movlw     0x0c     ; W toma el valor inicial del puntero
      movwf     FSR      ; FSR se carga con el valor de W
                         ;
¿Se borra la dirección que apunta FSR?
bucle incf      FSR      ; Se incrementa FSR una unidad
¿A la instrucción incf le falta "incf FSR, 1 ó incf FSR, 0"?
     btfss     FSR, 3   ; Si el bit 3 de FSR vale 1 se "brinca" la
                         ; siguiente instrucción <"skip">
      goto      bucle    ; Se salta a "bucle" poque vale 0 el
                         ; bit 3 de SFR

Aqui me pierdo, suponiendo que dentro del bucle se borra el
registro que contiene la dirección SFR y colocar ceros, se
nesecitarian almenos 27 saltos a bucle para hacerlos con
todos los registros del 0c al 27H, ¿por que deja de hacerlo
asta que el bit 3 sea igual a 1?

.....continúa el programa.....


Espero con ansia su respuesta, les agradezco la atención.

Desconectado IngLAOFX

  • PIC10
  • *
  • Mensajes: 43
RE: Direccionamiento directo e indirecto?
« Respuesta #4 en: 04 de Mayo de 2005, 02:59:00 »
hola.. bueno, segun el ejercicio que planteas, el codigo de solucion esta digamos algo incompleto. Lo que no entendi es de donde salio eso de que el bit 3 debe estar en 1 como condicion para borrar o no borrar, pero, ajustandome al enunciado del ejemplo, el codigo que yo utilizaria es el siguiete:
.................
    movlw    0x0c
    movwf    FSR,F     ;
bucle
    clrf         INDF
    incf         FSR,F
    movf       FSR,W
    sublw     0x29
    btfss       STATUS,Z
    goto       bucle
................

bueno, es una manera de borrar todo lo que hay en la ram desde la direccion 0x0c hasta la 0x28 utilizando el direccionamiento indirecto.
Este medio de direccionamiento es muy util si lo sabes utilizar, en lo personal lo uso bastante para manejar vectores y matrices con el PIC, simplemente utilizando uno o dos registros como indicadores de posicion, dependiendo de si es un vector o una matriz, y de sus dimensiones...
tambien lo puedes utilizar para programar un buffer para transmitir datos, formando algo asi como una pila o stack, en fin, la unica limitante es la imaginacion..
Gana Mas Una Bruja Rentando Su Palo De Escoba A 10Euros por Vuelta Que Uno Prediciendole Un Esplendoroso Futuro A La Clase Obrera En Una Semana