3 - MODELO DE MEMÓRIA DO PIC

O modelo de memória de memória única tem sido usado desde os primeiros computadores até os dias de hoje. Neste modelo a CPU (ALU+CONTROLE+REGISTRADORES) é ligada a um determinado barramento onde estão os controladores de E/S e uma memória que é usada para armazenar tanto os dados como o programa. Esse modelo conhecido por modelo de Von-Neumann, em homenagem ao seu criador John Von-Neumann, é usado ainda nos dias de hoje com algumas modificações, como por exemplo o barramento exclusivo para a memória, chamado FSB, existente nos computadores pessoais de hoje. No entanto a característica principal deste modelo permanece: uma memória única para dados e programas. A figura abaixo, ilustra esse modelo.

Com o intuito de aumentar a velocidade (instruções por segundo) das CPUs foi introduzida uma técnica conhecida por PIPELINE onde diversas instruções podem estar sendo executadas dentro da CPU, cada uma em um estágio diferente. Uma divisão típica da execução de uma instrução pode ser:

Se temos um PIPELINE com estes estágios dentro de uma CPU ligada a uma memória de dados, é fácil perceber que a busca de instrução e dos operandos vão concorrer pelo barramento de memória, afinal de contas dados e instruções estão na mesma memória.

Sendo assim, dividir a memória em dados e Instrução resolveria este problema, e esta é a idéia da arquitetura Harvard. Os microcontroladores da família PIC utilizam este modelo, a figura abaixo mostra um esquema genérico.

3.1 Memória de Programa

A memória de programa do PIC é do tipo EEPROM (ROM – Read Only Memory), ou seja, em modo de operação normal essa memória não pode ser alterada. Mais adiante, neste material, discutiremos como gravar programas nesta memória, por enquanto vamos discutir apenas o seu funcionamento.

A memória dos microcontroladores PIC, é um array com instruções que podem ter 12,14 ou 16 bits dependendo da família. No caso específico do 16F628A temos uma memória de programa com 2048 posições e 14 bits por posição.

O processo de execução da instrução é exatamente igual a qualquer CPU, existe um registrador interno, o PCL (na realidade são dois, o PCLATH também é usado) do PIC que armazena o endereço da próxima instrução que será executada no primeiro estágio do pipilene do PIC. Na nomenclatura associada ao PIC utilizamos o termo registrador para nos referir a uma posição da memória de dados. Sendo assim esses registradores controlam o fluxo de execução das instruções dentro do PIC, em cada execução do programa o endereço da próxima instrução é incrementado automaticamente, a não ser que instrução que foi executada seja de desvio.

Existem dois endereços especiais nesta memória de programa: O Vetor (endereço) de Reset e o Vetor de Interrupção. O primeiro é o endereço para onde o REGISTRADOR PCL aponta, no momento da inicialização do PIC esse endereço é o endereço 0x00 desta memória. O vetor de interrupção é para onde o PCL é desviado toda vez que ocorre alguma interrupção esse endereço é o 0x04.

3.2 Memória EPROM

O 16F628A possui uma memória interna não volátil de 128 Bytes, pode ser usada para armazenar informações dados que devem sobreviver ao desligamento do microcontrolador. Para detalhes de como usar essa memória por favor consulte o datasheet do controlador PIC16F628A.

3.3 Memória de Dados

A memória de dados do PIC é fragmentada em quatro bancos (BANK 0, 1, 2 e 3) cada posição armazena 8bits, ou seja, um byte. Alguns (na realidade muitos) registradores (endereços da memória de dados) são usados para armazenar informações de configuração ou de status do microcontrolador. Ou seja escrevendo em alguns destes endereços é possível alterar o comportamento padrão do PIC, ler alguns destes registradores pode fornecer informações sobre o seu funcionamento. A tabela abaixo mostra a localização destes registradores na memória do PIC16F628A, suas funções serão discutidas em seguida.

Bank 0

Bank 1

Bank 2

Bank 3

000h IDF 080h IDF 100h IDF 180h IDF
001h TMR0 081h OPTION 101h TMR0 181h OPTION
002h PCL 082h PCL 102h PCL 182h PCL
003h STATUS 083h STATUS 103h STATUS 183h STATUS
004h FSR 084h FSR 104h FSR 184h FSR
005hPORTA 085h TRISA 105h Sem uso 185h Sem uso
006h PORTB 086h TRISB 106h PORTB 186h TRISB
007h - 009h
Não Acessível
087h - 089h
Não Acessível
107h – 109h
Não Acessível
187h – 189h
Não Acessível
00Ah PCLATH 08Ah PCLATH 10Ah PCLATH 08Ah PCLATH
00Bh INTCON 08Bh INTCON 10Bh INTCON 08Bh INTCON
00Ch PIR1 08Ch PIE1

10Ch – 11Fh

Não Acessível

18Ch – 1EFh

Não Acessível

00Dh Não Acessível 08Dh Não Acessível
00Eh TMR1L 08Eh PCON
00Fh TMR2H 08Fh Não Acessível
010h T1CON 090h Não Acessível
011h TMR2 091h Não Acessível
012h T2CON 092h PR2
013h-014h
Não Acessível
093h-097h
Não Acessível
015h CCPR1L 098h TXSTA
016h CCPR1H 099h SPBRG
017h CCP1CON 09Ah EEDATA
018h RCSTA 09Bh EEADR
019h TXREG 09Ch EECON1
01Ah RCREG 09Dh EECON2
01Bh - 01Eh
Não Acessível
09Eh Não Acessível
01Fh CMCON 09Fh VRCON 120h – 14Fh 48 bytes
020h – 07Fh (96 bytes) 0A0h – 0EFh (80 bytes) 150h – 16Fh Não acessível
0F0h – 0FFh (Espelho de bank 0)

170h – 17Fh (Espelho de bank 0)

1F0h – 1FFh (Espelho de bank 0)

A seguir a descrição de alguns destes registradores especiais.

3.3.1 Program Counter, PCL e PCLATH

Toda arquitetura tem um registrador que controla o fluxo de execução das instruções, esse registrador é comumente chamado de contador de programa ou PC. A memória de programa do PIC16F628a possui 2048 posições de memória, sendo assim o registrador PC teria que ter pelo menos 11bits para endereçar todas essas posições, no entanto, no caso do PIC os registradores ficam na memória de dados e essa possui posições de 8 bits. A solução para comportar essa memória toda foi distribuir o PC em dois registradores o PCL e PCATH. O PCL tem os 8 bits menos significativos (LSB) já o PCATH tem os 5 bits mais significativos.

3.3.2 Registrador STATUS (003h, 083h,103h, 183h)

STATUS
Bit76543210
FunçãoIRPRP1RP0TOPDZDC/BC/B
AcessoRWRWRWRRRWRWRW
POR00011XXX