Autor Tema: ACCESS y BANKED para 18Fxxxx  (Leído 3185 veces)

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

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
ACCESS y BANKED para 18Fxxxx
« en: 03 de Marzo de 2012, 16:31:48 »
hola.llevo un tiempo programando asm para el 18F2550 y van saliendo nuevas instruccione que desconozco para que sirven.he practicado con ellas
y veo su funcionamiento pero no les veo su utilidad.

ejemplo:ok

movlw  0x55
movwf  ADCON1,ACCESS      ;esto carga en ADCON1 el valor 0x55

ejemplo: erroneo

movlw  0x55
movwf  ADCON1,BANKED      ;se supone que hace lo mismo,pero como ADCON1 esta fuera de las primeras 255 direcciones de la RAM.el valor 0x55 no es cargado

hasta aqui entiendo el porque.

ejemplo:

movlw  0x55
movwf  0x30,ACCESS           ;carga en la direccion de la ram 0x30. el valor 0x55

ejemplo:

movlw  0x55
movwf  0x30,BANKED           ;carga en la direccion de la ram 0x30. el valor 0x55.como el registro esta dentro de las primeras 255 direcciones de ram,
                                          ;el valor si que se carga.

pero para que sirve todo esto?
Montando mi primera impresora 3D (Raprep Prusa i3)

Desconectado danfly

  • PIC10
  • *
  • Mensajes: 10
Re: ACCESS y BANKED para 18Fxxxx
« Respuesta #1 en: 18 de Abril de 2012, 13:44:50 »
Hola groundman... es muy fácil

Los PIC18's tienen 16 bancos enúmerados del 0-15... y existe un banco especial e imaginario llamado Acces Bank que reúne los del 0x00-0x60 del banco "0" y los 0x61-0xFF del banco "15", estos últimos son los SFR's es decir los registros especiales con los que podemos acceder que si PORTB, TRISC, ADCON1 y todos los registros especiales existentes....

Las instrucciones que tienen que ver con el uso de la RAM, por lo general llevan dos acompañantes que en la mayoría de los casos se omiten y se dejan por defecto... un caso sería MOVF f,d,a... f es la dirección de RAM donde vas a ejecutar la instrucción, d puede ser 0 o 1 donde 0 indica que el resultado se guarda en W y 1 que el resultado se guarde f (defecto), y "a" puede ser 0 o 1 donde 0 indica que se usará el ACCSES RAM es decir el registro especial (defecto) y si a = 1 entonces el programa utilizara el registro BSR para determinar con que banco estás trabajando.

Esto es muy cómodo porque así no tienes que direccionar cada vez el banco 15 para usar los registros SFR's pero recuerda que usando la memoria de esta manera las variables que declares no pueden superar la dirección 0x60 pues estarías modificando erróneamente los SFR's, si necesitas mas memoria que esa dentro del mismo banco 0, recuerda seleccionar BANKED que es lo mismo a = 1, para que el entienda que te refieres a una dirección por encima de 0x60 del banco 0...

El datasheet dice que por defecto es Banked, pero mi experiencia me dice que es al contrario ;)...


PD: Ps me entró curiosidad para ver si el datasheet estaba en lo correcto o no... y lo que hice fue intentar direccionar por encima de 0x60 y al revisar el dissasembling list en todos los casos el por defecto es acces, pero justo cuando di por encima automáticamente se puso en banked =S... el compilador seguro que capta cuando se direcciona un SFR y lo pone en accses, lo bueno entonces es que yo mismo no tendré que preocuparme por usar todo el banco 0 sin problemas xP
« Última modificación: 18 de Abril de 2012, 13:58:27 por danfly »

Desconectado groundman

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1870
    • www.ingeniopic.com
Re: ACCESS y BANKED para 18Fxxxx
« Respuesta #2 en: 17 de Enero de 2015, 14:58:51 »
despues de unos cuantos años y todabia no entendi lo que era ACCESS y BANKED.nunca le he hechado cuenta porque sin saberlo el compilador
ya gestiona la intruduccion de ACCESS o BANKED en cada instruccion.asi que si usamos registros especiales,usa BANKED en cada instruccion.
y si trabajamos con registros generales,el compilador cambia a ACCESS.

claro que si usamos ACCESS.hay que conmutar BSR para acceder al banco apropiado.
ACCESS y BANKED es algo que el compilador selecciona automaticamente.pero tambien podemos manipularlos nosotros mismos para una buena utilidad.

para guardar un valor en una posicion de la memoria.hay que conmutar el banco apropiado en el registro BSR.en caso contrario,podriamos meter
un dato en una posicion de memoria equivocada.

pero existe una excepcion.hay un rango de memoria que es accesible desde cualquier banco que este conmutado.excepto cuando direccionamos
los registros especiales desde 0xF60 a 0Xfff.

este rango de memoria esta en el BANCO 0.en el rango de direcciones 0x00 a 0x5F. y siempre y cuando seleccionemos ACCESS en la intruccion
esta zona de memoria es accesible desde cualquier banco.
de la direccion 0x60 a 0xff hay que tener cuidado de no escribir en ellas o estaremos escribiendo directamente sobre los registros especiales.



quiero aclarar que debido a esta tecnica de acceso.los registros especiales de la direccion 0xf60(PIE6) a 0xfff(TOSU) no se necesita
conmutar ningun banco con (BSR). pero para acceder a los registros 0xf00 a 0xf5f(RTCCFG) hay que conmutar el banco de registros especiales.
el banco 15 para el pic 18F87k22.en otros puede ser diferente.


asi que si queremos acceder a las direcciones 0x00 a 0x5f sin tener que conmutar bancos.solo hay que poner ACCESS en la instruccion que usemos.
para todo lo demas el compilador se encarga automaticamente de intruducir ACCESS o BANKED.
excepto para la gestion de las direcciones 0xf00 a 0xf5f de los registros especiales.que se debera conmutar el banco 15.

espero no haber cometido ningun error de entendimiento. :mrgreen:
Montando mi primera impresora 3D (Raprep Prusa i3)