STE29008-2019-2
Revisão de 23h26min de 15 de setembro de 2019 por Roberto.matos (discussão | contribs) (→10/10/2019 – Classe GPIO (cont.))
Sistemas Embarcados: Diário de Aula 2019-2
- Professor: Roberto de Matos
- Encontros: 2ª e 4ª às 07:30h
- Atendimento Paralelo: 4ª às 10h e 14h (1h cada)
- Plano de Ensino.
- Cronograma de Aulas: Conteúdo Programado no Portal SIGAA
29/07/2019 – Apresentação
- Apresentação do professor.
- Apresentação da disciplina.
- 2017 Embedded Markets Study
31/07/2019 – Introdução
- Notas de Aula:
05/08/2019 – GPIO
- Notas de Aula:
- Experimento:
- Definição das Duplas:
- Daniel e Anderson
- Ameliza e Natalia
- Guilherme e Marcone
- Allex e Douglas
- Fabiano e Filipe Kuhnen
- Felipe Cardoso e Luiza
- Gustavo e Gabriel
07/08/2019 – Experimento UART
12/08/2019 – Projeto 1: Sensor de Temperatura - Arduino
- Notas de Aula:
Atividade
O objetivo deste experimento é apresentar um exemplo básico de programação de sistema embarcado com microcontrolador. Para isto, será desenvolvido um sensor de temperatura com comunicação serial utilizando a plataforma Arduino.
- Material necessário:
- Arduino Uno;
- Termistor NTC 10KOhm;
- Resistor 10KOhm;
- Matriz de contato;
- Computador com IDE do Arduino instalada.
- Para completar o desafio, utilize o site arduino.cc como referência, e construa um sketch (programa na IDE do Arduino) que, a cada 1 segundo, pisque um LED (veja o LED já na placa do Arduino no pino 13), e leia um valor do sensor de temperatura e escreva, em graus celcius, na tela. Um pseudo-código da sua aplicação seria:
loop() {
ligaLED();
AdquireTemperatura(); // lê do ADC e converte para Celcius
desligaLED();
ImprimeResultado(); // pela serial
dorme1segundo();
}
- Para completar esta atividade, você precisará:
- Montar um circuito com divisor de tensão utilizando o NTC e o resistor para aquisição do sinal através de uma porta analógica do Arduino
- Especificar um modelo (equação) para obter o valor da resistência do NTC a partir do valor de tensão lido no canal analógico do Arduino;
- Utilizar o modelo de Steinhart-Hart para obter a temperatura a partir da resistência;
- Calibrar o seu sistema para temperaturas entre 0 e 50 graus celcius (utilize esta calculadora e a tabela de resistência-temperatura do seu NTC abaixo);
- No programa arduino, implemente duas versões do software: uma utilizando apenas "float" e outra utilizando apenas "int 32-bits" (compare as versões).
- Entregue um relatório curto (1 página), comparando os resultados obtidos em termos de:
- Uso de memória de programa (flash - código-fonte);
- Uso de memória de dados (RAM);
- Tempo necessário para o cálculo (conecte o pino do LED a um osciloscópio - o tempo que o LED fica acesso é o tempo que leva para fazer o cálculo).
- Observações:
- O trabalho deve ser executado em dupla.
- Entrega até 18/08 via Sigaa
14/08/2019 – Projeto 1: Sensor de Temperatura - Arduino (cont.)
- Verificar "β parameter equation":
19/08/2019 – Correção Projeto 1
- Implementado em conjunto a versão long e float.
21/08/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 AVR-Libc).
- O aluno pode escolher usar o MPLAB X ou montar seu próprio Makefile.
- MPLAB X:
- Makefile:
- Tools: sudo apt-get install gcc-avr binutils-avr avr-libc gdb-avr avrdude
- Guia
- Exemplo Simples
- Exemplo Complexo
- Gravação:
- avrdude
- MPLAB X: avrdude -c avrispmkII -P /dev/ttyUSB0 -D -p ${Device} -U flash:w:${ImagePath}:i
- Terminal: avrdude -c avrispmkII -P<PORTA> -D -p ATmega2560 -U flash:w:<HEX>:i
Prática
- Implemente um programa usando GCC e avr-libc para ligar um led (D13) quando um botão (A0) for pressionado (exemplo)
- Operação de Bits em C/C++
- Operações Booleanas em C/C++
- Programming 101 - By Eric Weddington
26/08/2019 – Usando C++ (cont.)
Prática
- Configuração da ferramenta:
- Tools -> Options -> Embedded -> Build Tools-> Add
- Base Directory: /opt/microchip/avr8-gnu-toolchain/bin
- Implemente um programa usando GCC e avr-libc para ligar um led (D13) quando um botão (A0) for pressionado (exemplo)
Notas
28/08/2019 – Usando C++ Serial
Objetivos
- Entender o periférico Serial e implementar métodos de configuração, envio e recepção.
- Datasheet ATmega2560
Experimento
- Implementar comunicação serial 9600bps 8N1
02/09/2019 – Usando C++ ADC
Objetivos
- Entender o periférico ADC e implementar métodos de configuração e leitura do ADC.
- Datasheet ATmega2560
Experimento
- Implementar leitura do ADC
Exercício
- Implementar o "sensor de temperatura" com C++ e AVR-LIBC
- Comparar o tamanho do código gerado
- Entrega: 08/09
04/09/2019 – Interrupção
- Desafio:
- Usando Round Robin sem interrupções implementar um sistema com um LED e um botão. O sistema deve piscar o LED (D13) a cada 1 segundos e ao botão (D2) ser pressionado envia uma mensagem pela serial.
- Notas de Aula:
- Experimentos:
- Referências:
09/10/2019 – Classe GPIO
- Análise GPIO:
- avr-objdump -h -S <PROJECT_NAME>.elf > <PROJECT_NAME>.lst
- Mapeamento de Pinos Arduino Mega
- Classe GPIO_v1 discutida em sala de aula.
- Exercício:
- Implementar classe GPIO com ponteiros para as portas.
- Verificar tamanho do "set" e da ocupação da memória de dados
- Comparar com a primeira versão.
#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);
}
}
10/09/2019 – Classe GPIO (cont.)
- Re-fatoração da classe GPIO
- Experimento:
- Implementar a classe GPIO_v1.3 com o GPIO_Port.
- Verificar o consumo da memória de dados e programa? Por que o consumo da memória de dados foi 23 bytes?
- Exercício (fora da sala de aula):
- Implementar todas as versões compreendendo os conceitos de modelagem (v1.2 e v1.3).
- Implementar a v2.0 com o construtor indexado (informações abaixo) entendendo o conceito da indexação dos pinos a partir do id.
- Implementar a v3.0 com todos os pinos do Arduino Mega. Apoio: Mapeamento de Pinos Arduino Mega
- Modificação GPIO.cpp (uso)
GPIO::GPIO(uint8_t id, PortDirection_t dir)
{
_bit = GPIO_PORT::id_to_bit[id];
_port = GPIO_PORT::AllPorts[GPIO_PORT::id_to_port[id]];
_port->dir(_bit, dir);
}
- Modificação GPIO_Port.h (dentro do namespace GPIO_PORT)
extern GPIO_Port * AllPorts[4];
extern const uint8_t id_to_port[14];
extern const uint8_t id_to_bit[14];
- Modificação GPIO_Port.cpp (dentro do namespace GPIO_PORT)
GPIO_Port * AllPorts[4] = {
reinterpret_cast<GPIO_Port*>(AVR_PB),
reinterpret_cast<GPIO_Port*>(AVR_PE),
reinterpret_cast<GPIO_Port*>(AVR_PG),
reinterpret_cast<GPIO_Port*>(AVR_PH)
};
enum Ports_index {
PB_i = 0,
PE_i = 1,
PG_i = 2,
PH_i = 3
};
const uint8_t id_to_port[14] = {
PE_i ,
PE_i ,
PE_i ,
PE_i ,
PG_i ,
PE_i ,
PH_i ,
PH_i ,
PH_i ,
PH_i ,
PB_i ,
PB_i ,
PB_i ,
PB_i
};
const uint8_t id_to_bit[14] = {
(1 << (0)) ,
(1 << (1)) ,
_BV( 4 ) ,
_BV( 5 ) ,
_BV( 5 ) ,
_BV( 3 ) ,
_BV( 3 ) ,
_BV( 4 ) ,
_BV( 5 ) ,
_BV( 6 ) ,
_BV( 4 ) ,
_BV( 5 ) ,
_BV( 6 ) ,
_BV( 7 )
};
(16/09/2019) – Classe UART
Bloqueante
Proposta e implementação da UART Bloqueante
- Usar a implementação feita em sala de aula e encapsular na classe abaixo.
- Dúvidas: Ler o capítulo 22 do datasheet (USART). Atenção especial as seguintes seções
- "Clock Generation"
- "USART Initialization"
- "Sending Frames with 5 to 8 Data Bit"
- "Receiving Frames with 5 to 8 Data Bits"
- "Register Description"
- Diagrama de Classe:
UART com interrupção
- Dúvidas: Ler manuais da AVR-LIBC
- https://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html
- https://www.microchip.com/webdoc/AVRLibcReferenceManual/group__avr__interrupts.html
- Ler o capítulo 14 do datasheet (Interrupts).
- Ler Seção "7.8 Reset and Interrupt Handling"
- Ler o capítulo 22 do datasheet (USART). Atenção especial as seguintes seções:
- "Transmitter Flags and Interrupts"
- "Receive Compete Flag and Interrupt"
- "Register Description"
- Atenção, a interrupção TXCIEn não deve ser usada - normalmente ela é utilizada apenas para implementar protocolos com reconhecimento/ack;
- Diagrama de Classe: