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

8051 i DS1923. Potrzebuję przykładowych programów.

ostryas 22 Sty 2007 12:47 1317 1
REKLAMA
  • #1 3473300
    ostryas
    Poziom 13  
    Posty: 121
    Pomógł: 2
    Ocena: 12
    Witam!!!
    Mam prośbę. Potrzebuję przykładowych programó w C do Ds1923(wystarczy tylko wilgotność, bez temperatury). Ds podpięty jest linią 1-wire do 51. Proszę o pomoc i z góry wielkie dzięki.
  • REKLAMA
  • Pomocny post
    #2 3480086
    grasss
    Poziom 12  
    Posty: 32
    Pomógł: 3
    Ocena: 3
    Gotowego programu nie mam, poniżej masz funkcję obsługi 1wire bez których się nie obejdziesz, musisz zrobić sobie tylko odpowiednie funkcje opóźnień, w listingu funkcje nazywają się np. waitus(x) -tzn czekaj x mikrosekund lub waitms -milisekundy, wait10us(x) -10*X mikrosekund itd.
    dodatkowo musisz przejrzeć aplikację i dopasować komendy,
    #define MATCH_ROM		0x55
    #define SKIP_ROM		0xCC
    #define CONVERT_T		0x44			//polecenia realizowane dla ds18b20
    #define READ			0xBE
    #define WRITE			0x4E
    #define EE_WRITE		0x48
    #define EE_RECALL		0xB8
    
    bit w1_reset(void);
    char w1_write(char b);
    char w1_read(void);
    unsigned char dane_one_wire[9]; 
    unsigned char *pdane_one_wire;
    /***************************************************
     Biblioteka funcji obsługi 1-Wire
     ***************************************************/
    
    sbit one_wire_IO = P0^0;							//tu dołączony jest czujnik DS1820
    //tablica do sumy kontrolnej
    code unsigned char ds_crc_tab[] =
    {
        0, 94,188,226, 97, 63,221,131,194,156,126, 32,163,253, 31, 65,
      157,195, 33,127,252,162, 64, 30, 95,  1,227,189, 62, 96,130,220,
       35,125,159,193, 66, 28,254,160,225,191, 93,  3,128,222, 60, 98,
      190,224,  2, 92,223,129, 99, 61,124, 34,192,158, 29, 67,161,255,
       70, 24,250,164, 39,121,155,197,132,218, 56,102,229,187, 89,  7,
      219,133,103, 57,186,228,  6, 88, 25, 71,165,251,120, 38,196,154,
      101, 59,217,135,  4, 90,184,230,167,249, 27, 69,198,152,122, 36,
      248,166, 68, 26,153,199, 37,123, 58,100,134,216, 91,  5,231,185,
      140,210, 48,110,237,179, 81, 15, 78, 16,242,172, 47,113,147,205,
       17, 79,173,243,112, 46,204,146,211,141,111, 49,178,236, 14, 80,
      175,241, 19, 77,206,144,114, 44,109, 51,209,143, 12, 82,176,238,
       50,108,142,208, 83, 13,239,177,240,174, 76, 18,145,207, 45,115,
      202,148,118, 40,171,245, 23, 73,  8, 86,180,234,105, 55,213,139,
       87,  9,235,181, 54,104,138,212,149,203, 41,119,244,170, 72, 22,
      233,183, 85, 11,136,214, 52,106, 43,117,151,201, 74, 20,246,168,
      116, 42,200,150, 21, 75,169,247,182,232, 10, 84,215,137,107, 53
    };
    
    //realizacja funkcji 1-WIRE RESET
    bit w1_reset(void)
    {	  
    	bit err,err_z;
    //1 	
    	one_wire_IO = 0;								//utrzymanie stanu niskiego na linii 1Wire
    	nop();
    	wait100us(5);
    													//przez wyliczony czas "time_slot"
    //2	
    	one_wire_IO = 1;									//ustawienie stanu wysokiego na linii 1Wire
    	wait10us(7);
    	err = one_wire_IO;								
    	wait100us(4);
    	wait10us(1);
    	err_z = one_wire_IO;
    	return  (!err) & one_wire_IO;						// stan niski = zwarcie na linii
    }
    //zapis lub odczyt bitu na magistralę 1WIRE
    bit w1_bit_write(bit b)
    {
    	one_wire_IO = 0;									//0
    	wait10us(1);
    	one_wire_IO = b;
    	wait10us(6);
    	b = one_wire_IO; 
    	
    	one_wire_IO = 1;
    	return (b);
    
    }
    bit w1_bit_read(void)
    {
    	bit b;
    	one_wire_IO = 0;									//0
    	waitus(1);
    	one_wire_IO = 1;
    	wait10us(1);
    	waitus(4);
    	b = one_wire_IO; 
    	return (b);
    }
    //zapis bajtu do układu 1WIRE
    char w1_write(char b)
    {
    	char i;
    	for(i=0;i<8;i++)
    	{
    		w1_bit_write( b & 0x01 );
    		b>>=1; 
    	} 
    	wait10us(10);
    	return b;
    	
    }
    //odczyt bajtu z układu 1WIRE
    char w1_read(void)
    {
    	  unsigned char i;
          unsigned char value = 0;
          for (i=0;i<8;i++)
          {
          if(w1_bit_read()) value|=0x01<<i; // reads byte in, one byte at a time and then
          // shifts it left
          wait10us(12); // wait for rest of timeslot
    		}
          return(value);  
    }




    Jak bedziesz miał działające to co powyżej to wtedy już możesz wysyłąć i odbierać dane z twojego Ds-a. Możesz skorzystać z poniższego przykładu, musisz w nim zmienić zawartość warunku if(crc==0) {tutaj odzczyt i konwersja twoich danych z DS}

    volatile float temp,tmp;
    void ds1820 (void)
    {
    	unsigned char temp_lsb,temp_msb,i,crc;
    	bit er;
    	er=w1_reset();
    	w1_reset();
    	if(er==1) //sprawdzenie czy jest DS podłączony
        {
         	w1_write(SKIP_ROM); //Read ROM
           	w1_write(CONVERT_T); 
    		waitms(400);
    		w1_reset();
    		w1_write(SKIP_ROM);
    		w1_write(READ);
    		for (i=0; i<9; i++)
    		{
    			dane_one_wire[i]=w1_read();//w1_read();
    	   	}
    	   	            // suma kontrolna z DS1820
    		crc=0;
      		for (i=0; i<9; i++) {crc = ds_crc_tab[crc ^ dane_one_wire[i]]; }  // jeśli otrzymamy crc==0 to oznacza, że odczyt odbył się bezbłędnie
    		
    		if(crc==0) //jeśli suma kontrolna OK to....
    		{
    	   		temp_lsb=dane_one_wire[0];
    			temp_msb=dane_one_wire[1];
    			temp=temp_lsb+(temp_msb*256);
    			temp=temp/16;
    			if (temp<4000)
    			{
    				set_cursor(0,0);printf("t=%.1f°C",temp);
    				tmp=temp;
    			}
    			else
    			{
    				temp=temp-4097;
    				set_cursor(0,0);printf("t=%.1f°C",temp);
    				tmp=temp;
    			}
    	
    		
    		}			
    		else
    		{
    			set_cursor(1,0);printf("Zła suma kontr.!",dane_one_wire[7]);
    		}
    	   }
           else
           {
    	   		set_cursor(1,1);printf("Błąd czuj. temp!");
    	   }
           
     
    }
REKLAMA