LAB - PIO - IRQ - Parte 2
Lab - Parte 2 |
---|
Data limite para entrega: 04/09/2023 |
Warning
Use o mesmo repositório criado na parte 1, só que aqui iremos usar a outra pasta.
Pasta do classroom |
---|
OLED-Xplained-Pro-SPI |
Nesta pasta temos um projeto que permite escrevermos na telinha da placa OLED!
Agora vamos praticar um pouco o uso de interrupção, para isso foi fornecido um exemplo que configura o OLED (que deve ser conectado na placa no EXT11).
A entrega final (conceito A) deve usar os três botões da placa OLED para configurar a frequência na qual o LED irá piscar (via interrupção é claro). Um dos botões irá aumentar/diminuir a frequência do piscar do LED, depdendendo do modo de pressionamento (curto/longo), um outro irá parar a piscada do LED e o último terá apenas a função de diminuir (modo pressionamento curto). O OLED deverá exibir a frequência atual do LED "graficamente".
- O código deve funcionar por interrupção nos botões e sempre que possível, entrar em sleep mode.
Conceito C
Agora você deve adicionar o botão 1 da placa OLED para alterar a frequência na qual o LED irá piscar. Além disso, você precisa exibir o valor da frequência no display do OLED.
Tip
Utilize a função pisca_led
para controlar a piscada, deixe como padrão o número de piscada em 30 vezes.
Exercise
Oled
Para escrevermos uma string no OLED devemos usar a função:
void gfx_mono_draw_string(const char *str, const gfx_coord_t x, const gfx_coord_t y, const struct font *font);
Que recebe como parâmetro:
cont char str
: String com o texto a ser escrito no OLEDgfx_coord_t x
: Coordenada pixel X de onde a string irá ser escritagfx_coord_t y
: Coordenada pixel Y de onde a string irá ser escritaconst struct font *font
: Fonte a ser utilizada, a configuração dela está emsrc/config/conf_sysfont.h
Notem que a função recebe uma string e não um inteiro, então vocês NÃO PODEM fazer isso:
// ------------------
// - ATENCÃO ERRADO -
// ------------------
int cnt = 5;
gfx_mono_draw_string(cnt, 0, 0, &sysfont);
// (1)
- Não pode pois não é uma string!!
Lembrem que em C uma string é um vetor de char em ASCII terminado em NULL, então precisamos converter o valor inteiro 5 em uma string.
Existe uma função muito interessante em C que é a sprintf
, que funciona de forma similar ao printf
só que no lugar de enviar a string formatada para o terminal a sprintf
formata a string em um vetor. Veja o exemplo a seguir:
int cnt = 5;
char str[128]; // (1)
sprintf(str, "%d", cnt); // (2)
gfx_mono_draw_string(str, 0, 0, &sysfont);
- Declaramos um vetor (
str
) para armazenar a string formatada. - Agora usamos a função
sprintf
para formatar uma string no vetorstr
. Podemos formatar a string como de forma similar ao printf, exe:sprintf(str, "O cnt é: %d", cnt);
Alguns detalhes:
- O OLED possui dimensões de 128x32 pixels, o texto não pode passar desse tamanho!
- Tome cuidado com o tamanho da string pois ele deve ser capaz de armazenar toda o texto formatado.
Exercise
Answer
Não podemos atualizar o OLED dentro de interrupções e callbacks de HW, pois é um evento demorado e as funções não são reentrantes.
A solução é atualizar o display no main via uso de flags.
Exercise
Exercise
Conceito B
Exercise
Conceito A
Exercise