Você está na página 1de 92

O MICROPROCESSADOR 8085

2.1 – Pinagem e função das linhas de entrada/saida do 8085

8
0
RD
8
5 WR
A ALE

Microprocessor and Microcontrollers Page 1 of 92


1- Alimentação e Sinal de Relógio

Pinos 1 e 2 – Entradas de conneção do circuito ressonante (cristal, ou qualquer outro circuito


ressonante) gerador da frequência para a operação do microprocessador. Os restantes
componentes do oscilador estão incorporados dentro do 8085. A freqência do clock do
microprocessador deve ser metade da frequência do cristal (ou outro circuito ressonante).
Assim, para que o microprocessdor opere a 3MHz o circuito ressonante deve gerar 6 MHz.

Microprocessor and Microcontrollers Page 2 of 92


Pino 37 – Saida do sinal de clock do microprocessador. Este sinal pode ser usado para
sincronização do clock do microprocessador com o clock de dispositivos externos a ele
conectados, como por exemplo, a memória ou unidades de I/O.

Pinos 20 e 40 – Estes são pinos de entrada da limentação do microprocessador (+5 Volts no


pino 40 e no pino 20 a terra (ground).

2 – Linhas de Endereços

Pinos 12 a 19 e 21 a 28 - Estes são os pinos de saida das 16 linhas de endereços do 8085.


Com estas 16 linhas o 8085 pode endereçar até ao maximo de 64 Kbates de memória. As 8
linhas mais significativas (A8 …A15) são linhas de saida unidirecional enquanto que as
restantes 8 linhas (AD0 … AD7) são unidirecionais apenas quando usadas como parte de
barramento de endereços.

3 – Linhas de Dados

As 8 linhas do barramento de dados comparilham a saida (são multiplexadas) com as oito


linhas menos significativas (AD0 … AD7) do barramento de endereços. Portanto, a entrada
ou saida de dados é feita através dos pinos 12 a 19. Assim, estes pinos são bi-direcionais
quando usados como linha de dados.

4 – Linhas de Sinais de controle e indicação do estado do microprocessador

Este grupo inclue os seguintes sinais de controle:


Pinos 31 e 32 – são sinais de indicação por parte do microprocessador aos circuitos
de memória ou despositivos de I/O da operação de leitura e escrita
respectivamente.
Pino 34 – Este é um sinal de “status” que o microprocessador emite para indicar
que se encontra a aceder a memória (IO/M no nível lógico Low) ou a
aceder a um dispositivo de I/O (IO/M no nível High)
Pinos 29 e 33 – Estes são sinais de indicação do estado do microprocessador,
como por exemplo, se o microprocessador está na operação de
busca de instrução, leitua de dado da memória, escrita de dado na
memória, etc.
Pino 30 - ALE (Adress Latch Anable) é o sinal que o microprocessador usa para
indicar ao periférico ou a memória que o o barramento de endereços já
contém um endereço válido, isto é, o endereço já está estável.

5 – Sinais originados externamente

O 8085 possui cinco entradas (pinos 6 a 10) de pedido de interrupção por parte de
dispositivos externos . Estas entradas são:
Pino 6 - Trap: Entrada de interrupção não mascarável. Esta é a entrada de interrupção da
mais alta perioridade de todas as cinco. A interrupção aplicada a esta entrada não pode ser
bloqueada pelo programa tal como acontece com as outras entradas.
Pino 7 , 8 e 9 – RST 7.5, RST 6.5, RST 5.5 - Restart Interrupts: Estas são entradas de
interrupção vectorizadas que, quando activadas a sequência do programa é transferida para
um local específico da memória designada por local de vector de interrupção (Interrupt Vector

Microprocessor and Microcontrollers Page 3 of 92


Location). RST 7.5 tem maior prioridade que RST 6.5 e esta tem, por sua vez, maior
prioridade que RST 5.5.
Pino 10 – INTR – Interrupt request: Esta é a entrada de pedido de interrupção da mais baixa
prioridade. É usada como entrada de pedido de interrupção genérico.
Pino 35 – READY: Este é o pino de entrada de sinal vindo de despositivos periféricos que
normalmente operam a velocidades mais lentas que o microprocessador , para informar que
já está pronto para receber ou enviar um dado para o microprocessador.

Pino 39 – HOLD: Esta é a entrada de um sinal vindo de um periférico tal como o controlador
de DMA quando precisa de usar os barramentos de dados ou endereços.

Pino 36 – RESETIN: Quando esta entrada é levada ao nível lógio ‘Low” o contador de
programas é zerado, os barramentos são levados ao estado de “Alta impedância” e o
microprocesador é também zerado.

Pino 11 – INTA (Interrupt Acknoledgement): Este é um sinal de saida emitido pelo


microprocessador para indicar o reconhecimento de um pedido de interrução.

Pino 38 – HLDA (Hold Acknowledge) – É um sinal de saida emitido pelo microprocessador


para indicar o reconhecimento do pedido de HOLD.

Pino 3 – Reset Out : É um sinal de saida que indica que o microprocessador está sendo
reinicializado. Este sinal pode ser usado para re-inicializar outros dispositivos.

5 – Linhas de Entrada/Saida Serial

Pino 5 e 6 – SID (serial data input) e SOD (serial data output): Estas corresponde a entrada
serial e a saida serial respectivamente. Existem instruções especias do 8085 que permitem
aceder a estas entradas.

2.2 – TEMPORIZAÇÃO E CICLOS DE MAQUINA DO 8085

O microprocessador 8085 foi concebido para executar 74 instruções. Cada instrução é


dividida em duas partes: o codico da operação (opcode) e o operando. O opcode determina
que operação deve ser executada (ADD, MOVE, etc) e o operando é a outra informação
necessária para a instrução. Esta informação pode ser um dado, um endereço ou qualquer
outra informação necessária para a instrução.
Cada instrução é subdividida em ciclos de máquina – acessos a memória e cada ciclo de
máquina é subdividida em ciclos de “clock”.
O primeiro ciclo de máquina em cada instrução é o ciclo de busca de instrução (“Opcode
fetch”). Este é a fase em que se busca a instrução e trazida para o microprocessador via
barramento de dados. Os ciclos de máquinas subsequentes dependem de daca instrução
específica.
Os ciclos de máquina são subdivididos nos seguintes tipos:

● Busca de Opcode
● Leitura de memória
●Escrita na memória

Microprocessor and Microcontrollers Page 4 of 92


● Leitura de I/O
● Escrita na I/O
● Reconhecimento de um pedido de interrupção

O ciclo de busca de instrução


Como foi anteriormente dito, a primeira operação em cada instrução consiste na busca do
código da operação. Neste ciclo o endereço do local de memória onde o opcode da instrução
se encontra armazenada é colodo no barramento de endereços e o dado (que neste caso é o
opcode) lido para o microprocessador (mais precisamente para o registo de instruções) via
barramento de dados. O ciclo de busca de opcode é designado po M1 e normalmente
compreende 4 pulsos de clock T1 –T4. Durante T1 a T3 o endereço é colocado no
barramento e o opcode trazido para o microprocessador. T4 é usado para a descodificação e
execussão do opcode. O ciclos de máquina que se seguem depedem do que o opcode
determina. Cada instrução possui o seu número de ciclos de máquina que pode ser diferente
de qualquer outra instrução. O número de ciclos de clock (“T-states”) difere de um ciclo de
máquina de do outro. Assim, cada instrução possui numeros e tipos de ciclos de máquina
que pode ser diferente de qualquer outra instrução. Sendo assim, o número de ciclos de clock
também é , em geral, diferente para cada instrução. Deste modo, para determinar os ciclos de
máquina duma dada instrução é necessário conhecercom exactidão que instruções
elementares compoem a instrução tendo sempre em conta que a primeira instrução
elementar é a de busca de opcode. O exemplo da figura 2.3 mostra os ciclos de máquina e os
ciclos de clock envolvidos na execussão da instrução MVI B, 42H (Transferir o dado
constituido por 8 bits da memória – endereço 42H- para o registo B). Esta é uma instrução de
dois bytes. O primeiro byte é o opcode e o segundo é o dado a ser movido (copiado) para o
registo B. Supoe-se que a instrução está localizada no endereço 2000H

M1 (Opcode Fetch) M2 (Leitura d Memória)

T1 T2 T3 T4 T1 T2 T3

Ck

A15-A8 20H 20H

AD7-AD0
00H 06H 01H 24H

ALE

IO/M

RD

Fig 1.3 - Diagrama temporal do ciclo de busca de Opcode

Microprocessor and Microcontrollers Page 5 of 92


Como se pode verificar da figura acima, nos três primeiros ciclos de clock (t1 – T3) o
endereço da instrução a se buscar (2000H) é colocado no barramento de endereços e o
opcode da instrução (06H) é levado,via barramento de dados para o microprocessaddor. No
quarto pulso do clock (T4) o opcode é descodificado e executado.
O segundo ciclo de máquina da instrução compreende a operação de leitura de um dado na
memória. Trata-se do ciclo de busca do segundo byte da instrução. O endereço deste
operando encontra-se no local de memória logo a seguir ao opcode, isto é, no local 2001H. O
dado contido neste local, o operando 42H é trazido para o registo B.
Note que o sinal ALE é levado ao nível “High” no início de cada ciclo de máquina. Note
também que o sinal IO/M vai é levado ao nível “Low” no inicio da fase de busca do opcode
para indicar a operação de leitura de memória, e permanece neste estado durante o segundo
ciclo de máquina por se tratar também de um ciclo de leitura. O sinal RD também é levado ao
nível “Low” sempre que se pretenda ler um dado da memória.

O Ciclo de Leitura da Memória


O ciclo de Leitura da memória é um ciclo de máquina no qual se busca um dado da memória
para um dos registos internos do microprocessador. Para ilustrar este ciclo de máquina
consideremos a instrução LDA 2020H ( ler o dado localizado no endereço 2020H da memória
principal para o acumulador). O diagrama temporal que mostra a execussão desta instrução é
apresentado na figura 2.4.

M1 M2 M3 M4
T1 T2 T3 T4 T1 T2 T3 T1 T2 T3 T1 T2 T3
Ck

A15-A8 20H 20H 20H 20H

00H 3AH 01H 20H 02H 20H 20H Dado


AD7-AD0

ALE

IO/M

RD

Fig 1.4 - Diagrama temporal do ciclo de leitura da memória

Repre-se que para além do ciclo de busca do Opcode (M1) , esta instrução possui mais três
extra ciclos de leitura nomeadamente M2, M3 e M4. Os ciclos M2 e M3 são de busca do
endereço (um byte de cada vez) enquanto que no ciclo M4 busca-se o dado propriamente
dito. Supoe-se neste exemplo que a instrução localizada no endereço 2000H. Isto significa
que o primeiro byte da instrução, o opcode, localiza-se no endereço 2000H, e o operando (de
tipo endereço) que é constituido de dois bytes nas duas posições seguintes, isto é, 2001H e
2002H. Note-se que logo no início de ciclo M1 o sinal IO/M é levado ao nível “Low” e
pernanece neste nos três ciclos de máquina seguintes, pois estes são todos ciclos de leitura

Microprocessor and Microcontrollers Page 6 of 92


de memória. Por sua vez, o sinal RD é levado ao nível “Low”sempre que um dado está para
ser lido para o microprocessador via barramento de dados.

O Ciclo de Escrita na Memória

O ciclo de escrita da memória ocorre quando o microprocessador precisa de enviar umdado


para a memória. Por exemplo a instrução MOV M, A envia o dado do acumulador para o local
de memória cujo endereço se encontra no par de registos HL. Esta instrução é constituida de
dois ciclos maquina; o de busca de instrução e o de escrita do dado na memória. A figura 2.5
mostra o diagrama temporal da execussão desta instrução.

M1 (Opcode Fetch) M2 (Leitura d Memória)

T1 T2 T3 T4 T1 T2 T3

Ck

A15-A8 20H MSB

AD7-AD0
00H 77H L
Dado vindos do Ac

ALE

IO/M

RD

WR

Fig 1.5 - Diagrama temporal do ciclo de escrita de memória

De novo, supoe-se que a instrução se encontra no enderço 2000H da memória principal.


Note-se que esta instrução é composta de um byte apenas (o opcode) e o código da
instrução é 77H. No ciclo M2 o enderço que se encontra no par HL é colocado no barramento
de endereços e o dado armazenado no acumulador é levado para a memória.

O Ciclo de Leitura em dispositivos de I/O


O ciclo de leitura de I/O ocorre quando o microprocessador emite a instrução IN para ler um
dado vindo de um dispositivo de entrada. Esta instrução possui três ciclos de máquina,
nomeadamente, M1 para a leitura do Opcode, M2 para a leitura do endereço do dispositivo
donde se pretende buscar o dado e M3 para a leitura do dado propriamente dito no disposivo
de I/O. No totaal estes três ciclos levam “10 T-States” (pulsos de clock). A figura 2.6 mostra o
diagrama temporal da instrução

Microprocessor and Microcontrollers Page 7 of 92


IN 80H , onde 80H é o endereço do porto onde se pretende ler. Note-se que nas operações
de I/O o endereço é codificado em oito bits.

M1(Busca do opcode) M2(Leitura de mória) M3 (Leitura de I/O )


T1 T2 T3 T4 T1 T2 T3 T1 T2 T3
Ck

A15-A8 20H 20H 80H

Dado vindo
AD7-AD0 00H DBH 01H 80H 80H
de I/O

ALE

IO/M

RD

Fig 1.6 - Diagrama temporal do ciclo de Leitura de I/O

Em M1 o endereço da instrução (de novo considera-se o endereço 2000H) e colocado no


barramento de endereços para a busaca do opcode seguindo-se depois da leitura do opcode
que neste caso tem o valor DBH. No ciclo M2 o endereço do operando (posição seguinte a do
opcode) é colocado no barramento de endereços e de seguida o operando é lido para o
microprocessador. Note-se que o operando é cujo valor é 80H é o endereço do do dispositivo
de I/O que se pretende ler.
No terceiro ciclo (M3) o endereço do didpositivo a ser lido é colocado no barramento de
endereços. Recorde-se que o endereço de I/O é constituido de oito bits. Porém, na altura da
leitura de I/O estes oito bits são colocados tanto na parte alta (A15 – A8) como na paarte
baixa (AD7 – AD0) do barramento.

O Ciclo de Escrita do dispositivos de I/O

O ciclo de escrita de I/O consiste no envio de um dado do acumulador para um dispositivo I/O
especificado pelo endereço do port. A instrução OUT port tem três ciclos de máquina de
máquina nomeadamente o de busca do opcode (8 bits) , o de busca do endereço do port (8
bits) e o de envio do dado do acumulador para o despositivo externo. A figura 2.6 mostra o
diagramatemporal da instrução OUT 84H onde 84H é o endereço do port para onde o dado
se pretende enviar.

M1(Busca do opcode) M2(Leitura de mória) M3 (Escrita de I/O )


T1 T2 T3 T4 T1 T2 T3 T1 T2 T3
Ck
Microprocessor and Microcontrollers Page 8 of 92
A15-A8 20H 20H 84H

Dado indo
AD7-AD0 00H D3H 01H 84H 84H
para I/O

ALE

IO/M

RD

WR

Fig 1.7 - Diagrama temporal do ciclo de escrita de I/O

Esta instrução é composta de dois bytes, três ciclos de máquina e 10 T-States.


O codigo exadecimal desta instrução é D3H. De novo supomos que a instrução está
armazenada no endereço 2000H. Sendo assim o opcode tem o endereço 2000H enquanto
que o operando está no endereço seguinte, isto é, 2001H. Como se pode os ciclos M1 e M2
são similares aos da operação de leitura de um I/O. Em M3, o endereço do port para o qual
se pretende enviar o dado é colocado no barramento. Repare-se que, tal como no processo
de busca de dado de um port, os oito bits de endereço do port são colocados tanto na parte
alta (A15 – A8) e os mesmos oito bits são também colocados na parte baixa (AD7 – AD0) do
barramento de dados.
Após a colocação do enderço segue-se então a colocação do dado do acumulador para o
barramento de dados para ser copiado para o despositivo endereçado.

Reconhecimento de Interrupção
O ciclo de máquina de reconhecimento de um pedido de interrupção é um ciclo especial que
é usado no lugar de ciclo de busca de opcode para a instrução RST (restart). Esta ciclo
apresenta-se do mode similar ao ciclo de busca de opcode com a excepção de que neste
ciclo envia-se o sinal INTA no lugar do sinal RD e os sinais de estado IO/M, S0 e S1 estão em
1 1 1 ao inves de 0 1 1. Por outro lado este ciclo tem 6 pulsos de clock e não 4 como
acontece com o ciclo de busca de opcode.

3 - INTERFACE COM A MEMÓRIA

O microprocessador para poder executar uma determinada tarefa deve comunicar com a
memória, despositivo onde os programas que determinam a sequência de passos a serem
seguidos para a realização dessa tarefa estão armazenados. As memórias tanto podem ser
ROM onde são normalmente guardados os programas ou RAM onde onde normalmente são
armazenados temporariamente os dados resultantes dos calculos ou qualquer outro tipo de
processamento. Em certos casos os programas são também armazenados na memória RAM.

Microprocessor and Microcontrollers Page 9 of 92


Porém deve ficar claro que, devido a lolatilidade da memória RAM o programa armazenado
numa RAM pode facilmente se perder.

3.1 – Connectando o Microprocessador a RAM e ROM

Para que haja uma comunicação efectiva entre o microprocessador e as memórias é


necessária que se estabeleça uma conecção física entre as linhas de endereços , de dados e
de controle com as suas correspondentes no circuito de memória. A figura 3.1 mostra um
esquema típico de coneção entre o microprocessador 8085 e memórias.

Barramento de Endereço

Descodificador
de RAM ROM
8085 endereços

Barramento de dados

Barramento de controle

Fig 1.8 – Interligação do 8085 com a memória

Como se pode ver do esquema acima, para além dos circuitos de memória aparece também
representado no sistema um descodificador de enderços. Este descodificador seleciona qual
dos circuitos de memória irá ser selecionada, dependendo do endereço que aparece no
barramento. Na maioria dos sistemas a ROM é reservada a faixa baixa dos endereços e a
RAM a faixa superior dos endereços. Porém a determinação de que faixa específica cabe a
ROM e qual caberá a RAM depende do projecto específico do sistema de microprocessador.

3.2– O Mapeamento da Memória

Designa-se de mapeamento de memória o esquema que mostra todos os endereços


possíveis de um sistema baseado em microprocessador e a atribuição destes aos diversos
dispositivos conectados ao microprocessador. O esquema abaixo apresenta o esquema de
mapeamento de memória de um sistema baseado no microprocessador 8085.

Microprocessor and MicrocontrollersReservado Page 10 of 92


aos usuários
RAM 4000H - FFFFH
(48Kbytes)

Reservado ao
sistema 2000H - 3FFFH
8Kbytes operativo
ROM
Reservado para
8Kbytes o uso do 0000H - 1FFFH
sistema

Fig 1.9 – Esquema geral de mapeamenro de memória do 8085

Como de pode notar neste mapeamento, a faixa de endereço compreendida entre o endereço
0000H até o endereço 1FFFH é reservado aos programas do sistema. Estes incluem
aspectos como a localização dos vectores de interrupção, programas de inicialização do
sistema e outras informações do sistema. A faixa seguinte de endereços de memória ROM
está reservada a guardar o sistema operativo. Para a RAM está reservada a faixa de
endereços compreendido entre 4000H a FFFFH. Esta é a área reservada aos programas dos
usuários. Note-se que este mapeamento é apenas um exemplo. A quantidade de memória e o
mapeamento desta depende do microprocessador e do projectista. Para o microprocessador
8085 com 16 linhas de endereço temos efectivamente 216 endereços possíveis o que pre-faz
65536 (64K) locais de memória de 8 bits cada. Sendo assim a faixa total de endereços vai de
0000H a FFFFH o que equivale a 0000000000000000 binário a 1111111111111111 binário

3.2– Interligação de Circuitos de Memória com o Microprocessador

Em geral, a memória conectada a um determinado sistema baseado em microprocessador


nunca aparece toda ela num único circuito integrado. Esta situação é derivada do facto de,em
sistemas baseados em microprocessadores, quase sempre, a necessidade de se usar
diferentes tipos de memórias (RAM e ROM, por exemplo) e, por outro lado, pelo facto de que
as memórias são fabrigadas em circuitos integrados com uma determinada quantidade que,
quase sempre, não coincide com o espaço total de memória endereçáve doAD0 – A15
microprocessadorl. Por exemplo, para o microprocessador 8085 o espaço total de
endereços disponível é de 64Kytes (216 locais de 8 bits). Se esta quantidade de memória
AD0 – A13

AD0 – AD7

AD0 – A13

AD0 – AD7

AD0 – A13

AD0 – AD7

AD0 – A13

AD0 – AD7

aparecesse toda ela num único circuito, então as 16 linhas de endereços do 8085 dariam
para selecionar cada posição individual da memória sem se recorrer a mecanismos
auxiliaeres de endereçamento. Porém, como o espaço total endereçavel deve ser distribuido
por vários circuitos de memória então surge a necessidade de se fazer um planeamento
adequado de como estes circuitos devem ser conectados as linhas de endereços. Para
8085

ilustrar esta situação consideremos


0 de
1 novo o caso 2
do 8085 em que 3 se pretende conectar
com blocos de memória de 16Kytes cada (16K x 8 bits). Para endereçar cada uma das
posições de cada “chip”
16kx8de 16 Kbytes apenas 14 das
16kx8 16 linhas de16kx8
16kx8 endereços do 8085 são
necessárias. Por outro lado, 4 circuitos destes seriam necessários para cubrir todo o espaço
endereçavel
IO/M do 8085.
CSA figura 1.10 mostra
CS como poderia
CS ser implementado
CS um sistema de
endereçamento para a situação aqui descrita.

Microprocessor andDescodificador
Microcontrollers Page 11 of 92
de
Endereços

EN
A14 – A15

Fig 1.10 – Esquema geral de métodos de descodificação da memória para o 8085

Para a entrada de endedereços de cada um dos circuitos de memória chegam as 14 linhas


menos significativas ( AD0 a A13) do barramento de endereços do microprocessador. Estas
14 linhas permitem aceder 214 locais , o que equivale a 16384 bytes (16K x 8bits). A entrada
de dados de cada circuito de memória chegam as linhas de dados (AD0 a AD7) vindas do
mixcroprocessador.
As duas linhas mais significativas de endereço (A14 e A15) são conectadas a entrada do
descodificador. Este é basicamente um decoder 2 por 4 que permite que, para cada
combinação das duas linhas de entrada apenas uma das saida esteja activada (Active Low).
Assim, embora as 14 linhas de endereços conectadas a cada circuito de memória levem a
seleção simultânea de um determinado local de memória, apenas quele circuito cuja entrada
CS estiver activada (Active Low) poderá receber ou enviar dados para as linhas de dados.
Note-se que, para além das duas linhas de endereço que entram no descodificador temos
ainda a tentrada EN (anable) que recebe o sinal IO/M vindo do microprocessador. Este sinal
permite fazer com que os circuitos de memória apenas estejam abilitadas apenas quando
este sinal estiver no estado “LOW” , isto é, quando o microprocessador estiver numa
operação de escrita ou leitura sobre a memória. Quando o sinal IO/M estiver no estado “High”
todas as saidas do descodificador estarão no nível “High”, cortando deste modo a ligação
entre os circuitos de memória e o barramento de dados.
O esquema em blocos e a tabela de verdade do descodificador é apresentado na figura
abaixo.

IO/M A14 A15 S0 S1 S2 S3 A14


S0
1 x x 1 1 1 1
0 0 0 0 1 1 1 A15 S1
0 0 1 1 0 1 1 S2
Decoder 2 - 4
Microprocessor and Microcontrollers IO/M
Page 12 of 92S3
0 1 0 1 1 0 1
0 1 1 1 1 1 0

Fig. 1.11 - Esquema de descodificador de endereços

A15 A14 A13 A12 A11 A10 A9 A8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0

Para o Para cada um circuitos de memória


Descodificador 0000H – 3FFFFH 00 0000 0000 0000 – 11 1111 1111 1111 b
Faixa de endereços de cada circuito chip
00 – Chip 0
01 – Chip 1 Chip 0: 0000H – 3FFFH
10 – Chip 2 Chip 1: 4000H – 7FFFH
11 – Chip 3
Chip 2: 8000H – BFFFH
Chip 3: C000H – FFFFH
Fig. 1.12 - Esquema geral do sistema de endereçamento dos circuitos de memória da fig 1.10

3.2– Interligação de Circuitos de I/O com o Microprocessador

A interligação do microprocessador 8085 aos dipositivos de entrada/saida (I/O) pode ser feita
com o recurso a dois métodos diferentes nomeadamente: Método de mapeamento de I/O nos
endereços de memória e o método mapeamento de periféricos.

3.2.1 – Método de mapeamento de I/O nos endereços de memória

O acesso a um periférico com o método de mapeamento de I/O nos endereços de memória é


similar ao usado para aceder qualquer local de memória. Este método consiste
basicamente em usar parte do mapa de endereços de memória para fazer o
endereçamento de I/O. Com este método o acesso a um dispositivo de I/O faz-se tal como
acontece com o acesso qualquer posição de memória. Assim a leitua ou escrita de
insformação num dispositivo de I/O faz-se com as mesmas instruções de leitura ou escrita de
memória e o sinal I/O deve ser tratado tal como acontece no acesso a memória. Este
método tem a desvantagem de usar parte de endereços de memória pois deste modo
nem todo o mapa de nedereços pode ser usado para a memória. A figura 1.12 mostra o
exemplo de mapeamento
Mapa de dade I/O na gama de endereços de memória.
Memória
FFFFH

Mapa de I/O
Dispositivo 7 2FE0H – 2FFFH

Dispositivo 6 2FC0H – 2FDFH

Dispositivo 5 2FA0H – 2FBFH

Dispositivo 4 2F80H – 2F9FH


2FFFH
Dispositivo 3 2F60H – 2F7FH
I/O 2F40H – 2F5FH
Microprocessor and Microcontrollers Dispositivo 2 Page 13 of 92
2F00H
Dispositivo 1 2F20H – 2F3FH

Dispositivo 0 2F00H – 2F1FH


Fig. 1.12 – Exemplo de endereçamento de I/O no mapa de endereços de memória

No exemplo da figura acima aos despositivos de I/O está reservada a faixa de endereços de
2F00H a 2FFFH (0010 1111 0000 0000b a 0010 1111 1111 1111b). Assim o sistema não deve
usar estes endereços para as operações normais de memória. Ao invez disto, o circuito de
descodificação de I/O deverá detectar estes endereços a selecionar o dispositivo indicado.
Repare-se que a cada dispositivo está reservado não apenas um único endereço mas sim
uma faixa de endereços. Por exemplo, qualquer endereço na faixa de 2FE0H a 3FFFH (0010
1111 1110 0000 a 0011 1111 1111 1111) irá selecionar o dispositivo 7. A razão do uso de um
bloco de endereços para selecionar um dispositivo ao invés de um simples endereço tem a
ver com a redução de número de linhas de endereço necessárias para a seleção de um dado
dispositivo. Tal como se ilustra na figura abaixo.

A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0


0 0 1 0 1 1 1 1 x x x DC DC DC DC DC

Fig. 1.13 – Exemplo de distribuição de linhas de endereços no acesso de I/O atraves


do mapeamento de I/O nos endereços de memória

Neste exemplo as linhas de endereço A15 – A8 são usadas para selecionar a faixa de
endereços reservada a operações com despositivos de I/O. O valo 2FH nos bits A15 a A8
selecuiona a faixa de endereços reservados a I/O. As linhas A7 a A5 (mostrads com o siblo x)
são para a seleção de um dos oito dispositivos de I/O. As linhas A4 a A0 não são usadas para
o endereçamento de qualquer dispositivo de I/O, resultando deste modo num circuito de
decodificação de endereços mais simplificado. A figura 1.14 mostra o exemplo de um circuito
de descodificação de endereços de I/O para o caso de acesso de dispositivos de I/O através
do mapeamento de I/O nos endereços de memória

A7 A
A15 Y0 Devoce 0
A6 B
A14 Y1 Devoce 1
A5 C
A13 Y2 Devoce 2
A12 74LS30N Y3 Devoce 3
A11 Y4 Devoce 4
+5V G1
A10 Y5 Devoce 5
IO/M G2A
Y6 Devoce 6
A9 G2B
Y7 Devoce 7
A8
74LS138N

Microprocessor and Microcontrollers Page 14 of 92


Fig1.14 – Exemplo de circuito de descodificação de endereços de I/O usando
Uma faixa de endereços de memória

Na figura acima as linhas de endereço A15 – A8 são conectadas as entradas de uma porta
NAND (74LS30N). A saida da gate só irá estar activada (Nivel Lógico “LOW”) apenas
quando os oito bits mais significativo (A15 – A8) do endereço que é levado a meória
tiverem o valor 2FH (0010 1111b). O sinal a saida da porta NAND (cujo estado activo é
“LOW”) é conectado a uma das ntrads de “ANABEL” do descodificador de 3 por 8 (74LS138).
A outra entrada de “ANABLE” do descodificador (também de estado activo “LOW”) é
conectada ao sinal IO/M vindo do microprocessador. Deste modo o descodificador só
estará abilitado quando o sinal IO/M estiver no nível lógico “LOW” significando que o
microprocessador está numa operação de aceso a memória e os oitos bits mais
significativosdo endereço tiverem o valor 2FH indicando que a operação de leitura ou
escrita é dirigida ao bloco de memória reservado a despositivos de I/O, para o caso aqui
exemplificado.
As linhas de endereço A7, A6 e A5 são conectadas as três entradas de seleção do
descodificador. Desde modo, os três bits de endereço que aparecem nestas linhas irão
activar (Estado activo “LOW”) uma das saidas do descodificador, selecionado desde modo
um dos 8 despositivos de I/O.

3.2.2 - MÉTODO DE MAPEAMENTO DE PERIFÉRICOS.

No método de endereçamento de periféricos por mapeamento de periféricos a faixa de


endereços para o acesso a dispositivos de I/O está fora do mapa de endereços do
sistema de memórias. Isto significa que os dispositos de I/O têm o seu próprio mapa de
endereços que não faz parte do mapa de endereços de memórias do sistema. A figura
1.15 mostra o mapa de memórias e o mapa de I/O para um sistema que usa o metodo de
mapeamento de I/O.

Mapa de memória Mapa de I/O

FFFFH
FFH

5FH I/O 7 5CH – 5FH

5FH
I/Os 0 - 7
40H

I/O 0 40H – 43H


00H 40H

0000H

Microprocessor and Microcontrollers Page 15 of 92


Fig. 1.15 - Mapa de Memórias e Mapa de I/O para um sistema de mapeamento de I/Os

A vantagem deste método está no facto de que o mapa de endereços de memórias é usado
todo ele para o acesso a memória. Porém, neste métodos, o acesso de dispositivos de I/O
deve ser feito usando exclusivamente instruções concebidas especialmente para a
comunicação de I/o.

Quando se usa o método de mapeamento de periféricos o 8085 usa um endereço de apenas


8 bits para o acesso de I/O. Estes podem ser os oito bits menos significativos (AD0 a AD7) ou
os oito bits mais significativos ( A8 a A15). Assim, a faixa de endereços para o acesso de
dispositivos de I/O vai de 00H a FFH. Na execussão de uma instrução de entrada ou saida
(I/O) os oito bits de endereço são enviados para as oito linhas mais significativas do
barramento de endereços (A15 – A8) e, ao mesmo tempo, também para as oito linhas menos
significativas do barramento (AD7 – AD0).

Na figura acima está exemplificado um caso de acesso de 8 dispositivos de I/O usando a


faixa de endereços de 40H a 5FH ( 0100 0000 a 0101 1111) ocupando deste modo um total
de 32 endereços. Os restantes endereços estrão assim disponíveis para outros despositivos.
Para o acesso de cada um dos oito dispositivos a faixa de endereços de 40F a 5F é
subdividida em 8 subfaiaxas. Assim, a cada dispositivo está reservada uma faixa de 4
endereços. Para a seleção de cada um dos oito dispositivos será necessário um
descodificador de 3 por 8. Assim, 3 linhas de endereço (das oito disponíveis para as
operações de I/O) podem ser usadas como entrada do descodificador.
Para a seleção de todo o bloco de endereços reservado a estes 8 dispositivos (Isto é,
para a abilitação do descodificador) terá que se selecionar o conjunto de bits que se
mantém constante em toda a faixa de endereços de 40H a 5FH. A figura 1.16 mostra o
“layout” de bits das linhas de endereços durante o processo de acesso destes oito
dispositivos.

AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0

0 1 0 x x x DC DC

Fig.1.16 – Layout dos bits das linhas de endereço no acesso dos I/O
na faixa de 40H a 5FH
Como se pode observar, para a faixa de endereços de 40H a 5FH as linhas de endereços
AD7 – AD5 mantêm-se em 010. Assim, esta combinação de bits vai ser usada para a
abilitação do descodificador . Para
AD2a selecçãoA de um dispositivo específico serão então
usadas as linhas AD4 – AD2 como entradas do Y0
descodificador e asDevoce
linhas 0AD1 – AD0 “são
AD3 B
don’t cares”. Como foi mencionado na secção anterior, esta
Y1 forma de implementar
Devoce 1 o
AD4 C
mecanismo de descodifição de endereços visa simplesmente
Y2 simplificar o
Devoce 2circuito de
discodificação.
Y3
A figura 1.17 mosta a implemetação do circuito de descodificação doDevoce 3
exemplo em
consideraç`ao.
AD5 Y4 Devoce 4
IO/M G1
AD6 Y5 Devoce 5
~G2A
AD7 Y6 Devoce 6
~G2B
Y7 Devoce 7
Microprocessor and Microcontrollers Page 16 of 92
74LS138N

Fig. 1.17 – Circuito típico de descodificação por mapeamneto de I/Os para o 8085
Na figura acima , quando AD7 – AD5 são 010 o sinal a saida da porta NAND é activado
(Active LOW). O sinal a saida desta Gate é usado como entrada entrada de um dos
“Anables” do descodificador. A outra entrada de “Anable” do descodificador (G1) de tipo
“Active High” é conectada ao sinal IO/M que, quando o microprocessador está acedendo um
dispositivo de I/O é levado a nível High.
em conjunto com o sinal é usado para abilitar o descodificador. A terceira entrada de “Anable”
do descodificador é conectada permanentemente a terra. As entrada de selecção do
descodificador são conectadas as linhas de endereço do microprocessador AD2, AD3 e AD4
para a seleção de um dos oito despositivos de Entrada/Saida.

Exemplo 2 – Usar endereços de 50H a 5FH para o acesso de 4 dispositivos de I/O

50 a 5F = 0101 00 00 a 0101 11 11

2 – PROGRAMAÇÃO DO 8085

2.1 - Introdução
Como foi mencionado no capítulo anterior, o microprocessador é programado a nível de
linguagem assemby. Por se tratar de programação de baixo nível, o programador deverá
conhecer a arquitetura do microprocessador em uso para que possa fazer o uso correcto dos
registos internos do microprocessador. Este conhecimento terá que se estender até ao nível
de bits, isto é, de quanto bits são constituidos os registos e como é que os bits de um registo
podem ser individualmente manipulados. Assim, para começar a programar o 8085 teremos
que, primeiro , considerar o seu modelo de programação que, como já mencionado, trata-
se do conecimento do layout dos registos do microprocessador. A figura 2.1 mostra o
modelo de programação do 8085

Acumulador A (8 ) Registo de Estado F (8


)
B (8 ) C (8 )
D (8 ) E (8 )
H (8 ) L (8 )
Apontador da Pilha (SP) (16)
Microprocessor and Microcontrollers Page 17 of 92
Contador de programas (PC) (16)

Fig. 2.1 – Modelo de programação do 8085


Como se pode observar na figura acima, o 8085 apresenta seis registos de oito bits para
o uso geral nomeadamente, registos B, C, D, E, H e L. Para além destes a figura mostra
também outros quatro registos de uso específico nomeadamente o acumulador de (A) e o
registo de estado (Flag Regisster) ambos de oito bits e o contador de programas (PC) e o
apontador de pilha (SP) estes de 16 bits cada. Na programação é importante conhecer a
letra (em maiscula) usada como simblo de cada um dos registos porque em assembly esses
simblos são usados para se referir aos registos a que elas representam.
O Acumulado é usado em todas as operações artiméticas e lógicas. Nas suas operações, a
ALU usa quase sempre o acumulador como fonte do operando (ou um dos operandos)
da instrução. O resultado da operação levada a cabo na ALU é tamém quase sempre
guardado no acumulado.
O apontador de programas (Stack Pointer) é um registo de 16 bits que guarda o endereço do
topo da pilha, uma área de memória reservada a aplicações especias durante a execussão
de programas (O assunto de uso de pilha será considerado nos próximos capítulos).
O contador de programas é um registo de 16 bits que contém o endereço da próxima
instrução a se buscar da memória para ser executada enquanto que o registo de estado
contém informação sobre o estado do acumulador resultante da última operação lógica ou
artimética executada na ALU tal como se mostra no quadro que se segue.

D7 D6 D5 D4 D3 D2 D1 D0
S Z AC P CY

Fig. 2.2 - Formato do “Flag Register” do 8085

Cada um dos 8 bits do registo de estado indica uma determinada situação do acumulador tal
como a seguir se descreve:

● S (sign ) – Este bit é activado (é levado ao valor binário 1) se, como resultado da última
operação artimética executada na ALU o bit mais significativo do acumulador (D7) ficou com
o valor binário 1. Este bit é usado em operações artiméticas com numeros sinalizados para
indicar se o resultado é um valor negativo (S = 1) ou positivo (S=0).

● Z (Zero) – Este bit é activado quando a última operação lógica ou artimética executada na
ALU fez com que o acumulador ficasse com o valor zero.
● AC (Carry Auxiliar) – Este bit é activado quando, durante uma operação um carry (vai 1)
ocorrer entre D3 e D4 do acumulador. Este “Flag é usado internamente nas operações de
conversão para BCD, não sendo disponível para o programador.

● P (Paridade) – Este bit é activado se, como resultado da última operação lógica ou
artimética executada na ALU o acumulador ficou com um numero par de 1s.

● CY (Carry) – Este bit é activado se a operação efectudada gerou um carry (vai 1) em D7.

Microprocessor and Microcontrollers Page 18 of 92


Os “Flag”S, Z, P e CY são normalmente usados pelo programador em operações de
saltos (Jump) condicionais, chamadas a subrotinas e retorno de subrotinas ou ainda na
tomada de decisões nas operações lógicas e artiméticas.
Outro aspecto importante mostrado no modelo de programação é o alinhamento em pares
dos registos de uso geral. Cada um dos pares mostrados pode ser usado como se se
tratasse de um único registo de 16 bits para as operações que envolvem números de
16 bits. Este mecanismo é usado em quase todos os microprocessadores em que os
registos de uso geral são de 8 bits para obter registos de 16 bits (ou para obter registos de 32
bits para o caso de microprocessadore com registos de uso geral de 16 bits). Assim, para o
8085 pode se formar pares de registo BC, DE, e HL.

2.2 – Operações Típicas do 8085

2.2.1 – Operações de Transferência de Dados

As operações de transferência de dados, tal como foi visto nos capítulos anteriores,
englobam instruções que permitem a cópia de dados de um registo para outro registo,
de memória para um registo, de registo para a memória, de acumulador para um
dispositivo de I/O ou de um dispositivo de I/O para o acumulador.
No 8085 o formato de instruções de transferência de dados é:

Opcode destino, fonte

O conjunto de instruções de transferência de dados do 8085 são:

MVI R , dado (8 bits) - Levar o operando dado para o registo R


MVI M, dado (8 bits) - Levar o operando dado para o local de memória cujo endereço
se encontra no para HL.
MOV R1, R2 - Mover o conteudo do registo R2 para o registo R1.
MOV R , M - Mover o conteúdo de local de memória cujo endereço se encontra no
par HL para o registo R.
MOV M, R – Mover o conteúdo do registo R para o local de memória cujo endereço
se localiza no par HL.
LXI Rp, dado (16 bits) – Levar o operando dado (um valor de 16 bits) para o par de
registos Rp
LDA dado (16 bits) – Trazer para o acumulador o conteúdo do local de memória
apontado pelo operando dado.
LDAX Rp – Trazer para o acumulador o conteudo do local de memória cujo endereço
se encontra no par de registos Rp
LHLD dado (16 bits) – Trazer para o registo L o conteúdo do local de memória
apontado pelo operando dado e depois trazer para o registo H o
conteúdo do local de memória endereçado por dado+1 (isto é, o local logo
a seguir ao endereço dado)

STA dado (16 bits) – Levar o conteúdo do acumulador para o local de memória
apontado pelo operando dado.

STAX Rp - Levar o conteúdo do acumulador para o local de memória apontado pelo


par de registos Rp.

Microprocessor and Microcontrollers Page 19 of 92


SHLD dado (16 bits) – O conteúdo do registo L é guardado no local de memória cujo endereço
é o operando dado e o conteúdo do registo H é guardado no endereço dado+1 (isto é o local
de memória logo a seguir ao endereço dado).

XCHG – O conteúdo do par de registo HL é levado para o par DE e o conteúdo do


par DE levado para o par HL. Esta é uma operação de troca de
conteúdos destes pares de registos.
IN port (8 bits) – Buscar um dado do dispositivo de entrada cujo endereço é
operando port para o acumulador. Note-se que port é um valor de
8 bits.
OUT port (8 bits) – Guardar ao conteúdo do acumulador no didpositivo de saida cujo
endereço (de 8 bits) é o operando port.

O exemplo que se segue mostra o uso de algumas destas instruções na elaboração de um


programa em assembly de 8085.

Enunciado: Elaborar um programa que lê um dado localizado na posição 2050H da memória


para o registo B e um outro localizado na posição 2070H para o registo D. Depois envia o
dado em B para um dispositivos de saida com os endereços 80H e o dado em D para um
outro dispositivo de saida com endereço 90H.
Solução 1:

LDA 2050H - Levar do local de me mória apontado por 2050H para o acumulador
MOV B, A - Transferir do acumulador para o registo B
LDA 2070H - Levar do local de me mória apontado por 2070H para o acumulador
MOV D, A - Transferir do acumulador para o registo D
OUT 90H - Enviar o conteudo do acumulador para o despositivo de saida com endereço 90H
MOV A, B - Trazer do registo B para o acumulador
OUT 80H - Enviar o conteudo do acumulador para o despositivo de saida com endereço 80H

Repare que está tarefa poderia ser conseguida de forma muito mais simples como a seguir
se mostra.

Solução 2:

LDA 2050H - Levar do local de me mória apontado por 2050H para o acumulador
OUT 80H - Enviar o conteudo do acumulador para o despositivo de saida com endereço 80H
LDA 2070H - Levar do local de me mória apontado por 2070H para o acumulador
OUT 90H - Enviar o conteudo do acumulador para o despositivo de saida com endereço 90H

2.3 – Modos de Endereçamento


Por modos de endereçamento refere-se aos métodos de indicação do local para onde (ou
donde) um determinado dado deve ser transferido. O microprocessador 8085 apresenta 4
modos de endereçamento que a seguir passamos a consider:

1 - Endereçamento Imediato – As instruções de transferência de dados constituidas pelo


Opcode seguido de um operando de tipo dado são designadas de instruções com

Microprocessor and Microcontrollers Page 20 of 92


endereçamento imediato. Estas instruções são constituidas de 2 ou três bytes em que o
primeiro byte é o opcode e o segundo (e terceiro) o operando do tipo dado que pode ser de 8
bits ou 16 bits. Um exemplo deste tipo de endereçamento é encontrado na instrução:

MVI B, F8H

Nesta instrução o dado F8H é transferido para o registo B

2 – Endereçamento por Registo – Instruções de transferência de dados em que tanto a


fonte como o destino são registos são designadas de instruções com o modo de
endereçamento por registos. Neste tipo de endereçamento a instrução é constituida por um
único byte que por si só contem a informação sobre a tarefa a ser executada, a fonte e o
destino do(s) operando(s). Um exemplo deste tipo de endereçamento é encontrado na
instrução:
MOV B, A
Nesta instrução o conteúdo do acumulador é transferido para o registo B

3 – Endereçamento Directo - As instruções de transferência de dados constituidas pelo


Opcode seguido de um operando de tipo endereço são designadas de instruções com
Endereçamento Directo. Instruções com este tipo de endereçamento são constituidas por 3
bytes; o opcode e e 16 bits que constituem o endereço de um local de memória onde se tem
que buscar ou guardar um dado. Um exemplo deste tipo de endereçamento é encontrado na
instrução:
STA 2020H
Nesta instrução o conteudo do acumulador é levado para o local de memória endereçado
pelo operando 2020H

4 – Endereçamento Indirecto - Instruções de transferência de dados em que o endereço


do local de memória para onde (ou donde) o dado deve ser transferido se encontra
num dos pares de registos são designadas de instruções com Endereçamento Inirecto.
Estas instruções são constituidas de um único byte. Os 8 bits definem a tarefa em si a ser
executada e o par de registos que contém o endereço de um local de memória onde se tem
que buscar ou guardar um dado. Um exemplo deste tipo de endereçamento é encontrado na
instrução:

MOV M , A

Nesta instrução o conteudo do acumulador é levado para o local de memória cujo


endereçado se encontra no par HL

O entendimento dos diferentes modos de endereçamento ajuda a dominar os tipos de


instruções de transferência de dados.

2.4 – Operações Artiméticas

As instruções neste grupo realizam várias operações artiméticas tais como adição, subtração,
incremento e decremento. Na maioria das vezes um dos operandos está no acumulador e o
resultado é guardado também no acumulador. Após a operação os “Flags” do registo de
estado são activados ou desactivados de acordo com o resultado da operação.
As instruções para as operações artiméticas do 8085 são:

Microprocessor and Microcontrollers Page 21 of 92


ADD R - O conteúdo do registo R é adicionado ao conteúdo do acumulador e o
resultado é guardado no acumulador.

ADD M - O conteúdo do local de memória cujo endereço se encontra no par de


registos HL é adicionado ao conteúdo do acumulador e o resultado é
guardado no acumulador.

ADI dado (8 bits) - O operando dado (de 8 bits) é adicionado ao conteúdo do


acumulador e o resultado é guardado no acumulador.

ADC R - O conteúdo do registo R e o Carry são adicionados ao conteúdo do


acumulador e o resultado é guardado no acumulador.

ADC M - O conteúdo do local de memória cujo endereço se encontra no par de


registos HL e o Carry são adicionados ao conteúdo do acumulador e o
resultado é guardado no acumulador.

ACI dado (8 bits) - O operando dado (de 8 bits) e o carry sao adicionados ao
conteúdo do acumulador e o resultado é guardado no acumulador.

As três últimas instruções são usadas na adição com números com mais de 8 bits.

DAD Rp - O conteúdo do do par de registos Rp é adicionado ao conteúdo do par de


registos HL e o resultado guardado no par HL.

SUB R - O conteúdo do registo R é subtraido do conteúdo do acumulador e o


resultado é guardado no acumulador. (A = A – R)

SUB M - O conteúdo do local de memória cujo endereço se encontra no par de


registos HL é subtraido do conteúdo do acumulador e o resultado é
guardado no acumulador. (A = A – M)

SUI dado (8 bits) - O operando dado (de 8 bits) é subtraido do conteúdo do


acumulador e o resultado é guardado no acumulador (A = A - dado).

SBB R - O conteúdo do registo R e o Carry são subtraidos ao conteúdo do


acumulador e o resultado é guardado no acumulador (A = A –CY – M).

SBB M - O conteúdo do local de memória cujo endereço se encontra no par de


registos HL e o Carry são subtraidos conteúdo do acumulador e o
resultado é guardado no acumulador. (A = A – Cy – M)

SBI dado (8 bits) - O operando dado (de 8 bits) e o carry sao subtraidos do
conteúdo do acumulador e o resultado é guardado no acumulador
(A = A – Cy – dado).
As três últimas instruções são usadas na subtração com números com mais de 8 bits.

Microprocessor and Microcontrollers Page 22 of 92


INR R – O conteúdo do registo R é incrementado por 1.

INR M – O conteúdo da posição de memória cujo endereço se encontra no par HL é


incrementado por 1.

INX Rp - O conteúdo do par de registos Rp é incrementadr por 1.

DCR R – O conteúdo do registo R é decrementado por 1.

DCR M – O conteúdo da posição de memória cujo endereço se encontra no par HL


é decrementado por 1.
DCX Rp - O conteúdo do par de registos Rp é decrementado por 1.
DAA – O número binário de 8 bits que se encontra no acumulador é ajustado para formar 2
digitos BCD de 4 bits cada.

O exemplo que se segue mostra o uso de alugumas destas instruções na elaboração de um


programa em assembly de 8085.

Exemplo1 :Elaborar um programa que adiciona os conteúdo das posições de memória cujos
endereços são 2020H e 2021H e guarda o resultado na posição 2022H

([ 2022] [2020h] + [2021H])

e depois subtrai o conteúdo da posição 2021H do conteúdo da posição 2020H e guarda a


diferença na posição 2023H

([ 2023] [2021h] - [2020H]).

Solução 1:
LDA 2020H - Carregar para o camulador o conteudo do local de memória cujo endereço é 2020H
MOV B, A - Guardar (temporariamente) o conteudo do acumulador no registo B
LDA 2021H - Carregar para o camulador o conteudo do local de memória cujo endereço é 2021H
MOV C, A - Guardar (temporariamente) o conteudo do acumulador no registo C
ADD B - Adicionar o conteudo do acumulador com o conteudo do registo B. O resultado fica no Acc
SAT 2022H - O conteudo do acumulado é guardado no loacl de memória apontado pelo endereço 2022H
MOV A, B - Retornar para o acumulador o dado guardado no registo B
SUB C - Subtrair o conteudo do acumulador do o conteudo do registo C. O resultado fica no Acc
STA 2023H - O conteudo do acumulado é guardado no loacl de memória apontado pelo endereço 2023H

Solução 2:

LXI H, 2020H - Levar o operando 2020H (endereço do segundo operando) para o par HL
LDA 2021H - Carregar para o camulador o conteudo do local de memória cujo endereço é 2021H
ADC M - Somar o conteudo do acumulador com o apontado por HL
STA 2022H - O conteudo do acumulado é guardado no loacl de memória apontado pelo endereço 2022H
LDA 2021H - Carregar para o camulador o conteudo do local de memória cujo endereço é 2021H
SUB M - (A = A – M)
STA 2023H - O conteudo do acumulado é guardado no loacl de memória apontado pelo endereço 2023H
Microprocessor and Microcontrollers Page 23 of 92
2.5 – Operações Lógicas
As instruções das operações lógicas do 8085 realizam os operadores AND, OR, XOR, NOT e
operações de rotação. Tal como nas operações artiméticas, o acumulador é usado como
fonte do operando (ou um dos operandos) e o resultado é retornado para o acumulador. No
8085 as instruções para as operações lógicas são:

ANA R - Realiza a operação AND entre o conteúdo do Acumulador com o conteúdo


do registo R. O resultado é retornado para o acumulador.

ANA M - Realiza a operação AND entre o conteúdo do acumulador com o


conteúdo do local de memória apontado pelo par HL. O resultado é retornado para o
acumulador.

ANI dado (8 bits) – Realiza a operação AND entre o conteúdo do acumulador com
o operando dado. O resultado é retornado para o acumulador.

ORA R - Realiza a operação OR entre o conteúdo do Acumulador com o conteúdo


do registo R. O resultado é retornado para o acumulador.

ORA M - Realiza a operação OR entre o conteúdo do acumulador com o


conteúdo do local de memória apontado pelo par HL. O resultado é
retornado para o acumulador.

ORI dado (8 bits) – Realiza a operação OR entre o conteúdo do acumulador com


o operando dado. O resultado é retornado para o acumulador.

XRA R - Realiza a operação XOR entre o conteúdo do Acumulador com o conteúdo


do registo R. O resultado é retornado para o acumulador.

XRA M - Realiza a operação XOR entre o conteúdo do acumulador com o


conteúdo do local de memória apontado pelo par HL. O resultado é
retornado para o acumulador.

XRI dado (8 bits) – Realiza a operação OR entre o conteúdo do acumulador com


o operando dado. O resultado é retornado para o acumulador.

CMP R – O conteúdo do registo R é comparado com o conteúdo do acumuador. O

Microprocessor and Microcontrollers Page 24 of 92


conteúdo do acumulador não é alterado. Os bits do registo de Flags são
activados (ou desactivados) de acordo com o resultado da comparação.
O “Flag” Z é activado se (A) = (R). O “Flag” CY é activado se (A) < (B).
Se (A) > (B) ambos os “Flags” Z e CY são desactivados.

CMP M – O conteúdo do local de memória apontado pelo par de registos HL é


comparado com o conteúdo do acumuador. O conteúdo do acumulador
não é alterado. Os bits do registo de Flags são activados (ou desactivados)
de acordo com o resultado da comparação. O “Flag” Z é activado se
(A) = (HL). O “Flag” CY é activado se (A) <(HL). Se (A) > (HL) ambos
os “Flags” Z e CY são desactivados.

CPI dado (8 bits) - O conteúdo do acumuado é comparado com o operando dado. O


conteúdo do acumulador não é alterado.
O “Flag” Z é activado se (A) = dado. O “Flag” CY é activado se (A) < dado.
Se (A) > dado ambos os “Flags” Z e CY são desactivados.

RLC – O conteúdo do acumulador é sujeito a uma rotação para a esquerda em uma posição.
O bit mais significativo passa para o local do Carry e para a posição do bit menos
significativo. A figura 2.3 ilustra esta operação.

CY Acumulador

Fig. 2.3 – Instrução RLC

RRC - O conteúdo do acumulador é sujeito a uma rotação para a direita em uma posição. O
bit menos significativo passa para o local do Carry e para a posição do bit mais significativo. A
figura 2.4 ilustra esta operação.

Acumulador

CY
Fig. 2.4 – Instrução RRC

RAL – O conteúdo do acumulador é sujeito a uma rotação para a esquerda em uma posição
passando pelo “Flag”. O bits do Carry passa para a posição do bit menos significativo e o bit
mais significativo passa para a posiçao do Carry. A figura 2.5 ilustra esta operação.

Acumulador

CY
Fig. 2.5 – Instrução RAL

Microprocessor and Microcontrollers Page 25 of 92


RAR – O conteúdo do acumulador é sujeito a uma rotação para a direita em uma posição
passando pelo “Flag”. O bits do Carry passa para a posição do bit mais significativo e o bit
menos significativo passa para a posiçao do Carry. A figura 2.6 ilustra esta operação.

CY Acumulador

Fig. 2.6 – Instrução RAR

CMA – O conteúdo do acumulador é complementado


CMC – O Carry é complementado
STC – O Carry é activado

O exemplo que se segue mostra o uso de alugumas destas instruções na elaboração de um


programa em assembly de 8085.

Elaborar um programa que lê um dado duma porta de entrada com endereço 85H e salva no
endereço 201F da memória. Depos faz uma rotação em uma posição a esquerda dos bits do
dado lido, aplica uma operação de AND do valor que foi submetido a rotação com o valor 55H
e guarda o resultado na posição 2020H da memória.

Solução :
IN 85H - Ler o dado do port (endereço 85H) para o acumulador
STA 201FH - Guardar o dado na memória (endereço 201fH)
RLC - Um “shift” a esquerda do conteúdo do acumulador
ANI 55H - Operação AND entre o conteúdo do acumulador e o dado 55H
STA 2020H - Guardar o conteúdo do acumulador na memória (endereço 2020H)

2.6 – Operações de Salto


As Operações de Salto ou desvio são usadas para efectuar desvios condicionais ou
incondicionais da sequência do programa, chamadas e retornos de subrotinas, e
reinicializações.
Os saltos condicionais baseiam-se na análise do estado dos “flags” Z, CY, P ou S. No 8085
as instruções para as operações de salto são:

JMP endereço (16 bits) – A sequência do programa é transferida para a instrução


localizada no endereço indicado. Neste caso trata-se de um salto incondicional

JC endereço (16 bits) - A sequência do programa é transferida para a instrução localizada


no endereço indicado se o “flag” do Carry estiver activado.

JNC endereço (16 bits)- A sequência do programa é transferida para a instrução localizada
no endereço indicado se o “flag” do Carry não estiver activado.

Microprocessor and Microcontrollers Page 26 of 92


JZ endereço (16 bits)- A sequência do programa é transferida para a instrução localizada no
endereço indicado se o “flag” Z estiver activado.

JNZ endereço (16 bits)- A sequência do programa é transferida para a instrução localizada
no endereço indicado se o “flag” Z não estiver activado.

JP endereço (16 bits)- A sequência do programa é transferida para a instrução localizada no


endereço indicado se o “flag” S não estiver activado que é a indicação de um sinal positivo
ou não negativo.

JM endereço (16 bits)- A sequência do programa é transferida para a instrução localizada no


endereço indicado se o “flag” S estiver activado que é a indicação de um sinal negativo.

JPE endereço (16 bits)- A sequência do programa é transferida para a instrução localizada
no endereço indicado se o “flag” P estiver activado que é a indicação de uma paridade par.

JPO endereço (16 bits)- A sequência do programa é transferida para a instrução localizada
no endereço indicado se o “flag” P não estiver activado que é a indicação de uma paridade
impar.

CALL endereço (16 bits)- A sequência do programa é transferida para a instrução localizada
no endereço indicado e o endereço da instrução logo a seguir a CALL é levada para o topo da
pilha.
CZ endereço (16 bits)- Se o “flag” Z estiver activado a sequência do programa é transferida
para a instrução localizada no endereço indicado e o endereço da instrução a logo a seguir a
CZ é levada para o topo da pilha.

CNZ endereço (16 bits)- Se o “flag” Z não estiver activado a sequência do programa é
transferida para a instrução localizada no endereço indicado e o endereço da instrução a logo
a seguir a CZ é levada para o topo da pilha.

CC endereço (16 bits)- Se o “flag” CY estiver activado a sequência do programa é transferida


para a instrução localizada no endereço indicado e o endereço da instrução a logo a seguir a
CC é levada para o topo da pilha.

CNC endereço (16 bits)- Se o “flag” CY não estiver activado a sequência do programa é
transferido para a instrução localizada no endereço indicado e o endereço da instrução a logo
a seguir a CNC é levada para o topo da pilha.

CP endereço (16 bits)- Se o “flag” S não estiver activado a sequência do programa é


transferida para a instrução localizada no endereço indicado e o endereço da instrução a logo
a seguir a CP é levada para o topo da pilha.

CM endereço (16 bits)- Se o “flag” S estiver activado a sequência do programa é transferida


para a instrução localizada no endereço indicado e o endereço da instrução a logo a seguir a
CM é levada para o topo da pilha.

CPO endereço (16 bits)- Se o “flag” P não estiver activado (paridade impar) a sequência do
programa é transferida para a instrução localizada no endereço indicado e o endereço da
instrução a logo a seguir a CPO é levada para o topo da pilha.

Microprocessor and Microcontrollers Page 27 of 92


CPE endereço (16 bits)- Se o “flag” P estiver activado (paridade par) a sequência do
programa é transferida para a instrução localizada no endereço indicado e o endereço da
instrução a logo a seguir a CPE é levada para o topo da pilha.

RET - A sequência do programa é transferida para o endereço que se encontra no topo da


pilha.

RZ - A sequência do programa é transferido para o endereço que se encontra no topo da


pilha se o “flag” Z estiver activado.

RNZ - A sequência do programa é transferido para o endereço que se encontra no topo da


pilha se o “flag” Z não estiver activado.

RC - A sequência do programa é transferido para o endereço que se encontra no topo da


pilha se o “flag” CY estiver activado.

RNC - A sequência do programa é transferido para o endereço que se encontra no topo da


pilha se o “flag” CY não estiver activado.

RP - A sequência do programa é transferido para o endereço que se encontra no topo da


pilha se o “flag” S não estiver activado.

RM - A sequência do programa é transferido para o endereço que se encontra no topo da


pilha se o “flag” S estiver activado.

RPO - A sequência do programa é transferido para o endereço que se encontra no topo da


pilha se o “flag” P não estiver activado (paridade impar).

RPE - A sequência do programa é transferido para o endereço que se encontra no topo da


pilha se o “flag” P estiver activado (paridade par).

RST n (onde n = 0 a 7) - A sequência do programa é transferido para um dos oito locais fixos
de memórias situados entre os endereços 0000H a 0038H. Estas instruções são usadas em
conjunto com as interrupções. O endereço logo a seguir a instrução RST é guardado no topo
da pilha.

PCHL – O conteúdo do par de registos HL é levado para o registo contador de programas


(PC).

O exemplo que se segue mostra o uso de alugumas destas instruções na elaboração de um


programa em assembly de 8085.

Escrever um programa que lê continuamenteb o conteudo de um dispositivo de entrada com


endereço 80H e faz o teste do bit 0 do dado lido. A leitura do dispositivo só termina se se
constatar que o bit 0 está activado. Neste caso a execussão do programa deve prosseguir no
Solução14040H.
endereço :

Incio: IN 80H - Ler o dado do port (endereço 80H) para o acumulador . Inicio é um Lable

ANI 01H
Microprocessor and -Microcontrollers
Operação AND entre o conteudo do acumulador e o28
Page operando
of 92 01H
JZ inicio - Saltar para a instrução com o lable inicio se o flag Z estiver activado
(significando que o bit zero continua desactivado)
JMP 4040H - Salto incondicional para para o endereço 4040H
Solução2 :

Incio: IN 80H - Ler o dado do port (endereço 80H) para o acumulador . Inicio é um Lable

ANI 01H - Operação AND entre o conteudo do acumulador e o operando 01H


JNZ 4040H - Se o “flag” Z não estiver activado (significando que o bit 0 estava activado)
saltar para o endereço 4040H
JMP inicio - Saltar para a instrução com o lable inicio

Solução3 :

Incio: IN 80H - Ler o dado do port (endereço 80H) para o acumulador . Inicio é um Lable
CMA - Complementar o acumulador – veja OBS 1
ANI 01H - Operação AND entre o conteudo do acumulador e o operando 01H
JZ 4040H - Se o “flag” Z for activado (significando que o bit 0 estava activado)
saltar para o endereço 4040H
JMP inicio - Saltar para a instrução com o lable inicio - veja OBS 2

OBS 1: Se o bit 0 tiver sido activado depois desta instrução seria complementado passando
para 0 e efectuando a operação AND do acumulador com o valor 01H teriamos o valor zero
no acumulador. Se o bit zero estivesse desactivado, depois da operação de complemento
passava a ser 1 e a operação AND com o operando 01H deixaria o acumulador com um valor
diferente de zeo. Este método de complementar , aplicar a operação AND para depois testar
para ver se é o acumulador ficou com o valor zero é um método comumente usado para
testar um bit para ver se está activado ou não.
OBS 2: Se o programa tiver que ser introduzido a manualmente então não poderiamos usar o
lable. Neste caso teriamos que usar o endereço da instrução LDA 3000H que é para onde se
deve saltar. Porém, quando se usa o assembler, pode se usar Lables pois o assembler irá
converter inserir o endereço correspondente a instrução indicada pelo Lable.

2.7 – Operações de controle da máquina

Microprocessor and Microcontrollers Page 29 of 92


As operações de controle da máquina engloba instruções para o controlo da pilha, abilitação
e desabilitação de interrupções, controlo das operações de Entrada/Saida serial, não
operação e pausa.
No 8085 as instruções para as operações de controle da máquina são:

PUSH Rp – O conteudo do par de registos Rp são levados para o topo da pilha. Primeiro a
ser levado é o conteudo do registo do bytes mais significativo.

PUSH PSW – O conteudo do acumulador é levado primeiro para o topo da pilha e, de


seguida, o conteúdo do registo de estado é levado também para a pilha.

POP Rp – O conteudo do topo da pilha é colocado no registo do byte menos significativo ( C,


E, L) do par RP e o byte seguinte da pilha é levado para o registo do byte mais significativo
(B, D, H) do par Rp

POR PSW – O conteudo do topo da pilha é levado para o registo de estado e o byte seguinte
da pilha é levado para o Acumulador.

XTHL – O conteúdo do topo da pilha é trocado com o conteúdo do registo L, de seguida o


conteúdo do byte seguinte da pilha é trocado com o conteúdo do registo H.

SPHL – O conteúdo do para HL é copiado no apontador da pilha (SP).

EI – O Flip-Flop do “Interrupt anable” é activado e todas as entradas de pedido de interrupção


são abilitadas.

DI - O Flip-Flop do “Interrupt anable” é desactivado e todas as entradas de pedido de


interrupção, com a excepção da entrada TRAP são desabilitadas.

HLT – O processador é levado ao estado de pausa.

NOP – O processador não executa nenhuma operação (útil).

RIM – Esta instrução executa várias acções: Lê o estado das interruções (abilidado ou
desabilitado) o estado das entradas de pedidos de interrupção, e a entrada serial de dados
(veja figura 2.7).

SID I 7.5 I 6.5 I 5.5 IE M 7.5 M 6.5 M 5.5

Pedidos de Interrupt Mask


Bit do dado interrupção em Flag do (Activado se bit = 1)
de entrada estado de espera “Interrupt
serial (se o bit estiver Enable”
activado)
Fig. 2.7 – Estado do Acumulador Depois da instrução RIM

Microprocessor and Microcontrollers Page 30 of 92


SIM - Esta instrução também executa várias acções: Ela activa “Interrupt mask” para RST 7.5,
6.5 e 5.4, desactiva o flip-flop de RST 7.5 e activa a saida serial de dados. O acumulador é
configurado antes desta instrução de acordo com a figura 2.8.

SOD SDE xxx R 7.5 MSE M 7.5 M 6.5 M 5.5

Seria Interrupt Mask


Bit do dado Data Mask (Activado se bit = 1)
de saida Enable Enable
serial 1 = Enable

Desactivar o
flip-flop de
RST 7.5

Fig. 2.8 – Configuração do Acumulador para a instrução SIM

2.8 – Loops
O loop é uma técnica muito frequentemente usada na programação que consiste e repetir
uma sequência de instruções convista a efectuar uma mesma tarefa várias vezes.
Determinados tipos de tarefas requerem um loop contínuo enquanto que outros requerem
loops condicionais.
O loop contínuoInicioé normalmente usado em sistemas em que se requere uma leitura
contínua (scanning) de sinais de entradas convista a tomada de uma determinada decisão.
Um exemplo deste tipo é um sistema de segurança duma instalação no qual as portas e
janelas são contiuamente verificada para se determinar se ocorreu ou não uma intrusão.
Inicio
O loop condicional é aplicado em processos nos quais um conjunto de passos deve ser
repetido Ler
enquanto uma dada condição for verdadeira.
as entradas

Ler as entradas

Se o sistema estiver
abilitado e se ocorreu
alguma intrusão registar a
ocorrência Sensor de sim
incendio
activado?

não Activar os meios de


Se o sitema estiver abilitado e
se ocorreu alguma intrusão combate aos
Registar o estado incendios
emitir o(s) respectivos
dos restantes
alarme(s)
sensores

Microprocessor and Microcontrollers Page 31 of 92


Emitir alarmes dos
sensores que estiverem
activados
Fig.3.1 –a: Fluxograma de loop
contínuo
Fig.3.1 –a: Fluxograma de loop
condicional

No 8085 o loop contínuo é implementado com o uso da instrução JMP enquanto que o loop
condicional é implementado com o uso de uma das instruções de salto condicional nas quais
a condição de um dos flags do registo é testado para se determinar se o salto deverá ocorrer
ou não.

Implementação de contadores

Uma das aplicações mais frequentes dos loops na programação em asembly é a contagem
de ocorrências de um determinado evento. A forma mais comum de implemetar um
mecanismo de contagem é carregar num registo ou par de registos com um determinado
valor e, usando uma instrução de salto condicional, decrementar o contado de cada vez que
o evento ocorre. Este método funciona se, a prior, sermos capazes de determinar quantas
vezes o evento poderá ocorrer. Este método pode também ser usado se se preteder executar
uma determinada acção de cada vez que um determinado evento ocorre.
Se o número de vezes em que um determinado evento pode ocorrer não poder ser
Inicio então a solução é usar um registo ou par de registos para,
determinado logo a partida
partindo de zero, ir incrementando por 1 de cada vez que o evento ocorre.
O fluxograma da figura 3.3 mostra o esquema geral de implementação de um contador
Inicializar o contador
quando o número de vezes em em que um determinado rá ocorrer é conhecido com
antecedência.
Executar a tarefa
O programa em Assembly para este
. fluxograma é:
Decrementar
MVI contador, valor inicial
contador
Inicio: Instrução1
Não Instrução 2
-------------
Microprocessor and Microcontrollers
contador =0 Instrução n Page 32 of 92
DCR contador
Sim JNZ inicio
RET
Retornar
Exemplo: Elaborar um programa que transfere 100 (1000) bytes da memória, começando do
endereço 3400H para um despositivo de saida com endereço 7FH. Suponha que o
despositivo pode receber os dados na mesma velocidade de operação do µP.

Inicio

O programa em Assembly Inicialização do Registo D para servir de


Inicializar o contador cotador
para este fluxograma é:

Ler o dado da memória MVI D, 64H


LXI H, 3400H
Inicio loop: MOV A, M Inicialização do Par HLcom o endereço de
Enviar o dado para o despositivo OUT 7FH inicio do local onde se vão buscar os dados

DCR D
Decrementar o contador
INX H
Inicializar BC
JNZ loop
Não HLT
LerAcumulador =0
o dado da memória

Sim
Enviar para o despositivo
Fim

Fig. 3.4 – Exemplo de implementação de contador


Decrementar BC
Para o caso de transferência de 1000 bytes será necessário usar um par de registos para a
implementação do contador tal comoO abaixo
programase mostra.
em Assembly para este fluxograma é:
Copiar B no acumulador
LXI B, 03E8H Inicializar contador (Par BC)
LXI H, 3040H Carregar o endereço inicial no par HL
OR A com C Loop: MOV A, M
OUT 7FH
INX H incrementar endereço
Não DCX B decrementar contador
Acumulador = 0 MOV A, B
Microprocessor and Microcontrollers OR C Page 33 of 92
testar se o contador já é zero
JNZ Loop
RET
Fim
Fig. 3.3 – Exemplo de implementação de
contador usando um par de registos

Como se pode notar, no início o par BC é carregado com o valor 03E8H (1000 decimal)
servindo deste modo como um contador. Em cada ciclo do loop o contador é decrementado e
o processo termina quando o contador ficar com o valor zero. O método usado para verificar
se o conteudo do par BC é através da aplicação do operador OR sobre os registos C (que
inicialmente é copiado para o acumulador) e B. De facto, este operador só vai gerar um
resultado zero se ambos os registos ficarem com o valor zero.

Implementação de “Delays”

Um dos usos mais communs do loop condicional é na criação de rotinas ou programas para
gerar “delays” (retardos). O fluxograma abaixo mostra um rotina que cria um retardo cuja
duração é determinada pelo número de vezes em que as instruções dentro do loop serão
repetidas. Como se pode observar neste fluxograma, para a criação de um delay é
normalmente usada a instrução NOP (no Operation) dentro do loop. Esta instrução apresenta
4 ciclos de máquina. O delay conseguido em cada ciclo do loop será a soma do tempo de
execussão da instrução (ou instruções ) NOP com o tempo de execussão da instrução de
salto condicional . Note-se que o salto condicional requere duas instruções nomeadamente a
de decremento do contador (Neste caso DCR que tem 4 T - states) e a de salto propriamente
dito(JNZ que apresenta 10 periodos de clock se o salto ocorrer e 7 periodos de clock se o
salto não ocorrer). Assim, o delay obtido em cada ciclo será dado por:

DelayNOP + DelayDCR + DelayJNZ≠0

O Delay total será portanto dado por :

(N-1)
(N-1)* *(n(nx xDD
NOP + DDCR + DJNZ ≠0)
NOP + DDCR + DJNZ ≠0) + (n x DNOP + DDCR + DJNZ=0)

Microprocessor and Microcontrollers Page 34 of 92


Esta componente pode se despresar

Onde N é o número total de loops e n é o número de instruções NOP dentro do loop.

Neste exercicio o valor FFH (255 em decimal) é carregado no registo B , que é usado como
contador, e de cada que o loop é executado, este valor é decrementado em uma unidade.

Inicio O programa em Assembly


para este fluxograma é:

Inicializar o MVI B, FFH


contador Inicio: NOP

DCR B
NOOP
JNZ inicio
RET
Decrementar o
contador
Não O Delay total é dada por:
Contador = 0
254x(DNOP + DDCR + DJNZ ≠0) +
Sim (DNOP + DDCR + DJNZ=0)

Retornar

Fig. 3.2 – Uso do Loop condicional


Inicio na
implementação de “Delays”

Inicializar o registo B para o


Supondo que o microprocessador
loop externo opera com um clock de 2MHz teriamos:

T = 1/f = 1/2MHz = 0.5μs


Inicializar o registo C para
Dt = 254 x ( 4 x 0.5 +o4loop
x 0.5 + 10 x 0.5) + 4 x 0.5 + 4 x 0.5 + 7 x 0.5 = 2424μs
interno

9.5
2794
Decrementar C

Para a obtenção de Delays mais longos podem se usar loops aninhados tal como se ilustra
Nãoda figura que se segue.
no exemplo
C=0?

O programa em Assembly
Decrementar B para este fluxograma é:

MVI B, FFH
Não Loopext: MVI C FFH
B=0? Loopint : MOV A, L
Microprocessor and Microcontrollers DCR CPage 35 of 92
JNZ Loop_int
DCR B
JNZ Loop_ext
fim
Inicio

Carregar o endereço de inicio do bloco de


No exemplo acima, o registo C é usado como contador do loop exterior enquanto que o
origem dos dados para o par HL
registo B é usado como contador do loop exterior. Assim, para cada iteração do loop exterior
o loop interior é executado n vezes onde n é o valor carregado inicialmente no contador do
Carregar o endereço de inicio do bloco de
loop interior. destino
Deste modo, o delay total é dado pelo delay do loop interior multiplicado por m,
dos dados para o par BC
onde m é o valor carregado no loop exterior. Para aumentar mais o delay instruções NOP
podem ser inseridos tanto no loop interior como no loop exterior ou em ambos.
Carregar o valor 64H no registo D
Indexação
Indexação é uma técnica que consiste em usar um par de registos contendo endereço inicial
Buscar o dado apontado por HL para o Acc
de um bloco de memória e ir incrementando o conteúdo por 1 para aceder (para leitura ou
escrita) sucessivamente locais consecutivos desse bloco de memória. O exercício que se
segue mostra o uso do método de indexação.
Guardar o conteudo do Acc. No local de
memória apontado BC

Exercício: Elaborar um programa que permite mover um bloco de 100 bytes de dados
armazenados em locais consecutivos
Incrementar HL por 1de memória , partindo do endereço 2020H, para um
outro bloco de 100 bytes que começa com o endereço 3020H

Incrementar BC por 1

Decrementar D por 1

Não
D=0?
Microprocessor and Microcontrollers Page 36 of 92
Sim

fim
O programa em Assembly
para este fluxograma é:

LXI H, 2020H
LXI B, 3020H
MVI D, 64H
Loop: MOV A, M
STAX B
INX H
INX B
DCR D
JNZ loop
HLT

Fig. 3.5 – Exemplo de uso da técnica de indexação para a transferência de um


bloco de dados.

Neste programa o par de registos HL é inicialmente carregado com o endereço inicial do


bloco de 100 bytes de memória de onde se pretende transferir os dados, o par BC é
carregado com o endereço inicial do bloco de 100 bytes para onde os dados serão
transferidos e o registo D é carregado com o valor 64H para servir de contador.
Dentro do loop o local de memória apontado pelo par HL é lido e trazido para o acumulador e,
de seguida, o dado no acumulador é transferido para o local de memória apontado pelo par
BC. Depois estes registos são incrementados enquanto que o registo D é decrementado. O
loop é repetido até que o valor no regidto D se torne zero indicando que todos os 100 bytes já
foram transferidos. Repare que o registo D é usado como contador porque é muito mais fácil
testar para verifivar se D já contém o valor zero (como consequeência dos decrementos
consecutivos) do que verificar se o par HL já atingiu o valor endereço inicial + 99.

A Pilha (Stack)

A pilha é um bloco de memória que é configurado para ser usado principalmente para o
armazenar temporariamente informação referente ao estado do microprocessador logo antes

Microprocessor and Microcontrollers Page 37 of 92


de uma chamada a uma subrotina. O acesso a pilha é conseguida atraves das instruções
PUSH e POP. O microprocessador também acede a pilha atomaticamente sempre que se faz
a chamada a ou quando se retorna de subprograma. A pilha funciona no modo “Push-down”
visto que o último dado levado a pilha irá ser colocado no topo da pilha. No acesso da pilha
para a operação de leitura, o último dado introduzido será sempre o primeiro a ser lido. Isto
significa que a pilha funciona no sistema d LIFO. O bloco reservado a pilha é determinado
carrengado o endereço do início do bloco no registo SP através da instrução LXI SP. Depois,
quando um dado é colocado na pilha, o apontador de pilha é primeiro decrementado e, deste
modo, o dado é colocado no endereço (SP) -1. Note-se que a pilha cresce no sentido inverso
do crescimento do endereço, isto é, cada novo dado que é introduzido na pilha vai ocupar a
posição imediadamente inferior a última posição ocupada. Deste modo, a pilha nunca pode
sair fora do mapa de endereços do microprocessador.
Um outro aspecto a ter em conta é que embora, tal como toda a memória conectada ao 8085,
seja organizada em bytes (8 bits) as instruções PUSH e POP lidam com pares de registos,
isto é, lida com dados de 8 bits. Assim, na execussão destas instruções duas idas a memória
são levadas a cabo para para a busca ou o armazenamento dos dois bytes do dado.
A figura 3.5 mostra o mecanismo de implementação de uma pilha.

Conteúdo dos registos Pilha


A F
B 45 D9 C 22FD
D E 22FE
H L 22FF
SP 2300 2300 SP

Inicializaçãop da pilha e dos registos internos:

LXI SP, 2300H ; inicializar o stack pointer com o endereço 2300H


LXI B, 42D9H ; careggar o par BC com o valor 42D9H (42 para o registo B e
D9 para o registo C)

Transferência do dado para a pilha:

PUSH B ; Guardar o conteudo do par BC na pilha (Primeiro guarda-se o


conteudo de B e depois o conteúdo de C)

Microprocessor and Microcontrollers Page 38 of 92


Conteúdo dos registos Pilha
A F
B 45 D9 C 22FD
D E 22FE SP
D9
H L 42 22FF
SP 2300 X 2300

Transferência do dado da pilha para o par de registos:

POP B ; Busca o conteudo da pilha (o conteúdo das duas “ultimas posições


da pilha) para o par BC

Conteúdo dos registos Pilha


A F
B 45 D9 C 22FD
D E D9 22FE
H L 42 22FF
SP 2300 X 2300 SP

Fig. 3.6 – Comportamento da pilha nas fazes de inicialização, escrita e leitura

No primeiro caso temos o exemplo de definição da pilha. Neste caso a pilha começa no
endereço 2300H. Neste exemplo temos ainda a inicialização do par de registos BC com o
valor 45D9H. Neste momento a pilha ainda se encontra vazia.
No segundo caso o conteúdo do par BC é levado para a pilha através da instrução PUSH BC.
Repare que na execussão desta instrução primeiro o endereço no apontador de pilha (SP) é
decrementado e o conteúdo do registo B que constitui o byte mais significativo é levado para
a pilha, depois o SP é decrementado de novo e o conteúdo do registo C que constitui o byte
menos significativo é levado para a pilha. Deste modo o byte mais significativo do par BC fica
no endereço mais alto e o byte menos significativo no endereço mais baixo.
No último caso da figura 3.6 temos a execussão da instrução POP B que lê dado da pilha
para o par BC. Repare que na execuss`ao desta instrução primeiroé transferido o conteúdo
do local de memória apontado por SP que neste caso constitui o byte menos significativo para
o registo C. Depois SP é incrementado e o conteúdo do local apontado pelo novo endereço
em SP é lido para o registo B. Por fim SP é incrementado de novo e a execussão da instrução
termina.
SUBROTINAS
A necessidade de implementação de uma subrotina surge quando um determinado conjunto
de instruções tem de ser executada várias vezes no mesmo programa ou então em multiplas
partes do mesmo programa. Em assembly de 8085 a chamada a uma subrotina é efectuada
através da instrução CALL. Quando uma subrotina está em execussão, o retorno ao
programa principal é realizado através da instrução RET. A execussão da instrução CALL

Microprocessor and Microcontrollers Page 39 of 92


começa por guardar o conteúdo do contador de programas (PC) na pilha para depois
transferir a sequência da execussão do programa para o endereço do início da rotina.
Recorde-se que o contador de programas contem sempre o endereço da próxima instrução
por se executar. Assim, quando a instrução está a ser executada o PC contém o endereço da
instrução logo a seguir a instrução CALL. Por outro lado uma subrotina terminam sempre com
a instrução RET. A execussão desta instrução faz com que o endereço que havia sido levado
para a pilha na altura da chamada da subrotina seja lido de volta para o PC retomando-se
deste modo a execussão do programa principal.
A implementação de uma rotina (para gerar um delay de 20ms) é exemplificada no exercício
que se segue:

Elaborar um programa que, ao iniciar zera todos os bits de um registo de 8 bits usado como
uma porta de saida com endereço 09H. De seguida fica a monitorar continuamente o estado
de uma chave (Switch) conectada ao bit 0 de um registo de oito bits que é usado como uma
porta de entrada com endereço 08H. Logo que constatar que a chave está activada (nível
lógico um) o programa deve esperar durante 20ms para depois enviar um sinal de nível lógico
1 para a activação de um mecanismo de sinalização luminosa (luz amarela) conectado ao bit
0 da porta de saida acima referida. Depois passa a monitorar o estado da chave conectada
ao bit 1 da porta
Inicio de entrada. Logo que constatar que a chave está activada (nível lógico um) o
programa deve esperar de novo durante 20ms para depois enviar um outro sinal de nível
lógico 1 para a activação de um mecanismo de sinalização liminosa (luz vermelha) conectado
ao Desactivar
bit 1 da porta
todos de
os saida.
bits
da porta de saida
NB1: Os 20 ms de espera devem ser obtidosOpor
programa em Assembly
meio de implementação depara
uma este que realiza umé:delay.
rotina fluxograma
Antes da chamada da rotina deve-se salvaguardar o conteudo de todos os registos na pilha.

Ler o conteudo da porta MVI A, 00H


O7

O0
OUT 08H ; Resetar as saidas
I7

I0

de entrada
loop1: IN 09H ; Ler a entrada dos switches
Entrada

ANI 01H ; Testar o 1o switch


Saida
Porta

Porta

JZ loop1 ; Se não activado continuar


de

de

não
N
B

N
B
E

switch 0 ;no loop


activdo?
CALL delay ; chamar a subrotina que gera
; 20ms de delay
sim MVI 01
OUT 08H ; enviar 00000001 para a saida
Delay
Loop2: IN 09H ; Ler a entrada dos switches
Delay de 20 ms ANI 02H ; Testar o 2o switch
D JZ loop2 D ; Se não activado continuar
Activar o bit 0 da porta de 0 0 ;no loop
A0

saida … CALL delay …; ; chamar a subrotina que gera


A3

A7 A0
D D
A3

A7

; 20ms de delay
MVI 02
µP S2
OUT 08H ; enviar 00000010 para a saida
er
E
n
d

o
ç

HLT
S1
D

d
o
a

não
Delay: LXI B 682H ; carregar BC com o valor 1667
x x x xswitch
x x1 activdo?
b1 b0 Loop: DCX B ; Decrementar BC por 1
5V MOV A, C ;
sim x ORA
x xB x x ;xfazer
b1 AbOR
0 B
Entrada (endereço 09H) ;(o mesmo que C OR B)
Delay Saida
JNZ (endereço
Loop 08H) o loop se BC ainda não é 0
; repetir
Delay de 20 ms RET ; Retornar ao programa principal

Microprocessor
Activar o bit and
1 daMicrocontrollers
porta de Page 40 of 92
saida

Pausa
Ler o conteudo da porta
de entrada

Fig. 3.7– Exemplo de implementação de uma subrotina

Microprocessor and Microcontrollers Page 41 of 92


O programa começa com a inicialização do port de saida enviando o valor 00H o que faz com
que o “port” seja “resetado”. Depois lê a porta de entrada e verifica se o swicth 1 (S!) está
activado. Caso este esteja activado chama-se a rotina que gera um delay de cerca de 20ms e
depois dá saida o valor 02H (0000 0010) para o porta de saida. Depois este processo é
repetido para o switch 2.
A rotia que gera o delay implemeta um loop simples usando o par BC como contador. Este par
de registos é inicializado com o valor decimal 1667 que quando decrementado até zero e
considerando que o microprocessador funciona com a frequência de clock de 2 MHz irá
resultar num delay de cerca de 20ms. Repare que o teste para se determinar se o par BC
contém ou não o valor zero é feito usando o operador OR entre os registos B e C. O resultado
do teste só será zero se ambos os registos estiverem com o valor zero.

O tempo de delay é determinado pela expressão:


TD = T-states (no loop) x (contador -1) x Periodo do clock +
+ T-States (último ciclo) x perido do clock

Sendo o loop composto pelas instruções:

Loop: DCX B ; 6 T-States


MOV A, C ; 4 T-States
ORA B ; 4 T-States
JNZ loop ; 10 T-States se o salto ocorrer ou 7 T-States se o salto
; não ocorrer

Teremos então:
TD ≈ NT-states x 1/f x Nloops

Então teremos Nloops ≈ TD / NT-states x 1/f = 20000µs/ (24 x 0.5 µs) ≈1667

Aninhamento de subrotinas

Em assembly uma subrotina pode chamar uma outra subrotina e este por sua vez pode
chamar uma outra e assim por diante. O limite em termos do grau de aninhamento é
determinado pela extensão de memória a que a pilha está reservada pois em cada chamada a
uma subrotina o endereço de retorno e possivelmente outra informação referente ao estado do
microprocessador e que se encontra nalguns registos internos devem ser guardados na pilha.
Sendo assim, enquanto a pilha não estiver “cheia” as subrotinas podem continuar a ser
aninhadas. A figura 3.8 ilustra o que acontece na pilha durante a chamada a subrotinas.

Programa Principal Subrotina 1 Subrotina 2 Pilha

2020H CALL 2040H CALL 2060H


40 60
20 20
2023H 2043H ….. 23 SP
…… …… 20
RET RET 43
20
x

Microprocessor and Microcontrollers Page 42 of 92


4- Dispositivos de Suporte

Como foi visto nos capítulos anteriores, os componentes fundamentais num sistema baseado
em microprocessador são, em primeiro lugar, a CPU e depois a memória. Entretanto, para que
o microprocessador possa efectuar uma tarefa realmente útil é preciso que haja mecanismos
que permitam a introdução dos programas e dos dados para a memória. Por outro lado, é
imperioso que haja mecanismos que permitam que os resultados dos processos que têm lugar
na CPU possam estar desponibilizados ao usuário.
Os dispositivos de suporte são “chips” que são concebidos para auxiliar o microprocessador
em tarefas bem específicas. Estes “Chips” são muito pouco flexiveis (isto é muito menos
inteligentes) que o microprocessador mas eles realizam a tarefa a se destinam de forma muito
mais eficiente e rápida. Os dispositivos de suporte são concebidos em extreita ligação com um
determinado tipo de microprocessador ou então família de microprocessadores e destinam-se
esencialmente a servirem de interfaces com periféricos ou a então efectuar funções que se
acredita que serão mais eficientemente realizadas quando implementadas num circuito
dedicado, livrando deste modo o microprocessador deste tipo de tarefas que geralmente
requerem pouca “inteligência”. Deste modo, o microprocessador irá dedicar grande parte do
seu tempo em tarefas de computação propriamente ditas.
Num sistema baseado em microprocessador o conjunto destes circuitos de suporte com o
microprocessador é frequentemente designado por “Chip Set”.

4.1 - Dispositivos de Interface paralelo

Uma forma muito elementar de implementar um inteface paralelo atraves do qual dados
estruturados sob a forma de bytes (ou um duplo bytes) pode ser enviado para
microprocessador pode ser conseguida usando um simples circuito contendo 8 ou 16 3-state
buffers tal como se ilustra na figura abaixo
Vcc

74ALS244

1A1 1Y1 D0

1A2 1Y2 D1
.
1A3 1Y3 D2

1A4 1Y4 D3
Barramento
de dados
2A1 2Y1 D4

2A2 2Y2 D5

2A3 2Y3 D6

2A4 2Y4 D7
G1 G2

SEL
Fig.1.4a – Exemplo de implementação de um interface de entrada paralelo

Microprocessor and Microcontrollers Page 43 of 92


O 74ALS 244 é circuito integrado contendo 8 3-state buffers tal como se ilustra na figura
abaixo.

Fig.1.4b – Estrutura do buffer 74ALS244

Na operação de leitura (através da instrução IN Endereço) o microprocessador emite o


endereço reservado a esta entrada. Após a descodificação do endereço gera-se um sinal de
nível Low que vai activar as duas entradas G1 e G2 que activam os 3-state buffers para
permitir a passagem do dado correspondente a posição de cada um dos interruptores.

Por outro lado, uma forma simples de implementar um inteface paralelo para saida de dados
do microprocessador para o exterior pode ser conseguido com o uso de um registo com uma
saida de três estados como ilustrado na figura que se segue.

Vc

74ALS374

Q0 D0
Q1 D1
Q2 D2
Barramento
Q3 D3 de dados
Q4 D4
Q5 D5
Q6 D6
Q7 D7

OC CLk
Fig.2.4a – Exemplo de implementação de um
Microprocessor and Microcontrollers
interface de saida paralelo Page 44 of 92

SEL
Fig.2.4b – Estrutura do registo 74ALS374

Na fig.2.4a o microprocessador envia um conjunto de oito bits que se destinam a acionar um


conjunto de oito LEDs. Deste modo, o estado dos LEDs (Acesso ou apagado) irá reflectir o
valor binário do byte enviados do microprocessadora traves da instrução OUT Endereço. Com
esta instrução, o endereço desta porta de saida é descodificada e o sinal a saida do
descodificador de endereços é aplicado a entrada de Clock permitindo assim o carregamento
do dado no registo onde permanecerá até que uma outra instrução de saida destinada a esta
mesma porta venha alter o conteúdo do registo. O “chip” 74ALS374 é um registo de entrada
paralela e saida paralela constituido por 8 flip-flops tipo D com um 3-state buffer a saida.

4.2 - Despositivos de Interface Programáveis


O mecanismo de implementação de interfaces de entrada ou saida paralela em que se usam
simples portas de três estados ou simples registos apenas se usam em sistemas muito
simples, como por exemplo, em placas de ensaio de microprocessadores usados nas aulas
laboratorias. Em sistemas mais complexos estes dispositivos aparecem normalmente
incorporadas em unidades de interface mais complexos e, quase sempre programáveis.

4.2.1 - Interface Paralelo Programável– PPI- 8255

PPI – 8255 ( Programable periferal interface) é um circuito integrado de suporte programável


de baixo custo concebido para servir de interface paralelo entre o microprocessador e um
periférico. É um dispositivo com três portas paralelas de oito bits cada designadas por porta A,
Porta B e Porta C que podem ser programadas independentemente para servirem tanto como
porta de entrada como para porta de saida e que podem ser usadas para interconectar o
microprocessador com qualquer periférico cuja porta de entrda/saida é compatível com
circuitos TTL. A figura 3.4 mostra o “Pinout “ do PPI-8255ª.

Microprocessor and Microcontrollers Page 45 of 92


CONTROL

Fig.3.4 – PPI-8255 - “Pinout “ e método de conecção com o µP

Como se pode verificar na figura 3.4 o PPI-8255A é conectado com o microprocessador


através de 8 linhas de dados (pinos D7 a D0) , 4 linhas de controle (pinos RD, WR, CS, e
RESET) e duas linhas de endereço (A1, A0) . A conecção com os periféricos é feita através de
16 linhas de dados (Portas A e B) e ainda outras 8 linhas (Porta C) que podem ser usadas
tanto para Entrada/Saida de dados como para controle. Por fim, dois pinos (Vcc e GND)
conectam o PPI-8255 a fonte de alimentação perfazendo assim 40 pinos no total.

Estrutura interna do PPI- 8255


A figura 3.5 apresenta a estrutura interna do interface paralelo PPI-82C55A. A coneccão entre
o barramento de dados do microprocessador e os registos internos do PPI é através do “Data
bus buffer” que na essencia é um conjunto de “3-state buffers” estruturados de tal modo que
permitam a comunicação bi-direcional entre o µP e o PPI.

Microprocessor and Microcontrollers Page 46 of 92


Fig. 3.5 - Estrutura interna do PPI-82C55A

O dado é transmitido do µP para o PPI-82C55A através da execussão da instrução OUT. A


leitura do dado que se encontra no PPI para µP é feita através da execussão da instrução IN
A informação de configuração (“Control Words”) e a informação do estado do PPI são também
transmitidos/lidos através do “Data bus buffer”.

Bloco de comando das operações de leitura e escrita (Read Write Control Logic) - este
bloco recebe dados do barramento de endereços e do barramento de controle do µP e gera os
sinais apropriados para o controle da operação do PPI nomeadamente a selecção de um
registo interno, a direção do fluxo dos dados, a inicialização PPI e a seleção do próprio PPI.
As entradas RD e WR (de tipo active LOW) recebem o sinal de controle de direção do fluxo de
dados, isto é, PPI para µP ou do µP para PPI. A entrda CS (de tipo active LOW) habilita o PPI
para se poder comunicar com o µP. As entrads de controle A0 e A1 são usadas para a seleção
de um dos “ports” A, B, e C e dos dois registo internos de controle (registos de comando) tal
como se ilustra na tabela abaixo.

Microprocessor and Microcontrollers Page 47 of 92


Operações de Entrada

Operações de saida

Desabilitar

Fig.3.5 – Controlo das operações básicas do 82C55A

A entrada de controle RESET (de tipo active high) faz com que, quando activada, sejam
zerados os registos internos do PPI e as três portas de conecção com periféricos são todos
configurados como portas de entrada.

Blocos de controle ( Group A and Gruop B Control) – Os dois blocos de controle são
constituidos essencialmente por registos ( Control Word Registers) que recebem dados vindos
do microprocessador e que se destinam a configuração do modo de operação do PPI e um
circuito que, de acordo com o conteúdo do registo de comando e da informação vinda do bloco
de comandos das operações de leitura/escrita, gera sinais que determinam o modo de
funcionamento cada uma das portas de entrada/saida.
O microprocessador tanto pode enviar dado para o registo de controle como pode também ler
o dado nele contido. O registo de controle do grupo A controla a operação da porta de
Entrada/Saida A e os 4 bits mais significativos da pota C. O registo de controle do grupo B
controla a operação da porta de Entrada/Saida B e os 4 bits menos significativos da pota C.
As portas de Entrada/saida podem ser configuradas para desempenhar funções diversas tais
como entrada de dados vindo do periférico, saida de dados para o periférico, saida de sinais de
controle ou então entrada de sinais de controle.
As portas A e B são usadas para a conecção com um periférico para entrda ou saida de
dados. Na operação de saida a porta A comporta-se como um registo de 8 bits com saidas de
3-state buffers. Na operação de entrada esta porta comporta-se como um simples registo de 8
bits. A porta B é usada como um registo de entrada/saida com 3-state buffer.
A porta C pode ser usada como um registo de 8 bits de saida com 3-state buffer ou como um
simples conjunto de 3-state buffers de entrada. Esta porta pode ser subdividida em duas portas

Microprocessor and Microcontrollers Page 48 of 92


de 4 bits cada. Nestas condições cada porta age como um simples registo de 4 bits que pode
receber ou enviar sinais de controle de ou para o periférico ou microprocessador.
Quando o PPI-8255 é conectado com o µP 8085 os endereços usados são normalmente C0H,
C1H , C2H e C3H para aceder os ports A, B, C e o registo de controle respectivamente. A
tabela abaixo e o circuito da figura 3.7 mostra uma implementação típica do circuito de
descodificação do PPI-8255.

A7 A6 A5 A4 A3 A2 A1 A0 Hex Port
1 1 0 0 0 0 0 0 C0H A
Fig.3.6 – Endereços de
1 1 0 0 0 0 0 1 C1H B acesso do 8255 pelo µP
1 1 0 0 0 0 1 0 C2H C 8085
Registos de
1 1 0 0 0 0 1 1 C3H
comando

A7
A6
A5
A4 CS

A3

A2

A1 A1 8
2
A0 5
A0
5
IO/M A
RD
RD

Fig.3.7 – Circuito típico de descodificação IO/M


de endereços do PPI-8255
WR
WR

Operação do PPI-8255

Como o nome indica, o PPI-8255 é um dispositivo programável. Quer isto dizer que o
funcionamento deste dispositivo é determinado pelo programa que, de entre outras tarefas que
deve executar, é concebido também para configurar o dispositivo. A configuração do PPI
consiste essencialmente no envio por parte do microprocessador da chamada palavra de
comando (“comand word”) num dos registos de controle.
Na programação do PPI-8255 o passo inicial é determinar os endereços de I/O que devem ser
alocados ao dispositivo, ou melhor, a cada uma das três portas de Entrada/Saida e ainda aos
registos de controle. Estes endereços irão determinar o circuito lógico de descodificação do
PPI e as entradas A1 e A0 tal como o exemplo apresentado na figura 3.7. De seguida, de

Microprocessor and Microcontrollers Page 49 of 92


acordo com o modo de funcionamento pretendido, é necessário determinar a palavra de
comando a ser enviado para o registo de comando para a configuração do dispositivo.

A configuração do PPI consiste em determinar a função e o modo de operação de cada uma


das portas de Entrada/Saida. Em relação ao modo de operação, o PPI8255 pode ser
configurado para operar em I/O mode (modo de E/S) ou em BSR mode (Modo de
activação/Desactivação de bits).
Quando o PPI funciona em I/O mode as suas portas de conecção com periféricos podem ser
programada para funcionarem como simples portas de Entrada/Saida ( sem dialogo com
periférico), como portas de Entrada/Saida com a capacidade de dialogo com o periférico ou
microprocessador, ou ainda como porta de entrada bi-direcional. Estes modos de operação são
designados por Modo 0, Modo 1 e modo 2 respectivamente. A figura 3.8 mostra ao formato do
“cotrol word” na configuração do PPI-6255.

CONTROL WORD

D7 D6 D5 D4 D3 D2 D1 D0
Port C ( PC3 – PC0)
1 = input
0 = output

GRUPO B
Port B
1 = input
0 = output
Selecção do Modo
0 = Modo 0
1 = Modo 1

Port C ( PC7 – PC4)


1 = input
0 = output
GRUPO A

Port A
1 = input
0 = output
Selecção do Modo
00 = Modo 0
01 = Modo 1
1x = Modo 2

Modo de Operação
1 = I/O mode
0 = BSR Mode

Figura 3.8 – layout da palavra de controle do PPI-8255

Funcionamento no modo 0

No Modo 0 As portas A e B são configuradoas independentemente como portas de entrada ou


de saida. A Porta C é subdividida em duas portas de 4 bits cada. Cada sub-grupo de 4 bits é
programado independentemente como porta de entrada ou de saida.
A operação do PPI-8255 no modo 1 é ilustrado na figura 3.9. Neste modo de operação, as
portas A e B são usdas como portas de entrada ou de saida. A porta B usa as linhas PC0, PC1
Microprocessor and Microcontrollers Page 50 of 92
e PC2 para para o dialogo com o periférico e/ou µP para as operações de entrada como as de
saida. A porta A usa as linhas PC3, PC4 e PC5 para o dialogo para as operações de entrada.
Para as operações de saida, a porta A usa as linhas PC3, PC6 e PC7 para o dialogo, deixando
deste modo as linhas PC4 e PC5 como linhas de entrada ou saida.

CONTROL WORD

D7 D6 D5 D4 D3 D2 D1 D0
1 0 1 1/0 1/0 1 1/0 x

Port B
1 = input
0 = output
Port B Modo 1

Port C – PC6, PC7 – se port A é entrada


Port C – PC4, PC5 – se port A é saida
1 - Input
0 - Output

Port A
1 = input
0 = output
Port A Modo 1

Modo de Operação
1 = I/O mode
0 = BSR Mode

Figura 3.9 – layout da palavra de controle no modo 1

Funcionamento no modo 1

Quando o PPI está a operar no modo 1 os sinais usados para o dialogo são:

● STB (Strobe input) – Sinal vindo do periférico para indicar que o periférico já tem na
sua saida um dado (byte) pronto para o PPI ler. Para a porta A este sinal é
conectado a linha PC5 enquanto que para a porta B este sinal é conectado a linha PC2
●IBF (input Buffer Full) – Sinal de reconhecimento saindo do PPI para indicar que já
recebeu um byte de dado. Para a porta A este sinal é obtido na linha PC5 e para a porta B na
linha PC1.
●INT (interrupt Request) – Sinal gerado pelo PPI para solicitar serviço ao
microprocessador. Este sinal sai da linha PC3 para a porta A e PC0 para a porta B e é
conectado a entrada de pedido de interrupção do microprocessador.
● (Output Buffer Full) – sinal gerado pelo PPI para indicar a um periférico que tem
OBF
um dado pronto para ser lido (pelo periférico). Para a porta A este sinal é obtido na
linha PC7 enquanto que para a porta B o sinal sai pela linha PC1
● (ACKnowledge) – Sinal de entrada vindo de um periférico para indicar que este já
ACK
Microprocessor and Microcontrollers Page 51 of 92
recebeu o dado (byte) enviado pelo PPI. Para a porta A este sinal é obtido na linha
PC6 enquanto que para a porta B o sinal sai pela linha PC2). As figura 3.10 mosta as portas A
e B e os sinais de controle quand o PPI opera no modo 1.

