experiência 1 – reset + execução de programas no kit

Propaganda
MM – Microprocessadores e Microcontroladores – Roteiro da Experiência 9
1
EXPERIÊNCIA 9 – USO DO DISPLAY
Parte I – Fundamentos Teóricos
a) Utilização de parâmetros e de valor de retorno de uma sub-rotina
Freqüentemente, a forma de execução de uma sub-rotina depende de um ou mais valores definidos quando da sua ativação. Esses
valores, chamados de parâmetros, são geralmente passados a ela através de registradores. Antes do desvio para a sub-rotina, o
programa que a aciona atribui os valores dos parâmetros desejados a registradores previamente definidos. Depois de ativada, a
sub-rotina utiliza os valores que lhe foram passados nos devidos registradores para executar sua função.
Por outro lado, uma sub-rotina pode apresentar um ou mais valores de retorno, isto é, resultados para serem utilizados pelo
programa, logo após o retorno da sub-rotina. Nesse caso, é a sub-rotina que atribui os valores de retorno a registradores para que, após
o retorno, sejam utilizados pelo programa.
Graças a essa estratégia, pode-se utilizar, num programa, sub-rotinas previamente existentes, ou escritas por outros programadores,
desde que estejam convenientemente documentadas (com descrição dos registradores de parâmetros e dos registradores de valores de
retorno). Utilizando-se de parâmetros e de valores de retorno, essas sub-rotinas tornam-se muito mais flexíveis e abrangentes,
atendendo a um maior número de necessidades dos programadores.
b) Sub-rotinas do programa monitor
O programa monitor do “kit”, gravado em sua memória não volátil (EPROM), incorpora pouco mais de uma dezena de sub-rotinas
que, dividas em 3 grupos – sub-rotinas para teclado, sub-rotinas para display e sub-rotinas de uso geral –, estão disponíveis a qualquer
programa que seja carregado na memória do “kit”, para ser por ele executado. Basta que, nesse programa, cada sub-rotina seja ativada
através da instrução LCALL (abordada na experiência anterior), desviando para seu respectivo endereço. Muitas delas possuem
registradores de parâmetros, aos quais devem ser atribuídos os devidos valores, antes da sua ativação; e algumas apresentam um valor
de retorno, que pode ser utilizado pelo programa, após a execução da sub-rotina. O “Manual de Experiências” do Módulo SDM 9431,
em seu capítulo 5, faz uma descrição das sub-rotinas do “kit”, apresentando seus endereços, parâmetros e valores de retorno.
c) Display do “kit”
O display do “kit” é feito com cristal líquido (“LCD – liquid crystal display”), podendo apresentar caracteres alfabéticos e
numéricos, além de outros caracteres especiais (símbolos gráficos, letras gregas e caracteres japoneses). Permite, ainda, que o próprio
usuário crie seus caracteres, desde que numa matriz de 8 x 8 pontos para cada caracter.
O display pode apresentar 2 linhas com 16 caracteres em cada linha. Esses 16 caracteres apresentados, e mais outros 24 caracteres
(ocultos), são armazenados numa área de memória (“buffer”) interna ao dispositivo de controle do display, com capacidade, portanto,
de 40 caracteres por linha (80 caracteres no total). Cada caracter é codificado num byte, de acordo com a tabela ASCII. A cada
posição dessa memória interna do dispositivo de controle do display está associado um endereço: os endereços de 80h a A7h
correspondem à primeira linha, e os endereços de C0h a E7h correspondem à segunda linha.
O acesso ao display por um programa é feito através da escrita em 2 registradores existentes no dispositivo de controle do display:
o registrador de dados e o registrador de comandos. No “kit”, esses registradores são acessados como se fossem posições da memória
externa do 8051, nos endereços EC00h (registrador de comandos) e EC01h (registrador de dados).
Quando um valor (um byte) é escrito no registrador de dados, esse valor (que deve ser o código ASCII de um caracter) é colocado
numa das 80 posições do “buffer” interno do display – na que estiver sendo correntemente apontada por um cursor.
Já a escrita de um byte no registrador de comandos permite que, de acordo com o valor escrito (o código de um comando), seja
executada uma ação do tipo: iniciação do display, posicionamento do cursor, deslocamento dos caracteres correntemente
armazenados, limpeza do display, definição do aspecto do cursor, etc.
d) Sub-rotinas do programa monitor para utilização do display
A seguir, são apresentadas as sub-rotinas do programa monitor que manipulam o display, e que estão disponíveis aos programas
de usuários.
CLR_DSP
endereço
parâmetro(s)
valor(es) de retorno
10AAh
nenhum
nenhum
funcionamento: Limpa o display, e coloca o cursor na primeira coluna da primeira linha.
registrador(es) alterado(s)
nenhum
AC_DSP
endereço
parâmetro(s)
valor(es) de retorno
registrador(es) alterado(s)
ACC
10E7h
nenhum
nenhum
(valor a ser apresentado)
funcionamento: Apresenta no display o valor do acumulador, em 2 caracteres hexadecimais, a partir da posição corrente do cursor,
que é deslocado para a direita.
DPT_DSP
endereço
parâmetro(s)
valor(es) de retorno
registrador(es) alterado(s)
DPTR
1121h
nenhum
nenhum
(valor a ser apresentado)
funcionamento: Apresenta no display o valor do registrador DPTR, em 4 caracteres hexadecimais, a partir da posição corrente do
cursor, que é deslocado para a direita.
MM – Microprocessadores e Microcontroladores – Roteiro da Experiência 9
2
DSP_DAT
endereço
parâmetro(s)
ACC
10FFh
valor(es) de retorno
registrador(es) alterado(s)
nenhum
nenhum
(código do caracter a ser apresentado)
funcionamento: Apresenta no display o caracter cujo código ASCII é fornecido pelo acumulador, na posição corrente do cursor, que é
deslocado para a direita.
MENS
endereço
parâmetro(s)
valor(es) de retorno
registrador(es) alterado(s)
DPTR
110Fh
nenhum
DPTR
(endereço inicial da mensagem)
funcionamento: Apresenta no display uma mensagem (seqüência de caracteres, codificados em ASCII), cujo endereço inicial é
fornecido pelo registrador DPTR, a partir da posição corrente do cursor, que é deslocado para a direita. O comprimento da mensagem
(número de caracteres) é o primeiro byte da mensagem (apontado pelo registrador DPTR).
DSP_COM
endereço
parâmetro(s)
valor(es) de retorno
registrador(es) alterado(s)
ACC
109Ah
nenhum
nenhum
(código do comando)
funcionamento: Executa o comando de display cujo código é o valor do acumulador (a codificação dos comandos para o display será
apresentada no roteiro da próxima experiência).
Parte II – Roteiro Experimental
Nesta experiência, utilizaremos o display de cristal líquido. Da mesma forma que o programa da experiência anterior, o programa
desta experiência utiliza uma chave (“dip switch”), que deve ser conectada ao pino P1.7. Só depois de fazer essa conexão, ligue o
“kit”, e carregue, na memória RAM externa, o programa da Tabela 1, digitando seu código de máquina. Note que o programa possui
2 trechos: uma “parte principal”, que deve ser carregada a partir do endereço 5000h; e o trecho correspondente à sub-rotina TEMPO,
que deve ser carregado a partir do endereço 5100h.
passo endereço
código de máquina
1
5000
75 81 2F
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
5003
5005
5008
500B
500D
5010
5012
5015
5016
5019
501A
501B
501D
5020
5100
5102
5104
5106
5107
5109
510B
510D
510F
5111
5113
5115
5117
78
12
30
74
12
74
12
E8
12
04
F8
74
12
80
C0
C0
C0
F8
79
7A
DA
D9
D8
D0
D0
D0
22
00
10
97
4E
10
3D
10
AA
FD
FF
FF
10 E7
08
51 00
E3
00
01
02
FF
FF
FE
FA
F6
02
01
00
rótulo
mnemônico e operandos
MOV SP, #2Fh
comentários
inicia a base da pilha, logo acima da área bit
endereçável
inicia o valor da contagem com zero
limpa o display
se chave para baixo, trava
coloca código ASCII de ??? no acumulador
apresenta o caracter no display
coloca código ASCII de ??? no acumulador
apresenta o caracter no display
coloca o valor da contagem no acumulador
apresenta o valor do acumulador no display
incrementa o valor da contagem
guarda o valor da contagem atual
parâmetro para TEMPO (=1s)
espera um tempo
volta para apresentar novo valor
salva R0 na pilha
salva R1 na pilha
salva R2 na pilha
inicia R0 (com o valor do parâmetro)
inicia R1 (com 255)
inicia R2 (com 255)
fica no laço interno até zerar R2
fica no laço intermediário até zerar R1
fica no laço externo até zerar R0
restaura R2 da pilha
restaura R1 da pilha
restaura R0 da pilha
MOV R0, #0
LCALL CLR_DSP
JNB P1.7, TRAVA
MOV A, #4Eh
LCALL DSP_DAT
MOV A, #3Dh
LCALL DSP_DAT
MOV A, R0
LCALL AC_DSP
INC A
MOV R0, A
MOV A, #8
LCALL TEMPO
SJMP REPETE
TEMPO:
PUSH 0
PUSH 1
PUSH 2
MOV R0, A
VOLTA3:
MOV R1, #255
VOLTA2:
MOV R2, #255
VOLTA1:
DJNZ R2, VOLTA1
DJNZ R1, VOLTA2
DJNZ R0, VOLTA3
POP 2
POP 1
POP 0
RET
Tabela 1 – Programa que utiliza as sub-rotinas do display
REPETE:
TRAVA:
MM – Microprocessadores e Microcontroladores – Roteiro da Experiência 9
3
Posicione a chave conectada ao pino P1.7 para baixo, posição em que ela deve fornecer tensão baixa (0V), e, só então, execute o
programa a partir do endereço 5000h, através da função EXEC do Monitor.
1) O registrador SP é iniciado com o valor 2Fh, o que significa que a primeira posição da memória interna que será utilizada pela
pilha (a base da pilha) será a de endereço ______h.
2) Inicia o contador (registrador R0) com zero.
3) Aciona a sub-rotina do monitor CLR_DSP, cuja função é ...
4) Trava até que a chave seja posicionada para _____________.
5, 6) Carrega o __________________ com o valor ______h, que é o código ASCII do caracter ____, e que é passado como
_________________ para o acionamento da sub-rotina ______________, cuja função é apresentar esse caracter no display, na
posição corrente do ____________, que é deslocado para a ______________.
7, 8) Idem aos passos anteriores, mudando apenas o valor, que, neste caso, é ______h, que é o código ASCII do caracter ____.
9, 10) Move para o acumulador o valor corrente da contagem, armazenado no registrador _____. Esse valor é passado como
_________________ para o acionamento da sub-rotina ______________, cuja função é ...
11) Incrementa o acumulador, atualizando o valor da contagem.
12) Armazena o valor atual da contagem no registrador R0.
13, 14) Carrega o __________________ com o valor ____, indicativo de uma temporização de cerca de 1s, a ser passado como
parâmetro para o acionamento da ___________________ TEMPO.
15) Retorna ao início do laço, para apagar o display e reapresentar o novo valor da contagem.
16 a 28) Executa a sub-rotina TEMPO, adaptada da sub-rotina TEMPO1s da experiência anterior, a fim de poder realizar uma
temporização variável, dependendo do valor de seu parâmetro, passado no _________________.
EXPERIÊNCIA 9 – QUESTÕES ADICIONAIS
1) Altere e teste o programa desta experiência, para que ele apresente a contagem no display a cada 250ms aproximadamente.
2) Altere e teste o programa desta experiência, para que ele apresente a contagem no display de forma regressiva.
3) Altere e teste o programa desta experiência, para que ele apresente a contagem no display de 3 em 3.
4) Altere e teste o programa desta experiência, para que ele apresente a contagem no display em decimal. (dica: utilize a instrução de
ajuste decimal DA A logo após o incremento do acumulador; lembre-se que a instrução DA A só funciona logo após a
instrução ADD)
bônus: 0,5 ponto caso seu teste funcione
5) Altere e teste o programa desta experiência, para que ele apresente a contagem no display em 16 bits (4 algarismos hexadecimais).
(dica: use a rotina DPT-DSP do monitor)
bônus: 0,5 ponto caso seu teste funcione
6) É melhor iniciar a carga da sub-rotina TEMPO a partir da posição 5100h da memória externa, em vez de carregar essa sub-rotina
logo após o programa principal? Justifique.
7) desafio: Escreva um programa que apresenta ciclicamente, no display, em hexadecimal, os quadrados dos números de 0 a 15. A
seqüência a ser apresentada deverá ser:
00010409101924314051647990A9C4E100...
bônus: 1,0 ponto
Download