MIC29004-lista2
Revisão de 16h29min de 9 de julho de 2014 por Roberto.matos (discussão | contribs) (→Arquitetura do Microcontrolador 8051 e Mapa de Memória)
Arquitetura do Microcontrolador 8051 e Mapa de Memória
- Em termos de hardware e software, o que diferencia o acesso à memória do programa do acesso à memória externa de dados, no 8051?
- Desenhe o mapa de memória RAM interna do 8051, mostrando a área SFR e a memória de 128 bytes baixos, os bancos de registradores e a área acessível por bits. Aproveite e explique como se pode acessar a área SFR e os 128 low.
- Qual é o papel do pino EA no 8051?
- Para que servem as entradas XTAL1 e XTAL2 no no 8051?
- Para que serve a entrada RST no 8051? Quando ela é utilizada e o que acontece no processador ao ser ativada? Aproveite e diga qual o valor de reset do registrador SP.
Procedimentos para armazenamento e transferência de dados
Nível Elementar - Implementar pedaços de código para:
- Incrementar em uma unidade os conteúdos das posições de memória RAM 15H,16H e 17H usando endereçamento indireto.
- Armazenar o conteúdo do registrador DPTR na memória externa posições 8000H (DPL) e 9980H(DPH);
- Armazenar em DPTR os valores da memória RAM externa 50FAH (DPL) e 6EFD (DPH);
- Ler o conteúdo da memória de programa, posição 0154H, para o registrador R6;
- Implementar um programa para somar 1 a todos os conteúdos da memória RAM externa entre 1000H e 2000 (obs:use inc DPTR e cjne );
- Implementar um programa para copiar as posições de memória externa de dados, posições A000h, A001h e A002h, para as posições BFF1h, E000h e DFACh respectivamente.
- Repetir o exercício anterior para copiar as posições A000h, A001h e A002 para as posições de memória interna E0h, E1h e E2h. Use também a instrução;
- Quantos bytes possue a instrução movx A,@DPTR ? Justifique.
- Quantos bytes possue a instrução mov DPTR,\#FF77H? Justifique.
- Qual a diferença entre as instruções abaixo. Explique detalhadamente como o microprocessador executa cada uma delas, citando o Contador de Programa, PSEN, RD e WR, barramento de endereço e de dados.
movc A,@A+DPTR,
movx A,@DPTR
mov A,@R0
</syntaxhighlight>
- Do ponto devista funcional as duas instruções abaixo são idênticas. Por que? Qual é o código gerado para cada uma delas? Que modo de endereçamento é usado em seus operandos?
mov A,#55h
mov E0h,#55H
</syntaxhighlight>
Montagem de programa
- Considere o programa inútil abaixo
ITEM equ 03h
ORG 0H
sjmp main
ORG 10h
frase: db 'IFSC SJ',0
nums: db 20,35,32
main: mov r1,#3
mov dptr,#frase
mov a,#ITEM
loop1: push acc
movc a,@a+dptr
mov b,a
pop acc
inc dptr
djnz r1, loop1
mov a,b
loop: ljmp loop
END
</syntaxhighlight>
- Desenhe a memória de programa com os bytes associados ao programa (faça a tradução manual para o código de máquina).
- Ao entrar no loop eterno qual o valor de A?
- Quantas vezes a memória interna RAM foi acessada (não considere a área SFR)?
- Qual o significado da declaração abaixo?
ITEM1 equ 05h
</syntaxhighlight>
Controle de Fluxo, Pilha e Subrotinas
- Explique o que é a pilha do microprocessador e como funciona as instruções PUSH e POP com apoio do SP ("stack pointer");
- Considere o programa inútil abaixo:
ORG 0H
mov R0,#05h
mov R1,#FFh
push 00h ;R0 banco 0
lcall rot1
loop: ljmp loop
rot1: push 00h ;R0 banco 0
push 01h ;R1 banco 0
lcall rot2
pop 00h ;R0 banco 0
pop 01h ;R1 banco 0
ret
rot2: mov R0,#AAh
ret
END
</syntaxhighlight>
- Suponha que o SP está com valor 07H. Desenhe a memória interna mostrando o estado da pilha (o que tem antes e depois de SP) no momento em que é executada a instrução:
mov R0,#AAH
</syntaxhighlight>
- Qual o valor de R0 e R1 no momento em que o programa entra em loop eterno?
- Implementar um programa para mover o byte AFH para as posições de memória 30H,31H,32H e 33H usando instruções PUSH (dica: inicie SP com 30H);
- Implementar um fluxograma e um programa comentado em assembly , na forma de subrotina, para copiar uma frase armazenada na memória de programa, para uma posição da memória interna RAM. Use DPTR e R0 para passar parâmetros.
- Implementar um fluxogram e uma subrotina que recebe como parâmetro um endereço de memória RAM externa de dados que é o início de uma cadeia de caracteres terminada em NULL. A rotina deve então contar o número de ocorrências do caracter 'A'. Retornar em R0 o número destas ocorrências.
- Implementar um fluxograma e uma subrotina em assembly para copiar gericamente cadeias de caracteres terminadas em "null" (zero) armazenadas na memória de programa para um determinado destino na memória RAM interna ou externa. Use o registrador R0 com 0 ou 1 como parâmetro para detectar o destino dos dados.
- Implementar um fluxograma e uma subrotina para copiar blocos de dados da memória externa de dados para a memória externa. A interface desta rotina deve permitir passar o endereço fonte de dados, o destino e o número de bytes a serem copiados.
Contador/Temporizador e Interrupções
- Faça uma subrotina em assembly para programar o timer 0 do 8051 para que funcione com as seguintes características: modo 1, controle externo de contagem e funcionamento como temporizador. O timer 1 não pode ser desprogramado.
- Programe o timer 0 para recarga automática e que estoure a cada 10ms (suponha clock de 12Mhz). Prepare uma rotina de interrupção que entra a cada estouro deste timer e que complemente a porta P1.0.
- Faça duas subrotinas (coloque-as nos endereços corretos) associadas as interrupções externas 0 e 1. Um botão aciona a interrupção externa 0 e acende um LED ligado a porta P1.0. Outro botão, associado a interrupção 1 apaga o LED. Prepare uma subrotina para iniciar estas duas interrupções.
- Estude o programa de controle da bomba proposto na aula de interrupções. Proponha uma modificação de forma que a bomba, após ligada, permaneça liga no máximo por 1 minuto.
- Proponha uma solução para construir um flip-flop tipo D usando interrupção para detecção da borda do CLK.