Autor Tema: ¿Qué o cómo funciona el direccionamiento indirecto?  (Leído 5097 veces)

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

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
¿Qué o cómo funciona el direccionamiento indirecto?
« en: 09 de Agosto de 2004, 13:54:00 »
Hola,

Me dirijo con la siguiente cuestión:

En varias notas de aplicación asi como en diferentes programas he visto que utilizan la instrucción FSR e INDF dentro del programa.

En cada hoja de datos de los µicros menciona un breve ejemplo de cómo utilizarlos pero no he podido captar la escencia de de estas instrucciones.

¿ Alguien pudiera explicarme cómo es que funcionan o para qué están?

Cualquier información sobre el tema se les agradecerá.


Mario


PD: Y también sobre la instrucción DT (es que hago tablas y no se cómo utilizar esta para mejorar el código.
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado Carlete71

  • PIC18
  • ****
  • Mensajes: 433
RE: ¿Qué o cómo funciona el direccionamiento indirecto?
« Respuesta #1 en: 09 de Agosto de 2004, 16:27:00 »
FSR indica el Address o dirección de la memoria de datos y el banco. Y lo que se haga en INDF inside en la posición de memoria de datos apuntada por el registro FSR.

A mi me parece útil por ejemplo cuando tienes que hacer secuencias sobre un rango de direcciones de la memoria.

Saludos,


Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
RE: ¿Qué o cómo funciona el direccionamiento indirecto?
« Respuesta #2 en: 10 de Agosto de 2004, 02:07:00 »
Bueno.

Entonces creo empezar a entender el por qué colocan alguna fila o número de registro y lo mueven a FSR y después lo leen con INDF.

¿Qué ventajas o desvenrtajas hay contra el direccionamiento directo?

Gracias por el interés.

Mario
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
RE: ¿Qué o cómo funciona el direccionamiento indirecto?
« Respuesta #3 en: 10 de Agosto de 2004, 16:20:00 »
Hola, la idea seria la siguiente:

imagina que tienes unos 10 registros, que por ejemplo llamas

dato1
dato2
dato3
.
.
dato10

y tienes que almacenar valores en cada uno de esos registros...
sin FSR, cargarias
movf DATO_a_cargar
movwf dato1

y asi 10 veces!....

el FSR (File Shift Reg, es un puntero que apunta que PISO leer o escribir...)
y el INDF es INDirect File.. seria quien toma o entrega el valor...  como una caja de ascensor... y los pisos del edificio...  


el FSR lo empleas como un contador....


Suerte!

Norberto
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado Duende_Azul

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 908
RE: ¿Qué o cómo funciona el direccionamiento indirecto?
« Respuesta #4 en: 10 de Agosto de 2004, 17:08:00 »
ok, ahora ponlo en español , seria bueno poner un codigo sencillo que ejemplifique esa situación.

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: ¿Qué o cómo funciona el direccionamiento indirecto?
« Respuesta #5 en: 10 de Agosto de 2004, 17:53:00 »
Un buen ejemplo es la rutina de escritura en la memoria de programa del pic.Esta escritura se debe hacer en bloques de 4 bytes,y dado que las posiciones de memoria de programa son de 14 bits,para cada una de las 4 iteraciones del bucle,se escribe primero el byte menos significativo y después los 6 bits restantes:
Codigo:

      INICIO BSF      STATUS,6    //
             BCF      STATUS,5    // Banco 2
             MOVF     DATADDR,W   // Dirección inicial de los 4 bytes de origen
             MOVWF    FSR         // Apuntamos a dicha dirección inicial.Es en este momento cuando INDF ya contiene el dato apuntado por FSR
        LOOP MOVF     INDF,W
             MOVWF    EEDATA      // Cargamos el dato en el byte menos significativo
             MOVLW    0x00
             MOVWF    EEDATH      // Deshechamos (todos a 0) los 6 bits restantes de la WORD
             INCF     FSR,1       // Apuntamos a la siguiente dirección de origen
             BSF      STATUS,5    // Banco 3
             BSF      EECON1,7    // Accedemos a la memoria de programa
             BSF      EECON1,2    // Habilitamos escritura
             BCF      INTCON,7    // Deshabilitamos interrupciones
             MOVLW    0x55        // Secuencia de escritura
             MOVWF    EECON2
             MOVLW    0xAA
             MOVWF    EECON2
             BSF      EECON1,1
             NOP
             NOP
             BCF      EECON1,2    // Deshabilitamos escritura
             BSF      INTCON,7    // Habilitamos interrupciones
             BCF      STATUS,5    // Banco 2
             INCF     EEADR,1     // Incrementamos la dirección de destino...
             MOVF     EEADR,W
             ANDLW    0x04
             XORLW    0x04
             BTFSS    STATUS,2    // ...y comprobamos si ya se escribió todo el bloque...
             GOTO     LOOP        // NO! Aún no se escribieron los 4 datos



Así,el direccionamiento indirecto consiste,no en acceder directamente al contenido de un registro haciendo "MOVF dato1,W",sino mediante el puntero FSR,que lo hacemos apuntar a la dirección que contiene el dato que nos interesa.
No estoy muy ducho en assembler,pero imagino que este es el mejor método para,por ejemplo,representar en un lcd una cadena de caracteres que estan guardados en memoria de forma consecutiva:
Direccionamos FSR al primer carácter,mandamos el carácter al lcd,incrementamos en 1 FSR,mandamos el siguiente carácter,y así...
Saludos

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
RE: ¿Qué o cómo funciona el direccionamiento indirecto?
« Respuesta #6 en: 11 de Agosto de 2004, 12:39:00 »
Bueno,

Creo estar entendiendo mejor con los ejemplos.

Entonces me sirve para compactar el código, para salvar espacio RAM del µicro, ¿Para sustituir una Tabla?

Lo que sucede es que se desea utilizar el DS1307 (un reloj) y en la hoja de datos se menciona que se deben accesar de la fila 00H-07H para sustraer la información del tiempo.

Mi idea original era asignar un registro individual para cada tiempo (seg,min,hr,día,mes,año), ír por la información y guardarla ahí (que de todas formas lo voy a hacer porque las especificaciones mencionan que en cada instante se está modificando la información y el usuario debe tomar en consideración esto).

Con esta instrucción FSR e INDF ya no tendré que (como lo menciona TODOPIC) mover a W la información leida para poder procesarla (a un LCD) lo cual implica una gran ventaja en lo que a tiempos se refiere.

No quisiera abrir otro foro para esto (es solo un comentario); Se va a utilizar el 18F448 para una proyecto que (entre otras cosas) mandará información en paralelo a una impresora (de ser posible por RF usando los TX-RX de Rentron), dicha información se presentará y contendrá la fecha (DS1307).

Existe un artículo que escribio Bonnie Baker, Microchip Technology Inc. "Hardware versus software: You decide", en la revista EDN, 10 de Junio 2004, página 30.
En este artículo hace mención a las opciones que tiene el diseñador en cuanto a si es mejor el software que el hardware. En resumidas cuentas expone que si es de vital importancia terminar a una fecha y es posible hacer unas funciones en software (con el PBP serin,serout,PWM,freqout,etc), es recomendable hacerlo, después se realizarán los cambios necesarios a hardware; si es un proyecto en el cual se cuenta con el hardware necesario, sería recomendable realizarlo por hardwre (HPWM,Hserin, u otro dispositivo que realice funciones adicionales y libere el trabajo del procesador principal).
Hace alución a que en hardware es menos complicado saber cómo trabaja el dispositivo, en software estaríamos haciendo pruebas hasta que obtengamos lo que queremos pero, se requiere tiempo (y dinero).
En software eliminamos la necesidad de algún componente con funciones específicas (costos).

El 18F448 tiene 16K de memoria de programa, mis compañeros en el proyecto me dicen que no importa si consume mucha programación, el µicro la soportará.
Mi argumento es que si se produce un código compacto, se puede utilizar en otros los cuales no tengan tanta memoria (y claro, que tengan interface IIC).

Por eso la razón de la pregunta (foro), para tratar de compactar el código y que sea benéfico para otros.

Gracias

Mario
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado Juanse_

  • PIC10
  • *
  • Mensajes: 39
RE: ¿Qué o cómo funciona el direccionamiento indirecto?
« Respuesta #7 en: 11 de Agosto de 2004, 17:08:00 »
No se si esto fue mensionado antes, no he leido todas las respuestas, si ya fue dicho, bueno. Ditto de nuevo.

Una de las grandes ventajas del direccionamiento indirecto es la capacidad de acceder a dos bancos simultâneamente sin necesidad de mover bits en el camino.

Desconectado Micom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 783
RE: ¿Qué o cómo funciona el direccionamiento indirecto?
« Respuesta #8 en: 12 de Agosto de 2004, 01:44:00 »
ESo sino lo entendi Juanse_ vas a tener que explicarlo (perdon por lo imperativo que paresca) o poner un ejemplo como el que puso Modulay.                
El programador GTP USB PLUS es un super programador
GRACIAS dobles amigo SISPIC

Tan solo queda seguir sobreviviendo

Desconectado Juanse_

  • PIC10
  • *
  • Mensajes: 39
RE: ¿Qué o cómo funciona el direccionamiento indirecto?
« Respuesta #9 en: 13 de Agosto de 2004, 16:20:00 »
En un controlador con un ancho de palabra de 14 bits, parte de esos bits indican de quê instrucciôn se trata y el resto traen informaciôn que va a ser procesada segûn la instruccion codificada en los bits anteriores.
Si mirâs las instrucciones que manejan registros, solo tienen asignados 7 bits para direccionamiento (00 - 7Fh), pero tu controlador tiene dos o cuatro bancos que comienzan en las posiciones 00h, 80h , 100h y 180h, por lo que para direccionar hacia todos los bancos necesitâs 1 o 2 bits extras.
Ahora, si mirâs el registro FSR, tiene un ancho de 8 bits, que te permite direccionar el rango 00 - FFh, o sea que podês cubrir 2 bancos de una.
Si se trata de un procesador con solo 2 bancos de memoria, podês acceder a cualquier parte sin necesidad de ese bit extra.
Si estâs trabajando con un procesador con 4 bancos, bueno, para direccionamiento directo vas a necesitar 2 bits extra y para direccionamiento indirecto solo 1.

De paso mensiono acâ la utilidad de los GPRs que estân direccionados al banco cero. Estos registros te permiten acceder a posisiones de memoria sin necesidad de cambiar de banco. Usar bien esos registros es muy importante si estâs buscando optimizar el côdigo y ahorrar recursos.

Parecido es lo que sucede con los registros SFRs que se repiten en todos los bancos, si bien las posiciones fîsicas de esos registros existen, estân direccionados al banco cero y son generalmente registros que necesitâs acceder contînuamente, serîa complicado trabajar con ellos si tenês que estar cambiando de banco para poder accederlos.

Suerte.

Desconectado T0ni0

  • PIC16
  • ***
  • Mensajes: 196
RE: ¿Qué o cómo funciona el direccionamiento indirecto?
« Respuesta #10 en: 14 de Agosto de 2004, 03:34:00 »
Suscribo todo lo anterior, pero voy a dar otra manera de explicarlo.

El FSR es un puntero donde cargamos la dirección de RAM que queremos leer o escribir,
 para hacer esto solo tenemos que leer o escribir el INDF.
 Así podemos recorrer leyendo toda la RAM incrementando FSR  y leyenfo INDF.

Creo que dicho asín queda más llano,

Ah! sobre el post anterior de Juanse_ ,
para un direccionamiento directo ( sin usar el FSR) nos movemos por los bankos con RP1 y RP0 como es habitual,
 tal como bien explicó Juanse_ para un direccionamiento indirecto (usando el FSR) activas y desactivas el IRP
 pudiendo recorrer así de la dirección 00h hasta ffh con IRP=0 y de desde 100h (si cargamos 00h en el FSR)
hasta la 1ffh ( si cargamos FFh en el FSR) con el IRP =1

  espero haber ayudado
- T0ni0 -
30RCF112

Desconectado Carlete71

  • PIC18
  • ****
  • Mensajes: 433
RE: ¿Qué o cómo funciona el direccionamiento indirecto?
« Respuesta #11 en: 14 de Agosto de 2004, 06:01:00 »

Creo que más claro de cómo lo explicó Tonio es imposible

Buena esa Tonio

Saludos,

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
RE: ¿Qué o cómo funciona el direccionamiento indirecto?
« Respuesta #12 en: 14 de Agosto de 2004, 17:07:00 »
Sin duda alguna lo que se ha comentado en este foro ha excedido mis expectativas, ya casi termino de aterrizar la idea en un programa.

Lo anterior es de gran ayuda (lo de no tener que cambiar de banco) ya que cada vez que se desea accesar a algún registro en particular se utiliza BANKSEL.

Creí que sabía (y me podía defender con esto de los µicros) pero yo creo que me hace falta MUCHA PRÁCTICA

Sin duda alguna me alegra haber ingresado a este lugar.


Gracias por la información


Mario


Mexicali, Baja California, México
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee