Troubleshooting: o efeito do bouncing nas chaves mecânicas (o primeiro problema do computador de 8 bits)
Fala pessoal, tudo beleza?
Fiquei algum tempo sem postar pois estava estudando uma maneira de resolver o primeiro problema que o computador de 8 bits apresentou: o efeito do bouncing nas chaves mecânicas.
Para quem não sabe do que se trata, aqui vai um pequeno resumo do problema:
Toda chave mecânica (interruptores, botões, chaves HH, dip-switches, push-buttons, etc) ao ser ligada à qualquer circuito elétrico e/ou eletrônico, apresenta um ruído de conexão em seus terminais. Esse ruído aparece devido à junção dos contatos da chave não acontecer de forma instantânea. Isso pode ser ocasionado por diversos motivos: vibrações mecânicas dos contatos, umidade do ar, oxidação dos terminais internos da chave, mau contato, etc.
Fiquei algum tempo sem postar pois estava estudando uma maneira de resolver o primeiro problema que o computador de 8 bits apresentou: o efeito do bouncing nas chaves mecânicas.
Para quem não sabe do que se trata, aqui vai um pequeno resumo do problema:
Toda chave mecânica (interruptores, botões, chaves HH, dip-switches, push-buttons, etc) ao ser ligada à qualquer circuito elétrico e/ou eletrônico, apresenta um ruído de conexão em seus terminais. Esse ruído aparece devido à junção dos contatos da chave não acontecer de forma instantânea. Isso pode ser ocasionado por diversos motivos: vibrações mecânicas dos contatos, umidade do ar, oxidação dos terminais internos da chave, mau contato, etc.
Sinal com degrau - Mas que m3%$ :/
Esse comportamento, tanto na área elétrica (gerando Deltas de Dirac de tensão que chegam à milhares de volts) quanto na eletrônica, gera problemas que, na maioria das vezes, traz dores de cabeça ao projetista do circuito.
No meu caso, o componente problemático era a chave de seleção do modo de acesso da memória RAM (para leitura ou escrita). Ela é uma pequena chave HH, de 2 posições e 3 pólos, que faz a conexão do pino WE (Write Enable) dos integrados 74LS189. Quando este sinal (pino 3 do integrado) está em LOW (nível lógico baixo - GND) a memória está configurada para escrita e, quando em HIGH (nível lógico alto - 5V), ela está configurada para leitura.
O problema surgia exatamente quando eu trocava o estado por meio dessa chave. Como havia um ruído na troca de posição da chave, o circuito entendia que se estava dando um pulso no pino WE o que ocasionava, na maioria das vezes, a sobrescrita do valor do endereço atual selecionado.
Eu sempre soube do problema de bouncing das chaves mecânicas, mas nunca o havia estudado à fundo. Confesso que, quando montei o circuito, não achei que isso geraria problemas. Não naquela parte. Maldita lei de Murphy... :P
Pois bem, deixei a montagem dos outros circuitos do computador de lado e comecei os estudos. A primeira fonte de consulta foi o excelente artigo sobre debouncing de Jack G. Ganssle (em inglês - disponível em PDF aqui). Nesse artigo ele trata do debouncing por hardware e por software. Indico a leitura!
Outra fonte de leitura, que todo projetista deveriausar como travesseiro ter é o EXCELENTE livro A Arte da Eletrônica, de Horowitz e Hill. O meu, ganhei de presente de aniversário - antecipado - da minha esposa essa semana (mais uma vez, obrigado amor! Te amo! S2). Esse livro é incrível, de verdade. Foi dele que tirei grande parte da teoria para entender e solucionar o problema.
Existem várias maneiras de resolver o bouncing das chaves mecânicas. Pode-se resolver com circuitos RC, utilizando-se a curva de histerese de componentes schmitt trigger, utilizando o integrado 555 como monoestável e, até mesmo, com integrados desenvolvidos especialmente para essa finalidade, como é o caso do MC14490.
Mas, como eu adoro eletrônica analógica (e, ás vezes, sou meio purista, rs), utilizei o bom e velho circuito RC. Essa configuração de circuito é muito utilizada para se implementar filtros. O que, no nosso caso, não deixa de ser.
A primeira coisa que fiz foi estudar o sinal com a ajuda do osciloscópio.
Na figura abaixo, você pode ver o tamanho do problema.
No meu caso, o componente problemático era a chave de seleção do modo de acesso da memória RAM (para leitura ou escrita). Ela é uma pequena chave HH, de 2 posições e 3 pólos, que faz a conexão do pino WE (Write Enable) dos integrados 74LS189. Quando este sinal (pino 3 do integrado) está em LOW (nível lógico baixo - GND) a memória está configurada para escrita e, quando em HIGH (nível lógico alto - 5V), ela está configurada para leitura.
O problema surgia exatamente quando eu trocava o estado por meio dessa chave. Como havia um ruído na troca de posição da chave, o circuito entendia que se estava dando um pulso no pino WE o que ocasionava, na maioria das vezes, a sobrescrita do valor do endereço atual selecionado.
Eu sempre soube do problema de bouncing das chaves mecânicas, mas nunca o havia estudado à fundo. Confesso que, quando montei o circuito, não achei que isso geraria problemas. Não naquela parte. Maldita lei de Murphy... :P
Pois bem, deixei a montagem dos outros circuitos do computador de lado e comecei os estudos. A primeira fonte de consulta foi o excelente artigo sobre debouncing de Jack G. Ganssle (em inglês - disponível em PDF aqui). Nesse artigo ele trata do debouncing por hardware e por software. Indico a leitura!
Outra fonte de leitura, que todo projetista deveria
Existem várias maneiras de resolver o bouncing das chaves mecânicas. Pode-se resolver com circuitos RC, utilizando-se a curva de histerese de componentes schmitt trigger, utilizando o integrado 555 como monoestável e, até mesmo, com integrados desenvolvidos especialmente para essa finalidade, como é o caso do MC14490.
Mas, como eu adoro eletrônica analógica (e, ás vezes, sou meio purista, rs), utilizei o bom e velho circuito RC. Essa configuração de circuito é muito utilizada para se implementar filtros. O que, no nosso caso, não deixa de ser.
A primeira coisa que fiz foi estudar o sinal com a ajuda do osciloscópio.
Na figura abaixo, você pode ver o tamanho do problema.
O degrau tinha uma amplitude de 2,52 Volts
A chave estava gerando um degrau na curva de subida do sinal (o maior problema era quando se ia do sinal LOW para HIGH). E eu acabei entendendo o que gerava esse problema: como eu tenho dois LEDs (um vermelho e um verde) para sinalizar o modo de operação da RAM, eu os liguei à dois resistores de 470 Ohms. Nessa configuração, esse conjunto de resistores e LEDs, estão funcionando como um divisor de tensão e eu capturo o sinal na junção desses dois conjuntos LED-resistor.
Como disse acima, utilizo uma chave HH de 3 terminais sendo dois deles ligados ao VCC e ao GND e o terceiro, como saída de nível (que é de onde capturo o sinal). Essa saída de nível é também ligada à junção desses conjuntos LED-resistor para controlar o acendimento dos LEDs.
O que acontecia era o seguinte: na transição da chave de VCC para GND, em um pequeno instante de tempo, ela perdia a conexão com os dois sinais (VCC e GND) e, nesse momento, a tensão que permanecia no pino de sinal da chave era exatamente a metade de VCC, ou seja, a tensão do ponto no divisor de tensão formado pelos conjuntos LED-resistor. Isso deixava o circuito da RAM totalmente maluco!
Bem, conhecendo a causa do problema e a solução, é hora de fazer alguns cálculos.
Verifiquei, novamente com a ajuda do osciloscópio, que a duração média do degrau variava sempre entre 2 e 3 milisegundos.
Como disse acima, utilizo uma chave HH de 3 terminais sendo dois deles ligados ao VCC e ao GND e o terceiro, como saída de nível (que é de onde capturo o sinal). Essa saída de nível é também ligada à junção desses conjuntos LED-resistor para controlar o acendimento dos LEDs.
O que acontecia era o seguinte: na transição da chave de VCC para GND, em um pequeno instante de tempo, ela perdia a conexão com os dois sinais (VCC e GND) e, nesse momento, a tensão que permanecia no pino de sinal da chave era exatamente a metade de VCC, ou seja, a tensão do ponto no divisor de tensão formado pelos conjuntos LED-resistor. Isso deixava o circuito da RAM totalmente maluco!
Bem, conhecendo a causa do problema e a solução, é hora de fazer alguns cálculos.
Verifiquei, novamente com a ajuda do osciloscópio, que a duração média do degrau variava sempre entre 2 e 3 milisegundos.
Duração média do degrau
Uma vez visualizado o sinal, você tem uma idéia do que precisa ser feito e como pode atacar o problema. Essa solução do circuito RC é bastante simples, prática e barata. Na maioria das vezes, você só precisará de dois resistores, um capacitor e conhecer algumas fórmulas matemáticas.
A fórmula matemática que utilizei foi:
A fórmula matemática que utilizei foi:
Onde:
- t : tempo total para o capacitor chegar à V, à caminho de Vf
- V : tensão intermediária
- Vf : tensão final no capacitor
- R : resistência (em Ohms)
- C : capacitância (em Farads)
No meu caso, verifiquei que o degrau tinha uma duração de 2,16 ms o que, por segurança, arredondei para 3 ms. Como eu tinha um capacitor de 100 uF em mãos, optei por calcular o resistor para t = 3 ms, V = 2,5V e Vf = 5V (apesar de estar chegando algo em torno de 4,87V no pino).
O valor do resistor calculado foi de, aproximadamente, 47 Ohms.
Abaixo está o circuito de seleção do sinal, já com o circuito RC para o debouncing e uma imagem do sinal filtrado. A tensão desse pequeno degrau na imagem do sinal filtrado é de 400 mV, o que não atrapalha o sinal WE no 189.
O valor do resistor calculado foi de, aproximadamente, 47 Ohms.
Abaixo está o circuito de seleção do sinal, já com o circuito RC para o debouncing e uma imagem do sinal filtrado. A tensão desse pequeno degrau na imagem do sinal filtrado é de 400 mV, o que não atrapalha o sinal WE no 189.
Desculpem-me pelo desenho. Estou sem tempo de fazer o circuito num software apropriado :P
A amplitude do degrau caiu para 400mV :D
Isso é tudo! Nos próximos posts, vamos continuar as montagens e os estudos dos circuitos restantes do nosso computador de 8 bits. ;)
Um forte abraço e bons estudos à todos!
Um forte abraço e bons estudos à todos!
Comentários
Postar um comentário