terça-feira, janeiro 25, 2022

Entrada Digital no RP2040 (Raspberry Pi Pico)

 Complementando o que vimos no post anterior, vamos dar uma rápida olhada nos recursos disponíveis na entrada digital.

Estrutura lógica de um pino do RP2040 (fonte: datasheet)


Na figura acima vemos que um sinal vindo do "I/O Pad" pode ser direcionado para um dos periféricos (GPIO é a entrada digital) e para a lógica de interrupção (IRQ). No meio do caminho o sinal pode ser invertido.

A figura abaixo mostra o "I/O Pad". As partes que nos interessam hoje são os dois blocos inferiores (buffer e resistores).

fonte: datasheet

O buffer tem duas finalidades: fornecer um impedância de entrada grande (em outras palavras, reduzir a corrente no pino para não afetar a tensão na entrada) e determinar se o nível na entrada deve ser considerado como zero ou um (gerando o input data). Este buffer pode ser desligado através do input enable, quando queremos uma entrada analógica ou desejamos economizar energia. O schmitt trigger, se ativo, introduz uma histerese na determinação do nível lógico (valores de tensão diferentes para mudar de 0 para 1 e de 1 para 0). Esta histerese elimina mudanças frequentes do nível lógico quando o sinal de entrada tem pequenas oscilações em torno do valor limite.

O RP2040 permite configurar resistores internos de pull-up e pull-down (entre 50 e 80 kOhms) nos pinos. Estes resistores são úteis para garantir um valor conhecido quando o pino estiver aberto, por exemplo quando o dispositivo na outra ponta é capaz de "puxar" o sinal para 0 ou deixar o sinal solto (chamado, nem sempre apropriadamente, de open collector).

Na parte de interrupções, é possível gerar interrupção por nível (0 ou 1), por borda (passagem de 0 para 1 ou de 1 para 0) ou uma combinação destas condições.  Cada core tem uma máscara separada para indicar de quais pinos serão aceitas interrupções, desta forma é possível por exemplo, que a interrupção do GPIO0 seja tratada pelo core 1 e a interrupção do GPIO5 seja tratada pelo core 0. Habilitar nos dois cores a interrupção de um mesmo pino pode ter efeitos desagradáveis, não faça isso! Os pedidos de interrupção de todos os pinos são ligadas a uma única interrupção do core, a rotina de interrupção deve ler um registrador de status para saber qual o pino que solicitou a interrupção. A interrupção dos GPIOs pode também ser usada para acordar o RP2040. 

Para finalizar, vamos dar uma olhada rápida em algumas funções do SDK C/C++:
  • gpio_set_pulls, gpio_pull_up, gpio_pull_down e gpio_disable_pulls permitem controlar os resistores de pull-up e pull-down de um pino
  • gpio_set_input_enable liga ou desliga o buffer de um pino
  • gpio_set_input_hysteresis_enabled controla a função de schmitt trigger do buffer
  • gpio_set_irq_enabled permite selecionar os eventos que farão um pino solicitar uma interrupção
Uma descrição detalhada das funções do SDK pode ser vista no respectivo manual.

Nenhum comentário: