MIC29004-2014-2

De MediaWiki do Campus São José
Revisão de 01h08min de 7 de março de 2019 por Roberto.matos (discussão | contribs) (→‎Material)
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar

Microprocessadores: Diário de Aula 2016-1

|| Semestre 2016-1

Microprocessadores: Diário de Aula 2014-2

Material

Listas de Exercício

Aula 03/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 07/08: Introdução a Memória

  • Projetos práticos com Microcontroladores
  • Introdução a Memória
    • Latch D e Tristate
    • Célula básica de memória
    • Circuito genérico de memória
    • Barramentos de dados, endereços e controle


Aula 11/08: Não Houve Aula – Licença Médica

Aula 14/08: Proteus e Memória

  • Introdução a Memória (cont.):
    • Tamanho da memória e Largura da Palavra (N x M)
    • Capacidade em bits
    • Associação de Memórias

Proteus

Multiples of bytes
Decimal
Value Metric
1000 kB kilobyte
10002 MB megabyte
10003 GB gigabyte
10004 TB terabyte
10005 PB petabyte
10006 EB exabyte
10007 ZB zettabyte
10008 YB yottabyte
Binary
Value JEDEC IEC
1024 KB kilobyte KiB kibibyte
10242 MB megabyte MiB mebibyte
10243 GB gigabyte GiB gibibyte
10244 - - TiB tebibyte
10245 - - PiB pebibyte
10246 - - EiB exbibyte
10247 - - ZiB zebibyte
10248 - - YiB yobibyte
Fonte: http://en.wikipedia.org/wiki/Kilobyte
  • Consolidar o conhecimento sobre memórias e barramentos de endereços, dados e controle através de um experimento no Proteus.
  • Roteiro:
  1. Entrar no Windows.
  2. Baixe o arquivo de projeto. Coloque em um diretório conhecido.
  3. Clique sobre o arquivo. O PROTEUS será executado e o projeto aberto.
  4. Observe que o projeto está parcialmente pronto. Você pode entrar em modo simulação. O sistema está preparado para que se possa inserir ou ler manualmente posições de memória.
  5. Grave o dado Ah na posição 0 de memória e Bh na posição 8.
  6. Note o Chip Select está habilitado sempre. Coloque uma chave adicional para colocar o Chip Select e repita a operação de gravação anterior.
  7. Utilize a nova configuração para gravar o seu número de matrícula a partir da posição 0.

Exercícios

  • Usando a memória do experimento como bloco base, realize a ligação entre elas de modo que se construa um banco de memória de 32 palavras de 8 bits.
  • Usando a memória do experimento como bloco base, realize a ligação entre elas de modo que se construa um banco de memória de 64 palavras de 4 bits.
  • Quais os tamanhos dos barramentos de endereço e dado para uma Memória de 512x8 bits?
  • Determine a capacidade final em bits e o endereço inicial e final em Hexadecimal das memórias com as seguintes características:
    • 512x4
    • 4Kx8
    • 128Kx8
    • 2Mx16


Aula 17/08: Tipos de Memória

  • ROM (PROM, EPROM, EEPROM, FLASH);
  • RAM (DRAM, SRAM, DDR)
  • Diferença das células

Exercícios (cont.)

  • Usando a memória do experimento como bloco base, realize a ligação entre elas de modo que se construa um bancos de memórias de:
    • 16 palavras de 8 bits.
    • 32 palavras de 4 bits.

Aula 21/08: Exercícios Memória e Apresentação TCCs

Aula 25/08: Introdução a Arquitetura e Organização de Computadores

Aula 28/08: Arquitetura do BIP I

Aula 01/09: Organização do BIP I

Aula 04/09: Decoder BIP I

Aula 08/09: Arquitetura e Organização do BIP II


Aula 22/09: Prova Teórica

Aula 25/09: Microcontroladores

  • Microcontrolador vs Microprocessador
  • Aplicações
  • Limitações

Aula 29/09: Prova Prática

Aula 02/10: Troca com Prof. Francisco (POO)

Aula 06/10: 8051

  • Introdução
  • Arquitetura Interna
  • Memória

