DS18B20 nevrací teplotu

Zdravím všechny a žádám o radu, kde bych mohl mít chyby v kódu. Proměnné tempL a tempH zobrazuji na displeji, ale jejich hodnoty jsou 0.

#include <xc.h>
#include <stdio.h>
#include <stdlib.h>


#define _XTAL_FREQ 4000000

#define C PORTEbits.RE0
#define TRE TRISEbits.TRISE0


__CONFIG(FOSC_XT & WDTE_OFF & PWRTE_OFF);

/*-------------------------------------------------------------*/
//Komunikace s DS 18B20
/*-------------------------------------------------------------*/
 
void OWReset()
{
  int out;
  C=0;                               
  TRE = 0;
  __delay_us(480);                   
  C=1;
  TRE = 1;                          
  __delay_us(70);                    
    if(C == 0) 
        out=0;                       
    else
        out=1;                               
  __delay_us(410);                   
  //return(out);
 }

void OWWriteBit(int bita)
{
        if (bita)
        {
                C=0;
                TRE = 0;
                __delay_us(6);
                C = 1;
                TRE = 1; 
                __delay_us(64); 
                
        }
        else
        {
                C=0;
                TRE = 0;
                __delay_us(60);
                C=1;
                TRE = 1;
                __delay_us(10);
                
        }
}

void OWWriteByte(int data)
{
        int loop;

        for (loop = 0; loop < 8; loop++)
        {
                OWWriteBit(data & 0x01);

                data >>= 1;
        }
}
int OWReadBit(void)
{
        int result;

        C=0;
        TRE = 0;
        __delay_us(6);
        C=1;
        TRE = 1;
        __delay_us(9);
        result = C & 0x01;
        __delay_us(55);
        return result;
}

int OWReadByte(void)
{
        int loop=0, result=0;

        for (loop = 0; loop < 8; loop++)
        {
                result >>= 1;

                if (OWReadBit())
                        result |= 0x80;
        }
        return result;
}

/*-------------------------------------------------------------*/

void main()
{
    
        int tempL, tempH;
        //int out;
        
        OWReset();
        OWWriteByte(0xCC);  // skip ROM
        OWWriteByte(0x44);   // convert T
        __delay_ms(750);
        OWReset();
        OWWriteByte(0xCC);  //skip ROM
        OWWriteByte(0xBE);   //read scratchpad
        tempL = OWReadByte();   //cteni spodniho bytu teploty
        tempH = OWReadByte();   //cteni horniho bytu teploty

}   

Jinak doplňuji, že čidlo komunikuje s procesorem PIC16F727.

Po resetu jsou vývody PORTE nastaveny do režimu analogové vstupy(ANSELE = 0b00000111).
Pro přepnutí na I/O režim musíš nastavit registr ANSELE = 0b00000000, viz datasheet.

Jj, nenastavit si ANSELx je skvělá sranda, taky jsem tak kdysi zabil dva dny než jsem na to přišel… Shodou okolností taky u DS18B20.

Díky, o víkendu vyzkouším.

Bylo to přesně tímto…díky :wink: