Mudanças entre as edições de "MIC29004-2013-2"
Linha 460: | Linha 460: | ||
− | =Aula | + | =Aula 20/11: Viagem Turma= |
* Atendimento paralelo | * Atendimento paralelo | ||
Edição das 13h57min de 20 de dezembro de 2013
Microprocessadores: Diário de Aula 2013-2
Professor: Roberto de Matos
Encontros: 4ª feira 9:40 e 6ª feira 9:40
Atendimento paralelo: 4ª feira das 13:30 às 15:20.
Slides
Listas de Exercício
Aula 16/08: Apresentação
- Apresentação do professor.
- Apresentação dos alunos: Nome, perfil, preferências, etc.
- Apresentação da disciplina: conteúdo, bibliografia e avaliação.
- Aula Introdutória: Projetos práticos com Microcontroladores
Aula 21/08: Histórico
- Evolução dos processadores
Aula 23/08: Introdução a Arquitetura de Computadores
- Introdução a Arquitetura de Computadores
- Conceito de Processador (Unidade de Controle + Unidade de Processamento)
- Memória, Registradores, Barramentos
Aula 28/08: IAS
- Arquitetura Von Neumann
- Arquitetura IAS
- Execução de um Programa (Acesso a memória, Registradores Internos, Sinais de Controle)
- Assembly IAS (Classes de Instruções)
Aula 30/08: Não Houve Aula
- Paralisação
Aula 04/09: IAS Sim
Objetivo
Ao final da aula o aluno deverá:
- Entender na prática a organização da memória do IAS e a diferença na representação de instruções e dados.
- Se familiarizar com o simulador acadêmico IAS Sim (rodar o simulador, carregar programa, janela de memória, registradores, etc.)
- Conseguir criar e executar um programa simples em Assembly.
Memória IAS
Instalação
- Link Download:
http://www.cs.colby.edu/djskrien/IASSim/IASSim2.0.4.zip
- Rodar no Linux:
java -cp IASSim2.0.4.jar:jhall.jar:IASSimHelp2.0.jar iassim.Main -m IAS.cpu
Exercício: Instruções de Transferência e Aritméticas
- Instruções com Opcode 1 a 12, 17, 20 e 21 do conjunto de instruções
- Faça um programa que execute o seguinte conjunto de instruções:
g = 3;
h = 5;
i = 2;
j = 1;
f = (g+h) – (i+j);
</syntaxhighlight>
- Solução:
S(x)->Ac+ g
S(x)->Ah+ h
S(x)->Ah- i
S(x)->Ah- j
At->S(x) f
halt
g: .data 3
h: .data 5
i: .data 2
j: .data 1
f: .data 0
</syntaxhighlight>
Aula 06/09: IAS Sim (continuação)
Estrutura do IAS
Registradores IAS Sim
Registradores "Visíveis" ao programador:
- Accumulator (AC)
- Arithmetic Register (AR)
Registradores internos:
- Control Counter (CC): Contador de Programa.
- Control Register (CR): Instrução em execução.
- Function Table Register (FR): Opcode em execução.
- Memory Address Register (MAR): Posição de memória que sofrerá ação do Opcode.
- Selectron Register (SR): O valor lido ou escrito na memória.
Exercício: Instruções de Desvio
- Instruções com Opcode 13 a 16 do conjunto de instruções
- Reproduza cada um dos seguintes programas para assembly, atribuindo às variáveis valores que lhe permitam testar o seu programa.
a) if (a>=b)
b=b+1;
b) if (a>b)
a=a+1;
c) if (a==b)
a=a+1;
d) Adicione "else" nos exercícios anteriores.
e) a=0;c=5;
while (a<c){
a=a+1;
}
f) a=0;
for (i=0; i<5 ;i++){
a=a-1;
}
</syntaxhighlight>
Exercício: Instruções para modificação de Instrução
- Instruções com Opcode 18 a 19 do conjunto de instruções
- Faça um programa que contenha o vector v = {1,2,3,4,5} na memória e substitua todos os elementos pelo seu dobro.
Aula 11/09: IAS Sim (continuação)
- Problemas na rede de computadores
- Correção do último Exercício
- Detecção de problema na compreensão da estrutura de memória (Revisão Próxima Aula)
Aula 13/09: Revisão IAS
Aula 18/09: Microcontroladores
- Microcontrolador vs Microprocessador
- Aplicações
- Limitações
Aula 20/09: 8051
- Introdução
- Arquitetura Interna
- Memória
Aula 25/09: Modos de Endereçamento 8051
- Endereçamento por Registrador
- Endereçamento Imediato (#)
- Endereçamento Direto
- IDATA
- Endereçamento Indireto (@)
- IDATA
- XDATA
- CODE
Aula 27/09: MCU8051IDE – Exercícios IDATA
- Prática com o MCU8051IDE.
Exemplo
- INSTRUÇÕES DO 8051
mov 20h,#30h ;Ender. Imediato (valor constante esta' no opcode)
mov 30h,#07ah ;Ender. Imediato (valor constante esta' no opcode)
mov r0,30h ;Ender. Direto (operando especifica ENDERECO de 8 bits da RAM interna)
mov a,r0 ;Ender. via registrador (opcode contem 3 bits indicando qual registrador usar)
mov a,20h ;Ender. Direto (operando especifica ENDERECO de 8 bits da RAM interna)
mov a,#20h ;Ender. Imediato (valor constante esta' no opcode)
mov a,@r0 ;Ender. Indireto (registrador R0, R1, contem endereco do operando)
mov dptr,#tabela ;Ender. Imediato (valor constante esta' no opcode)
tabela: db 10h,20h,30h,0BBh,0AAh
end
</syntaxhighlight>
Exercícios
Endereçamento direto da IDATA
- Construir um trecho de código para colocar a mensagem "ALO" na memória RAM interna, a partir do endereço 30H. Usar endereçamento imediato e direto.
- Construir um trecho de código para copiar 5 bytes consecutivos da memória RAM interna a partir do endereço 50H para um destino a partir de 42H. Usar somente endereçamento direto e por registrador.
- Repetir o exercício anterior usando somente endereço direto.
Aula 02/10: Exercícios IDATA (cont.)
Endereçamento indireto da IDATA
- Copiar 5 bytes consecutivos de uma área interna de memória de dados, a partir da posição 40H para a posição 66H. Usar endereçamento indireto e imediato.
Aula 04/10: Exercícios XDATA
Endereçamento indireto da XDATA
- Zerar as posições de memória RAM externa (XDATA) de número 80FFH, 9765H e FEA5H.
- Colocar a mensagem "ALO" nas posições de memória externa de dados 0670h,0671h e 0672h.
- Copiar os bytes das posições 4654H, 7687H e FADEH da XDATA para as posições 0000H, 0005H e A000H respectivamente.
Aula 09/10: Avaliação
Aula 11/10: Exercícios CODE
- Instrução do montador: ORG, DB, end
Endereçamento indexado do CODE
- Uma mensagem "ALO" foi gravada na área CODE a partir da posição de memória 5465H. Copie esta mensagem para a área de memória interna de dados, a partir das posições 76H.
- Repetir o exercício anterior mas agora copiando para a RAM externa de dados para um destino a partir de F555H.
Aula 18/10: Correção da Avaliação
- Correção da Avaliação.
- Introdução as instruções de desvio e loop.
- Desvio Incondicional:
- AJMP adr11
- LJMP adr16
- SJMP Rel
- JMP @A+DPTR
- Desvio Condicional:
- JZ rel
- JNZ rel
- CJNE A, direto ,rel
- CJNE A, #data ,rel
- CJNE Rn,#data ,rel
- CJNE Ri,#data ,rel
- Desvio baseado em bits:
- JC rel
- JNC rel
- JB bit, rel
- JNB bit, rel
- JBC bit, rel
- Loop:
- DJNZ Rn, rel
- DJNZ direto, rel
- Endereçamento:
- adr16 –> endereço de 16 bits (endereça 64 KB)
- adr11 –> endereço de 11 bits (endereça 2 KB)
- rel –> deslocamento relativo (complemento a 2: -128 a +127)
Aula 19/10: Aula Sábado – Exercícios de Instruções de Desvio
- Assumindo que alfa é o registrador A e beta é um dado armazenado em 20H. Mapear em assembly as seguintes estruturas decisórias:
if (alfa==beta) {
/* bloco1 */
} else {
/* bloco2 */
}
</syntaxhighlight>
if (alfa>=beta) {
/* bloco1 */
} else {
/* bloco2 */
}
</syntaxhighlight>
if (alfa>beta) {
/* bloco1 */
} else {
/* bloco2 */
}
</syntaxhighlight>
- Construir uma estrutura equivalente a um "for"conforme mostrado abaixo. Use o acumulador como variável de controle.
for (i=5;i<100;i++) {
/* bloco */
}
</syntaxhighlight>
- Construir uma estrutura em assembly equivalente a um comando case do C;
- Faça um programa que escreva os números de 1 a 15H na memória interna de dados a partir do endereço 50H e na memória externa de dados a partir do endereço 2200H. Utilize modo de endereçamento indireto para escrita nas duas regiões de memória.
- Faça um programa que copie os dados da região de memória de dados externa de 2100H a 210FH para a região de memória de dados externa que inicia em 2300H.
- Faça um programa que copie os dados da área de memória de programa que devem estar armazenados a partir do endereço "TAB:" para a memória interna de dados a partir do endereço 30H. A seqüência de dados na memória de programa deve ser finalizada com o código 00. O programa deve contar o número de dados da seqüência, menos o último valor = 00, e armazenar o resultado no endereço 20h da RAM interna.
Aula 23/10: NÃO HOUVE AULA
Aula 25/10: Aula trocada com o Prof. Tiago
- Reposição no dia 18/11 (segunda-feira)
Aula 30/10: Fluxograma, Pseudo-Instruções, Pilha e Subrotinas
Aula 01/11: Exercícios Pilha e Subrotinas
- Exemplo: Uma subrotina para zerar n posições de memória RAM interna onde n é passado como parâmetro em R0 e o início da área em R1.
Zerar_N:
mov @R1,#00
inc R1
djnz R0,Zerar_N
ret
</syntaxhighlight>
Uso:
:
mov R0,#10
mov R1,#30h
lcall Zerar_N
:
mov R0,#20
mov R1,#60h
lcall Zerar_N
</syntaxhighlight>
Roteiro
PARTE 1
- Implementar o seguinte programa:
mov A,#65H
mov B,#87H
push ACC
push B
mov A,#00H
mov B,#00H
pop B
pop ACC
loop: sjmp loop
END
</syntaxhighlight>
- Execute passo a passo no simulador. Antes de executar a primeira instrução observe o valor do registrador SP;
- Execute passo a passo até a execução do push ACC. Verifique o valor de SP e da área 08H da IDATA;
- Execute a próxima instrução e as que se seguem observando a evolução do SP e da IDATA;
PARTE 2
- Construa e assemble o seguinte programa:
ORG 0000H
main: ljmp ponto1
ORG 01E5H
ponto1:
mov R0,#55H
mov R1,#5
acall setar_mem
mov R0,#77H
mov R1,#10
acall setar_mem
loop: sjmp loop
ORG 0315h
setar_mem:
mov @R0,#0FFh
inc R0
djnz R1,setar_mem
ret
END
</syntaxhighlight>
- Observe o valor do PC e execute o ljmp. O que aconteceu com o PC?
- Execute até a instrução acall. Observe o valor do PC e do SP neste momento. Execute a instrução e verifique novamente o valor do PC. O que ocorreu?
- Observe o estado da pilha. Que valores foram empurrados para a pilha?
- Execute a subrotina até o ret (exclusive). Olhe para SP e IDATA. Execute o ret. O que aconteceu?
PARTE 3
- Construa uma subrotina para copiar uma string terminada em 0 que está armazenada na área de código (CODE) para uma área da XDATA. Passar o ponteiro para a área CODE em DPTR e para a área XDATA em R1R0. Salve na entrada da subrotina os registradores que serão modificados. Teste no simulador. Use o esqueleto de programa colocado a seguir:
main:
mov DPTR,#str1
mov R1,#55H
mov R0,#0fdh
lcall copiar_str
loop: sjmp loop
copiar_str:
ret
str1: db 'IFSC',0
END
</syntaxhighlight>
OBS.: Use a instrução movc A,@A+DPTR para ler da área de código. Use instruções do tipo mov DPH,R0 ou mov DPL,R1 para colocar valores no DPTR a partir registradores de 8 bits.
Exercícios
- Faça uma subrotina para copiar n posições de memória RAM interna para outra área da RAM interna. Passe os parâmetros em R0, R1 e R2.
- Implemente uma subrotina para concatenar duas strings terminadas em 0 que estão na área CODE (ponteiros em DPTR e R1R0) para a área IDATA (ponteiro em R2).
- Se a pilha for inicializada para o começo da memória RAM interna endereçável por byte (SP=2FH). Quantas chamadas aninhadas de subrotina é possível?
Aula 06/11: Portas Paralelas
- Conceitos arquiteturais
- Exercícios
Exercícios
- Construir um programa para ler um código de 8 bits da porta P1 e acionar um relé pela porta P2.0 se o código for correto. Supor existência de uma subrotina esc_liberado_acesso e esc_acesso_negado. Use o bit P2.0 para validar a entrada do código.
- Faça um programa que possui uma chave como entrada. Se a chave estiver ON o conteúdo do registrador A é continuamente rotacionado a esquerda, caso contrário continuamente rotacionado a direita.
- Modifique o exercício para externar o conteúdo de A em uma porta que controla LEDs.
Aula 08/11: Interrupção
- Conceitos gerais
- Conceitos arquiteturais do 8051
- Exercícios
Exercícios
- Faça um programa que aceite int0 (acionada por borda). Quando a int0 for acionada, escrever na porta P1, caractere por caractere, a cadeia de 16 caracteres: ‘Microcontrolador’.
- Conceber um programa que controla o acionamento de uma bomba d'água que enche um tanque. Existem sensores para detectar um nível mínimo e um nível máximo. Quando a água chega em um nível máximo a bomba deve ser desligada e quando chega a um nível mínimo a bomba deve ser ligada.
Aula 13/11: Timer/Contador
- Conceitos gerais
- Conceitos arquiteturais do 8051
- Exercícios
- Exemplo:
delay:
clr TR0 ;garante que timer esteja parado
clr TF0 ;garante que flag de estouro esteja zerado
mov TMOD,#00000001b ;configura timer0 para modo 0, sem controle externo
mov TH0,#D8h ;\
mov TL0,#F0 ;/ => configura timer0 com D8F0h
setb TR0 ;liga timer0
loop:
jnb TF0,loop ;espera que timer0 estoure
clr TR0 ;para o timer0
clr TF0 ;zera TF0 - note que nao eh zerado de forma automática
ret
</syntaxhighlight>
Exercícios
- Construir uma subrotina que realiza um retardo de 50ms. Suponha clock de 12Mhz.
- Construir uma subrotina para aguardar 1s, usando a rotina de retardo de 50 ms.
- Construir uma subrotina que aguarda por N segundos, passando N no registrador A.
- Acender um led na freqüência de 10 Hz. Use interrupção.
- Acender um led na freqüência de 1 Hz. Use interrupção.
Aula 20/11: Viagem Turma
- Atendimento paralelo
Aula 22/11: Viagem Turma
- Atendimento paralelo
Aula 27/11: Exercícios e Apoio Trabalho Final
- 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.
Controle Fermentador Cerveja
- Equipe: Flávia e Elton
Propeller Dilsplay
- Equipe: Thiago Bonotto e Bruno
Demultiplexador de Objetos para Esteira Industriais
- Equipe: Thiago Werner, Marcus e Leonan
Controle de Acesso
- Equipe: Gustavo, Jean e Danilo
Leitor Código de Barra
- Equipe: Letícia e Tamara
Cronometro
- Equipe: Ernani
Aula 29/11: Serial
- Comunicação Paralela vs. Serial
- Comunicação Assíncrona vs. Síncrona
- Tipos de Canal (Simplex, Half-Duplex e Full-Duplex)
- Conceitos da Serial do 8051
- Exemplos
Transmissão e recepção por polling
- O programa a seguir transmite uma mensagem armazenada a partir do endereço "texto":
org 0h
main:
acall init_uart
acall envia_texto
final: sjmp final
- inicia a uart para baudrate 9600
init_uart:
mov TMOD,#00100000b ; timer 1 em modo 2
mov TH1, #0FDh ; baudrate 9600
setb TR1 ; liga timer 1
mov SCON,#01010000b ; porta serial modo 1
clr TI ; para garantir clear TI mas nao eh necessario
ret
- envia mensagem texto
envia_texto:
mov DPTR,#texto
tx_msg: mov A,#0
movc A,@A+DPTR
acall envia_car
inc DPTR
jnz tx_msg
fim_tx: ret
- envia um caracter
envia_car:
mov SBUF,A
loop: jnb TI,loop
clr TI
ret
texto: db "Alo Mundo"
END
</syntaxhighlight>
- O programa a seguir recebe uma mensagem:
buff_rec EQU 30h
org 0h
main:
acall init_uart
acall recebe_texto
final: sjmp final
recebe_texto:
push R0
push A
mov R0,#buff_rec
receber:
acall rec_car
mov @R0,A
inc R0
jnz A,receber
pop A
pop R0
ret
rec_car:
loop: jnb RI,loop
clr RI
mov A,SBUF
ret
END
</syntaxhighlight>
Usando Interrupção
O programa a seguir recebe a mensagem por interupção:
\tasm
buff_rec EQU 30h
org 0h
ljmp main
org 23h
ljmp handler_tx
org 100h
main:
acall init_uart
mov IE,#10010000b
mov R0,#buff_rec
loop: sjmp loop
handler_tx:
push A
jnb RI,fim_int ;testa se a interrupcao eh recepcao
mov A,SBUF
mov @R0,SBUF
inc R0
fim_int:
pop A
iret
</syntaxhighlight>
Aula 04/12: Trabalho Final
Aula 06/12: Trabalho Final
Aula 11/12: Trabalho Final
Aula 13/12: Prova
Aula 18/12: Recuperação e Apresentação do Trabalho Final