Sei sulla pagina 1di 45

Mestrado Integrado em Eng.

Engenharia de
Telecomunicaes e Informtica

Stack
Timers/Counters

Microcontroladores
2 Ano A07
1

Directivas
Categoria
Controlo do
estado

Definio de
smbolos

Directiva

Sntaxe

Funo
Especifica um valor para contador de
localizao do segmento activo

ORG

ORG

END

END

USING

USING

expresso

Indica ao assembler o banco de registo usado


no cdigo que vem a seguir directiva. Repare
que a comutao do banco de registo deve ser
efectuada usando apenas instrues do 8051

expresso

Indica ao assembler o fim do programa fonte

SEGMENT

Smbolo

SEGMENT

tipo_de_segmento

Declara um smbolo como sendo um segmento


relocatable de um dado tipo. Para comear a
usar o segmento, deve-se usar a directiva RSEG

EQU

Smbolo

EQU

expresso

Atribu um valor a um smbolo

SET

Smbolo

SET

expresso

Igual ao EQU, exceptuando o facto de permitir a


redefinio o smbolo

DATA

Smbolo

DATA

expresso

Atribui ao smbolo um endereo directo da RAM


interna

IDATA

Smbolo

IDATA

expresso

Atribui um endereo da RAM interna


indirectamente enderevel ao smbolo

XDATA

Smbolo

XDATA

expresso

Atribui ao smbolo um endereo da memria


externa

BIT

Smbolo

BIT

expresso

Atribu um endereo directo da rea de


memria enderevel ao bit a um smbolo

CODE

Smbolo

CODE

expresso

Atribu um endereo da memria de cdigo ao


smbolo
A07-2

Directivas
Categoria
Incializao e
reserva de
armazenamento

Program linkage

Directiva

Sntaxe

Funo

DS

[LABEL:]

DS

expresso

Reserva espaos em mltiplos de bytes. No


pode ser utilizado com segmento do tipo
BIT. O valor da expresso deve ser
conhecida pelo assembler

DBIT

[LABEL:]

DBIT

expresso

Reserva espaos em mltiplos de bits. O


valor da expresso deve ser conhecida pelo
assembler

DB/DW

[LABEL:]

DB/DW

expresso

Inicializa a memria de cdigo com valores


do tipo byte/word

PUBLIC

PUBLIC

Smbolo [, smbolo ] [...]

Define uma lista de smbolos que tornam


visveis e utilizveis a partir de outros
mdulos

EXTRN

EXTRN

Tipo_segmento(smbolo
[,smbolo] [...], ...)

Informa o assembler da lista de smbolos


definidos noutros mdulos e que vo ser
utilizados neste. O tipo de segmento pode ser
CODE, DATA, XDATA, IDATA, BIT e um especial
designado por NUMBER que especifica um smbolo
definido por EQU

Seleco de
Segmentos

NAME

NAME

Nome_do_mdulo

RSEG

RSEG

Nome_do_segmento

Ao encontrar uma directiva de seleco de


segmento, o assembler direcciona o cdigo

CSEG

CSEG

[ AT endereo ]

ou dado que lhe segue para o segmento

...

DSEG

[ AT endereo ]

seleccionado at que seja seleccionado um

XSEG

XSEG

[ AT endereo ]

outro segmento
A07-3

Exemplos

A07-4

Stack Pointer Register


SP
Registo de 8-bit (endereo 81H SFR RAM interna)
Contm o endereo do item colocado no topo da
pilha (stack). Valor aps reset, 07H;

Duas instrues permitem manipular a stack: PUSH e POP


A operao de PUSH coloca um dado na stack, enquanto
a operao de POP retira o dado

A07-5

Stack Pointer Register


A stack cresce no sentido ascendente da
memria
Aps o estado de reset este registo aponta para
a posio 07H
Pergunta:
Ao fazer o primeiro PUSH,
onde colocado o dado?

A07-6

Stack Pointer Register

