INTRODUCCIÓN
Con frecuencia se añaden puertos de IO al 8051 para compensar la pérdida de los puertos P0 y P2 que se produce al aumentar la memoria del µC. Habitualmente se dispone el hardware de forma que los puertos adicionales aparezcan como bytes de RAM externa, que pueden leerse y escribirse con instrucciones MOVX. Se dice que dispositivos externos se encuentran mapeados en memoria, cuando se accede a los mismos en la forma descrita. Es muy común mapear en memoria xdata del 8051 dispositivos tales como: UARTS, puertos de IO, o chips de reloj en tiempo real.
La forma más sencilla de conseguirlo es uniendo las líneas /RD y/o /WR al dispositivo. Suponiendo que solo haya un dispositivo, no es necesario recurrir a un decodificador de direcciones. Para acceder al dispositivo desde C, basta con declarar la variable de acceso al dispositivo con la palabra xdata. Así el compilador utilizará las instrucciones MOVX A,@DPTR y MOVX @DPTR,A para leer y escribir en él. El linker tratará de asignar una ubicación a la variable, pero como no existe ningún decodificador, el dispositivo será habilitado con las señales /RD o /WR.
En la realidad este caso tan sencillo se presenta rara vez. Lo típico es encontrarse con una mezcla de RAM, UARTs, puertos, EEPROM y otros dispositivos, mapeados en el espacio xdata del 8051. En estos casos se utiliza lógica (decodificador o una PAL) para regular el acceso a los periféricos.
En esta situación, cada dispositivo aparece en unas posiciones fijas del espacio xdata. Lo ideal sería poder referirse a estos dispositivos por su nombre, al igual que se hace con los periféricos internos del 8051. Hay tres formas diferentes de lograrlo:
Las siguientes secciones tratan detalladamente estas alternativas.