 |
MC 404C - Arquitetura e Programação de microcontroladores -
1o semestre de 2011 |
 |
Profs. Célio Guimarães e Nelson Machado
Atualizado em 10/06/2011
Horário de atendimento: IC1 - sala 47: 2ª a 5ª F. das 11:30 - 12:30 e 18:00 às 19hs
Prazo final para entrega da Atividade 2: 16 Junho
Arquitetura/Programação do microcontrolador AVR (Atmel)
Diagrama de blocos de uma CPU simples.
Veja aqui o
ciclo de execução de uma instrução
usando o diagrama da CPU simples.
O
programa minimal visto em aula: lê
o estado de chaves (0 ou 1) ligadas nas portas B e C, faz a soma dos valores binários lidos
e põe o resultado da soma em leds conectados na porta D.
Veja também a representação binária ("linguagem de máquina) das instruções do programa minimal:
in.ps,
add.ps e
out.ps
extraídas do manual de instruções do AVR.
Um resumo dos modos de endereçamento do AVR
(leia, imprima e traga nos laboratórios).
Diagrama de blocos simplificado do AVR
Um bom tutorial com exemplos
sobre o assembler do AVR: instruções, diretivas, etc. Muito útil nos laboratórios.
Introdução ao ambiente
AVR studio
(Windows) de programação assembler + depurador da familia AVR.
manual do assembler do AVR
: diretivas, expressões, etc.
Introdução à arquitetura do
AVR ATmega 88 (extraido do
datasheet)
(leia pgs 1-17).
É o principal documento deste modelo do AVR.
Instalação das ferramentas de software da Atmel:
o ambiente AVR Studio (para Windows) inclui montador, simulador
com depurador dinâmico, interface para o compilador gcc e exemplos.
O executável para instalação da última versão
e o Service Pack correspondente
podem ser baixados diretamente do site da Atmel
O compilador gcc para Windows (WinAVR) pode ser instalado a partir
da:
winavr.sourceforge.net
Simulador Hapsim do display LCD HD44780U
(funciona como plug-in do AVR Studio). Portal do hapsim
de onde você pode baixar o executável para Windows e exemplos.
Diretório com
manuais e documentação do AVR.
Como escrever programas estruturados em assembler!
Exemplo simples de subrotina
para multiplicar dois valores de 8 bits.
Exemplo de macro para multiplicar
dois valores de 8 bits. Mais eficiente e mais versátil do que a subrotina correspondente
vista acima.
Exemplos de
macros úteis
(extraído do site www.mikrocontroller.net/articles/AVR_Assembler_Makros.
Resumo das diretivas
do assembler do AVR incluindo montagem condicional e operador de deslocamento. Leia e imprima.
Rotinas para leitura e escrita na E2PROM.
Programação de E/S - EEPROM:
datasheet (p. 18-23)
Introdução a interrupções e E/S no AVR.
Vetores de interrupção do ATmega88
datasheet (p. 56)
Exemplo de interrupção de fim de escrita na E2PROM.
Exemplo de E/S com leds: acende e apaga ciclicamente 8 leds
Exemplos de rotinas de interrupção: grava bytes na
e2prom,
temporizador TIMER0, e interrupção
INT0.
Introdução ao Hapsim
Rotinas para configurar e escrever no LCD via Hapsim
e arquivo correspondente de configuração do Hapsim
Exemplo de E/S digital com
botões que acendem leds;
teste com Hapsim usando o arquivo de configuração
simplebut2led.xml
Dicas para programaçao em C no AVR-gcc
(imprima-o e estude-o).
FAQ
do manual da biblioteca avr-libc do gcc para o AVR; contém muitas "dicas" para programação em C.
Exemplos em C
que utilizam a biblioteca avr-libc.
Rotinas (lcdkeypad.*) para programar o keypad e o lcd usando Hapsim em assembler
e com avr-gcc. Deverão ser usadas na atividade 2 de laboratório.
Atividades de Laboratório
Atividades Conceituais
As atividades mais simples e conceituais a seguir entram no cômputo da nota final e devem
ser programadas e exibidas nas aulas de laboratório (*).
- Resolva os exercícios no documento
ciclo de execução de uma instrução.
- Trabalhando com números inteiros com e sem sinal
lab01.pdf.
- Trabalhando com vetores:
- gere a sequencia de Fibonacci com precisão de 16 bits, armazenando-a na memória RAM
no formato little endian (low,high)
- gere a sequencia de Fibonacci (16 bits) de trás para frente, isto é, começando com os valores
b520 e 6ff1 e terminando com o valor 0 (você deve usar a instrução de subtração sbc)
- modifique o loop2 do exemplo visto em aula, fillmem.asm
de forma a inverter o vetor colocado na memória. Importante: seu programa deve funcionar tanto para um
número par quanto para um número ímpar de elementos no vetor.
Considere inicialmente que o vetor tem menos de 256 bytes.
- que modificações você faria se o vetor tiver mais de 256 bytes, ou começar em qualquer endereço da RAM?
- Trabalhando com macros - aritmética de 16 bits:
o documento avr202.asm,
extraído de manuais da ATMEL, exemplifica operações aritméticas de 16 bits
para efetuar soma e subtração de pares
de registradores, soma/subtração de uma constante de 16 bits a/de um par de registradores,
comparação, negação, etc.
O exemplo é limitado no sentido de que pares específicos são usados assim como constantes
específicas. O objetivo deste exercício é transformar as operações citadas em macros
de forma que quaisquer pares de registradores e constantes de 16 bits possam ser
usados como operandos dessas operações.
Utilize a macro apropriada para ser usada no item iv do problema anterior
- Escreva um trecho de programa contendo apenas uma instrução lógica ou do tipo bit and bit-test e saltos
condicionais apropriados, para verificar se um inteiro com sinal em um registrador
é positivo, negativo, par ou impar. Desenhe os arcos onde há saltos e verifique se o
número de cruzamentos de arcos é mínimo.
- Trabalhano com multiplicação:
produto escalar de 2 vetores de 8 bits
- Modifique o exemplo de
botões que acendem leds
de forma que os botões funcionem como "toggles" ou seja, o led não deve apagar quando
o botão é liberado, somente quando for pressionado novamente.
Dica: guarde o estado do botão e da sua ação.
Prazos de entrega dos exercícios 2 a 6: 28 de Abril; exercício 7: 12 de Maio
Os exercícios a seguir são o cerne da
atividade de laboratório 2
- Escreva e teste uma subrotina div16 que toma como parâmetros de entrada dois inteiros sem sinal de 16 bits nos
registradores r16,r17 (low,high) e r18,r19(low,high) e faz a divisão (por subtrações sucessivas)
do primeiro parâmetro (dividendo) pelo segundo parâmetro (divisor), deixando o quociente no registrador X
e o resto no primeiro parâmetro (Você deve tratar o caso excepcional de divisão por 0). Sugestão: use os trechos de código cp16 e sub16 do documento
operações de 16 bits do AVR Studio
- Transforme a subrotina acima numa macro com 5 parâmetos correspondendo aos inteiros de 16 bits
(@0,@1) e (@2,@3) e sendo @4 um dos pares de registadores X, Y ou Z
Prazo de entrega, exs 8 e 9: 19 de Maio
Os itens 10 e 11 a seguir ficam substituídos pelo programa P2
do documento " Dicas para a Atividade 2" - Entrega: 2 de Junho
- Considere dois vetores com 4 bytes cada, op1 e op2, localizados na memória RAM (veja como definir vetores na
memória RAM a seguir), contendo até 3 dígitos decimais (ou seja valores binários de 0 a 9) e que representam um
número inteiro decimal com até 3 dígitos, delimitado pelo valor $ff. Exemplo de valores possíveis num vetor (em hexadecimal):
00,00,01,ff e 01,02,09,ff. Você deve gerar o valor binário correspondente a cada número decimal armazenando-os
em dois vetores na memória RAM, bop1 e bop2 no formato little endian, (low, high)
Exemplo para definir os vetores na memória RAM (ou seja,reservar espaço):
.dseg
op1: .byte 4 ; reserva 4 bytes não inicilizados na RAM
op2: .byte 4
bop1: .byte 2
bop2: .byte 2
.cseg
Exemplo:
Para carregar o endereço de op1 no par X, por exemplo, use as instruções:
ldi xl, low(op1)
ldi xh, high(op1)
Suponha agora que os vetores tenham os seguintes valores (135 e 87 em decimal):
01,03,05,ff
08,07,ff,ff
Então bop1 e bop2 terão os valores binários a seguir (no formato little endian e em hexadecimal)):
87,00
57,00
- Escreva uma subrotina mult16 que multiplica os valores binários obtidos no exercício anterior
(use a instrução mul do AtMega 88) e transforme o produto binário num vetor contendo o número decimal
equivalente(portanto, com até 5 dígitos) no mesmo formato dos vetores do exercício anterior.
Com os dados do exercício anterior esse vetor teria os valores:
0101070405 (ou seja,na base 10, 11745= 135*87
Prazo de entrega, exs 10 e 11: 26 de Maio
Atividades de maior escôpo:
Deverão ser cuidadosamente demonstradas junto com uma impressão do código .lst conforme requerido na nota de rodapé (*).
Atividade 1: Implementação de um relógio de parede através
de interrupções do timer0. Prazos de entega: parte 1: 5 Maio partes 2 e 3: 12 Maio
Atividade 2: Implementação de uma
calculadora simples
via Teclado 4 x 4 e LCD do Hapsim. Utilize o programa em assembler para o keypad e lcd visto em aula!.
Prazo de entrega: 9 de Junho
Atividade 3: Implementação de uma
calculadora simples
em C via Teclado 4 x 4 e LCD do Hapsim. Utilize o programa em C para o keypad e lcd visto em aula!.
Prazo de entrega: 21 de Junho
Atividade desafio (opcional, individual):
o quebra-cabeça dos 12 pentaminós
Condições para fazer o desafio serão negociadas caso a caso.
(*)Toda submissão de uma atividade de laboratório deverá
ser feita no laboratório, acompanhada da impressão do arquivo .lst gerado pelo montador
e no formato paisagem, a fim de não truncar os comentários de linha.
Para gerar o arquivo .lst, após abrir o projeto, selecione: Project → Assembler Options e
na janela aberta selecione a caixa Create List File.
A qualidade e apresentação do programa serão levadas em conta na nota da atividade
(veja sugestões no documento sobre
programação estruturada em assembler