Você está na página 1de 2

1 APD_2013_2_P3.

doc
UnB FT ENE
167 746 Arquitetura de Processadores Digitais 2013/2
Prova 3 Interfaceamento com PC 12 de Dezembro de 2013
Consulta Livre Durao da Prova: 100 minutos

Nome: _________________________________ Matrcula:___________________

1
a
Questo (5,0 pontos) DMA e Interrupo
A figura apresenta o uso alternado dos canais 0 e 1 do conversor ADC0808. A entrada START do
ADC acionada por um relgio de 10 Hz e os dados digitalizados so escritos na memria com o
uso do canal 3 de DMA. O ADC deve digitalizar alternadamente os canais 0 e 1, isto significa que
cada canal digitalizado com a taxa de 5 Hz. Ele iniciado com o canal 0. O sinal de fim de
converso (EOC) deve interromper a CPU usando a IRQ2. A sada analgica feita por dois
conversores DAC8080. O ADC0 d sada mdia ponderada (veja equao abaixo) dos dados
relativos ao canal 0 e o ADC1 mdia ponderada dos dados relativos ao canal 1. Entre uma
converso e outra a CPU deve ler o buffer e calcular as duas mdias ponderadas.




( ) ( ) ( ) ( ) ( ) ( ) ( ) ( )
128
7 6 5 2 4 4 3 8 2 16 1 32 64 + + + + + + +
=
n n n x n x n x n x n x n x
) n ( MediaP
Esta mdia ponderada interessante por fazer a filtragem do rudo, ao mesmo tempo em que d
maior peso s amostras mais recentes e esquece as mais antigas.

Pedidos:
As variveis char far buffer [16], char far *mediap0 e char far *mediap1, esto declaradas como
variveis globais e j inicializadas. No espao alocado para o buffer no existe fronteira de pgina
de 64 KB. Voc pode declarar outras variveis globais.
a) (1,0) Escreva a rotina void prep_dma_adc (void), que executa as aes necessrias para o
ADC transferir para a memria via canal 3 de DMA.
b) (1,0) Escreva a rotina void prep_dma_dac_0 (void), que executa as aes necessrias para
que o DAC0 d sada media, empregando o canal 0 de DMA.
c) (1,0) Escreva a rotina void prep_dma_dac_1 (void), que executa as aes necessrias para
que o DAC1 d sada media, empregando o canal 1 de DMA.
2 APD_2013_2_P3.doc
d) (1,0) Escreva a rotina void prep_irq2 (void), que faz todas as preparaes necessrias para o
funcionamento da interrupo IRQ2.
e) (1,0) Escreva a rotina void interrupt rot_irq2 (void), que atende interrupo IRQ2, faz a
troca de canal do ADC e chama a rotina que calcula uma das mdias. Considere que est
disponvel a funo void adc_canal (int canal) que programa o canal no ADC. Para
cancelar o pedido de interrupo IRQ2 preciso de uma escrita no endereo CS0.
f) (1,0) Escreva a rotina void rmedia (void) que, em funo da ltima transferncia por DMA,
calcula uma das mdias, a do canal 0 ou a do canal 1, e a escreve na posio correta
(*mediap0 ou *mediap1).
g) (1,0) Escreva a rotina void finaliza (void), que finaliza o programa, interrompendo os canais
de DMA e restaurando a interrupo pra a condio original.

2
a
Questo (3,0 pontos) Porta Serial e Interrupo


A figura ao lado apresenta uma
soluo para se testar o limite de
velocidade de uma comunicao serial
para um dado comprimento de cabo. O
PC transmite e verifica se consegue
receber os mesmos dados.

Escreva o programa void testa_serial (void) que testa todas as velocidades possveis,
igual ou superior a 9.600 bps. O teste com um nico valor falho, por isso usado um padro com
100 valores. Use dois vetores de tamanho 100: vetor_tx[100]=(0, 1, 2, ..., 99) e vetor_rx[100]. O
vetor_tx contm o padro a ser transmitido e a recepo deve ser armazenada em vetor_rx. O
programa principal faz as inicializaes, seleciona uma velocidade e d incio ao ensaio.
obrigatrio o uso da interrupo serial. Quando terminar a transmisso e a recepo, o programa
principal verifica se houve erros e, caso negativo, inicia um novo ensaio para uma velocidade
maior. Espera-se que ao final, o programa imprima na tela: velocidade mais alta = xxxx bps.
Deixe claro o programa principal e a rotina de interrupo.
Use: COM1 (IRQ4) com 8 bits de dados, 2 de parada e sem paridade.
Trabalhe com os nomes dos registradores seriais: TXB, RXB, DLL, DLM, IER, IIR, LCR, LSR.

int i,vetor_tx[100]; //padro a ser transmitido
int j,vetor_rx[100]; //guardar o que for recebido
int flag; //varivel auxiliar
void interrupt (*antigo) (void);

void testa_serial (void){
declarao de variveis;
for (i=0; i<100; i++) vetor_tx[i]=i;
...
}

void interrupt int_ser(void){

}

Você também pode gostar