Eeprom duvidas de conversão!

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

Eeprom duvidas de conversão!

Mensagempor verd » 02 Mar 2010 17:11

Olá companheiros!

Estou implementando um dataloger na minha estação, aonde de hora em hora será escrito na eeprom do pic, a humidade , temperatura, quantdade de chuva e a hora que foi realizado a leitura.

implementei a escrita e a leitura, só que estou com problemas com as variaveis de temperatura humidade e chuva, estou fazendo alguma conversão errada, a hora eu consegui fazer funcionar, mas as outras variaveis quando eu vou ler estas variaveis da memoria elas se atualizam.

eu estou pegando as variaveis e escrevendo na memória, ai leio o endereço da memoria referente ao que desejo, e envio para o lcd, funciona tudo ok, o relógio funciona blz, mas as variavei quando vão aparecer no display se atualizam..

e o mikroC esta dando uma warning: Implicit conversion of pointer to int
Implicit conversion of int to ptr



desculpe a bagunça do código, soi iniciante em C:

segue meu codigo:

Código: Selecionar todos

char txt1[13]; //  variavel float temperatura
char txt2[13]; // variavel float umidade
//*******************************************************
char tmp; 
char umi;
char di;
char me;
char an;
char hr;
char mn;
char sg;
char ch;
 int conti;
 unsigned short set ;
//***********************************************************
 void eprom(){



Eeprom_Write(0x2103,segundo); //variavel rtc
Eeprom_Write(0x2104,minuto);//variavel rtc
Eeprom_Write(0x2105,horas);//variavel rtc
Eeprom_Write(0x2106,dia);//variavel rtc
Eeprom_Write(0x2107,mes);//variavel rtc
Eeprom_Write(0x2108,ano);//variavel rtc

Eeprom_Write(0x2100,txt1); // variavel float temperatura
Delay_ms(20);
Eeprom_Write(0x2101,txt2); // variavel float umidade
Delay_ms(20);
 Eeprom_Write(0x2102,chuvv); // variavel int quantidade de chuva
 Delay_ms(20);


}
//***********************************************************
 Lcd_Cmd(_LCD_TURN_ON);
    Lcd_out(1,1,"Ultima Leitura");
     delay_ms(800);
    Lcd_Cmd(_Lcd_CLEAR);
       Lcd_Cmd(_LCD_TURN_OFF);


 sg = Eeprom_read(0x2103);
 mn = Eeprom_read(0x2104);
 hr = Eeprom_read(0x2105);
 di = Eeprom_read(0x2106);
 me = Eeprom_read(0x2107);
 an = Eeprom_read(0x2108);



    Lcd_Cmd(_LCD_TURN_ON);

    BCD(1,5,di);            //conversão da variável horas para BCD
   LCD_Chr_Cp('/');    //escreve no display LCD
   BCD(1,8,me);          //conversão da variável minuto para BCD
   LCD_Chr_Cp('/');    //escreve no display LCD
   BCD(1,11,an);         //conversão da variável segundo para BCD

   BCD(2,5,hr);              //conversão da variável dia para BCD
   LCD_Chr_Cp(':');    //escreve no display LCD
   BCD(2,8,mn);             //conversão da variável mes para BCD
   LCD_Chr_Cp(':');    //escreve no display LCD
   BCD(2,11,sg);             //conversão da variável ano para BCD
   delay_ms(4000);
   Lcd_Cmd(_Lcd_CLEAR);
        Lcd_Cmd(_LCD_TURN_OFF);
   delay_ms(200);



          Lcd_Cmd(_LCD_TURN_ON);

Lcd_Out(1,1,"Temp:");
Lcd_Out(2,1,"Umid:");

tmp = Eeprom_read(0x2100);
Lcd_Out(1,6,tmp);
Lcd_Chr(1,14,223);
Lcd_Chr(1,15,'C');



    umi = Eeprom_read(0x2101);
    Lcd_Out(2,6,umi);       // Exibe o valor da posição 0x34
    Lcd_Chr(2,14,'%');

    delay_ms(4000);
    Lcd_Cmd(_Lcd_CLEAR);
    Lcd_Cmd(_LCD_TURN_OFF);

    intToStr(chuv, chuvv);
    Lcd_Cmd(_LCD_TURN_ON);
    Lcd_Cmd(_Lcd_CLEAR);
    Lcd_Out(1,1,"Chuva:");

    ch = Eeprom_read(0x2102);

    Lcd_Out(1,7, ch);
    Lcd_Chr(1,15,'m');
    Lcd_Chr(1,16,'m');
    delay_ms(2000);
    Lcd_Cmd(_Lcd_CLEAR);
    Lcd_Cmd(_LCD_TURN_OFF);





}

      set++;
       if ( set == 1000){
       eprom();
       set=0;
         }

verd
Byte
 
Mensagens: 262
Registrado em: 28 Ago 2008 10:15

Mensagempor Andre_Cruz » 02 Mar 2010 17:32

verd,

Você esta armazemando a temperatura em uma matriz de 14 posições do tipo char, para salvar na EEPROM você precisa converter para int ou float e salvar 8 bits em um endereço de memória e 5 bits em outra posição de memória.

Tem um tópico não me lembro bem o nome, que tem dicas básicas e rotinas básicas para C, e essa técnica de salvar 8 bits em 8 bits tem lá explicado.

Espero ter ajudado.

Lembre-se de quando resolver postar a solução, pode ser útil para outros amigos aqui do forum.

Abraço
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor verd » 02 Mar 2010 17:38

Valeu Andre_Cruz! to meio perdido ainda com as conversões, mas ja é um caminho!!!

valeu!!

opa certeza, além de que, o que movimenta o forum são as respostas das duvidas!!
verd
Byte
 