PPI-8255 no modo 1 – Operação de Entrada

PPI-8255 no modo 1 – Operação de Saida

Microprocessor and Microcontrollers Page 52 of 92


Funcionamento no modo 2

No modo 2 a transferência de dados entre o PPI-8255 e o periférico é feita na forma bi-


direcional. Este modo é usado para a transmissão de dados entre dois computadores ou entre
o controlador de disco e o microprocessador. Neste modo de operação a porta A é usada para
a comunicação bi-direcional e cinco linhas da porta C para a troca de sinais de controle
(handshaking). A porta B pode ser usada tanto no modo 0 como no modo 1. Os cinco sinais de
dialogo usados pela porta A quando está configurada no modo 2 são: OBF

INTR (PC3 - saida) - Este sinal é usado para solicitar um interrupção ao microprocessador,
tanto para as operações de entrada como para as operações de saida.

Operações de saida

OBF (PC7 - saida) – O PPI activa este sinal (nível lógico 0) quando recebe um byte do
microcessador. Portanto este sinal pode ser usado para solicita o periférico para ler o dado.

ACK (PC6 - entrada) – Quando esta entrada é activada (nível lógico 0) os three-state buffers
de saida da porta A libertem o dado para ser lido pelo periférico.

Operações de Entrada

STB (PC4 - entrada) - Quando esta entrada é activada (nível lógico 0) o PPI lê o dado que lhe
é apresentado na porta A para o seu registo interno de entrada.

