hc-hcs-08

128
MICROCONTROLADORES 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

Upload: mvfs

Post on 26-Jul-2015

313 views

Category:

Documents


10 download

TRANSCRIPT

Page 1: HC-HCS-08

MICROCONTROLADORES• 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 GamaProf. Sérgio Tavares

Page 2: HC-HCS-08

MICROCONTROLADORES

Everywhere!

Page 3: HC-HCS-08

MICROCONTROLADORES – ENCAPSULAMENTOS

Page 4: HC-HCS-08

LVI

4-ch 8-BitADC

KBI

HC08 CPU

2-ch 16-bitTimer

4K or 1.5K Flash

128 RAM

COP

Up to 13 GPIO and

1 input

• High Performance, Easy to Use 68HC08 CPU• As fast as 125ns minimum instruction cycle time at 8 Mhz bus

• Memory • 1.5K or 4K bytes of in-application re-programmable Flash• 128 bytes of RAM

• Peripherals• 2-ch, 16-bit Timer with selectable IC, OC, or PWM• Computer Operating Properly and LVI with selectable trip point• Analog to Digital Converter (QT2/QT4/QY2/QY4 only)• Keyboard Interrupts• Up to 13 general purpose I/O and 1 input

• Available Packages (First 6 MCUs in Family)• 8 PDIP, 8 SOIC, 16 PDIP, 16 SOIC, 16 TSSOP

• Development Tools/ Documentation• FREE CodeWarrior Development Studio Special Edition includes

highly optimized C compiler, assembler, linker, debugger, and auto-code generator for all QT/QY MCUs

• Hardware tools from low cost demo boards to high performance emulators

• Target Applications:• Discrete replacement, appliances, control systems, home and

industrial security systems, fluorescent light ballasts, electromechanical replacement, consumer and appliances

MICROCONTROLADORES - CARACTERISTICAS

Page 5: HC-HCS-08

MICROCONTROLADORES – ENCAPSULAMENTOS / ELÉTRICA

Page 6: HC-HCS-08

MICROCONTROLADORES – OSCILADOR INTERNO

Page 7: HC-HCS-08

MICROCONTROLADORES – CODE WARRIOR

Estas informações tem a finalidade de inicializar um projeto utilizando o Code Warrior 5.1

Ao inicializar este programa logo éapresentada esta tela inicial, onde podemosescolher as seguintes opções:

Cria um novo projeto com auxilio doprograma (recomendável)

Carrega exemplos de programas existentes

Carrega um projeto já existente

Carrega o tutorial do Code Warrior

Inicia o programa normalmente semnenhum auxilio.

Page 8: HC-HCS-08

MICROCONTROLADORES – CODE WARRIOR

Coloque em AssemblyEscolha o nome do projeto

Este é o local ondeserá gravado o projetoO caminho pode seralterado pelo botãoSET

Ao termino da configuração click emAVANÇAR

O Code Warrior tem um processo chamado de WIZARD onde ele auxilia passo a passo a construção do seu projeto

Page 9: HC-HCS-08

MICROCONTROLADORES – CODE WARRIOR

Nesta janela você pode fazer a escolha do microcontrolador que irá usar em seu projeto.Para esta apresentação estará sendo escolhido o HC908QY4

Familia de microcontroladoresda FREESCALE Ao escolher click em avançar

Obs. Ainda nãofoi escolhido

Page 10: HC-HCS-08

MICROCONTROLADORES – CODE WARRIOR

Continuando ainda na mesma tela de escolha do microcontrolador foi escolhido o HC68HC908QY4 em modo de simulação.Obs. para um futuro podemos usar os gravadores.

Microcontroladorescolhido

Configurado em modo de simulação

Gravadoresde microcontroladores

Após a escolha click em avançar

Page 11: HC-HCS-08

MICROCONTROLADORES – CODE WARRIOR

Caso tenha outras fontes a adicionar estas ficam em PROJECT FILES.No momento não existe nenhum e podemos avançar direto

Page 12: HC-HCS-08

MICROCONTROLADORES – CODE WARRIOR

O processador expert é uma ferramenta de desenvolvimento que será visto futuramente. Click em concluir como a tela se encontra originalmente para iniciar o projeto

Page 13: HC-HCS-08

MICROCONTROLADORES – CODE WARRIOR

Esta é a tela onde iremos trabalhar no software do microcontrolador

Click duas vezes emMAIN para aparecera tela de CODIGO ASSEMBLYno lado direito

O seu programa deveser escrito depois doMAIN LOOP

Page 14: HC-HCS-08

MICROCONTROLADORES – CODE WARRIOR

Nesta janela podemostrocar a função desimulação para gravação.Os nossos gravadores sãoconfigurados em MON08INTERFACE

Este ícone permitea troca do microcontrolador

Este ícone faz a compilação do programa e localizapossíveis erros de escrituração.

Este icone faz ingressarno simulador para os devidostestes antes da gravação nomicrocontrolador

Nesta página discutiremos alguns itensimportantes para começar a programar

Para simular deixe emFULL CHIP SIMULATION

Para gravar deixe emMON08INTERFACE

Page 15: HC-HCS-08

MICROCONTROLADORES – CODE WARRIOREsta tela é o local onde podemos fazer a simulação e ver os resultados obtidos do desempenho do programa

Page 16: HC-HCS-08

MICROCONTROLADORES – CODE WARRIOR

Nestas páginas estaremos vendo com mais detalhes a funcionalidade das janelas do simulador e seu ícones

Faz rodar o programa em modo continuo

Faz rodar o programa passo a passo

Faz parar a simulação doprograma

Apaga todosos dados dasimulação

Estes comandos sófuncionam na emulação

Page 17: HC-HCS-08

MICROCONTROLADORES – CODE WARRIOR

Esta janela informa em que linha o microcontrolador esta.Aqui você vê o seu programa original o qual foi escrito.Para acionar a simulação useo comando passo a passo

Esta janela mostra o resultadoda simulação.se usar o passo a passo vocêtem o resultado linha a linha, casocontrário só irá ver o comando running.Ela também informa erros, dápropostas de soluções e podemosinserir comandos como por exemploacionar uma chave ou ver umasaída energizada (pinos)

Page 18: HC-HCS-08

MICROCONTROLADORES – CODE WARRIOR

Nesta janela você vê o seu programa escrito anteriormentemas de maneira mais detalhada. Ele fornece o endereçodo contador de programa (PC), os códigos digitados e osdados ou endereços o qual foram as instruções

Endereço do PCCódigosDados ou endereços

Nesta janela é possível ver todos os dados dentroda memória flash do microcontrolador desde0000 a FFFF

Page 19: HC-HCS-08

Família demicrocontroladoresutilizado

Ciclos gastos pela CPU ao rodar o programa

Valores contidos no acumuladorValores contidos no Stack Pointer

Endereço em que se encontra oprograma dado pelo Program Counter (PC)

RegistradorHX de 16 bits

Registrador de Status, onde este informa como esta o microcontroladorem negrito.V =Indicador de estouro (+127 ou – 128)H = Half – Carry entre os bits 3 e 4 I = Interrupção habilitadaN = Resultado negativo na operaçãoZ = Resultado zero na operaçãoC = Transporte ou emprestimoCarry/Borrow, onde ocorre operações desoma acima de 255, resultados menoresque zero e deslocamento / rotação

MICROCONTROLADORES – CODE WARRIOR

Page 20: HC-HCS-08

MICROCONTROLADORES – CODE WARRIOR

Iremos colocar duas linhas de programa para fazer um carregamento no acumulador e salvar na memóriaE logo em seguida analisar no simulador.

Programa

Use ponto e virgula ( ; ) para fazer comentários

Linhas de comentários são importantes paralembrar do que foi programado. Isto é necessáriopois esta linguagem é abstrata.

REGRAS DAS CORES

Azul = comandoreconhecido

Vermelho = comentários

Preto = comando nãoreconhecido

Para compilar e simular use os íconese

Page 21: HC-HCS-08

MICROCONTROLADORES – CODE WARRIOR

Esta é a tela do simulador com o programa ainda não simulado. Para simular use os icones Step e Reset

Page 22: HC-HCS-08

Usando o Step by Step podemos acompanhar linha a linha do andamento do programa nas seguintes telas

MICROCONTROLADORES – CODE WARRIOR

A linha em AZUL MARINHOInforma que seráSIMULADA apósO comando STEP

Page 23: HC-HCS-08

MICROCONTROLADORES – CODE WARRIOR

Observe que quando o CODE WARRIOR faz as alterações no microcontrolador mediante oprograna residente, ele deixa em vermelho a informação.

Número 08 hexa salvo namemória 0080

Número 08 hexa inserido no acumulador

Para ver a simulaçãonovamente RESET oprograma com o ícone

Page 24: HC-HCS-08

MICROCONTROLADORES – AREA DE MEMÓRIA

Para que possamos fazer uma correta programação em um microcontrolador, devemos conhecer oendereçamento de memória do microcontrolador.

