MC404 - 2º Semestre 2009
Atualizado em: 17/Dez/09
Profs. Célio Guimarães, Paulo Centoducatte e Nelson Machado IC1 - salas 40 e 11
(horário de atendimento (Célio e Machado): 2ª a 5ª F. das 11:30 - 12:30 e 14:00 às 16hs)
PED: Luís Alfredo Harriss Maranesi; atendimento: 5ªF 13-14hs IC3 – luis.maranesi@gmail.com
Critérios de avaliação e programa da disciplina.
Exame: 22 Dez 16-18hs PB07
Planilhas com notas parciais no diretório raiz da disciplina
Notas de provas recorrigidas no diretório raiz da disciplina
Arquitetura/Programação do microcontrolador AVR (Atmel)
Diagrama de blocos de uma CPU simples.
Notas de aula de um curso (Inglaterra): descreve a
arquitetura da CPU simples acima.
Um resumo dos modos de endereçamento do AVR.
Um tutorial simples e detalhado sobre o
arquitetura, instruções e assembler do AVR.
Veja também este tutorial (em pdf)
Introdução ao ambiente
AVR studioexemplos
(Windows) de programação assembler + depurador da familia AVR.
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.
Executável para instalação da última versão: AvrStudio416Setup.exe
e o Service Pack correspondente SP1 571.
Livre, também pode ser baixada diretamente do site da Atmel
O compilador gcc para Windows (WinAVR) pode ser instalado a partir de
WinAVR-20090313-install ou da:
winavr.sourceforge.net
Como escrever programas estruturados em assembler!
Diretório com exemplos vistos em aula.
Diretório com mais exemplos vistos em aula.
Diretório com manuais e documentação do AVR.
Um bom tutorial com exemplos
sobre o assembler do AVR: instruções, diretivas, etc
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.
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 E/S com leds: acende e apaga ciclicamente 8 leds
Exemplos de rotinas de interrupção: gravação de byte 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ção 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.
Manual de referência em pdf da avr-libc
(versão 1.4.6; a versão atual,
1.6.5
pode também ser obtida em html ou em pdf diretamente no site da
avr-libc). As rotinas de leitura de dados
da memória de programa, delay por software e de interrupção, nos exemplos
dados em aula, foram reiradas do mesmo.
Atividades de Laboratório
As atividades opcionais a seguir não entram no cômputo da nota final mas são altamente recomendadas
de serem programadas e exibidas(*) nas aulas de laboratório; os conceitos nelas contidos
farão parte das provas de avaliação.
Turmas C e D: novo prazo para entrega das atividades opcionais (individuais) 1-5, 6-8 (*) 29 outubro 09
- Trabalhando com números inteiros com e sem sinal lab01.pdf
- Trabalhando com vetores: geração e armazenamento da sequencia de Fibonacci (com 16 bits)
lab02.html
- "Auto-retrato": um programa que transforma suas próprias instruções
de binário para ASCII lab03.html.
- Trabalhano com multiplicação: produto escalar de 2 vetores de 8 bits
- 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.
- Escreva um trecho de programa contendo apenas uma instrução lógica e saltos
condicinais apropriados, para verificar se um inteiro com sinal em um registrador
é positivo, negativo, par ou ímpar. Desenhe os arcos onde há saltos e verifique se o
número de cruzamentos de arcos é mínimo.
- 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.
- Escreva uma subrotina que toma como parâmetros em X um inteiro sem sinal de 16 bits
e em Y um endereço na memória RAM a partir do qual você deve armazenar a representação
em ASCII do valor decimal de X, ou seja a subrotina faz a conversão de binario
para decimal ASCII.
Sugestão: se você armazenar as constantes 10000, 1000, 100 e 10 na memória
de programa (use a diretiva .dw para isso) poderá fazer a conversão
com uma subrotina contendo apenas 21 instruções! Ela seria util em aplicações onde você queira, por exemplo,
visualizar em decimal num display LCD valores binários de 16 bits.
- Desafio: este exercício explora a sobreposição de espaços de endereçamento do AVR:
escreva duas rotinas, savgpr e rstgpr para,respectivamente, salvar na
pilha e restaurar da pilha o valor de todos os 32 registradores de uso geral.
Cada rotina deve ter um comprimento de até 20 instrucoes , e pode usar até 35 posições na pilha.
A rotina savgpr pode destruir quaisquer registradores, depois de salvá-los, obviamente,
e pode deixar o que quiser na pilha, em qualquer ordem, respeitado o limite acima.
A rotina rstgpr deve desfazer completamente o que foi feito por savgpr, restaurando
todos os 32 registradores para seus valores imediatamente antes da chamada de savgpr;
a pilha deve também ser deixada exatamente como estava imediatamente antes da chamada
de savgpr.
- Escreva inteiramente em C a solução do exercício 7 acima. Prazo de entrega: 19 Nov.
- Escreva uma função bin2decascii() em C para implementar a mesma solução do exercício 8, acima:
a sua função toma como parametros: (i) um inteiro de 16 bits sem sinal e
(ii) um apontador para uma cadeia de 5 caracteres na memória RAM.
O objetivo é implementar a conversão do valor binário de 16 bits (1º parâmetro)
para decimal ASCII, armazenando o valor convertido na memória apontada pelo segundo parâmetro.
Você deve usar a mesma técnica de divisão por subtrações sucessivas do exercício 8.
Prazo de entrega: 19 Nov.
- Escreva um programa em C que lê uma cadeia de caracteres da memória de programa
para a RAM e grava a cadeia na Eeprom. Utilize para isto as
funções de alto nível da avr-libc para acessar a Eeprom.Prazo de entrega: 03 Dez.
- Escreva um programa modular em C para contar o número de bits 1 em um
vetor de bytes localizado na memória de programa, onde o tamanho do vetor está
nos primeiros dois bytes do vetor no formato little endian. Teste o seu programa
com um vetor contendo mais de 256 bytes. Prazo de entrega: 03 Dez.
Atividades obrigatórias:
- Escrevendo uma biblioteca de
funções para manipular um vetor de bits.
Prazo de entrega: 22 Out 09.
- Implementação de um cronômetro/relógio de parede
via interrupções. Prazo de entrega: 12 Nov 09.
- Implementação em C de um cronômetro/relógio de parede
via interrupções. Prazo de entrega: 03 Dez 09.
Atividade desafio (opcional, individual):
o quebra-cabeça dos 12 pentaminós
Condições para fazer o desafio após a realização da 1ª prova 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