hc-hcs-08
TRANSCRIPT
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
MICROCONTROLADORES
Everywhere!
MICROCONTROLADORES – ENCAPSULAMENTOS
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
MICROCONTROLADORES – ENCAPSULAMENTOS / ELÉTRICA
MICROCONTROLADORES – OSCILADOR INTERNO
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.
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
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
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
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
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
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
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
MICROCONTROLADORES – CODE WARRIOREsta tela é o local onde podemos fazer a simulação e ver os resultados obtidos do desempenho do programa
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
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)
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
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
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
MICROCONTROLADORES – CODE WARRIOR
Esta é a tela do simulador com o programa ainda não simulado. Para simular use os icones Step e Reset
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
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
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
MICROCONTROLADORES – AREA DE MEMÓRIA
Mapa de memóriaHC908QY4/QT4
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
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
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
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
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>
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
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
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
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
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
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
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
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
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
MICROCONTROLADORES – PORTAS
Para podermos programar um microcontrolador, devemos conhecer todo o HARDWARE.
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
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
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
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)
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.
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
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
MICROCONTROLADORES – SIMULAÇÃO VISUALIZATION TOOLS
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 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
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
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
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
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
MICROCONTROLADORES – 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
Na figura abaixo temos todo o processo de configuração do PTA como entrada.Ela mostra a configuração de DDRA, PTAPUE e PTA
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
MICROCONTROLADORES – PROCESSADOR EXPERT
Uma vez configurado, podemos acionar o GENERATE CODE
MICROCONTROLADORES – PROCESSADOR EXPERT
ESTE CÓDIGO FOI CRIADO
AUTOMATICAMENTE PELO
PROCESSADOR EXPERT
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
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
MICROCONTROLADORES – HARDWARE
DISPLAY CATODO COMUM
cde
bafg
MICROCONTROLADORES – KIT DE TESTE – HC908QY4
7448
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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.
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
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
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.
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
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
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
MICROCONTROLADORESLINGUAGEM C
MICROCONTROLADORES – CODE WARRIOR
MICROCONTROLADORES – CODE WARRIOR
MICROCONTROLADORES – CODE WARRIOR
#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
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
#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
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.
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
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
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
#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
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
#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
#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.
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;
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
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
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
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?
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
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
#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
#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
#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
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
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
#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
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
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
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
#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
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
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
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
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
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
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
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
+=
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.
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
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