MICROCONTROLADORES HOLTEK - PARTE 2


Durante esta pequena série de artigos utilizarei o microcontrolador HT48E10. Os outros membros da família possuem basicamente a mesma estrutura, variando apenas o número de I/Os e alguns periféricos. Para o interessado, esta seqüência de artigos poderá consistir em uma excelente documentação básica para um estudo mais aprofundado dos microcontroladores Holtek, família 48E.



A FAMÍLIA HT48E

Conforme demonstrado no primeiro artigo a família Holtek 48E utiliza arquitetura RISC (Reduced Intruction Set Code) que proporciona um excelente ganho de performance, entre outras vantagens.



HARDWARE INTERNO

Na figura abaixo é mostrada a arquitetura interna do microcontrolador HT48E10. Você notará a separação entre o bus (barramento) da memória de dados e o bus da memória de programa. Esta é a principal característica da arquitetura RISC. Assim é possível ter um set de instruções reduzido, mas bastante poderoso que enfatiza as operações de bit, byte e registradores.


Um outro dado importante a ser ressaltado é o fato de todos os periféricos e registradores de controle dos pinos de I/O estarem ligados ao barramento da memória de dados. Assim, a estrutura interna de um microcontrolador qualquer da família HT48E será sempre a mesma (com pouquíssimas variações para pinos de I/O e periféricos).



CONTROLE DE STACK (PILHA) DO HT48E10

O microcontrolador HT48E10 tem implementado uma estrutura de pilha com quatro níveis. O empilhamento do endereço de desvio é feito quando é chamada uma sub-rotina através da instrução de desvio CALL. O "desempilhamento" é realizado pela instrução RETI (retorno do desvio).

Você deve estar atento para este limite quando programar o HT48E10, pois há apenas quatro níveis de empilhamento (em outros membros da família HT48E este número pode ser maior). Portanto, só é possível chamar três sub-rotinas dentro de uma outra sub-rotina, ou ainda realizar quatro chamadas (seqüencialmente) de sub-rotinas com a instrução CALL, uma dentro da outra.

É importante que você compreenda que o empilhamento que estou me referindo diz respeito aos endereços de desvio feitos com a instrução CALL. Não estou me referindo ao empilhamento de dados, pratica muito comum e utilizada em outras famílias de microcontroladores com arquitetura não RISC. Este tipo de empilhamento (dados) não é possível na família 48E.



ORGANIZAÇÃO DA MEMÓRIA DE PROGRAMA

A figura abaixo demonstra a divisão da memória de programa do microcontrolador HT48E10. A área total esta organizada em 1024 posições de 14 bits cada, que são acessadas através do PC (Program Counter), além dos registradores de controle de tabelas.


A posição de memória no endereço 00H é reservada para o inicio do programa, ou seja, sempre que o microcontrolador for ligado ou “resetado” ele buscara pela primeira instrução do programa nesta posição. Assim, você deve tomar o devido cuidado para que seu programa sempre inicie com este endereço.

O endereço 04H é reservado para o vetor de tratamento para interrupção externa. Assim, caso o programa faça uso da interrupção externa, as primeiras instruções para tratamento desta interrupção deverão ser inseridas utilizando este endereço como referência.

Já o endereço 08H é reservado ao vetor de tratamento da interrupção do Timer/Counter. As mesmas observações feitas a respeito do endereço 04H são validas aqui.

Devido à proximidade entre os endereços dos vetores de tratamento de interrupções, fica óbvio que no caso do uso de ambas as interrupções, é quase que impossível inserir as instruções necessárias ao tratamento em tais vetores.Neste caso, o uso de uma instrução de desvio é a melhor opção. Assim a sub-rotina pode ser inserida em uma área de maior espaço. A única precaução neste caso é o uso da instrução RETI (retorno de interrupção) após o encerramento da mesma.

Você deve ter notado que o tamanho da “palavra” na memória de programa do microcontrolador HT48E10 é de 14 bits. Esta é uma característica muito interessante a respeito de sua arquitetura, pois uma única palavra de 14 bits pode conter o operador e operando do comando. Ou seja, cada uma das posições de memória de programa (1024) guardará um comando completo. Desta forma o microcontrolador gasta apenas um ciclo de máquina para ler tanto o código da instrução, quanto o seu operando (dado da operação).

O número de bits na palavra para memória de programa para a família HT48E é variável, conforme a tabela abaixo.

Tabela – Palavra da memória de programa para a família HT48E

Microcontrolador Tamanho da memória de programa Tamanho da palavra
HT48E06 1024 14 bits
HT48E10 1024 14 bits
HT48E30 2048 14 bits
HT48E50 4096 15 bits
HT48E70 8192 16 bits

Assim a memória de programa para a família HT48E será sempre formada por um único banco, permitindo que qualquer desvio no programa seja feito pelas instruções JMP e CALL de forma direta, sem a necessidade de chaveamento de bancos, como em outros microcontroladores.

Devido à arquitetura apresentada não é possível para o programa ler a própria memória de programa. Isso é muito utilizado no caso de armazenamento de dados como tabelas, por exemplo, dentro da própria área de programa. Para contornar este problema, basta usar as instruções TABRDC e TABRDL. Através destas é possível ter acesso a memória de programa, possibilitando assim fazer uso desta para o armazenamento de dados (apenas para leitura).



MEMÓRIA DE DADOS

