• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
I2C "zacina" się
#1
Witam
Mam podłączonych kilka urządzeń do interfejsu I2C i zdarza się, że w wyniku prawdopodobnie zakłóceń interfejs ten "zawiesza" działanie programu. W każdym urządzeniu są rezystory "podciągające" i w sumie daje to około 3kom. Nawet zmniejszenie tej rezystancji poniżej 1kom nie rozwiązuje do końca problemu. Oczywiście mogę zaradzić temu przez eliminację wpływu zakłóceń, ale zastanawia mnie dlaczego tak się dzieje.
Po przyglądnięciu się temu zjawisku zauważyłem, że podczas "zawieszenia" na linii SDA jest stan niski.
Zestawiłem sobie próbny przykład pomiaru temperatury na BME 280 a wyniki wyświetlam sobie na konsoli.
I teraz jak przewodem wymuszę na linii SDA stan niski i będzie on trwał podczas odczytu danych z czujnika to program się zawiesza a na linii SDA pozostaje stan niski wystawiany z "arduino", sprawdzone przy odłączonym czujniku.
Odłączanie samego czujnika podczas odczytów powoduje tylko brak odczytów, ale po ponownym podłączeniu linii SDA i SCL czujnika do "arduino" wszystko działa prawidłowo bez resetowania.
Czy można temu jakoś zaradzić, aby takie zakłócenie, zwarcie chwilowe do masy nie powodowało zawieszenia działania programu.
 
Odpowiedź
#2
MIałem podobnie w BMP 180, fakt że inny czujnik, ale podobny objaw. Problem to biblioteka.....

Poradziłem sobie tym że sprawdzam przed odczytaniem czy czujnik jest dostępny taki prosty

if (!bme.begin()){
brak czujnika
}else{
odczytaj
}
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
Szkopuł w tym, że to się dzieje też dla czujnika HTU21 i wyświetlacza LCD 20x4 niezależnie, czyli gdy tylko w programie występują pojedynczo. Pewnie winna jest biblioteka wire, ale tego ja nie poprawię.
 
Odpowiedź
#4
Zrobiłem próbę z dwoma "arduino". Jeden master drugi slave. Przykłady z biblioteki wire i sytuacja jest taka sama.
Po "przywarciu" do masy SDA master się "zawiesza". Dzieje się to nie za każdym razem, ale bez problemu da się to sprowokować za drugim czy trzecim razem.
Myślę, że jest to problem z biblioteką, ale czy na pewno. Czy jest na to sposób, aby się nie "zacinało".
 
Odpowiedź
#5
Kolejna próba. Na master zastosowałem bibliotekę SoftwareI2C.h i problem ustąpił. Nawet jak wykorzystałem te same piny co Wire.h.
Hm jak to jest z tą biblioteką Wire.h, gdzie ona jest, bo jakoś się pogubiłem.
 
Odpowiedź
#6
A sprawdzałeś to

https://www.arduino.cc/en/Reference/WireRequestFrom
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#7
Według mnie nie powinno być tak, aby master blokował magistralę do nieskończoności, sam blokując działanie "arduino", ponieważ to niczemu nie służy.
Musi być jakiś błąd w bibliotece wire. Zapewne nie jest to tylko mój problem, ale wszystkich korzystających z I2C na "arduino". Dlatego może warto ten problem rozwiązać globalnie.
No chyba, że się mylę, jak tak to mnie poprawcie.
 
Odpowiedź
#8
(31-03-2020, 13:43)Agregacik napisał(a): Musi być jakiś błąd w bibliotece wire.
Wire.h w pewnych sytuacjach blokuje się tak, że tylko reset pomaga. Slave też może blokować magistralę, wtedy nawet reset nie pomaga tylko wyłączenie zasilania. Jest oczywiście na to lekarstwo ale wszystko sprowadza się do tego, że praktycznie każda biblioteka do arduino ma błędy i trzeba pisać swoje dlatego nie ma dobrych projektów zrealizowanych typowo na arduino.
 
Odpowiedź
#9
fast_rabbit, czy wiesz, gdzie siedzi biblioteka wire, czy jest ona zaszyta w IDE. Może udało by się ją poprawić. Wywaliłem wszystko co przypomina wire a i tak programy się kompilują.
Przy zastosowaniu softwareI2c nie zauważyłem takiego zjawiska. pisałem o tym wyżej. No ale nie wiem jak użyć tego softwareI2C z innymi bibliotekami np czujnika BME280, wyświetlacza LCD 20x4.
 
Odpowiedź
#10
biblioteka jest w folderze "libraries" u mnie w AppData
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości