Mudanças entre as edições de "MIC-2013-1-CST Introdução aos Microcoprocessadores"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(30 revisões intermediárias por 2 usuários não estão sendo mostradas)
Linha 3: Linha 3:
 
*Professor: Eraldo Silveira e Silva (email: eraldo@ifsc.edu.br)
 
*Professor: Eraldo Silveira e Silva (email: eraldo@ifsc.edu.br)
 
*[[PlanoMIC-CST-2013-1 | Plano de Ensino 2013-1]]
 
*[[PlanoMIC-CST-2013-1 | Plano de Ensino 2013-1]]
 +
*Link da Ementa: [http://wiki.sj.ifsc.edu.br/index.php/Microprocessadores_e_Aplica%C3%A7%C3%B5es Ementa]
  
 
=Cronograma=
 
=Cronograma=
Linha 66: Linha 67:
  
  
=AULA 2=
+
=AULA 2 - Dia 23/04/2013 =
  
 
==Objetivos==
 
==Objetivos==
Linha 209: Linha 210:
 
Registrador de Instrução (IR), atualizando os registros ou dados da memória,
 
Registrador de Instrução (IR), atualizando os registros ou dados da memória,
 
dependendo da instrução em questão.
 
dependendo da instrução em questão.
 +
 +
=AULA 3 - Dia 29/04/2013 =
 +
 +
=AULA 4 - Dia 30/04/2013 =
  
 
=AULA 5=
 
=AULA 5=
Linha 396: Linha 401:
 
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.
 
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=
+
=AULA 8 - Dia  21/05/2013=
  
 
==Objetivo==
 
==Objetivo==
Linha 524: Linha 529:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=AULA 10 - Dia  3/06/2013=
+
=AULA 10 - Dia  28/05/2013=
 +
 
 +
Avaliação I
 +
 
 +
=AULA 11 - Dia  3/06/2013=
  
 
==Objetivo==
 
==Objetivo==
Linha 655: Linha 664:
 
:<math>Y = AB+CD</math>
 
:<math>Y = AB+CD</math>
  
=AULA 11 - Dia  4/06/2013=
+
=AULA 12 - Dia  4/06/2013=
  
 
==Objetivo==
 
==Objetivo==
Linha 690: Linha 699:
  
 
SOLUÇÃO ERALDO:
 
SOLUÇÃO ERALDO:
 +
<!--
 
<code>
 
<code>
 
.
 
.
Linha 748: Linha 758:
 
         sjmp ptd
 
         sjmp ptd
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
-->
  
 
==EXERCÍCIO 3==
 
==EXERCÍCIO 3==
Linha 1 001: Linha 1 012:
 
==Objetivos==
 
==Objetivos==
  
*Operações Lógicas com Bytes
 
 
*Exercícios preparatórios para a avaliação 2;
 
*Exercícios preparatórios para a avaliação 2;
  
Linha 1 037: Linha 1 047:
  
  
=Aula 15 - Dia 25/06/2013=
+
=Aula 16 - Dia 25/06/2013=
 +
 
 +
AVALIAÇÃO II
  
=Aula 16 - Dia 1/07/2013=
+
=Aula 17 - Dia 1/07/2013=
  
 
==Objetivos==
 
==Objetivos==
Linha 1 081: Linha 1 093:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
=Aula 17 - Dia 2/07/2013=
+
=Aula 18 - Dia 2/07/2013=
  
 
==Objetivos==
 
==Objetivos==
Linha 1 088: Linha 1 100:
  
 
#Modificar o exercício (primeiro) da aula anterior de modo a realizar TAMBÉM  a substração dos números que estão na porta P1 e P2.
 
#Modificar o exercício (primeiro) da aula anterior de modo a realizar TAMBÉM  a substração dos números que estão na porta P1 e P2.
 +
<code>
 +
inicio:
 +
  clr C
 +
  mov A,P1
 +
  mov R0,P2
 +
jb P3.1, soma
 +
subb A,R0
 +
sjmp mostrar
 +
soma: 
 +
add A,R0
 +
mostrar:
 +
        cpl A
 +
mov P0,A
 +
cpl C
 +
mov P3.0,C
 +
fim: sjmp fim
 +
</syntaxhighlight>
 +
 +
#Variação do exercício anterior com as 4 operações controladas por P3.1 e P3.2.
 +
 +
<code>
 +
inicio:
 +
  clr C
 +
  mov A,P1
 +
  mov R0,P2
 +
jb P3.1, ponto1
 +
        jb P3.2, multiplica
 +
        ;divide aqui
 +
mov B,R0
 +
div AB
 +
        sjmp mostrar
 +
multiplica:
 +
        ;multiplica
 +
mov B,R0
 +
mul AB
 +
;aqui tem um problema com o mostrar
 +
;mostar somente permite visualizar o A
 +
        sjmp mostrar
 +
ponto1:
 +
        jb P3.2, soma
 +
        ;subtrai aqui               
 +
subb A,R0
 +
sjmp mostrar
 +
soma: 
 +
add A,R0
 +
mostrar:
 +
        cpl A
 +
mov P0,A
 +
cpl C
 +
mov P3.0,C
 +
fim: sjmp fim
 +
</syntaxhighlight>
 +
 +
=Aula 19 - Dia 8/07/2013=
 +
 +
==Objetivos==
 +
 +
*Temporizadores e Contadores no 8051
 +
 +
==Referências==
 +
 +
*[[Arquivo:MIC_8051-TemporizadoresContadores.pdf | Temporizadores-Contadores]]
 +
 +
==Exercícios==
 +
 +
1.Implementar o exemplo da nota de aula acima (valores de timer modificado para simulação):
 +
 +
<code>
 +
.
 +
inicio:
 +
        lcall delay
 +
 +
fim:    sjmp fim
 +
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,#FFh    ;\
 +
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 automatica
 +
ret
 +
</syntaxhighlight>
 +
 +
2.Modificar o exemplo para realizar a temporização baseada no pino externo T0 (modo contador)
 +
 +
3.Modificar o exemplo para realizar a contagem controlada pelo Gateway externo (INT0). Note que habilita se 0.
 +
Ver pinos do 8051 aqui: [http://www.google.com.br/imgres?imgurl=http://aninditadhikary.files.wordpress.com/2011/01/8051pins.png&imgrefurl=http://aninditadhikary.wordpress.com/tag/intel-8051/&h=537&w=546&sz=67&tbnid=w_AHvE4Z1AtfXM:&tbnh=90&tbnw=92&zoom=1&usg=__GFhzt-MDKo-ZQpAs4icqxTH_1tA=&docid=jQeswXN8vCbvnM&sa=X&ei=bqzWUcHQA4Pn0gGso4CYDQ&ved=0CEMQ9QEwAQ&dur=562 | Pinagem 8051]
 +
 +
4.Modificar o exemplo para ampliar o poder de contagem usando uma variável auxiliar para contagem de número de estouros.
 +
 +
5.Implementar um programa para contar garrafas que passam sobre uma esteira. Quando a contagem de garrafas chegar a 10 comandar a parada da esteira (LED em P1.0) e comandar acionar sistema de limpeza por 10s (pino de comando P1.1). Ao final ligar novamente a esteira, resetar a contagem e começar a contar novamente.
 +
 +
 +
=Aula 20 - Dia 9/07/2013=
 +
 +
==Objetivos==
 +
 +
*interrrupções
 +
 +
==Referencias==
 +
 +
*[[Arquivo:MIC_8051-Interrupcoes.pdf | Interrupções]]
 +
 +
==Exercício==
 +
 +
<code>
 +
.
 +
  ;================================
 +
  ;preparacao da entrada de reset e do vetor de interrupcao
 +
        org 00h
 +
        sjmp main
 +
        org 003h
 +
        sjmp TratarINT0
 +
  ;=================================
 +
  ;programa principal
 +
  main:
 +
          setb EX0
 +
          setb EA ; habilita todas interrupcoes
 +
          mov A,#00h
 +
          mov C,P2.0
 +
          mov 00h,C
 +
          mov C,P2.1
 +
          anl C,00h
 +
          mov P1.0,C
 +
 +
loop:    sjmp loop
 +
  ;=================================
 +
  ;Rotina de Interrupcao
 +
  ;=================================
 +
  TratarINT0:
 +
          push psw
 +
          inc A
 +
          pop psw
 +
          reti
 +
</syntaxhighlight>
 +
 +
=Aula 21 - Dia 15/07/2013=
 +
 +
=Definição de Trabalhos=
 +
 +
*Alarme com 4 sensores e saída conda de duas frequências com chave de desligar e ligar;
 +
(Eq.1 - Karol e Josiane) - (Eq.9 - Juan )
 +
*Alarme com 4 entradas e com código reprogramável de ligar/desligar. Usar codigo de 6 bits e um sbit de ENTER.
 +
(Eq.2 - Paulo e Giovana) - (eq 10 - Renato e Vinicius Rodrigues)
 +
*Alarme com 4 entradas e com código fixo de ligar/desligar mas com entrada via teclado de varredura;
 +
(Eq.3 - Valmir e Teodor)
 +
*Alarme com 4 entradas, chave ligar/desligar e com temporização programável de ativação das entradas;
 +
(Eq.5 - Markus e Ramon)
 +
*Gerador de onda quadrada com controle do duty cycle;
 +
(Eq.6 - Giovani e Fabiana) (Eq.8 - Alfredo e Antônio)
 +
*Contador de eventos externos com dois displays de contagem hexadecimal controlados por varredura;
 +
(Eq.7 - Jaison e Paulo Igor)
 +
*Calculada minimalista que soma e multiplica 1, 2 e 3 mostrando em um display de 7 segmentos (um display é suficiente). Usar teclado varredura.
 +
(Eq.4 - Rafael e Guilherme))
 +
 +
=Aula 22 - Dia 16/07/2013=
 +
 +
DESENVOLVIMENTO DO TRABALHO
 +
 +
=Aula 23 - Dia 22/07/2013=
 +
 +
DESENVOLVIMENTO DO TRABALHO
 +
 +
=Aula 24 - Dia 23/07/2013=
 +
 +
DESENVOLVIMENTO DO TRABALHO
 +
 +
=Aula 25 - Dia 29/07/2013=
 +
 +
REVISÃO RECUPERAÇÂO
 +
 +
=Aula 26 - Dia 30/07/2013=
 +
 +
RECUPERAÇÂO
 +
 +
Exercício 1
 +
 +
Elabore uma SUBROTINA para copiar uma mensagem terminada em '0' (número zero) da MEMÓRIA DE CÓDIGO
 +
(portanto usar movc) para a MEMÓRIA EXTERNA DE DADOS. A subrotina receberá o endereço inicial
 +
da mensagem a ser copiada em DPTR e receberá o endereço inicial da memória para onde será copiada em
 +
R0 (parte alta) e R1 (parte baixa do endereço). Exemplo de chamada da função:
 +
 +
<code>
 +
;
 +
inicio: 
 +
        mov dptr,#msg1
 +
        mov R0,#0ah
 +
        mov R1,#00h
 +
        lcall copiar_mensagem
 +
loop:  jmp loop
 +
   
 +
msg1:
 +
        db 'ALO IFSC',0
 +
 +
copiar_mensagem:
 +
        ;implementar aqui
 +
 +
</syntaxhighlight>
 +
     
 +
Exercício 2
 +
 +
Implementar no microcontrolador a seguinte função lógica:
 +
:<math>Y = A+BC+D</math>
 +
Usar como P1.0(entrada A), P1.1(entrada B), P1.2 (entrada C), P1.3(entrada D) e P1.4(saída Y).
 +
Mostrar o funcionamento nas chaves e LED.

Edição atual tal como às 11h06min de 5 de junho de 2014

DADOS GERAIS DA DISCIPLINA

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.
DiagramaBlocosMemorias.jpg

ou

DiagramaBlocosMemorias2.jpg

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

DiagramaTempoAcessoEscrita.jpg


AULA 2 - Dia 23/04/2013

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 3 - Dia 29/04/2013

AULA 4 - Dia 30/04/2013

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

Arquitetura8051

Apostila Prof.Branco

AULA 6 - Dia 13/05/2013

Simulador MCU8051IDE

Ver detalhes do simulador MCU8051IDE aqui.

Exercícios no simulador

Ex1Aula6MIC.jpg
  1. 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:

Ex1Aula7MIC.jpg

Exercícios

  1. Colocar a mensagem "ALO" nas posições de memória externa de dados 0670h,0671h e 0672h.
    Ex2Aula7MIC.jpg
  2. 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

Media:Aula8-ModosEndereçamento-Exercícios.pdf

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 21/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 28/05/2013

Avaliação I

AULA 11 - Dia 3/06/2013

Objetivo

  • Instruções de jump condicional controladas por bit
  • Instruções de set, clear bit
  • Operações lógicas com bit.
  • Registradores com acesso por bit e byte

Instruções de Salto Condicional a um BIT

Observe o exemplo abaixo. A instrução jb testa o estado de um bit (um pino da porta externa P2) e salta se estiver 1. Nos códigos de pisca LED são usadas as instruções setb e clr que permitem setar e resetar bit respectivamente.

. 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>

EXERCÍCIOS

  1. Modificar o programa anterior criando um código para rotacionar bits a direita na porta P1 e para rotacionar bits a esquerda, conforme o estado das chaves.

. inicio: mov P2,#0FFh loop: jb P2.0,rotaciona_direita sjmp rotaciona_esquerda


rotaciona_direita: mov P1,#01111111b mov P1,#10111111b mov P1,#11011111b mov P1,#11101111b mov P1,#11110111b mov P1,#11111011b mov P1,#11111101b mov P1,#11111110b sjmp loop

rotaciona_esquerda: mov P1,#11111110b mov P1,#11111101b mov P1,#11111011b mov P1,#11110111b mov P1,#11101111b mov P1,#11011111b mov P1,#10111111b

       mov  P1,#01111111b	

sjmp loop </syntaxhighlight>

  1. Acrescente no loop principal um jb para saltar para um código que pisca os LEDs de forma alternada.
  2. Modificar o programa exemplo substituindo as instruções de setb e clr por instruções de movimentação de byte para a porta.

O registrador PSW e o flag C

Todo microcontrolador possui um registrador que reflete o estado de alguns pontos do sistema. O 8051 possui o registrador PSW de 8 bits. Neste registrador existe um flag chamado de CARRY (C). Este flag possui várias aplicações, mas especialmente é usado para armazenar o VAI UM de operações aritméticas. Ele também pode ser usado para acumular operações lógicas a nível de bit. Por exemplo, as instruções anl c,direto e orl c,direto (e os complementos do direto). Também existem as instruções jnc e jc que permite saltar se o CARRY estiver setado ou resetado.

Exemplo 1: uma implementação da porta E:

inicio:

       mov C, P2.0
       anl C, P2.1
       cpl c
       mov P1.0,c

sjmp inicio </syntaxhighlight>

Exemplo 2: uma implementação da porta OU:

inicio:

       mov C, P2.0
       orl C, P2.1
       cpl c
       mov P1.0,c

sjmp inicio </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>

EXERCÍCIO 3

Implementar no microcontrolador uma porta lógica E com 3 entradas. Usar como entrada P2.0, P2.1 e P2.2. Usar como saída P1.0.

EXERCÍCIO 4

Implementar no microcontrolador a seguinte função lógica:

AULA 12 - Dia 4/06/2013

Objetivo

  • Memória RAM com acesso por bit e por byte;
  • Exercícios de operações com bits.

Memória RAM com acesso por bit

Na aula anterior vimos que alguns registradores são acessíveis por bit e por byte. Esta facilidade permite que possamos modificar o valor de um bit de um registrador sem alterar os demais. Podemos por exemplo, armazenar bits individualmente em um registrador.

Adicionalmente, o 8051 possui uma parte da memória RAM que é acessível por bit e por byte. Ver detalhes na nota de aula abaixo.

Arquivo:OperacoesBit.pdf

EXERCÍCIO 1: alarme simples

PROBLEMA: Construir um alarme com 4 sensores de entrada. Se pelo menos um sensor (chave) for ativado o sistema deve disparar um alarme. Assim que os sensores forem desabilitados o alarme desliga.

ETAPA 1: Definição de quem é entrada e que é saída.

ENTRADAS: P2.0 a P2.3 SAÌDAS: P1.7 (alarme ativado = LED piscando)

ETAPA 2: Fazer um projeto simples (um fluxograma simples do sistema)

ETAPA 3: Implementação do Código e Testes

EXERCÍCIO 2: alarme simples com memorização de sensores violados

  • Acrescentar saídas para representar o estado dos sensores. Se um sensor for violado um LED deve acender (de P1.0 a P1.3).

SOLUÇÃO ERALDO:

EXERCÍCIO 3

  • Acrescentar saídas para representar estado de sensores. Se um sensor for violado, mesmo que volte ao normal deve registrar em uma saída (de P1.0 a P1.3).
  • Acrescentar uma chave para resetar registros de violação (P3.0)
  • Acrescentar uma chave para desligar alarme (P3.1)

EXERCÍCIO 4: alarme simples com inibidor de entradas

  • As vezes é necessário desabilitar algum sensor. Acrescentar uma chave para desligar sensores.

Aula 12 - Dia 10/06/2013

  • Uso de Pilha e Subrotina
  • Exercícios

Material da Referência

Arquivo:ControleFluxo.pdf

Solução ex1 da nota de aula:

programa principal

inicio:

       mov A,#0eeh

mov R0,#010 mov R1,#056h lcall zerar_iram

mov R0,#020 mov R1,#030h lcall zerar_iram fim: sjmp fim

subtorina para zerar memoria iram
R0-> numero de bytes a ser zerado
R1-> endereço inicial da IRAM

zerar_iram: push A mov A,#00 pto2: cjne R0,#00,pto1

       sjmp fim_sub1

pto1: mov @R1,A dec R0 inc R1

       sjmp pto2

fim_sub1: pop A ret </syntaxhighlight>

Exemplo do Funcionamento da Pilha

O programa abaixo demonstra o funcionamento da pilha. Execute-o passo a passo, verificando o estado do registrador sp e da memória interna. Note que a pilha poderá ser usada como uma área de rascunho, onde se pode salvar valores que se deseja recuperar futuramtente.

.

        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>

Aula 13 - Dia 24/06/2013

  • avaliação

Aula 14 - Dia 1/6/2-13

Objetivos

  • operações aritméticas e lógicas

Material da Aula

Aula 13 - Dia 11/06/2013

  • Exercícios

Aula 14 - Dia 17/06/2013

  • Conteúdo da aula 12 (que foi a greve dos transportes)

Exemplo de chamada de subrotina

Complete o exercício abaixo.

. inicio:

    mov A,#5
    lcall rotacionar_direita
    mov A,#6
    lcall piscar
    mov A,#3
    lcall rotacionar_esquerda
    sjmp inicio

rotacionar_direita:

    ret

piscar:

    ret

rotacionar_esquerda:

    ret

</syntaxhighlight>

Exercícios

  • Implementar um programa que incrementa sequencialmente um display de 7 segmentos (de 0 a 9). Após o 9 retornar ao 0.

. inicio: mov P1,#11000000b ; 0 mov P1,#11111001b ; 1 mov P1,#10100100b ; 2 mov P1,#10110000b ; 3 mov P1,#10011001b ; 4 mov P1,#10010010b ; 5 mov P1,#10000010b ; 6 mov P1,#11111000b ; 7 mov P1,#10000000b ; 8 mov P1,#10010000b ; 9 sjmp inicio </syntaxhighlight>

  • Modificar o exercício anterior para que o incremento no dsplay seja controlado por uma chave externa. Exemplo: A chave normalmente fica a 1. Quando ligada vai a 0 e incrementa em uma unidade o valor do display. Ao voltar a chave para 1 nada acontece. Ou seja, as contagens são disparadas pela borda negativa da entrada ligada a chave.

. inicio: mov P1,#11000000b ; 0 lcall aguardar_chave mov P1,#11111001b ; 1 lcall aguardar_chave mov P1,#10100100b ; 2 lcall aguardar_chave mov P1,#10110000b ; 3 lcall aguardar_chave mov P1,#10011001b ; 4 lcall aguardar_chave mov P1,#10010010b ; 5 lcall aguardar_chave mov P1,#10000010b ; 6 lcall aguardar_chave mov P1,#11111000b ; 7 lcall aguardar_chave mov P1,#10000000b ; 8 lcall aguardar_chave mov P1,#10010000b ; 9 lcall aguardar_chave sjmp inicio </syntaxhighlight>

  • Modificar o alarme da aula anterior para que o número de violações de sensores seja registrado em um display (limitado ao número de 9).
  • Implementar um programa usando lógica binária que implementa um flip-flop JK.Considere o disparo com borda negativa.
Tabela Verdade Flip Flop JK
CLK J K
0,1, X X
0 0
0 1 0
1 0 1
1 1

ENT_J equ P1.0 ENT_K equ P1.1 CLK equ P1.2 SAI_Q equ P2.0 SAI_QB equ P2.1

INICIO DO PROGRAMA

inicio: lcall resetar_jk loop: lcall detector_borda jb ENT_J, j_setado jb ENT_K, k_setado sjmp loop

FINAL DO LOOP PRINCIPAL

j_setado: jnb ENT_K, aux_k_resetado cpl SAI_Q cpl SAI_QB sjmp loop aux_k_resetado: lcall setar_jk sjmp loop

k_setado: lcall resetar_jk sjmp loop

SUBROTINA DE DETECÇÃO DE BORDA

detector_borda: loop2: jnb CLK,loop2 loop1: jb CLK,loop1 ret

SUBROTINA PARA RESETAR FLIP-FLOP (lógica negativa)

resetar_jk: clr SAI_QB setb SAI_Q ret

SUBROTINA PARA SETAR FLIP-FLOP

setar_jk: clr SAI_Q setb SAI_QB ret </syntaxhighlight>

  • Construir o alarme da aula anterior usando subrotinas.

Aula 15 - Dia 18/06/2013

Objetivos

  • Exercícios preparatórios para a avaliação 2;

Operações Lógicas com bytes

Exercícios

  1. Implementar um sistema de controle de acesso com código de 4 bits. Use uma chave para validar o código. Se o código conferir, abrir uma porta (acender um LED) caso contrário piscar 30 vezes um outro LED.

. ENTER EQU P1.0 COD1 EQU P1.1 COD2 EQU P1.2 COD3 EQU P1.3 COD4 EQU P1.4

iniciar o sistema
esperar que seja teclado enter

loop_enter: jnb ENTER,loop_enter

testar bit 1 - vai para sinalizar erro se incorreto

jb COD1,sinalizar_erro jb COD2,sinalizar_erro jb COD3,sinalizar_erro jb COD4,sinalizar_erro ;lcall abrir_porta

       sjmp loop_enter

sinalizar_erro:

       ;sinalizar erro
       sjmp loop_enter  

</syntaxhighlight>

  1. Implementar um programa com a seguinte lógica: . Quando o resultado de Y for 1, piscar dois LEDs de forma alternada, caso contrário piscar sumultaneamente.


Aula 16 - Dia 25/06/2013

AVALIAÇÃO II

Aula 17 - Dia 1/07/2013

Objetivos

  • Operações lógicas e aritméticas em nível de bytes.
  • Exercícios.

Referências

Arquivo:MIC-OperacoesArimeticas.pdf

Exercícios

  1. Implementar um programa que some dois números não sinalizados de 8 bits das portas P1 e P2 e mostra o resultado no display de 7 segmentos. Use o ponto do display para indicar o carry e uma chave (P0.1 como ENTER).
  2. Incremente o programa para subtrair os numeros (P1-P2). Use uma chave (P0.2) para decidir qual a operação desejada,

SOLUÇÂO ROTINA DE SOMA DE 16 bits inicio: mov R1,#0FFh mov R0,#6Ah ; primeiro numero FF6A mov R3,#0EFh mov R2,#0FFh ; segundo numero: EFFF

	lcall somar_16u
	; neste momento R6R5R4 possuem os resultados da soma

somar_16u:

       push A
       mov A,R0
       add A,R2
       mov R4,A
       mov A, R1
       addc A, R3
       mov R5,A
       mov A,#00
       mov A.0, C
       mov R6,A
       pop A
       ret

fim: sjmp fim </syntaxhighlight>

Aula 18 - Dia 2/07/2013

Objetivos

  • Continuação da aula anterior
  1. Modificar o exercício (primeiro) da aula anterior de modo a realizar TAMBÉM a substração dos números que estão na porta P1 e P2.

inicio:

 	clr C
 	mov A,P1
 	mov R0,P2

jb P3.1, soma subb A,R0 sjmp mostrar soma: add A,R0 mostrar:

       cpl A

mov P0,A cpl C mov P3.0,C fim: sjmp fim </syntaxhighlight>

  1. Variação do exercício anterior com as 4 operações controladas por P3.1 e P3.2.

inicio:

 	clr C
 	mov A,P1
 	mov R0,P2

jb P3.1, ponto1

       jb P3.2, multiplica
       ;divide aqui

mov B,R0 div AB

       sjmp mostrar

multiplica:

       ;multiplica

mov B,R0 mul AB ;aqui tem um problema com o mostrar ;mostar somente permite visualizar o A

       sjmp mostrar

ponto1:

       jb P3.2, soma
       ;subtrai aqui        	        

subb A,R0 sjmp mostrar soma: add A,R0 mostrar:

       cpl A

mov P0,A cpl C mov P3.0,C fim: sjmp fim </syntaxhighlight>

Aula 19 - Dia 8/07/2013

Objetivos

  • Temporizadores e Contadores no 8051

Referências

Exercícios

1.Implementar o exemplo da nota de aula acima (valores de timer modificado para simulação):

. inicio:

       lcall delay

fim: sjmp fim 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,#FFh ;\ 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 automatica ret </syntaxhighlight>

2.Modificar o exemplo para realizar a temporização baseada no pino externo T0 (modo contador)

3.Modificar o exemplo para realizar a contagem controlada pelo Gateway externo (INT0). Note que habilita se 0. Ver pinos do 8051 aqui: | Pinagem 8051

4.Modificar o exemplo para ampliar o poder de contagem usando uma variável auxiliar para contagem de número de estouros.

5.Implementar um programa para contar garrafas que passam sobre uma esteira. Quando a contagem de garrafas chegar a 10 comandar a parada da esteira (LED em P1.0) e comandar acionar sistema de limpeza por 10s (pino de comando P1.1). Ao final ligar novamente a esteira, resetar a contagem e começar a contar novamente.


Aula 20 - Dia 9/07/2013

Objetivos

  • interrrupções

Referencias

Exercício

.

 ;================================
 ;preparacao da entrada de reset e do vetor de interrupcao
        org 00h
        sjmp main
        org 003h
        sjmp TratarINT0
 ;=================================
 ;programa principal
 main:
         setb EX0
         setb EA ; habilita todas interrupcoes
         mov A,#00h
         mov C,P2.0
         mov 00h,C
         mov C,P2.1
         anl C,00h
         mov P1.0,C

loop: sjmp loop

  ;=================================
  ;Rotina de Interrupcao
  ;=================================
  TratarINT0:
         push psw
         inc A
         pop psw
         reti

</syntaxhighlight>

Aula 21 - Dia 15/07/2013

Definição de Trabalhos

  • Alarme com 4 sensores e saída conda de duas frequências com chave de desligar e ligar;
(Eq.1 - Karol e Josiane) - (Eq.9 - Juan )
  • Alarme com 4 entradas e com código reprogramável de ligar/desligar. Usar codigo de 6 bits e um sbit de ENTER.
(Eq.2 - Paulo e Giovana) - (eq 10 - Renato e Vinicius Rodrigues)
  • Alarme com 4 entradas e com código fixo de ligar/desligar mas com entrada via teclado de varredura;
(Eq.3 - Valmir e Teodor)
  • Alarme com 4 entradas, chave ligar/desligar e com temporização programável de ativação das entradas;
(Eq.5 - Markus e Ramon)
  • Gerador de onda quadrada com controle do duty cycle;
(Eq.6 - Giovani e Fabiana) (Eq.8 - Alfredo e Antônio)
  • Contador de eventos externos com dois displays de contagem hexadecimal controlados por varredura;
(Eq.7 - Jaison e Paulo Igor)
  • Calculada minimalista que soma e multiplica 1, 2 e 3 mostrando em um display de 7 segmentos (um display é suficiente). Usar teclado varredura.
(Eq.4 - Rafael e Guilherme))

