SUMÁRIO
1- Introdução
1.1- O que é um microcontrolador
1.2 - Fabricantes de Microcontroladores
1.3 – Mercado de Microcontroladores
2- SAB 8051 - Diagrama em Blocos
3- Características Gerais
4- Organização de Memória em Dispositivos SAB-51
4.1 - Separação Lógica de Memória de Programa e de Dados
4.2 - Memória de Programas
4.3 - Memória de Dados
5- O Conjunto de Instruções
5.1 - Program Status Word (PSW)
5.2 - Modos de Endereçamento
5.3 - Instruções Aritméticas
5.4 - Instruções Lógicas
5.5 - Instruções de Transferência de Dados
5.6 - Instruções Booleanas
5.7 - Instruções de Jumps
6- Ciclo de Máquina
7- Estrutura de Interrupção
7.1 - Interrupt Enable (IE)
7.2 - Prioridade de Interrupções
8- Temporizadores
9- Interface Serial
10- Principais Vantagens do Microcontrolador 8051
11- Atuais Tendências
1- Introdução
A partir do advento dos circuitos integrados TTL, pode-se delinear três gerações no que diz
respeito à implementação de controladores.
Na primeira geração estão os projetos envolvendo circuitos integrados TTL, na sua maioria. O
alto consumo de energia, a grande quantidade de chips envolvidos e a dificuldade em se
realizar reengenharia tornou a segunda geração atraente aos projetistas.
A terceira geração veio para integrar em um único chip boa parte dessa estrutura.
Microcontroladores integram as funções de um microprocessador, memória de dados e de
instruções e ainda, dependendo da complexidade, portas seriais e paralelas bidirecionais,
conversores A/D, timers, watchdog e outros.
Motorola Microchip
Mitsubish Matsushitta
Siemens Toshiba
NEC National Semiconductor
Hitach Zilog
Philips Texas Instruments
Intel Sharp
Todos os bytes do bloco Lower podem ser acessados direta ou indiretamente (veja
seção 5.2). O bloco Upper 128, não disponível no 8051 mas sim, no 8053B, no 80515 e
no 80C517, é acessado unicamente por endereçamento indireto.
O bloco SFR (Special Function Register), mostrado na Figura 5, inclui latches, timers,
controle de periféricos, etc. e ocupa o espaço de endereçamento 80H a FFH. Tais
registradores podem ser acessados exclusivamente por acesso direto.
Figura 5 – Região SFR ( Special Function Registers )
5- O Conjunto de Instruções
Todos os membros da família 8051 executam o mesmo conjunto de instruções classificadas
como: aritméticas, lógicas, transferência de controle, transferência de dados e booleanas.
Dispõem de uma variedade de rápidos modos de endereçamento à RAM interna, para facilitar
operações com bytes em pequenas estruturas de dados. Suporte à variáveis de um bit também
é disponível, permitindo manipulação direta em sistemas de controle e lógica que requerem
processamento booleano.
5.1- Program Status Word (PSW)
Este byte, localizado no espaço SFR, contém alguns bits de status que refletem o estado
da CPU. Mostrado na figura 6, contém flags Carry, Auxiliay Carry, Overflow, Paridade,
dois bits (RS0 e RS1) de seleção de banco de registradores e dois bits de status
definidos pelo usuário.
Instruções aritméticas tomam 1 s para serem executadas exceto INC DPTR, que toma
2 s e instruções de multiplicação e divisão, que tomam 4 s, considerando uma
freqüência de clock de 12MHz.
Note que qualquer byte alocado em uma posição da Memória de Dados interna pode ser
incrementado ou decrementado sem precisar de ser carregado no Acumulador.
A instrução MUL AB multiplica o conteúdo do Acumulador pelo conteúdo do registrador .
O produto em 16bits é colocado nos registradores A e B concatenados. A instrução DIV
divide o conteúdo do acumulador pelo conteúdo do registrador B. O quociente é
colocado no Acumulador e o resto no registrador B.
A instrução DA A, ajusta o resultado de uma operação BCD. Note que essa instrução
não converterá um número binário em BCD mas sim, ajustará o resultado de uma
operação ADD ou ADDC envolvendo valores BCD.
Todas instruções desse tipo que utilizam o Acumulador como registrador específico
tomam 1 s para serem executadas, enquanto as demais tomam 2 s. Os modos de
endereçamento disponíveis tornam desnecessário carregar qualquer operando que
estiver na Memória de Dados interna para o Acumulador. Não utilizar o Acumulador,
economiza o tempo em empilhar seu conteúdo quando do atendimento a uma
interrupção.
Instruções de rotação deslocam de um bit para direita ou esquerda o conteúdo do
Acumulador. Se for para esquerda, o bit LSB recebe o bit MSB, enquanto, se for para
direita, o bit MSB recebe o bit LSB.
A instrução SWAP permuta os quatro bits menos significativos com os quatro bits mais
significativos do Acumulador.
RAM interna
RAM externa
A Tabela 4 mostra a lista de instruções de Transferências de Dados para acesso à
memória externa. Somente endereçamento indireto pode ser utilizado. Pode-se
escolher o uso de endereços de 8bits, @Ri, onde Ri pode ser o registrador R0 ou
o registrador R1, ou endereços de 16bits, @DPTR. A desvantagem em se usar
endereços de 16bits, quando poucos Kbytes de Memória de Dados externa estão
envolvidos, é o sacrifício de todos os 8bits da Porta2 (veja Figura 2). Note que o
Acumulador é sempre o fonte ou o destino da transferência.
Os sinais RD e WR só são gerados quando da execução de uma instrução do tipo
MOVX, assim, se uma RAM externa não é disponível, tais sinais podem ser
utilizados como linhas de E/S extras.
Lookup Tables
A tabela 5 mostra as duas instruções disponíveis para ler Lookup Tables da
Memória de Programas. Uma vez que reside nessa memória, tal tabela só poderá
ser lida. Se essa tabela se encontra na Memória de Programas externa, o sinal de
leitura é PSEN.
A primeira instrução MOVC pode acomodar uma tabela de 256 entradas (0-255).
O número da entrada é armazenado no Acumulador e o registrador DPTR é
ajustado com o valor inicial da tabela.
A segunda instrução utiliza o PC como a base da tabela que é acessada através
de subrotina. O Acumulador é carregado com o valor da entrada da tabela e a
subrotina é chamada:
MOV A, ENTRADA
CALL LOOKUP_TABLE
Subrotina:
LOOKUP_TABLE: MOVC A, @A + PC
RET
A tabela em si segue imediatamente a instrução RET. Ela comporta 255 entradas
(1-255), pois, a entrada 0 endereça a instrução RET.
Jumps incondicionais
O conjunto de jumps incondicionais( tabela 7) possuem seis instruções em seu
repertório. JMP é apenas um mnemônico genérico utilizado pelo programador que
não precisa saber como ela é realmente interpretada pelo assembler. Na
realidade, JMP corresponde a três instruções: SJMP, LJMP e AJMP. A instrução
SJMP calcula o endereço destino como descrito acima que pode varrer uma
largura de -128 a +127 bytes na Memória de Programas. A instrução LJMP
codifica o endereço destino como uma constante de 16bits que pode ser qualquer
localidade dos 64Kbytes da Memória de Programas. A instrução AJMP codifica o
endereço destino como uma constante de 11bits. A instrução consiste em 2 bytes:
3bits do endereço localizam-se no opcode enquanto os outros 8bits localizam-se
no próximo byte. Os 11bits assim formados simplesmente substituem os 11bits
menos significativos de PC.
Em todos os casos, o programador especifica o endereço destino de duas
maneiras: ou como um label ou como uma constante de 16bits. O assembler se
encarrega de colocar o endereço destino para o correto formato de instrução.
A instrução JMP @A + DPTR implementa a comando CASE. O endereço destino
é computado em tempo de execução como a soma do conteúdo do Acumulador e
o registrador DPTR. Tipicamente, DPTR é carregado com o endereço de uma
tabela de jumps e, ao Acumulador, é dado o valor de um índice dessa tabela.
Semelhantemente à instrução JMP, a instrução CALL, na realidade, são duas :
LCALL e ACALL que diferem na forma como que o endereço da subrotina é dado
à CPU. LCALL utiliza o endereço destino em 16bits que pode ser qualquer
localidade dos 64Kbytes da Memória de Programas. ACALL utiliza formatos em
11bits o que significa que o endereço destino deve estar no mesmo bloco de
2Kbytes seguintes a instrução. A transparência para o programador em CALL é
semelhante à de JMP.
As instruções RET e RETI são utilizadas em finais de subrotinas. A diferença
entre elas é que RETI informa ao sistema de controle de interrupções que a
interrupção em progresso terminou.
Jump condicionais
O conjunto de jumps condicionais só permite endereçamento de destino relativo o
que limita a distância de salto entre -128 e +127 bytes de distância da instrução
jump. Importante notar que o programador especifica o endereço como um label
ou uma constante de 16bits.
Não há flag zero, portanto, JZ e JNZ testam o dado do Acumulador para tal
condição.
A instrução DJNZ (Decrementa e Jump se Não Zero) é utilizada para controle de
loops assim como CJNE (Compara e Jump se Não Igual). Uma aplicação para
esta instrução está em comparações "maior que, menor que". Pelo valor do Carry
bit distingue-se as duas situações. Se o primeiro é menor que o segundo, Carry bit
6- Ciclo de Máquina
Um ciclo de máquina consiste de uma seqüência de 6 estados (S1 a S6). Cada estado toma 2
períodos de clock e, portanto, um ciclo de máquina toma 12 períodos de clock ou 1 s sob uma
freqüência de 12MHz.
A Figura 7 mostra a seqüência de busca/execução para alguns tipos de instruções.
Normalmente dois ciclos de busca são executados em cada ciclo de máquina mesmo que a
instrução sendo executada não o requer, caso em que o byte buscado é ignorado e o PC não é
incrementado.
Figura 7 – Sequência de Estados
Instruções de um ciclo começam em S1, em S4 é gerado uma segunda busca e, no fim de S6,
a instrução está completa. O ciclo busca/execução é o mesmo se a Memória de Programas é
externa ou interna. A Figura 7 mostra os sinais e as temporizações envolvidas quando a
Memória de Programas é externa. Nesse caso, o sinal PSEN é ativo duas vezes por ciclo de
máquina. Se um acesso à Memória de Dados externa ocorre, como mostrado na Figura 2, dois
PSENs são pulados porque o bus de endereços e o bus de dados estão sendo utilizados para
acesso à Memória de Dados. Note que um ciclo de Memória de Dados externa toma duas
vezes mais tempo que um ciclo de Memória de Programas. A Figura 8 mostra a dinâmica dos
endereços sendo enviados às Portas 0 e 2 e dos sinais ALE e PSEN. O sinal ALE é ativado
indiferentemente se a CPU está executando a partir da Memória de Programas externa ou
interna, podendo ser utilizado como uma saída de clock
7- Estruturas de Interrupção
Os microcontroladores 8051A, 80C51 e suas versões ROMless dispõem de 5 fontes de
interrupção: 2 interrupções externas, 2 interrupções de temporizadores e uma interrupção por
porta serial. O 8052B e o 80C52 possuem essas cinco interrupções e mais uma associada ao
terceiro temporizador. Outras interrupções são disponíveis em membros mais avançados da
família.
9- Interface Serial
O 8051 possui uma porta serial full-duplex, o significa que ela pode enviar e transmitir dados
simultaneamente. Essa interface pode operar em 4 modos:
Modo 0: (modo síncrono) 8 bits do dado serial entram e saem por RxD0. TxD0 tem como
saída o sinal de clock deslocado em fase. A velocidade de transmissão é de 1/12 clock.
Modo 1: (modo assíncrono) 10 bits são transmitidos (TxD0) ou recebidos (RxD0): 8bits
de dados, 1 stop bit e 1 start bit. A velodidade de transmissão é variável.
Modo 2: (modo assíncrono) 11 bits são transmitidos (TxD0) ou recebidos (RxD0): 1 start
bit, 8bits de dados, 1bit programável pelo usuário (por exemplo: bit de paridade) e um
stop bit. A velocidade de transmissão pode ser porgramável para 1/32 ou 1/64 clock
Modo 3: (modo síncrono) exatamente como no Modo 2, porém, a velocidade de
transmissão é variável.
Em cada um dos modos, a transmissão é iniciada quando da execução de uma instrução cujo
registrador destino é o registrador S0BUF (endereço 99H, região SFR). A recepção é iniciada
no modo 0 pela condição RI0 = 0 (endereço 98H) e REN0 = 1 (endereço 9CH), ambos
localizados no registrador S0CON (endereço 98H, região SFR). Em outros modos, a recepção é
iniciada quando REN0 = 1.
10- Principais Vantagens do Microcontrolador 8051
Popular: prontamente disponível e amplo suporte. Gama completa de produtos de
suporte estão disponíveis de graça e comercialmente.
Rápido e eficaz: a arquitetura se correlaciona de perto com o problema sendo
solucionado (sistemas de controle). Instruções especializadas significam que menos
bytes precisam ser buscados e menos jumps condicionais são processados.
Baixo custo: alto nível de integração do sistema em um único componente. Poucos
componentes são necessários para se criar um sistema que funcione.
Ampla gama de produtos: uma única família de microcontroladores cobre as opções
que outros fornecedores só conseguem cobrir com um número razoável de diferentes e
incompatíveis famílias. Desse modo, o 8051 proporciona economia real em termos de
custo de ferramentas, treinamento e suporte para software.
Compatibilidade: opcodes e código binário são os mesmos para todas as variações do
8051, diferente de outras famílias de microcontroladores.
Multi-Sourced: mais de 12 fabricantes, centenas de variedades.
Aperfeiçoamentos constantes: melhorias na manufatura aumentam a velocidade e
potência anualmente. Há ainda versões de 16 bits vindo de diversos fabricantes.