IBF ( PC6 – saida) – O PPI activa esta saida (nível lógico 1) para indicar ao periférico que o
seu registo de entrada contém um dado, isto é , que o dado que acabou de ler do periférico
ainda não foi transferido para o microprocessador.
A figura 3.11 mostra a configuração e a operação do PPI no modo 2.

Microprocessor and Microcontrollers Page 53 of 92


Figura 3.11 – Funcionamento do PPI-8255 no modo 2

Microprocessor and Microcontrollers Page 54 of 92


Funcionamento no modo BSR

O modo BSR (Bit Set Reset) é selecionado quando o bit 7 da palavra de controle é levado para
o nível lógico 0. Este modo afecta apenas a porta C e é usado para activar (levar pata o nível
lógico 1) ou desactivar (levar para o nível lógico 0) um determinado bit desta porta. A figura
3.12 mostra o formato da palavra de controle para levar o PPI-8255 a operar no modo BSR.

D7 D6 D5 D4 D3 D2 D1 D0
0 x x x D3 D2 D1 1/0

Não usados
Bit Select
Modo 000 – bit 0
BSR Set - 1
001 – bit 1
Reset - 0
010 – bit 2
011 – bit 3
100 – bit 4
101 – bit 5
110 – bit 6
111 – bit 7

Quando este modo é selecionado as portas A e B são mantidas no modo em que