Ateno:
Como a stack aps o reset est localizada na
posio 7H, que corresponde a zona dos
bancos de registos, conveniente mudar a sua
localizao caso queiramos usar os bancos.
Por ex.:

MOV SP, #7FH

A07-7

Stack Pointer Register


FFH

Ateno: Exemplo
Nota #2:
A pilha pode ser inicializada para a
posio 7FH.
Como o acesso indirecto atravs
do SP, a pilha implementada na
IDATA e o espao de SFR est
salvaguardado.
Ateno #1:
Ao ser colocado valores na pilha o
segundo banco ser afectado

80H
7FH

30H
2FH

Exemplo:
Inicializamos a SP
para

20H
1FH
18H

MOV SP, #7FH

17H
10H

Posio apontada por SP


aps reset 07H

0FH
08H
07H
00H
A07-8

Stack Pointer Register


Stack
O conjunto de instrues do 8051 fornece duas
operaes para manipulao da stack:

PUSH: insere um dado/valor na stack

POP: retira o ltimo dado/valor inserido


na stack

A07-9

Stack Pointer Register


Stack: PUSH

2 bytes
2 cycles

1100 0000

direct

Na operao de PUSH,
1. O valor do stack pointer incrementado em uma unidade.

2. O contedo da posio da RAM indicada como argumento da


operao copiado para a posio apontada pelo stack pointer.
3. Nenhuma flag afectada.

SP
(SP)

SP + 1
(directo)

A07-10

Stack Pointer Register


Stack: PUSH - exemplo
Um fragmento de programa tem o registo DPTR inicializado
0123H e a stack pointer aponta para a posio 09H.
Explique qual o estado da stack aps o push do registo DPTR.

SP

Programa:
PUSH
PUSH

DPL
DPH

0BH

01H
23H

09H

A07-11

Stack Pointer Register


Stack: POP
1101 0000

2 bytes
2 cycles
direct

Na operao de POP,
1. O contedo da posio da RAM interna apontada pelo stack pointer
lido e o valor do stack pointer decrementado.
2. O valor lido carregado na posio da RAM indicada como argumento
da operao.

3. Nenhuma flag afectada.

(directo)
(SP)

((SP))
(SP) - 1

A07-12

Stack Pointer Register


Stack: POP - exemplo

SP

32H

Analise o seguinte fragmento de


programa e explique que valores
assumiro os registos DPH, DPL
e SP aps a sua execuo.

Programa:

30H

01H
23H
20H

POP
POP
POP

DPH
DPL
SP

A07-13

Stack Pointer Register


STACK porqu?
Ao programar necessitamos de utilizar rotinas;
A invocao de rotinas no 8051 feita utilizando as instrues ACALL ou
LCALL;
O retorno de uma rotina feito usando a instruo RET;
A stack pode ser utilizada para passar parmetros s rotinas;
O que faz o 8051 ao executar uma instruo de CALL?
Guarda na Stack o valor do Program Counter (PC: PCH e PCL), que o
endereo na memria de cdigo da prxima instruo a executar;
Carrega para o PC o endereo da rotina comea a executar as
instrues da rotina;
Ao executar a instruo RET, carrega para o PC o valor armazenado na
Stack, ou seja, o endereo da instruo seguinte ao CALL.
A07-14

Stack Pointer Register


Directiva USING
As instrues de PUSH e POP recebem como argumento o endereo da
posio da memria interna cujo contedo ser guardado na stack.
Isto significa que teremos que calcular o endereo dos registos Rn, n [0-7],
quando estivermos a trabalhar com diferentes bancos.
O assembler do 8051 fornece a directiva using para facilitar a programao.

A07-15

Stack Pointer Register


Directiva USING
coluna 1 coluna 2 coluna 3
using [0-3]

banco
indica ao assembler qual o banco em cada
momento

No cdigo uso as labels ARn, n [0 7], para os


registos Rn, n [0 7], ou ACC para representar o
acumulador, A.
A07-16

Stack Pointer Register


