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



Teraz jest 28 cze 2026, o 05:35


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 
Autor Wiadomość
PostNapisane: 19 wrz 2014, o 20:46 
Offline
Użytkownik

Dołączył(a): 18 cze 2013
Posty: 33
Pomógł: 0

Witajcie,
posiadam czujnik SMB380, tylko nie wiem jak złapać z nim wspólny język.
Czujnik posiada rejestr danych z temperaturą (8bit), który chciałem wyświetlić za pomocą diod na jednym z portów.
Starałem się na kilka sposobów, jednakże nie wiem jak dobrać się do tych danych za pomocą SPI
W nocie katalogowej nie mogę znaleźć wzmianki na ten temat, a chciałbym chociaż sprawdzić czy czujnik jest sprawny.
Jest ktoś tak dobroduszny, aby poświęcił mi kilka minut na opisanie jak powinna wyglądać procedura "wyciągania" z czujnika takich danych (podany jest adres pamięci) ?
Według mnie powinienem jakoś zaadresować rejestr, który chciałbym odczytać, a następnie oczekiwać na dane, co wy na to ?
Z góry dziękuję.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 wrz 2014, o 14:31 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

A czy w ogóle wiesz jak przebiega komunikacja po SPI?
Bo jeśli tak to w nocie Twojego układu masz wszystko opisane
na stronach od 25 do 28 jeśli używasz 4-wire SPI
oraz na stronach od 29 do 31 jeśli 3-wire SPI.
Na początek sugerowałbym użycie magistrali 4 liniowej będzie prościej ;-)
na wszelki wypadek link do noty:
https://www.olimex.com/Products/Modules/Sensors/MOD-SMB380/resources/SMB380_Preliminary_Datasheet_Rev13_20070918.pdf
Jakby były jakieś wątpliwości to pisz postaram się w miarę mojej skromnej wiedzy coś podpowiedzieć

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 wrz 2014, o 19:33 
Offline
Użytkownik

Dołączył(a): 18 cze 2013
Posty: 33
Pomógł: 0

Teoretycznie wiem na czym polega komunikacja SPI i wiem, że w nocie znajdę wszystkie odpowiedzi, ale jeden z problemów tkwi w tym, że nie mogłem znaleźć informacji mi użytecznych :)
Trochę głębiej zacząłem czytać notę i okazało się, że trafiłem na ciekawy rysunek.

Obrazek

Z tego co zauważyłem, to aby "wyciągnąć" dane z czujnika, muszę ("Figure7") najpierw:
- ustawić CS na 0;
- wysłać do niego adres rejestru, który chcę odczytać oraz za MSB wpisać, albo 1 albo 0 ( 0 - wpisać do rejestru ; 1 - odczytać rejestr);
- oczekiwać na dane / wysyłać dane;
- po zakończeniu odbierania - ustawić CS na 1.

Czy dobrze zinterpretowałem notę ? Bo jeśli tak, to prosiłbym o przykładowy kod aby odebrać dane z rejestru np. 0x08 (temperatura) i przedstawić je na jakimś porcie.
Próbowałem i kombinowałem, ale nie za bardzo wychodzi.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 wrz 2014, o 21:31 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Temperaturę masz w rejestrze 0x08
Prawie wszystko dobrze opisałeś.

- Z CS dobrze, w nocie ta linia jest opisana jako CSB, ustawiasz na 0
- Następnie wysyłasz bajt z adresem w którym najstarszy bit jest ustawiony na 1 (bo odczyt) 0b10001000 (ewentualnie 0x88)
- Następnie wysyłasz tzw. dummy bajt - dowolny bajt który dla Ciebie nie ma znaczenia ale pozwoli prockowi odebrać to co wysyła moduł do mastera
- Po odbiorze ustawiasz CS na 1

Oczywiście zakładam, że użyjesz transmisji 4 liniowej i sprzętowego modułu SPI w procku
tak to powinno wyglądać (chyba... hihihihi)

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 wrz 2014, o 15:45 
Offline
Użytkownik

Dołączył(a): 18 cze 2013
Posty: 33
Pomógł: 0

Napisałem program testowy, tak aby odebrane dane można było wyświetlić na PORTA - mam tam podłączone diody (anodą do uC, katodą do masy).
Coś robię źle, bo żadna dioda się nie zaświeciła.
Moglibyście sprawdzić ten kod ?


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: 22 wrz 2014, o 17:33 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Jaki jest procesor?
Jakie taktowanie?

Jeżeli korzystasz ze sprzętowego SPI to musisz pin CS ustawić jako wyjście.
W funkcji OdbierzSPI powinieneś do zmiennej temperatura przypisać zawartość rejestru SPDR a nie odwrotnie ;-)
A tak poza tym... czy ten kod kompiluje Ci się poprawnie? Bez błędów i ostrzeżeń?
Oj... chyba nie...
Bo widzisz jeżeli funkcja zwraca wartość, to chyba musisz ją do czegoś przypisać, a Ty tego nie robisz.

