Autor Tema: Ayuda registros pic  (Leído 1436 veces)

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

Desconectado fitson

  • PIC10
  • *
  • Mensajes: 38
Ayuda registros pic
« en: 01 de Enero de 2018, 10:13:31 »
Hola,

1.- Necesito aclarar una duda para entender mejor el micro pic. No consigo saber porque algunos registros de SFR de la ram se repiten en los bancos. Ejemplo del PORTB tiene 2 direcciones de memoria, usualmente utilizo la primera para acceder directamente al registro pero la otra dirección no se porque existe.

2.-También quiero crear un vector de char de 256 bytes protegiendo algún bloque gpr de la ram con un pic18f4520, encontré por internet este código que lo hace en C18
Código: [Seleccionar]
DATABANK   NAME=gpr0       START=0x80              END=0xFF
DATABANK   NAME=gpr1       START=0x100             END=0x1FF
DATABANK   NAME=gpr2       START=0x200             END=0x2FF
DATABANK   NAME=gpr3       START=0x300             END=0x3FF   
DATABANK   NAME=gpr4       START=0x400             END=0x4FF   
me gustaria hacerlo con el compilador ccs pero no se donde lo guarda.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda registros pic
« Respuesta #1 en: 01 de Enero de 2018, 11:49:26 »
Citar
1.- Necesito aclarar una duda para entender mejor el micro pic. No consigo saber porque algunos registros de SFR de la ram se repiten en los bancos. Ejemplo del PORTB tiene 2 direcciones de memoria, usualmente utilizo la primera para acceder directamente al registro pero la otra dirección no se porque existe.

Esto es una pregunta mas de de PIC16 que de PIC18 (ya que tu otra pregunta habla sobre PIC18) Como tampoco esta muy clara voy adecir un par de cosas y espero alguna pegarle a tu inquietud.

No existe en ningun PIC 2 registros PORTB. En el PIC18 tendras LATB y PORTB entre otros, que cumplen distintos propositos. Ademas todos los SFR se encuentra en el banco 15. El que pueda acceder a los mismos desde cualquier punto no significa que este en todos los bancos. Y tambien tenes direcciones de memoria en los cuales podes usar los registros desde cualquier lado que es desde 0x00 a 0x5F. Del banco 0, por mas que estes ubicado en otro lado.

Respecto a los PIC16 la RAM esta formada de otra forma, los SFR estan dispersos por los bancos, por lo cual para estar modificando los modulos tenes que estar cambiando de bancos constantemente, en estos PICs pueden suceder 2 cosas. La primera es que reservar 16 bytes correspondientes al banco 0 que empieza en 0x70 y termina en 0x7F, esos GPR pueden ser accedidos desde los bancos 1,2,3,4 etc ya que internamente todos acceden al banco 0. Y tambien ocurre que por ejemplo en los PICs mas pequeños solo tienen 2 bancos de GPR, entonces el banco 2, las direcciones de GPR acceden a las del banco 0, y las del banco 3 al banco 1.

La idea detras de todo esto es ... que tengas que cambiar lo menos posible de banco para realizar algo. Ejemplo en un PIC16 si tengo un registro que uso siempre entonces lo voy a poner en 0x70, ya que alli puedo acceder desde cualqueir banco sin problemas.

Citar
2.-También quiero crear un vector de char de 256 bytes protegiendo algún bloque gpr de la ram con un pic18f4520, encontré por internet este código que lo hace en C18

Eso que sacaste ahi es el archivo linker del compilador XC8/C18. El archivo ese le indica al linker cuales son las porciones de memoria que hay y que cantidad. De esa forma una ves compilado el programa el linker acomoda las variables alli dentro. En XC8 podes usar __at()

Lo que no entiendo es que queres llegar a hacer..
Citar
un vector de char de 256 bytes protegiendo algún bloque gpr de la ram
Simplemente tenes que tener la precaucion de no escribir en array. Si lo queres fijo ( y que vaya a la FLASH ) entonces usa el const
Si haces una funcion que usa ese array, en el prototipo y funcion agregale el const, asi sabe que si lo modificas te tire un error.
No se porque queres bloquear una parte de la RAM para ese motivo.

Lo que digo es que tal ves estas tomandote mas problemas de los que hay
« Última modificación: 01 de Enero de 2018, 11:52:15 por KILLERJC »

Desconectado fitson

  • PIC10
  • *
  • Mensajes: 38
Re:Ayuda registros pic
« Respuesta #2 en: 01 de Enero de 2018, 12:04:31 »
La idea que tenia es crear un vector cíclico de 256 bytes, y un indice de int8
Aprovechando el overflow del int8 , para volver al principio del vector sin realizar ninguna operación extra de comparación.
Por eso quería bloquear ese trozo de memoria para asegurarme que sea memoria seguida y dedicada solo para el vector y no manchada por el compilador.

Sabes si existe el archivo linker o función de ccs?
« Última modificación: 01 de Enero de 2018, 12:08:02 por fitson »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Ayuda registros pic
« Respuesta #3 en: 01 de Enero de 2018, 12:16:01 »
Declara un int8 como indice y ahi jugas con el overflow.
O usalo con punteros, que eso es lo mas seguro que lo haga con los FSR y que estos pueden generarse con instrucciones del PIC18 que hacen mas rapido todo.

Sino lleva ambos y apenas detectes que es 0 el int8 sabes que diste toda la vuelta. Comprobar por 0 ocupa 1 instruccion. comprobar por otro valor ocupa 2 instruccion en un PIC18.
Sea cual sea tu opcion no perdes tanto performance.
« Última modificación: 01 de Enero de 2018, 16:02:05 por KILLERJC »


 

anything