STE29008-2019-1
Revisão de 15h27min de 10 de abril de 2019 por Roberto.matos (discussão | contribs) (→10/04/2019 – Classe GPIO (cont.))
Sistemas Embarcados
- Professor: Roberto de Matos
- Encontros: quartas às 13:30h e sextas às 15:40h no Laboratório CAD 1.
13/02/2019 – Apresentação
- Apresentação do professor.
- Apresentação da disciplina.
- 2017 Embedded Markets Study
15/02/2019 – Introdução
- Notas de Aula:
20/02/2019 – Experimento GPIO
- Experimentos:
22/02/2019 – Experimento UART
27/02/2019 – ADC
- Finalizar o UART mestre escravo
- Consulta:
- Experimentos:
01/03/2019 – Interrupções
- Desafio:
- Usando Round Robin sem interrupções implementar um sistema com um LED e um botão. O sistema deve piscar o LED a cada 2 segundos e ao botão ser pressionado envia uma mensagem pela serial.
- Notas de Aula:
- Experimentos:
- Referências:
08/03/2019 – Usando C++
Mudança de nível de abstração
- Arduino Mega --> ATmega2560 (Ex.: I/O Ports)
- Esquemático Arduino Mega
- Esquemático Arduino Mega - CLONE
Fonte: https://www.arduino.cc/en/Hacking/PinMapping2560
ATmega2560: I/O Ports
- Tabela verdade de configuração das portas:
- Endereços registradores de I/O:
GCC, avr-libc
Fluxo Ferramentas:
AVR-LIBC:
Desenvolvimento:
- É obrigatório a instalação das ferramentas (Toolchain e o AVR-Libc).
- O aluno pode escolher usar o Eclipse ou montar seu próprio Makefile.
- Ferramentas Necessárias:
- Instalação do Eclipse:
- Eclipse IDE Neon.2 para Linux 64-bits (última atualização em 24/02/2017) - Mantido pelo Prof. Arliones.
- OU
- Instalação do Eclipse para C/C++ e Plugin dentro do Eclipse
- E
- Iniciando um projeto no Eclipse usando o AVR Plugin
- Makefile:
Prática
- Implemente um programa usando GCC e avr-libc para ligar um led quando um botão for pressionado (exemplo)
- Operação de Bits em C/C++
- Operações Booleanas em C/C++
- Programming 101 - By Eric Weddington
13/03/2019 – Não Houve Aula
15/03/2019 – Usando C++ (cont.)
Atividade - A1
Re-implementar as seguintes atividades usando C++ e AVR-Libc:
- Lab 01: GPIO - Hello LED
- Lab 02: UART - Serial Communication
- Lab 04: UART - ADC e Sensor Reading
- Lab 06: GPIO and External Interrupts - part 1
- Lab 07: GPIO and External Interrupts - part 2
Entregar:
- Código fonte
- Relatório apresentando principais registradores utilizados para cada atividade.
- Usar as dicas em: Atmel AVR4027: Tips and Tricks to Optimize Your C Code for 8-bit AVR Microcontrollers
Deadline: 31/03/2019
20/03/2019 – Auxílio Atividade (Serial)
- Análise dos registradores de controle
- Funcionamento bloqueante da Serial
22/03/2019 – Auxílio Atividade (ADC)
- Análise dos registradores de controle
- Resumo
- <stdlib.h>: General utilities
27/03/2019 – Auxílio Atividade (Interrupção)
- Revisão das funções lógicas em C/C++
- Definição das funções de interrupção
- <avr/interrupt.h>: Interrupts
- Análise comunicação serial 9600bps 8N1:
- Tempo por bit = 1/9600 = ~104us
- Tempo por byte (8N1) = 104us x 10 = 1,04ms
- Período do clock de 16MHz = 1/16M = 62,5ns
- Considerando uma instrução por ciclo de clock, temos: 16.666 instruções que podem ser executadas durante a recepção de 1 byte pela serial (9600 8N1).
03/04/2019 – Classe GPIO
- Projeto GPIO
- Mapeamento de Pinos Arduino Mega
#include <avr/io.h>
#include <util/delay.h>
#include "GPIO.h"
//LEDS PLACA (acende com '0')
GPIO led0(0, GPIO::OUTPUT); //PE0
GPIO led1(1, GPIO::OUTPUT); //PE1
//LEDS PLACA (acende com '1')
GPIO led13(13, GPIO::OUTPUT); //PB7
//Adicionar LED
GPIO led4(4, GPIO::OUTPUT); //PG5
GPIO led6(6, GPIO::OUTPUT); //PH0
int main(void){
UCSR0B = 0;
led0.set(1);
led1.set(1);
led6.clear();
led4.clear();
led13.clear();
_delay_ms(1000);
led0.clear();
led1.clear();
led6.set(1);
led4.set(1);
led13.set(1);
_delay_ms(1000);
while (1){
led0.toggle();
led1.toggle();
led6.toggle();
led4.toggle();
led13.toggle();
_delay_ms(1000);
}
}
05/04/2019 – Classe GPIO (cont.)
- GPIO Port
- Análise GPIO
- avr-objdump -h -S <PROJECT_NAME>.elf > <PROJECT_NAME>.lst
10/04/2019 – Classe GPIO (cont.)
- Classe GPIO_Port
- Análise conceitual das diferentes versões
- Atividade 2:
- Análise prática das versões passadas em sala de aula com tabela contendo o tamanho do seguinte:
- Construtor
- Método set(val)
- Do objeto na memória de dados
- Total do programa
- Total dos dados
- Completar a classe GPIO e GPIO_port para todos os pinos da plataforma Arduino, seguintes IDs:
- Os arrays devem ser forçados para memória flash:
- Entregar Código Fonte e Relatório contendo:
- Análise prática e conceitual das versões
- Discussão da implementação
- Essas perguntas não precisam ser respondidas como questionário e não devem limitar suas análises.
- 1- Por que salvar o _bit como (1 << BIT_PORTA)? É melhor do que usar diretamente (1 << BIT_PORTA)?
- 2- Qual tamanho do clear? Por que ele é maior e mais lento que o set? Como resolver?
- 3- Por que utilizar grandes vetores na memória Flash? O que isso impacta no acesso a constante?
- 4- Comente sobre a versão 1.2 e 1.3. Qual é menor e por quê? Quais as vantagens da v1.3?
- 5- Comente sobre a estratégia usada na implementação v2?
- 6- Qual o tamanho total dos recursos ocupados pelo atributo do objeto "GPIO" nas vesões sugeridas?
- 7- Qual a diferença de expandir as versões passads para todos os pinos do hardware do arduino? Como isso impactaria no "construtor" e no "set"?
- Análise prática das versões passadas em sala de aula com tabela contendo o tamanho do seguinte: