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

[avr] [c] crc. Dlaczego ten kod nie działa?

czech_w 23 Lis 2010 22:38 2051 3
  • #1 8781805
    czech_w
    Poziom 12  
    Mam pytanie dlaczego ten kod działa

    int ReadTempCRC8(char a)
    {
    char i,temp;
    uint8_t data[9];
    unsigned char msb, lsb;
    	char tab[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    temp=0;
    ds=a;
    owire_reset();
    owire_write_byte(0xCC);
    owire_write_byte(0x44);
    _delay_ms(250);
    owire_reset();
    owire_write_byte(0xCC);
    owire_write_byte(0xBE);
    i=0;
    data[0] = owire_read_byte();
    data[1] = owire_read_byte();
    data[2] = owire_read_byte();
    data[3] = owire_read_byte();
    data[4] = owire_read_byte();
    data[5] = owire_read_byte();
    data[6] = owire_read_byte();
    data[7] = owire_read_byte();
    data[8] = owire_read_byte();
    if (data[8]==CountCRC(0x00,data,8))
    	{
    		//if CRC OK
    		lsb=data[0];
    		msb=data[1];
    			
    numb = (lsb+(msb*256))/16;		
    	return numb;
    	}
    else
    	{
    	//if CRC BAD
    	return 0x01;
    	}
    }


    a ten kod nie

    int ReadTempCRC8(char a)
    {
    char i,temp;
    uint8_t data[9];
    unsigned char msb, lsb;
    	char tab[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    temp=0;
    ds=a;
    owire_reset();
    owire_write_byte(0xCC);
    owire_write_byte(0x44);
    _delay_ms(250);
    owire_reset();
    owire_write_byte(0xCC);
    owire_write_byte(0xBE);
    i=0;
    for (i=0;i<9;i++)
    {
    data[i]=owire_read_byte();
    
    if (data[8]==CountCRC(0x00,data,8))
    	{
    		//if CRC OK
    		lsb=data[0];
    		msb=data[1];
    			
    numb = (lsb+(msb*256))/16;		
    	return numb;
    	}
    else
    	{
    	//if CRC BAD
    	return 0x01;
    	}
    }
    
    
    


    wiem że problem jest w pętli for ale nie wiem jaki. może funkcja za szybko czyta ??
    kilka zmiennych nie jest używanych w tym kodzie ale nie w tym problem.

    jedyne co zauważyłem to jeżeli w kodzie mam for to muszę zamienić lsb z msb jakoś inaczej w tablicy są <hmm> dziwne.
  • #2 8781820
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Ten kod który pokazałeś nie ma prawa się kompilować, bo brakuje jednej klamry. Zakładając, że jest ona na końcu, to pętla for nie obejmuje tylko odczytu do tablicy, ale WSZYSTKIE instrukcje poniżej również.

    for (i=0;i<9;i++) 
    { 
    data[i]=owire_read_byte(); 
    
    if (data[8]==CountCRC(0x00,data,8)) 
       { 
          //if CRC OK 
          lsb=data[0]; 
          msb=data[1]; 
              
    numb = (lsb+(msb*256))/16;       
       return numb; 
       } 
    else 
       { 
       //if CRC BAD 
       return 0x01; 
       } 
    } // tutaj konczy sie cialo petli for()
    } // <= tutaj pewnie brakujaca klamra


    Swoją drogą w takim wypadku kompilator na pewno krzyczy, że zmienna może być niezainicjalizowana, ale kto by to czytał warningi...

    4\/3!!
  • #3 8781832
    gaskoin
    Poziom 38  
    W pierwszym kodzie pobierasz najpierw całego scrachpada i sprawdzasz crc a w drugim sprawdzasz crc co obieg pętli - w pierwszym jej obiegu oczywiście crc zgadzać się nie będzie i zawsze zwróci błąd. Poza tym brakuje Ci jednej klamry a kompilator wrzeszczy warningami:)

    // brakuje klamry albo masz o jedną za dużo (z fora)
  • #4 8782930
    czech_w
    Poziom 12  
    Dzięki za podpowiedź. Faktycznie zapomniałem jednej klamry i for mi za dużo obejmował

    ten kod mi już działa.

    
    for (i=0;i<9;i++) 
    { 
    data[i]=owire_read_byte(); 
    }
    
    if (data[8]==CountCRC(0x00,data,8))
    	{
    		//if CRC OK
    		lsb=data[0];
    		msb=data[1];
    		numb = (lsb+(msb*256))/16;		
    	return numb;
    	}
    else
    	{
    	//if CRC BAD
    	return 0x01;
    	}	

    Temat zamykam
REKLAMA