Skocz do zawartości

BME280 długi czas inicjalizacji


_LM_

Pomocna odpowiedź

Cześć. Poszukuję możliwości skrócenia czasu inicjalizacji magistrali i2c, działam na esp 07 i podłączonym do niego bme280. Esp odczytuje dane, wysyła do funkcji espnow i jest usypiane. Problemem jest długi według mnie czas działania funkcji bme.begin(); Sprawdzałem to oscyloskopem, jak i prostym liczeniem czasu od startu funkcji do jej zakończenia. 

msTime = millis();
Wire.setClock(400000L);
bme.begin(0x76, &Wire);     //+113mS
msTime = millis() - msTime;
Serial.print("T= ");Serial.println(msTime);

Czy jest możliwość aby inicjalizacja bme przebiegała "w tle" np jakieś funkcje callback? Przecież te 113mS to cała wieczność dla mikrokontrolera i w tej "wieczności" pobiera około 50mA a tym czasie mógłby nawiązywać połączenie z espnow czy robić bardziej pożyteczne rzeczy.

Link do komentarza
Share on other sites

(edytowany)

Zmieniłem nieco program i podłączyłem oscyloskop żeby zobaczyć co się dzieje na liniach I2C żółty przebieg to synchronizacja ustawiany jest w stan niski przed wejściem do bme.begin(); Niebieski to SDA i SCL fioletowy.

Cała ramka:

1616942466437.thumb.jpg.a9f3ad8e2886bc5c8b6a763eff6af0ff.jpg

Początek:

1616942466435.thumb.jpg.eeb9d9bf61d349d270357febf8cf7945.jpg

Koniec:

1616942466432.thumb.jpg.2c59f4da3686d2dbbcd013067c3a7d71.jpg

Patrząc na zdjęcie początku widać że już po około 14..16ms BME jest gotowy do pracy. Myślałem że może ESP czeka jeszcze na jakieś dane ale jak widać na zdjęciu przebiegu końcowego najpierw jest ustawiany przebieg żółty(czyli wyjście z begin()) a potem zaczyna się właściwa transmisja. Nie wiem czy ktoś jeszcze badał te układy pod tym kątem, myślę że te opóźnienia są wygenerowane przez bibliotekę Wire ponieważ to ona zarządza magistralą. Mam pewien pomysł jak to obejść: można ustawić timer na pojedyńcze wyzwalanie po 20ms i callbacku tegoż timer poprowadzić dalej program nie czekając na wynik funkcji begin(). Wolałby jednak nie robić takich "fikołków" i szukam lepszego rozwiązania, ewentualnie biblioteki która nie będzie mi blokowała funkcji setup()

 

Edytowano przez _LM_
  • Lubię! 1
Link do komentarza
Share on other sites

(edytowany)

Okazuje się że nie można ot tak sobie skrócić inicjalizacji BME ponieważ mam później nieprawidłowe odczyty. Problem ominąłem w taki sposób:

Wire.setClock(400000L); // predkość i2c
tbme.once_ms(15,continueProg); // przerwanie za 15ms
bme.begin(0x76);     

Czyli uruchamiam timer "tbme" którego callback wykona się za 15ms ale zanim to się stanie, program rozpocznie funkcję bme.begin(). Te 15ms jest potrzebne na start transmisji i wymianę danych co widać na wcześniejszych oscylogramach. Po upływie tych 15ms program wskakuje do funkcji continueProg i robi resztę rzeczy przewidzianych w funkcji setup();(dokładniej pozostały setup() został przeniesiony do callbacka timera) dzięki temu mam kilka cykli zegara a przede wszystkim esp pracuje a nie czeka bezczynnie żrąc prąd na darmo 😄 

Edytowano przez _LM_
  • Lubię! 1
Link do komentarza
Share on other sites

Okazuje się że biblioteka od Adafruit nie pozwala na szybsze przejście przez begin(). Znacznie lepsze efekty uzyskałem stosując libsa od sparkfun. Zainteresowanych odsyłam do tego posta.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.