Professional Documents
Culture Documents
SISTEMAS DIGITAIS
µControladores da Família 51
O conjunto de instruções do 8051 encontra-se optimizado para as operações ao bit permitindo uma mais
fácil implementação de software de controlo em tempo real. O processador booleano fornece suporte
directo para a manipulação de bits, conduzindo a programas mais eficientes no que toca às operações de
entrada e saída de dados tão importantes na resolução de problemas de controlo digital.
2 Arquitectura Base
A fig. 1 apresenta a arquitectura base dos µControladores da família 51.
1
• Controlo de Interrupções – permite a detecção e consequente processamento de um conjunto
de sinais de interrupção externos e internos.
• Timer 0 e Timer 1 – temporizadores / contadores de 16 bits que podem ser activados a partir do
exterior.
• Porto Série – dispositivo implementado por uma UART (Universal Assynchronous Receiver
Transmiter) permitindo efectuar comunicações série com o exterior.
• Portos de I/O – conjunto de 4 portos paralelos para o interface com o exterior. Dois destes
portos podem ser usados para implementar barramentos de acesso a dispositivos de memória
exteriores.
• Controlo do Barramento – quando é utilizada memória externa ao mC, este bloco contém o
hardware necessário para o controlo das transferências de informação.
• Oscilador – permite gerar os sinais de relógio necessários ao funcionamento do µC.
3 ‘PinOut’ do µControlador
Na fig. 2 mostram-se duas caixas possíveis para este µC.
4 Sistema de Memória
Como já foi referido no parágrafo 2, os diferentes elementos da família 51 dispõe de memória interna de
dados e, na maior parte das vezes, de memória interna de programa. Alguns exemplos de µCs desta
família:
2
µControlador Mem. Programa Mem. Programa Mem. de Dados Mem. de Dados
Interna (bytes) Externa (bytes) Interna (bytes) Externa (bytes)
80C31 0 Até 64K 256 Até 64k
87C51 4K (EPROM) Até 64K 256 Até 64k
8051 4K (ROM) Até 64K 256 Até 64k
89C51 4K (Flash) Até 64K 384 Até 64k
89C51RD2 64K (Flash) Até 64K 384 Até 64k
89C2051 2K (Flash) 0 256 0
Tabela 1
De notar que nestes µCs, o espaço de endereçamento da memória de programa é totalmente distinto do
espaço de endereçamento da memória de dados, o que permite, com um barramento de endereços de 16
bits, obter 64K bytes de programa mais 64K bytes de dados. Comparando com o Z80, em que estes dois
espaços de endereçamento se sobrepõe (64K programa + dados), este µC consegue endereçar o dobro de
memória.
A razão de ser deste aumento do espaço de endereçamento tem a ver com o barramento de controlo do
8051. No processador Z80, conforme foi estudado anteriormente, o barramento de controlo para o acesso
às memórias dispõe unicamente de um sinal de escrita (WR) e de um de leitura (RD). Estes sinais são
utilizados quer se esteja a fazer um acesso à memória de programa quer se esteja a aceder à memória de
dados. No caso dos µCs 51, existe uma distinção entre o barramento de controlo para a memória de
programa (PSEN) e o barramento de controlo para a memória de dados (WR e RD). Este duplo
barramento aliado à existência de instruções específicas para acesso a cada uma daquelas zonas de
memória, permite a duplicação da capacidade de endereçamento nestes µControladores.
3
Como se pode ver, os barramentos de endereços e de dados partilham um porto do 51 – Porto 0. Este
processo de partilha será analisado mais à frente no parágrafo que diz respeito à Multiplexagem de
Barramentos.
Ainda em relação ao acesso à memória de programa, o sinal EA (pino 31) permite-nos indicar ao µC se a
memória de programa está no seu interior ou no seu exterior. Assim, se EA estiver ligado a VCC (nível
lógico 1) o µC faz a pesquisa das instruções de programa a partir da sua memória interna de programa. Se
EA estiver ligado ao nível lógico 0 (VSS), a pesquisa é feita da memória externa de programa, através dos
barramentos descritos anteriormente.
De notar que, mesmo que exista uma certa quantidade de memória interna de programa, é sempre
possível fazer a sua expansão até 64K utilizando memória externa. Neste caso EA deverá ser colocado a 1
para permitir aceder à memória interna. O µC é capaz de detectar quando é feito um acesso a um
endereço da memória externa, colocando automaticamente em funcionamento os barramento para que a
instrução possa ser pesquisada do exterior.
Como se pode ver na Tabela 1, há alguns µCs desta família que não permitem a expansão de memória. É
o caso do 89C2051 que dispõe internamente de 2K bytes de memória de programa mas que, devido à sua
construção, não apresenta os Portos 0 e 2, impossibilitando por isso a implementação dos barramentos de
acesso ao exterior.
80h 80h
O primeiro espaço é constituído por 128 bytes
(endereços 0 a 127) e destina-se ao armazenamento de 7Fh
operandos necessários ao processo computacional. Cada Endereçamento
directo e
uma das posições de memória pode ser endereçada indirecto
directa ou indirectamente, isto é, a operação de leitura (uso geral)
ou escrita pode ser feita especificando o endereço ao 00h
qual se vai aceder ou especificando um registo no qual
existe o endereço que vai ser acedido.
Os 128 bytes mais altos do espaço de endereçamento Figura 3 – Memória Interna de Dados
são, em alguns modelos de µCs, partilhados por 2
blocos de memória. A única diferença existente entre estes 2 blocos tem a ver com o processo de
endereçamento. Num deles, que existe em todos os µCs e que contém os registos de função especial
4
(SFRs), o acesso é feito utilizando endereçamento directo. O outro bloco, cujas posições se destinam a
uso genérico, só pode ser acedido utilizando
endereçamento indirecto.
Figura 4 - Memória Interna de Dados
Os 128 bytes mais baixos da memória interna de
dados do 8051 estão representados na fig. 4.
Início da stack: quando é feito o reset do µC, o ponteiro da stack é inicializado com o valor 07h.
Isto quer dizer que a estrutura de stack irá crescer a partir desta posição de memória o que obriga,
se não quisermos alterar o seu início, a ter certos cuidados na declaração das variáveis a utilizar no
programa.
Na zona superior da memória interna de dados encontram-se os registos de função especial – SFRs. Estas
posições de memória, que podem ser acedidas unicamente por endereçamento directo, estão ligadas ao
hardware do µC. Na figura seguinte pode ser visto o conjunto base de SFRs.
5
De notar que nesta zona de memória só os endereços correspondentes aos SFRs se encontram
descodificados pelo que não deve ser tentado qualquer acesso às restantes posições de memória.
Ainda nesta zona de memória, todos os SFRs cujo endereço termine em 0 ou 8 podem ser acedidos ao bit.
Os diferentes registos de função especial podem ser agrupados de acordo com as suas funcionalidades:
Registos Aritméticos
o Registo B B
o Acumulador ACC
o Registo de Estados PSW
Ponteiros
o Ponteiro da Stack SP
o Ponteiro de Dados DPH
DPL
Sistema de Interrupções
o Controlo de Prioridade IPC
o Enable de Interrupções IEC
Temporizadores / Contadores
o Modo de funcionamento TMOD
o Controlo TCON
o Timer 0 TH0
TL0
o Timer 1 TH1
TL1
Porto Série
o Controlo da Com. Série SCON
o Buffer da Com. Série SBUF
Outras Funções
o Controlo de Potência PCON
Acumulador - Registo ligado à ALU do µC. Embora o nome deste registo seja ACC, as mnemónicas das
instruções que o usam especificamente referem-se ao acumulador como A.
Registo B - Este registo é usado especialmente nas operações de multiplicação e divisão. Fora destas
operações pode ser utilizado como um registo de uso normal.
6
Registo de Estados – o registo PSW contém informações sobre o estado do programa. A sua
constituição encontra-se na figura seguinte.
Ponteiro da Stack – trata-se de um registo de 8 bits cujo em cada instante contém o endereço do topo da
estrutura de stack. Este ponteiro é incrementado antes de os dados serem guardados durante a execução
de instruções de PUSH e CALL, e decrementado depois da recuperação dos dados durante a execução de
instruções de POP e RETURN.
Ponteiro de Dados – o ponteiro DPTR é constituído por um byte mais significativo DPH e um byte
menos significativo DPL. Este registo destina-se a conter um endereço de 16 bits para acesso indirecto às
memórias de programa e de dados.
Portos 0 a 3 – portos de entrada / saída de dados, num total de 32 bits programáveis individualmente
como entrada ou saída de dados.
Buffer de Comunicação Série – registo SBUF, composto por 2 registos separados que constituem o
buffer de transmissão e o buffer de recepção, permitindo uma comunicação em full-duplex.
Temporizadores / Contadores – pares de registos (TH0, TL0) e (TH1, TL1) que constituem os dois
temporizadores / contadores de 16 bits disponíveis no µC.
Registos de Controlo – os registos de função especial IP, IE, TMOD, TCON, SCON e PCON contém
bits de controlo e de estados para o sistema de interrupções, temporizadores / contadores e porto série.
7
4.3 Multiplexagem de Barramentos
Como foi visto no parágrafo anterior, nos µCs da família 51 que dispõe de barramentos para acesso a
memória externa, o barramento de dados é partilhado com os 8 bits menos significativos do barramento
de endereços através de um processo que se designa por multiplexagem de barramentos. Esta multiplexagem
no tempo permite que, durante uma primeira fase do acesso ao exterior, o Porto 0 contenha os 8 bits
menos significativos do endereço e, numa segunda fase, o barramento é comutado para conter os dados
que vão ser transferidos (lidos ou escritos). Este processo pode ser analisado na fig. 7 na qual se mostra a
evolução dos barramentos e sinais de controlo numa operação de escrita na memória externa de dados.
ALE
WR
P2 Endereço A8..15
Nas figuras 8 e 9 pode ser vista a evolução dos barramentos e sinais de controlo em operações de leitura
da memória externa de dados e de leitura de código da memória externa de programa
.
ALE
RD
P2 Endereço A8..15
ALE
PSEN
P2 PC8 ..15
8
Como já é sabido, para que possa ser feita uma operação de leitura ou escrita num dispositivo de memória,
é necessário que o barramento de endereços permaneça estável durante todo o processo. Analisando os
casos anteriores, podemos verificar que os 8 bits menos significativos daquele barramento são retirados do
porto 0 para dar lugar aos dados. É então necessário adicionar algum hardware externo para que possa ser
feira a memorização de A0..7. Isto é feito com o circuito que se apresenta na figura 10 onde pode ser vista
a utilização de uma latch (p. ex. 74HCT573) que permite a memorização dos 8 bits menos significativos do
endereço sempre que é activado o sinal ALE.
AD0..7 8
Latch
P0 A0..7
D0..7
ALE
A8..15 8
P2 A8..15
PSEN OE
RD Mem Dados
WR A0..7
D0..7
A8..15
OE
WE
Os drivers de saída dos portos 0 e 2 e o buffer de entrada do porto 0 podem ser utilizados no acesso à
memória externa utilizando o processo de multiplexagem de barramentos analisado no parágrafo anterior.
Os 8 bits que fazem parte do porto 3 disponibilizam, para além da normal E/S de dados, uma segunda
função:
9
P3.6 WR (sinal de escrita na memória externa de dados)
P3.7 RD (sinal de leitura na memória externa de dados)
5.1 Porto 0
Na fig. 11 está representado o hardware
correspondente a um bit do Porto 0.
Podemos identificar a latch onde podem
ser escritos os dados a enviar para a saída,
o driver de saída e o buffer de entrada.
De notar ainda a existência de um
multiplexador que é comutado sempre
que é necessário activar o barramento
externo para operações de acesso a
memória.
5.2 Porto 1
A figura ao lado representa o hardware associado a um
bit do Porto 1. A sua estrutura é bastante mais simples
do que a dos restantes portos dado que este porto não
possui segundas funções. Trata-se única e
exclusivamente de um porto de E/S de dados.
Operação de Entrada de Dados: para programar o bit do porto com entrada de dados é
necessário escrever um 1 na latch de dados de maneira a que o fet inferior seja colocado no
estado OFF. De notar que os diferentes bits deste porto, quando programados como entrada, não
apresentam alta impedância devido à existência do pull-up interno.
10
Operação de Saída de Dados: a escrita de um 0 na latch de dados coloca em condução o fet do
driver de saída ligando à massa o pino exterior. A escrita de um 1 na mesma latch coloca o fet em
estado OFF colocando o pino do porto ligado a VDD através do pull-up interno. De notar ainda
que, quando se processa uma transição de 0 para 1 no bit de saída, o pull-up é curto circuitado
durante 2 períodos de relógio de maneira a reduzir a 0 a constante de tempo de carga dos
circuitos externos e consequentemente reduzir praticamente a 0 o tempo de subida do sinal no
pino do µC.
5.3 Porto 2
O hardware de um bit do Porto 2 está
representado na fig. 13.
5.4 Porto 3
O hardware que implementa os diferentes bits do
Porto 3 do µC8051 é idêntico ao apresentado para
os Portos 1 e 2. A diferença existente tem a ver
com a possibilidade de os bits deste Porto poderem
apresentar funções alternativas como se referiu no
início do parágrafo 5. Estes sinais, que podem estar
ligados à UART (TxD, RxD), ao sistema de
interrupções (INT0, INT1), aos temporizadores /
contadores (T0, T1) e à unidade de controlo (WR,
RD), são lidos ou escritos através das linhas que se
apresentam na fig. 14.
Figura 14 - Hardware de um bit do Porto 3
De notar que neste porto podem coexistir, em
funcionamento normal, bits de E/S e bits com funções especiais. Em termos de operações de E/S, o
funcionamento é o mesmo que foi visto para os Portos 1 e 2.
11
6 Temporizadores / Contadores
Os µCs da família 51 possuem pelo menos 2 temporizadores / contadores de 16 bits, Timer 0 e Timer 1.
podendo ser cada um deles configurado para funcionar como temporizador ou como contador de
eventos. Os registos físicos que implementam o T/C 0 (TH0 e TL0) e o T/C 1 (TH1 e Tl1) estão
mapeados na zona de memória dos SFRs.
No modo de temporizador os registos são incrementados em cada ciclo máquina através de um sinal
obtido do oscilador interno do µC e cuja frequência é fosc/12.
No modo de funcionamento de contador, os registos são incrementados no flanco descendente do sinal
que é introduzido nos pinos T0 (para o T/C 0)e T1 (para o T/C 1). Neste caso, o método de amostragem
do sinal de entrada, que necessita de 2 ciclos máquina para reconhecer uma transição de 1 para 0, limita a
frequência do sinal de entrada a fosc/24.
GATE Quando este bit está igual a 1, o Timer/Counter x só funciona se o pino exterior
INTx e o bit de controlo TRx estiverem a nível lógico 1.
Quando este bit for igual a 0, o Timer/Counter x funciona se TRx=1.
C/T =1 permite o funcionamento do Timer/Counter x como contador utilizando para
isso o sinal introduzido a partir do pino exterior Tx
=0 permite o funcionamento do Timer/Counter x como temporizador utilizando
para isso o sinal resultante do oscilador interno (fosc÷12)
M1 M0 Modo de Funcionamento
0 0 T/C de 8 bits crescente com um prescaler de 5 bits (÷32)
0 1 T/C crescente de 16 bits (THx + TLx)
1 0 T/C crescente de 8 bits (TLx) com recarga (THx)
1 1 O T/C 0 funciona como 2 T/Cs independentes de 8 bits (TH0 e TL0)
Este modo de funcionamento para o T/C 1 serve unicamente para parar o seu
funcionamento
Figura 15 – Registo para definição do modo de funcionamento dos T/Cs
12
6.2 Registo TCON
6.3.1 Modo 0
Programando qualquer um dos T/Cs em Modo 0 permite a implementação de um contador de 8 bits com
um divisor de frequência por 32. Este modo de funcionamento é mostrado, para o T/C 1, na fig. 17.
Em Modo 0 o T/C é configurado como um registo de 13 bits em que os 8 bits mais significativos são
implementados pelo registo TH1 e os 5 bits menos significativos pelo TL1. Neste último registo os 3 bits
mais significativos não são utilizados.
Como podemos ver na figura, os impulsos de contagem podem ter origem no oscilador interno ou no
pino exterior T1 dependendo do valor do bit T/C do registo TMOD. A entrada desses impulsos no
contador depende dos valores existentes em TR1, Gate e pino exterior INT1. Assim, se Gate=0 então o
ON/OFF do contador é controlado exclusivamente por TR1 (0=OFF, 1=ON). Se Gate=1 então a
chegada dos impulsos de contagem ao contador depende do valor de TR1 e do valor lógico aplicado ao
13
pino exterior INT1. Só existe contagem de impulsos se TR1=1 e se INT1=1. Isto permite o controlo
ON/OFF do contador a partir de um sinal exterior ao µC.
Quando se verifica o overflow do contador, é activada a flag TF1 que, como veremos mais à frente, está
ligada ao sistema de interrupções do µC.
Embora na fig. 17 esteja representado o T/C 1, tudo o que foi dito também se aplica ao T/C 0,
substituindo TL1 e TH1 por TL0 e TH0, TF1 por TF0, T1 por T0 e TR1 por TR0 e INT1 por INT0. Os
bits Gate e T/C terão que ser os correspondentes ao T/C 0 no registo TMOD.
6.3.2 Modo 1
O Modo 1 de funcionamento é igual ao Modo 0 com a única diferença de que o contador de 13 bits é
substituído por um contador de 16 bits. Neste caso todos os bits de TL1(0) estarão activos podendo então
ser efectuadas contagens entre 0000h e FFFFh. Os sinais de controlo são os mesmos apresentados no
parágrafo anterior.
6.3.3 Modo 2
O Modo 2 de funcionamento configura o T/C como um contador crescente de 8 bits (TL1) com recarga
automática, como se mostra na fig. 18.
14
O overflow do contador TL1 não só activa a flag TF1 como também provoca a recarga de TL1 com o
valor contido em TH1. Este valor, carregado em TH1 por software, não é alterado após a operação de
recarga.
6.3.4 Modo 3
A programação do T/C 1 em Modo 3 provoca simplesmente a paragem do processo de contagem.
Neste modo de programação, o contador TL0 utiliza os sinais de controlo do T/C 0: C/T, Gate, INT0,
TR0 e TF0. No que diz respeito ao contador implementado por TH0, os seus sinais de controlo são os
normalmente atribuídos ao T/C 1: TR1 e TF1. Estes sinais de controlo ficam assim indisponíveis para
serem utilizados pelo T/C 1. De notar que, neste modo de programação do T/C 0, a interrupção do T/C
1 é activada pelo overflow do contador TH0.
Este modo de funcionamento permite dotar uma aplicação com 3 temporizadores / contadores
independentes, embora fiquem diminuídas algumas funcionalidades do T/C 1. Contudo este T/C pode
ser parado não através de TR1 mas através da sua reprogramação em Modo 3, podendo ainda ser utilizado
em todas as aplicações que não necessitem de interrupções, incluindo como gerador de taxa de
transmissão para a UART como poderemos ver nos parágrafos seguintes.
7 Porto Série
O porto série que se encontra em todos os µCs da família 51 permite comunicações série síncronas e
assíncronas, utilizando para isso uma UART. No caso das comunicações assíncronas, estas podem ser
feitas em modo full-duplex. Na figura seguinte é apresentado um diagrama de blocos que descreve a
UART do µC.
15
Barramento Interno
8 8
SBUF SBUF
Registo de Transmissão Registo de Recepção
Gerador de
taxa de
8 8
transmissão
TI Shift-Register Shift-Register RI
de Transmissão de Recepção
TxD RxD
Figura 20 – Diagrama de blocos da UART
Neste diagrama de blocos podemos ver que a UART é constituída por duas zonas distintas que
correspondem à recepção de dados (à direita na figura) e à transmissão de dados (à esquerda na figura).
Estas duas zonas independentes partilham unicamente o sistema de relógio que permite gerar a taxa de
transmissão. Os dois registos SBUF, embora partilhem um endereço único na zona dos SFRs, são na
realidade implementados em hardware por registos independentes (um só de escrita e o outro só de
leitura).
Após a detecção do flanco descendente do start bit, a UART retira 16 amostras consecutivas da
linha de recepção e, a partir das amostras 7, 8 e 9, correspondentes ao meio do bit, decide por
maioria se se trata ou não de um start bit. Este processo implementa uma detecção de falsos start
bits permitindo anular ruídos que surjam na linha, desde que estes não ultrapassem o tempo de
meio bit.
Para os restantes bits que compõe a trama, o processo é idêntico. São feitas 16 amostras do bit e a
decisão sobre a leitura de um 0 ou de um 1 é feita por maioria a partir das amostras 7, 8 e 9.
Após a determinação do valor de um novo bit, este é deslocado para dentro do shift-register de recepção.
16
Logo que tenha sido recebida a trama completa, se a flag RI=0, então a nova palavra é transferida para o
registo de recepção SBUF e é activada a flag RI. Esta flag, que está ligada ao sistema de interrupções do
µC, indica a recepção de uma nova palavra. O software implementado deve ler o registo SBUF e colocar a
0 a flag RI.
No caso de ter sido recebida uma nova palavra e a flag RI se encontrar em 1, o conteúdo do shift-register
de recepção não é passado para o SBUF ficando a palavra recebida provisoriamente armazenada no
próprio shift-register. Logo que seja detectada a passagem de RI a 0 é feita a sua transferência para o
SBUF de recepção. Isto quer dizer que o sistema de recepção da UART tem capacidade para armazenar
até 2 palavras sem que haja leitura por parte do CPU, constituindo aquilo que normalmente se designa por
um duplo buffer de recepção.
SM0 e SM1 especificam o modo de funcionamento do porto série de acordo com a seguinte tabela:
SM2 Bit de recepção condicional. Nos modos 2 e 3, se SM2=1, RI só será activada se o 9º bit
recebido for igual a 1. No modo 1, se SM2=1, a flag RI só é activada se for recebido um stop bit
válido.
REN Coloca em funcionamento o hardware de recepção da UART. Deve ser escrito por software um
1 para activar a unidade de recepção da UART, deve ser escrito um 0 para a sua desactivação.
RB8 9º bit recebido nos modos 2 e 3. No modo 1, se SM2=0, RB8 contém o stop bit recebido.
RI Flag de recepção completa. Colocada em 1 por hardware no final da recepção do 8 bit em modo
0 ou durante a recepção do stop bit nos restantes modos de funcionamento. Deve ser colocada
em 0 por software.
17
7.4 Funcionamento em MODO 0
Trata-se de um modo de comunicação síncrona em que o sinal de sincronismo é emitido pelo µC quer na
transmissão quer na recepção. Neste modo de funcionamento os dados são transmitidos ou recebidos
através de RxD e o sinal de sincronismo é emitido através de TxD.
No processo de transmissão, logo que é detectada a escrita no registo SBUF a UART começa a efectuar a
transmissão dos 8 bits (primeiro o bit –sig) de acordo com o diagrama seguinte:
A recepção de uma palavra é iniciada, neste modo de funcionamento, pela condição REN=1 e RI=0.
Logo que esta condição se verifique, o µC começa a emitir o sinal de sincronismo para que o hardware
exterior comece a disponibilizar os diferentes bits que compõe a palavra. Este processo encontra-se
esquematizado no diagrama seguinte:
Trata-se de uma comunicação feita a uma taxa fixa igual a fosc/12. Isto significa que, para um µC a
funcionar com uma frequência de relógio de 12 MHz, a comunicação será efectuada a 1 Mbit/s.
Este modo de funcionamento pode ser utilizado para uma expansão dos portos do µC utilizando um
processo de conversão paralelo / série (porto de entrada) ou série / paralelo (porto de saída).
Como em qualquer um dos outros modos de funcionamento, a transmissão é iniciada quando é efectuada
uma operação de escrita no registo SBUF. A partir deste momento a UART começa a colocar em TxD o
start bit, a seguir os 8 bits de dados (primeiro o –sig) e finalmente o stop bit.
O processo de recepção é iniciado sempre que, na amostragem que é feita à linha RxD, é encontrado um
start bit válido (ver 7.2). Quando isto acontece, as amostragens seguintes de RxD colocam os diferentes
bits da trama no shift-register de recepção, terminando o processo com a activação da flag RI (caso se
encontre em 0) e a transferência da palavra lida para o SBUF de recepção.
A taxa de comunicação neste modo de funcionamento é conseguida através do T/C1 que deve ser
programado em modo 2 (auto-reload). O valor com que deve ser carregado o registo de recarga (TH1) é
calculado através da seguinte fórmula:
18
2 SMOD Fosc
Taxa _ comunicação = *
32 12 * (256 − TH 1)
Na tabela seguinte são indicadas algumas configurações possíveis para a obtenção de taxas de
comunicação normalizadas.
Timer 1
Taxa de comunicação fosc SMOD C/T Modo Valor de recarga
19200 bps 11.0592 MHz 1 0 2 FDh
9600 bps 11.0592 MHz 0 0 2 FDh
4800 bps 11.0592 MHz 0 0 2 FAh
2400 bps 11.0592 MHz 0 0 2 F4h
1200 bps 11.0592 MHz 0 0 2 E8h
Tabela 2 – Configurações para taxas de comunicação normalizadas
De notar que, tanto no modo 1 como no modo 3 de funcionamento, o T/C1 fica reservado para gerador
da taxa de comunicação, devendo ser desactivada a sua interrupção.
O 9º bit da trama pode ser utilizado para controlo de erros de comunicação, p. ex. bit de paridade, ou para
a implementação do protocolo master-slave que será estudado num dos parágrafos seguintes.
2 SMOD
Taxa _ comunicação = * Fosc
64
Na figura seguinte representa-se uma rede de µCs que poderá funcionar com um protocolo deste tipo.
19
µC
Master
µC µC µC
Slave Slave Slave
1 2 n
Num sistema deste tipo, qualquer comunicação só pode ser feita por iniciativa do sistema master. Para
isso, o µC master começa por enviar para a rede o endereço do dispositivo slave com quem quer
comunicar. Todos os slaves, que se encontram a “ouvir” a rede, recebem este endereço e só aquele a quem
o endereço diz respeito fica autorizado a estabelecer uma troca de dados com o master, ficando os
restantes à espera que seja lançado na linha um novo endereço.
Para que seja possível distinguir uma palavra de endereço de uma palavra de dados é normal utilizar o 9º
bit de dados da trama de comunicação. Desta maneira, se o 9º bit for 1 significa que a palavra contém um
endereço. Caso contrário, 9º bit igual a 0, a palavra contém dados para a comunicação entre o master e o
slave endereçado anteriormente. Em resumo, numa troca de informação entre o master e um slave, só a
primeira palavra emitida pelo master deve conter o 9º bit a 1. Todas as restantes palavras trocadas entre os
dois devem conter esse bit a 0.
Uma maneira eficiente de funcionar dentro de uma rede deste tipo é a utilização das interrupções ligadas
às UARTs dos µCs master e slave. Quer isto dizer que cada vez que uma nova palavra é enviada para a
linha, os µCs que se encontram a “ouvir” a linha serão interrompidos. É evidente que para os slaves que
não estão endereçados, a troca de mensagens entre o master e o slave endereçado não tem qualquer tipo
de interesse pelo que todas as interrupções sofridas poderiam ser evitadas.
Os µCs da família 51 dispõe de um mecanismo específico que permite resolver este problema e melhorar
o desempenho da rede onde se encontram inseridos. Este mecanismo tem a ver com a utilização do bit
SM2 existente no registo SCON. Quando a UART funciona em modo 2 ou 3 este bit, quando se encontra
activado, permite que só sejam recebidas palavras da linha série quando o 9º bit for igual a 1 e
consequentemente só será gerada uma interrupção ao CPU se isto acontecer. O processo de comunicação
na rede será o seguinte:
O master quando necessita de comunicar com um slave envia o seu endereço para a linha, com o
9º bit a 1.
Todos os slaves que devem estar à “escuta” da linha, e que tem SM2=1, são interrompidos
recebendo o endereço enviado pelo master e comparando-o com o seu próprio endereço.
O slave endereçado deve colocar o SM2=0 de maneira a conseguir receber por interrupção a
restante comunicação do master. SM2 será novamente colocado em 1 quando termina a troca de
informação.
Os slaves não endereçado devem manter o SM2=1. Desta maneira a troca de informação entre o
master e o slave endereçado não provocará interrupções no funcionamento do µC. Só quando for
20
emitido um novo endereço para a linha, no início de uma nova comunicação, é que existirá uma
nova interrupção do slave.
8 Sistema de Interrupções
O sistema base de interrupções dos µCs da família 51 é constituído por 6 fontes de interrupção, duas das
quais pertencem a um mesmo periférico (UART), e encontram-se representadas na figura seguinte.
Vector: 0003h
Vector: 000Bh
6 fontes de 5 níveis de
interrupção interrupção
Vector: 0013h
Vector: 001Bh
Vector: 0023h
Podemos ver a existência de 6 fontes de interrupção sendo as duas últimas provenientes de um mesmo
periférico que é a UART. Estas 6 fontes dão origem a 5 diferentes níveis de interrupção, correspondendo
a cada um deles um determinado vector de interrupção localizado na memória de programa.
As interrupções externas INT0 e INT1 podem ser activadas por nível ou flanco dependendo do valor dos
bits IT0 e IT1 do registo TCON. As flags que provocam a interrupção são IE0 e IE1, pertencentes
também ao registo TCON. Para o caso das interrupções externas, se estiverem activas por flanco, as flags
IE0 e IE1 são colocadas a zero pelo hardware quando é feita a chamada à rotina de serviço da interrupção.
No caso de serem activadas por nível, o sofware da rotina de serviço da interrupção é responsável pela sua
colocação a zero.
As interrupções dos T/Cs são activadas sempre que se verifique uma situação de overflow dos
contadores, através da activação das respectivas flags TF0 e TF1. Estas flag são colocadas a zero pelo
hardware sempre que é feita a chamada à rotina de interrupção.
A interrupção do porto série é gerada a partir do OU lógico das flags TI (transmissão) e RI (recepção).
Dado que qualquer uma destas flags provoca a chamada da mesma rotina de atendimento, o hardware não
faz o seu reset para permitir o reconhecimento da origem da interrupção por parte do software de serviço.
Este reset deve ser feito pelo próprio software.
21
Qualquer uma das flags acima descritas pode ser colocada a 0 ou 1 por software, com os mesmos
resultados que seriam gerados se fossem desactivadas ou activadas pelo hardware, isto é, podem ser
geradas interrupções por software ou podem ser canceladas interrupções pendentes.
Cada uma destas interrupções pode ser permitida ou inibida a partir do registo IE que se descreve no
parágrafo seguinte.
22
A rotina de serviço de uma interrupção de baixa prioridade pode ser interrompida por uma interrupção de
mais alta prioridade, mas não por uma interrupção de baixa prioridade. Uma rotina de serviço de alta
prioridade não pode ser interrompida por qualquer outra fonte de interrupção.
23
ANEXO
Estes cinco métodos podem ser utilizados para o endereçamento dos operandos FONTE.
Ex:
MOV A,R2 MOV C,bit MOV DPTR,#dado(16)
MUL AB DIV AB
Ex:
1
1.1.3 Endereçamento Indirecto por Registo
Permite o acesso à RAM interna de dados através dos registos R0 e R1 do actual banco de registos. Este
acesso também pode ser feito através do SP (Stack Pointer) com as instruções PUSH e POP.
Permite ainda o acesso à RAM externa de dados, também utilizando os registos R0 e R1.
Pode ainda ser utilizado o DPTR para o acesso à totalidade dos 64K bytes de RAM externa de dados.
Ex:
MOV A,@R0 MOV @R1,A PUSH A
MOVX A,@R0 MOVX @R1,A
MOVX A,@DPTR MOVX @DPTR,A
Ex:
MOV A,#26h
Ex:
MOVC A,@A+DPTR
MOVC A,@A+PC
2
2 Tabelas de Instruções
3
4
5
6