Directiva USING: Exemplo
USING 3
PUSH AR0

O primeiro push colocar o contedo


da posio 1FH na stack (endereo de
R0 no banco 3).

USING 1
PUSH AR7

O segundo push colocar o contedo


da posio 0FH na stack (endereo de
R7 no banco 1).

Nota:
Antes de usar a diretiva USING deve-se comutar de banco atravs da
programao do registo PSW
Esta diretiva necessria para se poder fazer PUSH e POP da forma
representada acima
PUSH e POP apenas aceitam endereos absolutos, por isso
necessrio USING, para que o valor de ARx seja corretamente
calculado
A07-17

Stack Pointer Register


Directiva USING: Exemplo completo
MOV PSW, #00011000B
USING 3
PUSH AR0

; Comuta para o banco 3

MOV PSW, #00001000B


USING 1
PUSH AR7

; Comuta para o banco 1

Nota:
Antes de usar a directiva using deve-se comutar de
banco atravs da programao do registo PSW;
Em vez de se utilizar MOV PSW,#18H podamos ter
utilizado ORL PSW,#18H? (ps e contras?)
A07-18

Ciclo Mquina

A07-19

Rotinas de atraso (delay)


DELAY1: MOV
DJNZ
RET

R2,#X
R2,$

DELAY2: MOV
D2LOOP: MOV
DJNZ
DJNZ
RET

R3,#Y
R2,#X
R2,$
R3,D2LOOP

DELAY3: MOV
D3L1:
MOV
D3L2:
MOV
DJNZ
DJNZ
DJNZ
RET

R4,#Z
R3,#Y
R2,#X
R2,$
R3,D3L2
R4,D3L1

O n de ciclos mquina desta rotina :

NC=1+2*X+2=3+2*X

X=1NC=5
X=0NC=515
delay (seg)=12*NC/(frequncia cristal)

O n de ciclos mquina desta rotina :

NC=(3+2*X)*Y+3

O n de ciclos mquina desta rotina :


NC=((3+2*X)*Y+3)*Z+3

A07-20

Rotinas de atraso (delay)


Delay por software:
O tempo de espera estabelecido pelo nmero de ciclos mquina
necessrios para executar a rotina de delay. O microprocessador fica
bloqueado, ou seja, durante a execuo da rotina delay no pode
executar outro cdigo;

Difceis de controlar:
Para alm de ocuparem registos, o valor a colocar em cada registo
no simples de obter. Muitas vezes opta-se por implementar uma
rotina de delay fixo (ex:1000s) e invoc-la vrias vezes;

Dependem:
Do nmero de registos e dos seus valores, do n de ciclos mquina
necessrios execuo das instrues e do cristal utilizado utilizado.

A07-21

Rotinas de atraso (delay)


Suponham que pretendemos gerar uma onda quadrada
no pino P1.0. Qual a maior frequncia possvel e qual o
duty-cycle dessa onda?
ONDA:

SETB
CLR
SJMP

P1.1
P1.1
ONDA

;NC=11s
;NC=11s
;NC=22s

T=4sf=250KHz
D=ton/T*100=1s/4s=25%

Altere o cdigo de modo a garantir um duty-cycle de 50%.


Qual a frequncia da onda quadrada?
Faa um rotina que permita gerar uma onda quadrada de
20KHz com um duty-cycle de 50%.
A07-22

Timers/Counters
Como se divide um sinal de relgio?
O sinal de clock
seria obtido atravs
do relgio do
microcontrolador
temporizador
ou
atravs de um sinal de
relgio externo ligado a um
pino de E/S do
microcontrolador contador de eventos

A07-23

Timers/Counters
O 8051 tem duas unidades de temporizao e contagem:
Timer 0 e Timer 1;
Os modelos da famlia 8052 tm mais uma unidade: Timer 2.

Os timers podem operar como temporizadores ou como


