Como fazer circuito de memória permanente de 1 bit?

13

Eu gostaria de fazer um circuito simples para armazenar ou salvar 1 bit de dados. O circuito deve ser capaz de lembrar o estado de um LED (ligado ou desligado), mesmo que a fonte esteja desconectada do circuito. Eu preciso que ele funcione como um disco rígido, memória flash ou cartão de memória SD de telefones celulares.

Eu fiz um circuito como mostrado na figura. A saída é um LED em série com resistor de 470 ohm. Eu uso dois botões de bucha para carregar ou descarregar o capacitor para que o LED de saída acenda ou apague.

Após desconectar o fornecimento ou desligar a eletricidade, o circuito conseguiu lembrar o estado do LED por alguns minutos.

Após 2 ou 3 minutos, o capacitor descarregou completamente e o circuito perdeu seus dados.

insira a descrição da imagem aqui Como posso parar o capacitor de descarregar? ou como posso diminuir a taxa de descarga para que o circuito perca seus dados após uma semana ou mais?

Neste circuito, eu uso o 555 como um inversor (não o gate), mas posso usar outros ICs. Meu objetivo é criar uma memória permanente simples.

Michael George
fonte
1
Você é avesso a usar uma célula de moeda? Não há como duplicar uma célula EEPROM / flash / FRAM no nível da macro.
Ignacio Vazquez-Abrams
8
@ IgnacioVazquez-Abrams Você poderia usar um relé de travamento ...
helloworld922
2
@ MichaelGeorge: Não, o objetivo de um relé de trava é que ele usa um ímã permanente para preservar seu estado sem a aplicação de energia externa. Você só precisa de um pulso de eletricidade para mudar seu estado.
Dave Tweed
6
Você pode obter um capacitor para segurar a carga por uma semana com algum projeto cuidadoso e construção: m.electronicdesign.com/analog/...
pjc50
3
Em relação à descarga do capacitor: eles podem reter a tensão por um LONGO TEMPO, se desconectados adequadamente. robotroom.com/Capacitor-Self-Discharge-1.html
Faro

Respostas:

29

A memória eletrônica não volátil original é baseada em núcleos de ferrita. Embora seja relativamente fácil magnetizar esse núcleo em uma direção ou outra para armazenar um ou um zero, são necessários circuitos bastante sofisticados para lê-lo de forma confiável.

Os chips não voláteis modernos dependem do armazenamento de carga, mas, para fazer isso funcionar, você precisa criar um capacitor que tenha vazamento praticamente zero e uma maneira de ler essa carga. Isso só pode ser feito no contexto da microeletrônica, onde o capacitor é um pequeno pedaço de metal (o "portão flutuante") que é completamente envolto em vidro (dióxido de silício) e é lido por meio de sua influência em um transistor próximo .

Outra opção é a RAM ferrorelétrica (FRAM), que utiliza um material dielétrico especial que possui dois estados de polarização estáveis ​​e distintos. Novamente, isso só funciona em microeletrônica.

Portanto, você precisa escolher outro fenômeno físico para armazenar suas informações. Uma escolha óbvia é o relé de travamento, que armazena informações na posição física de sua armadura, que é mantida em uma das duas posições estáveis ​​por um ímã permanente ou uma mola. A posição pode ser alterada aplicando-se um pulso de corrente relativamente curto, e a leitura é realizada anexando contatos elétricos à armadura.

Dave Tweed
fonte
Como você tem apenas um núcleo, não conseguiu lê-lo com um sensor de efeito Hall ou algo assim?
User253751
1
@immibis: Não é fácil. O campo magnético está quase completamente contido no próprio núcleo, com muito pouco vazamento externo.
Dave Tweed
8

Faça um circuito que pressione um interruptor mecânico, por exemplo. caixa inútil. O circuito precisaria ser ligado para alterar / ler o estado, mas o manteria no meio.

JamesRyan
fonte
6

Uma solução simples seria um microcontrolador, como um PIC12F635, disponível em um DIP de 8 pinos ou menor, e que possua um circuito interno de redefinição de clock e escurecimento (o último é importante para manter a integridade da EEPROM não volátil armazenamento).

O código necessário não é muito, um bom projeto inicial.

As únicas partes externas necessárias seriam um capacitor de derivação e um resistor limitador de corrente para o LED.

A solução mais simples é provavelmente um relé de sinal de duas bobinas.

Spehro Pefhany
fonte
6

