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 (*).
  1. Resolva os exercícios no documento ciclo de execução de uma instrução.
  2. Trabalhando com números inteiros com e sem sinal lab01.pdf.
  3. 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?
  4. 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

  5. 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.
  6. Trabalhano com multiplicação: produto escalar de 2 vetores de 8 bits

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

  9. 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
  10. 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
  11. 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

  12. 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
    
  13. 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
  14. 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