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

Grupos de Laboratório

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
  1. Trabalhando com números inteiros com e sem sinal lab01.pdf
  2. Trabalhando com vetores: geração e armazenamento da sequencia de Fibonacci (com 16 bits) lab02.html
  3. "Auto-retrato": um programa que transforma suas próprias instruções de binário para ASCII lab03.html.
  4. Trabalhano com multiplicação: produto escalar de 2 vetores de 8 bits
  5. 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.
  6. 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.
  7. 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.
  8. 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.
  9. 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.

  10. Escreva inteiramente em C a solução do exercício 7 acima. Prazo de entrega: 19 Nov.
  11. 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.
  12. 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.
  13. 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:

  1. Escrevendo uma biblioteca de funções para manipular um vetor de bits. Prazo de entrega: 22 Out 09.
  2. Implementação de um cronômetro/relógio de parede via interrupções. Prazo de entrega: 12 Nov 09.
  3. 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