A eletrônica pura não cria uma célula de memória permanente, mas a carga em um capacitor pode se aproximar dela (precisará de atualização regular). A memória EEPROM / Flash estende esse requisito para 10 anos, portanto, para fins práticos, é chamado permanente. Mas isso não é algo que você consegue fazer com componentes comuns.

A memória permanente real usa algum tipo de fenômeno biestável físico. A magnetização de núcleos de ferrita mencionada por Dave foi amplamente utilizada (já ouviu falar de um 'core dump'?). O relé biestável (ou com trava) mencionado pelo helloworld922 é mais fácil de usar.

Ao observar como isso foi feito nos primeiros computadores, você deve perceber que há um equilíbrio entre a complexidade da célula única e a complexidade do circuito de acionamento. Um núcleo de ferrite é muito simples, mas o circuito de acionamento e, especialmente, o circuito de leitura são muito complexos. Para um relé biestável, é o contrário: o relé é bastante complexo por bit, mas o circuito de controle é muito simples.

Qual é o seu propósito?

  • Se você deseja criar uma célula apenas para se divertir, use um relé biestável.

  • Se você quiser demonstrar como isso é feito na prática (DRAM / Flash) sem ser prático, use uma carga armazenada em um capacitor e atualize-a regularmente.

  • Se você quiser tornar algo prático, use um pequeno microcontrolador que possua EEPROM (ou possa programar seu FLASH) automaticamente.

Wouter van Ooijen
fonte
5

Um fuso. Pode ser chato substituir com frequência, para que você possa atualizar para um disjuntor.

William Price
fonte
5
Isso é um pouco fino para uma resposta no EE.SE. Por favor elabore.
Nick Alexeev
2
Então ... chega a 1 por padrão (a corrente passa), para definir como zero, você envia uma corrente de corrente através do fusível para queimar, agora a corrente não passa, para definir para 1 novamente, substitui o fuso?
Michael
1
Eu gosto do pensamento pronto para uso aqui. Quando você pressiona o botão para desligar o LED, ele dispara o disjuntor. Quando você pressiona o botão para ligar o LED, ele redefine o disjuntor. É apenas uma versão estranha do relé de travamento. Provavelmente não é a melhor opção, mas ainda gosto da criatividade.
MichaelS
1
Eu estava simplesmente me referindo a como os dispositivos ROM iniciais funcionavam. Eles eram uma série de fusíveis. Sopre os fusíveis onde quiser zeros. Eu não acho que isso exigiria uma visão mais profunda. Muito velha escola.
William Price
3

Solução prática:

Um relé de travamento, como mencionado por @DaveTweed, é o mais simples.

Se você deseja uma solução de estado sólido, pode usar um IC de memória de interface paralela como esse . Você pode apenas amarrar as linhas de endereço em um endereço fixo e usar apenas uma das linhas de dados. Você precisará de alguma lógica de cola adicional.

Solução interessante:

Se você estiver procurando por um projeto para demonstrar memória, poderá usar um solenóide com algum núcleo histérico. Sature o núcleo em uma direção para armazenar um 1, sature-o na outra direção para armazenar um 0. Isso cuida das gravações.

Em seguida, monte isso logo acima de um sensor como este sensor de hall . Depois, você pode observar a polaridade do campo remanescente com o sensor hall (apenas um comparador analógico) para determinar o estado.

Houston Fortney
fonte
3

Da resposta do fusível / disjuntor dada por William Price veio a solução mais óbvia:

Uma troca.

Pegue uma lâmpada. Conecte-o. Ligue-o. Desconecte-o. Mova para o Havaí. Conecte.
Ele liga novamente.

Desligue isso. Desconecte-o. Levar para casa. Conecte-o.
Ele permanece desligado.

Se você deseja que um computador ative / desative o LED, não é tão útil. No entanto, se você usar uma chave seletora de botão e um solenóide ativado eletronicamente, poderá fazer o trabalho. Pressione o botão para ligar o LED, ele ativa o solenóide, o LED acende. Empurre novamente, o LED apaga. Desconecte-o e o botão ainda está ativado ou desativado mecanicamente.

Se você quiser manter a funcionalidade explícita "isto, se definitivamente ativado, definitivamente desativado" (em vez de alternar), o botão superior ativará um solenóide que pressiona a parte superior de um interruptor. Em seguida, o botão inferior ativa um segundo solenóide que pressiona a parte inferior do interruptor.

Não estou dizendo que essa é a melhor maneira de fazer isso remotamente, mas é funcional.