anteriormente se encontravam.

1 –Exemplo 1 - Usando o 8085, um buffer 74LS244 como um porta de entrada e um latch


74LS373 como porta de saida implementar um sistema que permite uma leitura de segundo a
segundos, um conjunto de oito sinais digitais que representam o estado de 8 sensores de
intrusão colocados em oito diferentes portas de um edifício e emite sinais digitais Low or High
que são usados para accionar um conjunto de 8 indicadores visuais (lâmpadas) . O Low na
porta de saida apaga a lampada e o High permite acender a lampada. A porta de saida deve
ter o endereço 38H e o endereço da porta de entrada o endereço 39H.

D0-D7 – Entrada de dados LE – Latch Enable


Q0 – Q7 - saida de dados OE – Output Enable

Microprocessor and Microcontrollers Page 55 of 92


74LS373

74LS244
AD0 AD7

AD0 AD7
A8 A15
8085

1Y1 1Y2 1Y3 1Y4 2Y1 2Y2 2Y 2Y4 D0 D1 D2 D3 D4 D5 D6 D7

G1
74LS244 LE
LE
G2
74LS373
IO/M 1 1 1 1 2 2 2 2 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7

RD

WR

IO/M
RD
IO/M
A8 WR
A9
A10 A8
A11 A9
A12
A13 A10
A11
A14 Descodificação do A12
A15 Endereço 39H = 0 0 1 1 1 0 0 1 A13
A14
A15
Descodificação do
Endereço 38H = 0 0 1 1 1 0 0 0