Mensagens: 262
Registrado em: 28 Ago 2008 10:15

Mensagempor verd » 03 Mar 2010 09:09

O caminho é por ai mesmo André!

pegueio o contador de chuva que é um int e estava convertendo para string para visualizar no display, ai eu estava gravando na eeprom a string, quando eu lia a eprom ele entendia a string, agora eu peguei a variavel int da chuva e armazenei na eprom, ai leio a eprom e envie para o display com conversão BCD que ja tinha a função para a hora é pimba! funciona beleza!!

agora preciso converter uma long em int, to fuçando no forum se encontro o topico q você indicou, se alguem lembrar o nome eu agradeço!!!

abraço a todos!!
verd
Byte
 
Mensagens: 262
Registrado em: 28 Ago 2008 10:15

Mensagempor fabim » 03 Mar 2010 09:16

long para int ?
como assim ?

Código: Selecionar todos
 
  long =  highest  higher high  low

  int    =                        hig   low
 


C ta falando em Signed ? ai tudo bem, masi de qualquer forma.

long contagem
int resultado

contagem = 123654789;

resultado = (int *)contagem;

Apesar de todo compilador ja entender que é implicito, e puxar só os dois bytes lsb, tu faz esse comando aí pro compilador não ficar dando warning..
Mano, ve só.
Sou responsável pelo que escrevo!!! E não pelo que você entende !!!
fabim
Dword
 
Mensagens: 5001
Registrado em: 16 Out 2006 10:18
Localização: aqui uái!!!?

Mensagempor verd » 03 Mar 2010 09:26

Faaaala Fabim!

Vou testar! to meio perdidão em C ainda num sei o que faz u que exatamente! hehe, mas ta indo to aprendendo!!!

valeu!!
verd
Byte
 
Mensagens: 262
Registrado em: 28 Ago 2008 10:15

Mensagempor verd » 03 Mar 2010 11:17

para ser mais especifico com meu problema:

estou tentando pegar os valores do SHT temperatura 14bits e humidade 12bits e armazenar na memória, e não consigo! é porque a memoria só vai até 8 bits por endereço certo?
verd
Byte
 
Mensagens: 262
Registrado em: 28 Ago 2008 10:15

Mensagempor ze » 03 Mar 2010 12:03

tenho funcs sht---pic mas não vou te dar pois precisei disto recentemente e vc não me ajudou! Mas como sou bonzinho, contente-se com:
http://www.sensirion.com/en/pdf/product ... _SHTxx.pdf
http://www.sensirion.com/en/Installatio ... ode_C1.zip
tinha outro link com as funções quase pro pic, mas perdi.
se falar que é só funciona pra 8051 e não pic vou aí te dar um cocão!
tá bão ja sei. isso vc já conseguiu, mas eu quis registrar, dá licença!
agora o seu dilema é gravar int na eeprom? veja + isso:
http://www.asm51.eng.br/phpbb/viewtopic.php?t=9244
pra facilitar as coisas, use 2 bytes pra gravar o int mesmo sobrando bits.
de nada...
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32

Mensagempor Andre_Cruz » 03 Mar 2010 12:44

verd,

Estou mexendo com assembler faz um tempinho, e deixei o C de lado.
No compilador hitech eu faço assim:

Posição da EEPROM = variavél;
Posição da EEPROM+1 = variavél << 8;

Na primeira você salva o byte menos significativo e no segundo procedimeto você salva o byte mais significativo.

É por ai a lógica, não me lembro bem, mas o pessoal aqui do forum sabe te falar com certeza.

Abraço

André
Andre_Cruz
Word
 
Mensagens: 559
Registrado em: 03 Jan 2009 14:06

Mensagempor verd » 03 Mar 2010 13:44

Fala lellis!! oloko meu!! humm.. manjei, vou ver como implemento aqui!! brigadão!!

Fala André!! entendi o procedimento vou ver o que o mikroC aceita!!

Obrigado amigos! postos os resulados, sendo bomns ou ruins! hehe
verd
Byte
 
Mensagens: 262
Registrado em: 28 Ago 2008 10:15

Mensagempor ffc » 03 Mar 2010 13:56

verd como o fabim disse você pode usar no mikroC os comandos:
Lo() e Hi() pois isso vai dividir seu valor de 16 bits para gravar em 2 bytes da mémoria.

não esqueça de fazer um #include <built_in.h> para que o mikroC aceite estes comandos.

para juntar os bytes basta você ler da seguinte forma:
var1 = Eeprom_read(bits mais segnificativos)<<8;
var1 = Var1 + Eeprom_read(bits menos significativos);

Abraços,
Fernando.
ffc
Bit
 
Mensagens: 6
Registrado em: 28 Out 2008 20:56

Mensagempor verd » 04 Mar 2010 07:56

Ae pessoal Consegui!! a unica coisa é que minha variavel tempt era float com 3 casas após a virgula, tive que transformar ele para int.

mas beleza resolvido!! valeu pela atenção te todos!!!!

segue o codigo: armazenando um int em 2 bytes e enviando para o lcd:
Código: Selecionar todos
int tempt;


EEPROM_WRITE(0x2101,tempt);
delay_ms(20);
EEPROM_WRITE(0x2102,tempt >>8);
 delay_ms(20);

Lcd_Out(1,1,"Temp:");
tmp = EEPROM_READ(0x2101) | (unsigned int)EEPROM_READ(0X2102)<<8;
delay_ms(20);
Lcd_Chr(1,13,223);
Lcd_Chr(1,14,'C');
inttostr (tempt,tmp);
Lcd_Out(1,6,tmp);
verd
Byte
 
Mensagens: 262
Registrado em: 28 Ago 2008 10:15


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x