sexta-feira, agosto 30, 2024

E temos um bug no RP2350!

 Ainda nem recebi a minha Pico2 e já está nas notícias um bug chato no microcontrolador RP2350. É um bug documentado no datasheet, mas com o qual seremos obrigados a conviver.



O bug envolve o uso do resistor interno de pull-down na função de leitura digital.

Explicando para quem não conhece os resistores de pull-up e pull-down internos: na função de leitura digital, o microcontrolador identifica a tensão em um pino como um nível alto (1) ou baixo (0). O que acontece se o pino não estiver conectado a nada? O valor lido é indeterminado (pode ser alto ou baixo). Para evitar isso, pode-se conectar o pino à alimentação (pull-up) ou a terra (pull-down) através de um resistor. Este resistor normalmente tem um valor alto para não consumir muito e não interferir quando uma tensão é colocada no pino. Este tipo de situação é tão comum que muitos microcontroladores possuem um ou ambos destes resistores internamente, podendo ser conectados ou desconectados por controle do software.

Um exemplo clássico é a conexão de um botão de contato momentâneo (push-button). Este botão normalmente está aberto; o contato fecha quando ele é apertado. Um contato do botão é ligado ao pino do microcontrolador e o outro a terra ou alimentação; o resistor interno define a condição quando o botão estiver solto. Alguns microcontroladores possuem apenas resistores de pull-up, por isso é comum a outra ponta ser ligada à terra, o que resulta em uma leitura de "0" com o botão apertado e "1" com o botão solto.

E qual o bug do RP2350? Ao usarmos o resistor de pull-down, tudo funciona como esperado até o botão ser apertado e solto. Quando o botão é solto, ao invés do pino ir para um nível baixo ele fica com uma tensão em torno de 2,1V e continua sendo lido como nível alto. (Existem umas condições adicionais, mas elas são comuns no uso das entradas digitais).

Porque isso ocorre? Existem diversos circuitos ligados a cada pino do RP2350. Um deles é para proteção contra falhas (irônico, não?). Este circuito não foi projetado pela Raspberry Pi, mas sim licenciado de terceiro. A Raspberry Pi pediu uma alteração no circuito padrão e a empresa projetista fez uma caca.

O que fazer para contornar o problema? O ideal é não usar os resistores de pull-down internos, seja usando resistores externos ou projetando o circuito para usar os resistores internos de pull-up (se possível). É possível destravar o estado da entrada digital desligando o buffer de entrada após a leitura e ligando novamente logo antes da leitura seguinte, mas isso é bem chatinho na prática.

Eventualmente é possível que a Raspberry Pi produza uma versão do RP2350 com este bug corrigido, mas até lá uma quantidade muito grande de chips já estará em campo.

Referência: hackster.io

Atualização em 2/set/24:

O problema parece ser mais grave do que inicialmente reportado. Algumas pessoas estão verificando o comportamento da entrada ficar "travada" mesmo sem utilizar o resistor de pull-down interno. Em algumas experiências é preciso ter um pull-down externo com valor inferior a 9k quando não é usado um pull-up interno ou externo e o pino passa de um nível alto para desconectado.

Referência: https://github.com/earlephilhower/arduino-pico/issues/2380

Atualização em 6/set/24:

O datasheet do RP2350 foi atualizado com uma descrição mais detalhada do problema e confirmando que pode ocorrer mesmo com pull-down externo. O valor máximo recomendado para o pull-down externo é de 8.2k;


Nenhum comentário: