...
Eso lo entiendo muy clarito. pero que pasaría si en mi programa tengo a la vez una variable en la dirección 0x23 y otra en la 0x73. Como las dos se representarían en la misma dirección de memoria compartida ¿Cómo crees que seria la representación de los valores de ambas variables a la vez?
Lo que es igual es la dirección que te aparece en la WW, que obviamente confunde porque no se sabe donde está. Es cuando agregás el ítem que se diferencia entre dirección de RAM y RAM_SHARED.
Entiendo mirando el datasheet que las direcciones compartidas sean 16, pero lo del valor que indicas "con otro offset". ¿De donde sale el ese valor de 0x23C? ¿En que parte del datasheet puedo verlo? por que me supongo que si tengo dos variables una en 0x3AC y otra en 0x3AD las vería en 0x23C y 0z23D. Eso por estar contiguas, ¿Pero si no son contiguas como 0x3AC y 0x403 también serian representadas en 0x3AC y 0x3AD?
Cada banco tiene 96 bytes de ram. 80 de usos generales que te aparecen contiguos en la ventana Memory RAM cuando en realidad no lo están.
De acuerdo al banco es el offset que vas a tener, la dirección 0x29 (bank0) la mapeará en 0x09 , la 0xA9 (bank1) en 0x59 , la 0x129 (bank2) en 0xA9 ....
En las ventanas de memoria el listado debería estar agrupado por bancos, no lo está y resulta confuso.
Esta ensalada con la memoria y variables es algo viejo en Proteus donde evidentemente cero interés en corregirlo.
Pero también están los bugs, donde
con suerte los corrigen después de
varias versiones. Así por ejemplo el Attiny10 es imposible de simular desde que salió (se ejecuta sin errores pero
no hace nada y ni se tomaron la molestia de escribirle un "no simulator model"
A este micro nunca lo había simulado, no solo son los mismos problemas de siempre sino que también me encuentro con bugs.
En este ejemplo:
#include <xc.h>
#define ND 0x40
uint8_t datos[ND] = {17,18,19,20,21,22,23,24,25,26,27,28,29}; // Para verificar donde lo escribe
void main(void){
for(uint8_t k=0 ; k<ND ; k++)
datos[k] = k ;
while(1);
}
Si la longitud de datos[] es menor que 0x50 (80bytes, entra en un banco) , todo bien. Pero si ocupa mas de un banco... --> No da error, pero hace cualquier cosa, tanto si se compila con XC8 como con CCS.
Como en los dos casos el comportamiento es diferente, no sabés como repartir las culpas