Franzininho DIY – Contador de pulsos externos

Nesses três exemplos vamos explorar gradativamente como fazer um contador de eventos externos no Franzininho DIY.

Introdução

Nesses três exemplos vamos explorar gradativamente como fazer um contador de eventos externos no Franzininho DIY. Vamos explorar as formas mais simples e as mais complexas de contar eventos e as vantagens de cada uma. Nesses exemplos vamos aprender a usar o timer e a fazer debounce, necessário para lermos apenas eventos válidos e não ler o mesmo evento mais de uma vez.

Boa prática!

Recursos necessários

  • Franzininho DIY (com Micronucleus)
  • 4 LEDs de 3mm
  • 4 resistores de 200Ω
  • 1 resistor de 10kΩ
  • 1 chave táctil
  • 7 jumpers macho-fêmea
  • 7 jumpers macho-macho

Contadores

Temos três exemplos de contadores da versão 1 a 3, e aumentando a complexidade do código e dos recursos utilizados.

Contador_v1

Nesse exemplo vamos utilizar loops para fazer a verificação de eventos. Essa forma de se fazer a contagem, apesar de ser mais simples de se entender e criar, é pouco eficiente, tanto a nível de processamento, quanto ao de energia.

O programa é um código em linguagem C e faz uso dos nomes dos registradores definidos na biblioteca avr/io.h. Para melhor entendimento recomendo ler os comentários do código e o datasheet do ATtiny85.

Código

Montagem

image 161

Como mostrado na imagem, os LEDs são ligados nas saídas PortB[4:1] e o botão no PortB[0].

Compilação e upload

Para compilar o programa, assim como nos programas anteriores, acesse a pasta do exemplo e em seguida o comando make:

Como já temos o makerfile configurado na pasta, será feita compilação e deve aparecer a seguinte mensagem:

Conecte a placa em uma entrada USB ou, caso a Franzininho DIY já esteja conectada, aperte o botão de reset para iniciar o upload.

Resultado

Os LEDs devem mostrar a contagem de apertos do botão de forma binária resetando em 0x10 ou quando resetada a placa.

Análise

Esse código é de simples compreensão usando apenas um for para checar continuamente se o botão foi apertado, chamando uma função debounce caso a leitura seja 1, incrementando o contador se for confirmado que a leitura é válida, esperando o botão ser solto e mandando o valor para as saídas.

De forma geral esse código funciona, mas há muito desperdício de processamento, pois há muitos momentos que o processador não está fazendo nada, apenas esperando algo acontecer ou um certo tempo passar, nesse tempo ele poderia estar fazendo outra tarefas ou ficar em modo econômico de energia, que veremos nos próximos exemplos.

Contador_v2

Nesse exemplo vamos começar a usar interrupções para ler os pulsos. Vamos ver quais são as vantagens desse método e o que pode ser melhorado.

O programa é um código em linguagem C e faz uso dos nomes dos registradores definidos na biblioteca avr/io.h e a biblioteca avr/interrupt.h. Para melhor entendimento recomendo ler os comentários do código e o datasheet do ATtiny85.

Código

Montagem

image 160

Como mostrado na imagem, os LEDs são ligados nas saídas PORTB[4:3] e [1:0] e o botão na entrada PORTB[2].

Compilação e upload

Para compilar o programa, assim como nos programas anteriores, acesse a pasta do exemplo e em seguida o comando make:

Como já temos o makerfile configurado na pasta, será feita compilação e deve aparecer a seguinte mensagem:

Conecte a placa em uma entrada USB ou, caso a Franzininho já esteja conectada, aperte o botão de reset para iniciar o upload.

Resultado

Assim como no último exemplo, os LEDs devem mostrar a contagem de eventos, mostrando em binário até 15.

Análise

Esse exemplo tem um código um pouco mais complexo, podendo fazer diferentes tarefas ao mesmo tempo com o uso de interrupções.

Interrupções são, de forma simples, instruções de alta prioridade, que fazem o processador parar o que está fazendo, guardar o estado atual, executar as instruções da interrupção e voltar para o estado anterior, continuando normalmente com o programa. Elas são extremamente úteis para tarefas que precisam de uma precisão de tempo alta ou eventos assíncronos.

