Sie sind auf Seite 1von 55

Programando HCS08

Instrues bsicas e
programao
Programao ASSEMBLER:
Para programar devemos lembrar que o
processador HCS08 possui 2 registradores:
A => Acumulador de 8 bits
H:X => registrador de bits

Acum.
H X
Zerando registradores
Existem instrues explcitas para zerar os
registradores:
CLRA ; A = 0
CLRX ; X = 0
CLRH ; H = 0
O que segue o ponto-vrgula comentrio
No necessrio usar o ;
Somente se for fazer comentrio
Carregando nos registradores...
Carrega algo no Acum.
LDA #10 ; A = 10
LDA var ; A = var, onde var um end. de memria
LDX #10 ; X = 10
LDX var ; X = var
LDHX var ; H:X = mem[var] : mem[var] +1
Lembrando que H e X so cada um de 8 bits.
H receber a posio de memria onde est var;
X receber a posio de memria seguinte... Como se fosse uma
varivel de 16 bits

H X
M[var] M[var+1]
Salvando os registradores
Instrues para salvar o acumulador:
STA var ; var = A ou var recebe o Acum.
STA PTAD ; porta A = A
STX var ; var = X
STHX var ; var = H e var+1 = X
var +1 a posio de memria seguinte var
Instrues bsicas
As operaes so sempre com os
registradores.
Ex. soma sem carry
ADD #5 ; A = A + 5

Constantes Versus End. De
Memria
Quando se quer operar com constantes,
deve-se usar o smbolo #.
Se no for usado o #, o compilador entende
como uma posio de memria.

Ex. ADD #80 ; A = A + 80
Ex. ADD 80 ; A = A + Mem[80]
# Indica que uma constante
Sem # Indica que uma posio de memria
Formatos de nmeros
O compilador usa $ e % para representar
nmero sem Hexadecimal e binrio,
respectivamente.
Ex. ADD #10 ; A = A + 10, em decimal
Ex. ADD #$A ; A = A + 10, em hexadecimal
Ex. ADD #%00001010 ; A = A+10 em binrio

Ento $ = hexadeximal
% = binrio
Outras funes
Agora que j sabemos os formatos de nmeros usados, vejamos
algumas instrues bsicas.
J conhecemos a soma sem carry
Ex. ADD #5 ;A = A+5
No Reference Manual (pg. 157), tem-se a figura abaixo.
Aprendamos a interpretar:



Operao
O que faz: (A = A + operando
que pode
ser imediato (nmero)
ou memria
Nmero de clocks gasto
Detalhando um pouco mais
Soma um imediato no Acum. Ex. ADD #6
Soma um end. de mem. de 8 bits no Acum. Ex. ADD $80
Soma um end. de mem. de 16 bits no Acum. Ex. ADD $A1BC
Forma usada para trabalhar com vetor.
Ex. Caso queira carregar o acumulador com a varivel B[10]
CLRH
LDX #10 ; X = 10
ADD B,X ; A = A+B[x], ou A = A + B[10]
No exemplo acima, a var. B como se fosse um ponteiro, que
Indica uma posio de memria.
X o deslocamento a partir do endereo de B.
INSTRUES
A lista completa de instrues est na
manual de referncia, pg 157 em diante.
VOC DEVE TER O MANUAL
E CONSULT-LO PARA VER
AS INSTRUES.
Vejamos outras funes
Soma com carry
Ex. ADC var ; A = A + var + carry
ADC #5 ; A = A + 5 + carry
Subtrao
Ex. SUB var ; A = A var
SUB #$F ; A = A - 15
Operaes Lgicas
Lgica AND (bit a bit)
Ex. AND #2 ; A = A and (0000 0010)
Neste exemplo, se inicialmente A = 0000 0111,
A 0000 0111
AND 0000 0010
Resulta 0000 0010, que feito and bit a bit

Outras instrues lgicas
Lgica OR
Ex. ORA #7 ; A = A or 0000 0111
Lgica XOR
Ex. EOR #3 ; A = A xor 0000 0011
Complemento de 1
COMA ; =


COM var ; =
COMX ; =


Outras instrues aritmticas
Incremento
Ex. INCA ; A = A +1
Ex. INCX ; X = X+1
Ex. INC var ; var = var +1
Decremento
DECA ; A = A -1
DECX ; X = X -1
DEC var ; var = var -1.
Somente para endereos de 8 bits...

Funes de desvio
Desvios incondicionais
JMP algum_lugar ; pula pra algum_lugar



BRA L1 ; pula pra L1



Loop: LDA #10
INCA
STA var
JMP Loop
Loop: LDA #10
INCA
STA var
BRA Loop
Multiplicao
HCS08 possui multiplicao por hardware.
Vejamos o manual:

Faz o produto de X *A.
Como X e A so de 8 bits, o resultado de 16
bits. A parte alta fica em X ,e a parte baixa em A.
X
A
A X
*
Multiplicao
Vejamos um exemplo.
Leia a porta A e multiplique o valor por 10. A
seguir, quarde o resultado em R_alto e R_baixo
Loop: LDA PTAD ;A = Porta A
LDX #10 ;X = 10
MUL ; faz o produto
STX R_alto ; salva X em R_alto
STA R_baixo ; salva A em R_baixo
JMP Loop ; pula pra Loop
Trabalhando com bits
Setar um bit (posies de memria de 8 bits)
BSET 3,PTAD ; PTAD[3] = 1


Zerar um bit
BCLR 5,PTAD ; PTAD[5] = 0

BCLR 7,var ; var[7] = 0
Testes (IF)
Vrias instrues de desvio condicional
podem ser usadas.
A maioria dos testes feita, considerando-se
os bits de flag do CCR ver p. 148.
Testes
Desvia se bit for 1
BRSET 3, PTAD, L1




Ex.


Branch if set
se for 1
Bit3 da porta A
Ento vai pra L1;
Seno, segue na prxima linha
BRSET 3,PTAD,L1
ADD #3
JMP Fim
L1: SUB #5
Fim:
Se PTA[3] = 1, ento faz A = A 5
seno, faz A = A + 3
Testes
Desvia se bit for 0
BRCLR 3, PTAD, L1




Ex.


Branch if set
se for 0
Bit3 da porta A
Ento vai pra L1;
Seno, segue na prxima linha
BRCLR 3,PTAD,L1
ADD #3
JMP Fim
L1: SUB #5
Fim:
Se PTA[3] = 0, ento faz A = A 5
seno, faz A = A + 3
Desvia se Z=1
Z um bit do ccr, que fica =1 sempre que o resultado de uma operao for zero.
Ex. CLRA ; A = 0. Como o resultado deu zero, ento Z=1



Testes
LDA var ; A = var
SUB #3 ; A = A - 3
BEQ Fim ; se ultimo resultado deu zero, vai pra FIM
SUB #5 ; seno, A = A -5
Fim:
Testes
Desvia se deu overflow (carry = 1)



Desvia se o resultado da ltima operao foi
maior que zero

BCS Fim ; se carry =1, vai pra FIM
SUB #5 ; seno, A = A -5
Fim:
BGT Fim ; se ltima op. deu > 0, vai pra FIM
SUB #5 ; seno, A = A -5
Fim:
Testes
Desvia se o resultado da ltima operao foi
maior ou igual a zero



Compara acumulador com nmero ou mem

BGE Fim ; se ltima op >= 0, vai pra FIM
SUB #5 ; seno, A = A -5
Fim:
CBEQA $3,Fim ; se a=3, vai pra FIM
SUB #5 ; seno, A = A -5
Fim:
CBEQA var,Fim ; se a=var, vai pra FIM
SUB #5 ; seno, A = A -5
Fim:
Trabalhando com as PORTAS
Em DSPs e Microcontroladores, os pinos de
entrada/sada so tratados como PORTAS.
Sinais eltricos, na forma binria, so lidos e
escritos diretamente nas PORTAS.

Isso s pode ocorrer se a PORTA A for
configurada como entrada.
LDA PTAD ; Acum. Recebe o valor digital da PORTA A
PORTAS
Para ler um valor de uma porta, a porta deve
ser configurada como entrada.
Para escrever em uma porta, ela deve ser
configurada como sada.
Existe um registrador que define a direo
dos dados para cada porta.
o registrador de Direo de Dados
Ex. PTADD ; porta A Data Direction
PTBDD ; porta B Data Direction
e assim por diante, em todas as portas.
Portas
Exemplo de pinos e
Portas em um
microcontrolador
PORTAS
Por padro, todas as portas so
consideradas entradas, no microcontrolador.
Assim sendo, os pinos ficam em alta
impedncia e aceitam que outros circuitos
escrevam (0s ou 1s) na porta.
Isso evita que ocorra um curto-ciruito, ao
inicializar o microcontrolador.
PORTAS
Para definir um bit de uma porta como
entrada, o registrador de Direo de Dados
daquele bit deve ser colocado em 1.
Para ser definido com sada, deve ser
colocado em 0.
1 = Sada;
0 = Entrada;
PORTAS
Exemplos
MOV #%00000000,PTADD ; todos os bits de PTA so entrada
MOV #$FF,PTBDD ; todos os bits de PTB so sada
MOV #%00001111,PTCDD ; PTC[7..4] = out e PTC[3..0] = in
1 = Sada;
0 = Entrada;
PORTAS
Valores das portas
Um registrador de dados armazena o valor a ser
lido/escrito.
Ex.
MOV #0,PTADD ; todos os bits de PTA so entrada
MOV #$FF,PTBDD ; todos os bits de PTB so sada
LDA PTAD ; A = PTA
STA PTBD ; PTB = A
Data direction
Dado
L os sinais digitais, nos pinos do chip
Escreve os sinais digitais nos pinos do chip
Exerccio
Fazer um programa que fique lendo
ciclicamente um valor na porta A e
armazene-o em uma varivel chamada a.
Logo aps, escreva na porta B o valor de
a+10.
ORG RAMStart
A rmb 1 ; define uma var. de 1 byte

ORG ROMStart
MAIN: clra ;limpa o acumulador
MOV #$FF, PTBDD ;Porta B sada
MOV #$00, PTADD ;Porta A entrada
SEI ;desliga interrupes

Loop: LDA PTAD ; Acum. <= Porta A
STA A ; var. A recebe Acumulador
ADD #10 ; Acum. <= Acum. + 10
STA PTBD ; Porta B <= Acumulador
JMP Loop ; retorna ao Loop
ORG diretiva de compilador: coloca o cdigo abaixo
na posio de memria reservada:
s variveis
ao programa
Compilador muito chato.... Cuide os espaamentos de coluna... Seno no compila:
Labels e variveis na coluna 1.....
Cdigo tem q ser recuado....
Exerccio 2
Fazer um programa que fique lendo
ciclicamente um valor na porta A e
armazene-o em uma varivel chamada a.
Logo aps, escreva na porta B o valor de
a*9-7.

Exerccio 3
Ler um valor em um teclado (na porta B) e escrev-
lo na porta A. O nmero de entrada fica entre 0 e 9.
O esquema do teclado o seguinte:
Considere que os pull-ups das entradas
Devem estar ligados.
1 2 3
4 5 6
7 8 9
* 0 #
B0
B1
B2
B3
B4 B5 B6
Inputs
O
u
t
p
u
t
s

Exerccio 4
Ler um valor em um teclado (na porta B) e escrev-
lo na porta A. O nmero de entrada composto de
2 algarismos. O esquema do teclado o seguinte:
Considere que os pull-ups das entradas
Devem estar ligados.
1 2 3
4 5 6
7 8 9
* 0 #
B0
B1
B2
B3
B4 B5 B6
Inputs
O
u
t
p
u
t
s

Conversor A/D
Grandezas analgicas, do mundo real, como
Temperatura (T),
Presso (P),
Corrente (I),
Tenso (V), etc
Devem ser todas passadas para tenso, para
serem lidas por um microcontrolador.
Alm disso, deve-se ter cuidado para que a
converso fique em um intervalo que o conversor
A/D trabalhe. Tipicamente, entre 0V e 5V ou 0V e
3.3V... Depende do controlador.
Conversor A/D
Por exemplo: Se voc quer ler uma tenso
que varia entre 0 e 400V, um divisor resistivo
suficiente, tal como apresentado abaixo.
Deve-se calcular R1 e R2, de forma que a tenso
em R2 no ultrapasse 3.3V.
Conversor A/D
O HCS08 possui um conversor A/D de
aproximaes sucessivas, de 12 bits.
O conversor tem a entrada multiplexada, ou
seja, 28 entradas podem ser ligadas no
conversor A/D, mas somente 1 pode ser
efetuada, cada vez.
Conversor A/D

Conversor A/D
As converses so feitas entre os valores de referncia mximo
V
REFH
e mnimo V
REFL
.
O valor convertido ter uma representao linear entre 0 e 4096
(12bits) entre as referncias.

Conversor A/D
Veja um exemplo, no grfico abaixo, supondo as referencias em 0V
e 3.3V:

4096
0 0V
3.3V
Vin = 1V 1241
Uma tenso de 1V seria lida
como o nmero 1241, nas
escalas de referncia.
Configurando o A/D
Registrador de Configurao: ADCCFG
Low Power:
Configurao de velocidade/potncia
0 : alta velocidade
1: baixo consumo
Divisor do clock
Pre-scaler de diviso do clock.
Configurando o A/D
Registrador de Configurao: ADCCFG
Long Sample Mode:
Configurao de tempo de amostragem do sinal
0 : amostra de tempo curta;
1: amostra de tempo longa.
Modo de 8, 10 ou 12 bits
00: 8 bits
01: 12 bits
10: 10 bits
Fonte do clock
00: Barramento interno
01: Barramento interno 2
10: Clock alternativo (ALTCLK)
11: Clock assncrono (ADACK)
Configurando o A/D
Registrador de Configurao: ADCCFG
Por padro, se no mexer neste registrador,
ters:
Conver~soa rpida,
Clock interno
Tempo de amostra curto
8 bits
Se quiser ter converso de 12bits, faa:

MAIN: MOV #%00000100,ADCCFG
O registrador ADCSC1 controla o conversor da seguinte
forma:

Converso Completa:
Bit que indica quando uma
converso terminou
0: no terminou;
1: Converso terminou.
Este bit zerado quando o
resultado da converso for lido....
Da fica pronto para outra
converso.
Configurando o Conversor A/D
Converso Contnua:
0 : faz somente uma converso, qdo se escrever em ADCSC1;
1: faz converses sucessivas. Termina uma e comea outra,
imediatamente.
Interrupt Enable
0: aps converso, no gera interrupo.
1: aps converso, gera interrupo.
Configurando o Conversor A/D
Channel Select:
Seleciona o canal a ser convertido, conforme tabela abaixo
E o resultado?
O resultado da converso fica em dois
registradores ADCRH, ADCRL.
Como o resultado tem 12 bits, deve ser
armazenado em 2 registradores:
ADCRL ADCRH
8 bits 8 bits
Exemplo
Ler um valor analgico no pino AD0, e
armazen-lo.
ORG RAMStart
resultado rmb 2 ; define uma var. de 2 bytes

ORG ROMStart
MAIN: SEI ; desliga interrupes
Loop: MOV #%00000100,ADCCFG ; 12 bits
MOV #%00000000,ADCSC1 ; configura e comea a conv.




BRCLR 7,ADCSC1, * ;enquanto ADCSC1[7] = 0
;pula pra mesma linha
LDA ADCRH ;acum <= parte alta
STA resultado ;resultado <= acum
LDA ADCRL ;acum <= parte baixa
STA resultado+1 ;resultado+1 <= acum
Loop ; retorna ao Loop
Canal A0
S uma converso Sem interrupes
Espera converso terminar...
Quando terminar, bit 7 vai pra 1
Exemplo 2
Ler um valor analgico na porta A0, e
armazen-lo.
ORG RAMStart
resultado rmb 2 ; define uma var. de 2 bytes

ORG ROMStart
MAIN: SEI ; desliga interrupes
MOV #%00000100,ADCCFG ; 12 bits
MOV #%00100000,ADCSC1 ; configura e comea a conv.




Loop: BRCLR 7,ADCSC1, * ;enquanto ADCSC1[7] = 0
;pula pra mesma linha
LDA ADCRH ;acum <= parte alta
STA resultado ;resultado <= acum
LDA ADCRL ;acum <= parte baixa
STA resultado+1 ;resultado+1 <= acum
Loop ; retorna ao Loop
Canal A0
Converso contnua
Sem interrupes
Espera converso terminar...
Quando terminar, bit 7 vai pra 1
Com conv. Contnua, o
Loop mudou pra c!
L resultado
e j comea
outra
converso.
Exemplo 3
Ler um valor analgico na porta A0, e
armazen-lo. Use interrupo.
ORG RAMStart
resultado rmb 2 ; define uma var. de 2 bytes

ORG ROMStart
MAIN: CLI ; Habilita interrupes
MOV #%00000100,ADCCFG ; 12 bits
MOV #%01100000,ADCSC1 ; configura e comea a conv.




Loop: JMP Loop ; espera gerar uma interrupo

INT_ADC:
LDA ADCRH ;acum <= parte alta
STA resultado ;resultado <= acum
LDA ADCRL ;acum <= parte baixa
STA resultado+1 ;resultado+1 <= acum
RTI
Canal A0
Converso contnua
Liga interrupes
Com int. ligadas, qdo
COCO ficar nvel alto, ir
gerar uma interrupo.
Exerccios:
1.Leia 2 valores analgicos, e escreva o
menor deles em uma sada digital (portas C e
D lembre que so 12bits).
2. Um sinal de tenso entre 0 e 100V foi
ajustado para ser lido no A/D do
microcontrolador. Leia o valor, e mostre-o em
uma sada digital (porta B).
O valor lido ficar entre 0 e 4096... Ajuste-o para
representar entre 0V e 100V.

Das könnte Ihnen auch gefallen