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

[ATmega8][C/WinAVR] problem z odczytem sygnatury DS18B20

ePeter1234 14 Sty 2011 08:47 1005 0
  • #1 9003422
    ePeter1234
    Poziom 18  
    Witam,

    Napisałem sobie podprogram odczytu sygnatur z dwóch DS18B20. Pierwszy z DS'ów jest identyfikowany bezbłędnie, natomiast mam problem z odczytem sygnatury drugiego DS'a. Gdy próbuje odczytać sygnaturę drugiego to ponownie odczytuje mi się sygnatura pierwszego z nich. Poniżej zamieszczam kod owire.c

    
    
    #include <avr/io.h>
    #include <util/delay.h>
    #include "owire.h"
    
    
    // set pin mask
    #define wmask     0x01
    // set 1-wire pin for output
    #define wOut      DDRD |= wmask
    // set 1-wire pin for input (bus released)
    #define wIn       DDRD &= ~wmask; PORTD |= wmask
    // set 1-wire bus high
    #define wH        PORTD |= wmask
    // set 1-wire bus low
    #define wL        PORTD &= ~wmask
    // get 1-wire bus input (bus released)
    #define wR        PIND & wmask 
    
    //SEARCH_ROM		0xF0
    //READ_ROM			0x33
    //MATCH_ROM			0x55
    //SKIP_ROM			0xCC
    //ALARM_SEARCH		0xEC
    
    //CONVERT_T			0x44
    //WRITE_SCRATCHPAD	0x4E
    //READ_SCRATCHPAD	0xBE
    //COPY_SCRATCHPAD	0x48
    //RECALL_E2			0xB8
    //READ_POWER_SUPPLY	0xB4
    
    int i = 0;
    int id1[64];
    int id2[64];
    
    void uDelay(char x)
    {
    	for( ; x > 0; --x) 		// ta pętla zostanie wykonana x-razy
    		__asm("nop"); 			// dodatkowa instrukcja opóźniająca o 1 cykl
    								// funkcja opoznia o x * 4us
    }
    // procedura reset
    unsigned char Reset1Wire(void)
    {
    //	cli();			//globalne zablokowanie przerwań
        unsigned char present;
    
        wOut;
    	wL;
    	_delay_us(488);
        wIn;
    	_delay_us(20);
        present=wR;
    	_delay_us(400);
    //	sei(); 			//globalne odblokowanie przerwań
        return present;
    } 
    // transmisja 1 bitu
    void wTxbit(unsigned char bit)
    {
    	wOut;wL;
    	if (bit)
    	{
          _delay_us(12);      // 12us
          wIn;
          _delay_us(60);     // 60us
    	}
    	else
    	{
          _delay_us(60);     // 60us
          wIn;             // better releash the bus
          _delay_us(12);      // 12us
    	}
    }
    // odebranie 1 bitu
    unsigned char wRxbit(void)
    {
    	unsigned char data;
    
    	wOut;wL;
    	_delay_us(4);         // 4us
    	wIn;
    	_delay_us(12);         // 12us
    	data=wR;
    	_delay_us(48);        // 48us
    
    	return data;
    }
    // transmisja 1 bajtu
    void wTxbyte(unsigned char data)
    {
    //	cli();			//globalne zablokowanie przerwań
        unsigned char i;
    
        for (i=0; i<8; i++)
        {
            wTxbit(data & 0x01);
            data>>=1;
        }
    //	sei(); 			//globalne odblokowanie przerwań
    }
    // odebranie 1 bajtu
    unsigned char wRxbyte(void)
    {
    //	cli();			//globalne zablokowanie przerwań
        unsigned char i, bit, data;
    
        data=0;
        for (i=0; i<8; i++)
        {
            bit=wRxbit();
            data|=bit<<i;
        }
    //	sei(); 			//globalne odblokowanie przerwań
        return data;
    }
    //
    unsigned char CountAddrCRC(unsigned char Input[7])
    {
        unsigned char CRC[8] = {0, 0, 0, 0, 0, 0, 0, 0};
        /*Input[7] = {0x28, 0x48, 0xFB, 0xFA, 0x01, 0x00, 0x00};
        Input[0] = 0x28;
    	Input[1] = 0x48;
    	Input[2] = 0xFB;
    	Input[3] = 0xFA;
    	Input[4] = 0x01;
    	Input[5] = 0;
    	Input[6] = 0;*/
    	unsigned char i = 0, x = 0;
     
        while(i<56)
        {
            if (i==0) {x = Input[0];}
            if (i==8) {x = Input[1];}
            if (i==16) {x = Input[2];}
            if (i==24) {x = Input[3];}
            if (i==32) {x = Input[4];}
            if (i==40) {x = Input[5];}
            if (i==48) {x = Input[6];}
                
            Input[0] = (CRC[0])^(x&0x01);
            CRC[0] = CRC[1];
            CRC[1] = CRC[2];
            CRC[2] = (CRC[3])^(Input[0]&0x01);
            CRC[3] = (CRC[4])^(Input[0]&0x01);
            CRC[4] = CRC[5];
            CRC[5] = CRC[6];
            CRC[6] = CRC[7];
            CRC[7] = Input[0]&0x01;
                
            x = x>>1;
            i++;
        }
        //CRC = CRC[0] | CRC[1]<<1 | CRC[2]<<2 | CRC[3]<<3 | CRC[4]<<4 | CRC[5]<<5 | CRC[6]<<6 | CRC[7]<<7;
        return CRC[0] | CRC[1]<<1 | CRC[2]<<2 | CRC[3]<<3 | CRC[4]<<4 | CRC[5]<<5 | CRC[6]<<6 | CRC[7]<<7;
    }
    //
    unsigned char CountCRC(unsigned char Input[8])
    {
        unsigned char CRC[8] = {0, 0, 0, 0, 0, 0, 0, 0};
        //Input[8] = {0x96, 0x01, 0x4B, 0x46, 0x7F, 0xFF, 0x0A, 0x10};
        /*Input[0] = 0x96;
    	Input[1] = 0x01;
    	Input[2] = 0x4B;
    	Input[3] = 0x46;
    	Input[4] = 0x7F;
    	Input[5] = 0xFF;
    	Input[6] = 0x0A;
    	Input[7] = 0x10;*/
    	unsigned char i = 0, x = 0;
     
        while(i<64)//64
        {
            if (i==0) {x = Input[0];}
            if (i==8) {x = Input[1];}
            if (i==16) {x = Input[2];}
            if (i==24) {x = Input[3];}
            if (i==32) {x = Input[4];}
            if (i==40) {x = Input[5];}
            if (i==48) {x = Input[6];}
    		if (i==56) {x = Input[7];}
                
            Input[0] = (CRC[0])^(x&0x01);
            CRC[0] = CRC[1];
            CRC[1] = CRC[2];
            CRC[2] = (CRC[3])^(Input[0]&0x01);
            CRC[3] = (CRC[4])^(Input[0]&0x01);
            CRC[4] = CRC[5];
            CRC[5] = CRC[6];
            CRC[6] = CRC[7];
            CRC[7] = Input[0]&0x01;
                
            x = x>>1;
            i++;
        }
        //CRC = CRC[0] | CRC[1]<<1 | CRC[2]<<2 | CRC[3]<<3 | CRC[4]<<4 | CRC[5]<<5 | CRC[6]<<6 | CRC[7]<<7;
        return CRC[0] | CRC[1]<<1 | CRC[2]<<2 | CRC[3]<<3 | CRC[4]<<4 | CRC[5]<<5 | CRC[6]<<6 | CRC[7]<<7;
    }
    
    void search_rom(void)
    {
    int a = 0;
    int b = 0;
    int c = 1;
    volatile int d = 0;
    volatile int e = 0;
    int f = 0;
    
    	if(Reset1Wire()==1)
    	{
    		wTxbyte(0xF0);
    		
    		c = 1;
    		
    		for(int x = 0; x<64;x++)
    		{
    			a = wRxbit();
    			b = wRxbit();
    		
    			b = ~b;
    			
    			if(!(a==b))		//brak konfliktu
    			{
    				id1[i] = a;
    				i++;
    			
    				wTxbit(a);
    			}
    		
    			if(a==b)			//konflikt
    			{
    				id1[i] = a;
    				i++;
    			
    				wTxbit(a);
    			
    				if(c==1)
    				{
    					d = i;
    					e = x;
    					c = 0;
    				}
    			}
    		}
    	}
    
    	if(Reset1Wire()==1)
    	{		
    		i = 0;
    		
    		wTxbyte(0xF0);
    		
    		for(e;e<64;e++)
    		{
    			for(d;d>0;d--)
    			{
    				a = wRxbit();
    				b = wRxbit();
    			
    				wTxbit(id1[f]);
    				f++;
    				
    				id2[i] = a;
    				i++;
    			}
    			
    				a = wRxbit();
    				b = wRxbit();
    			
    				wTxbit(a);
    				
    				id2[i] = a;
    				i++;			
    		}
    	}
    }
    


    Nie wiem gdzie jest błąd. Zastanawiam się czy poprawnie wpisuje odczytane wartości z pierwszego DS'a i czy poprawnie odczytuję miejsce w którym natrafiam na różnicę w bitach sygnatury DS'ów.
REKLAMA