Mudanças entre as edições de "MIC-2013-1-CST Introdução aos Microcoprocessadores"
Linha 552: | Linha 552: | ||
sjmp loop | sjmp loop | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | <code> | ||
+ | inicio: | ||
+ | mov P2,#0FFh | ||
+ | mov P1,#7fh | ||
+ | loop: | ||
+ | jb P2.0,pisca1 | ||
+ | jb P2.1,pisca2 | ||
+ | sjmp loop | ||
+ | |||
+ | pisca1: | ||
+ | mov A,P1 | ||
+ | rr A | ||
+ | mov P1,A | ||
+ | sjmp loop | ||
+ | |||
+ | pisca2: | ||
+ | mov A,P1 | ||
+ | rl A | ||
+ | mov P1,A | ||
+ | sjmp loop | ||
</syntaxhighlight> | </syntaxhighlight> |
Edição das 16h38min de 29 de maio de 2013
DADOS GERAIS DA DISCIPLINA
- Professor: Eraldo Silveira e Silva (email: eraldo@ifsc.edu.br)
- Plano de Ensino 2013-1
Cronograma
AULA | DATA | Descriçao |
---|---|---|
1 | 2/4/2013 | |
2 | 9/4/2013 |
AULA 1 - Dia 22/04/2013
OBS: aula improvisada pelo fato de ter sido repassada na última sexta.
Objetivos
- apresentar os objetivos da disciplina
- trabalhar memórias na forma de diagrama em blocos
- apresentar barramentos de endereço/dados/controle
- diferenciar conteúdo de endereço de memória;
- apresentar o procedimento de acesso para escrita e para a leitura;
- apresentar um diagrama de tempo simplificado de acesso a memória;
- apresentar a CPU/microcontrolador como a "entidade" que acessa a memória
Diagrama em blocos da memória e barramentos
No diagrama abaixo está representado um bloco de memória primária de 16x8 (dezesseis endereços por 8 bits).
- Note que uma posição de memória pode ser vista como uma caixa que possue um endereço e um conteúdo.
- O conteúdo associado a posição de memória é uma palavra binária e, neste caso, possui 8 bits.
ou
Para que us dispositivo externo possa "acessar" a memória para leitura ou escrita, ele deve se utilizar de um conjunto de fios que chamamos de barramentos.
Barramento de Endereços
Este barramento permite determinar o endereço de uma posição a ser acessada na memória. Um barramento de 4 linhas de endereço é designado por A3,A2,A1 e A0.
Supondo uma memória com endereços designados da forma hexadecimal de 0h a Fh. Supondo que A3 seja associado ao bit mais significativo e A0 ao bit menos significativo. Então, para acessar a posição Bh de memória, deve-se injetar A3=1, A2=0, A1=1 e A0=1. Note que
O termo "injetar" significa aqui que um dispositivo externo deve forçar tensão nas linhas do barramento. Esta tensão depende da tecnologia utilizada. Poderia ser, por exemplo, 5V para o nível lógico 1 e 0V par ao nível lógico 0.,
Diagrama de Tempo - Acesso para escrita
AULA 2
Objetivos
- apresentar, através de um exercício, um sistema hipotético de microprocessamento;
- desenvolver a noção do que é a linguagem de máquina e do que é linguagem assembly;
Sistema de microprocessamento hipotético
Seja um sistema hipotético de processamento com os seguintes componentes:
Uma CPU contendo:
- Unidade de Controle;
- Unidade Lógica e Aritmética;
- Registradores:
- Registrador de Instrução (IR) de palavra de 6 bits: Armazena a instrução que será executada pela CPU;
- Contador de Programa (PC) de palavra de 4 bits: Armazena o endereço da próxima instrução a ser executada;
- Registrador A e Registrador B, ambos de 6 bits: Registros temporários para transferência de dados da memória e operações de lógica e aritmética.
- Barramentos:
- Barramento de Dados - 6 bits : D5, D4, D3, D2, D1, D0.
- Barramento de Endereço - 4 bits : A3, A2, A1, A0.
- Barramento de Controle:
- WR - Escrever RAM (memória de dados);
- RD - Ler RAM (memória de dados);
- PSEN - Ler ROM (memória de programa)
- Memória externa de Dados: 16 posições de 6 bits;
- Memória externa de Programa: 16 posições de 6 bits;
\section{Conjunto de Intruções do Sistema Hipotético}
\begin{table}[h] \caption{Conjunto de Intruções} \begin{tabular} {|p{1.5cm}|c|p{10cm}|l|} \hline % Código & tam & Descrição & Mnemônico\\ \hline % 00\small{XXXX} & 1 & Ler endereço \small{XXXX} da memória de dados para acumulador A. & MOV A,direto \\ 01\small{XXXX} & 1 & Escrever no endereço \small{XXXX} da memória de dados o valor do acumulador A. & MOV direto,A \\ 100000 & 1 & Somar acumulador A com registrador B e colocar resultado em A. & ADD A,B \\ 100001 & 1 & Decrementar acumulador A. & DEC A \\ 100010 & 1 & Mover o conteúdo do acumulador A para o registrador B. & MOV B,A \\ 100011 & 1 & Subtrair o valor do registrador B do acumulador A e colocar resultado em A & SUBB A,B \\ 100100 & 1 & Parar o microprocessador & HALT \\ 100101 \small{YYYYYY} & 2 & Mover o dado imediato \small{YYYYYY} (armazenado na memória de programa) para o acumulador A & MOV A,\#dado6 \\ 11\small{XXXX} & 1 & Saltar (JUMP) para o endereço \small{XXXX} da memória de programa se acumulador A for diferente de 0. & JNZ direto \\ \hline % \end{tabular} \end{table}
\section{Executando um programa}
Considere a memoria de programa com o seguinte código:
\begin{table}[h] \caption{Conteúdo da Memória de Programa} \begin{tabular} {|c|c|p{8cm}|l|} \hline % Endereço & Conteúdo & Descrição & Mnemônico\\ \hline % 0H & 000001 & Movimenta conteúdo lido da posição 0001 da memória de dados para o registrador A & MOV A,1H \\ 1H & 100010 & Move o conteúdo do registrador A para o registrador B & MOV B,A \\ 2H & 000010 & Movimenta conteúdo lido da posição 0010 da memória de dados para o registrador A & MOV A,2H \\ 3H & 100011 & Subtrair o valor do registrador B do acumulador A e colocar resultado em A. & SUBB A,B \\ 4H &110011 & Saltar (JUMP) para o endereço 0011 da memória de programa se acumulador A for diferente de 0. & JNZ 3H\\ 5H & 010000 & Escrever no endereço 0000 da memória de dados o valor do acumulador A. & MOV 0H,A\\ 6H & 100100 & Parar o microprocessador & HALT \\ \hline % \end{tabular} \end{table}
Preencha a taebela conforme a execução do programa:
\begin{table}[h] \caption{Conteúdo dos principais registros a cada passo do programa exemplo} \begin{tabular} {|c|c|c|c|c|c|c|c|c|} \hline % passo & IR & A & B & PC & RAM 0000 & RAM 0001 & RAM 0010 & RAM 0011\\ \hline % 0 & 000000 & 000000 & 000000 & 0000 & 000111 & 000001 & 000011 & 000010\\ \hline % 1&&&&&&&&\\ \hline % 2&&&&&&&&\\ \hline % 3&&&&&&&&\\ \hline % 4&&&&&&&&\\ \hline % 5&&&&&&&&\\ \hline % 6&&&&&&&&\\ \hline % 7&&&&&&&&\\ \hline % 8&&&&&&&&\\ \hline % 9&&&&&&&&\\ \hline % 10&&&&&&&&\\ \hline % 11&&&&&&&&\\ \hline % 12&&&&&&&&\\ \hline %
As condições de ``reset do sistem são as seguintes: Registros A, B, PC e IR são zerados.
A CPU executará eternamente a sequência:\textbf{ ciclo de busca} e \textbf{ciclo de execução de instrução}. O ciclo de busca consiste basicamente em: \begin{enumerate}
\item Colocar o endereço do PC no Barramento de Endereços; \item Enviar o controle de leitura $\overline{PSEN}$ para Memória de Programa; \item Ler a instrução do Barramento de Dados através da aplicação de um comando de escrita no Registrador de Instrução (IR); \item Incrementar o PC em função do número de palavras da instrução.
\end{enumerate}
O ciclo de execução é basicamente a decoficação da instrução que está no Registrador de Instrução (IR), atualizando os registros ou dados da memória, dependendo da instrução em questão.
AULA 5
Objetivos
Os alunoss deverão ser capazes de:
- enumerar as principais característcias do microcontrolador 8051;
- desenvolver pequenos programas de movimentação de dados entre registradores,memória de código, memória interna e memória externa;
Material de Aula
AULA 6 - Dia 13/05/2013
Simulador MCU8051IDE
Ver detalhes do simulador MCU8051IDE aqui.
Exercícios no simulador
- Implementar um código para copiar o bloco de memória de 40h-4Fh para 60-6Fh usando movimentação indireta. Usar R0 e R1 e também a instrução incrementa Rn (INC R0 e INC R1).
AULA 7 - Dia 14/05/2013
Instruções de Movimentação Externa de Dados
Intsruções úteis:
movx A,@dptr
movx @dptr,A
inc dptr
mov dptr,#imediato
</syntaxhighlight>
Exemplo:
Exercícios
- Colocar a mensagem "ALO" nas posições de memória externa de dados 0670h,0671h e 0672h.
- Copiar o bloco de memória externa de dados das posições 1800h-1804h para as posições de memória externa 0000h-0004h.
AULA 8 - Dia 20/05/2013
Objetivo
- Instruções de Movimentação Dados da Área de Código
- Instruções de Jump Condicional para Controlar Loops
- Exercícios
Material de Apoio
Exercício 1
Considere o código abaixo.
inicio:
loop: jmp loop
msg1:
db 'ALO IFSC'
</syntaxhighlight>
Inserir um código para ler a a cadeia 'ALO' para as posições de memória RAM interna 60h,61h e 62h.
SOLUÇÃO:
inicio:
mov dptr, #msg1
mov a,#00h
movc a,@a+dptr
mov 60h,a
mov a,#01h
movc a,@a+dptr
mov 61h,a
mov a,#02h
movc a,@a+dptr
mov 62h,a
loop: jmp loop
msg1:
db 'ALO IFSC'
</syntaxhighlight>
Exercício 2
Ainda com relação ao código original do exercício anterior. Implementar um código para copiar a cadeia IFSC para as posições de memória RAM externa de dados 1000h,1001h,1002h e 1003h.
.
inicio:
mov dptr,#msg1
mov a,#4
movc a,@a+dptr
mov dptr,#1000h
movx @dptr, a
mov dptr,#msg1
mov a,#5
movc a,@a+dptr
mov dptr,#1001h
movx @dptr, a
mov dptr,#msg1
mov a,#6
movc a,@a+dptr
mov dptr,#1002h
movx @dptr, a
mov dptr,#msg1
mov a,#7
movc a,@a+dptr
mov dptr,#1003h
movx @dptr, a
msg1: db 'ALO IFSC'
loop: jmp loop
</syntaxhighlight>
Exercício 3
Considere o código abaixo.
inicio:
loop: jmp loop
msg1:
db 'ALO IFSC',0
</syntaxhighlight>
Implementar um código para copiar toda a mensagem iniciada em msg1 para uma área de memória interna iniciada em E0h.
OBS: Use o fato de que existe um 0 marcador de final de mensagem.
Exercício 4
Implementar uma função de boot (início de sistema) que zera as posições de memória ram interna de 40 a 7f usando movimentação indireta, e de ram externa de dados 0000h a 00ffh. Use a instrução cjne para elaborar loops que realizam as tarefas repetitivas.
Exercício 5
Seja o código abaixo:
inicio:
loop: jmp loop
msg1:
db 'ALO IFSC',0
</syntaxhighlight>
Observe que a msg 1 é terminada com o byte 0. Sabendo disto, elabore um código para copiar a msg1 para a RAM externa posição inicial 0600h, usando a instrução cjne.
Exercício 6
Considere o programa:
boot:
inicio:
mov A,#55h
mov dptr,#0e00h
movx @dptr,a
fim:
jmp fim
</syntaxhighlight>
Acrescente um código de boot que copia o código a partir do label inicio para a ram externa de dados, a partir da posição 0e000h.
AULA 8 - Dia 20/05/2013
Objetivo
- uso de instrução cjne para elanborar loops
Exercício 1
Iniciar um bloco de memória RAM interna de 50h até 7fh com o valor E5h.
Solução:
.
mov A,#0E5h
mov R0,#50h
inicio:
mov @R0,A
inc R0
cjne R0,#80h,inicio
loop: jmp loop
</syntaxhighlight>
Exercício 2
Copiar um bloco de memória RAM interna de 40h-7f para 20-5F usando move indireto.
Sugestão: usar R0 e R1.
.
mov R0,#40h
mov R1,#20h
loop1:
mov A,@R0
mov @R1,A
inc R0
inc R1
cjne R0,#80h,loop1
loop: jmp loop
</syntaxhighlight>
AULA 9 - Dia 27/05/2013
Objetivo
- Instruções de movimentação de byte para as portas
- instruções de loop condicional cjne
- representação de palavras binárias em binário, hexadecimal e decimal
Exercício 1
Piscar 8 vezes o led da posição P1.0 e depois 8 vezes o LED da posição P1.7. Colocar tudo em um loop infinito.
Use cjne A,imediato, label
.
inicio:
mov A,#8
loop1:
mov P1,#0FEh
mov P1,#0FFH
dec A
cjne A,#00,loop1
mov A,#8
loop2:
mov P1,#01111111b
mov P1,#11111111b
dec A
cjne A,#00,loop2
ljmp inicio
</syntaxhighlight>
Exercício 2
Piscar 8 vezes o led da posição P1.0 e depois 8 vezes o LED da posição P1.7. Colocar tudo em um loop infinito.
Use de cjne A,direto, label
inicio:
mov 50h,#8
loop_main:
mov A,#0
loop1:
mov P1,#0FEh
mov P1,#0FFH
inc A
cjne A,50h,loop1
mov A,#0
loop2:
mov P1,#01111111b
mov P1,#11111111b
inc A
cjne A,50h,loop2
ljmp loop_main
</syntaxhighlight>
Exercício 3
Piscar 8 vezes o led da posição P1.0 e depois 8 vezes o LED da posição P1.7. Colocar tudo em um loop infinito.
Use de cjne @R0,imediato, label
inicio:
mov R0,#50h
loop_main:
mov @R0,#0
loop1:
mov P1,#0FEh
mov P1,#0FFH
inc @R0
cjne @R0,#8,loop1
mov @R0,#0
loop2:
mov P1,#01111111b
mov P1,#11111111b
inc @R0
cjne @R0,#8,loop2
ljmp loop_main
</syntaxhighlight>
AULA 10 - Dia 3/06/2013
Objetivo
- Instruções de jump condicional controladas por bit
- Instruções de set, clear bit
Exercícios
.
inicio:
mov P2,#0FFh
loop:
jb P2.0,pisca1
jb P2.1,pisca2
sjmp loop
pisca1:
clr P1.0
setb P1.0
sjmp loop
pisca2:
clr P1.1
setb P1.1
sjmp loop
</syntaxhighlight>
inicio:
mov P2,#0FFh
mov P1,#7fh
loop:
jb P2.0,pisca1
jb P2.1,pisca2
sjmp loop
pisca1:
mov A,P1
rr A
mov P1,A
sjmp loop
pisca2:
mov A,P1
rl A
mov P1,A
sjmp loop
</syntaxhighlight>