Microprocessor and Microcontrollers Page 56 of 92


INICIO: IN 39H
Inici OUT 38H
CALL DELAY
JMP INICIO
Ler a porta de
DELAY: MVX C350H
entrada
LOOP: NOP
NOP
Enviar os dados para NOP ;(4)
a porta de saida NOP
DCX ;(6)
MOV A, L ; (4)
Delay 30 S OR A H ; (4)
JNZ LOOP ;(10/7)
RET

OBS:
f = 2 MHz
N-Pulsos = 40
T = 40x0.5µS = 20 µS
N-Loops = 1000000 µS/20 µS = 50000d
50000d = C350H

Exemplo 2 : Usando o PPI-8255 implementar um circuito que permite a leitura do estado de 8


“limit Switches”. Aspós a leitura o sistema deve depois activar o LED vermelho se a entrada
repectiva estiver activada ou LED verde se a entrada estiver não activada. Considere que o
PPI a faixa de endereços de C0H a C3H.
CONTROL WORD

D7 D6 D5 D4 D3 D2 D1 D0
Port C ( PC3 – PC0)
1 = input
0 = output
GRUPO B

Port B
1 = input
0 = output
Selecção do Modo
0 = Modo 0
1 = Modo 1

Port C ( PC7 – PC4)


1 = input
0 = output
GRUPO A