Mapa de memóriaHC908QY4/QT4

Page 25: HC-HCS-08

MICROCONTROLADORES – AREA DE MEMÓRIA

Mapa de memóriaHC908QY4/QT4

Page 26: HC-HCS-08

MICROCONTROLADORES – COMANDOS

Nestas páginas futuras estaremos mostrando alguns comandos importantes para a devida programação de ummicrocontrolador – Maiores informações consultem o manual CPU08RM.PDF e o livroMicrocontroladores HC908Q Teoria e prática – Editora Erica / Fábio Pereira

LDA – Carrega um valor de imediato ou pela memória

Ex. LDA #08 - Carregamento do numero 08 em decimal para o acumuladorLDA #$08 - Carregamento do numero 08 em hexadecimal para o acumuladorLDA #%00001000 - Carregamento do número 08 em binário para o acumuladorLDA $80 - Carregamento de um número contido na memória na posição $0080 para o acumulador

STA – Carrega o valor do acumulador para a memória

Ex. STA $80 - Carrega o valor contido no acumulador para a posição de memória 0080

MOV – Movimenta um valor para a memória, e valores entre áreas de memória

Ex. MOV #02,$82 - Movimenta o valor 02 decimal para a área de memória $0082MOV $82, $80 - Copia o valor na área de memória$ 0082 para $0080

REGRAS IMPORTANTES

# = Indica valor decimal#$ = Indica valor hexadecimal

#% = Indica valor binário$ = Indica endereço

Page 27: HC-HCS-08

MICROCONTROLADORES – COMANDOS

Exemplo:MOV #%00001111, $80 COLOCANDO O NUMERO HEXA 0F NA POISÇÃO $80 DA RAMBCLR 0,$80 APAGANDO O BIT 0 DA MEMÓRIA $80BSET 7,$80 INCREMENTANDO O BIT 7 DA MEMÓRIA $80

Existe também a possibilidade de alterar somente um bit, como mostra abaixo com os comandos BSET e BCLR

Também é possível fazer na porta de saída do microcontrolador.

Exemplo:BCLR 1, PTB NÃO TERÁ TENSÃO NO PINO 1BSET 6, PTB TERÁ TENSÃO NO PINO 6

Para o apagamento total de um determinado endereço de memória usamos o CLR

Exemplo:MOV #FF,$80 COLOCA O NUMERO FF EM HEXA NA MEMÓRIA $80CLR $80 APAGA TODO CONTEÚDO COLOCADO NO ENDEREÇO $80

Também é possível fazer na porta de saída do microcontrolador.

Exemplo:CLR PTA LIMPA TODA A PORTA A DO MICROCONTROLADORCLR PTB LIMPA TODA A PORTA B DO MICROCONTROLADOR

Page 28: HC-HCS-08

MICROCONTROLADORES – COMANDOS

Existe a possibilidade de fazer deslocamento de um determinado bit para a direita ou esquerda tanto na memóriacomo no acumulador.

Exemplo:LDA #$2 CARREGA 2 NO ACUMULADORLSLA PROMOVE O DESLOCAMENTO DOS BITS PARA A ESQUERDALSLALSLALSRA PROMOVE O DESLOCAMENTO DOS BITS PARA A DIREITALSRALSRA

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

No simulador do CODE WARRIORexiste a possibilidade de analisar osdados em várias bases numéricas.Faça a análise do exemplo emHEXA, DECIMAL e BINÁRIOna interface do registrador.

CLICK COM O BOTÃO DIREITODO SEU MOUSE

Page 29: HC-HCS-08

MICROCONTROLADORES – COMANDOS

O recurso de deslocamento pode ser feito também na área de memória do microcontrolador

Exemplo:MOV #$4,$80 CARREGA 4 EM HEXA NA RAM DE ENDEREÇO $80 LSL $80 PROMOVE O DESLOCAMENTO A ESQUERDA DO VALORLSL $80LSR $80 PROMOVE O DESLOCAMENTO A DIREITA DO VALORLSR $80CLR $80 LIMPA A POSIÇÃO $0080 DA RAM

O comando de conversãodas bases numéricasfunciona na área de memória

Page 30: HC-HCS-08

MICROCONTROLADORES – COMANDOS

Podemos fazer lógica AND e OR com os comando AND e ORA pelo carregamento direto ou valor contido na memória

ExemploLDA #$55 CARREGA 55 NO ACUMULADOR EM HEXAAND #$33 FAZ AND NO ACUMULADOR COM O VALOR IMEDIATO 33 EM HEXALDA #%11001100 CARREGA O VALOR CC EM HEXA OU 11001100 NO ACUMULADORORA #%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 RAMLDA #$5 CARREGA 5 NO ACUMULADORADD $80 SOMA A RAM COM O ACUMULADORSUB #$3 SUBTRAI IMEDIATAMENTE 3 DO ACUMULADORADD #$4 SOMA 4 IMEDIATAMENTE COM O ACUMULADOR

O Code Warrior consegue facilitar a estrutura do programa como mostra abaixo

ExemploMOV #$2+5,$80 ;SOMA NA MEMORIA RAM 80 <2+5>MOV #$3-2,$81 ;SUBTRACAO NA MEMORIA 81 <3-2>

Page 31: HC-HCS-08

MICROCONTROLADORES – COMANDOS

Multiplicações e divisões são também possíveis com este microcontrolador usando os comandos MUL e DIV

Exemplo de multiplicação:

LDA #$3 CARREGA O NUMERO 3 EM HEXA NO ACUMULADORLDX #$2 CARREGA O NUMERO 2 EM HEXA NO REGISTRADORMUL MULTIPLICA O ACUMULADOR COM O REGISTRADOR

Exemplo de divisão:

LDA #$6 CARREGA O NUMERO 3 EM HEXA NO ACUMULADORLDX #$2 CARREGA O NUMERO 2 EM HEXA NO REGISTRADORDIV DIVIDE O ACUMULADOR COM O REGISTRADOR

Devemos ficar ciente de que este microcontrolador não consegue fazer cálculos com virgula

Este tipo de construção de programa é básico para qualquer microcontrolador, onde os cálculos são executadosno 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

LDA #((2*3)/(4-2))-1 CALCULO EXECUTADO NO ACUMULADOR

Uma caracteristica interessante neste componente é a possibilidade de fazer os calculos diretamente na memóriaum recurso que poucos microcontroladores tem.

MOV #2+((4*2)/2),$80 CALCULO EXECUTADO NO ENDEREÇO 0080 DA MEMÓRIA

O ACUMULADOR éuma área de trabalhodo microcontroladorque esta sempre comnovos valores a medidaque o programa éexecutadoPor isso caso o valor sejaImportante, este deve sersalvo na MEMÓRIA

Page 32: HC-HCS-08

MICROCONTROLADORES – DECISÕES POR COMPARAÇÃO

Em programação de microcontroladores não só existem execuções, em algum momento devemos tomardeterminadas decisões, que podem ser de várias maneiras.Estaremos abordando a parte de decisão por comparação

?N

S

ALGUNS COMANDOS PARA EXEMPLO

CMP = Compara acumulador com a memóriaBEQ = Desvia se igualBNE = Desvia se diferenteCBEQA = Compara o acumulador com um valor imediato e desvia

caso seja igualBRSET = Desvia se o bit N estiver em 1BRCLR = Desvia se o bit N estiver em 0

Consulte também o arquivoCPU08RM.pdf

pois existem todos os comandos

Page 33: HC-HCS-08

MICROCONTROLADORES – DECISÕES POR COMPARAÇÃO

INICIO:LDA #$3MOV #$3,$80CMP $80BEQ DESVIA BRA NAO_DESVIA

DESVIA:MOV #$10,$88BRA INICIO

NAO_DESVIA:MOV #$5,$86BRA INICIO

INICIO:LDA #$4MOV #$3,$80CMP $80BEQ DESVIA BRA NAO_DESVIA

DESVIA:MOV #$10,$88BRA INICIO

NAO_DESVIA:MOV #$5,$86BRA INICIO

Este programa irá carregar o numero 10 na memória 88, quando o valor de memória 80 for igual aoacumulador. Caso o valor seja diferente será colocado o número 05 na memória 86

PROCESSO:

1. COMPARAR - CMP2. DESVIAR - BEQ

Page 34: HC-HCS-08

MICROCONTROLADORES – DECISÕES POR COMPARAÇÃO

INICIO:LDA #$4MOV #$3,$80CMP $80BNE DESVIA BRA NAO_DESVIA

DESVIA:MOV #$10,$88BRA INICIO

NAO_DESVIA:MOV #$5,$86BRA INICIO

INICIO:LDA #$3MOV #$3,$80CMP $80BNE DESVIA BRA NAO_DESVIA

DESVIA:MOV #$10,$88BRA INICIO

NAO_DESVIA:MOV #$5,$86BRA INICIO

Este programa irá carregar o numero 10 na memória 88, quando o valor de memória 80 for diferente aoacumulador. Caso o valor seja igual será colocado o número 05 na memória 86

