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.
Odczyt temperatur (w razie pytań, float i delay tymczasowe na czas pisania "zaplecza"):
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
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