Ir ao conteúdo
  • Cadastre-se
Luan Borges

PIC Medindo temperatura com MAX6675 & PIC16f876A

Recommended Posts

Olá a todos. To com sérios problemas com um MAX6675 e comunicação SPI. Mano do céu, se tem um coisa que sou, é leigo com essa negocio de I2C e SPI. RX/TX  até vai. Mas Enfim...

 Só quero comunicar ele com meu pic e fazer aparecer no lcd a temperatura medida, só preciso que me ajudem com o código, porque eu realmente não sei muito de SPI. Quem pode me ajudar, ficaria muito agradecido. Obrigado <3 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu encontrei um na internet, e estou usando ele por enquanto. Ele dar uns bugs, as vezes a temperatura está em 180, e ele fala q está em 200. Tenho uma boa leitura na faixa dos 350 á 470º

 

//        SPI           //
unsigned char spi_out_H;
unsigned char spi_out_L;
unsigned int  spi_out;
unsigned char buffer;
unsigned char NTC_temp[7];

 

......

 

void main()

...

//     SPI
    SPI1_Init();

....

 

 

 

     

 

           

//===================================  BASE T  2
  if(baseT2 ==4)
  {baseT2 = 0x00;

        //------------------ S P I ---------------------/
            rc0_bit = 0;
            spi_out_H = Spi_Read(buffer);
            spi_out_L = Spi_Read(buffer);
            rc0_bit = 1;
            Delay_us(20);
            spi_out = spi_out_H*243+spi_out_L;
            spi_out = spi_out >> 4;
            IntToStr(spi_out,NTC_temp);

            LCD_Out (2,1, "Ferro:");
            LCD_Chr_Cp (NTC_temp[2]);
            LCD_Chr_Cp (NTC_temp[3]);
            LCD_Chr_Cp (NTC_temp[4]);
            LCD_Chr_Cp (NTC_temp[5]);
            LCD_Chr_Cp (223);
            LCD_Out_Cp ("C");
            Delay_ms(300);

        //----------------------------------------------/


  }
 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Luan Borges ,

 

Código errado.... leia o datasheet, vai ver que dos 16 bits que está recebendo, apenas 12 sao significativos, sendo que 5 estão na parte baixa, e 7 na parte alta.

Tem de manipular eles, ANTES de fazer a multiplicação para a conversão.

E também nao entendi o porque que multiplica por 243, eu faria por 256 e depois somaria a parte baixa.

Mas antes tem de manipular os bits para as posições corretas.

 

Infelizmente não entendo nada de C, vamos esperar aparecer alguém com mais conhecimento para te ajudar mais.

 

Paulo

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
6 minutos atrás, aphawk disse:

@Luan Borges ,

 

Código errado.... leia o datasheet, vai ver que dos 16 bits que está recebendo, apenas 12 sao significativos, sendo que 5 estão na parte baixa, e 7 na parte alta.

Tem de manipular eles, ANTES de fazer a multiplicação para a conversão.

E também nao entendi o porque que multiplica por 243, eu faria por 256 e depois somaria a parte baixa.

Mas antes tem de manipular os bits para as posições corretas.

 

Infelizmente não entendo nada de C, vamos esperar aparecer alguém com mais conhecimento para te ajudar mais.

 

Paulo

Obrigado paulo. É.. Você poderia me fala mais a respeito de como é feita a leitura desses bits? Como funciona a comunicação 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Luan Borges ,

 

Sim, é uma simples comunicação SPI, voce tem de ler 16 bits e depois “corrigir” essa leitura.

 

Na verdade eu já fiz isso em Basic com o Bascom, é bem simples pois nele tem uma função chamada Shift_in , que gera todos os sinais para mim, eu digo que quero receber os 16 bits em uma variável tipo Word, e pronto, aparece a leitura lá.... depois faço um simples Shift de 3 casas à direita nessa variável e pronto, tenho meus 12 bits que me interessam.

 

Agora, essa leitura é meio engenhosa... com 12 bits voce obtem um numero entre 0 e 4095, mas reparou que esse CI só lê até 1024 graus ????

 

É que ele tem a resolução de 0,25 graus !

 

Entao, para acertar isso, eu passo para uma variável float e simplesmente divido por 4 e pronto, tenho o resultado.

 

Eu acho que existe algo do tipo Shift_in no C, que permite a leitura bem simples, dá uma procurada ok ?

 

Ah, pegue o datasheet para você entender melhor.

 