PROCESSO:

1. COMPARAR - CMP2. DESVIAR - BNE

Page 35: HC-HCS-08

MICROCONTROLADORES – DECISÕES POR COMPARAÇÃO

INICIO:LDA #$4CBEQA #$4, DESVIA BRA NAO_DESVIA

DESVIA:MOV #$10,$88BRA INICIO

NAO_DESVIA:MOV #$5,$86BRA INICIO

INICIO:LDA #$3CBEQA #4, DESVIA BRA NAO_DESVIA

DESVIA:MOV #$10,$88BRA INICIO

NAO_DESVIA:MOV #$5,$86BRA INICIO

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:

1. COMPARAR E DESVIA - CBEQA

Page 36: HC-HCS-08

MICROCONTROLADORES – DECISÕES POR COMPARAÇÃO

INICIO:MOV #%00000100,$80BRSET 2,$80, DESVIA BRA NAO_DESVIA

DESVIA:MOV #$10,$88BRA INICIO

NAO_DESVIA:MOV #$5,$86BRA INICIO

INICIO:MOV #%00000000,$80BRSET 2,$80, DESVIA BRA NAO_DESVIA

DESVIA:MOV #$10,$88BRA INICIO

NAO_DESVIA:MOV #$5,$86BRA INICIO

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:

1. TESTA O BIT E DESVIA - BRSET

Page 37: HC-HCS-08

MICROCONTROLADORES – DECISÕES POR COMPARAÇÃO

INICIO:MOV #%11111011,$80BRCLR 2,$80, DESVIA BRA NAO_DESVIA

DESVIA:MOV #$10,$88BRA INICIO

NAO_DESVIA:MOV #$5,$86BRA INICIO

INICIO:MOV #%11111111,$80BRCLR 2,$80, DESVIA BRA NAO_DESVIA

DESVIA:MOV #$10,$88BRA INICIO

NAO_DESVIA:MOV #$5,$86BRA INICIO

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:

1. TESTA O BIT E DESVIA - BRCLR

Page 38: HC-HCS-08

MICROCONTROLADORES – PORTAS

Para fazer a configuração da porta devemos usar o DDR antes de enviar um comando PT.DDRA, estaremos configurando a porta A do microcontroladorDDRB, estaremos configurando a porta B do microcontroladorPTA, estaremos enviando (1) ou recebendo (0) uma informação pela porta APTB, estaremos enviando (1) ou recebendo (0) uma informação pela porta B

Nível 1 em DDRBlibera este buffer etemos a porta configurada comosaída.

Nível 0 em DDRBlibera este buffer etemos a porta configurada comoentrada.

PTB, pode enviar umnível lógico para saídado microcontrolador oureceber um nível e enviá-lo para CPU

Configuramos oPULL UP para garantir o nívelbaixo na porta

Page 39: HC-HCS-08

MICROCONTROLADORES – PORTAS

Todos estes registradores são programáveis por software, sendo este programados individualmente.

Nível:1 = Pull up Ativado0 = Pull up DesativdadoObs. Quando o DDRB, forconfigurado como saídao PTBPUE é desabilitadoautomáticamente.

Nível1 = Porta configurada comosaída.0 = Porta configurada comoentrada.

Nível para DDRB = 11 = Porta esta enviando5V para o exterior0 = Porta esta enviando0V para o exterior

Nível para DDRB = 01 = Porta esta recebendo5V para o exterior0 = Porta esta recebendo0V para o exterior

Page 40: HC-HCS-08

MICROCONTROLADORES – PORTAS

Para podermos programar um microcontrolador, devemos conhecer todo o HARDWARE.

Page 41: HC-HCS-08

MICROCONTROLADORES – PORTAS

BSET 0,CONFIG1 MOV #%11111110, DDRBMOV #$00, PTBPUECLR PTB

PRINCIPAL:

BRSET 0,PTB,DEMO1BRA DEMO2

DEMO1:MOV #$02, PTBBRA PRINCIPAL

DEMO2:BSET 2 , PTBBCLR 1, PTBBRA PRINCIPAL

Este programa irá configurar as portas PTB 0 como entrada e PTB 1 a 7 como saídas. Ao acionar a chaveobservaremos 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

Configurações iniciais

Chave 01 esta pressionada?

LED 1 – ONLED 2 – OFF

LED 1 – OFFLED 2 – ON

SIM

NÃO

Page 42: HC-HCS-08

MICROCONTROLADORES – SIMULAÇÃO VISUALIZATION TOOLS

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 modoDEBUG. O próximo passo é entrar no modo COMPONENT>OPEN e iremos observar a seguinte tela

Acesse este ícone

Page 43: HC-HCS-08

MICROCONTROLADORES – SIMULAÇÃO VISUALIZATION TOOLS

Esta é a área de trabalho do VISUALIZATION TOOLS. Ao dar um click com o botão direito do mouse, observamos vários componentes disponíveis.Neste exemplo estaremos inserindo um LED

Page 44: HC-HCS-08

MICROCONTROLADORES – SIMULAÇÃO VISUALIZATION TOOLS

No campo de propriedades, as configurações de maior importância é o PORT TO DISPLAY onde devemosreferenciar a porta (0x1 = PTB) e o BITNUMBER TO DISPLAY que referencia o pino desta porta (0 = PTB0)

Page 45: HC-HCS-08

MICROCONTROLADORES – SIMULAÇÃO VISUALIZATION TOOLS

Para podermos ver o LED em funcionamento devemos configurar o REFRESH MODE em PERIODICAL e o REFRESH TIME (100ms) para 1.

Page 46: HC-HCS-08

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

Page 47: HC-HCS-08

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

Com o comando INPUTA=01, podemosperceber a chave vermelha levantar,o LED trocar de cor e pela memória, ver o estado das portas mudar.

PTA=1

PTB=1

Page 48: HC-HCS-08

MICROCONTROLADORES – SIMULAÇÃO VISUALIZATION TOOLS

O programa abaixo fica como referencia para devidos testes do explicado anteriormente.

Page 49: HC-HCS-08

MICROCONTROLADORES – GRAVANDO O FIRMWARE

Nesta parte estaremos fazendo a gravação do programa gerado no CODE WARRIOR no microcontroladorda 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

MODO DE SIMULAÇÃO MODO DE GRAVAÇÃO

Page 50: HC-HCS-08

MICROCONTROLADORES – GRAVANDO O FIRMWARE

Ao compilar o programa e acionar o comando teremos a seguinte tela abaixo para ser configurada.

1. Acione o comando REFRESH para limpeza total da porta2. Acione ADD CONECTION para selecionar a classe do dispositivo

Page 51: HC-HCS-08

MICROCONTROLADORES – GRAVANDO O FIRMWARE

Quando acionamos ADD CONECTION teremosa tela ao lado INTERFACE SELECTION onde devemosselecionar em Power Swiching CLASS 1

Uma vez configurado o resultado fica em INTERFACE DETAILS

Certifique se o microcontrolador esta correto, pois caso contrário não ocorreráa gravação

Configure a porta COM e o BAUD RATEpara que ocorra a transmissão do firmware

Obs. Estes ajustes dependem do tipodo computador e do gravador.

CLICK AQUI PARA GRAVAR

Page 52: HC-HCS-08

MICROCONTROLADORES – GRAVANDO O FIRMWARE

Uma vez configurado corretamente a tela anterior (Connection Manager), logo aparece a tela abaixo informandoque 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 vezgravado o microcontrolador ela automaticamente desaparecerá e o firmware estará residente no chip

Page 53: HC-HCS-08

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.

Ative o DEVICE INITIALIZATION para usar o PROCESSADOR EXPERT

Page 54: HC-HCS-08

MICROCONTROLADORES – PROCESSADOR EXPERT

Esta é a tela aonde podemos ver a pinagem do microcontrolador e as áreas que queremos configurar

Page 55: HC-HCS-08

MICROCONTROLADORES – PROCESSADOR EXPERT

Configurando o PTA como entrada, devemos dar um click em PTA (desenho do chip) e teremos a seguinte tela

Page 56: HC-HCS-08

MICROCONTROLADORES – PROCESSADOR EXPERT

Na figura abaixo temos todo o processo de configuração do PTA como entrada.Ela mostra a configuração de DDRA, PTAPUE e PTA

Page 57: HC-HCS-08

MICROCONTROLADORES – PROCESSADOR EXPERT

Na figura abaixo temos todo o processo de configuração do PTB como saída.Ela mostra a configuração de DDRA, PTAPUE e PTA

Page 58: HC-HCS-08

MICROCONTROLADORES – PROCESSADOR EXPERT

Uma vez configurado, podemos acionar o GENERATE CODE

Page 59: HC-HCS-08

MICROCONTROLADORES – PROCESSADOR EXPERT

ESTE CÓDIGO FOI CRIADO

AUTOMATICAMENTE PELO

PROCESSADOR EXPERT

Page 60: HC-HCS-08

MICROCONTROLADORES – PROCESSADOR EXPERT

Vá até o PROJECT.PRMe coloque duas barras (//)na frente da linhaVECTOR 0

Para ativar o código criado peloPROCESSADOR EXPERTdevemos fazer os seguintes procedimentos

Page 61: HC-HCS-08

MICROCONTROLADORES – PROCESSADOR EXPERT

Para que a o arquivo main.asm, consiga reconhecer os codigos gerados pelo processador expert contidono arquivo MCUunit.asm deve ser retirado o ponto e virgula da linha JSR MCU_unit

Retire o ponto e virgula desta linha

Page 62: HC-HCS-08

MICROCONTROLADORES – HARDWARE

Page 63: HC-HCS-08

DISPLAY CATODO COMUM

cde

bafg

MICROCONTROLADORES – KIT DE TESTE – HC908QY4

7448

Page 64: HC-HCS-08

MICROCONTROLADORES – TIMER INTERNO

INICIO

Desabilitar COP para não dar RESET na CPU Habilitar interrupção TOIE – para informar que a temporização terminou. Quando isto acontece TOF vai para 1Ajustar o PREESCALER – velocidade de contagem

CONFIGURAÇÕES

CARREGAMENTODO TIMER

Usar TMODH e TMODL para colocar o valor de temporização em hexa desejada no programa

DELAYMANTENHA A CONTAGEM

N

S

O TEMPO ACABOU?Caso o valor de TMODH e TMODL for igual ao contador interno de 16bit ($21 e $22) a temporização termina.

APAGAR TOF ERETORNE PARA OCARREGAMENTO DO TIMER

TOF fica em 1 ao terminar a temporização, para que ocorra uma nova devemos apaga-lo

Page 65: HC-HCS-08

N

S

MICROCONTROLADORES – TIMER INTERNO / CÓDIGO

BSET 0,CONFIG1; DESABILITA O COPMOV #%01000110,TSC HABILITA TOIE E AJUSTA O PREESCALE EM 1:64

TIMER:MOV #$FF,TMODH CARREGA FF EM TMODHMOV #$20,TMODL CARREGA 20 EM TMODLBRA DELAY VAI PARA O DELAY

DELAY:

BRCLR 7,TSC,DELAY TOF=0 VAI PARA DELAYBRSET 7,TSC, SAIR_DELAY TOF=1 SAI DO DELAY

SAIR_DELAY: BCLR 7, TSC APAGA TOFBRA TIMER RETORNA AO CARREGAMENTO DO TIMER

INICIO

Page 66: HC-HCS-08

MICROCONTROLADORES – TIMER INTERNO / PISCA PISCA

N

S

INICIO

CONFIGURAÇÕES

CARREGAMENTODO TIMER

DELAYMANTENHA A CONTAGEM

O TEMPO ACABOU?

APAGAR TOF ERETORNE PARA OCARREGAMENTO DO TIMER

PISCA PISCA

LED 1 ON?

APAGAR LED 1LIGAR LED 2

APAGAR LED 2LIGAR LED 1

S

N

SAIDA DOCARREGAMENTODO TIMER

ENTRADA DODELAY

Page 67: HC-HCS-08

N

S

BSET 0,CONFIG1MOV #%01000110,TSCMOV #%00000011, DDRBMOV #$00, PTBPUECLR PTB

INICIO

MOV #$FF,TMODHMOV #$20,TMODLTIMER:BRA CONDICAO

DELAY:

BRCLR 7,TSC,DELAYBRSET 7,TSC, SAIR_DELAY

SAIR_DELAY: BCLR 7, TSCBSET 4,TSCBRA TIMER

S

N

SAIDA DOCARREGAMENTODO TIMER

CONDICAO:BRSET 0,PTB,LED2BRA LED1

LED1:MOV #%00000001, PTBBRA DELAY

LED2:MOV #%00000010, PTBBRA DELAY

ENTRADA DODELAY

MICROCONTROLADORES – TIMER INTERNO / PISCA PISCA - CÓDIGO

PISCA PISCA

Page 68: HC-HCS-08

MICROCONTROLADORES – TIMER INTERNO / PISCA PISCA - CÓDIGO

INICIO:

BSET 0,CONFIG1MOV #%01000110,TSCMOV #%00000011, DDRBMOV #$00, PTBPUECLR PTB

MOV #$FF,TMODHMOV #$20,TMODL

TIMER:BRA CONDICAO

CONDICAO:BRSET 0,PTB,LED2BRA LED1

LED1:MOV #%00000001, PTBBRA DELAY

LED2:MOV #%00000010, PTBBRA DELAY

DELAY:BRCLR 7,TSC,DELAYBRSET 7,TSC, SAIR_DELAY

SAIR_DELAY: BCLR 7, TSCBSET 4,TSCBRA TIMER

APÓS DIGITAR O PROGRAMA

Localize a linha INCLUDE e abaixodela adicione as duas linhas comoIndicado. Isto fará o tratamento dainterrupção do TIMER

Page 69: HC-HCS-08

MICROCONTROLADORES – SUB ROTINAS

As sub-rotinas normalmente são utilizadas para a simplificação dos programas criados.Também são 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.

SUB-ROTINA

PROGRAMA PRINCIPAL

Page 70: HC-HCS-08

MICROCONTROLADORES – SUB ROTINAS

Em alguns casos observamos sub-rotinas chamarem outra sub-rotinas.Mas o que devemos saber é que o retorno do programa sempre será para um ponto a frente do seu inicio de partida.

PROGRAMA PRINCIPAL

SUB-ROTINA 1

SUB-ROTINA 2

Page 71: HC-HCS-08

MICROCONTROLADORES – SUB ROTINAS

JSR – Efetua o desvio do fluxo do programa para uma sub-rotina.

O JSR pode ser feito por endereço ou label.

Ex.JSR $20JSR SUB_ROTINA

RTS – Provoca o retorno do fluxo do programa ao ponto seguinte ao de onde ocorreu a chamada da sub-rotina

PROGRAMA PRINCIPAL

SUB-ROTINA 1

SUB-ROTINA 2

JSR SUB-ROTINA 1

JSR SUB-ROTINA 2RTS

RTS

Page 72: HC-HCS-08

N

S

CONFIGURAÇÃO DO TIMER, E PORTAS

INICIO

CARREGAMENTODOS REGISTRADORESTMODH E TMODL

DELAY:MANTENHA A CONTAGEM

APAGAR TOF ERETORNE PARA A ULTIMA CHAMADA DE SUB ROTINA

ACIONAMENTO DO LED 1 E DESVIA PARA DELAY

ACIONAMENTO DO LED 2 E DESVIA PARA DELAY

DESVIA PARA OACIONAMENTO DO LED 1

MICROCONTROLADORES – SUB ROTINASUSANDO O TIMER INTERNO P/ PISCAR LEDS

O TEMPO ACABOU?

O CAMINHO CRIADO PELOS COMANDOS

JSR e RTS

Pelo caminho azul, temos oprimeiro salto para a sub-rotina.

Já o caminho em verde mostrao segundo salto para a sub-rotina

Lembrando que podemos usar amesma sub-rotina para diversas

aplicações, mas nada impede de usarmos sub-rotinas diferentes

Page 73: HC-HCS-08

N

S

BSET 0,CONFIG1MOV #%01000110,TSCMOV #%00000011, DDRBMOV #$00, PTBPUECLR PTB

INICIO

TIMER:MOV #$FF,TMODHMOV #$20,TMODL

DELAY:

BRCLR 7,TSC,DELAYBRSET 7,TSC, SAIR_DELAY

SAIR_DELAY: BCLR 7, TSCRTS

PISCA:MOV #%00000001, PTBJSR DELAY

MOV #%00000010, PTBJSR DELAY

BRA PISCA

MICROCONTROLADORES – SUB ROTINASUSANDO O TIMER INTERNO P/ PISCAR LEDS

UseJSR paraIr a sub-rotina

UseRTS parasair da sub-rotina

Page 74: HC-HCS-08

MICROCONTROLADORES – SUB ROTINASUSANDO O TIMER INTERNO P/ PISCAR LEDS

INICIO:

BSET 0,CONFIG1MOV #%01000110,TSCMOV #%00000011, DDRBMOV #$00, PTBPUECLR PTB

TIMER: MOV #$FF,TMODHMOV #$00,TMODL

PISCA:MOV #%00000001, PTBJSR DELAY

MOV #%00000010, PTBJSR DELAYBRA PISCA

DELAY:BRCLR 7,TSC,DELAYBRSET 7,TSC, SAIR_DELAY

SAIR_DELAY: BCLR 7, TSCRTS

Page 75: HC-HCS-08

MICROCONTROLADORES – CONVERSOR ANALÓGICO / DIGITAL

CHANNEL SELECTResponsável para habilitar os pinosdo HC para fazer a conversão A/D

ADC Conversor Analógico Digital de 8 bits

ADC DATA REGISTERLocal onde ficará registrado o valorConvertido em HEXADECIMAL

CLOCK GENERATORResponsável pela velocidade deconversão do ADC

INTERRUPT LOGICAo termino da conversão é habilitadauma interrupção avisando que o dadoesta no ADC DATA REGISTER

Page 76: HC-HCS-08

MICROCONTROLADORES – CONVERSOR ANALÓGICO / DIGITAL

Para selecionar a porta devemos usar a tabela da verdade acima

ADSCR – É o registrador responsável para ativar as portas do conversor A/D

CH1 e CH2 – A combinação destes flags podemos escolher a porta do HC para fazer a conversão

ADCO – Seleciona o modo simples ou continuo de conversão1 = Conversão continua 0 = Conversão simples

CONVERSÃO SIMPLESO conversor realiza apenas uma única conversãoApós o seu termino, ativa o flag COCO e ficaaguardando o usuário iniciar nova conversão

CONVERSÃO CONTINUAEste inicia automaticamente uma nova conversãoapós o termino da outra.

O registrador ADSCR informa o processo deConversão pelos flags COCO e AIEN

COCO0 = Conversão não completada1 = Conversão completada

AIEN0 = Interrupção desabilitada1 = Interrupção habilitada

Page 77: HC-HCS-08

MICROCONTROLADORES – CONVERSOR ANALÓGICO / DIGITAL

ADR – Este registrador contém a informaçãodo conversor AD que pode ser movimentadopara a memória ou acumulador

ADICLK – Neste registrador podemoscontrolar a velocidade de conversãodo conversor AD. Este pega o valor do clock do barramento e dividir de 1 a 16 vezes

Os valores devem ser colocados nos flagsADV2, ADV1 e ADV0 do ADICLK respeitando a tabela ao lado

EXEMPLO: - Configure um conversor AD utilizando a porta PTA 0 usando a conversão continua e com a máxima velocidadede conversão.

RESPOSTA:MOV #%00100000,ADSCR MOV #%00000000,ADICLK

Page 78: HC-HCS-08

MICROCONTROLADORES – CONVERSOR ANALÓGICO / DIGITAL

Desabilitando o COPHabilitando PTA0 como entrada

Inicio

Conversão em modo continuoPorta PTA0 como entrada para o conversor A/DVelocidade máxima de conversão

Carregar no acumulador

Salvar na memória $80

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

Page 79: HC-HCS-08

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

BSET 0,CONFIG1 MOV #$00,DDRA

Inicio

MOV #$20,ADSCR MOV #$00,ADICLK

CARREGANDO: LDA ADR

STA $80BRA CARREGANDO

Page 80: HC-HCS-08

MICROCONTROLADORES – INTERRUPÇÃO DE TECLADO

A finalidade de ter interrupção em teclado é de deixar o microcontrolador mais eficiente. Ao fazer teste de entradaa todo instante, faz com que o mesmo perca rendimento. O interessante é fazer o teste do determinado tecladoquando uma tecla realmente for acionada

METODO POR TESTE DE PORTA

INICIO

TESTE DO TECLADO

LINHAS DE PROGRAMA

LINHAS DE PROGRAMA

LINHAS DE PROGRAMA

O problema deste fluxograma é que este sempre estará gastando tempotestando o teclado, mesmo sem estarsendo usado.

Page 81: HC-HCS-08

MICROCONTROLADORES – INTERRUPÇÃO DE TECLADO

Pelo processo da interrupção, as linhas de programa que gerenciam o teste de teclado ficam fora do programaprincipal. Só serão executadas quando alguém acionar alguma tecla. Outro ponto importante que ao terminara rotina de teste do teclado, o programa volta a origem de onde foi interrompido

METODO POR INTERRUPÇÃO POR TECLADO

INICIO

LINHAS DE PROGRAMA

LINHAS DE PROGRAMA

LINHAS DE PROGRAMA

TESTE DO TECLADO

- O programa roda livremente sem arotina de teclado- Ao tocar no teclado o programa paraimediatamente e vai para a rotina de Interrupção.- Ao termino da interrupção esta retornaa sua origem

Page 82: HC-HCS-08

MICROCONTROLADORES – INTERRUPÇÃO DE TECLADO

CONFIGURANDO OS REGISTRADORES

KBSCR – Registrador responsável pelo controle principal do módulo

KEYF – Flag de interrupção de teclado0 = Não há interrupções pendentes no teclado1 = Existe uma interrupção pendente no teclado

IMASKK – Flag de mascaramento de interrupção de teclado0 = Mascarado – ocorrerá interrupção se KEYF=11 = Não mascarado – não haverá interrupção

MODEK – Flag de sensibilidade do teclado0 = Sensibilidade a borda de descida1 = Sensibilidade a borda de descida e nível baixo

ACKK – Bit de reconhecimento de teclado

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 acordar0 = Interrupção desabilitada1 = Interrupção habilitada

KBIE0 a KBIE5 – habilita os pinos PTA0 a PTA5como entradas do módulo KBI (interrupções)

0 = O pino não esta habilitado como interrupção1 = O pino esta habilitado como interrupção

Page 83: HC-HCS-08

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

Estes tratamentos por ORG oualterando o PROJECT.PRM, e Incluindo um LABEL, nada mais édo que orientanto o programa aTer um fluxo organizado.

Para terminar devemos semprecolocar um comando RTI para queo programa saia do tratamento dainterrupção e volte ao programa principal

As interrupções tem prioridades epodemos ter várias, mas sendo cadauma tratada por vez respeitanto a tabela de prioridades ao lado.

Page 84: HC-HCS-08

MICROCONTROLADORES – INTERRUPÇÃO DE TECLADO

Neste fragmento de programa em MAIN, podemos ver como configuramos uma interrupção.Escreva INTERRUPT ououtro LABEL que desejar

Local onde esta acontecendo a interrupção

Programa principal

Não esqueça de Configurar o PROJECT.PRM

Comando de retorno p/ o programa principal

Page 85: HC-HCS-08

MICROCONTROLADORES – INTERRUPÇÃO DE TECLADO

Localizando o Arquivo.PROJECT.PRM

Esta linhaVECTOR 14 INTERRUPTFaz o reconhecimento dainterrupção

Lembrando que o numero 14 é retirado da tabela de vetores de interrupção.Já o INTERRUPT é o LABEL encontrado no arquivo MAIN, para o correto funcionamento

ARQUIVO PROJECT.PRM

Page 86: HC-HCS-08

MICROCONTROLADORES – INTERRUPÇÃO DE TECLADO

Existem várias maneiras de fazer a interrupção. Vamos analisar mais uma.

A diretiva ORG é utilizada para especificar um endereço onde ocorre um evento a ser tratadologo em seguida por um label

FBD define uma constante de memória. O tamanhoda memória a ser utilizada será a constante a serescolhida

Programa principal

Local onde esta acontecendo a interrupção

Comando de retorno p/ o programa principal

Page 87: HC-HCS-08

MICROCONTROLADORESLINGUAGEM C

Page 88: HC-HCS-08

MICROCONTROLADORES – CODE WARRIOR

Page 89: HC-HCS-08

MICROCONTROLADORES – CODE WARRIOR

Page 90: HC-HCS-08

MICROCONTROLADORES – CODE WARRIOR

Page 91: HC-HCS-08

#include <hidef.h>#include "derivative.h"

int a,b,c,d;

void main(void){ a=2;b=3;c=a+b;d=b-a;}

#include <hidef.h>#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;}

VARIÁVEIS GLOBAIS E LOCAIS

Quando declaramos as varáveis antes de uma função, esta fica considerada comoglobal, onde esta será aproveitada em todo momento do programa.

Quando declaramos as varáveis dentro de uma função, esta fica considerada comolocal, onde esta será aproveitada somente dentro da função de origem.

PROGRAMA PARA HC908QY4

Page 92: HC-HCS-08

82.23e-308 a 1.7e308long double

82.23e-308 a 1.7e308double

41.17549e-38 a 3.40282e38float

4-2147483647 a 2147483647long int

40 a 4.294.967.295unsigned long int

20 a 65.535unsigned int

2-32.768 a 32767int

10 a 255char

1-128 a 127signed char

TAMANHO EM BYTESFAIXA DE VALORESTIPO

TIPOS DE DADOS

Page 93: HC-HCS-08

#include <hidef.h> #include "derivative.h"

signed char a,b;char c;int d,e;unsigned int f;unsigned long int i;long int j,k;float m,n;double q,r;long double s,t;

void main(void) {

//Estes são os valores máximos para as variáveis declaradas acima//Caso ocorra alteração do valor para maior, teremos valores incorretos

a=-128;b=127;c=255;d=-32768;e=32767;f=65535;i=4294967295;j=-2147483647;k=2147483647;m=1.17549e-38;n=3.40282e38;q=2.23e-308;r=1,7e308;s=2.23e-308;t=1.7e308;

}

Escreva este programa no Code Warriore confirme os valores das variáveis.Logo em seguida altere o valor de algumaspara maior do que permitido e veja o resultado.

TIPOS DE DADOS

PROGRAMA PARA HC908QY4

Page 94: HC-HCS-08

TIPOS DE DADOS

No programa abaixo podemos analisar o comportamento dentro da memória do microcontrolador

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */

char memoria_80 @0x80; // char - ocupa 1 byte de espaço int memoria_81 @0x81; // int - ocupa 2 bytes de espaçolong memoria_83 @0x83; // long - ocupa 4 bytes de espaçodouble memoria_88 @0x88; // double - ocupa 8 bytes de espaço

void main(void) {

inicio:

memoria_80=5; //Carrega na memória $80 o valor 5memoria_81=6; //Carrega na memória $81 a $82 o valor 6memoria_83=7; //Carrega na memória $83 a $86 o valor 7memoria_88=8; //Carrega na memória $88 a $8F o valor 8

__RESET_WATCHDOG();

goto inicio;}

A função do @ e o endereço logo em seguida, informaa variável o inicio de seu armazenamento. O esquecimento não permitirá a gravação na área de memória desejada é tornar-se-á uma variável local ou global.

Page 95: HC-HCS-08

TIPOS DE DADOS

Podemos fazer programas e guardar informações na memória

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */

char a @0x80; // Direciona a variável a para a posição $80char b @0x81; // Direciona a variável b para a posição $81char c @0x82; // Direciona a variável c para a posição $82

void main(void) {

inicio:

a=2+1; // Salva o valor na memória $80b=a*2; // Salva o valor na memória $81c=b/3; // Salva o valor na memória $82

__RESET_WATCHDOG();

goto inicio; }

PROGRAMA PARA HC908QY4

Page 96: HC-HCS-08

PONTEIROS

Ponteiro é uma variável que contém um endereço de memória. Esse endereço é normalmente a posição de umaoutra variável de memória. Se uma variável contém o endereço de uma outra, então a primeira variável é ditaapontar para a segunda.

& = Retorna o endereço de uma variável.*p = Modelo de um ponteiro.

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */

char x @0x88; // Orienta X estar no endereço 88char *p; // Criação de um ponteiro *p

void main(void) {

p=&x; // Esta linha retorna o valor de endereço da variável X

}

O programa abaixo orienta que a variável X comece a gravar os valores na memória de posição 88, logo em seguidaverifica se a variável X esta em 88 pelo ponteiro p1.

PROGRAMA PARA HC908QY4

Page 97: HC-HCS-08

PONTEIROS

& = Retorna o endereço de uma variável* = Retorna o conteúdo de um endereço especificado.

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */

char x @0x88; // Orienta a variável X a guardar os seus valores na posição 88char s @0x90; // Orienta a variável S a guardar os seus valores na posição 90char *p @0xA0; // Orienta o ponteiro *p a guardar posições de memória no endereço A0

void main(void) {

x=1; // Constante 1 sendo gravada na posição de memória 88p=&x; // Posição de memória 88 colocada no ponteiro A0.s=*p; // Valor contido na memória 88 da posição do ponteiro AO será armazenado no endereço 90

}

Os ponteiros podem ser orientados a determinadas posições para trabalharem. Caso o programador nãodefinir 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 $88e irá resgatar o valor da memória $88 e salvar em $90

PROGRAMA PARA HC908QY4

Page 98: HC-HCS-08

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */

char x,t,u,v;char s @0x90;char *p @0xA0;

void main(void) {

x=1;t=2;u=3;v=4;

p=&x; // Inicializa o ponteiro pela variável x

ponteiro_varredura:

s=*p; // Armazena os valores de x,t,u e v na variável s.p++; // Incrementa para a próxima variável.

goto ponteiro_varredura;}

PONTEIROS

Os ponteiros são muito utilizados para apontar para uma área de memória e descarregar o seu conteúdoem outro local.No programa abaixo foram declarada as variáveis x,t,u e v. O ponteiro foi direcionado para a variável x e ira descarregar todo o conteúdo serialmente na variável s por um comando de incremento p++ do próprioponteiro. Mas tome muito cuidado pois quando perdemos o controle do ponteiro o programa para de funcionar

PROGRAMA PARA HC908QY4

Page 99: HC-HCS-08

MATRIZES

Matriz é uma coleção de variáveis do mesmo tipo que é referenciada por um nome comum. Em C todas as matrizesconsistem em posições continuas na memória. O endereço mais baixo corresponde ao primeiro elemento e o maisalto 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.

O programa exemplo, ira carregar os valores da matriz nas variáveis a,b,c e d.

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */

char matriz [4]={6,7,8,9}; // carrega uma matriz de uma dimensão com 4 valoreschar a,b,c,d;

void main(void) {

a= matriz [0]; // cada variável armazena um valor da matrizb= matriz [1];c= matriz [2];d= matriz [3];

}

PROGRAMA PARA HC908QY4

Page 100: HC-HCS-08

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */

char matriz [8];char carga;void main(void) {

for (carga=0;carga<8;carga++) matriz[carga]=carga; // carrega de um em um a matriz 8X1

}

MATRIZES

PROGRAMA PARA HC908QY4

Podemos fazer um carregamento automático de valores em uma matriz, neste caso o carregamento é sequêncial comomostra o programa abaixo

Page 101: HC-HCS-08

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */

char matriz [4]={6,7,8,9};char posiciona_ponteiro @0x80;char recebe_ponteiro @0x88;char *ponteiro @0xA0;

void main(void) {

posiciona_ponteiro=matriz[0]; //carrega a matriz do começo

ponteiro=&posiciona_ponteiro; // posiciona o ponteiro no inicio da matriz

ponteiro_varredura:

recebe_ponteiro=*ponteiro; // o ponteiro descarrega os valores da matriz no endereço 88ponteiro++; // incrementa o ponteiro para o próximo valor da matriz

goto ponteiro_varredura;

}

PROGRAMA PARA HC908QY4

MATRIZES

Sabendo que podemos com uma matriz colocar diversos valores rapidamente em um programa sem ficar usandoinú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 oseu conteúdo no endereço de memória $88. Isto é muito interessante para aplicações que necessitamoslançar valores para as portas de um microcontrolador.

Page 102: HC-HCS-08

COMANDOS CONDICIONAIS - IF

O comando IF só é ativado em uma condição verdadeira, caso contrário o comando não tem efeito e oprograma lê a próxima linha. Para a linguagem C a condição verdadeira é nível 1 é falso é 0

IF

COMANDO

1

0

if (condição) comando;

Page 103: HC-HCS-08

COMANDOS CONDICIONAIS - IF

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */

void main (void)

{SOPT1=0; //desliga o COPPTADD_PTADD0=0; //configura PTA0 como uma entradaPTBDD_PTBDD7=1; //configura PTB7 como uma saída

inicio:if (PTAD_PTAD0) goto liga; //Verifica a condição da entrada PTA0PTBD_PTBD7=0; //desativa a saída PTB7goto inicio;

liga:PTBD_PTBD7=1; //ativa a saída PTB7goto inicio;}

O comando IF só ativa quandoestiver em nível 1 caso contrário este será ignorado e o programa continuarána próxima linha.

PROGRAMA PARA HCS908QG

Page 104: HC-HCS-08

COMANDOS CONDICIONAIS – SWITCH CASE

switch (expressão) {case (expressão 1): comando; comando; comando n; break;case (expressão 2): comando; comando; comando n; break;case (expressão n): comando; comando; comando n; break;default: comando; comando; comando n;}

CASE (E1)

CASE (E2)

CASE (En)

COMANDOS BREAK

BREAK

BREAK

DEFAULT

SWITCH

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 teste. Caso não exista nenhuma relação do SWITCH com os CASES disponíveis oprograma irá para o comando DEFAULT e executará um ou mais comandosdeterminado pelo programador

COMANDOS

COMANDOS

COMANDOS

Page 105: HC-HCS-08

COMANDOS CONDICIONAIS – SWITCH CASE

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */char S;void main (void){SOPT1=0; //desliga o copPTADD=0; //configura todos os bits da PTA como entradaPTBDD=255; //configura todos os bits da PTB como saídainicio:S=PTAD; //transfere o valor de PTA para a variável Sswitch(S) { //avalia o valor de S para o devido CASE

case (1): PTBD_PTBD0=1;goto inicio;break; //ativa PTB0case (2): PTBD_PTBD1=1;goto inicio;break; //ativa PTB1case (3): PTBD_PTBD2=1;goto inicio;break; //ativa PTB2case (4): PTBD_PTBD3=1;goto inicio;break; //ativa PTB3case (5): PTBD_PTBD4=1;goto inicio;break; //ativa PTB4case (6): PTBD_PTBD5=1;goto inicio;break; //ativa PTB5case (7): PTBD_PTBD6=1;goto inicio;break; //ativa PTB6case (8): PTBD_PTBD7=1;goto inicio;break; //ativa PTB7default: PTBD=0;goto inicio; //desativa PTB

}}

CONCEITO DO PROGRAMANeste programa a combinação de chaveamento em PTA será convertido em umnúmero decimal e carregada em uma variável (S). Esta variável será analisada pelocomando SWITCH e logo em seguida comparada com um dos CASE possíveis.Caso ocorra a igualdade o determinado comando irá funcionar.

PROGRAMA PARA HCS908QG

Page 106: HC-HCS-08

for (inicialização;condição;incremento) comando;

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 comparadacom 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á emseu laço e com o devido COMANDO funcionando.

COMANDOS REPETIÇÃO – FOR

COMANDO

INCREMENTO

INICIALIZAÇÃO = CONDIÇÃOS

N?

Page 107: HC-HCS-08

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

COMANDOS REPETIÇÃO – FOR

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */int S,T;void main (void){SOPT1=0; //Desliga o COPPTADD=0; //Configura todos os bits da PTA como entradaPTBDD=255; //Configura todos os bits da PTB como saídainicio:S=T=PTAD*10000; //Transfere PTA para as variáveis S,T e multiplica por 10000for(0;S;S--) PTBD=255; //Porta PTB ativadafor(0;T;T--) PTBD=0; //Porta PTB desativadagoto inicio;}

PROGRAMA PARA HCS908QG

Page 108: HC-HCS-08

COMANDOS REPETIÇÃO – WHILE

while (condição) {comando 1; comando 2;comando n}

Este comando testa uma condição, caso esta seja verdadeira (1) permite a repetição dos comandoscontidos dentro de sua chave, caso seja falso (0) o comando não funciona e o programa seguenormalmente.

COMANDO

WHILE

1

0

Page 109: HC-HCS-08

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */char S,T;void main (void){SOPT1=0; //Desliga o COPPTADD=0; //Configura todos os bits da PTA como entradaPTBDD=255; //Configura todos os bits da PTB como saída

inicio:

S=PTAD_PTAD0; //Transfere o valor de PTA0 para a variável ST=PTAD_PTAD1; //Transfere o valor de PTA1 para a variável T

while(S) { PTBD=0;} //S=1 desativa PTB permanentementewhile(T) { PTBD=255;} //T=1 ativa PTB permanentemente

goto inicio;}

COMANDOS REPETIÇÃO – WHILE

PROBLEMASó vai mudar de estadoa saída mediante dar RESET no programa.

O comando WHILE só ativa quandoestiver em nível 1 caso contrário este será ignorado e o programa continuarána próxima linha.

PROGRAMA PARA HCS908QG

Page 110: HC-HCS-08

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */char S,T;void main (void){SOPT1=0; //Desliga o COPPTADD=0; //Configura todos os bits da PTA como entradaPTBDD=255; //Configura todos os bits da PTB como saída

inicio:

S=PTAD_PTAD0; //Transfere o valor de PTA0 para a variável ST=PTAD_PTAD1; //Transfere o valor de PTA1 para a variável T

while(S) { PTBD=0;S=PTAD_PTAD0;} //S=1 desativa PTB mediante PTA0 acionadawhile(T) { PTBD=255;T=PTAD_PTAD1;} //T=1 ativa PTB mediante PTA1 acionada

goto inicio;}

COMANDOS REPETIÇÃO – WHILE

Resolvemos o problema da tela anterior colocando S=PTAD_PTAD0 e T=PTAD_PTAD1dentro da rotina WHILE. Quando o estado destasportas mudarem para zero este comando nãoirá mais funcionar, mas quando estiverem emnível um a primeira que for reconhecida pelo WHILE ficará contida no laço.

PROGRAMA PARA HCS908QG

Page 111: HC-HCS-08

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */char S,T;void main (void){SOPT1=0; //Desliga o COPPTADD=0; //Configura todos os bits da PTA como entradaPTBDD=255; //Configura todos os bits da PTB como saída

inicio:

S=PTAD_PTAD0; //Transfere o valor de PTA0 para a variável ST=PTAD_PTAD1; //Transfere o valor de PTA1 para a variável T

while(S) { PTBD=0;break;} //S=1 desativa PTB mediante PTA0 acionadawhile(T) { PTBD=255;break} //T=1 ativa PTB mediante PTA1 acionadagoto inicio;}

COMANDOS REPETIÇÃO – WHILE

O comando BREAK faz liberardo comando WHILE

Este programafaz a mesmafunção do anterior

PROGRAMA PARA HCS908QG

Page 112: HC-HCS-08

do {comando 1; comando 2;comando n} while (condição)

COMANDOS REPETIÇÃO – DO WHILE

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

WHILE

1

0

Page 113: HC-HCS-08

COMANDOS REPETIÇÃO – DO WHILE

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */

void main (void){SOPT1=0; //Desliga o COPPTADD=0; //Configura todos os bits da PTA como entradaPTBDD=255; //Configura todos os bits da PTB como saída

inicio:

if(!PTAD_PTAD0) {PTBD=0;goto inicio;} //PTA0=0 limpa a porta PTB

do { PTBD=170;} //PTA0=1 ativa a porta PTBwhile (PTAD_PTAD0);

goto inicio;}

ATENÇÃO foi usadoLógica não ( ! ) antesdo PTAD_PTAD0 paraInverter o funcionamentodo comando IF

Enquanto PTA0 estiver em nível baixo o programaestará limpando a porta pelo IF, mas quando PTA0estiver em nível alto, PTB estará ativado pelo comandoDO WHILE

PROGRAMA PARA HCS908QG

Page 114: HC-HCS-08

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */

char s,t;void MCU_init(void); /* Device initialization function declaration */void main(void) {

for(;;) {

t=2;s=2*t;

asm {sta $80

}

__RESET_WATCHDOG(); /* feeds the dog */}

}

C e ASM

O Code Warrior pode fazer programas onde temos as duas linguagens, C e Assembler. Para isto devemos colocar a palavra reservada asm. Esta tecnologia é chamada de HLI (High Level Inline).

O programa abaixo executa uma equação de multiplicação e guarda o resultado na variável S, como os calculossão feitos no acumulador, com um comando asm podemos salvar o seu conteúdo na memória 0x80.

IMPORTANTE: Caso escrevermos o código assembler asm { sta $80 } linearmente sem respeitar as linhas puladaso Code Warrior considera errado, portanto devemos respeitar a estrutura do exemplo.

FOR INFINITO é um processoonde as linhas do programaficam em loop infinito quandousamos a estrutura abaixo.FOR (; ;) { }O programa ao lado encontra-sedesta maneira com explicado

PROGRAMA PARA HCS908QG

Page 115: HC-HCS-08

DEFINE

Para deixar o programa mais inteligível, podemos com o comando DEFINE, alterar o nome de alguns dadosdeixando assim o programa mais amigável.

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */

#define CHAVE PTA_PTA0#define LED PTB_PTB0#define ENTRADA DDRA_DDRA0#define SAIDA DDRB_DDRB0

void main(void) {

ENTRADA=0;SAIDA=1;

for(;;) {

if(CHAVE) LED=1; //LIGA O LEDelse LED=0; //DESLIGA O LED

__RESET_WATCHDOG(); /* feeds the dog */}

}

Neste programa trocamos a portaPTA0 que é conhecida como PTA_PTA0 paraser chamada de CHAVE, logo a porta PTB0que é conhecida como PTB_PTB0 seráchamada de LED.Para a configuração da porta, chamaremosDDRA_DDRA0 como ENTRADA e DDRB_DDRB0 como SAIDADesta maneira o programa principal ficarámais fácil de entender

PROGRAMA PARA HC908QY4

Page 116: HC-HCS-08

FUNÇÕES

Quando necessitamos de um determinado sub programa, ou uma rotina especifica no programa principal, nósusamos funções na linguagem C. Em comparação com assembler, esta pode ser chamada de SUB ROTINA.

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */

#define CHAVE PTA_PTA0#define LED PTB_PTB0

void configuracao ()

{DDRA_DDRA0=0;DDRB_DDRB0=1;

}

void main(void) {

configuracao ();

for(;;) {

if(CHAVE) LED=1; //LIGA O LEDelse LED=0; //DESLIGA O LED

__RESET_WATCHDOG(); /* feeds the dog */}

}

Quando simulamos o programa, estesempre começa pelo void main (void),mas quando ele vê a função configuracao ()logo o programa dá um salto paravoid configuracao () e a executa, e quandotermina, este continua na linha que parou

do programa principal

PROGRAMA PARA HC908QY4

Page 117: HC-HCS-08

TEMPORIZAÇÃO – POR SOFTWARE

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */

#define LED PTB_PTB0#define CHAVE PTA_PTA0

unsigned int a;

void main(void) {

CONFIG1_COPD=1; DDRA_DDRA0=0;DDRB_DDRB0=1;

for (;;) { while (CHAVE) { for (a=60000;a>0;a--)LED=1;for (a=60000;a>0;a--)LED=0;}}}

PROGRAMA PARA HC908QY4

Page 118: HC-HCS-08

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */

#define LED PTB_PTB0#define CHAVE PTA_PTA0

void temporizar () { delay:

if(!TSC_TOF) goto delay;}

void interrupt 6 transbordo_do_timer (){ TSC_TOF=0;

TSC_TRST=1;}

void main(void) {

EnableInterrupts; CONFIG1_COPD=1; DDRA_DDRA0=0;DDRB_DDRB0=1;

TMODH=0x18;TMODL=0x69; TSC=0x46;

for(;;){ while(CHAVE) { LED=1;temporizar();LED=0;temporizar();}}}

TEMPORIZAÇÃO – POR HARDWARE

PROGRAMA PARA HC908QY4

Page 119: HC-HCS-08

INTERRUPÇÃO POR TECLADO - HARDWARE

PTA51

PTA42

VDD+53

VSS/GND4

PTB75

PTB66

PTB57

PTB48

PTA0 16

PTA1 15

PTA2 14

PTA3 13

PTB0 12

PTB1 11

PTB2 10

PTB3 9

HCS1

HCS908QG8

R11k

SW1

SW-SPST

+5V

+5V

R2150

D1LED

Page 120: HC-HCS-08

INTERRUPÇÃO POR TECLADO

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */

#define LED PTBD_PTBD7#define CHAVE PTAD_PTAD1

void interrupt 18 teclado(void)

{ KBISC_KBACK=1; //Apaga o flag KBF liberando da interrupçãoLED=1; // PROGRAMA NA INTERRUPÇÃO - Ligar o LED }

void main(void) {

EnableInterrupts;

SOPT1=0; // Watch dog desligadoPTADD_PTADD0=0; //PTA0 configurado como entradaPTBDD_PTBDD7=1; //PTA7 configurado como saidaKBISC_KBIE=1; //Interrupção de teclado habilitadaKBISC_KBIMOD=1; //Ativa o flag KBF mediante a transição de estado ou um nivel lógicoKBIPE_KBIPE0=1; //Ativa o pino PTA0 como entrada de interrupção

for(;;) { LED=0;} // PROGRAMA PRINCIPAL – Apagar o LED }

PROGRAMA PARA HCS908QG

Page 121: HC-HCS-08

TRANSMISSÃO SERIAL - HARDWARE

PTA51

PTA42

VDD+53

VSS/GND4

PTB75

PTB66

PTB57

PTB48

PTA0 16

PTA1 15

PTA2 14

PTA3 13

PTB0 12

PTB1 11

PTB2 10

PTB3 9

HCS1

HCS908QG8

PTA51

PTA42

VDD+53

VSS/GND4

PTB75

PTB66

PTB57

PTB48

PTA0 16

PTA1 15

PTA2 14

PTA3 13

PTB0 12

PTB1 11

PTB2 10

PTB3 9

HCS2

HCS908QG8

+5V +5V

R11k

+5V

R2150

R3150

D1LED

D2LED

CONEXÃO SERIAL

Page 122: HC-HCS-08

TRANSMISSÃO SERIAL - TX

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */#define CHAVE PTBD_PTBD4

void interrupt 15 TX(void) { SCIS1_TDRE=0; //Desabilita a interrupção do TX da SCI }

void main (void) { EnableInterrupts;

SOPT1=0; // Watch dog desligadoPTBDD_PTBDD4=0; //pino configurado como entradaSCIBD=26; //velocidade de 9600 - Velocidade(bps)=(BUSCLK)/(BR*16) - padrão sem cristal => BUSCLK=4MHzSCIC2_TIE=0; //desabilitado a interrupção de transmissão de caracteresSCIC2_TE=1; //habilita o bit TE - faz o transmissor funcionar

for (;;){ while(SCIS1_TDRE) //verificar buffer de transmissão se esta livreif (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.} }

PROGRAMA PARA HCS908QG

Page 123: HC-HCS-08

TRANSMISSÃO SERIAL - RX

#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */

#define LED1 PTBD_PTBD2#define LED2 PTBD_PTBD3

unsigned char S,T;

void interrupt 15 RX(void){

SCIS1_RDRF=0; //Desabilita a interrupção do RX da SCIwhile(!SCIS1_RDRF); //aguarda o buffer ficar vazioT=SCIS1; //leitura do registrador para apagar todos os indicadores existentesS=SCID; //leitura do conteúdo do SCID para complementar o apagamento e retirada do dado recebidoif (S==5) //caso o valor da recepção seja o desejado ele altera a condição dos leds

{ LED1=1;LED2=0; }

else{ LED1=0;

LED2=1; } }

void main (void) { EnableInterrupts;

SOPT1=0; // Watch dog desligadoPTBDD_PTBDD2=1; //pino PTB2 configurado como saídaPTBDD_PTBDD3=1; //pino PTB3 configurado como saídaSCIBD=26; //velocidade de 9600 - Velocidade(bps)=(BUSCLK)/(BR*16) - padrão sem cristal => BUSCLK=4MHzSCIC2_RIE=1; //habilitação da interrupção de recepção de caracteresSCIC2_RE=1; //habilita o bit RE - faz o receptor funcionarfor(;;){ } }

PROGRAMA PARA HCS908QG

Page 124: HC-HCS-08

ATIVIDADES

1. Em linguagem assembler crie um programa que execute:a) Carregar o acumulador diretamente com o valor 04Hb) Armazenar o valor do acumulador na RAM ($0080)c) Carregar o registrador X com o valor 02Hd) Armazenar o valor do registrador X na RAM ($0081)e) Armazenar o número 03H na RAM ($0088)f) Fazer um SHIFT RIGHT no acumulador, registrador e nas posições de memória ($0080 e $0081)g) Fazer um SHIFT LEFT no acumulador, registrador e nas posições de memória ($0080 e $0081)h) Somar imediatamente 02H no acumulador e subtrair com o valor contido em($0088)i) Limpar acumulador e registrador X.j) Transferir o valor de RAM ($0080) para o acumulador k) Transferir o valor de RAM ($0081) para o registrador X

