logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Temperatura w DS18B20 w fahrenheitach, zamiana na celcjusze?

mcjack 19 Maj 2008 19:49 1655 1
REKLAMA
  • #1 5157856
    mcjack
    Poziom 11  
    Posty: 27
    na pcozatku mam pytanie czy czujnik DS18B20 ma jakies rejestry ktore nie są zerowane po wylaczeniu zasilania. Pytam bo kupilem 2 czujniki na allegro(cena 3,50) i wogole nie wiadomo co z nich odczytuje.... kazdy inaczej pokazuje. Poszedlem do kolegi, pozyczyl mi na chwile swoj czujnik i pokazuje dobrze temeperature na moim sofcie i sprzecie. Wiec kupilem nowy w sklepie (10 PLN) i pokazuje temperature (chyba dobrze) ale w fahrenheit'ach. Takze przed tym jak zaczne cos ustawiac wole sie upewnic Was czy aby to zmienic na celcjusze nalezy poustawiac rejestry..?
    Wg. tego co wyczytalem z Datasheeta kod korygujacy powinien wygladac tak:
    
    wire1_init();
    wire1_write_byte(0x4e);
    wire1_write_byte(0x00);
    wire1_write_byte(0x00);
    wire1_write_byte(0x07);
    

    Dobrze???

    A oto dla pewności mój cały kod:
    
    #include <util\delay.h>
    #include <avr/io.h>
    //#include <util/delay_basic.h>
    //
    #define sbi(port, bit) (port) |= (1 << (bit)) 
    #define cbi(port, bit) (port) &= ~(1 << (bit)) 
    
    #define WIRE1_PORT PORTD 
    #define WIRE1_DDR DDRD 
    #define WIRE1_PIN PIND 
    #define WIRE1_CONNECT 7 
    
    
    #define WIRE1_0 sbi(WIRE1_DDR,WIRE1_CONNECT);cbi(WIRE1_PORT,WIRE1_CONNECT); //0 na wyjscie 
    #define WIRE1_1 sbi(WIRE1_DDR,WIRE1_CONNECT);sbi(WIRE1_PORT,WIRE1_CONNECT); //1 na wyjscie
    
    unsigned char test, tout; 
    unsigned char test2;
    volatile unsigned char przycisk=0, menu=0; 
    volatile unsigned char temp=0; 
    volatile unsigned char liczba=0;
    
    unsigned char wire1_init(void) 
    { 
    unsigned char stan=0; 
    WIRE1_0; 
    
    //_delay_loop_2(1000); // 
    _delay_us(500); 
    WIRE1_1; 
    //_delay_loop_1(0xA0);// 
    _delay_us(60); //60
    
    if(bit_is_clear(WIRE1_PIN,WIRE1_CONNECT)) 
       { 
          stan=1; 
       } 
    //_delay_loop_2(600);// 
    _delay_us(300); 
    
    if(bit_is_set(WIRE1_PIN,WIRE1_CONNECT)) 
      { 
          stan+=2; 
       } 
    
    return stan;    
    
    } 
    
    
    
    
    
    
    
    // procedura zapisu pojedynczego bitu 
    void wire1_write_bit(unsigned char bit) 
    { 
    
    
        WIRE1_0; 
       // _delay_loop_2(30); 
       _delay_us(15); 
            if (bit==0) 
             { 
          //   _delay_loop_2(120); 
           _delay_us(60); 
             WIRE1_1; 
           //_delay_loop_2(4); 
           _delay_us(2); 
             }                              // przedluzenie dla zera 
            else 
             { 
             WIRE1_1; 
          //   _delay_loop_2(140); 
           _delay_us(70); 
             } 
                                            // jesli 1 koncz i czekaj 
    } 
    
    // procedura zapisu bajtu do urzadzenia 
    void wire1_write_byte(unsigned char bajt) 
    { 
    unsigned char i; 
           for(i = 0; i<8; i++) 
                    { 
                    wire1_write_bit(bajt & 0x01);    // wyslij bit zerowy bajtu 
                    bajt>>=1;                       // przesun w prawo i tak osiem bitow 
                    }          
    } 
    
    
    
    
    // procedura odczytu bitu od urzadzenie 1wire 
    unsigned char wire1_read_bit(void) 
    { 
            unsigned char bit; 
            WIRE1_0; 
          //  _delay_loop_2(4); 
          _delay_us(2); 
            WIRE1_1; 
          //  _delay_loop_2(40); 
          _delay_us(20); 
    if(bit_is_clear(WIRE1_PIN,WIRE1_CONNECT)) 
       { 
          bit=0; 
       } 
    else 
       { 
          bit=1; 
       } 
          //_delay_loop_2(40); 
         _delay_us(20); 
        return bit; 
    } 
    
    
    //procedura odczytu bajtu z urzadzenia 
    unsigned char wire1_read_byte(void) 
    { 
    
    unsigned char i; 
    unsigned char value = 0; 
       for (i=0;i<8;i++) 
       { 
       if(wire1_read_bit()) value|=0x01<<i; 
       } 
    return(value); 
    }
    
    
    
    void xy_lcd(unsigned char x, unsigned char y) 
    { 
          write_command((x*0x40+y)|0x80); 
    }
    
    
    	// program główny
    int main(void)
    {
    // konfiguracja portów we/wy
    DDRC = 0xC0;	//11000000			//ustawienie E=1 oraz RS=1
    DDRA= 0xF0;		//11110000			ustawienie D4=1 oraz D5=1 oraz D6=1 oraz D7=1
    
    DDRD=0;		//czujnik jest na PD7
    	
    	lcd_init();	// inicjalizacja LCD
    	int ill=0;
    	while(1)
    	{
    		ill++;
    
    		wire1_init(); 
    		wire1_write_byte(0xcc); 
    		wire1_write_byte(0x44); 
    		   
    		_delay_ms(750); 
    		wire1_init(); 
    		wire1_write_byte(0xcc); 
    		wire1_write_byte(0xbe);
    		   
    		test=wire1_read_byte();    
    		wire1_read_byte();
    
    		test2= (test>>1);	
    
    		xy_lcd(0,0);
    		char d[4]; 
    		itoa(ill,d, 10); 
    		write_text(d);
    
    
    		xy_lcd(1,0);		
    		char c[4]; 
    		itoa(test2,c, 10); 
    		write_text(c);
    		write_text("  ");
    	}
    	return 0;
    }
    



    Dziekuje za wypowiedzi:)
  • REKLAMA
  • #2 5158199
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    mcjack napisał:
    ... czy czujnik DS18B20 ma jakies rejestry ktore nie są zerowane po wylaczeniu zasilania.

    Tak , są takie 2 rejestry dla użytkownika.
    mcjack napisał:

    Wg. tego co wyczytalem z Datasheeta kod korygujacy powinien wygladac tak:

    A to czytałeś i zrozumiałeś :?:

    Cytat:

    The DS18B20 output temperature data is calibrated in degrees centigrade; for Fahrenheit applications, a lookup table or conversion routine must be used.

    lub to
    Cytat:

    Bit 7 and bits 0-4 in the
    configuration register are reserved for internal use by the device and cannot be overwritten; these bits will
    return 1s when read.


    Do kodu , też miałbym kilka zastrzeżeń :|

    I żeby nie było , że tylko marudzę:
    Cytat:

    The exact equation to convert Celsius to Fahrenheit is: F = (1.8 x C) + 32.



    Piotrek
REKLAMA