Ir ao conteúdo

Bateria emergência para PIC.


Alexandrebozelo

Posts recomendados

Postado

Boa noite tem como colocar uma bateria ou pilha para não perder as regulagens que são feitas no no programa. Por exemplo os tempos etc...

 

um pic não perde a memoria se for desligado !

 

http://labdegaragem.com/profiles/blogs/artigo-os-tipos-de-mem-ria-encontrados-em-microcontroladores

http://pt.wikipedia.org/wiki/Mem%C3%B3ria_flash

 

mas se tiver  enfrentando problemas  pode sim  coloque um regulador 7805   em uma  bateria  de 12 volts para alimentar  ele

Postado

@Alexandrebozelo,

É exatamente para isto que um Pic tem a memória EEprom !!!!!

Quando voce fizer os ajustes, eles devem ser guardados em EEprom, assim quando a energia é reestabelecida basta ler esta memória, e carregar a memória comum ( Sram ) com eles !

Paulo

Postado

bom vou tentar explicar melhor.

eu fiz um programa para o utiliza-lo num sistema de retro lavagem. 

no programa coloquei o intervalo entre cada retro lavagem ex:, 1,2 a pessoa vai ali e coloca

o tempo de 1 a 600 segundos, e o tempo de drenagem. porém quando falta energia, esses dados que são colocados ali no painel depois de montado são rezetados. Sim o programa com seus valores iniciais continuam. eu gostaria de saber um esquema de algo como uma bateria tipo um nobreak. 

obrigado por responderem...

 

:)

Postado

Bom talvez eu não saiba como fazer então.

vou postar o codigo aqui. 

#include <16f628a.h>       
          
#use delay (clock=4m) 
 
#fuses  NOmCLR,INTRC_IO
#include <lcd.c>
int L=0,in=3,D=30,B=0;
long int r=120,J=3595,t=0,K=0;
void main (){
 
lcd_ini();
 
lcd_ESCREVE("\f INICIALIZANDO \n SISTEMAS AUT.");
delay_ms(2500);
 
lcd_escreve("\f  TRATA AGUA\n SISTEMAS AUT.");
while (true){
  
 
  T=0;
  L=0;
  k=0;
  B=B+1;
      IF(B<50){
      lcd_escreve("\f   TRATA AGUA   \nRETROLAVAGEM AUT");
      }
      IF(B>51){
      lcd_escreve("\f    CLIENTE    \n AVIC FRAGNANI ");}
      if(b>100){
      B=0;}
      delay_ms(300);
  output_low(pin_a7);
  output_low(pin_b1);
  output_low(pin_a6); 
  
      if(input(pin_a4)){
           output_low(pin_b1);
           output_low(pin_a6);
           
         while(input(pin_a4)){
         printf(lcd_escreve "\f  SISTEMA   =%dhs \n FILTRANDO  =%lihs ",in,j/3600);
             j=j+1;
             k=0;
             t=0;
             output_high(pin_a7);
             delay_ms(1000);
             
               if(j>in*3600 || input(pin_a3)){
               
              while(k<(r+d)){
           output_low(pin_a7);
           while(k<r){
          printf( lcd_escreve "\fSISTEMA %li EM\nRETROLAVAGEM ",k);
      
           output_high(pin_a6);
           k=k+1;
           delay_ms(1000);
           }
           while(k>r && k<(r+d)){
           printf(lcd_escreve "\fSISTEMA %li EM\nDRENAGEM",k);
      
          
           output_high(pin_b1);
           k=k+2;
           delay_ms(1000);
           output_low(pin_b1);
           output_low(pin_a6);
           delay_ms(1000);
           j=0;}}}}}
      
                   
        
  output_low(pin_a7);
  
      if(input(pin_a3)){
      lcd_escreve("\fLIGUE O SISTEMA\nEM MANUAL");
      DELAY_MS(4000);}
      
      IF(INPUT(PIN_a0)){
          while(T<120){
      PRINTF(LCD_escreve "\fINTERALO\nTEMPO =%dhs",in);
      DELAY_MS(250);
      T=T+1;
 
         if(input(pin_a1)){
         //AUMENTA O VALOR DE INTERVALO...........
         in=in+1;
 
            if(in>20){
            lcd_escreve("\f TEMPO MAXIMO\n DE INTERALO =20hs");
            delay_ms(1500);
            in=in-1;}}
            
         if(input(pin_a2)){
 
         in=in-1;
            if(in<1){
            lcd_escreve("\fVALOR MINIMO\nDE INTERVALO =1h");
            delay_ms(1500);
            IN=IN+2;}}
      
      
      //menu .....................
         if(input(pin_a0)){
         
         L=0;
            while(t<120){
            T=T+1;
            printf(lcd_escreve "\fRETROLAVAGEM\n TEMPO =%lis",r);
            DELAY_ms(400);
             if(input(pin_a1)){
             r=r+1;
             T=0;
            if(r>600){
            lcd_escreve("\f TEMPO MAXIMO\n DE RETROLAVAGEM =600s");
            delay_ms(1500);
            R=R-1;}}
         if(input(pin_a2)){
         R=R-1;
         T=0;
            if(R<1){
            lcd_escreve("\fVALOR MINIMO\nDE RETROLAVAGEM =1s");
            delay_ms(1500);
            R=R+2;}}
            
          
         
         if(input(pin_a0)){
         
         
            WHILE(T<120){
             printf(lcd_escreve "\fDRENAGEM\nTEMPO =%ds",d);
             T=T+1;
              delay_ms(400);
               if(input(pin_a1)){
                     D=D+1;
                     T=0;
                       if(D>200){
                        lcd_escreve("\f TEMPO MAXIMO\n DE DRENAGEM =200s");
                        delay_ms(1500);
                         D=D-1;}}
               if(input(pin_a2)){
               D=D-1;
               T=0;
                     if(D<1){
                     lcd_escreve("\fVALOR MINIMO\nDE DRENAGEM =1s");
                     delay_ms(1500);
                     D=D+2;}}
               IF(INPUT(PIN_a0)){
                
               lcd_escreve("\fRETORNANDO...");
               delay_ms(1500);
               T=T+260;
               ;}}}
            }}}}}
         
      }
 
 
 
Este é o código.
depois de montar o painel, ele tem a opção de um menu.
neste menu o usuário pode alterar alguns parâmetros, pelo que vocês estão me falando então tem um código que grava na eeprom? porque 
eu so sei gravar pelo gravador mesmo.
Estes dados do menu que eu criei e que torna personalizável alguns parâmetros, em uma falta de energia no, meu caso, são perdidos.
Postado

@Alexandrebozelo Pelo que eu entendi existe um software que faz interface entre o PIC e o comando do painel que programa o tempo.

ser for isso, essa memória é guardada no software e não no PIC, o software que teria que gravar os últimos parâmetros entrados no painel.

Se o software não tem a opção de guardar esses parâmetros, ele tem que ser rê-escrito para faze-lo.

Postado

@Alexandrebozelo Pelo que eu entendi existe um software que faz interface entre o PIC e o comando do painel que programa o tempo.

ser for isso, essa memória é guardada no software e não no PIC, o software que teria que gravar os últimos parâmetros entrados no painel.

Se o software não tem a opção de guardar esses parâmetros, ele tem que ser rê-escrito para faze-lo.

não verdade não:

se você notar, no código fonte quando o pino a0;

entra um menu, a variável r esta pre configurada para 120, 

quando o utilizador vai ni menu e acrescenta esse valor a variavel r por exemplo r+1, ele fica 121, mas quando ele reinicia por falta de energia ele volta a 120;

Pelo que eu estou entendendo se eu não atribuir um valor no inicio do programa a variavel r, ele vai assumir o ultimo valor??

 

por exemplo;

se eu apenas adicionar 

long int r, 

ele vai atribuir o ultimo valor??

ou vai pegar algum lixo??

Postado

 

por exemplo;

se eu apenas adicionar 

long int r, 

ele vai atribuir o ultimo valor??

ou vai pegar algum lixo??

 

  Vai pegar algum lixo....

  Funciona assim....:

Quando você declara uma variável, o compilador separa um espaço na memoria RAM para o valor dela, e a memoria RAM se perde quando se corta a energia, mas o PIC possui outro banco de memoria que não se perde com a falta de energia, essa é a EEprom, para gravar o valor nela é necessário utilizar "comandos" específicos que vão gravar e ler esses valores...

No MikroC Eu uso os Comandos EEprom_read() e EEprom_write(x,y)... 

  No ccs eu não conheço a nomenclatura, mas o @MatheusLPS é fera no CCS, então acho que ele pode te explicar melhor do que eu como escrever uma rotina para gravar e ler uma variável na eeprom... Ou da uma procurada no Site ou Help do CCS, porque se não me engano ele tem uma biblioteca que faz essas gravações facilmente.

  Se quiser, aqui tem um material interessante, diz que é para variáveis float, mas pode usar para variáveis long int, já que elas tem o mesmo tamanho em Bytes, e esta em inglês é claro, mas ta facinho de entender, (ps: Encontrei no google):

http://www.ccsinfo.com/forum/viewtopic.php?p=122263

 

 

  Espero ter ajudado

Grato Luiz Gustavo.

Postado

so para contribuir..

se precisar gravar valores maiores q 255 na  eeprom , utilize

biblioteca : #include <internal_eeprom.c>

e as chamadas:

write_int16_eeprom(1,x);

 x= read_int16_eeprom (1);

Postado

Funcionou legal!!! Agora to com um problema quando eu uso a função de leitura como o @cesarlg citou, para números maiores que 128 ele retorna um monte de lixo. Como eu resolvo?

Desde já muito obrigado a todos.

so para contribuir..
se precisar gravar valores maiores q 255 na  eeprom , utilize
biblioteca : #include <internal_eeprom.c>
e as chamadas:
write_int16_eeprom(1,x);
 x= read_int16_eeprom (1);

Postado

@Alexandrebozelo

 

você declarou sua variável X como int16?

 

Não deveria ocorrer com valores maiores que 128 pois ainda é 8 bits. Até 255 deveria ser normal. Depoi disso que você deveria usar a biblioteca especial para valores de 16 bits.

 

Falou

Postado

@Alexandrebozelo

 

você declarou sua variável X como int16?

 

Não deveria ocorrer com valores maiores que 128 pois ainda é 8 bits. Até 255 deveria ser normal. Depoi disso que você deveria usar a biblioteca especial para valores de 16 bits.

 

Falou

também achei estranho... mas acontece o seguinte. 

criei um menu ajustável ali, e a a variável r vai de 1 a 600, como mostra no código que postei.

porém na placa teste quando rodo o programa, entro em menu e vou aumentando o valor de r, vai incrementando +1, porém se eu apenas declarar no inicio

"int r", quando chega a 127 e entra em valores negativos, então declarei por garantia "long int r;" ok, resolveu este problema; quando vou no menu com o microchip ja na placa e aperto "input(pin_a1),para incrementar +1 a r " funciona legal, e tal. dae uso a expressão que o @cesarlg citou, na hora de recuperar quando eu desligo o chip da energia, a variável r volta com algum lixo. mt estranho. vou postar o cogido aqui para vocês poderem me corrigir.  

#include <16f877A.h>
#device ADC=10
#use delay (clock=20000000)
#include <personalpic1.h>
#fuses HS, NOWDT, NOPROTECT, NOBROWNOUT, NOLVP, PUT
#byte PORTC=0x07
#include <internal_eeprom.c>
 
int K=0,L=0,in,D,B=0;
long int  p=0,J=0,T=0;
float r;
void main (){
 
 
lcd_putc("\f INICIALIZANDO \n SISTEMAS AUT.");
delay_ms(2500);
r= read_int16_eeprom (5);
d= read_int16_eeprom (2);
in= read_int16_eeprom (3);
if(input(pin_b0)){
r=0250;
d=10;
in=3;
lcd_putc("\fgravando...");}
while (true){
 B=B+1;
      IF(B<22){
      lcd_PUTC("\f   TRATA AGUA   \nRETROLAVAGEM AUT");
      }
      IF(B>23){
     
      lcd_PUTC("\f    CLIENTE    \n AVIC FRAGNANE ");}
      
      IF(B>44){B=0;}
  delay_ms(350);
  T=0;
  L=0;
  
      
      IF(INPUT(PIN_b0)){
          while(T<250){
      PRINTF(LCD_putc "\fINTERALO\nTEMPO=%dh",in);
      DELAY_MS(500);
      T=T+1;
 
         if(input(pin_b1)){
         //AUMENTA O VALOR DE INTERVALO...........
         in=in+1;
 
            if(in>20){
            lcd_putc("\f TEMPO MAXIMO\n DE INTERALO=20hs");
            delay_ms(1500);
            in=in-1;}}
            
         if(input(pin_b2)){
 
         in=in-1;
            if(in<1){
            lcd_putc("\fVALOR MINIMO\nDE INTERVALO=1hs");
            delay_ms(1500);
            IN=IN+2;}}
      
         if(input(pin_b0)){
       
         L=0;
            while(t<120){
            T=T+1;
            printf(lcd_putc "\fRETROLAVAGEM\n TEMPO=%fs",r);
            DELAY_ms(250);
             if(input(pin_b1)){
             r=r+1;
             T=0;
            if(r>600){
            lcd_putc("\f TEMPO MAXIMO\n DE RETROLAVAGEM=600s");
            delay_ms(1500);
            R=R-1;}}
         if(input(pin_b2)){
         R=R-1;
         T=0;
            if(R<1){
            lcd_putc("\fVALOR MINIMO\nDE RETROLAVAGEM=1s");
            delay_ms(1500);
            R=R+2;}}
            
            //MENU DRENAGEM...............................
         if(input(pin_b0)){
         
          
            WHILE(T<120){
             printf(lcd_putc "\fDRENAGEM\nTEMPO=%ds",d);
             T=T+1;
              delay_ms(400);
               if(input(pin_b1)){
                     D=D+1;
                     T=0;
                       if(D>200){
                        lcd_putc("\f TEMPO MAXIMO\n DE DRENAGEM=200s");
                        delay_ms(1500);
                         D=D-1;}}
               if(input(pin_b2)){
               D=D-1;
               T=0;
                     if(D<1){
                     lcd_putc("\fVALOR MINIMO\nDE DRENAGEM=1s");
                     delay_ms(1500);
                     D=D+2;}}
               IF(INPUT(PIN_b0)){
             
              lcd_putc("\f  RETORNANDO");
              write_int16_eeprom(5,r);
              write_int16_eeprom(2,d);
              write_int16_eeprom(3,in);
              T=T+260;
              delay_ms(1500);
              BREAK;}}}
            }}}}}
         
      }
 
 
 
 
ta ai....
Postado

Bom , estou disposto a ajudar, mas tentei ler do inicio do post e nao entendi o q quer executar.. kkkk.. desculpe.

inclusive  olhando o ultimo codigo q postou tem algumas coisas extranhas como  no "void main". alem de no começo ser com o pic 16f628 e agora com o 16f877a.

você falou de tempo em segundo para executar a funcao, nem timer ta ativado no codigo ..

outra coisa... particularmente nao consigo saber o q seria essa expressao  #include <personalpic1.h>. livraria para o lcd?

minha opiniao seria você descrever realmente o q precisa, alem do hardware q pretende fazer (quantos botes de entrada, qts saidas,vai ler algo analogico, cristal) e ai juntos começariamos a escrever algo, talves bem mais simplificado. sem bugs..

 

abraço CesarLG

Postado

Bom , estou disposto a ajudar, mas tentei ler do inicio do post e nao entendi o q quer executar.. kkkk.. desculpe.

inclusive  olhando o ultimo codigo q postou tem algumas coisas extranhas como  no "void main". alem de no começo ser com o pic 16f628 e agora com o 16f877a.

você falou de tempo em segundo para executar a funcao, nem timer ta ativado no codigo ..

outra coisa... particularmente nao consigo saber o q seria essa expressao  #include <personalpic1.h>. livraria para o lcd?

minha opiniao seria você descrever realmente o q precisa, alem do hardware q pretende fazer (quantos botes de entrada, qts saidas,vai ler algo analogico, cristal) e ai juntos começariamos a escrever algo, talves bem mais simplificado. sem bugs..

 

abraço CesarLG

beleza.

sim a biblioteca personalpic1 é uma biblioteca alterada para o lcd. 

postei dois microchips diferentes porque uso vários em meus trabalhos, porém o codigo é o mesmo. 

não, não tem nem um timer ativado, a contagem eu faço por incremento, usando um delay de milisegundos, para poder visualizar a contagem e ficar mais fácil para zerar. 

Este codigo que que postei é para um sistema de retrolavagem. vou tentar explicar :

 

http://tinypic.com/view.php?pic=29wr7z6&s=8#.U5nZ5vldUvc

http://tinypic.com/view.php?pic=29wr7z6&s=8#.U5nZ5vldUvc

 

  bom são 5 valvulas, o programa consiste em um contador programavel pelo menu a pessoa coloca ali quanto tempo quer de intervalo 1 2 horas... estc.

quando uma bomba liga, o micro recebe o sinal e ativa um rele que liga as válvulas com o circulo amarelo, quando o tempo chegar no programado ex:2 horas; ele entra em retro lavagem, as valvulas amarelas desativam, e ativam as vermelhas, depois de transcorrer o tempo programado, aprox: 120 segundos pelo padrão, acionasse as com circulo verde, e depois zera o contador e volta as amarelas, quando a bomba desliga o contador para e as válvulas desligam.  

Postado

Seguinte. Essa dica vale para todos.

 

Sempre que um código dessa tamanho dá problema, fica difícil identificar a origem do mesmo. Leva-se muito tempo analizando, debugando, corrigindo erros.

 

Vou seguir a abordagem do forum do CCS:

 

Poste um programa pequeno, completo, com os fuses, o PIC usado e o clock também e que tem o mesmo problema que você encontra no seu código grande.

 

Fora isso, não tem como ficar analisando códigos pelo motivo acima.

 

Falou

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!