Laboratório de Arquitetura de Processadores Digitais 01/2016
Experimento 9. Comunicação Serial no PC com Interrupção
OBJETIVO:
Implementar um programa de chat que funcione via porta serial entre dois PCs, em ambiente MS-DOS. Os caracteres inseridos no PC1 devem ser transmitidos ao PC2, o qual deve mostrar os caracteres na tela. Ao mesmo tempo, caracteres inseridos no PC2 devem ser transmitidos ao PC1 e mostrados na tela deste. O programa deve ser implementado utilizando a interrupção da porta serial.
DESCRIÇÃO:
O controle da interrupção no PC é feito através do controlador 8259. Assim como o controlador 8250, o controlador 8259 também pode ser acessado diretamente através das funções outportb() e inportb(). Na verdade, para possibilitar um maior número de interrupções, o PC utiliza dois controladores 8259. Os registradores mais importantes desses controladores são:
Primeiro 8259 Segundo 8259 Registrador Acesso a qualquer instante
20H A0H ICW1 sim
21H A1H ICW2 não
21H A1H ICW3 não
21H A1H ICW4 não
21H A1H OCW1 sim
20H A0H OCW2 sim
20H A0H OCW3 sim
Dentre esses registradores, os mais importantes no momento são o OCW1 (operation command word – palavra de controle da operação) e OCW2.
Os bits do registrador OCW1 são utilizados para ativar ou desativar as interrupções e, juntos, são chamados de máscara da interrupção. O bit de máscara desabilita (bit = 1) ou habilita (bit = 0) a interrupção. A descrição dos bits desse registrador encontram-se na Figura 1. Deve-se tomar cuidado quando se utiliza esse registrador, para que não sejam alterados os estados dos outros bits (que cuidam de outras interrupções) e para que seu valor seja retornado ao fim do seu programa.
Laboratório de Arquitetura de Processadores Digitais 01/2016
M7
IRQ0
M4 M3 M2 M1 M0OCW1
D7 D6 D5 D4 D3 D2 D1 D0
M6 M5
IRQ1
IRQ2IRQ3
IRQ4
IRQ5IRQ6
IRQ7
1 - Interrupção não ocorre0 - Interrupção pode ocorrer
Figura 1: Descrição do registrador OCW1
Quando a interrupção é servida, no retorno da sua função, deve-se apagar o pedido da interrupção, para que a próxima interrupção possa ser servida. Isso é feito ativando o bit EOI do registrador OCW2 do controlador 8259.
R 0 0 L2 L1 L0OCW2
D7 D6 D5 D4 D3 D2 D1 D0
SL EOI
Prioridade das Interrupções
001 – Fim da Interrupção
Figura 2: Descrição do registrador OCW2
Outros registradores importante são os registradores MCR e IER, encontrado no controlador 8250.
COM2 COM1 Registrador Nome Bit DLAB/LCR
2F8H 3F8H TxB Buffer de Transmissão 0 (escrita)
2F8H 3F8H RxB Buffer de Recepção 0 (leitura)
2F8H 3F8H DLL Latch para divisor (LSB) 1
2F9H 3F9H DLM Latch para divisor (MSB) 1
2F9H 3F9H IER Habilitador de Interrupção 0
2FAH 3FAH IIR Identificador de Interrupção -
2FBH 3FBH LCR Controlador de Linhas -
2FCH 3FCH MCR Controlador de Modem -
2FDH 3FDH LSR Estado de Linhas -
2FEH 3FEH MSR Estado de Modem -
2FFH 3FFH SCR Uso Geral -
Laboratório de Arquitetura de Processadores Digitais 01/2016
A interface dos pinos do registrador MCR é:
0Controla a
voltagem da saída DTR
LOOP OUT2 OUT1 RTS DTRMCR
D7 D6 D5 D4 D3 D2 D1 D0
0 0
Controla a voltagem da
saída RTSControla a saída OUT1
do 8250
Controla a saída OUT2 do 8250No PC, permite (quando ativado) que o
pedido de interrupção do 8250 seja diretamente conectado à IRQ alocada a
porta serialControla o diagnóstico LOOP BACK
Figura 3: Descrição do registrador MCR
A interface dos pinos do registrador IER é:
0
Interrupção por Dado Disponível
0 - - - -IER
D7 D6 D5 D4 D3 D2 D1 D0
0 0
Interrupção por THR Vazio
Interrupção por Estado de Linha de Recepção
Interrupção por Alteração no Estado do Modem
Em todos os casos:
0 – Desabilitado1 – Habilitado
Figura 4: Descrição do registrador IER
Depois que os registradores foram configurados corretamente, quando a interrupção ocorrer, a função guardada no vetor de interrupção do PC será chamada. Este vetor de interrupções contém ponteiros para funções do tipo:
void interrupt nomedafunção();
Dessa forma, deve-se escrever uma nova função com essa assinatura e inserir essa nova função no vetor de interrupções. Deve-se tomar cuidado para guardar o conteúdo anterior do vetor e restaurá-lo ao finalizar seu programa, para que o funcionamento do computador não seja alterado. O número das interrupções de interesse são:
Número Descrição
0BH IRQ3 – COM2/COM4
0CH IRQ4 – COM1/COM3
Laboratório de Arquitetura de Processadores Digitais 01/2016
Para alterar o vetor de interrupções, devem ser utilizadas as funções setvect() e getvect(), encontradas no cabeçalho dos.h.
setvect (int i, void interrupt(*ponteiro)());
void interrupt(*ponteiro)() getvect (int i);
Finalmente, para que o seu programa possa verificar o teclado sem que o controle seja trancado, pode-se utilizar a função kbhit() no cabeçalho conio.h .
int kbhit();
Essa função retorna um inteiro não-nulo se existir um caractere no buffer do teclado, caso contrário, retorna 0. Se existir um caractere no buffer do teclado, este pode ser lido com a função getch().
As demais configurações da porta serial funcionam da forma mostrada no Roteiro 8.
DADOS:
As instruções inportb() e outportb() são específicas dos compiladores da Borland. Portanto, o código em C deve ser compilado utilizando o Turbo C. Pode ser necessário rodar o programa TurboC dentro do DOSBOX, dependendo da sua versão do Windows.
Utilize as funções kbhit() e getch() da biblioteca conio.h para receber caracteres do teclado.
A função getch() recebe caracteres em formato ASCII, que é o mesmo formato usado pela função printf(). Porém, o caractere ENTER transmite apenas o Carriage Return (0DH). No seu programa, faça com que o enter transmita tanto o Carriage Return (0DH) e o Line Feed (0AH).
Utilize o caractere ESC para fechar o programa (1BH). Lembre-se de apagar o pedido de interrupção no setup do programa e toda vez que
uma interrupção for servida!
SUGESTÕES:
Utilize a diretiva #define para colocar os endereços das portas.
RELATÓRIO
O relatório é individual, e deve ser entregue impresso seguido o formato do IEEE. Em hipótese alguma será admitida a entrega do relatório de forma eletrônica. O relatório deve conter pelo menos os seguintes itens:
1. Introdução: Breve descrição sobre os elementos utilizados. (1 ponto)
2. Especificação: Descrição do sistema implementado. (0,5 ponto)
3. Implementação e prototipação: Descrição do sistema e comentários sobre os códigos
elaborados. Obs: Deve-se obrigatoriamente incluir os códigos e comentar todas as
linhas do código neste experimento. (7,5 pontos)
Laboratório de Arquitetura de Processadores Digitais 01/2016
4. Conclusão. Conclua o relatório. (1 ponto)