Port A
1 = input
0 = output
Selecção do Modo
00 = Modo 0
01 = Modo 1
1x = Modo 2

Modo de Operação
1 = I/O mode
0 = BSR Mode

Figura 3.8 – layout da palavra de controle do PPI-8255


Microprocessor and Microcontrollers Page 57 of 92
Para o funcionamento do PPI no modo 0 com portas A e B como saidas e porta C como
entrada a palavra de controle é:

1 0 0 0 1 0 0 1

Porta C como entrada


(PC3 – PC0)

Porta B como Saida

Grupo B no modo 0

Porta C como entrada


(PC7 – PC4)

Porta A como Saida


Grupo A no modo 0

Modo I/O

Endereços:
C0H  Porta A
C1H  Porta B
C2H  Porta C
C3H  Registo de controle

MVI 89H ;Inicialização no modo zero


OUT C3H
LOOP: IN C2H ; ler a porta de entrada (porta C)
OUT C0H ; enviar para a porta A
CMA ; Complementar Acumulador
OUT C1H ; Enviar para a porta B
JMP LOOP

Microprocessor and Microcontrollers Page 58 of 92


WR
C0 IO/M IO/M
WR
C1 WR RD WR
RD
C2 IO/M
RD RD
C3 A15
A14
A15
C4 CS A13
A14
A12 A13
C5 A12
A11
A11
C6 A1
A10
A0 A10
A9
C7 A8

PPI–8255

8085
CS
5V

B0
B1
B2
B3
B4
B5
B6
B7

A0
A1 D0 AD0
A2
A3
A4
A5
A6
A7 D7 AD7

Figura 3.9 – Uso do PPI-8255 no modo zero

Microprocessor and Microcontrollers Page 59 of 92


DISPOSITIVO DE INTERFACE SERIAL

Os despositivos de interface serial permitem a transferência de dados da CPU para um


periférico ou do periférico para a CPU na forma srial, isto é, bit a bit. A comunicação de dados
entre dois dispositivos na forma serial é mais lenta que a comunicação dos mesmos na forma
paralela. Porém a transferência de dados na forma serial apresenta-se menos cara sob o ponto
de vista de linhas necessárias para o transporte dos sinias. Teóricamente, apenas um condutor
é necessário para transportar a informação do interface serial para o mundo exterior acrescido
do condutor de retorno ou massa. A comunicação de dados na forma serial é usada em
situações em que os dados devem ser transmitidos para distâncias acima de alguns metros.
De entre vários aspectos a considerar na comunicação serial de dados a concepção de um
interface serial deve ter em conta o modo como o equipamento tramsmissor e o equipamento
receptor são conectados para poderem tramsmitir e/ou receber os dados. Assim a conecção
pode ser simplex em que dum lado exixte apenas um tramsmissor e do outro lado apenas um
receptor sendo que a transmissão se realiza num só sentido, half-duplex em que existe
transmissão e recepção nos dois sentidos mas em cada instante apenas um transmite e o
outro recebe ou então full-duplex em que ambos os pontos podem transmitir e receber
simultaneamente.

A B A B

Duas linha de
Uma linha de transmissão
transmissão apenas (full-duplex)
(half-duplex)

Um outro aspecto que se deve considerar é o mecanismo de sincronização entre o transmissor


e o receptor. O processo de sincronização permite responder a questão de como um fluxo de
dados é dividido em bits individuais e como um conjunto de bits são subdivididos em palavras
(unidades básicas de informação). Assim, no interface de comunicação serial a divisão de fluxo
de dados em bits e palavras pode ocorrer nos chamados modos assincrono ou sincrono.
Na transmissão serial assincrona, os “Clocks” do lado de transmissão e do lado de recepção
que são responsáveis pela divisão do fluxo de dados em bits e em palavras não são
sincronizados. A figura abaixo ilustra a forma de onda que corresponde a transmissão de um
único caractere (caracter ‘c’) codificado em ASCII que usa 7 bits para a codificação de
caracteres.

10 bits correspondentes ao envio de um só caractere

1 0
1 1 0 1 1 1 1 0
Estado
de
bit de Repouso
Stop Duração do bit

bit de bit de
7 bits de informação Start
Paridade (1101111)
Microprocessor and Microcontrollers Page 60 of 92
Neste modo de transmissão para além dos bits de informação propriamente ditos mais alguns
bits são anexados para o controle do inicio da transmissào do caractere, do fim da transmissão
do caractere e ainda de bit(s) de dectecção de erros na transmissão.
Quando nenhum dados está sendo transmitido a saida do transmissor é mantido no nível
lógico “High” o que representa o estado de repouso. Quando o transmissor pricisa de enviar
uma palavra, a linha de saida é levada ao estado lógico “Low” durante o período
correspondente a um bit. O equipamento de recepção sente esta alteração de estado (High
para Low) e considera como sendo o bit de início de transmissão de uma palavra. Assim, de
seguida irá proceder a amostragem dos pulsos subsequentes com um intervalo de
amostragem correspondente ao período de um bit. O clock para a amostragem é gerado na
própria unidade de recepção e desde que a frequência deste não tenha uma diferênça superior
a 4% da frequência do clock da unidade transmissora, a amostragem de cada bit irá ocorrer
muito próximo do ponto médio de cada bit. Depois dos 7 bits de informação mais um bit (ou
mais) é transmitido para a verificação da paridade com vista a deteção de possíveis erros na
transmissão. Depois do bit de paridade segue-se o bit de Stop que indica o fim de transmissão
de um caractere. Depoisnda transmissão do bit de Stop pode iniciar a transmissào de um novo
caractere ou o sistema pode simplesmente entrar no estado de repouso. A transmissão serial
assincrono é mais usada na transmissão de dados codificados em ASCII.

Na transmissão serial de dados no modo Sincrono a informação é transmitida continuamente,


sem “gaps” entre grupos adjacentes de bits. O termo grupo de bits é usado aqui porque
sistemas de transmissão sincrona são mais usados para transmitir blocos de dados codificado
puramente em binário ao invés de caracteres ASCII. Para a sincronização de bits o transmissor
deve enviar o sinal de clock para o recepto para que este possar na amostragem
(recuperação) de cada bit tal como se ilustra na figura que se segue.

Dados 0
1 0 1 1 0 1 1 1 1 1 1

Clock

O sinal de sincronização requere um condutor adicional. Uma outra solução pode ser a
codificação do sinal de clock de modo a ser incluido no próprio sinal de dados.
A separação entre dois blocos de dados é conseguida inserindo-se um caractere especial de
sincronização entre os blocos.

Interface Prográmável de comunicação 8251A

O Intel 8251A é um interface de comunicação serial construido como um dispositivo de


standar industrial para comunicação Universal, Sincrono/Assincrono que pode desempenhar
ambas as funções de , Receptor/Transmissor – USART- concebido especialmente para a
comunicação serial de dados com microprocessadores da família Intel tais como o 8080, 8085,
8086 e 8088. O USART pode receber dados na forma paralela vindas da CPU para depois
formatar e depois converter num fluxo de bits para serem enviados para um periférico na forma
serial. Por outro lado a USART pode receber um fluxo de bits transmitidos serialmente por um
dispositivo exterbo para depois paralelizar, fazer a verificação de possíveis erros de
transmissão para depois enviar para a CPU. A USART dá uma indicação a CPU sempre que
tiver recebido um dado do exterior e pretenda que este seja transferido para a memória e ainda
sempre que estiver em condições de receber dados da CPU para transmitir. A CPU pode
Microprocessor and Microcontrollers Page 61 of 92
també ler o estado da USART em qualquer momento. A figura que se segue mostra o esquema
em blocos da USART.

Fig. 4.--- a Fig. 4.---b Pin Esquema em blocos do 8251A


Fig. 4.---a - Pin out do 8251A

Microprocessor and Microcontrollers Page 62 of 92


Data Bus

Fig. 4.---c - Detalhes da constituição interna do 8251A

Descrição do Circuito

Como se pode constatar na fig.4.—c, o interface serial 8251ª é constituido de sete blocos
principais que a seguir descrevem:

1 – Buffer do barramento de dados (Data bus buffer) – Este bloco é constituido o interface
entre o barramento de dados e a própria USART. O bloco é constituido essencialmente de
three-state buffers que, mediante a execussão de instruções IN ou OUT, permitem ao
dispositivo enviar para a CPU ou receber da CPU um conjunto de oito bits. Os dados tanto
podem representar a informação a ser transmitida para o exterior, palavras de comando ou
informação do estado do dispositivo.
2 – Bloco de controle das operações de Leitura/Escrita (Read/Write Control Logic) –
Neste bloco esta implementada a lógica que permite a seleção do chip em si e o controle das
operações de leitura ou escrita atraves dos sinais RD , WR e CS vindos da CPU. Neste bloco
chega também o sinal de CLK que representa o “Master Clock” do sistema e que é usado
para, a partir deste, derivar a(s) frequência(s) de operação das diversas unidades lógicas do
dispositivo. Ten-se ainda a entrada C/D .que permite disntiguir se o dado vindo da CPU é um
dado de informação (destinado ao registo de dado de transmissão) ou uma palavra de
comando ( destinado ao registo de controle). O nível high na entrada RESET leva o dispositivo
ao estado de repouso permanecendo neste estado até que novas palavras de comando sejam
enviadas para o dispositivo para a definição da sua operação. A tabela abaixo mostra o
comportamento do 8251A em função das diversas combinações dos sinais acima descritos.

Microprocessor and Microcontrollers Page 63 of 92


C/D RD WR CS
0 0 1 0 8251 Reg. dado Barramento de dados
0 1 0 0 Barramento de dados 8251 Reg. dado
1 0 1 0 8251 Reg. estado Barramento de dados
1 1 0 0 Barramento de dados Reg. Controlo
x 1 1 0 Barramento de dados em alta impedância
x x x 1 Barramento de dados em alta impedância

3 - Bloco de controle de Modem – Este bloco implementa a lógica necessária para o controle
da coneção do 8251 com um MODEM, dispositivo fundamental na comunicação a longas
distâncias. Os sinais de entrada ou saida gerados neste bloco são sinais de uso geral de modo
que eles podem ser usados para funções que podem não ser de controle de modem. Os sinais
de controle gerados ou aplicados deste bloco são:
DSR (Data Set Ready) – Entrada de estado activo “Low”. Esta entrada é usada pelo
equipamento externo, normalmente o MODEM para indicar que está pronto para transferir um
dado para o 8251. A CPU pode testar o estado desta entrada acedendo o bit reservado a esta
entrada no registo de estado.
DTR (Data terminal redy) - Saida de estado activo “Low” que o 8251 usa para informar ao
equipamento externo, normalmente o MODEM, que tem um dado pronto para transferir
informação. Esta saida pode ser activada (estado activo Low) através de programa
configurando o bit respectivo na palavra de comando.
RST (Request to send) - Saida de estado activo “Low” que o 8251 usa na transmissão em half-
duplex para solicitar ao equipamento/Dispositivo com quem está conectado, normalmente o
MODEM, a autorizaçao para começar a enviar dados, isto é, para que o equipamento receptor
possa disponibilizar a linha de recepção de sinal.
CTS (Clear to send) – Um nível lógico Low nesta entrada informa o 8251 que pode começar
com a transmissão serial de dados. O 8251 inicia a transmissão de dados se o bit TxEnable no
registo de comando estiver activado (Estado Logico High).

4 – Buffer de Transmissão (Transmitter Buffer) – Este é essencialmete um registo (com


saida em three-State) que recebe dados paralelos vindos do “Data Bus Buffer”, converte-os em
serial, insere o(s) bits ou caractere de controle de erros de transmissào (dependendo do
protocolo de comunicação) e dá saida do dado já completo através do pino de saida TxD na
borda descendente do sinal de entrada TxC. O dado começará a ser transmitido se o
transmissor estiver habilitado e a entrada CTS estiver activada. A saida TxD voltará a ser
levada ao estado de repouso se CTS ou TxEnable forem desactivados ou então se a entrada
RESET for activada ou ainda se o transmissor estiver vazio.
5 – Bloco de controle do transmissor (Transmit Control) – Este bloco gere todas as
ctividades relacionadas com o processo de transmissão serial dos dados. Para o seu
funcionamento este bloco recebe e envia sinais de controle tanto internamente (gerados ou
aplicados dentro do próprio circuito) como também sinais vindos do exterior.
Os sinais gerados neste bloco para o exterior são:
TxRDY ( Transmitter Ready) – Este é o sinal indica a CPU que o 8251 está pronto para
receber um dado destinado a ser transmitido. O 8251 pode usar este sinal para o pedido de
interrupção. Se a CPU opera no modo Polling, ela pode testar o estado deste sinal no registo
de estado.
TxE (Transmitter Empty) – O 8251 activa esta saida para indicar que o transmissor está
vazio, isto é, que já acabou de transmitir o dado. Na operação em half Duplex este sinal pode
ser usado para permitir a comutação do equipamento do estados de transmissão para o estado
de recepção.

Microprocessor and Microcontrollers Page 64 of 92


TxC (Transmitter Clock) – Este é o sinal de clock que determina a velocidade de transmissão
(Baund Rate). O bit é “empurrado” para a saida na borda descendente dos pulsos deste sinal.
6 – Bloco de Recepção (Receiver Buffer) – Este bloco é responsável pela recepção serial dos
dados que chegam através da entrada RxD, conversão deste dados que chegam bit a bit do
formato serial para formato paralelo (paralelizar), verificar possíveis erros ocorridos na
transmissão, extrair os bits ou caracteres inseridos pelo transmissor destinados a detecção de
erros e enviar os dados de informação propriamente dita , byte a byte, para a CPU.
7 – Bloco de Controle da recepção (Receiver Control) – Este bloco gere a operação do
bloco de recepção. Uma das tarefas deste bloco é a deteção de erros e a activação do seu
correspondente bit no registo de estado, a decteção de falsos Start Bits e ainda a activação do
bit de indicação de erros no “frame” se se constatar a auxencia do Stop Bit no dado recebido.
Os sinais que chegam/partem deste bloco são:
RxRDY ( Receiver Ready) – Este é um sinal de saida que indica que o 8251 contem um dado
que já está pronto para ser enviado para a CPU. Este sinal pode ser usado para o pedido de
interrupção. Se o mecanismo de comunicação da CPU com os I/O for através do modo Polling,
a CPU pode testar o estado do bit correspondente a este sinal no registo de estado.
RxC (Receiver Clock) – Este é o sinal de clock que permite estabelecer a taxa (em bits por
segundo ou Baunds) em que o dados são recebidos.
SYNDET/BRKDET ( SYNC Detect/Break Detect) – Este pino pode ser programado tanto como
entrada como para saida. Quando configurado como saida, este sinal é activado quando
(modo interno de sincronização) para indicar que o caractere(s) de sincronização foi detectado.
Quando programado como entrada, a ctivação deste sinal indica que o 8251 pode começar a
“empacotar os dados que vinha recebendo.
No modo Assincrono, o pino é usado como sinal de saida para indicar que o 8251 recebeu o
sinal de break que normalmente é usado para cortar a comunicação. A figura que se segue
mostra o modo típico como o 8251ª é interligado ao microprocessador.

Barramento de endereços

A0
Barramento de dados

Barramento de Controle

RD IO/M WR

Clock Descodificador

CLK C/D CS D7
D7 ---D0
C/D CS … D0 RDRD WR
WR Reset

8251A

Microprocessor and Microcontrollers Page 65 of 92


Configuração do 8251

Para que o 8251A possa operar num determinado modo é necessário que este seja
configurado. A configuração consiste no envio, por parte da CPU, de um conjunto de palavras
de comando que permitem a inicialização do “chip” para que este possa suportar a forma de
comunicação desejada. De entre outros aspectos, as palavras de controle escritas no 8251
determinam a velocidade de Transmissão/Recepção, o número de bits que compoem um
caractere, o número de Stop Bits, o modo de comunicação (Sincrona ou Assincrona), a
paridae, etc. Só depois da programação é que o 8251 se encontra pronto para executar as
suas funções no processo de comunicação. Logo que o processo de configuração termina o
8251 activa a saida TxRDY para indicar a CPU que o “chip” se encontra pronto para receber
um dado da CPU para ser transmitido. Esta saida é desactivada automaticamente logo que o
8251 recebe um dado da CPU. Por outro lado, quando o 8251 acaba de receber um dado
vindo do Modem ou qualquer outro dispositivo, este activa a saida RxRDY para indicar que um
caracter foi recebido e esta pronto para ser enviado para a CPU. Esta saida é desactivada
automaticamente logo que a CPU lê o dado. O 8251 só irá começar com a transmissão serial
do dado apenas quando o bit TxEnable for activado no registo de comando e a entrada CTS se
encontrar no nível Low.