Aula 09/10: Assembly 8051

    • Imediato
    MOV A, #100</syntaxhighlight>
    • Direto
    MOV A, 20</syntaxhighlight>
    • Indireto
    MOV A, @R0</syntaxhighlight>
    • Registro
    MOV A, R0</syntaxhighlight>
    • Registro Específico
    MOVX A, @DPTR</syntaxhighlight>
    • Indexado
    MOVC A, @A+DPTR</syntaxhighlight>


Exemplo:

INSTRUÇÕES DO 8051

ORG 0 Inicio: 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>


Aula 13/10: Exercícios Movimentação de Dados

Transferência de dados 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.
  • 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 direto.

Transferência de dados 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.

Leitura da memória 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 20/10: Instruções de desvio

  • 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
  • Observações:
    • 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)
    • Nas instruções CJNE o flag CARRY é setado caso o conteúdo do primeiro operando seja menor que o segundo operando. Nas demais instruções o CARRY não é afetado.


Exemplo:

  • Simule a execução do programa abaixo e confira o uso das instruções de jump e de endereços absolutos e relativos de long e short range.

.

   1:          N      0000             org 0H
   2:    0000  21 00                   ajmp BGN
   3:          N      0100             org 100h
   4:    0100  74 30           BGN:    mov A,#30H
   5:    0102  75 50 00                mov 50H,#00H
   6:    0105  B5 50 02        AGN:    cjne A,50H,AEQ
   7:    0108  80 04                   sjmp NXT
   8:    010A  D5 50 F8        AEQ:    djnz 50H,AGN
   9:    010D  00                      nop
  10:    010E  78 FF           NXT:    mov R0,#0FFH
  11:    0110  D8 FE           DWN:    djnz R0,DWN
  12:    0112  E8                      mov A,R0
  13:    0113  70 03                   jnz ABIG
  14:    0115  02 10 00                ljmp  AZR0
  15:    0118  00              ABIG:   nop
  16:          N      1000             org 1000H
  17:    1000  74 08           AZR0:   mov A,#08H
  18:    1002  90 10 00                mov DPTR,#1000H
  19:    1005  73                      jmp @A+DPTR
  20:    1006  00                      nop
  21:    1007  00                      nop
  22:    1008  01 00           HERE:   ajmp AZR0
  23:                                  END

</syntaxhighlight>


  • 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: Portas Paralelas (4h - Aula Faixa)

  • 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 27/10: 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 30/10: Exercícios (cont.)

Aula 10/11: Pilha e Subrotinas

  • Funcionamento da Pilha (Registrador, Instruções, Exemplos de Uso)
  • Subrotinas (Motivação, Instruções e funcionamento)


  • 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 13/11: Timer/Contador (4h - Aula faixa)

  • 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 1, sem controle externo mov TH0,#0D8h ;\ mov TL0,#0F0h ;/ => 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 17/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:

       call init_uart
       call envia_texto

jmp $


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',0

END

</syntaxhighlight>

  • O programa a seguir recebe uma mensagem:

buff_rec EQU 30h

       org 0h

main:

       call init_uart
       call recebe_texto

final: jmp 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
Recebe mensagem texto

recebe_texto:

       push 0 ;R0
       push ACC
       mov R0,#buff_rec

receber:

       call rec_car
       mov @R0,A
       inc R0
       jnz receber
       pop ACC
       pop 0 ;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 interrupção: 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
       reti       

</syntaxhighlight>

Aula 20/11: Trabalho Final

1ª Opção: Implementação

  • Simulação no Proteus com hardware externo
  • Grupo de até 3 alunos
  • Cronograma:
    • Especificação até 01/12
    • Entrega até 15/12
  • Equipes:
  1. Equipe (Gustavo Medeiros, Ronaldo): Controle Motor de Passo

2ª Opção: Lista de Exercício

  • Entrega da Lista
  • Defesa da resolução da lista
  • Individual
  • Cronograma:
    • Entrega até 04/12

Aula 08/12: 2ª Prova

Aula 11/12: Recuperação