MichaelS
fonte
1
Tudo o que você fez foi descrever como construir um relé biestável, que foi uma das primeiras soluções propostas.
Dave Tweed
A segunda parte, sim, é apenas uma descrição de um relé biestável desajeitado, talvez útil se ele estiver interessado em construir seu próprio relé. A primeira parte, no entanto, não é. Acho que não corresponde à intenção da pergunta (presumo que ele esteja interessado em aprender eletrônica, em vez de criar o design mais simples possível), mas uma única chave de alternância é um design mais simples e fácil do que os bits eletrônicos e atende aos requisitos dados em as primeiras frases.
Michaels
Você pode estar certo, mas nunca teremos certeza, pois o OP nunca voltou a discuti-lo - embora ele tenha "aceitado" minha resposta. Interpretei a intenção geral da pergunta de se referir à memória regravável eletronicamente, com base em "O circuito deve ser capaz de lembrar o estado de um LED" . Isso excluiria a memória somente leitura (comutadores, jumpers, diodos etc.) e a memória de gravação única (fusíveis).
Dave Tweed
Meu pensamento é que o estado do LED está diretamente relacionado a qual botão foi pressionado por último. Do ponto de vista lógico, capturar o estado dos botões é idêntico ao capturar o estado do LED.
MichaelS 02/09
2

A solução mais simples de um componente seria um relé biestável. E você só precisará de um resistor para ler o estado.

Bruce
fonte
2

Você pode usar um microcontrolador incorporado na EEPROM. O PIC16F84A de 8 bits possui 64 bytes de EEPROM, o que é bom para normalmente 10.000.000 e um mínimo de 1.000.000 de gravações em cada byte (isso é conhecido como resistência de bytes). O PIC escolhido em outra resposta, o PIC12F635, possui uma EEPROM de 128 bytes e uma durabilidade de 100.000 gravações. O PIC24F16KA102 , um processador de 16 bits, possui 512 bytes de EEPROM e também uma resistência de bytes de 100.000 gravações.

O OP não indica com que frequência o LED pisca. Para os fins desta discussão, vamos supor que seja quatro vezes por minuto.

Em um ano ele piscará

46024365=2,102,400 tEumes.

Como a EEPROM precisa capturar os últimos eventos ativados e desativados, ela será gravada com o dobro desse número, ou cerca de 4,2 milhões de vezes . Em cinco anos, isso é 21 milhões de vezes.

Claramente, isso excederá as especificações de qualquer EEPROM que agora integro em um microcontrolador.

Mas existe uma solução simples para isso. Em vez de usar o mesmo byte repetidamente para acompanhar o status ativado ou desativado, pode-se usar uma matriz de bytes, que preenche todo o chip.

Você precisa de dois bytes para cada elemento na matriz. Portanto, uma EEPROM de 64 bytes, como a do PIC16F84A, pode conter 32 elementos. Cada vez que você grava na EEPROM, grava um 0 no byte de status (ou seja, este elemento possui dados) e um 0 no byte de dados (o LED foi desligado pela última vez) ou um 0xFF (o LED foi ligado pela última vez). Na próxima vez que você acessar a EEPROM, indexe os elementos até encontrar um com um byte de status 0xFF e use o elemento em questão. Se não houver mais, reinicialize a EEPROM e inicie novamente (para os PICs low-end, isso significa escrever 0xFF para cada um dos bytes de status; para o PIC24, existe um comando para apagar toda a EEPROM). Se você precisar conhecer o último status do LED, indexe através da matriz como antes, mas agora volte um elemento e leia o byte de dados.

enter image description here

Isso basicamente divide o número de acessos a um único byte por um fator de 16 para o PIC16F84A (16 e não 32 porque cada um dos bytes de status é gravado duas vezes). Portanto, seria capaz de lidar com 16 milhões de gravações no total, o suficiente para quase quatro anos de dados. E o PIC12F635, com sua EEPROM maior, mas menor capacidade de bytes de 100K, seria capaz de lidar com 3,2 milhões de gravações no total, o suficiente por nove meses.

O PIC24F16KA102, com seu EEPROM de 512 bytes e recurso de exclusão em massa, seria capaz de lidar com 25,6 milhões de gravações, o suficiente por mais de cinco anos.

Se a taxa de intermitência for de apenas quatro vezes por hora em vez de quatro vezes por minuto , isso significa um total de 70.080 gravações por ano. Até o PIC12F635, com sua capacidade de 100.000 gravações por byte, duraria 45 anos!