Definição do modo de comunicação

O envio da palavra que determina o modo de operação do 8251 deve sempre ser antecedido
de envio de um comando re RESET do chip. Logo a seguir ao RESET o 8251 considera que a
palavra que se segue é uma instrução do modo de operação seguida de caracteres de
sincronizaçào (no caso de comunicação sincrona) e depois instrução de comando. A figura
abaixo mostra a sequência de envio de comandos de inicialização do 8251.
e o formato da palavra de Esta sequência é ilustrada na figura que se segue.

Formato da instrução do modo de operação


O formato da instrução de modo de operação depende do tipo de comunicaçào pretendida.
As figuras abaixo mostram os formatos da instrução de modo de operação para a comunicação
Assincrona e Sincrona respectivamente.

Microprocessor and Microcontrollers Page 66 of 92


Formato da instrução do modo de Formato da instrução do modo de
comunicação Assincrona comunicação Sincrona

Quando for programado para a operação no modo Assincrono, o USART 8251 insere
auotomaticamente no caractere recebido da CPU, o “Start Bit” logo a anteceder ao bit menos
significativo do dado, o bit de paridade (se for o caso) logo a seguir ao bit mais significativo do
dado e ainda o(s) “Stop Bit(s)” logo a seguir ao bit de paridade. Só depois é que o dado é
serializado e o caractere transmitido bit a bit através do pino de saida TxD. O Shift de cada bit
é efectuado na borda descentente do pulso do clock TxC. A velocidade de transmissão é
programada para ser igual a frequência de TxC ou 1/16 de TxC ou ainda 1/60 de TxC. Se o
8251 não tiver nenhum dado para transmitir a saida TxD mantem no nível High o que é
entendido pelo dispositivo a que está conectado como uma marca de estado de espera.
Do lado de recepção, a entrada RxD encontr-se no nível “High” enquanto nenhum dado estiver
a ser recebido. Uma transição de “High” para “Low” é entendido como sendo a chegada do
“Star Bit”. Uma vez confirmado que não se trata de uma transsição falsa, o processo de
amostragem dos bits subsequentes começa incluindo o bit de paridade e o(s) “Stop Bits”. A
amostragem é feita na borda descendente dos pulsos de RxC. Depois faz-se a análise dos
bits de controle (paridade e Stop Bits). Se se constatar erro de paridade o bit respectivo no
registo de estado é activado. Se se constatar que o “Stop Bit” tem o nível lógico Low o Framing
Error” é activado no registo de estado para indicar erro no formato do dado recebido. Depois o
o dado é carregado no registo (paralelo) de saida e o sinal RxRDY é activado para dar
indicação que já existe um dado pronto para ser transferido para a CPU. Se o dado
anteriormente carregado no registo de saida não chegou a ser lido pela CPU, ele se perde
pois será substituido pelo dado actual. Se isto ocorrer então o bit de “OVERRUM ERROR” é
activado no registo de estado. Todos estes bits de erros podem ser desactivados através da
instrução de desactivação de erros.

Microprocessor and Microcontrollers Page 67 of 92


Operação no modo Sincrono

Neste modo de transmissão, O USART 8251 mantém continuamente a saida TxD no estado
“High” até que a CPU envie o primeiro caractere (normalmente o caractere de sincronização)
para ser transmitido. Quando a linha CTS vai para o estado “Low” o primeiro caractere é
enviado bit a bit para a saida em sincronia com a borda descendente do pulso de TxC.
Uma vez inicida a transmissão o fluxo de bits na saida TxD deverá ser contínuo, a velocidade
de TxC. Se a CPU não enviar dado para o 8251 antes do do buffer de transmissão ficar vazio
este irá automaticamente inserir caracteres de sincronização para ser transmitido. Se isso
ocorrer, a saida TxEMPTY será activada para sinalizar que o 8251 está vazio e que se
encontra a transmitir apenas o caractere se sincronização. Esta saida será desactivada
internamente logo que o 8251 receber um dado da CPU.
Na recepção, os bits que vão chegando na entrada RxD são amostrados (sampled) na borda
ascendente dos pulsos de RxC. O conteudo do buffer de recepção (RxBuffer) é comparado bit
a bit com o caractere de sincronização. Logo que se constate a recepção do caractere de
sincronização o sinal SYNDET é activado e o 8251 passa para o modo de recepção de
caracteres de infomaç`ao propriamente dita (incluindo bits de paridade).
Se o USART for programado para aceitar sincronização externa, a sincronização ocorre com a
aplicação de um nível “High” na entrada SYNDET. O mecanismo de verificaçào de erros o o
mesmo que usado no modo Assincrono.

Instruções de Comando

Logo que a instrução de definição do modo de operação e os caracteres de sincronização


(caso seja necessário) forem escritos no 8251 então o dispositivo está pronto para ser usado
na comunicação. As instruções de controle destinam-se ao controle da própria operação do
dispositivo. Estas instruções implementam funções tais como habilitar ou desabilitar a
transmissão/Recepção, desactivação de bits de erros no registo de estado e o controle do
MODEM. A figura abaixo apresenta o formato das instruções de comando.

Microprocessor and Microcontrollers Page 68 of 92


LEITURA DO REGISTO DE ESTADO
Em sistemas de comunicação de dados torna-se necessário de vez em quanto, examinar o
dispositivo responsável pela comunicação com o objectivo de se interirar dos erros que
eventualmente possam ocorrer ou quias outras condições que requerem uma atenção por
parte do processador. O 8251 apresenta facilidades que permitem o programador ler o estato
do dispositivo em qualquer momento durante a operação do “chip”. Para a leitura do estado do
8251 a CPU emite a instrução habitual de leitura de um I/O. Para esta operação a entrada C/D
deve estar em “High”. A figura que se segue mostra o formato do registo de estado.

Microprocessor and Microcontrollers Page 69 of 92


Repare-se que alguns deste bits têm o mesmo significado de alguns pinos de saida do 8251.
As figuras que se seguem mostram o exemplo típico de coneção do USART 8251 com um
MODEM.

Microprocessor and Microcontrollers Page 70 of 92


Exemplo: Apresentar o esquema detalhado de conecção do 8085 com o USART 8251 e este
com um modem. Elaborar depois um programa em assembly que configura o USART 8251
para funcionar com as seguintes caracteristicas:
1 - Modo Transmissão/Recepção no modo assincrono
2 – Paridade Impar
3 – Dados codificados em 8 bits
4 – 1 Bit de stop
Depois da configuração o microprocessador deve enviar para um modem conectado a saida da
da porta serial em referência dados armazenados nos locais compreendidos entre os
endereços 3000 a 30FF.

D0
AD0

D7
AD7

A8

A15

CONTROLADOR DE INTERRUPÇÒES

Num sistema baseado em microprocessador, a CPU precisa de estar constantemente em


comunicação com todos os periféricos a ele conectados tais como o teclado, a impressora,
interface de comunicação serial, disco duro, etc. Por exemplo, o teclado precisa de ser
atendido pelo microprocessador para a operação de transferência de um dado buffer do
teclado para a memória, quando o utilizador carregar numa dada tecla. Por outro lado, um
interface de comunicação (serail ou paralela) como por exemplo o PPI-8255 deverá ser
atendido pelo microprocessador sempre que um dado novo chegar a sua entrada.
Microprocessor and Microcontrollers Page 71 of 92
Em princípio existem dois métodos de estabelecer uma comunicação eficiente entre o
microprocessador e os periféricos. Um destes métodos é o chamado “polling” ou scanning que
é ilustrado na figura 3.8.

Multiplex comandado pela


CPU

CPU

RAM
I/O1

I/O2

ROM
I/O3

I/On

Figura 3.10 – Ilustração do método de “polling”

Como se pode observar na figura acima, no método de “polling” o microprocessador está


constantemente a examinar , de forma sequenciada, a cada dispositivo de E/S a ele
conectado para ver se este precisa de algum serviço do microprocessador.Por exemplo, no
caso de um interface paralelo implementado na base de PPI-8255 a CPU poderia examinar a
saida IBF (input Buffer Full) já que está saida é activada quando o PPI já recebeu um dado de
um periférico e que ainda não foi transferido para o microprocessador.
Este método apresenta uma grande desvantagem pelo facto de grande parte do programa
principal estar dedicado a execussão de loops que tem se destinam a verificação de cada um
dos dispositivo de E/S para determinar se algum deles está a precisar de algum serviço por
parte da CPU. Note-se que quanto maior for o número de I/Os conectados ao
microprocessador pior será o desempenho do sistema porque muito mais tempo será gasto
apenas no teste dos dispositivos de E/S. Repare-se ainda que num determinado ciclo de testes
pode acontecer que alguns ou mesmo nenhum dos dispositivos de E/S esteja a precisar de
algum serviço. Portanto, este método usa de forma pouco eficiente o tempo de processamento
da CPU.
O segundo método de estabelecer o dialogo entre a CPU e os dispositivos de E/S e que
resolve os problemas de ineficiêcias apresentadas no método polling é o chamado método de
interrupção (interrupt-driven data exchange or interrupt-driven communicaton) que é
ilustrado na figura .

Microprocessor and Microcontrollers Page 72 of 92


Controlador de
CPU INTR
Interrupções

RAM
I/O1

I/O2

ROM
I/O3

I/On

Figura 3.11 – Ilustração do método de Interrupções

Neste método de comunicação entre a CPU e dispositivos de E/S é inicializado quando o


próprio periférico (mais precisamente o seu interface) emitir um pedido ao microprocessador a
solicitar um serviço por parte da CPU. Com este método, o microprocessador estará a usar
grande parte do seu tempo na execussão de outros programas (talvés mais complexos ou
importantes para o funcionamento do sistema) e só irá se dedicar ao atendimento de um
periférico quando for solicitado para o efeito. Para este propósito o dispositivo de E/S precisa
de ter uma saida que, quando este precisa de algum serviço, irá enviar um sinal para a CPU
indicando que, logo que este termine a execussão da instrução que está em curso, terá que
interromper o programa para passar para uma rotina concebida para servir o I/O que solicitou a
interrupção e , logo que esta rotina estiver concluida, o microprocessador deverá retornar ao
programa que havia sido interrompido.
A sequência de eventos que têm lugar quando o microprocessador recebe um pedido de
interrupção (Nível lógico high nas entradas INTR, TRAP, RST5.5, RST6.5 e RTS7.5 para o
caso do 8085) são:
1 – Reconhecer o pedido (Nível lógico “Low” na saida INTA para o caso do µP 8085).
2 – Completar a execussão da instrução em curso.
3 – Salvar os registos internos na pilha.
4 –Chamar a rotina concebida para servir o dispositivo que solicitou a interrupção ( interrupt-
handling rotine)
5 – Executar a rotina
6 – Fazer a reposição dos registos internos
7 – Retornar ao programa que havia sido interrompido.
Tendo em conta que o microprocessador normalmente se encontra conectado a vários
periféricos, o processo de atendimento de uma interrupção terár que responder as seguintes
questões:
1 – Que periférico está a solicitar a interrupção ?
2 – Como localizar a rotina do periférico em causa?
3 – Se dois ou mais periféricos solicitarem interrupção qual deles deverá ser atendido
Microprocessor and Microcontrollers Page 73 of 92
primeiro?
As duas primeiras questões são resolvidas através da implementação dos chamados vectores
de interrupção que são acompanhados pelas respectivas tabelas de vectores de interrupções.
O vector de interrupções é um valor binário que o periférico que solicita a interrupção deve
fornecer ao µP para que este possa saber onde localizar a rotina concebida para servir o
periférico. A tabela de vectores de interrupção é um conjunto de locais consecutivos de
memória onde se encontra o (endereço de) início de cada uma das rotinas de serviço dos
dispositivos de E/S conectados ao microprocessador. Para o 8085 a tabela de vectores de
interrupções vai dos endereços 0000H até 0040H tal como está ilustrado na figura abaixo.

Instrucao RST 0 RST 1 RST 2 RST 3 RST 4 TRAP RST 5 REST 5.5 RST6 RST 6.5 RST 7 RST 7.5
Codigo C7H CFH D7H DFH E7H EFH F7H FFH
Endereço 0000H 0008H 0010H 0018H 0020H 0024H 0028H 002CH 0030H 0034H 0038H 003C
Figura 3.12 – Tabela de vector de Interrupções do 8085

Como foi referenciado o periférico que solicita a interrupção deve providenciar o mecanismo
para que a instrução a ser executada pelo microprocessador logo a seguir ao reconhecimento
da interrupção esteja localizada num dos endereços aprersentados na tabela acima. Para o
8085 ( e para o 8080) esta instrução deve ser uma das instruções RST n onde ( n varia de 0 a
7) pois cada uma destas instruções equivale a um JUMP para um dos endereços apresentados
na tabela de vectores de interrupções. Portanto logo que o periférico receber o sinal de
reconhecimento de interrupção vindo do µP este deve apresentar no barramento de dados um
valor binario que representa o codigo binário da instrução RST n. A figura 3.13 ilustra um
circuito básico que permite o periférico a gerar e enviar para o µP a instrução RST n.

Barramento
de dados
8085

INTA

1Y1 1Y2 1Y3 1Y4 2Y1 2Y2 2Y3 2Y4


G1
1A1 1A2 1A3 74ALS 2442A3
1A4 2A1 2A2 2 G2
Vcc

Micro-interruptores

Fig.3.12 – Micanismo simples de implementação de vector de interrupções


No circuito acima, a comutação dos oito micro-interruptores para a posição ON ou OFF
permitirá a aplicação a entrada do “buffer” 74ALS244 de qualquer valor (binário) compreendido
entre 00H a FFH para gerar qualquer uma das oito instruções RST n . Por exemplo, se a rotina
de atendimento do periférico inicia no endereço 0020H então os micro-interruptores do circuito
da figura 3.12 devem ser posicionados de modo a gerar o código binário da instrução RST 4
(11100111 ou E7H) para ser aplicado na entrada do “buffer”. Deste modo, logo que o
Microprocessor and Microcontrollers Page 74 of 92

SEL
microprocessador emitir o sinal de reconhecimento da interrupção (INTA) o “buffer 74ALS244
estará habilitado e o microprocessador poderá ler o código binário da instrução e leva-ló para o
registo de instruções.

O CONTROLADOR PROGRAMÁVEL DE INTERRUPÇÕES PIC-8259A

O PIC-8259A é um dispositivo da Intel concebido para fazer a gestão de interrupções tanto


para microprocessadores de 8 bita (8085 e 8088) como também para o 8086 minimizando
deste modo a sobrecarga do microprocessador no atendimento de pedidos de interrupção.

As funções básicas do PIC-8259 são:


● Receber sinais de pedidos de interrupções vindos de oito periféricos, multiplexá-los para
depois gerar um único sinal a ser aplicado a entrada de pedido de interrupção do
microprocessador.
● Gerar o vector de interrupções para qualquer um dos oito locais da tabela de interrupções.
● Gerir perioridades nos pedidos de interrupções de acordo com um esquema pré-estabelecido
● Mascarar entradas de pedidos de interrupções individualmente.
● Permitir a leitura por parte do microprocessador do estado de cada uma das oito entradas de
pedido de interrupção.
● Gerar sinal de pedido de interrupção do tipo “Level –triggered” ou “edge-triggered”.
● Permitir a expansão de entradas de pedidos de interrupção até 64linhas de entrada.
● Permitir a configuração de modo a poder ser conectado com o 8085 ou com o 8066/8088

Como foi mencionado o PIC-8259 tem oito entradas de pedidos de interrupção mas incorpora
um bloco que permite a coneção em cascata de até oito circuitos deste género de modo a se
poder lidar com 64 pedidos de interrupção.
A figura 3.13 mostra o esquema em blocos do PIC-8259A

Fig.3.13 – Esquema em blocos do PIC-8259A

“Data Bus Buffer” - como se pode notar da figura 3.13 a conecção (linhas de dados) entre o
PIC-8259A e o microprocessador é feita através das oito linhas de dados D0 – D7 que partem
do bloco designado por “Data Bus Buffer”. Este bloco é essencialmete constituido de 8 “3-State

Microprocessor and Microcontrollers Page 75 of 92


buffers” bi-direcionais que serve de interface entre o PIC-8259 e o barramento de dados do
microprocessador.

Read/Write Logic – Este bloco recebe os sinais de controle vindos do µP e gera e os diversos
sinais que permitem habilitar o “chip” em si e os diversos registos internos para poderem
receber e/ou enviarem dados da CPU. Os sinais que são conectados a este bloco são:

CS – Um sinal de nível Low nesta entrada habilita o chip para que este possa se comunicar
com o µP.
WR - Um sinal de nível Low nesta entrada permite o µP enviar para PIC-8259A comandos de
controle para a configuração do chip.

RD - Um sinal de nível Low nesta entrada permite o PIC-8259A envir para a CPU os estados
do registo de interrupções (IRR), do registo de interrupção em serviço (ISR) do registo de
mascramento de interrupções (IMR) ou ainda dos níveis de interrupções.

A0 – Esta entrada é usada em conjunto com os sinais WR e RD no envio, por parte da CPU,
dos vários comandos para o PIC-8259A e na leitura dos registos de estado. Esta linha é
conectada directamente com uma das linhas de endereço do µP.
A figura abaixo mostrao exemplos típicos de conecção do PIC-8259A com o microprocessador

Bloco de controlo (Control Logic) – Neste bloco está implementada toda a lógica que
permite comandar o modo de operação deste controlador. Para o efeito, este bloco contém
registos de inicialização (Initialization Command Word Registers – ICW) e registos de
comandos de operação ( Operation Comando Word Registers – OCW). É através destes
registos que o controlador recebe comandos da CPU para a configuração do modo de
operação do circuito no seu todo. Este bloco permite também a leitura, por parte da CPU, de
alguns destes registos e, deste modo, fazendo com que a CPU possa se inteirar do estado do
controlador. É também a responsabilidade deste bloco gerar o sinal de pedido de interrupção –
INT - que é enviado para o microprocessador e receber do microproprocessador o sinal de
reconhecimento da interrupção- INTA.

Registo de Pedido de Interrupções (IRR) - Este é um registo de oito bits que está conectado
as oito linhas que recebem os sinais de pedido de interrupção vindas dos periféricos. Portanto,
este registo recebe e armazena todas as solicitações de interrupções que chegam dos
periféricos.

O bloco de gestão de prioridades (Periority Resolver) – Este é também um registo de oito


bits que recebe do registo de interrupções os bits que estão activados e, de acordo com a
prioridade estabelecida para cada uma das entradas, passa para o registo de interrupções em
serviço, no memento em que o microprocessador envia o sinal de reconhecimento de
interrupção, aquele pedido de maior prioridade.

O registo de interrupções em serviço (ISR) – Este é também um registo de oito bits em que
apenas o bit correspondente ao pedido de interrupção de maior prioridade determinada pelo
módulo “Periority Resolver” é activado. Portanto este registo contém o pedido de interrupção
que está sendo atendido .

O registo de mascramento de interrupções (IMR) contém os bits das entradas de


interrupções que estão mascaradas, isto é, aquelas que mesmo ocorrendo, não deverão ser
atendidas.

Microprocessor and Microcontrollers Page 76 of 92


O bloco de conecção em cascata (Cascade Buffer/Comparator) controla a conecção de
dois ou mais PIC-8259A permitindo deste modo que o µP possa ser conectado a mais que oito
periféricos que podem emitir um pedido de interrupção. Para este efeito, as linhas CAS0 –
CAS2 constituem um barramento “privado” do chip que permitem a comunicação entre os
PIC-8259A quando estes estão interligados. Estas linhas comportam-se como linhas de saida
quando o PIC-8259A é configurado para funcionar como “Master” e comportam-se como linhas
de entrada quando o PIC-8259A é configurado para funcionar como “Slave”. Com estas linhas
o PIC-8259A “Master” envia um dado de três bits que constitue a identificação (ID) do “Slave”
que deverá estar a ser atendido pela CPU, para um dado pedido de interrupção.

Fig.3.14 – Conecção do PIC-8259A com o µP

Fig.3.14 – Conecção do PIC-8259A em casta

Como vem ilustrado na figura 3.14 a determinação se o PIC-8259A funciona como “Master” ou
“Slave” é feita conectando o pino SP/EN no nível “High” (Vcc) para configurar como Master ou
então no nível “Low” ( GND) para configurar como “Slave”. Nesta configuração apenas o pino
de pedido de interrupção (INT) do PIC-8259A “Master” é conectado ao µP. Os pinos de
Microprocessor and Microcontrollers Page 77 of 92
pedido de interrupção dos PIC-8259A “Slaves” são conectados as etradas de pedido de
interrupção do PIC-8259A “Master”.

Sequência de eventos no pedido de interrupção


Quando o PIC-8259A é conectado ao 8085 a sequência de eventos que têm lugar quando um
periférico solicita um pedido de interrupções é a seguinte:

1- Uma ou mais linhas de entradas de pedidos de Interrupção são levados ao nível “High”
pelo periférico que solicita a interrupção activado deste modo o bit ou bits correspondentes
no IRR.

2- O PIC-8259A avalia estes pedidos e, caso seja necessário, gera e envia o pedido de
interrupção para o µP.

3- Quando o µP reconhece o pedido de interrupção acitva (nível lógico Low) a INTA .

4- Oquando o PIC-8259A recebe o sinal INTA da CPU o bit correspondente ao pedido de


maior prioridade (caso haja mais que um pedido em simultâneo) é activado no ISR e o bit
correspondente é desactivado no IRR. Ao mesmo tempo o PIC-8259A envia para o
barramento de dados o código binário 11001101 (CDh) que corresponde a instrução CALL
para o 8085.

5- O microprocessador lê o código da instrução CALL para o registo de instruções e de


seguida emite dois novos pulsos INTA para o PIC-8259A.

6- Estes dois pulsos fazem com que o PIC-8259A envia para a CPU através do barramento
de dados, o endereço pre-programado da rotina de serviço do periférico que está
solicitando a interrupção. No primeiro pulso INTA é emitido o byte menos significativo do
endereço e no segundo pulso o byte mais significativo.

7- Os três bytes emitidos pela PIC-8259A completam a instrução CALL. Quando o PIC-8259A
Funciona no modo AEOI (Automatic End Of Interruption) o bit do registo ISR é desactivado
nofim do terceiro pulso INTA . Caso contrário o bit da interrupção em serviço no ISR
mantem-se activado até que o µP envie para o PIC-8259A o comando do EOI ( End of
Interrution.

Os três bytes libertados pelo PIC-8259A para a CPU a seguir aos três pulsos de
reconhecimento do pedido de interrupção têm o seguinte formato:

Figura 3.15a - Conteúdo do primeiro byte


enviado pelo PIC-8259A para a CPU logo a
seguir o primeiro pulso de reconhecimento
da interrupção
Como foi acima mencionado, o primeiro byte que o PIC-8259A envia para a CPU é o
código da instrução CALL.

Microprocessor and Microcontrollers Page 78 of 92

Figura 3.15- b Figura 3.15 - c


Figura 3-15 – Conteúdo do 2o byte enviado pelo PIC-8259A para a CPU logo a seguir ao
segundo pulso de reconhecimento
Como foi visto nos capítulos anteriores, no
8085 o espaço reservado para a
implementação (ou melhor, início de
implementação) das rotinas de atendimento
das interrupções podem se de 4 bytes ou de
8 bytes. Assim, a figura 3.15-b mostra o
conteúdo do segundo byte que PIC-8259A
envia para a CPU para em que aquatro
bytes estão reservados para cada rotina de
serviço de interrupção. Repare que neste caso os cinco bits menos significativos são pré-
definidos pelo PIC-8259A e identificam cada uma das 8 entradas de pedido de interrupção
(IRn) enquanto que os restantes 3 mais significativos são inseridos no momento da
configuração do “Chip”.
A figura 3.15-c mostar o caso em que a cada rotina de atendimento da interrupção são
reservados 8 bytes. Para este caso, os 6 bits menos significativos identificam as entrada IR
enquanto que os 2 mais significativos são inseridos no momento da configuração.

Conteúdo do terceiro byte enviado pelo PIC-8259A para a CPU logo a seguir o primeiro pulso
de reconhecimento da interrupção INTA .é apresentado na figura 3.15-d. O conteúdo deste
byte é determinado no memento da configuração do “Chip”.

Figura 3.15 – c Conteúdo do terceiro byte enviado pelo


PIC-8259A para a CPU

Modos de Operação
Por modos de operação entende-se como sendo o modo como as perioridades de cada uma
das entradas de pedido de interrupção serào atendidas de acordo com as perioridades
estabelecidas para cada uma delas. Assim, o PIC-8259A possui os seguintes modo de gestão
de perioridades:
1 – Full Nested Mode – Este é o modo pré-definido em que o PIC-8259A atribui as
prioridades no atendimento de pedidos de interrupção. Neste modo, a entrada IR0 apresenta
a mais alta prioridade e, de forma seuqencial, a entrada IR7 é atribuida a prioridade mais
baixa. Neste modo é possível também selecionar e configurar a entrada da masi alta prioridade
e, as entradas subsequentes terão as prioridades a descrescer sequencialmente. Por exemplo,
se a entrada IR4 for configurada como a de prioridade mais alta então a sequencia de
prioridades irá decrescer de IR4 , IR5, IR6, IR7, IR0, IR1, IR2 ate IR3.

Rotação automática - Neste modo, quando uma entrada de pedido de interrupção é atendida,
esta passa automaticamente para a última prioridade e todas as outras entradas sofrem um
rotação de prioridades. Deste modo todas as entradas são consideradas como tendo a mesma
prioridade. Este modo de operação é ilustrado na figura que se segue.

Microprocessor and Microcontrollers Page 79 of 92


Estados de IRR

Prioridades

Mais Figura 3.16-a Mais


Baixa Alta

Estados de IRR

Prioridades
Mais Figura 3.16-b Mais
Alta Baixa
lta

Neste exemplo, a figura 3.16-a mostra uma situação em que duas entradas de pedido de
interrupção estão activadas. Neste caso IR3 será atendida. Quando a rotina de atendimento de
IR3 terminar esta entrada passa a ter a prioridade mais baixa tal como se ilustra na figura 3.16-
b. Todas as outras entradas sofrerão uma rotaç`ao nas prioridades.