2. Dada a equação implemente no HC908QY4 via software em:a. Linguagem assembler.b. Linguagem C

)35(

))68()35((2)(

−−+⋅=xf

Page 125: HC-HCS-08

ATIVIDADES

3. Dada a equação desenvolva um programa que use as variáveis globais:

dc

bar

+

⋅=

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 $80b) int – usar endereço $81c) long – usar endereço $83d) double – usar endereço $88

Ao termino observe o espaço que ocupam estas variáveis dentro da área de memória

6. Dada a equação abaixo monte um programa em C na seguinte ordem:a) As variáveis a, b, c e d devem conter números inteirosb) As variáveis devem estar relacionadas nos seguintes endereços; a em $80, b em $82, c em $84 e d em $86.c) O resultado da equação deve estar salvo na memória $86

2c

bad

+=

Page 126: HC-HCS-08

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 = +5VNí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.

Estes pinos devem trabalhar da seguinte forma:

PTB2 = Ligado indica nível 0PTB3 = Ligado indica nível 1Desenvolva três firmwares (em versão ASM e C) distintos onde promovam as lógicas AND, OR e EXOR gravem no HC908 e comprovem o seu funcionamento.

Page 127: HC-HCS-08

ATIVIDADES

PTA51

PTA42

VDD+53