Paulo

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
59 minutos atrás, aphawk disse:

@Luan Borges ,

 

Sim, é uma simples comunicação SPI, voce tem de ler 16 bits e depois “corrigir” essa leitura.

 

Na verdade eu já fiz isso em Basic com o Bascom, é bem simples pois nele tem uma função chamada Shift_in , que gera todos os sinais para mim, eu digo que quero receber os 16 bits em uma variável tipo Word, e pronto, aparece a leitura lá.... depois faço um simples Shift de 3 casas à direita nessa variável e pronto, tenho meus 12 bits que me interessam.

 

Agora, essa leitura é meio engenhosa... com 12 bits voce obtem um numero entre 0 e 4095, mas reparou que esse CI só lê até 1024 graus ????

 

É que ele tem a resolução de 0,25 graus !

 

Entao, para acertar isso, eu passo para uma variável float e simplesmente divido por 4 e pronto, tenho o resultado.

 

Eu acho que existe algo do tipo Shift_in no C, que permite a leitura bem simples, dá uma procurada ok ?

 

Ah, pegue o datasheet para você entender melhor.

 

Paulo

infelizmente continuo sem entender muito dessa comunicação, depois vou tirar um dia e estudar ela, enfim..

 

ficou assim

 

rc0_bit = 0;
            spi_out_H = Spi_Read(buffer);
            spi_out_L = Spi_Read(buffer);
            rc0_bit = 1;
            Delay_us(20);
            
            spi_out = spi_out_H*256+spi_out_L;
            spi_out = spi_out >> 4;
            Delay_ms(300);
            spi_out_ = spi_out - 21;  // Menos 21 porque foi a diferencia de temperatura q estava marcando  
            
            IntToStr(spi_out_,NTC_temp);
            lcd_out(1,1,NTC_temp);

 

Criei  "float  spi_out_ " e  disse q o spi_out era ele, e pronto, tudo pela ordem, sem bugs, ah, e multiplique ali por 256 como você disse. Mas claro, isso tudo até agora está na teoria, vamos ver na pratica quando meu ci chegar kkkk porque na teoria tudo é lindo 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Luan Borges ,

 

voce fez a multiplicação ANTES de corrigir os bits das duas variáveis de 8 bits !

Primeiro tem de corrigir os bits, e só depois tem de fazer a multiplicação por 256 , somar com o byte menos significativo, e finalmente dividir por 4, tendo assim o resultado com resolução de 0,25 graus Celsius.

 

Acho mais fácil voce criar uma variável tipo word ( 16 bits ), pegar spi_out_H e multiplicar por 256 e colocar nessa nova variável, e adicionar a ela spi_out_L, e depois faça um shift de todos os bits dessa variàvel 3 casas para a direita, eliminando os bits indesejáveis. Depois transfira esse valor para uma variável Float, e divida por 4, e pronto, a temperatura estará correta nessa variável, é só mandar pro display.

 

 

adicionado 9 minutos depois

@Luan Borges ,

 

Sobre entender a comunicação SPI, imagine que nada mais é do que transmitir  um bit a cada vez que ocorre um pulso de clock em um determinado pino do CI.

 

Assim, no primeiro pulso de clock, aparece o bit MSB , e a cada clock um novo bit é transmitido, até chegar ao ultimo que é o LSB.

 

No caso desse seu CI, o resultado é apresentado em 16 bits no total, então tem de gerar 16 pulsos de clock, entendeu ?

 

É bem mais simples do que a I2C, e bem mais rápida também.

 

Paulo

 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
11 minutos atrás, aphawk disse:

@Luan Borges ,

 

voce fez a multiplicação ANTES de corrigir os bits das duas variáveis de 8 bits !

Primeiro tem de corrigir os bits, e só depois tem de fazer a multiplicação por 256 , somar com o byte menos significativo, e finalmente dividir por 4, tendo assim o resultado com resolução de 0,25 graus Celsius.

 

Acho mais fácil voce criar uma variável tipo word ( 16 bits ), pegar spi_out_H e

multiplicar por 256 e colocar nessa nova variável, e adicionar a ela spi_out_L , depois faça um shift de todos os bits dessa variàvel 3 casas para a direita, eliminando os bits indesejáveis. Depois transfira esse valor para uma variável Float, e divida por 4, e pronto, a temperatura estará correta nessa variável, é só mandar pro display.

 

Paulo

 

 

 

 

 