contadores de eventos externos ao microcontrolador:
Quando opera como temporizador, os registos do timer, so
incrementados a cada ciclo mquina (utiliza o relgio do CPU), ou
seja a taxa de contagem 1/12 da frequncia do relgio;
No modo de operao de contagem de eventos externos, os
registos so incrementados a cada transio de 1 para 0 na
entrada externa do timer.
A07-24

Timers/Counters
No modo de contagem, os registos do timer so
incrementados sempre que h uma transio de 1-para-0 no
respectivo pino de entrada (T0, T1 ou T2).
O pino de entrada amostrado durante o estado S5P2 do
ciclo de instruo.

O incremento feito quando num ciclo de instruo a


entrada estiver a 1 e no ciclo seguinte estiver a 0.
O registo actualizado durante o estado S3P1 do estado a seguir
a deteco.
Uma vez que so necessrios dois ciclos de instruo, a maior
taxa de contagem permitida de 1/24 da frequncia do relgio.

A07-25

Timers/Counters

Os timers 0 e 1 permitem quatro modos de funcionamento:

Modo 0: temporizador/contador de 13-bit.


Modo 1: temporizador/contador de 16-bit.
Modo 2: temporizador/contador de 8-bit com auto-reload.

Modo 3: duplo temporizador/contador de 8-bit.

A07-26

Timers/Counters

Registos usados na programao dos timers 0 e 1:


TMOD: Permite programar os modos de funcionamento dos timers.

TCON: Permite controlar a activao e verificar o estado dos timers.


THx/TLx: Registo de 16 bits (TLx: LSB, THx: MSB).
Contm os valores de contagem de eventos ou para a temporizao de
um intervalo de tempo
[IE: Permite controlar as interrupes associadas aos timers]
Endereos (SFR): TCON: 88h

TMOD: 89h;

TL0:

8Ah

TL1:

8Bh

TH0:

8Ch

TH1:

8Dh
A07-27

Timers/Counters
Registo: TMOD (89h)
MSB
GATE1

LSB
C/T1

M11

M01

GATE0

Timer 1

C/T0

M10

M00

Timer 0

GATEx: Quando activado (1), o timer x s habilitado quando o pino INTx


est a 1 e o bit de controlo TRx (em TCON) est activado (1)
Quando desactivado, o timer x habilitado quando TRx est
activado (1).

C/Tx:

Selecciona o modos de funcionamento que podem ser como


temporizador ou como contador (contagem feita atravs do
sinal no pino Tx).

M0x, M1x: Selecciona os modos de operao.


A07-28

Timers/Counters
Registo: TMOD (89h)
M1, M0:

0 0
0 1
1 0
1 1

1 1

GATE

Modo 0: Temporizador/Contador X de 13-bit


Modo 1: Temporizador/Contador X de 16-bit
Modo 2: Temporizador/Contador X de 8-bit
com auto-carregamento
Modo 3: Timer 0 TL0 um temporizador/contador de 8
bits controlado pelos bits de controlo do timer 0.
TH0 um temporizador/contador de 8-bit
controlado pelos bits de controlo do timer 1.
Modo 3: Timer 1 Est desabilitado (pode estar a fornecer
o relgio UART).
C/T

M1

Timer 1

M0

GATE

C/T

M1

M0

Timer 0
A07-29

Timers/Counters
Registo: TCON* (88h)
MSB
TF1

LSB
TR1

TF0

TR0

IE1

IT1

IE0

IT0

TFx: Timer overflow flag. colocada a 1 pelo hardware da unidade,


quando h overflow na contagem do timer. limpa
automaticamente pelo hardware, quando a rotina de servio
interrupo chamada. Caso no se use a interrupo, tem de
ser limpa por software.

TRx: Bit de controlo do timer x. Activado/limpo por software para


habilitar/desabilitar o timer x.

[IEx, ITx: Gesto das interrupes externas 0 e 1]


A07-30

Timers/Counters
Timer1(ou 0): funcionamento no modo 0
OSC

x 1/ 12

C/ T = 0

CON TROL
TL1 [ 5 bi t s]

TH 1 [ 8 bi t s]