VSS/GND4

PTB75

PTB66

PTB57

PTB48

PTA0 16

PTA1 15

PTA2 14

PTA3 13

PTB0 12

PTB1 11

PTB2 10

PTB3 9

HCS1

HCS908QG8

R11k

SW1

SW-SPST

+5V

+5V

R2150

D1LED

SW2

SW-SPST

R31k

R4150

D2LED

12. Dado o circuito abaixo, os seguintes programas que respeitem a tabela abaixo

Os dois leds ficarão permanentemente acessos sem piscar11

Piscando as duas portas alternadamente em intervalo de 1 segundo01

Piscando as duas portas ao mesmo tempo em intervalo de 0,5 segundo10

Piscando as duas portas ao mesmo tempo em intervalo de 1 segundo00

LED1 / LED2SW2SW1

a) O primeiro programa deve ser feito somente por software.b) O segundo programa deve ser feito usando o timer interno do HCS908QG8

Page 128: HC-HCS-08

PTA51

PTA42

VDD+53

VSS/GND4

PTB75

PTB66

PTB57

PTB48

PTA0 16

PTA1 15

PTA2 14

PTA3 13

PTB0 12

PTB1 11

PTB2 10

PTB3 9

HCS1

HCS908QG8

R81k

SW1

SW-SPST

+5V

+5V

SW2

SW-SPST

R91k

A7

QA

13B

1Q

B12

C2

QC

11D

6Q

D10

BI/R

BO

4Q

E9

RB

I5

QF

15LT

3Q

G14

U17448

R1

150R2

150R3

150R4

150R5

150R6

150R7

150

ATIVIDADES

13. Dado o circuito abaixo faça um programa que respeite a tabela abaixo

Zero piscando11

Contador Decrescente01

Contador Crescente10

Zero no display00

DISPLAYSW2SW1

Recomenda-se em caso de dúvidaconsultar o data sheet do 7448