Na figura abaixo você pode ver a estrutura da memória de dados do microcontrolador HT48E10, toda baseada em registradores (a maioria disponível para escrita e leitura). São 23 posições com 8 bits cada (perceba que a memória de dados possui uma palavra com 8 bits – 1 byte - para todos os registradores) utilizados para os registradores de uso especial (que serão descritos mais à frente) e 64 bytes utilizados pelos registradores de uso geral (memória RAM – 40H a 7FH). O espaço dedicado a memória RAM entre um ou outro microcontrolador da mesma família pode variar.


[


É importante salientar também que o número de registradores de uso especial pode variar dependendo do modelo do microcontrolador. Estes registradores auxiliam no controle dos periféricos presentes no microcontrolador e assim é natural que com a inclusão ou mesmo alteração de um ou outro periférico, o número destes registradores também seja alterado. Você não deve se preocupar com isso neste momento.



REGISTRADORES DE USO GERAL

A seguir serão descritos os registradores de uso especial presentes no microcontrolador HT48E10.

- Indirecting Addressing Register (00H) – Esse registrador é utilizado para endereçamento indireto dos registradores, juntamente com o registrador MP (01H).

- ACC (05H) – Toda movimentação de dados passa por este registrador. O acumulador é o registro de trabalho de um microcontrolador. É através dele que carregamos um dado na memória, realizamos operações matemáticas, etc. É neste registrador também que a ULA (Unidade Lógica Aritimética) insere os resultados de uma determinada operação artitimética.

- PCL (06H) – Este registrador contem a parte menos significativa do PC (Program Counter). Alterando-se este registrador, pode-se realizar saltos de até 256 posições de memória.

- TBLP (07H) e TBLH (08H) – Registrador “ponteiro de tabela” e “ordem alta da tabela”, respectivamente. Utilizados em conjunto com as instruções TABRDC e TABRDL para realizar a leitura de “dados” dentro da área de programa.

- WDTS (09H) – Registrador utilizado para o controle do Wacthdog Timer (Relógio Cão de Guarda). .

- STATUS (0AH) – Registrador que informa o “estado” do microcontrolador (ULA, periféricos e outros). Este registrador é muito utilizado quando de uma operação aritimética, situações de desvio e outras. A tabela abaixo demonstra seus bits.


Tabela – Registrador de Status

Nome Bit Descrição
C 0 Carry Flag – Ligado quando há o “estouro” em uma operação de soma (resultado). Também utilizado em operações de subtração. Este bit é afetado em operações de rotação.
AC 1 Auxiliary Carry Flag - Ligado nas mesmas situações que o Bit Carry, porém considerando-se apenas operações com a parte menos significativa de um byte
Z 2 Zero Flag – Ligado quando uma operação qualquer na ULA resulta em zero
OV 3 Overflow Flag - Ligado quando uma operação resulta em carry, mas considerando o bit mais significativo.
PDF 4 Power Down Flag - Ligado quando executado a instrução HALT. Desligado pelo microcontrolador durante o power-up ou ainda quando executado CLR WDT
TO 5 Time-out Flag - Ligado durante estouro do tempo do WDT. Desligado durante a execução das instruções CLR WDT ou HALT
----- 6 Bit não utilizado – lido como zero
----- 7 Bit não utilizado – lido como zero

Obs.: na tabela 2 o termo “ligado” deve ser interpretado como “levado ao nível lógico 1” e a palavra “desligado” como “levado ao nível lógico 0”


- INTC (0BH) – Registrador de controle para as interrupções presentes no microcontrolador. A tabela abaixo demonstra seus bits.

Tabela – Registrador de controle para interrupções

Nome Bit Descrição
EMI 0 Controle global das interrupções (1 – interrupções habilitadas, 0 – interrupções desabilitadas)
EEI 1 Controle da interrupção externa (1 – interrupção habilitada, 0 – interrupção desabilitada)
ETI 2 Controle da interrupção timer/counter (1 – interrupção habilitada, 0 – interrupção desabilitada)
---- 3 Bit não utilizado – lido como zero
EIF 4 Aviso de requisição da interrupção externa (1 – interrupção ativa, 0 – interrupção não ativa)
TF 5 Aviso de requisição da interrupção timer/counter (1 – interrupção ativa, 0 – interrupção não ativa)
---- 6 Bit não utilizado – lido como zero
---- 7 Bit não utilizado – lido como zero


- TMR (0DH) e TMRC (0EH) – Registradores de controle e uso para o periférico timer/counter.



CONCLUSÃO

Nesta parte da mini-série detalhei algumas partes do hardware dos microcontroladores Holtek - família HT48Exx muito importantes como a estrutura da memória e a descrição dos registradores de uso especial. Para aquele acostumado no uso de microcontroladores muita coisa pode facilmente ser assimilada. Já aquele que está iniciando pode ser sentir, num primeiro momento, um tanto perdido e até meio confuso. Se você se sentir assim, não há motivo para preocupação. Nos próximos artigos, você receberá mais informações sobre outras partes do hardware que irão ajudá-lo a compreender melhor o funcionamento e , consequentenmente, o uso do microcontrolador. Bons estudos e até a próxima!



Copyright deste conteúdo reservado para Márcio José Soares e protegido pela Lei de Direitos Autorais LEI N° 9.610, de 19 de Fevereiro de 1998. É estritamente proibida a reprodução total ou parcial do conteúdo desta página em outros pontos da internet, livros ou outros tipos de publicações comerciais ou não, sem a prévia autorização por escrito do autor.