> For the complete documentation index, see [llms.txt](https://bit-by-bit.gitbook.io/embedded-systems/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bit-by-bit.gitbook.io/embedded-systems/intel-msc-51/mapa-de-memoria.md).

# Mapa de Memória

Como característica da arquitetura Harvard, instruções e dados são armazenados em espaços distintos. No 8051, a memória de programa pode ser acessada somente em modo de leitura. Além disso, o barramento de endereços permite acesso a memórias externas para dados e programa.

### Memória de Programa

A memória de programa pode apenas ser lida. Internamente esses dispositivos possuem 4K bytes (padrão) de memória, contudo essa capacidade pode ser expandida para 64K bytes utilizando uma memória externa.

![Memória de Programa do Intel 8051 \[1\].](https://www.embarcados.com.br/wp-content/uploads/2016/10/8051_PMemory.png)

O pino EA determina se a memória de programa externa será utilizada. De modo geral:

* Quando EA é zero, todas as operações são realizadas na memória externa;
* Quando EA é um, os primeiros 4K de endereços são acessados internamente.

Além disso, para realizar o acesso à memória externa o sinal PSEN (Program Strobe Enable) é gerado pela CPU.

### Memória de Dados

A memória de dados também pode ser expandida. Neste caso, os sinais RD e WR são gerados pela CPU conforme a operação executada. Para memória de dados, a instrução utilizada determinará se o acesso será interno ou externo. Conforme a ilustrado na Figura abaixo, internamente a memória de dados é dividida em regiões específicas e de propósito geral. Essas definições serão apresentadas na sequência.

![Memória de Dados no Intel 8051 \[1\].](https://www.embarcados.com.br/wp-content/uploads/2016/10/8051_DMemory.png)

### Seções da Memória de Dados

A memória de dados é dividida em duas seções: **Low-RAM** e **High-RAM**.

A seção Low-RAM, ilustrada na Figura abaixo, corresponde ao espaço de endereçamento de 0x00 à 0x7F, isto é, os primeiros 128 bytes. Essa região é composta por quatro bancos de registradores, espaço de propósito geral e de bytes endereçáveis bit a bit.

![Low-RAM. Adaptado de \[1\].](https://www.embarcados.com.br/wp-content/uploads/2016/10/8051_DLMemory.png)

Os bancos de registradores são nomeados como RB0, RB1, RB2 e RB3. Cada banco de registrador possui 8 registradores, portanto ocupam 32 bytes, e o espaço de endereçamento vai de 0 até 1FH (31). A região de bytes endereçáveis bit a bit, ilustrada na Figura 4, ocupa os endereços 20H à 2FH. Portanto, existem 16 bytes endereçáveis bit a bit, ou 128 bits endereçáveis.

![Seções da memória de Low-RAM. Adaptado de \[1\].](https://www.embarcados.com.br/wp-content/uploads/2016/10/8051_DbitRegionMemory.png)

O endereço dos bits é mostrado na Figura abaixo.

![Mapa de endereços da região de bits endereçáveis.](https://www.embarcados.com.br/wp-content/uploads/2016/10/8051_DbitMemory.png)

O Espaço de propósito geral corresponde ao espaço de endereçamento que vai de 0x30 a 0x7F. Os outros 128 bytes da memória de dados (High-RAM) são divididos em duas categorias. No entanto, isso não deve ser entendido como uma divisão do espaço de endereçamento, pois existem duas formas de acesso a essa região da memória. Quando o acesso realizado é direto (discutiremos isso em outro artigo) a região acessada será a de registradores de funções específicas. Já se o acesso é indireto, a região é considerada de propósito geral. Cabe ressaltar que essa região não está presente em alguns dispositivos.

* Propósito geral:
  * Espaço de endereçamento: 0x80 a 0xFF;
  * Não está presente em alguns microcontroladores;
  * Modo de endereçamento: indireto.
* Registradores de funções especiais:
  * Espaço de endereçamento: 0x80 a 0xFF;
  * Modo de endereçamento: direto.

![High-RAM do Intel 8051. Adaptado de \[1\].](https://www.embarcados.com.br/wp-content/uploads/2016/10/8051_DHMemory.png)

Os registradores de funções especiais são listados abaixo conforme os módulos correspondentes:

* Temporizadores/Contadores: TH1, TL1, TH0, TL1, TCON e TMOD;
* Portas I/O: P0, P1, P2 e P3;
* Stack Pointer: SP;
* Power Save: PCON;
* UART: SCON e SBUF;
* Interrupções: IE e IP;
* Uso geral: ACC e B;
* Ponteiro DPTR: DPH e DPL;
* Status: PSW.

De modo geral, os registradores especiais localizados nos endereços finalizados em 0H ou 8H são endereçáveis bit-a-bit (0x80 à 0xF7).

![Endereço dos registradores de funções especiais \[1\].](https://www.embarcados.com.br/wp-content/uploads/2016/10/8051_RegistersMemoryMap2.png)

* * Além disso, é importante destacar o conteúdo dos registradores após a condição de Reset.

![Conteúdo dos registradores após o Reset do Intel 8051 \[1\].](https://www.embarcados.com.br/wp-content/uploads/2016/10/8051_ResetReg.png)

### Interface com Memória Externa

Durante o processo de execução, a CPU emite sinais para realizar as operações de leitura e escrita das memórias. Quando a memória externa (RAM e/ou ROM) é utilizada, um circuito latch deve ser adicionado para compartilhar o PORT 0 do microcontrolador. Isso se faz necessário pois a mesma porta que é utilizada para determinar o endereço acessado também serve para as operações do barramento de dados. Além disso, o pino EA é utilizado para indicar se a memória de programa será interna ou externa. Já os sinais PSEN, RD e WR são utilizados para as operações nas memórias externas e, nos dois casos, o sinal ALE (Address Latch Enable) é utilizado para habilitar o latch.

* Conexões da memória de programa externa.

![Conexão do 8051 com a memória de programa externa \[1\].](https://www.embarcados.com.br/wp-content/uploads/2016/10/8051_PEMemory.png)

* Conexões da memória de dados externa.

![Conexão do 8051 com a memória de dados externa \[1\].](https://www.embarcados.com.br/wp-content/uploads/2016/10/8051_DEMemory.png)

Os diagramas ilustrados abaixo exibem o estado dos sinais de controle para os casos onde a memória externa é utilizada. Considerando a memória de programa externa, a CPU determina o endereço de 16 bits que será acessado. Esse endereço tem seu byte menos significativo colocado no PORT 0, e o mais significativo no PORT 2. Nesse momento a CPU ativa o sinal ALE, fazendo com que o circuito latch armazene esses 8 bits. Assim, a CPU desativa o ALE e memória continuará com o endereço selecionado. Por fim, o sinal PSEN é habilitado e, nesse momento, o conteúdo (instrução) do endereço selecionado é colocado no barramento de dados, isto é, no mesmo PORT 0.

![Sinais de controle durante o acesso da memória de programa.](https://www.embarcados.com.br/wp-content/uploads/2016/10/ICm1.png)

O mesmo vale para memória de dados. A única diferença é que no processo de leitura o conteúdo do barramento de dados não é uma instrução. Cabe ressaltar que para a memória de dados o sinal RD especifica a operação de leitura.

![Sinais de controle durante o acesso de leitura da memória de dados externa.](https://www.embarcados.com.br/wp-content/uploads/2016/10/ICm2.png)

Na operação de escrita, após a especificação do endereço a CPU determina o dado que será gravado na memória. Essa operação é realizada quando o sinal WR é ativado.

![Sinais de controle durante o acesso de escrita da memória de dados externa.](https://www.embarcados.com.br/wp-content/uploads/2016/10/ICm3.png)
