PIC + gravar eeprom + falta de energia - Programação de microcontroladores - Clube do Hardware
PIC + gravar eeprom + falta de energia
Por rodrigocirilo, 13 de fevereiro de 2015 em Programação de microcontroladores
Bom dia galera do CDH, gostaria de fazer uma pergunta...
estou desenvolvendo um programa.. para um equipamento, ocorre que ele está passivel de alguem ir lá e desligar tirando da tomada, então gostaria de saber...
É possivel no PIC (CCS) ele entender que a energia acabou e gravar algo na eeprom (para saber que foi desligado quando ligar novamente) tipo assim..o pic gerar uma ação quando perceber que a tensão caiu bruscamente...
Bom, pelo que entendi, você pode fazer o seguinte:
-Calcular o tempo que o PIC vai demorar para realizar esta ação. Sendo pequeno o tempo, coisa de menos de 1s você pode prosseguir.
-No circuito seu, na fonte de alimentação coloque um diodo em série e um bom capacitor após ele.
-O funcionamento seria o seguinte: quando acabou a energia, um pino digital do PIC que é ligado à fonte antes do diodo, identifica que houve a queda de tensão. O capacitor após o diodo, segura a carga para o PIC até ele terminar de gravar os dados.
Segue uma imagem para melhor entendimento, qualquer coisa fale que podemos ajudar!
Poxa.. verdade.. excelente ideia... vou fazer um teste aqui.... muito boa a sua dica caro @Raul Azenha..
Uma outra duvida, por exemplo, um simples relógio, usando o timer0 para contar os segundos em um pic 16f628A exibindo em um display..
digamos que corte a alimentação e o consumo desse pic é de acordo com o datasheet:
• Standby Current: - 100 nA @ 2.0V, typical
• Operating Current: - 12 μA @ 32 kHz, 2.0V, typical - 120 μA @ 1 MHz, 2.0V, typical
• Watchdog Timer Current: - 1 μA @ 2.0V, typical
• Timer1 Oscillator Current: - 1.2 μA @ 32 kHz, 2.0V, typical
• Dual-speed Internal Oscillator: - Run-time selectable between 4 MHz and 48 kHz - 4 μs wake-up from Sleep, 3.0V, typical
usando um capacitor medio por exemplo 2200uF por xxV
quanto tempo ele conseguiria ficar contando o tempo sem desligar?? ou algum capacitor maior, ou isso é inviável??
to querendo fazer uns testes nesse sentido..
É, precisa de testes mesmo, tente alimentar com o capacitor, o mínimo possível de componentes que você vai precisar.. não sei como é o seu circuito, mas deixe por exemplo lcd desligado etc.. e se possível, se você estiver usando um regulador de tensão, coloque o capacitor e diodo ANTES do regulador, assim o PIC não vai sofrer com a variação da tensão. (uma boa dica é usar um voltimetro no PIC para acompanhar a queda de tensão e se deu tempo e sobrou para ele fazer as operações nescessárias.)
A tensão de alimentação dos PICs pode ser estabelecida entre uns 2,5V e 5,0V.
Na dica consta uma bateria de 9V.
Você pode fazer isso que o colega mostrou, com uma alimentação de 5,0V.
O detalhe é que o pino que recebe a tensão de alimentação tem que possuir um hardware que produz uma interrupção de transição negativa.
Talvez, com um pequeno circuito, você possa acelerar o alarme da tensão de alimentação e com isso ter mais tempo para gravar na EEPROM e fazer o PIC entrar em modo SLEEP.
@MOR sim observei a tensão...
você sugere uma interrupção na borda de descida H_to_L para efetuar a gravação..
não será necessário o modo sleep ( na minha aplicação) mas como eu disse antes,, seria possivel o pic continuar rodando por um tempo razoavel com a carga restante de um capacitor??
Você pode seguir o tópico http://forum.clubedohardware.com.br/topic/897780-como-calcular-o-capacitor-para-manter-um-led-aceso-por-60-segundos/que explica sobre isso!
Realmente, na pressa de montar o esqueminha pro nosso amigo, acabei me esquecendo de ajustar a tensão, já corrigido! Obrigado
Observe que o PIC determina que a maior tensão para o nível zero lógico é de 0,8V para tensão de Vdd entre 4,5V e 5,5V. E de 0,15 VDD para outras tensões de alimentação.
Isso significa que somente quando a tensão VDD chegar a valor tão baixo é que o pino de entrada da tensão de alimentação monitorada é que vai informar ao PIC, que a tensão de alimentação está baixa. A solução do Raul é uma boa opção, mas se o pino que monitora a tensão de alimentação pudesse informar da redução em, digamos 0,8 * VDD ao invés de 0,15 * VDD ou 0,8V. Você teria uma tensão normal de VDD sem a queda de tensão do diodo e ainda poderia realizar muitas instruções antes da tensão VDD ir pro Brejo.
Alguns modelos de PICs possuem um módulo interno chamado LVD ou PLVD (Programmable Low Voltage Detect), outra opção é emprega-lo, caso esteja disponível no micro usado.
@MOR, fiz um teste basicamente com o circuito que o colega Raul acima informou e não tive sucesso.
voce poderia explicar melhor essa sua lógica proposta??
olá amigo. me lembro vagamente de já ter dito isso mas lavamos nós de novo...
você pode usar o comparador do mc. pegue a tensão não regulada, geralmente a entrada do 7805, quebre-a com divisor resistivo pra cair pra p.ex. 3V e aplique numa entrada do comparador. No sw programe a "outra" entrada do comparador na referência interna pra uma tensão proxima de 3V. Esta ficará constante pois usa divisor resistivo interno do pic conectado ao +5V. Tudo bem até aqui? tá... continue lendo...
Ao desligar, a tensão não regulada antes do 7805 vai cair mais rápido do que o 5V e fazer a da entrada do pino ficar menor do que 3V. Neste caso, programe uma interrupção do comparador para eepromwrite() a variável que você quer
-capacitor alto na entrada: 1000uF deve dar
-na interrupt pára tudo antes de gravar: desliga led, display, relé e etc. pra carga do capacitor durar +
-creio ser mais eficiente: só usa 2 resitores a+
-só teoria: nunca tentei isso mas suponho dar certo: uma oportunidade de acoplar a teoria à prática e de quebra ser útil pra alguém.
-se der certo (ou não) me fale (ou não)
Muito obrigado pelas dicas....são muito valiosas......mas.....
...no decorrer do desenvolvimento tinha pinos do pic sobrando, e acabei dando funções para as 14 portas do 16f628A (não quero usar um maior)...e para fazer esse comparação eu teria que usar duas portas certo??
Bem fui precipitado em dizer que o circuito proposto pelo colega acima não funcionou, eu acabei alterando os valores dos capacitores e funciona sim.....mas...(tudo tem um MAS hehe..... como o MCLR estou usando interno para ter mais esse port disponivel...
O pic tende a iniciar instantaneamente quando alimentado e isso causa alguma coisa que dá zebra...na exibição do lcd, dai aperto um botão de reset (não o MCLR e sim do proprio codigo que fiz) e tudo se estabiliza....Hora acontece, hora não!! usei o capacitor do circuito proposto no valor de 2200uF e um de mesmo valor na alimentação regulada. Se espero pouco tempo para ligar após desligado, ele starta normal.. se espero muito as vezes acontece...
Lembrando que em todas as vezes gravou o valor que eu queria...
Estou pensando em usar uma bateria 9V interna (tipo um no-break) no circuito, pois será para mante-lo na falta de energia!! e assim consigo gravar a falta de energia para ser exibida posteriormente... ou na mesma hora também.. hehe
Isso parece que acontece pelo fato de no momento que você liga o circuito todo, o capacitor começa a carregar, quando chega a 3v, o PIC já começa a iniciar o código, porém o LCD ainda não iniciou. Então o PIC envia para o LCD a string para inicialização, mas o mesmo está desligado ainda, e quando ele liga, o PIC já ta enviando as informações a printar na tela.. Seria esse o problema? Para testar, alimente o LCD com uma alimentação direta de 5v enquanto testa o PIC, se for isso mesmo, basta você atrasar no PIC a inicialização do LCD, coisa de 1segundo é mais que o suficiente.
@Raul Azenha suspeitei desde o principio ..rsrs....obrigado pela analise...
vou testar jaja...
...e para fazer esse comparação eu teria que usar duas portas certo??
errado!! usa um pino só.
não sei se este mas tem mc que detecta a queda do próprio vcc. neste caso, a princípio usaria zero pinos. mas isso é algo pra outra etapa evolutiva
A aternativa da bateria é uma opção curiosa. nem precisa ser 9V. Pode ser daquelas tipo moeda 3V. MC entra em sleep ao sentir a queda do vcc e ... bem ... não convem pular etapas
V0 cai a zero quando Vdd cai abaixo de 4V.
Agora você passou a ser informado da queda de Vdd não mais em Vdd = 0,8V e sim em Vdd = 4V. Você tem bem mais tempo de fazer alguma coisa.