Porém, apesar do exemplo dois fazer uso de interrupções, ele passa muito tempo nela, o que atrasa o andamento de um possível outro programa que estaria rodando na main. Porém, grande parte do tempo que é gasto na interrupção está atrelado ao debounce, que consiste basicamente de checagens em certos períodos de tempo. Podemos então otimizar o uso do processador saindo da interrupção entre as checagens, uma vez que ele está apenas esperando para fazer o próximo teste. Veremos isso e o modo de economia de energia no contador_v3.

Contador_v3

Nesse exemplo vamos otimizar o processamento no código utilizando interrupções para as esperas do debounce, também veremos uma alternativa para diminuir o consumo de energia em momentos em que o processador está esperando algum evento, caso você não precise de outra rotina.

Esse programa é um código em linguagem C e faz uso dos nomes dos registradores definidos na biblioteca avr/io.h e a biblioteca avr/interrupt.h. Para melhor entendimento recomendo ler os comentários do código e o datasheet do ATtiny85.

Código

Montagem

image 162

Como mostrado na imagem, os LEDs são ligados nas saídas PORTB[4:3] e [1:0] e o botão na entrada PORTB[2], assim como no exemplo dois.

Compilação e upload

Para compilar o programa, assim como nos programas anteriores, acesse a pasta do exemplo e em seguida o comando make:

Como já temos o makerfile configurado na pasta, será feita compilação e deve aparecer a seguinte mensagem:

Conecte a placa em uma entrada USB ou, caso a Franzininho já esteja conectada, aperte o botão de reset para iniciar o upload.

Resultado

Assim como nos exemplos anteriores, os LEDs do circuito devem mostrar a contagem de pulsos até 15 em binário.

Análise

Neste código adicionamos um pouco mais de complexidade, aumentando o uso de interrupções, além do uso do timer e do modo Sleep.

O modo Sleep é um mode de operação no qual, de forma básica, se desliga alguns módulos do microcontrolador até que alguma interrupção ocorra, o que pode diminuir o consumo de energia de forma drástica. No caso do código do exemplo, utilizamos o modo Idle que no ATtiny85 desliga os CLKs da CPU e FLASH, podendo se desligar opcionalmente o CLK do ADC.

O timer nesse exemplo está configurado como em modo normal, com prescaler de 8, o que faz ele incrementar o timer uma vez a cada 8 ciclos de CLK. A forma adotada para a contagem do tempo foi a interrupção por timer overflow, ou seja, sempre que o valor máximo do timer for atingido ele gera uma interrupção. Para conseguirmos os 1000 ciclos que queremos calculamos overflow -(ciclos/Prescaler), que nos dá 256 -(1000/8) = 131, e setamos o valor do timer nesse valor para que falte o tempo que desejamos para a interrupção.

O uso de interrupções do timer para o debounce diminui consideravelmente o tempo que o processador consome em execução do tratamento do evento, o que melhora o processamento das rotinas paralelas, ou no caso, permite que o processador fique mais tempo no modo Sleep, diminuindo o consumo de energia ou em caso de alimentação por baterias, aumenta a vida útil da da fonte.

Conclusão

De forma geral, todas as três formas de se fazer o código funcionam, e ao servirem seu propósito não estão erradas. Porém, como programadores, principalmente de sistemas embarcados, é uma ótima prática conseguirmos fazer um código eficiente, de forma a não se tornar um empecilho no futuro, seja por usarmos muita memória ou deixarmos o processador muito lento e termos que refazer algo pronto do zero. Por isso é importante saber quais são as vantagens e desvantagens de cada método para podermos sempre utilizar o que melhor se adequa às nossas necessidades.

Glossário

  • Setar: colocar um novo valor em um registrador. Para um bit é convencionado setar, mudá-lo para valor 1, e clear (limpar), muda-lo para valor 0
  • Chave táctil/Push button: botão
  • Debounce: correção do efeito de bouncing (efeito que ocorre em chaves que fazem rápidas conexões e desconexões antes de se estabilizar)
  • Resetar: reiniciar
  • Timer: circuito eletrônico dedicado a contagem de tempo

Outros artigos da série

<< Franzininho DIY – Entrada DigitalFranzininho DIY – Instrumento musical com Buzzer >>
Notificações
Notificar
guest
1 Comentário
recentes
antigos mais votados
Inline Feedbacks
View all comments
LILIAM DUENAS
LILIAM DUENAS
24/06/2021 14:06

Artigo muito bem escrito. Muito obrigada!

WEBINAR

Visão Computacional para a redução de erros em processos manuais

DATA: 23/09 ÀS 17:00 H