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



Teraz jest 28 mar 2024, o 21:49


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 14 ] 
Autor Wiadomość
PostNapisane: 27 sie 2016, o 12:51 
Offline
Użytkownik

Dołączył(a): 07 paź 2015
Posty: 79
Pomógł: 0

Cześć wszystkim :)
Obsługuję czujnik temperatury i wilgotności HTU21D, magistrala I2C, procesor XMega 128A3. Do obsługi samego I2C wykorzystuję bibliotekę Atmela udostępnioną w internecie. Transmisja przebiega dobrze, o ile nic nie zakłóci linii SDA/SCL i zasilania czujnika. Zauważyłem jednak, że jak wyjmę przewód którejś z linii, czyli SDA lub SCL to program permanentnie się zawiesza. Próbowałem temu zaradzić software'owo i oto, co wypociłem.

W bibliotece Atmela dodałem linijkę włączającą timeout, co wyczytałem w DS do procesora:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Nie spełniło to jednak moich oczekiwań, gdyż po wyjęciu SDA lub SCL dalej się zawieszał.

Dodałem więc takie coś w pliku main.c, na przykładzie wysyłki komendy soft-resetu do czujnika:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Po osiągnięciu zera przez licznik timeout'u chcę wymusić stan IDLE na linii I2C.

Teraz, po wyjęciu przewodu SDA program jest wykonywany dalej. Jednak jak wyjmę przewód SCL to dalej jest zawieszony. Nie mam pomysłu jak temu zaradzić, dlatego proszę uprzejmie o wskazówki i pozdrawiam :)

PS: I2C sprzętowy, na przerwaniach. W załączniku biblioteka Atmela.


Załączniki:

Aby zobaczyć załączniki musisz się zalogować. Tylko zalogowani użytkownicy mogą oglądać i pobierać załączniki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2016, o 13:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 mar 2016
Posty: 85
Pomógł: 5

Obrazek


Autor postu otrzymał pochwałę

_________________
I'M



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2016, o 13:41 
Offline
Użytkownik

Dołączył(a): 07 paź 2015
Posty: 79
Pomógł: 0

Chodzi o pull-upy?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2016, o 14:19 
Offline
Użytkownik

Dołączył(a): 01 lis 2013
Posty: 302
Pomógł: 32

Witaj,

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


Możesz to opisać ? co to i do czego, i jaką wielkość zmiennej zadeklarowałeś ? uint64_t czy może uint128_t ?

Cytuj:
Do obsługi samego I2C wykorzystuję bibliotekę Atmela udostępnioną w internecie....


Jeżeli nie wiesz co się wiesza w "firmowej" bibliotece, to dlaczego nie napisać swojej obsługi I2C ?

Cytuj:
.....Teraz, po wyjęciu przewodu SDA program jest wykonywany dalej. Jednak jak wyjmę przewód SCL to dalej jest zawieszony.....


Ten przewód SDA lub SCL to kolega wyciąga z......... zgaduję - z szarego pudełka po butach ?

Bardzo przepraszam, za taki ton mojej odpowiedzi, ale nie mogłem się powstrzymać. Natomiast z tego ścinka kodu, który wkleiłeś nawet szklana kula nie jest w stanie pomóc.....

_________________
Pozdrawiam,
sq8mvy, Paweł



Ostatnio edytowano 27 sie 2016, o 14:29 przez gizmo5418, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2016, o 14:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

witam,
To wygląda na timer odliczający w dół .
tylko dlaczego nie jest wewnątrz ifa drugiego .?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2016, o 14:32 
Offline
Użytkownik

Dołączył(a): 01 lis 2013
Posty: 302
Pomógł: 32

Witaj,

Tak wiem, tylko co to za liczba jest do tej zmiennej wpisywana, i jaką wielkość ma zadeklarowaną

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


char, uint8_t, uint16_t, uint32_t, uint64_t .........

_________________
Pozdrawiam,
sq8mvy, Paweł



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2016, o 14:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

dekrementacja w pierwszym ifie, a kiedy zero - wykonuje funkcje z drugiego ifa i w nim się nastawia ponownie na wpisaną wartość. A tak to nastawia się za każdym obiegiem pętli.
Tak myślę. :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2016, o 14:43 
Offline
Użytkownik

Dołączył(a): 07 paź 2015
Posty: 79
Pomógł: 0

