MICROPROCESSADORES E MICROCONTROLADORES PROVA 2 - RESPOSTA ESPERADA 1. Escreva as instruções para as configurações pedidas. Valor: 2,0 a) Habilita as interrupções externas zero e um e a interrupção do temporizador 0. As interrupções externas são por transição. A interrupção zero tem prioridade alta. 1 0 0 0 0 1 1 1 TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 0 0 0 0 0 1 0 1 IP X X X PS PT1 PX1 PT0 PX0 0 0 0 0 0 0 0 1 MOV IE,#87H MOV TCON,#05H MOV IP,#01 b) Configura o temporizador 1 para operar no modo 1 com início de contagem em 3CAFH. Habilita a interrupção do temporizador 1. TMOD G1 C/T\ M1.1 M0.1 G0 C/T\ M1.0 M0.0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 MOV TMOD,#10H MOV TH1,#3CH MOV TL1,#0AFH MOV IE,#88H 2. A Figura 1 mostra um diagrama simplificado de acionamento de um motor de corrente contínua de 12 V e está associada ao programa mostrado na Tabela 1. A Tabela 2 mostra a lógica de funcionamento do motor CC e a Tabela 3 mostra o valor de recarga de um temporizador, no modo 1, para gerar diferentes quantidades de pulsos. O cristal oscilador é de 12 MHz. Valor: 4,0 Tabela 1: Programa para acionamento de motor de corrente contínua RÓTULO MNEMÔNICO RÓTULO MNEMÔNICO CH1 EQU P3.5 OPERA2: CLR P1.2 CH2 EQU P3.2 SETB P1.3 SETB P1.6 ORG 00H MOV R1,#10 LJMP PROB2 V4: LCALL ATRASO DJNZ R1,V4 ORG 30H SJMP V1 PROB2: MOV SP,#2FH MOV TMOD,#01H OPERA1: SETB P1.2 MOV R0,#10 CLR P1.3 MOV R1,#20 Parte 1 Parte 3 Parte 4
V1: CLR P1.2 CLR P1.3 CLR P1.6 V3: CPL P1.6 LCALL ATRASO DJNZ R1,V3 SJMP V1 JB CH1,V2 SJMP OPERA1 ATRASO: CLR TF0 MOV TH0,#63H V2: JB CH2,V1 MOV TL0,#0BFH SETB TR0 JNB TF0,,$ DJNZ R0,ATRASO MOV R0,,#10 CLR TR0 RET END Parte 2 Parte 5 Figura 1: Circuito simplificado de acionamento do motor de correntee contínua Tabela 2: Lógica de operação do motor IN1 IN2 Operação do motor 0 0 Motor parado 0 1 Rotação sentido direto 1 0 Rotação sentido reverso 1 1 Motor parado Tabela 3: Recarga do temporizador-modo 1 Início da Contagem 5.535 15.535 25.535 35.535 45.535 55.535 TH0 15H 3CH 63H 8AH B1H D8H TL0 9FH AFH BFH CFH DFH EFH Questões (Valor de cada questão: 1,0): a) Como funciona a Parte 2? O que ocorre se as chaves CH1 e CH2 permanecerem livres e o que ocorre quando cada uma delas é pressionada? No início da Parte 2, as instruções CLR P1.2, CLR P1.3 e CLR P1.6 desligam o motor e o LED. A seguir o estado da chave CH1 é verificado. Se estiver em nível lógico alto (chave CH1 aberta), pula para verificar o estado da chave CH2. Se CH2 = 1 (chave CH2 aberta), volta para o início da Parte 2. Se CH1 = 0 (chave CH1 pressionada), o processamento desvia para o endereço OPERA1. Se CH2 = 0 (chave CH2 pressionada), o processamento vai para próxima linha, onde começa a rotina chamada de OPERA2. b) Explique o funcionamento da Parte 5. Qual o tempo de atraso gerado por essa subrotina? Qual papel do registrador R0? o
A Parte 5 é uma subrotina de atraso de tempo baseada no temporizador 0, operando no modo 1. Cada contagem começa em 63BFH, que corresponde ao decimal 25.535. Isso significa que o temporizador conta 40.000 pulsos (65.535-25.535). Como o cristal oscilador é de 12 MHz, cada pulso do temporizador corresponde a 1 µs. Assim, o tempo de cada contagem resulta em 40 ms. Durante cada contagem do temporizador, o processamento fica em um loop infinito (JNB TF0,$), aguardando o fim da contagem. Após cada contagem, o registrador R0 é descrementado e verificado se é zero (DJNZ R0,ATRASO); enquanto ele não for zero, o processamento volta para ATRASO, para iniciar uma nova contagem do temporizador. Como R0 = 10, significa que são realizadas 10 contagem de 25.535 até 65. 535, ou seja, a subrotina ATRASO gera um tempo de atraso de 400 ms (10 x 40 ms). Quando R0 = 0, o processamento sai da subrotina. Porém, antes de sair, o registrador R0 é redefinido com valor 10 e o temporizador é desligado. c) Explique o funcionamento da Parte 3. O que ocorre com o motor CC e com o LED? Qual o sentido de rotação do motor? Por quanto tempo o motor funcionará? A Parte 3 é executada quando a chave CH2 é pressionada. As instruções CLR P1.2 (IN2 = 0) e SETB P1.3 (IN1 = 1) faz o motor CC girar no sentido reverso. A instrução SETB P1.6 liga o LED. A seguir, o registrador R1 recebe o valor decimal 10, usado para chamar a subrotina de atraso de tempo. Ou seja, a subrotina ATRASO é chamada 10 vezes, o que significa que o motor vai girar no sentido reverso por um tempo de 10 x 400 ms = 4 s. Passado esse tempo, o processamento volta para V1, onde o motor e o LED são desligados. d) Explique o funcionamento da Parte 4. O que ocorre com o motor CC e com o LED? Qual o sentido de rotação do motor? Por quanto tempo o motor funcionará? A Parte 4 é executada quando a chave CH1 é pressionada. As instruçõess SETB P1.2 (IN2 = 1) e CLR P1.3 (IN1 = 0) faz o motor CC girar no sentido direto. A seguir, o registrador R1 recebe o valor decimal 20, usado para chamar a subrotina de atraso de tempo. Ou seja, a subrotina ATRASO é chamada 20 vezes, o que significa que o motor vai girar no sentido direto por um tempo de 20 x 400 ms = 8 s. No entanto, o funcionamento do LED é diferente do item anterior. A instrução CPL P1.6 faz o LED piscar a cada vez que o processamento volta da subrotina de atraso de tempo, ou seja, a cada 400 ms. Ao final das 20 chamadas de subrotina, o processamento volta para V1, onde o motor e o LED são desligados. 3. A Figura 2 mostra uma matriz de LEDs de 3 linhas e 8 colunas. As linhas, de baixo para cima, estão conectadas, respectivamente às portas P0, P1 e P2. Cada LED está conectado a um dos pinos dessas portas (0 a 7), conforme mostrado na Figura 2. A Figura 3 mostra essa mesma matriz em 3 instantes diferentes, onde pode-se ver o deslocamento de uma onda triangular. Faça um programa em assembly do 8051 onde a interrupção externa zero, por transição, faz essa onda triangular se deslocar 8 passos para a direita e a interrupção externa 1, por nível, faz a onda se deslocar para a esquerda, passo a passo, enquanto houver pedido de interrupção. Use uma subrotina de atraso de tempo baseada nos registradores R0 e R1. Valor: 4,0
Figura 2: Matriz 3x8 de LEDs Figura 3: Matriz 3x8 em diferentes instantes de acionamento Para produzir o efeito de uma onda triangular se deslocando, observar que o valor enviado para as portas mantém um padrão, que pode se deslocar usando a instrução ou R. No entanto, deve-se lembrar que essas instruções só são usadas com o acumulador, ou seja, cada valor deve ser transferido para o acumulador, rotacionado e devolvido para o registrador de origem. Os valores iniciais a serem enviados para as portas P0, P1 e P2 são, respectivamente, 88H, 55H e 22H. Após a primeira rotação à direita esses valores tornam-se: 44H, AAH e 11H e, depois, 22H, 55H e 88H. Rótulo Mnemônico LINHA1 EQU 10H LINHA2 EQU 11H LINHA3 EQU 12H ORG 00H LJMP PROB2 ORG 03H LJMP DIREITA ORG 13H LJMP ESQUERDA Comentários ; Registrador 10H guarda os valores enviados paraa P0 ; Registrador 11H guarda os valores enviados paraa P1 ; Registrador 12H guarda os valores enviados paraa P2 ; A próxima instrução está no endereço 00H ; Desvia o processamento para o endereço PROB2 ; A próxima instrução está no endereço 03H (Interrupção externa zero) ; Desvia para o endereço DIREITA ; A próxima instrução está no endereço 13H (interrupção externa um) ; Desvia para o endereço ESQUERDA PROB2: ORG 30H MOV SP,#2FH ; Pilha inicia no endereço 2FH MOV IE,#85H ; Habilita as interrupções externas 0 e 1 MOV TCON,#01H ; Interrupção externa zero por transição MOV R7,#8 ; Contador do deslocamento para a direita MOV LINHA1,#88HH ; Valor inicial da Linha 1 MOV LINHA2,#55HH ; Valor inicial da Linha 2 MOV LINHA3,#22HH ; Valor inicial da Linha 3 DIREITA: SJMP $ MOV P0,LINHA1 MOV P1,LINHA2 MOV P2,LINHA3 LCALL ATRASO MOV A,LINHA1 MOV LINHA1,A MOV A,LINHA2 MOV LINHA2,A MOV A,LINHA3 ; Loop infinito esperando interrupção ; Transfere para P0 o conteúdo da Liha 1 ; Transfere para P1 o conteúdo da Liha 2 ; Transfere para P2 o conteúdo da Liha 3 ; Chama subrotina de atraso de tempo ; Transfere para A o conteúdo da Linha 1 (necessário para a rotação) ; Devolve o conteúdo de A (rotacionado) para a Linha 1 ; Transfere para A o conteúdo da Linha 2 (necessário para a rotação) ; Devolve o conteúdo de A (rotacionado) para a Linha 2 ; Transfere para A o conteúdo da Linha 3 (necessário para a rotação)
MOV LINHA3,A ; Devolve o conteúdo de A (rotacionado) para a Linha 3 DJNZ R7,DIREITA ; Decrementa o contador R7. Enquanto R7 não for zero, volta para DIREITA MOV R7,#8 ; Recarrega R7 com o valor 8 RETI ; Sai da subrotina de interrupção ESQUERDA: MOV P0,LINHA1 ; Transfere para P0 o conteúdo da Liha 1 MOV P1,LINHA2 ; Transfere para P1 o conteúdo da Liha 2 MOV P2,LINHA3 ; Transfere para P2 o conteúdo da Liha 3 LCALL ATRASO ; Chama subrotina de atraso de tempo MOV A,LINHA1 ; Transfere para A o conteúdo da Linha 1 (necessário para a rotação) MOV LINHA1,A ; Devolve o conteúdo de A (rotacionado) para a Linha 1 MOV A,LINHA2 ; Transfere para A o conteúdo da Linha 2 (necessário para a rotação) MOV LINHA2,A ; Devolve o conteúdo de A (rotacionado) para a Linha 2 MOV A,LINHA3 ; Transfere para A o conteúdo da Linha 3 (necessário para a rotação) MOV LINHA3,A ; Devolve o conteúdo de A (rotacionado) para a Linha 3 RETI ; Sai da subrotina de atraso de tempo ATRASO: MOV R0,#250 ; Subrotina de atraso de tempo baseada nos registradores R0 e R1 V1: MOV R1,#250 DJNZ R1,$ DJNZ R0,V1 RET END Tabela 4: Alguns Registradores Especiais Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 IP X X X PS PT1 PX1 PT0 PX0 PSW CY AC F0 RS1 RS0 OV X P TMOD G1 C/T\ M1.1 M0.1 G0 C/T\ M1.0 M0.0 Tabela 5: Endereços das interrupções Interrupção Solicitada Endereço de desvio Reset 0000h INT0\ 0003h Timer/counter 0 000Bh INT1\ 0013h Timer/counter 1 001Bh Canal Serial 0023h