Aula 22 - Dia 16/07/2013

DESENVOLVIMENTO DO TRABALHO

Aula 23 - Dia 22/07/2013

DESENVOLVIMENTO DO TRABALHO

Aula 24 - Dia 23/07/2013

DESENVOLVIMENTO DO TRABALHO

Aula 25 - Dia 29/07/2013

REVISÃO RECUPERAÇÂO

Aula 26 - Dia 30/07/2013

RECUPERAÇÂO

Exercício 1

Elabore uma SUBROTINA para copiar uma mensagem terminada em '0' (número zero) da MEMÓRIA DE CÓDIGO (portanto usar movc) para a MEMÓRIA EXTERNA DE DADOS. A subrotina receberá o endereço inicial da mensagem a ser copiada em DPTR e receberá o endereço inicial da memória para onde será copiada em R0 (parte alta) e R1 (parte baixa do endereço). Exemplo de chamada da função:

inicio:

       mov dptr,#msg1
       mov R0,#0ah
       mov R1,#00h
       lcall copiar_mensagem

loop: jmp loop

msg1:

       db 'ALO IFSC',0

copiar_mensagem:

       ;implementar aqui

</syntaxhighlight>

Exercício 2

Implementar no microcontrolador a seguinte função lógica:

Usar como P1.0(entrada A), P1.1(entrada B), P1.2 (entrada C), P1.3(entrada D) e P1.4(saída Y). Mostrar o funcionamento nas chaves e LED.