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:
Nenhum comentário:
Postar um comentário