MICROPROCESSADORES E MICROCONTROLADORES PROVA 2 UMA SOLUCAO POSSÍVEL Aluno: Matrícula: 1. Escreva as instruções necessárias para atender a cada uma das configurações solicitadas. Valor: 2,0 (a) Interrupção externa zero por nível e interrupção externa 1 por transição. MOV IE,#85H IE = 1000 0101 EA=1; EX1=1; EX0=1 MOV TCON,#04H IT1 = 1; IT0 = 0 (b) Temporizador 1 configurado para operar no modo 1 e contar 10.000 pulsos. MOV TMOD,#10H Temp 1 no modo 1 MOV TH1,#0D8H Conta de 55.535 (D8EFH) até 65.535 (FFFFH) MOV TL1,#0EFH (c) Temporizador 0 configurado para operar no modo 2 com recarga igual a 90H. MOV TMOD,#02H Temp 0 no modo 2 MOV TH0,#90H Recarga de 90H MOV TL0,#90H Contagem começa em 90H (d) Comunicação serial operando no modo 1 (assíncrono de 8 bits) com taxa de transferência de 2400 bps, com um cristal oscilador é de 11,0592 MHz. MOV SCON,#40H SCON = 0100 0000 SM1=0; SM2=1 MOV TMOD,#20H Temp 1 no modo 2 MOV TH1,#0F4H Recarga para baud rate de 2400 bps MOV TL1,#0F4H Começa contagem a partir de F4H 2. Foi montado um sistema com mapeamento de memória, onde uma pastilha de memória de 1 Kbyte, um conjunto de 8 LEDs e um LCD são endereçados com o auxílio de um decodificador 74LS138, mostrado na figura a seguir. Indique (e mostre o procedimento) quais as linhas de endereço deverão ser conectadas às entradas A 2 A 1 e A 0, de forma que a memória seja acionada através da saída 0 do decodificador, os LEDs através da saída 4 e o LCD através da saída 7. E indique também a faixa de endereços correspondente a cada região. Cada região deve ser de 1 K. Obs.: O endereço inicial da região da memória é 0000H e os endereços das regiões seguintes são subsequentes. Valor: 2,0. Um vez que as regiões são de 1 K de memória (2 10 = 1024 = 1 Kbytes), são necessárias 10 linhas de endereço (de A0 a A9). Assim, as regiões de 0 a 7 são mapeadas como segue:
Reg A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 HEXA 0 Inicio 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0000 Fim 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 03FF 1 Inicio 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0400 Fim 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 07FF 2 Inicio 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0800 Fim 0 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 0BFF 3 Inicio 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0C00 Fim 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0FFF 4 Inicio 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1000 Fim 0 0 0 1 0 0 1 1 1 1 1 1 1 1 1 1 03FF 5 Inicio 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1400 Fim 0 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 17FF 6 Inicio 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1800 Fim 0 0 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1BFF 7 Inicio 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1C00 Fim 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1FFF 3. Na figura a seguir os sensores de presença S0, S1 e S2 estão conectados respectivamente aos pinos P1.0, P1.1 e P1.2. Na presença de obstáculo esses pinos passam para o nível lógico 0. Os motores são acionados conforme as tabelas mostradas a seguir. Comente cada linha do trecho de programa a seguir (valor 1,0) e descreva o funcionamento desse trecho do programa (valor 1,0). Motor M2 Motor M1 P2.3 P2.2 Estado do motor P2.1 P2.0 Estado do motor 0 0 Motor desligado 0 0 Motor desligado 0 1 Sentido horário 0 1 Sentido horário 1 0 Sentido anti-horário 1 0 Sentiodo anti-horário 1 1 Motor desligado 1 1 Motor desligado Rótulo Mnemônico Rótulo Mnemônico Rótulo Mnemônico Rótulo Mnemônico $MOD51 ORG 30H V2: CLR P2.0 V4: CLR P2.0 S0 EQU P1.0 V1: JNB S0,V2 SETB P2.1 SETB P2.1 S1 EQU P1.1 JNB S1,V3 SETB P2.2 CLR P2.2 S2 EQU P1.2 JNB S2,V4 CLR P2.3 SETB P2.3 SETB P2.0 ORG 00H CLR P2.1 LJMP V1 CLR P2.2 V3: SETB P2.0 END SETB P2.3 CLR P2.1 SETB P2.2 CLR P2.3
Comentário: Rótulo Mnemônico Comentário ORG 30H Programa inicia no endereço 30H da ROM V1: JNB S0,V2 O estado do sensor S0 é verificado. Se S0=0, desvia para V2; se S0=1, próxima linha JNB S1,V3 O estado do sensor S1 é verificado. Se S1=0, desvia para V3; se S1=1, próxima linha JNB S2,V4 O estado do sensor S2 é verificado. Se S2=0, desvia para V4; se S2=1, próxima linha SETB P2.0 CLR P2.1 Seta o bit P2.0 e limpa o bit P2.1. Assim, o motor 1 gira no sentido horário CLR P2.2 Limpa o bit P2.2 e seta o bit P2.3. Assim, o motor 2 gira no sentido anti-horário SETB P2.3 O resultado é que o carro se desloca para a frente. Não tem obstáculo Trecho V2: O processamento é desviado para esse trecho quando o sensor S0 detecta um obstáculo. O sentido de rotação de ambos os motores é invertido, ou seja, o carro se desloca para trás. Trecho V3: O processamento é desviado para esse trecho quando o sensor S1 detecta um obstáculo. O motor M1 é mantido no sentido horário, enquanto o motor M2 tem o sentido invertido. Assim, o carro gira para a esquerda (obstáculo à direita). Trecho V4: O processamento é desviado para esse trecho quando o sensor S2 detecta um obstáculo. O motor M2 é mantido no sentido anti-horário, enquanto o motor M1 tem o sentido invertido. Assim, o carro gira para a direita (obstáculo à esquerda). Após a atualização do estado dos motores o processamento retorna para o inicio, para verificação do estado dos sensores. 4. Faça um programa onde uma contagem decimal de dois dígitos é mostrada em dois displays de 7 segmentos. Um dos displays está conectado ao nibble inferior da porta P2 e o outro está conectado ao nibble superior dessa mesma porta (cada um com seu decodificador). A interrupção zero é usada para iniciar e parar a contagem e a interrupção um é usada para definir se a contagem é crescente ou decrescente. As interrupções são por transição. Use uma subrotina de atraso de tempo definida com dois registradores, cada um com um valor inicial igual a 250 decimal. Valor: 2,0 Rótulo Mnemônico Comentários $MOD51 ORG 00H LJMP INICIO CONTROLE BIT 00H ORDEM BIT 01H ORG 03H CPL CONTROLE ORG 13H CPL ORDEM ORG 30H INICIO: MOV SP,#2FH ; O endereço inicial da pilha é 2Fh
MOV IE,#85H ; Habilita interrupções externas 0 e 1 MOV TCON,#05H ; Interrupções por transição MOV A,#00H ; Valor inicial do acumulador V1: JNB CONTROLE,V1 ; Enquanto CONTROLE=0 Aguarda ; Se CONTROLE=1 Executa contagem crescente CRESC: JB ORDEM,DECRESC ; Se ORDEM=1 Executa contagem decrescente MOV P2,A ; Transfere para P2 (displays) o conteúdo do acumulador LCALL ATRASO ADD A,#01H ; Adiciona 1 ao acumulador DA A ; Faz o ajuste decimal do acumulador DECRESC: MOV P2,A ; Transfere para P2 (displays) o conteúdo do acumulador LCALL ATRASO ADD A,#99H ; Adiciona 99H, de modo que a contagem seja decrescente DA A ; Faz o ajuste decimal do acumulador ATRASO: MOV R0,#250 ; Subrotina de atraso de tempo V2: MOV R1,#250 DJNZ R1,$ DJNZ R0,V2 RET END 5. Faça um programa onde uma comunicação serial é estabelecida entre um microcontrolador da família 8051 e um computador, a uma taxa (baud rate) de 1200 bps, no modo 1 (assíncrono de 8 bits). Uma variável de controle do tipo bit é usada para estabelecer o sentido do fluxo de dados. Se a variável de controle estiver em nível lógico zero, o microcontrolador é configurado para receber dados do computador e transferir esses dados para uma memória EEPROM de 4 K, cujo endereço inicial é 0000H. Se a variável de controle estiver em nível lógico alto, o microcontrolador é configurado para transferir os dados da memória (a partir do endereço 0000H) para o computador. O cristal oscilador é de 11,0592 MHz. Use a interrupção externa zero para complementar a variável de controle, cujo valor inicial deve ser zero. Valor: 2,0 Rótulo Mnemônico Comentários $MOD51 ORG 00H LJMP INICIO FLUXO BIT 00H ORG 03H CPL FLUXO MOV DPTR,#0000H CLR REN SETB RI SETB TI ; Complementa o bit que controla o fluxo ; Reinicia o endereço da memória a cada interrupção ; Desabilita a recepção ; Necessário para sair do loop da recepção ; Necessário para sair do loop da transmissão ORG 30H
INICIO: MOV SP,#2FH ; O endereço inicial da pilha é 2Fh MOV IE,#81H ; Habilita interrupção externas 0 MOV TCON,#01H ; Interrupções por transição MOV SCON,#40H ; Serial configurada no modo 1 MOV TMOD,#20H ; Temporizador 1 no modo 1 MOV TH1,#0E8H ; Recarga para baud rate de 1200 bps MOV TL1,#0E8H MOV DPTR,#0000H ; Endereço inicial do EEPROM CLR FLUXO ; Limpa a variável que controla o fluxo SETB TR1 ; Dispara o temporizador 1 gera taxa de comunicação V1: JNB FLUXO,V2 ; Se FLUXO =0 Envia dado do computador para a memória ; Se FLUXO = 1 Envia dado da memória para o computador V3: CLR TI ; Limpa flag de transmissão MOVX A,@DPTR ; Acumulador recebe conteúdo da EEPROM MOV SBUF,A ; Transfere do acumulador para o computador JNB TI,$ ; Aguarda encerrar transmissão JNB FLUXO,V1 ; Necessário para sair da transmissão quando há interrupção INC DPTR ; Incrementa endereço da memória ; Volta para verificar estado da variável FLUXO V2: SETB REN ; Habilita recepção serial CLR RI ; Limpa bit de recepção JNB RI,$ ; Aguarda fim de recepção. RI é forçado para 1 para sair da recepção JB FLUXO,V1 ; Necessário para sair da recepção quando há interrupção MOV A,SBUF ; Acumulador recebe conteúdo do computador CLR RI ; Limpa flag de recepção MOVX @DPTR,A ; Transfere para a memória o conteúdo do acumulador INC DPTR ; Incrementa endereço da memória ; Volta para verificar estado da variável FLUXO END ALGUNS REGISTRADORES ESPECIAIS TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 TMOD G1\ C\T M11 M01 G0\ C\T M10 M00 IE EA X X ES ET1 EX1 ET0 EX0 IP X X X OS PT1 PX1 PT0 PX0 PSW CY AC F0 RS1 RS0 0V X P SCON SM1 SM2 SM3 REN TB8 RB8 TI RI Taxas de transmissão mais comuns
Timer 1 Baud Rate (bits/seg) Freq. Osc. (MHz) SMOD C/Tbarra Modo Valor Recar. Modo 0 Máx: 1MHz 12 X X X X Modo 2 Máx: 375K 12 1 X X X Modo 1, 3: 62,5K 12 1 0 2 FFh 19,2K 11,059 1 0 2 FDh 9,6K 11,059 0 0 2 FDh 4,8K 11,059 0 0 2 FAh 2,4K 11,059 0 0 2 F4h 1.2K 11,059 0 0 2 E8h 137,5 11,059 0 0 2 1Dh 110 6 0 0 2 72h 110 12 0 0 1 FEEBh