MC 404EF - Arquitetura e Programação de microcontroladores - 2o semestre de 2012


Profs. Célio Guimarães e Nelson Machado
Atualizado em 26/09/2012

Horário de atendimento: IC1 - sala 47: 2ª a 5ª F. das 11:30 - 12:30 e 18:00 às 19:30hs

Arquitetura/Programação do microcontrolador AVR (Atmel)

Exame: 11 Dez 16hs CB04

Notas e médias finais

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. A úlima versão (AVR Studio 6.0) já vem com o gcc embutido.
A versão 4.16, compatível com a interface gráfica hapsim pode ser baixada a partir desse link. Você deve executar primeiro o programa Setup e em seguida o SP1 (Service Pack). 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.
Como fazer operações aritméticas de 16 bits no AVR.
Uma introdução a macros no AVR .
Exemplo de macro para multiplicar dois valores de 8 bits. Mais eficiente e mais versátil do que a subrotina correspondente vista acima.
Os exemplos vistos de operações aritméticas de 16 bits são limitados no sentido de que registradores específicos são usados nas operações. Seria interessante se quaisquer registradores pudessem ser usados nessas operações. Isto pode ser feito facilmente com macros. Escreva uma macro para cada uma das operações dos exemplos.
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.
Exemplo de E/S digital com botões que acendem leds; teste com Hapsim usando o arquivo de configuração simplebut2led.xml
Introdução ao Hapsim
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 bytes na e2prom, temporizador TIMER0, e interrupção INT0.
Exemplo do uso de sleep idle associado a uma rotina de interrupção do timer 0.
Rotinas para configurar e escrever no LCD via Hapsim e arquivo correspondente de configuração do Hapsim
Rotinas (lcdkeypad.*) para programar o keypad e o lcd usando Hapsim em assembler e com avr-gcc. Deverão ser usadas na atividade 4 de laboratório.
Resumo da arquitetura e comandos do display lcd HD44780U


Dicas para programaçao em C no AVR-gcc (imprima-o e estude-o).
O problema do casamento de impedância: inserindo assembler num programa em C. Imprima estue-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. O diretório inlineasm contem vários exemplos de código assembler inserido em um programa em C.


Atividades de Laboratório

Exercícios Conceituais

Os exercícios a seguir ilustram diferentes aspectos de programação e fazem parte integrante da disciplina. Sua apresentação no laboratório é opcional(*).

  1. Resolva os exercícios no documento ciclo de execução de uma instrução.

  2. Verifique a correção do código binário gerado pelo montador para o programa minimal e que aparece em hexadecimal no lado esquerdo do arquivo .lst (para obrigar o montador a gerar o arquivo .lst você deve entrar em Project -> Assembler Setup e selecionar a caixinha correspondente). Para cada uma das instruções do programa minimal você deve consultar o manual do conjunto de instruções a fim de obter o valor binário (ou seja em linguagem de máquina) de cada instrução.

  3. Trabalhando com números inteiros binários com e sem sinal.

  4. Trabalhando com vetores:

    1. gere a sequencia de Fibonacci com precisão de 16 bits, armazenando-a na memória RAM no formato little endian (low,high)
    2. 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)
    3. 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.
    4. que modificações você faria se o vetor tiver mais de 256 bytes, ou começar em qualquer endereço da RAM?
  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.
    Utilize a macro apropriada para ser usada no item iv do problema anterior

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

  7. Usando exclusivamente as instruções lógicas ou do tipo bit and bit-test do resumo de instruções, e exclusivamente os registradores r0 e r1, escreva trechos de programa para os seguintes problemas:

    1. ligar o bit 0 de r1 se o valor em r0 for negativo (obs: o valor inicial de r1 é indefinido!)
    2. ligar o bit 1 de r1 se o valor em r0 for impar.
    3. num só trecho de programa resolver os dois problemas acima. Desafio: Pode ser feito com apenas 5 instruções!

  8. Escreva duas subrotinas ligabit e desligabit com o objetivo de ligar/desligar o bit b (passado em r1, 0<= b <=7) de r0; os outros bits de r0 não devem ser afetados. Sugestão: use instrução de deslocamento para posicionar o bit a ser ligado.
  9. 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. Importante: quando aceso o led não deve ser repetidamente acionado para acender de novo; idem quando apagado. Desenhe uma onda quadrada para "simular" sucessivas atuações de um dado botão. Dica: guarde o estado do botão e da sua ação.

  10. Implemente a sugestão do relógio de parede para armazenar na RAM um contador ASCII de horas, minutos e segundos (este exercício e o anterior compõem 80% da atividade 2 obrigatória).

  11. No que se segue use os templates lcdkeypad.asm e lcdkeypad.xml
    1. leia uma tecla do keypad apague a 2a linha do lcd, armazene o caracter num buffer e ecoe para o começo da 2a linha do display lcd.
    2. leia sucessivamente teclas do keypad, ecoando para o lcd e armazenando no mesmo buffer
    3. quando a tecla 'E' for pressionada volte ao passo 1 (laço infinito)


Exercícios "desafio": os exercícios nesta página ilustram conceitos importantes de arquitetura e de programação com o AVR. Devem ser feitos individualmente: os alunos que resolverem a maioria dos exercícios terão um bonus razoável na média final.

Atividade desafio (opcional, individual): o quebra-cabeça dos 12 pentaminós
Condições para fazer o desafio serão negociadas caso a caso.


Atividades obrigatórias

Atividade 1: programa do "autoretrato" e produto escalar de vetores
Data de submissão: 10/08/12 Data da apresentação: 30/08/12

Atividade 2: implementação de um cronômetro/relógio de parede
Data de submissão: 06/09/12 Data da apresentação: 04/10/12

Atividade 3: rotinas para compor a atividade 4. Data da apresentação: 18 out

Atividade 4: implementação de uma calculadora de 16 bits. Data da apresentação: 25 out

Atividade 5: implementação de uma calculadora de 16 bits em C: é a mesma calculadora da atividade 4, porém escrita em C e utilizando as rotinas em C de escrita no LCD e entrada via keypad. Devido aos recursos da linguagem C, esta atividade é consideravelmente mais simples do que a anterior.
Data da apresentação: 8 nov


(*)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 Setup 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.
Os nomes dos componentes do grupo devem estar no início do programa.