Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 27 lut 2025, o 23:21


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 4 lut 2015, o 23:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2012
Posty: 119
Pomógł: 3

Witam.

Musze przerobić obsługę czujnika DS18B20 w taki sposób, aby zamiast 2 pierwszych bajtów z temp., otrzymywać pełen scratchpad oraz na jego bazie obliczać CRC. Wszystko byłoby fajnie... gdyby nie to, że obsługa czujnika musi być nieblokująca. :(
Oryginalny kod opiera się na wysyłaniu komend w formie 16-to bitowych instrukcji i w 90% działa (w 90% dlatego bo zdarzają się momenty, kiedy wartość temp skacze do losowej liczby np. 120, 300, itd. a za chwilę wszystko znowu jest ok).
Stąd pomysł na crc i obsługę w stylu "gdy pomiar się zgadza, przesyłam wartości temperatury do dalszej obróbki".
Swój kod chciałem oprzeć o oryginalny mechanizm działania, ale z instrukcjami 8-mio bitowymi. Czemu - chciałem zliczać tylko 8 bitów zarówno przy wysyłaniu jak i odbiorze, w tym drugim przypadku chyba szybciej upchnąłbym 9 bajtów w tablice, a później wywołał funkcję od CRC.
Stworzyłem kod zawarty poniżej... ale mówiąc krótko... nie działa i nie wiem dlaczego.

Co robię źle, ew. w jaki inny sposób się za to zabrać ?

PS. kod wersji mocno roboczej, komentarze mogą się nie zgadzać.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lut 2015, o 23:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2012
Posty: 119
Pomógł: 3

Niestety, zasoby są mocno ograniczone, wszystko siedzi już na płytce drukowanej, nie ma możliwości zmian hardware'owych, a przynajmniej nie takich.

Dokładnie, wszystkie biblioteki jakie widziałem opierają się na delay'ach, o których tu nie może być mowy. Według datasheeta, sama operacja resetu to już w tym wypadku prawie czas 4 przerwań.
W przerwaniu wykonywane są też inne funkcje i prawdopodobnie to powoduje błędy - jakieś minimalne rozjazdy czasowe, przez które 1wire głupieje. Pomiar temp. nie jest priorytetem, temp musi być poprawna ale uaktualnienie może następować co np. 2-5 sekund.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 lut 2015, o 23:57 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Zmienna opoznienie jako zmieniana w przerwaniu powinna być volatile, a skoro jest 2 bajtowa, a procesor 8-bitowy to może się zdarzyć, że podczas, gdy jeden bajt jest sprawdzany to drugi się zmieni. Operacje na tej zmiennej w pętli głównej programu należy umieścić pomiędzy ATOMIC_BLOCK(ATOMIC_FORCEON)

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2015, o 00:10 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2012
Posty: 119
Pomógł: 3

Ehhh no tak, zapomniałem wspomnieć, że kod zacząłem testować na AVR'ku bo to mam pod ręką ale docelowe urządzenie oparte jest o zdecydowanie mocniejszą jednostkę, która raczej z takimi rzeczami nie będzie miała problemów.
Poza tym oryginalny kod, po zmianie typów zmiennych na bardziej przyjazne dla AVR, działa dobrze.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2015, o 01:34 
Offline
Użytkownik

Dołączył(a): 29 lip 2014
Posty: 195
Pomógł: 44

Witam,
Nie bardzo zrozumiałem, który w końcu kod działa Ci poprawnie ? Ten z delay-ami, czy ten na przerwaniach powyżej?

Jak często masz te przerwania, na których Ci zależy ? Bo 1Wire ma taką cechę, że pomiędzy poszczególnymi bitami ( nadawanymi czy odbieranymi ) może być czas dowolnie długi, co do Resetu to też nie jest tak, że musi być dokładnie 480 us - krytyczny jest tylko ten czas oczekiwania na "presence" po zmianie stanu magistrali na High tu wystarczy cli () na środek tego czasu, czyli na 60us. Kiedyś robiłem taką sztukę, że musiałem obsługiwać dość krytyczne czasowo przerwania - nie mogłem sobie pozwolić nawet na te ok 60us delay-a, ale one występowały rzadko ( co kilka ms ), więc kolejne bajty 1Wire odbierałem dopiero po zakończeniu obsługi tego krytycznego przerwania.
Trochę to chaotycznie wyszło, nie wiem czy coś z tego ktoś zrozumiał :-(.

Pozdrawiam, QuadMan.

P.S. W AVR- ach i tak nie masz priorytetów przerwań, więc nawet rozwiązanie z "licznikiem programowym" nie będzie działało pewnie - no chyba, że obsługa tych istotnych przerwań jest przynajmniej nieco krótsza niż minimalny dopuszczalny błąd pomiaru czasu tym "licznikiem programowym".

Pozdrawiam serdecznie, QuadMan.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2015, o 08:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 paź 2012
Posty: 119
Pomógł: 3

QuadMan napisał(a):
Witam,
Nie bardzo zrozumiałem, który w końcu kod działa Ci poprawnie ? Ten z delay-ami, czy ten na przerwaniach powyżej?


Kod z delay'ami w ogóle nie jest brany pod uwagę. Kod zamieszczony przeze mnie jest przerobioną wersją oryginalnego kodu, który wysyła 2 komendy w paczce 16 bitów. Chciałem aby mój wysyłał komendy po 8 bitów, ponieważ wydaje mi się, że prościej byłoby mi później odbierać 1 bajt scratchpada do elementu 0 tablicy, zmienić indeks i wpisać kolejny bajt, itd.
Ilość bitów jest ściśle uzależniona od liczników.
QuadMan napisał(a):
Jak często masz te przerwania, na których Ci zależy ? Bo 1Wire ma taką cechę, że pomiędzy poszczególnymi bitami ( nadawanymi czy odbieranymi ) może być czas dowolnie długi, co do Resetu to też nie jest tak, że musi być dokładnie 480 us - krytyczny jest tylko ten czas oczekiwania na "presence"

Przerwanie generowane jest z częstotliwością 8kHz czyli 125us, w inne funkcje wykonujące się w przerwaniu nie wnikam.


squeez napisał(a):
Jak koledzy wspomnieli, wykorzystanie UART mogło by pomóc ale skoro nie wchodzą żadne zmiany sprzętowe hmm ... ale może da się jedną przemycić :)

Niestety, żadnych tego typu zmian. Tylko operacje na kodzie. :(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 4 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO