Académique Documents
Professionnel Documents
Culture Documents
• BIBLIOGRAFIA:
• Microcontroladores HC908Q Teoria e prática – Editora Erica / Fábio Pereira
• Microcontroladores HCS08 Teoria e prática – Editora Erica / Fábio Pereira
• Apostila - HC_908.PDF
• Manual – HC08DEBUGGERRM.PDF
• Manual – MC68HC908QY4.PDF
• Manual – MCS9S08QG8.PDF
• Manual – CPU08RM.PDF
• Manual – NITRON TECHNICAL DATA BOOK.PDF
Versão Gama
Prof. Sérgio Tavares
MICROCONTROLADORES
Everywhere!
MICROCONTROLADORES – ENCAPSULAMENTOS
MICROCONTROLADORES - CARACTERISTICAS
Estas informações tem a finalidade de inicializar um projeto utilizando o Code Warrior 5.1
Configurado em
modo de simulação
Gravadores
de microcontroladores
Estes comandos só
funcionam na emulação
MICROCONTROLADORES – CODE WARRIOR
Dados ou endereços
Códigos
Endereço do PC
Família de
microcontroladores Valores contidos no acumulador
utilizado Valores contidos no Stack Pointer
Iremos colocar duas linhas de programa para fazer um carregamento no acumulador e salvar na memória
E logo em seguida analisar no simulador.
Azul = comando
reconhecido
Vermelho = comentários
Usando o Step by Step podemos acompanhar linha a linha do andamento do programa nas seguintes telas
A linha em
AZUL MARINHO
Informa que será
SIMULADA após
O comando STEP
MICROCONTROLADORES – CODE WARRIOR
Para que possamos fazer uma correta programação em um microcontrolador, devemos conhecer o
endereçamento de memória do microcontrolador.
Mapa de memória
HC908QY4/QT4
MICROCONTROLADORES – AREA DE MEMÓRIA
Mapa de memória
HC908QY4/QT4
MICROCONTROLADORES – COMANDOS
Nestas páginas futuras estaremos mostrando alguns comandos importantes para a devida programação de um
microcontrolador – Maiores informações consultem o manual CPU08RM.PDF e o livro
Microcontroladores HC908Q Teoria e prática – Editora Erica / Fábio Pereira
REGRAS IMPORTANTES
# = Indica valor decimal #% = Indica valor binário
#$ = Indica valor hexadecimal $ = Indica endereço
Ex. STA $80 - Carrega o valor contido no acumulador para a posição de memória 0080
Ex. MOV #02,$82 - Movimenta o valor 02 decimal para a área de memória $0082
MOV $82, $80 - Copia o valor na área de memória$ 0082 para $0080
MICROCONTROLADORES – COMANDOS
Existe também a possibilidade de alterar somente um bit, como mostra abaixo com os comandos BSET e BCLR
Exemplo:
MOV #%00001111, $80 COLOCANDO O NUMERO HEXA 0F NA POISÇÃO $80 DA RAM
BCLR 0,$80 APAGANDO O BIT 0 DA MEMÓRIA $80
BSET 7,$80 INCREMENTANDO O BIT 7 DA MEMÓRIA $80
Exemplo:
BCLR 1, PTB NÃO TERÁ TENSÃO NO PINO 1
BSET 6, PTB TERÁ TENSÃO NO PINO 6
Exemplo:
MOV #FF,$80 COLOCA O NUMERO FF EM HEXA NA MEMÓRIA $80
CLR $80 APAGA TODO CONTEÚDO COLOCADO NO ENDEREÇO $80
Exemplo:
CLR PTA LIMPA TODA A PORTA A DO MICROCONTROLADOR
CLR PTB LIMPA TODA A PORTA B DO MICROCONTROLADOR
MICROCONTROLADORES – COMANDOS
Existe a possibilidade de fazer deslocamento de um determinado bit para a direita ou esquerda tanto na memória
como no acumulador.
Exemplo:
LDA #$2 CARREGA 2 NO ACUMULADOR
LSLA PROMOVE O DESLOCAMENTO DOS BITS PARA A ESQUERDA
LSLA
LSLA
LSRA PROMOVE O DESLOCAMENTO DOS BITS PARA A DIREITA
LSRA
LSRA
Obs. Observamos que quando deslocamos para a esquerda, ocorre uma multiplicação do valor,
enquanto que quando o deslocamento para direita ocorre uma divisão
Exemplo:
MOV #$4,$80 CARREGA 4 EM HEXA NA RAM DE ENDEREÇO $80
LSL $80 PROMOVE O DESLOCAMENTO A ESQUERDA DO VALOR
LSL $80
LSR $80 PROMOVE O DESLOCAMENTO A DIREITA DO VALOR
LSR $80
CLR $80 LIMPA A POSIÇÃO $0080 DA RAM
O comando de conversão
das bases numéricas
funciona na área de memória
MICROCONTROLADORES – COMANDOS
Podemos fazer lógica AND e OR com os comando AND e ORA pelo carregamento direto ou valor contido na
memória
Exemplo
LDA #$55 CARREGA 55 NO ACUMULADOR EM HEXA
AND #$33 FAZ AND NO ACUMULADOR COM O VALOR IMEDIATO 33 EM HEXA
LDA #%11001100 CARREGA O VALOR CC EM HEXA OU 11001100 NO ACUMULADOR
ORA #%10100100 FAZ OR NO ACUMULADOR COM O VALOR A4 EM HEXA OU 10100100
Operações matemáticas também são possíveis na programação assembly com os comandos ADD e SUB
Exemplo
MOV #$2,$80 CARREGA 2 NA RAM
LDA #$5 CARREGA 5 NO ACUMULADOR
ADD $80 SOMA A RAM COM O ACUMULADOR
SUB #$3 SUBTRAI IMEDIATAMENTE 3 DO ACUMULADOR
ADD #$4 SOMA 4 IMEDIATAMENTE COM O ACUMULADOR
Exemplo
MOV #$2+5,$80 ;SOMA NA MEMORIA RAM 80 <2+5>
MOV #$3-2,$81 ;SUBTRACAO NA MEMORIA 81 <3-2>
MICROCONTROLADORES – COMANDOS
Multiplicações e divisões são também possíveis com este microcontrolador usando os comandos
MUL e DIV
Devemos ficar ciente de que este microcontrolador não consegue fazer cálculos com virgula
Exemplo de multiplicação:
O ACUMULADOR é
LDA #$3 CARREGA O NUMERO 3 EM HEXA NO ACUMULADOR uma área de trabalho
LDX #$2 CARREGA O NUMERO 2 EM HEXA NO REGISTRADOR do microcontrolador
MUL MULTIPLICA O ACUMULADOR COM O REGISTRADOR que esta sempre com
novos valores a medida
Exemplo de divisão: que o programa é
executado
LDA #$6 CARREGA O NUMERO 3 EM HEXA NO ACUMULADOR Por isso caso o valor seja
LDX #$2 CARREGA O NUMERO 2 EM HEXA NO REGISTRADOR Importante, este deve ser
DIV DIVIDE O ACUMULADOR COM O REGISTRADOR salvo na MEMÓRIA
Este tipo de construção de programa é básico para qualquer microcontrolador, onde os cálculos são executados
no no acumulador. O Code Warrior consegue simplificar calculos matemáticos da seguinte forma
Neste exemplo podemos ver soma, subtração mutiplicação e divisão em uma única linhas sendo executada
dentro do acumulador
Uma caracteristica interessante neste componente é a possibilidade de fazer os calculos diretamente na memória
um recurso que poucos microcontroladores tem.
N
?
Este programa irá carregar o numero 10 na memória 88, quando o valor de memória 80 for igual ao
acumulador. Caso o valor seja diferente será colocado o número 05 na memória 86
PROCESSO:
1. COMPARAR - CMP
2. DESVIAR - BEQ
INICIO: INICIO:
LDA #$3 LDA #$4
MOV #$3,$80 MOV #$3,$80
CMP $80 CMP $80
BEQ DESVIA BEQ DESVIA
BRA NAO_DESVIA BRA NAO_DESVIA
DESVIA: DESVIA:
MOV #$10,$88 MOV #$10,$88
BRA INICIO BRA INICIO
NAO_DESVIA: NAO_DESVIA:
MOV #$5,$86 MOV #$5,$86
BRA INICIO BRA INICIO
MICROCONTROLADORES – DECISÕES POR COMPARAÇÃO
Este programa irá carregar o numero 10 na memória 88, quando o valor de memória 80 for diferente ao
acumulador. Caso o valor seja igual será colocado o número 05 na memória 86
PROCESSO:
1. COMPARAR - CMP
2. DESVIAR - BNE
INICIO: INICIO:
LDA #$4 LDA #$3
MOV #$3,$80 MOV #$3,$80
CMP $80 CMP $80
BNE DESVIA BNE DESVIA
BRA NAO_DESVIA BRA NAO_DESVIA
DESVIA: DESVIA:
MOV #$10,$88 MOV #$10,$88
BRA INICIO BRA INICIO
NAO_DESVIA: NAO_DESVIA:
MOV #$5,$86 MOV #$5,$86
BRA INICIO BRA INICIO
MICROCONTROLADORES – DECISÕES POR COMPARAÇÃO
Este programa irá comparar o número 4, imediato inserido pelo CBEQA, com o valor dentro do acumulador.
Caso o número for igual, será colocado o valor 10 na posição de memória 88. Se for diferente o valor 5 será
colocado no endereço 86.
PROCESSO:
INICIO: INICIO:
LDA #$4 LDA #$3
CBEQA #$4, DESVIA CBEQA #4, DESVIA
BRA NAO_DESVIA BRA NAO_DESVIA
DESVIA: DESVIA:
MOV #$10,$88 MOV #$10,$88
BRA INICIO BRA INICIO
NAO_DESVIA: NAO_DESVIA:
MOV #$5,$86 MOV #$5,$86
BRA INICIO BRA INICIO
MICROCONTROLADORES – DECISÕES POR COMPARAÇÃO
Este programa irá certificar o bit 3 contido na área de memória $80 se esta em nivel alto.
Caso sim, será colocado o valor 10 na posição de memória 88. Se for zero o valor 5 será
colocado no endereço 86.
PROCESSO:
INICIO: INICIO:
MOV #%00000100,$80 MOV #%00000000,$80
BRSET 2,$80, DESVIA BRSET 2,$80, DESVIA
BRA NAO_DESVIA BRA NAO_DESVIA
DESVIA: DESVIA:
MOV #$10,$88 MOV #$10,$88
BRA INICIO BRA INICIO
NAO_DESVIA: NAO_DESVIA:
MOV #$5,$86 MOV #$5,$86
BRA INICIO BRA INICIO
MICROCONTROLADORES – DECISÕES POR COMPARAÇÃO
Este programa irá certificar o bit 3 contido na área de memória $80 se esta em nivel baixo.
Caso sim, será colocado o valor 10 na posição de memória 88. Se for um o valor 5 será
colocado no endereço 86.
PROCESSO:
INICIO: INICIO:
MOV #%11111011,$80 MOV #%11111111,$80
BRCLR 2,$80, DESVIA BRCLR 2,$80, DESVIA
BRA NAO_DESVIA BRA NAO_DESVIA
DESVIA: DESVIA:
MOV #$10,$88 MOV #$10,$88
BRA INICIO BRA INICIO
NAO_DESVIA: NAO_DESVIA:
MOV #$5,$86 MOV #$5,$86
BRA INICIO BRA INICIO
MICROCONTROLADORES – PORTAS
Nível 0 em DDRB Nível 1 em DDRB
libera este buffer e libera este buffer e
temos a porta temos a porta
configurada como configurada como
entrada. saída.
Configuramos o
PULL UP para
garantir o nível
baixo na porta
Para fazer a configuração da porta devemos usar o DDR antes de enviar um comando PT.
DDRA, estaremos configurando a porta A do microcontrolador
DDRB, estaremos configurando a porta B do microcontrolador
PTA, estaremos enviando (1) ou recebendo (0) uma informação pela porta A
PTB, estaremos enviando (1) ou recebendo (0) uma informação pela porta B
MICROCONTROLADORES – PORTAS
Todos estes registradores são programáveis por software, sendo este programados individualmente.
Nível:
1 = Pull up Ativado
0 = Pull up Desativdado
Obs. Quando o DDRB, for
configurado como saída
o PTBPUE é desabilitado
automáticamente.
Nível
1 = Porta configurada como
saída.
0 = Porta configurada como
entrada.
Este programa irá configurar as portas PTB 0 como entrada e PTB 1 a 7 como saídas. Ao acionar a chave
observaremos os leds trocarem a sua iluminação.
O comando BRSET fica testando a chave para poder tomar a devida decisão
Nos DEMO 1 e 2, podemos acionar ou desativar as portas pelos comandos MOV, BSET e BCLR
BSET 0,CONFIG1
MOV #%11111110, DDRB
Configurações iniciais MOV #$00, PTBPUE
CLR PTB
PRINCIPAL:
BRSET 0,PTB,DEMO1
Chave 01 esta pressionada? BRA DEMO2
DEMO1:
MOV #$02, PTB
SIM BRA PRINCIPAL
NÃO DEMO2:
BSET 2 , PTB
BCLR 1, PTB
BRA PRINCIPAL
Usando a ferramenta VISUALIZATIONS TOOLS podemos fazer vários testes no programa antes de gravá-lo no chip.
Para que possamos ter acesso a esta ferramenta, devemos estar no modo FULLCHIP SIMULATION e entrar no modo
DEBUG. O próximo passo é entrar no modo COMPONENT>OPEN e iremos observar a seguinte tela
Para podermos ver o LED em funcionamento devemos configurar o REFRESH MODE em PERIODICAL e
o REFRESH TIME (100ms) para 1.
MICROCONTROLADORES – SIMULAÇÃO VISUALIZATION TOOLS
O mesmo procedimento deve ser feito para a chave, mas lembrando que no programa ela esta em
PTA0, então as propriedades serão:
PORT TO DISPLAY = 0x0;
BITNUMBER TO DISPLAY = 0
MICROCONTROLADORES – SIMULAÇÃO VISUALIZATION TOOLS
Para ver a simulação, devemos acionar no modo simulador do CODE WARRIOR
Também deve ser acionada a CHAVE do VISUALIZATION TOOLS para o correto funcionamento
PTB=1
PTA=1
O programa abaixo fica como referencia para devidos testes do explicado anteriormente.
MICROCONTROLADORES – GRAVANDO O FIRMWARE
Nesta parte estaremos fazendo a gravação do programa gerado no CODE WARRIOR no microcontrolador
da família HC. Os programas gravados em chips são chamados de FIRMWARE.
O primeiro passo e sair do modo FULL CHIP SIMULATION para MON08 INTERFACE
Ao compilar o programa e acionar o comando teremos a seguinte tela abaixo para ser configurada.
Uma vez configurado corretamente a tela anterior (Connection Manager), logo aparece a tela abaixo informando
que ira apagar e gravar um programa na flash do microcontrolador. Acione Yes.
Após a tela anterior teremos esta abaixo, que tem a finalidade de monitorar o processo da gravação. Uma vez
gravado o microcontrolador ela automaticamente desaparecerá e o firmware estará residente no chip
MICROCONTROLADORES – PROCESSADOR EXPERT
O PROCESSADOR EXPERT é uma ferramenta que tem por finalidade de auxiliar na configuração do microcontrolador.
Para que ele funcione devemos ao construir um determinado projeto utilizar este recurso.
Nos procedimentos abaixo iremos configurar a porta PTA0 como entrada e a PTB0 como saída pelo processador expert.
Esta é a tela aonde podemos ver a pinagem do microcontrolador e as áreas que queremos configurar
MICROCONTROLADORES – PROCESSADOR EXPERT
Configurando o PTA como entrada, devemos dar um click em PTA (desenho do chip) e teremos a seguinte tela
MICROCONTROLADORES – PROCESSADOR EXPERT
Vá até o PROJECT.PRM
e coloque duas barras (//)
na frente da linha
VECTOR 0
MICROCONTROLADORES – PROCESSADOR EXPERT
Para que a o arquivo main.asm, consiga reconhecer os codigos gerados pelo processador expert contido
no arquivo MCUunit.asm deve ser retirado o ponto e virgula da linha JSR MCU_unit
g f a b
e d c
7448
MICROCONTROLADORES – TIMER INTERNO
INICIO
DELAY
MANTENHA A CONTAGEM
INICIO
TIMER:
MOV #$FF,TMODH CARREGA FF EM TMODH
MOV #$20,TMODL CARREGA 20 EM TMODL
BRA DELAY VAI PARA O DELAY
DELAY:
SAIR_DELAY:
BCLR 7, TSC APAGA TOF
BRA TIMER RETORNA AO CARREGAMENTO DO TIMER
MICROCONTROLADORES – TIMER INTERNO / PISCA PISCA
INICIO
SAIDA DO
CARREGAMENTO
DO TIMER
CONFIGURAÇÕES
N CARREGAMENTO
LED 1 ON? DO TIMER
S
PISCA PISCA
APAGAR LED 1
LIGAR LED 2 DELAY
MANTENHA A CONTAGEM
APAGAR LED 2
LIGAR LED 1
N
O TEMPO ACABOU?
S
APAGAR TOF E
ENTRADA DO RETORNE PARA O
DELAY CARREGAMENTO DO TIMER
MICROCONTROLADORES – TIMER INTERNO / PISCA PISCA - CÓDIGO
INICIO
SAIDA DO BSET 0,CONFIG1
CARREGAMENTO MOV #%01000110,TSC
DO TIMER MOV #%00000011, DDRB
MOV #$00, PTBPUE
CLR PTB
PISCA PISCA
LED1:
MOV #%00000001, PTB
BRA DELAY
DELAY:
N
LED2: BRCLR 7,TSC,DELAY
MOV #%00000010, PTB BRSET 7,TSC, SAIR_DELAY
BRA DELAY
S
ENTRADA DO
DELAY SAIR_DELAY:
BCLR 7, TSC
BSET 4,TSC
BRA TIMER
MICROCONTROLADORES – TIMER INTERNO / PISCA PISCA - CÓDIGO
INICIO: DELAY:
BRCLR
BSET 0,CONFIG1 7,TSC,DELAY
MOV #%01000110,TSC BRSET 7,TSC,
MOV #%00000011, DDRB SAIR_DELAY
MOV #$00, PTBPUE
CLR PTB SAIR_DELAY:
BCLR 7, TSC
BSET 4,TSC
MOV #$FF,TMODH BRA TIMER
MOV #$20,TMODL
TIMER:
BRA CONDICAO
CONDICAO:
BRSET 0,PTB,LED2
BRA LED1
LED1:
MOV #%00000001, PTB APÓS DIGITAR O PROGRAMA
BRA DELAY
Localize a linha INCLUDE e abaixo
LED2: dela adicione as duas linhas como
MOV #%00000010, PTB Indicado. Isto fará o tratamento da
BRA DELAY interrupção do TIMER
MICROCONTROLADORES – SUB ROTINAS
PROGRAMA PRINCIPAL
As sub-rotinas
normalmente são
utilizadas para a
simplificação dos
programas criados.
Também são SUB-ROTINA
utilizadas para
serem repetidas
quantas vezes forem
necessárias pelo
programa principal.
Normalmente o
programa principal
chama este pequeno
programa
(sub-rotina),
executa-o e ao
termino de sua
função este retoma
de onde foi desviado
para seguir a
próxima tarefa.
MICROCONTROLADORES – SUB ROTINAS
PROGRAMA PRINCIPAL
JSR – Efetua o
desvio do fluxo do
programa para uma
sub-rotina.
Ex.
JSR $20
JSR SUB_ROTINA JSR SUB-ROTINA 2
RTS
CARREGAMENTO
O CAMINHO CRIADO PELOS COMANDOS DOS REGISTRADORES
TMODH E TMODL
JSR e RTS
ACIONAMENTO DO LED 1
Pelo caminho azul, temos o E DESVIA PARA DELAY
primeiro salto para a sub-rotina.
DELAY:
MANTENHA A CONTAGEM
O TEMPO ACABOU?
N
S
APAGAR TOF E
RETORNE PARA A ULTIMA
CHAMADA DE SUB ROTINA
INICIO
MICROCONTROLADORES – SUB ROTINAS
BSET 0,CONFIG1
USANDO O TIMER INTERNO P/ PISCAR LEDS MOV #%01000110,TSC
MOV #%00000011, DDRB
MOV #$00, PTBPUE
CLR PTB
TIMER:
MOV #$FF,TMODH
MOV #$20,TMODL
Use PISCA:
JSR para MOV #%00000001, PTB
Ir a sub-rotina JSR DELAY
BRA PISCA
DELAY:
BRCLR 7,TSC,DELAY
Use BRSET 7,TSC, SAIR_DELAY
RTS para N
sair da sub-rotina
S
SAIR_DELAY:
BCLR 7, TSC
RTS
MICROCONTROLADORES – SUB ROTINAS
USANDO O TIMER INTERNO P/ PISCAR LEDS
INICIO:
BSET 0,CONFIG1
MOV #%01000110,TSC
MOV #%00000011, DDRB
MOV #$00, PTBPUE
CLR PTB
TIMER:
MOV #$FF,TMODH
MOV #$00,TMODL
PISCA:
MOV #%00000001, PTB
JSR DELAY
DELAY:
BRCLR 7,TSC,DELAY
BRSET 7,TSC, SAIR_DELAY
SAIR_DELAY:
BCLR 7, TSC
RTS
MICROCONTROLADORES – CONVERSOR ANALÓGICO / DIGITAL
CHANNEL SELECT
Responsável para habilitar os pinos
do HC para fazer a conversão A/D
ADC
Conversor Analógico Digital de 8 bits
CLOCK GENERATOR
Responsável pela velocidade de
conversão do ADC
INTERRUPT LOGIC
Ao termino da conversão é habilitada
uma interrupção avisando que o dado
esta no ADC DATA REGISTER
MICROCONTROLADORES – CONVERSOR ANALÓGICO / DIGITAL
CH1 e CH2 – A combinação destes flags podemos escolher a porta do HC para fazer a conversão
CONVERSÃO SIMPLES
O conversor realiza apenas uma única conversão
Após o seu termino, ativa o flag COCO e fica
aguardando o usuário iniciar nova conversão
CONVERSÃO CONTINUA
Este inicia automaticamente uma nova conversão
após o termino da outra.
COCO
0 = Conversão não completada
1 = Conversão completada
Para selecionar a porta devemos usar a tabela da verdade acima
AIEN
0 = Interrupção desabilitada
1 = Interrupção habilitada
MICROCONTROLADORES – CONVERSOR ANALÓGICO / DIGITAL
EXEMPLO: - Configure um conversor AD utilizando a porta PTA 0 usando a conversão continua e com a máxima velocidade
de conversão.
RESPOSTA:
MOV #%00100000,ADSCR
MOV #%00000000,ADICLK
MICROCONTROLADORES – CONVERSOR ANALÓGICO / DIGITAL
O fluxograma abaixo mostra o processo de capturar uma conversão analógica / digital do PTA0
Armazenando no acumulador do HC para salvar na área de memória $80
Inicio
Desabilitando o COP
Habilitando PTA0 como entrada
Carregar no acumulador
O fluxograma abaixo mostra o processo de capturar uma conversão analógica / digital do PTA0
Armazenando no acumulador do HC para salvar na área de memória $80
Inicio
BSET 0,CONFIG1
MOV #$00,DDRA
MOV #$20,ADSCR
MOV #$00,ADICLK
CARREGANDO:
LDA ADR
STA $80
BRA CARREGANDO
MICROCONTROLADORES – INTERRUPÇÃO DE TECLADO
A finalidade de ter interrupção em teclado é de deixar o microcontrolador mais eficiente. Ao fazer teste de entrada
a todo instante, faz com que o mesmo perca rendimento. O interessante é fazer o teste do determinado teclado
quando uma tecla realmente for acionada
INICIO
TESTE DO TECLADO
LINHAS DE PROGRAMA
O problema deste fluxograma é que
este sempre estará gastando tempo
testando o teclado, mesmo sem estar
LINHAS DE PROGRAMA sendo usado.
LINHAS DE PROGRAMA
MICROCONTROLADORES – INTERRUPÇÃO DE TECLADO
Pelo processo da interrupção, as linhas de programa que gerenciam o teste de teclado ficam fora do programa
principal. Só serão executadas quando alguém acionar alguma tecla. Outro ponto importante que ao terminar
a rotina de teste do teclado, o programa volta a origem de onde foi interrompido
LINHAS DE PROGRAMA
LINHAS DE PROGRAMA
MICROCONTROLADORES – INTERRUPÇÃO DE TECLADO
CONFIGURANDO OS REGISTRADORES
KBIER – Registrador responsável pela habilitação individual dos pinos que farão parte da entrada do módulo KBI
AWUIE – Habilita a interrupção do módulo auto acordar KBIE0 a KBIE5 – habilita os pinos PTA0 a PTA5
0 = Interrupção desabilitada como entradas do módulo KBI (interrupções)
1 = Interrupção habilitada 0 = O pino não esta habilitado como interrupção
1 = O pino esta habilitado como interrupção
MICROCONTROLADORES – INTERRUPÇÃO DE TECLADO
Ao fazer uma interrupção de teclado devemos fazer o tratamento do vetor de interrupção. Na tabela abaixo temos estes
vetores. Cada interrupção em especifico (teclado, conversor ADC, TIM e outro), possui sua prioridade. A interrupção irá
lançar para estes endereços, onde por através de um tratamento ORG ou ajustando o PROJECT.PRM em
PROJECT SETTINGS- LINKER FILES na tela a esquerda FILE
Não esqueça de
Configurar o
PROJECT.PRM
Programa principal
Localizando o
Arquivo.
PROJECT.PRM
Esta linha
VECTOR 14 INTERRUPT
Faz o reconhecimento da
interrupção
Programa principal
Quando declaramos as varáveis antes de uma função, esta fica considerada como
global, onde esta será aproveitada em todo momento do programa.
#include <hidef.h>
#include "derivative.h"
int a,b,c,d;
void main(void)
{ a=2;
b=3;
c=a+b;
d=b-a;}
Quando declaramos as varáveis dentro de uma função, esta fica considerada como
#include <hidef.h> local, onde esta será aproveitada somente dentro da função de origem.
#include "derivative.h"
void main(void)
{
int a,b,c,d;
a=2;
b=3;
c=a+b;
d=b-a;
inicio:
if (c) goto inicio;
}
char 0 a 255 1
a=-128;
b=127;
c=255;
d=-32768;
e=32767;
f=65535;
i=4294967295;
j=-2147483647;
k=2147483647;
Escreva este programa no Code Warrior
m=1.17549e-38;
e confirme os valores das variáveis.
n=3.40282e38;
Logo em seguida altere o valor de algumas
q=2.23e-308;
para maior do que permitido e veja o resultado.
r=1,7e308;
s=2.23e-308;
t=1.7e308;
}
PROGRAMA PARA HC908QY4
TIPOS DE DADOS
void main(void) {
inicio:
__RESET_WATCHDOG();
void main(void) {
inicio:
__RESET_WATCHDOG();
goto inicio;
}
Ponteiro é uma variável que contém um endereço de memória. Esse endereço é normalmente a posição de uma
outra variável de memória. Se uma variável contém o endereço de uma outra, então a primeira variável é dita
apontar para a segunda.
O programa abaixo orienta que a variável X comece a gravar os valores na memória de posição 88, logo em seguida
verifica se a variável X esta em 88 pelo ponteiro p1.
void main(void) {
Os ponteiros podem ser orientados a determinadas posições para trabalharem. Caso o programador não
definir eles começam a trabalhar na posição 0x80 (Primeira posição da RAM).
O programa abaixo orienta o uma variável X a guardar suas constantes no endereço 88. O ponteiro foi
criado para armazenar endereços solicitados na posição de memória A0.
Ao executar este programa o número 1, será colocado em $88, o ponteiro será dirigido ao endereço $88
e irá resgatar o valor da memória $88 e salvar em $90
void main(void) {
char x,t,u,v;
char s @0x90;
char *p @0xA0;
void main(void) {
x=1;
t=2;
u=3;
v=4;
ponteiro_varredura:
goto ponteiro_varredura;
}
Matriz é uma coleção de variáveis do mesmo tipo que é referenciada por um nome comum. Em C todas as matrizes
consistem em posições continuas na memória. O endereço mais baixo corresponde ao primeiro elemento e o mais
alto ao último elemento.
Uma vez a matriz criada, podemos usar os valores em outras variáveis criadas no programa.
A leitura de uma matriz começa pelo zero como mostra o programa abaixo.
char matriz [4]={6,7,8,9}; // carrega uma matriz de uma dimensão com 4 valores
char a,b,c,d;
void main(void) {
Podemos fazer um carregamento automático de valores em uma matriz, neste caso o carregamento é sequêncial como
mostra o programa abaixo
Sabendo que podemos com uma matriz colocar diversos valores rapidamente em um programa sem ficar usando
inúmeras variáveis, também podemos usar o recurso do ponteiro para trabalhar com estes dados.
O programa abaixo constrói uma matriz 4X1. Foi orientado um ponteiro para ler a matriz e descarregar todo o
seu conteúdo no endereço de memória $88. Isto é muito interessante para aplicações que necessitamos
lançar valores para as portas de um microcontrolador.
void main(void) {
ponteiro_varredura:
goto ponteiro_varredura;
O comando IF só é ativado em uma condição verdadeira, caso contrário o comando não tem efeito e o
programa lê a próxima linha. Para a linguagem C a condição verdadeira é nível 1 é falso é 0
1
IF
0 COMANDO
COMANDOS CONDICIONAIS - IF
inicio:
if (PTAD_PTAD0) goto liga; //Verifica a condição da entrada PTA0
PTBD_PTBD7=0; //desativa a saída PTB7
goto inicio;
liga:
PTBD_PTBD7=1; //ativa a saída PTB7
goto inicio;
}
SWITCH
DEFAULT
Este comando permite a escolha de uma opção entre várias variáveis.
Uma vez escolhida é comparada a SWITCH com o devido CASE. Uma vez escolhido,
os comandos contidos no CASE serão executados até a chegada do comando
BREAK. Logo em seguida retorna novamente ao comando SWITCH para novo
COMANDOS teste. Caso não exista nenhuma relação do SWITCH com os CASES disponíveis o
programa irá para o comando DEFAULT e executará um ou mais comandos
determinado pelo programador
COMANDOS CONDICIONAIS – SWITCH CASE
Para trabalharmos com o FOR, adotamos uma variável o qual fica na CONDIÇÃO, onde esta
pode ser INCREMENTADA (acima ou abaixo – X++ ou X--) o qual fica sempre comparada
com a INICIALIZAÇÃO. Quando este processo estiver em igualdade a CONDIÇÃO com a
INICIALIZAÇÃO o laço FOR terá terminado, mas enquanto isto não acontecer ele ficará em
seu laço e com o devido COMANDO funcionando.
INCREMENTO
COMANDO
? N
INICIALIZAÇÃO = CONDIÇÃO
S
COMANDOS REPETIÇÃO – FOR
Este programa faz as portas PTB oscilarem mediante informação contida em PTA.
O valor recebido em PTA será multiplicado por 10.000 e lançado nas variáveis S e T o qual estão contidas
no laço FOR.
Referente a temporização, observamos um DUTY CICLE de 50%.
Este tipo de estrutura é interessante, pois podemos alterar o DUTY CICLE e construir um PWM.
Este comando testa uma condição, caso esta seja verdadeira (1) permite a repetição dos comandos
contidos dentro de sua chave, caso seja falso (0) o comando não funciona e o programa segue
normalmente.
WHILE
0
COMANDO
COMANDOS REPETIÇÃO – WHILE
inicio:
goto inicio;
}
PROBLEMA
Só vai mudar de estado
a saída mediante dar
RESET no programa.
inicio:
inicio:
Este primeiro ele faz o comando DO e depois testa a condição WHILE. Caso seja verdadeiro (1)
promoverá novamente a repetição pelo DO, mas se for falso (0) este escapa do laço de repetição
DO
COMANDO
1
WHILE
0
COMANDOS REPETIÇÃO – DO WHILE
goto inicio;
}
O programa abaixo executa uma equação de multiplicação e guarda o resultado na variável S, como os calculos
são feitos no acumulador, com um comando asm podemos salvar o seu conteúdo na memória 0x80.
char s,t;
void MCU_init(void); /* Device initialization function declaration */
void main(void) {
IMPORTANTE: Caso escrevermos o código assembler asm { sta $80 } linearmente sem respeitar as linhas puladas
o Code Warrior considera errado, portanto devemos respeitar a estrutura do exemplo.
Para deixar o programa mais inteligível, podemos com o comando DEFINE, alterar o nome de alguns dados
deixando assim o programa mais amigável.
Quando necessitamos de um determinado sub programa, ou uma rotina especifica no programa principal, nós
usamos funções na linguagem C. Em comparação com assembler, esta pode ser chamada de SUB ROTINA.
void configuracao ()
for(;;) {
unsigned int a;
void main(void) {
CONFIG1_COPD=1;
DDRA_DDRA0=0;
DDRB_DDRB0=1;
void temporizar ()
{ delay:
if(!TSC_TOF) goto delay;}
void main(void) {
EnableInterrupts;
CONFIG1_COPD=1;
DDRA_DDRA0=0;
DDRB_DDRB0=1;
TMODH=0x18;
TMODL=0x69;
TSC=0x46;
+5V
HCS1
SW1
+5V
1
PTA5 PTA0
16 SW-SPST
2
PTA4 PTA1
15
3
VDD+5 PTA2 R1
14
1k
4
VSS/GND PTA3
13
5
PTB7 PTB0
12
6
PTB6 PTB1
11
7
PTB5 PTB2
10
R2 8
PTB4 PTB3
150 9
HCS908QG8
D1
LED
INTERRUPÇÃO POR TECLADO
{
KBISC_KBACK=1; //Apaga o flag KBF liberando da interrupção
LED=1; // PROGRAMA NA INTERRUPÇÃO - Ligar o LED
}
void main(void) {
EnableInterrupts;
HCS1 HCS2
+5V +5V
1 1
PTA5 PTA0 PTA5 PTA0
16 16
2 2
PTA4 PTA1 PTA4 PTA1
15 15
3 3
VDD+5 PTA2 VDD+5 PTA2
14 14
4 4
VSS/GND PTA3 VSS/GND PTA3
13 13
5 5
PTB7 PTB0 PTB7 PTB0
12 12
+5V
6 6
PTB6 PTB1 PTB6 PTB1
11 11
7 7
PTB5 PTB2 PTB5 PTB2
10 10
8 8
PTB4 PTB3 PTB4 PTB3
9 9
HCS908QG8 HCS908QG8 R3 R2
R1 150 150
1k
CONEXÃO SERIAL
D1 D2
LED LED
TRANSMISSÃO SERIAL - TX
for (;;)
{
while(SCIS1_TDRE) //verificar buffer de transmissão se esta livre
if (CHAVE==1) SCID=5; //carregando o buffer com o numero 5 para ser transmitido caso a chave esteja acionada
else SCID=1; //carregando o buffer com o número 1 para ser transmitido caso a chave não esteja acionada.
}}
2 ⋅ ((5 + 3) − (8 − 6))
f ( x) =
(5 − 3)
ATIVIDADES
3. Dada a equação desenvolva um programa que use as variáveis globais:
a ⋅b
r=
c+d
4. Faça um programa usando as variáveis int, char e float e propositalmente coloque valores acima do permitido e relate
o que acontece com os dados.
5. Construa um programa em C onde podemos colocar valores numéricos dentro da memória do HC908QY4 na seguinte
ordem:
a) char – usar endereço $80
b) int – usar endereço $81
c) long – usar endereço $83
d) double – usar endereço $88
Ao termino observe o espaço que ocupam estas variáveis dentro da área de memória
a+b
d=
c2
ATIVIDADES
7. Usando a técnica do ponteiro, coloque os números 1,2,3,4 e 5 a partir do endereço de memória $80 e faça com que o
conteúdo destes números sejam deslocado para o endereço $88.
8. Construa uma matriz {0,1,2,3,4,5,6,7,8,9} e transfira o seu valor para as variáveis na seguinte seqüência:
a=0, b=1, c=2, d=3, e=4, f=5, g=6, h=7, i=8 e j=9.
9. Construa uma matriz {0,1,2,3,4,5,6,7,8,9} sendo que esta seja de preenchimento automático – via software.
10. Dada a matriz {0,1,2,3,4,5,6,7,8,9}, com um ponteiro, faça que ela seja descarregada na porta PTB do microcontrolador.
11. Com o HCS908QG8, faça um Hardware usando o PROTEUS onde os pinos PTB0 e PTB1 sejam considerado entradas
onde receberão níveis lógicos da seguinte ordem:
Nível 1 = +5V
Nível 0 = 0V
Obs. Para garantir 0V coloque um resistor de 1K nos pinos determinados, e que os mesmos fiquem em relação ao terra.
Também deixem os PULL UPS desabilitados. Com os pinos PTB2 e PTB3 deixem-os como saída e ligue LEDs nestas portas.
Mas atenção, pois um LED trabalha entre 1,5V a 2,0V por 20mA. Deve ser colocado um resistor de proteção, favor calcular
e deixar os cálculos para serem analisados pelo professor.
+5V
HCS1
SW1
+5V
1
PTA5 PTA0
16 SW -SPST
2
PTA4 PTA1
15
3
SW2
VDD+5 PTA2
14
4 SW -SPST
VSS/GND PTA3
13
5
PTB7 PTB0
12
6
PTB6 PTB1
11 R1 R3
7 1k 1k
PTB5 PTB2
10
R2 R4 8
PTB4 PTB3
150 150 9
HCS908QG8
D1 D2
LED LED
ATIVIDADES
13. Dado o circuito abaixo faça um programa que respeite a tabela abaixo
+5V
SW1 SW2 DISPLAY
HCS1
SW1 0 0 Zero no display
+5V
1
PTA5 PTA0
16
2
SW -SPST
0 1 Contador Crescente
PTA4 PTA1
15
SW2
3
VDD+5 PTA2
14 1 0 Contador Decrescente
4 SW -SPST
VSS/GND PTA3
5
13
1 1 Zero piscando
PTB7 PTB0
12
6
PTB6 PTB1
11 R8 R9
7 1k 1k
PTB5 PTB2
10
8
PTB4 PTB3
9
Recomenda-se em caso de dúvida
HCS908QG8
consultar o data sheet do 7448
3
5
4
6
2
1
7
U1
B
A
D
C
LT
RBI
BI/RBO
7448
QG
QD
QC
QE
QB
QA
QF
14
15
9
10
11
12
13
R1
150
R2
150
R3
150
R4
150
R5
150
R6
150
R7
150