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

Atmega32+C+DS18B20 czy to błąd w konwersji temperatury?

mazi35 14 Paź 2008 20:04 1652 5
  • #1 5631722
    mazi35
    Poziom 17  
    Witam

    Oto kod czy ktoś mógłby rzucić okiem gdzie jest błąd? Ogólnie wyświetla przez cały czas 85 stopni.

    Tak wygląda sama konwersja w czujniku:

    void LCD_18b20_multidrop(/*unsigned char posx, unsigned char posy,*/ unsigned char *adrr)
    {
    	unsigned char i,tablica[4];
    	signed char alarm;
    	int temp;
    
    	ow_reset();
    	ow_byte_wr(0xCC);
    	ow_byte_wr(0x44);
    	delay_ms(2000);
    
    	ow_reset();
      ow_byte_wr(0x44);


    To obliczenie i wyświetlenie temperatury:

    temp=0;
    	temp = tablica[1]<<4 | tablica[0]>>4;
    
    	if (tablica[1]&0xF8) temp=-temp;
    	LCD_xy(0,0);
    	LCDnapis("Max: ");
    	LCD_putint(tablica[2]);
    	LCDnapis("Min: ");
    	LCD_putint(tablica[3]);
    	LCD_xy(0,1);
    
    	LCD_putint(temp);
    	LCDznak('.');
    	LCD_putint((tablica[0] & 0x0F)*625/1000);
    	LCDznak('C');




    dodam, że wyszukiwanie DS18B20 po adresie odbywa się prawidłowo. Inicjalizacja wyświetlacza prawidłowa. Czy może błąd tkwi w konwersji?
    Z góry dziękuję za pomoc
  • #2 5632855
    HubertMD
    Poziom 11  
    A o to mój kawałek kodu :
      ow_reset(); 
          write_byte(0xcc);           // pomin czytanie nr 
          write_byte(0x44);          // nakaz pomiar temperatury 
          waitms(250);
    	  waitms(250); 
    	  waitms(250);              
          ow_reset(); 
          write_byte(0xcc);           // pomin czytanie nr 
          write_byte(0xbe);           // zadaj odczytania temperatury 
          tempL = read_byte();    // pierwszy bajt mlodszy 
          tempH = read_byte();    // drugi bajt starszy 
            
    		if(DQ==DQ1)
    		{
    		write_command(0xc0);
    		write_text("T1:");
    		}
    		if(DQ==DQ2)
    		{
    		write_command(0xc8);
    		write_text("T2:");
    		}
    		tempdz = tempL & 0x0F;
    		tempL >>= 4;
    		if(tempH & 0x80)
    		{
    			write_text("-");
    		}
    		tempH <<= 4;
    			
    		tempL |= tempH;
    		itoa(tempL,buft,10);
    		waitms(2);
    		write_text(buft);
    		write_text(".");
            ulamek = tempdz * 625;
            tempdz = ulamek / 1000;      // tmp1 musi byc w granicach od 0 do 9 
            if (tempdz ==10) tmp1 = 0;
    		itoa(tempdz,buft,10);
    		write_text(buft);


    Nie potrzebne jest aż 2000 ms wystarczy 750ms.
    Gdzie jest Komenda odczytu temperatury 0x BE?
    spójrz jak jest u mnie!
  • #3 5633146
    mazi35
    Poziom 17  
    Siema tak wygląda całość.

    void LCD_18b20_multidrop( unsigned char *adrr)
    {
    	unsigned char i,tablica[4];
    	signed char alarm;
    	int temp;
    
    	ow_reset();
    	ow_byte_wr(0xCC);
    	ow_byte_wr(0x44);
    
    	delay_ms(2000);
    
    	ow_reset();
    
    	ow_byte_wr(0x55);
    	for (i = 0; i<8; i++)
    	{
    		ow_byte_wr(*adrr);
    		adrr++;
    	}
    
    	ow_byte_wr(0xBE);
    	for (i=0;i<4;i++)
    		{
    		tablica[i]=ow_byte_rd();
    		}
    	ow_reset();
    	temp=0;
    	temp = tablica[1]<<4 | tablica[0]>>4;
    
    	if (tablica[1]&0xF8) temp=-temp;
    	LCD_xy(0,0);
    	LCDnapis("Max: ");
    	LCD_putint(tablica[2]);
    	LCDnapis("Min: ");
    	LCD_putint(tablica[3]);
    	LCD_xy(0,1);
    
    	LCD_putint(temp);
    	LCDznak('.');
    	LCD_putint((tablica[0] & 0x0F)*625/1000);
    	LCDznak('C');
    


    w tej chwili ma wyświetlać temp z jednego czujnika(to nieszczęsne 85 stopni) oraz max i min temp.

    Pozdrawiam
  • #4 5633630
    jmika
    Poziom 1  
    A czujniki temperatury mają zasilanie czy pracują w trybie parasite power?
    Temperatura 85C to stan rejestrów po resecie układu czyli między innymi po zaniku zasilania. Jeśli w czasie konwersji temperatury układ nie ma zasilania to może być właśnie taki efekt końcowy.
  • #5 5635139
    mazi35
    Poziom 17  
    jmika napisał:
    A czujniki temperatury mają zasilanie czy pracują w trybie parasite power?
    Temperatura 85C to stan rejestrów po resecie układu czyli między innymi po zaniku zasilania. Jeśli w czasie konwersji temperatury układ nie ma zasilania to może być właśnie taki efekt końcowy.


    czyli to oznacza, że konieczne jest podłączenie rezystora 4,7k? bo w tej chwili mam bezpośrednie podłączenie do płytki.

    pozdrawiam
    '
    ps nie sorry płytka ma już podciągnięte 4,7k wg rysunku.
  • #6 5637545
    mazi35
    Poziom 17  
    Siema

    Podam też coś dziwnego, że w jednym programie pomiar temperatury działa poprawnie natomiast w drugim coś jest nie tak. Wnioskując można wykluczyć wszelkie "sprzętowe" nieścisłości. Dlatego sadzę że to coś w kodzie jest błędne.

    Pozdrawiam
REKLAMA