Poza tym brakuje skonfigurowanego MISO a to na tej linii odpowie Ci SMB380

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 wrz 2014, o 18:05 
Offline
Użytkownik

Dołączył(a): 18 cze 2013
Posty: 33
Pomógł: 0

Procesor Atmega32.
Taktowanie fabryczne 1MHz.

Za CS robi mi pin 6 portu D i jest on ustawiany jako wyjście w funkcji SPI_Master_Init().

MirkoT napisał(a):
W funkcji OdbierzSPI powinieneś do zmiennej temperatura przypisać zawartość rejestru SPDR a nie odwrotnie ;-)


Racja, mam nadzieję, że tak jest dobrze (zmieniłem to w WymianaDanychSPI(), bo OdbierzSPI() aktualnie nie wykorzystuję :) ).

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


Dodam tylko, że poprawka też nic nie dała.

MirkoT napisał(a):
A tak poza tym... czy ten kod kompiluje Ci się poprawnie? Bez błędów i ostrzeżeń?
Oj... chyba nie...
Bo widzisz jeżeli funkcja zwraca wartość, to chyba musisz ją do czegoś przypisać, a Ty tego nie robisz.


Hmm.. program, pomimo tego, że funkcja zwraca wartość, która nie zostaje przypisana, kompiluje się i wgrywa poprawnie.
Starałem się wcześniej ją przypisać do zmiennej, ale miałem z tym problemy i cały czas wyskakiwały mi ostrzeżenia.

Zrobiłem małą modyfikację i w funkcji "uint8_t WymianaDanychSPI(uint8_t dane)" zamieniłem uint8_t na void oraz usunąłem return :) (mam nadzieję, że jest to poprawny zapis), dzięki czemu funkcja wygląda teraz tak :

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


Za dużo to nie dało i dalej jest brak reakcji.

Może problem tkwi nie w sofcie, a sprzęcie :) ale zanim będę coś kombinował, chciałbym mieć pewność, że mam program, który "musi" zadziałać.


edit.
Nie zauważyłem zdania:
Cytuj:
Poza tym brakuje skonfigurowanego MISO a to na tej linii odpowie Ci SMB380


MISO domyślnie jest jako wejście, bo z tego co wiem to po załączeniu / resecie uC, wszystkie piny portów I/O są jako wejścia. Chyba, że chodzi o jakąś inną konfigurację.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 wrz 2014, o 18:52 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Niestety nie mam jak sprawdzić, ale spróbuj może takiego kodu
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Nie wiem czy to będzie działać, ale spróbować możesz ;-)

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 wrz 2014, o 14:36 
Offline
Użytkownik

Dołączył(a): 18 cze 2013
Posty: 33
Pomógł: 0

Dzięki MirkoT za kod, ale nie działa :|
Postaram się sprawdzić dziś czy poprawnie działa 74LVC125, jeśli tak to możliwe, że czujnik jest wadliwy.
Połączenia sprawdzałem i są okey.

Spróbuję jeszcze sprawdzić opcję selftest - może ona mi co nieco odpowie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 wrz 2014, o 14:49 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

fusioon napisał(a):
Dzięki MirkoT za kod, ale nie działa :|
Postaram się sprawdzić dziś czy poprawnie działa 74LVC125, jeśli tak to możliwe, że czujnik jest wadliwy.
Połączenia sprawdzałem i są okey.

Spróbuję jeszcze sprawdzić opcję selftest - może ona mi co nieco odpowie.

Nie wiem czy zwróciłeś uwagę ale w "moim" kodzie CS jest na innym pinie...
Jeśli możesz to przełącz kabelki

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 wrz 2014, o 15:59 
Offline
Użytkownik

Dołączył(a): 18 cze 2013
Posty: 33
Pomógł: 0

MirkoT napisał(a):
fusioon napisał(a):
Dzięki MirkoT za kod, ale nie działa :|
Postaram się sprawdzić dziś czy poprawnie działa 74LVC125, jeśli tak to możliwe, że czujnik jest wadliwy.
Połączenia sprawdzałem i są okey.

Spróbuję jeszcze sprawdzić opcję selftest - może ona mi co nieco odpowie.

Nie wiem czy zwróciłeś uwagę ale w "moim" kodzie CS jest na innym pinie...
Jeśli możesz to przełącz kabelki


Racja, pamiętałem, że coś muszę sprawdzić, ale zanim wróciłem to zapomniałem :)

Niestety dalej diody się nie świecą oraz miernik nie wskazuje, żadnych zmian napięcia na pinach.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 wrz 2014, o 17:45 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Na żadnym? :?: Na CS powinno się zmieniać.

_________________
Jestem początkujący i moje porady mogą być błędne



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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