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

[Rozwiązano] Zmiana kolejności adresów czujników DS18B20 - problem z odczytem temperatury

maciek_w11 25 Lis 2024 10:55 117 2
REKLAMA
  • #1 21318775
    maciek_w11
    Poziom 9  
    Dzień dobry

    Mam mały problem ze zmianą kolejności adresów czujników DS18B20. Mam tablicę uint8_t z adresami czujników. Każdy adres zajmuje 8 pozycji tablicy. Napisałem menu ustawień z możliwością zamieniania kolejności. W menu po wejściu w wybrany czujnik mogę przypisać mu adres ze "świeżo" przeskanowanej magistrali.
    Problem w tym, że o ile po zapisie adres na ekranie wyświetla się poprawnie, to przy próbie odczytu temperatury kod CRC dla zwracanej wartości się nie zgadza - nie mam odczytu. Nie ważne, czy odczytuje wszystkie wartości po kolei, czy odczytuje wartość z jednego termometru. Dopóki adres jest w tablicy na miejscu wygenerowanym przez funkcję zwracającą adresy wszystkich DS'ów podłączonych do magistrali odczyt działa. Po zmianie lokalizacji adresu - nie działa. Funkcja zmieniająca adres działa na 100%, ponieważ po wpisaniu na danej pozycji adresu, który występował na oryginalnie wszystko znów jest okej.
    Obecnie wszystkie adresy mam w EEPROM i program odczytuje je stamtąd, więc nie ma możliwości, że po resecie tablica się zmieni i wróci do oryginalnej kolejności. Jak zrobię to ręcznie - jest odczyt.

    Fragment funkcji przypisujący nową wartość adresu.
    
    /*
    roms - tablica z adresami ładowana do EEPROM
    new_roms - tablica z zeskanowanymi adresami
    (last_active_set - 1) - id pomiaru
    active_rom - wybrany adres
    */
    
    for (uint8_t g = 0; g < 7; g++){
       roms[(last_active_set-1) * 8 + g] = new_roms[active_rom * 8 + g];
    }
    


    Odczyt temperatur (w razie pytań, float i delay tymczasowe na czas pisania "zaplecza"):
    
    void reload_temperature() {
       float t;
       ds18b20convert( &PORTD, &DDRD, &PIND, ( 1 << PD6 ), NULL );
       _delay_ms( 1000 );
       if(!mode) return;
       for (int i=0 ; i <= 6; i++) {
          test = ds18b20read( &PORTD, &DDRD, &PIND, ( 1 << PD6 ), &roms[i * 8], &temperature[i]);
          
          t=(float)temperature[i]/16;   
          if(test) t=test;
          
          clear_str();
          dtostrf(t, 4, 1, str);
          ST7565_char(18, i, str);
       }
    }
    


    W skrócie - odczyt temperatur działa tylko wtedy, jeśli roms == new_roms. Już nie mam pomysłów, bardzo proszę o pomoc. Z góry dzięki :)

    Obsługę DSów zaciągnąłem z biblioteki Pana Jacka Wieczorka. https://github.com/Jacajack/avr-ds18b20/wiki
  • REKLAMA
  • #2 21318926
    cedrom
    Poziom 18  
    Bawiłem się tym ostatnio. Jak wrócę do domu to ci wrzucę kod.
  • #3 21319236
    maciek_w11
    Poziom 9  
    Ok, temat rozwiązałem. W pętli której podmieniam wartości był warunek <7, w powinien być <8. Gdy adres był na nieoryginalnej pozycji ostatni bajt adresu się nie zgadzał.
REKLAMA