8
0
RD
8
5 WR
A ALE
2 – Linhas de Endereços
3 – Linhas de Dados
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
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 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.
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.
● Busca de Opcode
● Leitura de memória
●Escrita na memória
T1 T2 T3 T4 T1 T2 T3
Ck
AD7-AD0
00H 06H 01H 24H
ALE
IO/M
RD
M1 M2 M3 M4
T1 T2 T3 T4 T1 T2 T3 T1 T2 T3 T1 T2 T3
Ck
ALE
IO/M
RD
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
T1 T2 T3 T4 T1 T2 T3
Ck
AD7-AD0
00H 77H L
Dado vindos do Ac
ALE
IO/M
RD
WR
Dado vindo
AD7-AD0 00H DBH 01H 80H 80H
de I/O
ALE
IO/M
RD
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.
Dado indo
AD7-AD0 00H D3H 01H 84H 84H
para I/O
ALE
IO/M
RD
WR
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.
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.
Barramento de Endereço
Descodificador
de RAM ROM
8085 endereços
Barramento de dados
Barramento de controle
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.
Reservado ao
sistema 2000H - 3FFFH
8Kbytes operativo
ROM
Reservado para
8Kbytes o uso do 0000H - 1FFFH
sistema
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
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
Microprocessor andDescodificador
Microcontrollers Page 11 of 92
de
Endereços
EN
A14 – A15
A15 A14 A13 A12 A11 A10 A9 A8 AD7 AD6 AD5 AD4 AD3 AD2 AD1 AD0
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.
Mapa de I/O
Dispositivo 7 2FE0H – 2FFFH
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.
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
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.
FFFFH
FFH
5FH
I/Os 0 - 7
40H
0000H
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.
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.
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
D7 D6 D5 D4 D3 D2 D1 D0
S Z AC P CY
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.
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 é:
STA dado (16 bits) – Levar o conteúdo do acumulador para o local de memória
apontado pelo operando dado.
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
MVI B, F8H
MOV M , A
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:
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.
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.
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
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:
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.
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
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
CY Acumulador
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)
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.
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.
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.
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.
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.
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.
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
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.
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.
POR PSW – O conteudo do topo da pilha é levado para o registo de estado e o byte seguinte
da pilha é levado para o Acumulador.
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).
Desactivar o
flip-flop de
RST 7.5
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?
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
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
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:
(N-1)
(N-1)* *(n(nx xDD
NOP + DDCR + DJNZ ≠0)
NOP + DDCR + DJNZ ≠0) + (n x DNOP + DDCR + DJNZ=0)
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.
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
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
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
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
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
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.
O0
OUT 08H ; Resetar as saidas
I7
I0
de entrada
loop1: IN 09H ; Ler a entrada dos switches
Entrada
Porta
de
não
N
B
N
B
E
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
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.
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”.
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
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
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.
Operações de saida
Desabilitar
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
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
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
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 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
Funcionamento no modo 0
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 A
1 = input
0 = output
Port A Modo 1
Modo de Operação
1 = I/O mode
0 = BSR Mode
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.
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.
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
74LS244
AD0 AD7
AD0 AD7
A8 A15
8085
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
OBS:
f = 2 MHz
N-Pulsos = 40
T = 40x0.5µS = 20 µS
N-Loops = 1000000 µS/20 µS = 50000d
50000d = C350H
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 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
1 0 0 0 1 0 0 1
Grupo B no modo 0
Modo I/O
Endereços:
C0H Porta A
C1H Porta B
C2H Porta C
C3H Registo de controle
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
A B A B
Duas linha de
Uma linha de transmissão
transmissão apenas (full-duplex)
(half-duplex)
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.
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.
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.
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).
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
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.
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.
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.
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
D0
AD0
D7
AD7
A8
A15
CONTROLADOR DE INTERRUPÇÒES
CPU
RAM
I/O1
I/O2
ROM
I/O3
I/On
RAM
I/O1
I/O2
ROM
I/O3
I/On
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
Micro-interruptores
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.
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
“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
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 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 .
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”.
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.
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:
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”.
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.
Prioridades
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.
ICW4
necessário?
Funcionamnto no modo
pre-defnido
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.
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:
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
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.
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.
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.
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.
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”.
Comando de operação
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.
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.
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.
IO/M
WR
G1 G2
IO/M