Rotação Específica
Neste modo a entrada de prioridade mais baixa pode ser especificada dinâmicamente, através
do programa. As prioridades das entradas subsequentes terão a sequêcia crescente partindo
daquela que foi estabelecida como sendo a de mais baixa.
Para além destes três modos de operação o PIC-8259A possui outros modos de operação
cujos detalhes podem ser encontrados em manuais específicos deste “Chip”.

Programação do PIC-8259A

A programação do PIC-8259 é um processo que tem por objectivo configurar o chip de modo a
poder operar de acordo com as especificações do sistema onde o chip está incorporado. A
programação do “chip”compreende duas fases distintas nomeadamente a inicialização e a
configuração do modo de operação. A inicialização do PIC-8259 é levado a cabo antes deste
começar a operar no sistema. Só após a inicialização é que o PIC-8259 terá a informação
indispensável para poder exercer funções básicas no sistema.
O processo de inicialização consiste no envio por parte da CPU de uma sequência de dois a
quatro Palavras de Inicialização (Initialization Command Words – ICW). Ests palavras de
inicialização configuram os vários parâmetros necessários para a operação do 8259 tais como
o carregamento dos vetores de Interrupção, a quantidade de bytes reservadas a cada (o
início) rotina (4 bytes ou 8 bytes), o tipo de pulso que deve ser aplicado a intrada IR do PIC-
8259 (Level trigged ou edge trigged), se no sistema está apenas um PIC-8259 ou alguns
conectados em cascata, se o PIC-8259 está conectado ao μP 8085 ou ao 8086/8088, etc.
O fluxograma e as tabelas que se seguem mostram a sequência de inicialização e alguns dos
parâmetros de inicialização do PIC-8259.

Microprocessor and Microcontrollers Page 80 of 92


Conectado em
cascata

ICW4
necessário?
Funcionamnto no modo
pre-defnido

Pronto para aceitar interrupções

Fig. 3.17 – Fluxograma de inicialização do PIC - 8259

Como se pode observar no fluxograma da figura 3.17, dependendo do modo como PIC- 8259 é
usado num dado sistema, a inicialização pode requere entre duas a quatro palavras de
inicialização designadas por ICW1 , ICW2, ICW3 e ICW4. As funções de cada uma destas
palavras de inicialização são descritas a seguir.

1 - ICW1
A configuração do PIC- 8259 começa com o envio da palavra de inicialização ICW1
(Initialization Command Word 1). O PIC- 8259 reconhece um determinado byte para ele
enviado como correspondendo a ICW1 na base de dois critérios:
1 – A entrada A0 do PIC- 8259 está no nível lógico 0 (zero). Repare que esta entrada é
conectada a linha de endereço A0.
2 – O bit D4 da palavra está no nível lógico 1.

A função de ICW1 é informar ao PIC- 8259 como este está sendo usado no sistema como por
exemplo no modo simples ou em cascata, Interrupção de tipo Edge Trigged ou Level Trigged, a
faixa de separação dos endereços das rotinas que servem as interrupções (4 bytes um do
outro ou 8 bytes um do outro), se a quarta palavra de inicialização será necessária ou não, etc.
Os detalhes do significado de cada um dos bits do ICW1 são apresentados na figura 3.18.

Microprocessor and Microcontrollers Page 81 of 92


ICW1

Fig. 3.18 Formato de ICW1 do PIC - 8259


ICW2

Como se pode do quadro acima, quando o PIC-8259 está conectado ao 8080 ou 8085 os três
últimos bits (D5 – D7) da primeira palavra de inicialização formam uma parte do bytes menos
significativo do endereço das rotinas de serviço das interrupções. Quando o intervalo entre os
endereços de chamada das rotinas é de 4 bytes os três bits são usados na formação do
endereço tal como se apresenta no quadro . Quando se usa um intervalo é de 8 bytes apenas
bits D7 e D6 são usados. Neste caso D5 é ignorado (Don’t care). Quando o PIC-8259 é
conectado ao 8086 ou 8088 estes três bits podem assumir valorres lógicos 0 ou 1.
Os quadros que se seguem mostram o modo como estes bits são usados na formação do byte
menos significativo do endereço de serviços das rotinas:

Microprocessor and Microcontrollers Page 82 of 92


D7 D6 D5 D4 D3 D2 D1 D0 D7 D6 D5 D4 D3 D2 D1 D0
A7 A6 1 1 1 0 0 0 IR7 A7 A6 A5 1 1 1 0 0 IR7
A7 A6 1 1 0 0 0 0 IR6 A7 A6 A5 1 1 0 0 0 IR6
A7 A6 1 0 1 0 0 0 IR5 A7 A6 A5 1 0 1 0 0 IR5
A7 A6 1 0 0 0 0 0 IR4 A7 A6 A5 1 0 0 0 0 IR4
A7 A6 0 1 1 0 0 0 IR3 A7 A6 A5 0 1 1 0 0 IR3
A7 A6 0 1 0 0 0 0 IR2 A7 A6 A5 0 1 0 0 0 IR2
A7 A6 0 0 1 0 0 0 IR1 A7 A6 A5 0 0 1 0 0 IR1
A7 A6 0 0 0 0 0 0 IR0 A7 A6 A5 0 0 0 0 0 IR0

a b
Fig. 3.19 - Obtenção do vectore de interrupções; a - endereços separados em 4
bytes; b – Endereços separados em 8 bytes
No caso em que a separação dos endereços é de 4 bytes o PIC-8259 gera os seis primeiros
bits do byte menos significativo do vector de interrupção enquanto os dois bits mais
significativos provem de de ICW1.
No caso em que a separação dos endereços é de 8 bytes o PIC-8259 gera os cinco primeiros
bits do byte menos significativo do vector de interrupção enquanto os três bits mais
significativos provem de de ICW1. Repare que neste caso o PIC-8259 multiplics o numero de
interrupção por 4 para gerar estes primeiros cinco bits do vector de interrupção

Repare-se que quando se trata de ICW1 (primeira palavra de inicializaçào) D4 deve estar
necessariamente em 1.
Quando o PIC-8259 é usado com o 8080/8085, a quarta palavra de inicialização (ICW4) tanto
pode ser necessária como também pode ser ignorada. Nestas condições, se PIC-8259 não
receber ICW4 então as funções determinadas por esta palavra de inicialização estarão no
modo pré-defionido.

2 - ICW2

Logo a seguir ao envio de ICW1 o PIC-8259 fica a espera de receber a segunda palavra de
inicialização – ICW2. No 8080/8085 o conteudo de ICW2 é constitui o byte mais significativo
dos endereço de chamada das rotinas de serviço das interrupções tal como se mostra no
quadro que se segue.

D7 D6 D5 D4 D3 D2 D1 D0
A7 A6 A5 A4 A3 A2 A1 A0

Fig. 3.20 - Formato do ICW2

3 – ICW3
Esta palavra de inicialização apenas é enviada para o PIC-8259 se o bit SNGL de ICW1 for
tiver sido atribuido o valor 0. Se SNGL for 1 a palavra que se segue a ICW2 será interpretada
como sendo ICW4 se A0 for 1 e IC4 vindo de ICW4 for 1. Caso contrário esta palavra será
interpretada como sendo uma das palavras de comando.
ICW3 também tem duas interpretações dependendo se o o PIC-8259 é usado como Master ou
Slave.

Microprocessor and Microcontrollers Page 83 of 92


a
b

Fig. 3.21 – Funções de ICW3 ; a - PIC-8259 como Master; b – PIC-8259 como Slave

Quando o PIC-8259 é usado como Master, os oito bits de ICW3 são usados para indicar quais
as entrdas estão conectadas a saida de outros PIC-8259 que foram configurados como Slaves
no sistema.
Quando o PIC-8259 é usado como Slave ICW3 indica para que entrada do Master este Slave
estará conectado. Neste caso apenas os três bits menos significativos sào usados para este
efeito. O quadro da figura 3.22 mostra o formato ICW3 quando o o PIC-8259 é usado como
Slave.

Fig. 3.22 – Identificação da entrada do


Master a que o Slave está
conectado

ICW4 – Esta palavra de inicialização é enviada para o PIC-8259 apenas se o bit IC4 d ICW1
estiver activado. O propósito desta palavra de inicialização é configurar o PIC-8259 para
operar num modo diferente do modo pré-definido. O modo pré-defenido equivale a carregar
ICW4 com o valor 00H. O formato e as tarefas de ICW4 são apresentados na figura 3.23.

Fig. 3.23 – Formato de ICW4

Microprocessor and Microcontrollers Page 84 of 92


Os bits D7 a D5 são mantidos no nível lógico zero (0).

D4 – SFNM: Este bit é usado para selecionar o modo de operação designado por Special Full
Nested Mode. Este modo de opereração só pode ser selecionado quando existem mais que
um controlador conectados em cascata. A operação em SFNM equivale ao modo de operação
Full Nested Mode já visto para o caso de utilização de um simples PIC-8259 com a
particularidade de apenas as entrads de maior prioridade do Slave que está sendo atendido
poderem ser atendidas. No SFNM apenas o Master é que precisa ser programado.

D3 – BUF: Este bit informa o PIC-8259 se a saida de dados D0 a D7 são conectados a um


Buffer ou não. Se a saida de dados vão dar a um buffer então o pino designado por SP/EN
torna-se num pino de saida cujo sinal é usado para servir de anable para o buffer conectado
as saidas D0 a D7. Assim, se o bit BUF for zero (0) a saida do PIC-8259 não está conectada a
um buffer . Neste caso (1) o bit M/S é ignorado (don’t care) e (2) o pino SP/EN é usado como
entrada para informar o despositivo se está sendo usado como Master (Pino 16 = High) ou
Slave (pino 16 = Low). Num sistema que usa apenas um PIC-8259 esta entrada deve ser
conectyada permanentemente ao nivel High. Por outro lado, se BUF for 1 então a saida de
dados D0 a D7 do PIC-8259 vão dar a um beffer. Um sinal de anable será gerado no pino 16
(SP/EN) e o bit M/Sserá usado para determinar se um dado PIC-8259 é usado como Master ou
Slave.

D2 – M/S – Este bit determina se um dado PIC-8259 está sendo usado como Master ou Salve.
Este bit só tem sentido quando o bit BUF está no nível “High”.

D1 – AEOI - Este bit determina se o PIC-8259 recebe a informação do fim de atendimento da


interrupção (End Of Interrupt) vinda da CPU (através da própria rotina de atendimento da
interrupção) ou gerar o seu próprio sinal de EOI logo que receber o último pulso de
reconhecimento de interrupção vindo do microprocessador.

Comando de operação

Logo que o processo de envio de comandos de inicialização termina o PIC-8259 encontra-se já


pronto para receber e processar pedidos de Interrupção. Entretanto, enquanto o dispositivo se
encontra em operação este pode receber do microprocessador comandos que permitem
modificar a configuração inicial do modo de operação através do envio por parte da CPU dos
chamados Operation Command Words (OCW). Em qualquer momento o PIC-8259 pode
receber comandos de operação vindas da CPU para alterar o seu modo de operação.
Existem três comandos de operação designadas por OCW1, OCW2 e OCW3. As funções de
cada um destes comandos são de seguida descritas.

OCW1 – Esta palavra de controle é usada para determinar quais as entradas de pedido de
interrupção se pretende que estejam activas e quais é que se pretende que estejam inibidas. O
comando de controle OCW1 é escrito no registo de mascaramento de interrupções (IMR).
Cada posição de bit deste registo corresponde a posição de uma entrada de pedido de
interrupção. O formato de OCW1 é apresentada no quador que se segue.

Fig. 3.24– Formato de OCW1

Microprocessor and Microcontrollers Page 85 of 92


Assim, para mascarar (inibir) uma dada entrada de pedido de interrupção é necessário colocar
na posição correspondente do registo IMR o valor binário 1 enqunato que o valor binário 0
permite que um pedido de interrupção na entrada respectiva possa ser atendido. Por exemplo
se o conteúdo de OCW1 for 34H (00110100b) as entrads IR2, IR4 e IR5 estarão desactivadas.
Entretanto, um pedido de interrupção aplicado a uma entrada que se encontra mascarada não
se perde por completo pois este pedido é memorizado no registo IRR e poderá ser atendida
logo que esta entrada for activada.

OCW2 - Este comando de operação é usado para especificar o tipo de de comando do fim de
interrupção (EOI específico ou EOI não específico), e estabelecer a rotação das perioridades
no atendimento das interrupções. Os bits D4 e D3 devem ser mantidas em zero (0). Os bits D7,
D6, D5, D2, D1 e D0 devem ser programados de acordo com os quadros que se seguem.

Fig. 3.25– Formato de OCW2

Repare que os bit R, SL e EOI (D7, D6 e D5 reapectivamente) especificam o tipo de rotação de


perioridades das entradas de pedido de interrupção enquanto que os bits L2, L1 e L0 (D2, D1 e
D0 respectivamente) especificam a entrada de pedido de interrupção alvo dessa rotaçào.

OCW3 – Este comando de operação tem duas funções básicas nomeadamente a verificaç`ao
do estado dos registos (IRR e ISR) e o macaramento de entradas de pedidos de interrupção.

Endereçamento do PIC- 8259

Dois aspectos deve se ter em conta no endereçamento do PIC- 8259 nomeadamente:


A entrada designada por CS (chip Select) estiver no nível lógico zero(0).
A seleção dos vários registos internos do PIC- 8259 depende do estado da entrada A0 (pino de
endereço) e do estado de alguns bits específicos das palavras de comando (ICW1, OCW2 e
OCW3). Assim, dois endereços consecutivos em que o bit menos significativo varia de zero a 1
são necessários para endereçar o PIC- 8259. A figura que se segue mostra o exemplo de um
circuito típico de descodificação do endereço do PIC- 8259.

Microprocessor and Microcontrollers Page 86 of 92


Fig. 3.25– Circuito típico de endereçamento do PIC- 8259

Repare-se a entrada A0 do PIC- 8259 é conectada directamente a linha de endereços AD0. O


circuito 82c338 é um descodificador de endereços de três entradas por duas saidas. O sistema
usa o endereços 18h (0001 1000b) e 19h (0001 1001b). A saida Y6 do descodificador HPL-
82c338 é usada para a activação (nível Lógico 0) da entrda CS do PIC- 8259. Esta entrada
será activada quando as entrdas A, B e C do descodificador tiverem os valores lógicos 0, 1 e 1
respectivamente.

Microprocessor and Microcontrollers Page 87 of 92


Microprocessor and Microcontrollers Page 88 of 92
Microprocessor and Microcontrollers Page 89 of 92
Quando a fase de inicialização do chip estiver completa o PIC-8259 estará já pronto para
aceitar os pedidos de interrupção de periféricos, analiza-las e gerar um sinal de pedido de
interrupção ao μP. Entretanto, durante a operação o PIC-8259 pode receber da CPU comandos
que determinam o modo de operação do “Chip”. Estes são os chamados palavras de comando
de operação

IO/M

WR

G1 G2

IO/M

Microprocessor and Microcontrollers Page 90 of 92


Microprocessor and Microcontrollers Page 91 of 92
Microprocessor and Microcontrollers Page 92 of 92

Você também pode gostar