Mudanças entre as edições de "MIC29004-2013-2"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
(Criou página com '= Microprocessadores: Diário de Aula 2013-2 = '''Professor:''' Roberto de Matos <!--<br>'''Lista de email (forum):''' sst-csttel@googlegroups.com--> <br>'''Encontros:''' 4...')
 
 
(91 revisões intermediárias por um outro usuário não estão sendo mostradas)
Linha 2: Linha 2:
  
 
'''Professor:''' [[Roberto de Matos]]
 
'''Professor:''' [[Roberto de Matos]]
<!--<br>'''Lista de email (forum):''' sst-csttel@googlegroups.com-->
 
 
<br>'''Encontros:''' 4ª feira 9:40 e 6ª feira 9:40
 
<br>'''Encontros:''' 4ª feira 9:40 e 6ª feira 9:40
 
<br>'''Atendimento paralelo:''' 4ª feira das 13:30 às 15:20.
 
<br>'''Atendimento paralelo:''' 4ª feira das 13:30 às 15:20.
Linha 8: Linha 7:
 
* [[MIC-EngTel_(Plano_de_Ensino) |Ementa e referências bibliográficas]]
 
* [[MIC-EngTel_(Plano_de_Ensino) |Ementa e referências bibliográficas]]
  
= Aula 1: Apresentação =
+
* [https://docs.google.com/spreadsheet/ccc?key=0AolsLbqpwc8_dEZkN2IzUk02bjJQM2dJem40X290Znc&usp=sharing  Conceitos.]
 +
 
 +
== Slides ==
 +
*[[Media:mic-slides_1-handout.pdf|Slides Histórico]]
 +
*[[Media:mic-slides_2-handout.pdf|Arquitetura e IAS]]
 +
*[[Media:mic-slides_3-handout.pdf|Microcontrolador e 8051]]
 +
 
 +
==Listas de Exercício==
 +
* [[MIC29004-lista1 | 1ª Lista de Exercícios: Arquitetura de Processadores]]
 +
* [[MIC29004-lista2 | 2ª Lista de Exercícios: Microcontrolador 8051]]
 +
 
 +
= Aula 16/08: Apresentação =
 
* Apresentação do professor.
 
* Apresentação do professor.
 
* Apresentação dos alunos: Nome, perfil, preferências, etc.
 
* Apresentação dos alunos: Nome, perfil, preferências, etc.
 
* Apresentação da disciplina: conteúdo, bibliografia e avaliação.
 
* Apresentação da disciplina: conteúdo, bibliografia e avaliação.
* Aula Introdutória: Evolução e desempenho do computador
+
* 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 [http://www.cs.colby.edu/djskrien/IASSim/ 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==
 +
[[imagem:IAS_memoria.png|500px|center]]
 +
 
 +
 
 +
==Instalação==
 +
 
 +
* Link Download:
 +
[http://www.cs.colby.edu/djskrien/IASSim/IASSim2.0.4.zip 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 [http://www.cs.colby.edu/djskrien/IASSim/ conjunto de instruções]
 +
 
 +
* Faça um programa que execute o seguinte conjunto de instruções:
 +
<code>
 +
g = 3;
 +
h = 5;
 +
i = 2;
 +
j = 1;
 +
f = (g+h) – (i+j);
 +
</syntaxhighlight>
 +
 
 +
* Solução:
 +
 
 +
<code>
 +
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 ==
 +
[[imagem:IAS_estrutura.png|500px|center]]
 +
 
 +
== 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 [http://www.cs.colby.edu/djskrien/IASSim/ conjunto de instruções]
 +
 
 +
* Reproduza cada um dos seguintes programas para assembly, atribuindo às variáveis valores que lhe permitam testar o seu programa.
 +
 
 +
<code>
 +
 
 +
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 [http://www.cs.colby.edu/djskrien/IASSim/ 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  =
 +
 
 +
* [http://www.8052.com/set8051 Instruction Set]
 +
 
 +
* 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 [http://mcu8051ide.sourceforge.net/ MCU8051IDE].
 +
 
 +
== Exemplo ==
 +
<code>
 +
;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:
 +
:<code>
 +
if (alfa==beta) {
 +
        /* bloco1 */
 +
} else {
 +
        /* bloco2 */
 +
}
 +
</syntaxhighlight>
 +
 
 +
:<code>
 +
if (alfa>=beta) {
 +
        /* bloco1 */
 +
} else {
 +
        /* bloco2 */
 +
}
 +
</syntaxhighlight>
 +
 
 +
:<code>
 +
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.
 +
:<code>
 +
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.
 +
:<code>
 +
Zerar_N:
 +
    mov @R1,#00
 +
    inc R1
 +
    djnz R0,Zerar_N
 +
    ret
 +
</syntaxhighlight>
 +
Uso:
 +
:<code>
 +
  :
 +
  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:
 +
 
 +
<code>
 +
        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:
 +
<code>
 +
      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:
 +
 
 +
<code>
 +
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:
 +
<code>
 +
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 da Silva Saraiva|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":
 +
<code>
 +
        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:
 +
<code>
 +
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
 +
<code>
 +
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=
 +
* [[MIC29004-lista2 | 2ª Lista de Exercícios: Microcontrolador 8051]]
 +
 
 +
=Aula 18/12: Recuperação e Apresentação do Trabalho Final =

Edição atual tal como às 11h23min de 18 de dezembro de 2016

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

IAS memoria.png


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

  • 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

IAS estrutura.png

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

  • 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

  • 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

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

  1. 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.
  2. 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).
  3. 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

  1. 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.
  2. 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.
  3. 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

  1. 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’.
  2. 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

  1. Construir uma subrotina que realiza um retardo de 50ms. Suponha clock de 12Mhz.
  2. Construir uma subrotina para aguardar 1s, usando a rotina de retardo de 50 ms.
  3. Construir uma subrotina que aguarda por N segundos, passando N no registrador A.
  4. Acender um led na freqüência de 10 Hz. Use interrupção.
  5. 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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. 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