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

DS18B20 Atmega8 c nie odpowiada

25 Maj 2009 21:02 1923 8
  • #1 6574381
    Konto nie istnieje
    Konto nie istnieje  
  • #3 6575760
    wdogli
    Poziom 18  
    Hej.
    Nie wiem czy wiesz ale te kostki sa bardzo czułe jeśli chodzi o czasy pomiędzy poszczególnymi komendami.
    Na pierwszy rzut oka widzę ze masz z tym problemy. Poczytaj trochę o komendzie _delay_ms w dokumentacji biblioteki avr-libc.
    Zgodnie z dokumentacją:

    The maximal possible delay is 262.14 ms / F_CPU in MHz.


    czyli w twoim przypadku 262.14/8=~32
    a w twoim kodzie masz na przykład
    _delay_ms(500); 

    a ty możesz mieć max
    _delay_ms(32); 


    Poniżej przydatny link :)
    Link
  • #4 6575950
    Pawelz
    Poziom 11  
    Popraw opóźnienia i wyłącz optymalizację.
  • Pomocny post
    #5 6576964
    rrata
    Poziom 19  
    Myślę, że błąd będzie tu:
    unsigned char read_byte(void) 
    { 
       unsigned char i; 
       unsigned char wartosc = 0; 
    
       for(i=0; i<8; i++) 
       { 
          if(read()) wartosc |= 0x01 << 1; //błędna linijka
          _delay_us(15); 
       } 
       return (wartosc); 
    }
    Za każdym razem wykonujesz or na tym samym bicie. Zmień tą linie na:
    if(read()) wartosc |= 0x01 << i;


    Część odnoszącą się do postów, które przeniosłem do kosza - usunąłem.
    [zumek]
  • #6 6577113
    poczitamagoczi
    Poziom 14  
    A moim zdaniem błąd jest w linijce w której zmienną zadeklarowaną jako char mnożysz razy 256:

        int t = (temp1 + (temp2 * 256)) / 16; 


    Porównaj z oryginałem ;)

    W GCC AVR chary to 8 bitowe zmienne.
  • #7 6577221
    Konto nie istnieje
    Konto nie istnieje  
  • #8 6577254
    zumek
    Poziom 39  
    Pitrija napisał:
    ... KAŻDE wywołanie read_byte() zwraca 2 ...

    A poprawiłeś błąd, który "wytknął" Ci kol. rrata :?:
  • #9 6579097
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA