Witam
Nie chcę zakładać nowego wątku, więc piszę tutaj, bo problem podobny, choć nie do końca.
Piszę program na procek XMega, który realizuje wiele rzeczy, a z istotnych tutaj steruje silnikiem krokowym i odczytuje temperaturę z DS18B20. Sterowanie silnikiem oparte jest na przerwaniu timera, w Którym wykonywany jest jeden krok, oraz określane jest opóźnienie do następnego kroku (czyli prędkość silnika), które to opóźnienie jest ładowane do timera. Generalnie max przewidziana częstotliwość aktywacji tego przerwania to ok 4 kHz i procek pracujący na 24 MHz się spokojnie wyrabia (robiąc w między czasie mnóstwo innych rzeczy) i praca silnika jest płynna.
Problem sprawia czujnik DS18B20, z którego co kilka sekund odczytuję temperaturę. Jego obsługa zajmuje się biblioteka do 1Wire ze strony Atmela. To zwykła realizacja na jednym pinie IO. Transmisja danych działa tak, że każdy bit wysyłany/odbierany jest w bloku atomowym (wyłączone przerwania), aby nie zakłócić wymaganych zależności czasowych. Natomiast między bitami przerwania są odblokowywane, bo przerwy między bitami mogą być długie. Dlatego też, jeśli np silnik chce wykonać krok akurat w czasie transmisji bita, to musi poczekać na zakończenie i przed kolejnym bitem wykonywane jest przerwanie silnika.
Wszystko byłoby fajnie, gdyby nie sygnał Reset/Presence, który trwa prawie 1 ms. W tym czasie przerwania również są zablokowane. Z tego powodu, jak przerwanie silnika trafi na ten moment to jest opóźnione o prawie 1 ms, a to bardzo dużo i daje się zauważyć (i usłyszeć) zaburzenie w płynności pracy. Inne wysyłane bity na magistrali są krótkie i raczej nie stanowią problemu.
Dlatego zastanawiam się nad modyfikacją funkcji reset/presence, tak, aby możliwe było wywołanie przerwania w jej trakcie. Wydaje mi się, że w początkowym czasie 480 us, gdy procek ustawia stan niski mogę odblokować przerwania. Być może to przerwanie wydłuży troszkę zalecany czas, ale raczej nie powinno to być dużo (przerwanie silnika wykonuje się bardzo szybko). Gorzej z drugą częścią, gdzie czekamy na odpowiedź czujnika. Nie jestem pewien, gdzie tam mogę sobie pozwolić na odblokowanie przerwań. W zasadzie, jeślli np co któryś pomiar zostanie zakłócony przerwaniem (czujnik nie zostanie rozpoznany), to nie ma problemu, bo mogę poczekać na następny pomiar. Także myślę, że jeśli to nie będzie działało w każdym pesymistycznym przypadku, to nic się nie stanie.
Chyba najlepiej by było zrobić dodatkowe przerwanie, które realizowało by elementarne operacje na magistrali 1Wire, czyli włączało stan niski linii i go zwalniało. Wtedy nie byłoby tego czekania 480 us i to dodatkowe przerwanie mogłoby przerwać przerwanie silnika na nieistotny czas. Tylko, czy to nie jest za duża komplikacja?