TF1

I N TERRUPT

C/ T = 1

T1 PI N
TR1

13 bits

GATE
I N T1 PI N

Apenas os 5-bit menos significativos de TL1 so


utilizados. Os restantes so ignorados.
TL1 funciona como um pr-divisor por 32 de TH1(i.e
TL1 conta at 32 antes de TH1 incrementar).

A07-31

Timers/Counters
Timer1(ou 0): funcionamento no modo 1
OSC

x 1/ 12

C/ T = 0

CON TROL
TL1

TH 1

TF1

I N TERRUPT

C/ T = 1

T1 PI N

registo de 16-bit

TR1
GATE
I N T1 PI N

A07-32

Timers/Counters
Timer1(ou 0): funcionamento no modo 2
OSC

x 1/ 12

registo de 8-bit
C/ T = 0

CON TROL
TL1

TF1

I N TERRUPT

C/ T = 1

T1 PI N
TR1
GATE
I N T1 PI N

TH 1

Sempre que ocorre o overflow do registo TLx, este recarregado com o valor de THx.

A07-33

Timers/Counters
Timer0: funcionamento no modo 3
OSC

x 1/ 12

1 / 1 2 f osc

1 / 1 2 f osc
C/ T = 0

CON TROL

Timer 0: TL0 e TH0 operam como 2 timers


separados
TL0 usa bits de controlo do timer 0
TH0 bloqueado como timer, usando
TR1 e TF1 (no transbordo)
TL0

TF0

TH 0

TF1

I N TERRUPT

C/ T = 1

T0 PI N
TR0
GATE
I N T0 PI N

CON TROL
1 / 1 2 f osc

I N TERRUPT

TR1

Timer 1: pode ser usado como baud rate generator para porta srie. Este timer desativado
colocando-o no modo 3 e, ativado num dos outros modos
A07-34

Timers/Counters
O timer 2 um timer/counter de 16-bit (apenas na famlia
8052);
Este permite trs modos de funcionamento:
Modo 0: temporizador/contador de 16-bit com autocarregamento;
Modo 1: modo de captura de 16-bit;
Modo 2: gerador de baud-rate para as comunicaes
srie.

A07-35

Timers/Counters
Registos usados na programao do timer 2:
T2CON: Permite controlar a activao e verificar o estado
dos timers P89C51 ainda tem o T2MOD;
TH2/TL2: Registo de 16-bit (TH2: MSB, TL2: LSB);
RCAP2H/RCAP2L: Registo de 16-bit usado na captura e
recarregamento;
[IE: Permite controlar a gerao da interrupo associada aos timers]
(T2CON*:0C8h;T2MOD:0C9h;TH2:0CDh;TL2:0CCh;RCAP2H:0CBh;RCAP2L:0CAh) SFR

A07-36

Timers/Counters
Registo: T2CON* (0C8h)
MSB
TF2

LSB
EXF2

RCLK

TCLK EXEN2

TR2

C/T2 CP/RL2

TF2:

Quando activa indica o overflow do timer 2. Esta flag deve


ser limpa por software;
EXF2: Activada quando a captura ou carregamento ocorre devido uma
transio negativa de T2EX (pino externo) e EXEN2= 1. Se a
interrupo estiver habilitada, ocorrer uma interrupo e EXF2
ter de ser limpa por software;
A flag tambm ativada quando ocorre overflow/undeflow
RCLK: Quando ativado indica que o relgio da comunicao srie
durante a receo proveniente do timer 2;
TCLK: Idem, mas para o relgio da transmisso.

A07-37

Timers/Counters
Registo: T2CON* (0C8h)
MSB
TF2

LSB
EXF2

RCLK

TCLK EXEN2

TR2

C/T2 CP/RL2

EXEN2: Habilita a entrada externa. Quando activado permite que a


captura ou o carregamento dependam da transio negativa do
pino T2EX
TR2:

Arranque/paragem do timer 2

C/T2:

Seleco do modo temporizador (0) ou contador (1)

CP/RL2: Seleco entre o modo de captura ou de carregamento

A07-38

Timers/Counters
Registo: T2CON* (0C8h)
MSB
TF2

LSB
EXF2

RCLK

TCLK EXEN2

TR2

C/T2 CP/RL2

Configurao dos modos de funcionamento

A07-39

Timers/Counters
Registo: T2MOD* (0C9h)
MSB
TF2

LSB
EXF2

RCLK

TCLK EXEN2

TR2

C/T2 CP/RL2

DCEN (Down Counter Enable bit): Se o bit estiver ativo,o pino T2EX
controla a direo da contagem
(T2EX=0 contagem decrescente)
(T2EX=1 contagem crescente)
T2OE (Timer 2 Output Enable bit): Ativa o pino P1.0 como sada de clock

A07-40

Timers/Counters
Timer 2: Modo 0 / Auto-reload
OSC

x 1/12

C/T = 0

CONTROL
TL2

TH2

TF2

C/T = 1

TR2

T2 PIN

RELOAD

TRANSITION
DETECTOR

INTERRUPT

RCAP2L

RCAP2H

CONTROL
EXF2

T2EX PIN

EXEN2

CP/RL2=0: timer de 16-bit com auto-reload de RCAP2L e


RCAP2H. Colocando EXEN2 a 1 o reload tambm ocorre
numa transio de 1-para-0 no pino T2EX.

TF2 deve ser limpo por software


antes de nova activao
A07-41

Timers/Counters
Timer 2: Modo 1 /Captura
OSC

x 1/ 12

C/ T = 0

CON TROL
TL2

TH 2

TF2

C/ T = 1

TR2

T2 PI N

TRAN SI TI ON
DETECTOR

CAPTURE

CON TROL

I N TERRUPT

RCAP2 L

RCAP2 H
EXF2

T2 EX PI N

EXEN 2

Neste modo, CP/RL2=1 e EXEN2=1.


Uma transio em T2EX captura o valor nos registos
TH2 e TL2 para os registos RCAP2H e RCAP2L

TF2 sinaliza overflow do timer e deve


ser limpo por software antes de nova
activao
A07-42

Timers/Counters
Timer 2: Modo 2

A07-43

Timers/Counters
Exemplo
Escreva um programa que gere uma onda quadrada com 1 KHz de frequncia
no pino P1.0, usando o timer 0.

Anlise:
1.

Repare que o perodo de uma onda quadrada de 1KHz de 1000 s, sendo que o tempo em alto
igual ao do tempo em baixo 500 s;

2.

Como este intervalo de 500 s superior a 256 s torna-se impossvel usar o timer no modo autoreload porque neste modo funciona como temporizador de 8-bit;

3.

Os timers contam no sentido crescente e activam a flag de overflow na transio FFFFh-para-0000h.


Assim sendo, para um cristal de 12MHz, o timer tem de ser inicializado com -500=FE0Ch-at-0000h

i.

O valor a carregar em TL0/TH0 seria -500=FE0Ch, isto : (TL0)=0Ch e (TH0)=0FEh


Timer0 configurado no modo 1 (temporizador de 16 bits) sendo o auto-reload efectuado
aps cada overflow pelo software a implementar

A07-44

Timers/Counters
Exemplo
Qual o problema com esta soluo?

MOV TMOD, #01H


; 16-bit timer mode.
LOOP: MOV TH0, #0FEH
; -500 (MSB).
MOV TL0, #0C0H
; -500 (LSB).
SETB TR0
; incio da contagem
JNB TF0, $
; esperar pelo fim da contagem
CLR TR0
; parar a contagem --- no necessrio
CLR TF0
; limpar a flag de overflow --- obrigatrio
CPL P1.0
; comutar o bit 0 do porto P1
SJMP LOOP
Haver sempre um desvio frequncia pretendida devido s
END
instrues de re-inicializao do timer aps cada overflow
A07-45

Potrebbero piacerti anche