tcrosley
fonte
Você pode deixar de escrever na EEPROM até depois de uma perda de energia. Os capacitores devem armazenar carga suficiente para manter o uC funcionando por tempo suficiente para gravar o estado atual. Isso pode aumentar significativamente a longevidade da sua EEPROM.
MichaelS
Além disso, por que não usar vários bits por byte? O primeiro byte armazena 7 bits de dados de contagem e 1 bit de dados de LED. Na primeira vez que você escreve, você define o byte para 0000001L, 0000010L, etc. Quando atinge 1111111L, você redefine o próximo byte para todos os zeros. Depois de chegar ao último byte, você redefine o primeiro byte para zeros. Seu próximo local de leitura é o primeiro byte cujos 7 bits principais são 0 <7 bits <= 127 e o próximo local de gravação é o primeiro byte com 7 bits <127. Agora você quase duplicou seus acessos porque (quase ) toda gravação é em um único byte em vez de dois.
MichaelS
@ MichaelS Pensei nisso também. Primeiro, você não pode passar de 11111110 para 11111101 porque não pode escrever 1's (inverti sua condição inicial). Em vez disso, você escreveria zeros, um de cada vez no byte. Mas isso realmente não é bom em termos de limitação do número de gravações por byte - você acaba gravando cada byte oito vezes em vez de uma vez.
tcrosley
Não usei exatamente os dispositivos PIC em questão, mas entendo que você apaga todos os dados e altera os bits que não devem ser o padrão de uma só vez. Portanto, se "apagado" significa todos os 1s, você apagaria tudo e mudaria os bits de 1 a 6 e possivelmente L. Em seguida, você apagaria tudo e mudaria os bits de 1 a 5, 7, possivelmente L. No final da contagem , você alteraria apenas alguns bits (1110110L -> 1110111L altera apenas os bits 4 e L). Como há 50% de chance por apagamento e 50% por gravação, para que um determinado bit seja apagado, é uma média de 100% ou 8 bits por ciclo de apagamento / gravação.
MichaelS
Com seu método, todo o byte de status é apagado algum tempo antes do uso e, em seguida, é definido como zero no uso, ou 16 bits por ciclo de apagamento / gravação. Ao mesmo tempo, todo o byte de dados tem 50% de chance por apagamento, 50% de chance por gravação ou uma média de 8 bits por ciclo de apagamento / gravação. O total é então de 24 bits por ciclo. Mesmo se assumirmos que cada ciclo de apagamento / gravação é equivalente por byte, ainda haverá a alteração de dois bytes em vez de um. (Não é possível editar o comentário acima, eu quis dizer 50/50 para um dado pouco para se mudou , não apagados, na última frase.)
Michaels
2

Isso pode ser uma sugestão muito ingênua ... mas que tal construir uma trava de transistor de baixa potência acionada por uma bateria de botão . Em seguida, use a saída para alimentar um amplificador operacional que é acionado pela fonte de alimentação . Dessa forma, você descarrega a bateria do botão da tensão de alimentar a saída útil; você não pode usá-lo de qualquer maneira enquanto o suprimento estiver desligado, certo?

EDIT: Também - de acordo com o comentário abaixo - é aconselhável fazê-lo para que a trava fique isolada do amplificador OP se o suprimento acabar. Qualquer tipo de relé - ou circuito equivalente - alimentado pelo suprimento deve ser capaz de fazer o trabalho lá.

Considerando que um simples relógio de pulso pode ser acionado por uma bateria de botão por anos, acionar uma trava simples deve proporcionar uma vida útil por bateria que dura uma década. Você pode até colocar duas pilhas em paralelo para poder trocá-las - uma de cada vez - sem perder as informações.

MichaelK
fonte
Existem apenas muito poucos amplificadores operacionais disponíveis que permitem uma tensão na entrada superior à tensão de alimentação, o que seria o caso durante o desligamento.
Arsenal
Se for esse o caso, não há uma maneira de desligar a entrada do amplificador operacional se o suprimento acabar, isolando essencialmente a trava? Qualquer tipo de relé - ou circuito equivalente - faria o truque lá, não faria?
MichaelK
0

Um pequeno CPLD pode ser programado para conduzir o protocolo necessário para gravar um conjunto simples de valores em um barramento I2C.

O NXP cria uma variedade de memórias muito pequenas, destinadas a substituir interruptores DIP, por exemplo, PCA8550 / PCA9561.

Combine os dois e você terá uma chave de estado sólido muito pequena que lembra seu estado.

Jason Morgan
fonte