-APD_2014_1_P3_Treino
Short Description
Download -APD_2014_1_P3_Treino...
Description
UnB – FT – ENE 167 746 – Arquitetura de Processadores Digitais – 2013/2 Prova 3 – Interfaceamento com PC – 12 de Dezembro de 2013 Consulta Livre – Duração da Prova: 100 minutos Nome: _________________________________ Matrícula:___________________ 1a Questão (5,0 pontos) – DMA e Interrupção A figura apresenta o uso alternado dos canais 0 e 1 do conversor ADC0808. A entrada START do ADC é acionada por um relógio de 10 Hz e os dados digitalizados são escritos na memória 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 conversão (EOC) deve interromper a CPU usando a IRQ2. A saída analógica é feita por dois conversores DAC8080. O ADC0 dá saída à média ponderada (veja equação abaixo) dos dados relativos ao canal 0 e o ADC1 à média ponderada dos dados relativos ao canal 1. Entre uma conversão e outra a CPU deve ler o buffer e calcular as duas médias ponderadas.
64 ⋅ x(n ) + 32 ⋅ x(n − 1) + 16 ⋅ x(n − 2 ) + 8 ⋅ x(n − 3) + 4 ⋅ x(n − 4 ) + 2 ⋅ x(n − 5) + (n − 6 ) + (n − 7 ) 128 Esta média ponderada é interessante por fazer a filtragem do ruído, ao mesmo tempo em que dá maior peso às amostras mais recentes e “esquece” as mais antigas. MediaP( n ) =
Pedidos: As variáveis char far buffer [16], char far *mediap0 e char far *mediap1, estão declaradas como variáveis globais e já inicializadas. No espaço alocado para o buffer não existe fronteira de página de 64 KB. Você pode declarar outras variáveis globais. a) (1,0) Escreva a rotina void prep_dma_adc (void), que executa as ações necessárias para o ADC transferir para a memória via canal 3 de DMA. b) (1,0) Escreva a rotina void prep_dma_dac_0 (void), que executa as ações necessárias para que o DAC0 dê saída à media, empregando o canal 0 de DMA. c) (1,0) Escreva a rotina void prep_dma_dac_1 (void), que executa as ações necessárias para que o DAC1 dê saída à media, empregando o canal 1 de DMA. 1
APD_2013_2_P3.doc
d) (1,0) Escreva a rotina void prep_irq2 (void), que faz todas as preparações necessárias para o funcionamento da interrupção IRQ2. e) (1,0) Escreva a rotina void interrupt rot_irq2 (void), que atende à interrupção IRQ2, faz a troca de canal do ADC e chama a rotina que calcula uma das médias. Considere que está disponível a função void adc_canal (int canal) que programa o canal no ADC. Para cancelar o pedido de interrupção IRQ2 é preciso de uma escrita no endereço CS0. f) (1,0) Escreva a rotina void rmedia (void) que, em função da última transferência por DMA, calcula uma das médias, a do canal 0 ou a do canal 1, e a escreve na posição 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 interrupção pra a condição original.
2a Questão (3,0 pontos) – Porta Serial e Interrupção A figura ao lado apresenta uma solução para se testar o limite de velocidade de uma comunicação 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 possíveis, igual ou superior a 9.600 bps. O teste com um único valor é falho, por isso é usado um padrão com 100 valores. Use dois vetores de tamanho 100: vetor_tx[100]=(0, 1, 2, ..., 99) e vetor_rx[100]. O vetor_tx contém o padrão a ser transmitido e a recepção deve ser armazenada em vetor_rx. O programa principal faz as inicializações, seleciona uma velocidade e dá início ao ensaio. É obrigatório o uso da interrupção serial. Quando terminar a transmissão e a recepção, 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 interrupção. 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]; //padrão a ser transmitido int j,vetor_rx[100]; //guardar o que for recebido int flag; //variável auxiliar void interrupt (*antigo) (void); void testa_serial (void){ declaração de variáveis; for (i=0; i
View more...
Comments