Oto cały kod main.c:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Daro69 - tak, to jest timer zliczający w dół :) Taki pseudo-timer, bo nie używam tutaj sprzętowego timera tylko dałem po prostu bardzo dużą liczbę, której szybkość zliczania zależy od prędkości taktowania. Rozwiązanie chamskie i na szybko, bo na razie testuję ideę, jak pójdzie to sobie zrobię to samo na timerze sprzętowym.
gizmo5418 - spiTimer dałem jako float, bo wiedziałem, że jego zakres łapie taką dużą liczbę. Nie dawałem uint64_t czy uint128_t bo nie wiedziałem, że są takie duże typy, przynajmniej do tej pory się na nie nie natknąłem. I tak, wiem, żeby floatów unikać w uC, ale jestem na etapie testów, więc sobie pozwoliłem.
I nie - nie z pudełka po butach :) Chodzi mi o przewód łączący procesor z czujnikiem. Jak przerywam połączenie wyciągając przewód, który je łączy to mam zawieszenie wykonywania programu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2016, o 14:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

a.. zeruje się w pętlach while :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2016, o 15:07 
Offline
Użytkownik

Dołączył(a): 07 paź 2015
Posty: 79
Pomógł: 0

Ano właśnie :)
Na podstawie obazka Kolegi robertomic, cytując klasyczną reklamę: wyraził więcej niż tysiąc słów. Zwróciły moją uwagę pull-upy i coś mnie uderzyło. Otóż pull-upy miałem cały czas, jednakże zapomniałem, że zewnętrzne, na płytce z czujnikiem. Jak właczyłem wewnętrzne pull-upy zaraz po mainie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


to po kompilacji i wgraniu wsadu jeszcze raz "zaburzyłem" komunikację po I2C i teraz się nie wiesza, ani po przerwaniu linii SDA jak i SCL. Jak włączę zasilanie i od razu linie są przerwane to też przechodzi dalej.
Wiem, że standard I2C wymaga pull-upów. Czy wszystko się zawiesza jeśli ich nie ma z tego powodu, że wtedy na wyjściach typu open-drain, jakimi są SDA i SCL mamy efekt "wiszenia w powietrzu" i nieustalone potencjały?

------------------------ [ Dodano po: 4 minutach ]

gizmo5418 napisał(a):
Witaj,

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


Możesz to opisać ? co to i do czego, i jaką wielkość zmiennej zadeklarowałeś ? uint64_t czy może uint128_t ?



uint64_t kompilator mi przyjął, ale uint128_t już nie. Istnieje w ogóle taka duża zmienna całkowitoliczbowa?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2016, o 15:12 
Offline
Użytkownik

Dołączył(a): 01 lis 2013
Posty: 302
Pomógł: 32

Witaj,

Już wiadomo coś więcej....

A teraz mała zagadka. Skoro u Ciebie
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


to sprawdź i napisz jaką wartość będzie miał spiTimeout po
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Autor postu otrzymał pochwałę

_________________
Pozdrawiam,
sq8mvy, Paweł



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2016, o 15:27 
Offline
Użytkownik

Dołączył(a): 07 paź 2015
Posty: 79
Pomógł: 0

Sprawdziłem to, ale nie na AVR-ze tylko na szybko napisałem sobie to w dev-cpp. No i pokazało, że tyle samo, czyli 1e12. Dlaczego tak się dzieje?

------------------------ [ Dodano po: 13 minutach ]

Na AVR-ze też sprawdziłem i efekt ten sam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2016, o 16:26 
Offline
Użytkownik

Dołączył(a): 01 lis 2013
Posty: 302
Pomógł: 32

Witaj,

Ponieważ liczby typu float służą do całkiem innych celów to raz. A dwa, że takie liczby mają skończoną dokładność ( rozdzielczość ? ).

Im mniejsza wartość całkowita takiej liczby (wartość po lewej stronie przecinka), tym większa dokładność.

A teraz zamiast
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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

czyli odejmuj nie wartość 1 jak poprzednio, lecz jeden milion (tak, aby zobaczyć efekt już przy pierwszym odejmowaniu. Napisz jaką wartość teraz ma Twoje spiTimeout ?

Najdokładniejsze liczby zmiennoprzecinkowe są wówczas, kiedy wartość całkowita liczby (ta po lewej stronie przecinka) jest równa 0.

Dlatego też, w przypadku tak wielkiej wartości całkowitej liczby typu float, jaką ładowałeś do spiTimeout, odejmując nawet 50000 nie zmieni się wartość spiTimeout

A wynika to ze specyfiki zapisu takiej liczby w 4 bajtach ( pojedyncza precyzja). Nie jestem orłem w liczbach typu float, więc starałem się wytłumaczyć tak jak ja to widzę.

Zapoznaj się też z https://pl.wikipedia.org/wiki/Liczba_zmiennoprzecinkowa

_________________
Pozdrawiam,
sq8mvy, Paweł



Ostatnio edytowano 27 sie 2016, o 16:35 przez gizmo5418, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2016, o 16:33 
Offline
Użytkownik

Dołączył(a): 07 paź 2015
Posty: 79
Pomógł: 0

9.99999e+011, na dev-cpp po odjęciu miliona. Na avr-ze też sprawdze, ale po "teście czasowym" mojego układu.



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: 14 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 8 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