MIC29004-2014-2
Microprocessadores: Diário de Aula 2016-1
Microprocessadores: Diário de Aula 2014-2
- Professor: Roberto de Matos
- Encontros: 2ª feira às 9:40h e 5ª feira às 7:30h
- Grupo no Facebook
Material
- Apostila Memória
- Slides Memória
- Introdução à Microprocessadores
- Arquitetura e Organização do BIP
- Microcontrolador e 8051
Listas de Exercício
- Lista de Exercícios: Memória, Arquitetura, Organização e BIP
- Lista Introdução a programação do BIP
- 2ª Lista de Exercícios: Microcontrolador 8051
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
- Links:
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 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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:
- Entrar no Windows.
- Baixe o arquivo de projeto. Coloque em um diretório conhecido.
- Clique sobre o arquivo. O PROTEUS será executado e o projeto aberto.
- 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.
- Grave o dado Ah na posição 0 de memória e Bh na posição 8.
- 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.
- 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
- Organização de um Código Assembly
- Instrução do montador: ORG, DB, END
- Prática com o MCU8051IDE.
- Conjunto de Instruções e Opcodes
- Modos de Endereçamento:
- 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
- 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 27/10: 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 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
- 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 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
- 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 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:
- 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