tipo, spi_out_H  = spi_out_H*256;

  ai depois:  ""word"" = spi_out_H+spi_out_L;

  ai depois :   "word" = "word">>3;

                      "float" = "word" ;

                      "float"= "float"/4;  ??                

       

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 minutos atrás, Luan Borges disse:

tipo, spi_out_H  = spi_out_H*256;

  ai depois:  ""word"" = spi_out_H+spi_out_L;

  ai depois :   "float" = "word" ; ?                  

       

 

Não, porque eu creio que você definiu spi_out_ como tipo Char , e ela é de 8 bits apenas. 

 

Tem de criar uma nova variável e definir ela como 16 bits. Aí sim a multiplicação vai caber nela !

 

Desculpe eu não entender essa linguagem melhor kkkkk 

 

Paulo

  • Haha 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
8 minutos atrás, aphawk disse:

 

Não, porque eu creio que você definiu spi_out_ como tipo Char , e ela é de 8 bits apenas. 

 

Tem de criar uma nova variável e definir ela como 16 bits. Aí sim a multiplicação vai caber nela !

 

Desculpe eu não entender essa linguagem melhor kkkkk 

 

Paulo

só mudar isso então?

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Luan Borges ,

 

Em teoria, sim, é só fazer todo o processo que eu citei, com a variável de 16 bits.

 

Eu não sei nem como declarar essa variável nessa linguagem kkkkkk !

 

Aliás, não uso Pics desde 2012.... mas a parte eletrônica é quase tudo igual, então arrisco meus palpites aqui ...

 

Paulo

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
54 minutos atrás, aphawk disse:

@Luan Borges ,

 

Em teoria, sim, é só fazer todo o processo que eu citei, com a variável de 16 bits.

 

Eu não sei nem como declarar essa variável nessa linguagem kkkkkk !

 

Aliás, não uso Pics desde 2012.... mas a parte eletrônica é quase tudo igual, então arrisco meus palpites aqui ...

 

Paulo

vou fazer aqui.

 

long - 16bit - variáveis inteiras sem sinal, capacidade de 0 a 65535

signed long - 16bits - variáveis inteiras com sinal, capac. de –32768 a 32767

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

até ontem a tarde long era 32 bits...

Em 17/09/2018 às 00:15, Luan Borges disse:

long - 16bit - variáveis inteiras sem sinal, capacidade de 0 a 65535

signed long - 16bits - variáveis inteiras com sinal, capac. de –32768 a 32767

bem... as vezes 24 ... mas isso é viadagem do compilador.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 27/09/2018 às 12:19, Isadora Ferraz disse:

até ontem a tarde long era 32 bits...

bem... as vezes 24 ... mas isso é viadagem do compilador.

Eu me baseio por essa tabela abaixo, caso eu estiver errado, culpe a ela kkk e nos corrija 

Captura de Tela (24).png

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Luan Borges ,

 

Acho melhor você usar uma tabela de um compilador C usado com os Pics :

 

Tipos+de+Variables+PIC+C.jpg

 

Para mim também tem muita novidade nessa tabela ... até falta um tipo que eu usei algumas vezes, a Double Float ( 8 bytes ) para números maiores do que 10 ^ 28 ...

 

É .... prefiro o meu velho Basic kkkk

 

Paulo

  • Curtir 2
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boas... De fato depende do compilador e mc. De fato já vi char de 32 bits. 1/2 que fora do padrão ansi c... O que disse de memória é C 'puro' lá... dos anos mil e novecentos e ... xá pra lá..

Caso 'se case' com o mc e compilador, tudo bem. Vai doer só um pouco se algum dia você queira meio que 'evoluir' pra outras plataformas ... Vai quê...

  • Curtir 3
  • Haha 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 01/10/2018 às 08:37, Isadora Ferraz disse:

Boas... De fato depende do compilador e mc. De fato já vi char de 32 bits. 1/2 que fora do padrão ansi c... O que disse de memória é C 'puro' lá... dos anos mil e novecentos e ... xá pra lá..

Caso 'se case' com o mc e compilador, tudo bem. Vai doer só um pouco se algum dia você queira meio que 'evoluir' pra outras plataformas ... Vai quê...

 

Isa ....

 

Acho que hoje não se ensina mais sobre o ANSI C, todo aquele esforço para padronizar foi em vão ... aliás me lembra os famosos arquivos ansi.sys do saudoso MS-DOS, lembra deles ?

 

Estamos ficando obsoletos kkkkkkk

 

Paulo

  • Curtir 1
  • Haha 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×