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



Teraz jest 23 paź 2021, o 18:54


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 7 paź 2021, o 09:02 
Offline
Użytkownik

Dołączył(a): 24 cze 2014
Posty: 109
Pomógł: 1

Witam serdecznie,

jak już można było zorientować się z tematu postu, buduję urządzenie do zdalnego pomiaru temperatury termoparą typu K podpiętą do MAX6675. Układ zaprojektowany, wykonany i przetestowany wraz z mega32. Docelowo uC zmieniony będzie na mniej prądożerny, bo układ zasilany będzie z baterii. Napisałem sobie do testów kawałek kodu, który na piechotę steruje SPI. Odczyt na oscyloskopie i analizatorze stanów logicznych potwierdza poprawność konstrukcji - temperatury porównywane z urządzeniem wyższym o klasę... parę klas :) są praktycznie identyczne w interesującym mnie zakresie.
Kolejnym krokiem było zaimplementowanie dużo bardziej eleganckiej biblioteki SPI zakupionej w ATNEL. Po obejrzeniu poradników Mirka utwierdziłem się w tym, że jest to bardzo dobry wybór.
Na tą chwilę - na szybko - skorzystałem tylko z jednej funkji w głównej pętli programu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Ponownie sprawdziłem przebiegi, głównie pod kątem odbioru 16 bitów danych. Wszystko działa poprawnie.
No i teraz mam prośbę o pomoc. Chciałbym te dane, trochę "obrobić" - wyrzucić niepotrzebne bity, z pozostałych wyliczyć zmierzoną temperaturę i wyprowadzić na USART (podpięta LoRa).
Ponieważ słaby ze mnie programista, nie do końca rozumiem, co znajduje się w 'buf1' (8 czy 16 bitów?), bo rejestr SPI jest ośmiobitowy.
Kolejne moje pytanie, to jak operować na odczytanych danych (np. przesunięcia bitowe w celu pozbycia się wspomnianych kilku bitów i wyliczenie wartości (dec) temperatury).
Oczywiście chodzi mi o podpowiedzi koncepcyjne, a nie gotowe kody, bo chciałbym się czegoś nauczyć :) Chciałbym pisać kod małymi kroczkami, aż do zrealizowania całego projektu, więc ten post może dosyć długo się ciągnąć, ale mam nadzieję, że może wtedy pomóc innym raczkującym.

Pozdrawiam licząc na zrozumienie moich braków wiedzy i nie zawsze precyzyjnie zadane pytania

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2021, o 09:36 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 26550
Lokalizacja: Szczecin
Pomógł: 1018

tec-dive napisał(a):
co znajduje się w 'buf1' (8 czy 16 bitów?),

No przecież buf1 to bufor ... a jakiego typu ma elementy to zależy od ciebie z jednej strony, zaś do funkcji musi być przekazany tylko jeden typ - jaki? Nie powiem - bo lepiej będzie jakbyś sam właśnie się nauczył czytać chociażby same pliki nagłówkowe ;) dlatego podpowiadam

zajrzyj do nagłówka tej funkcji spi_xmit_buf() i to ty mi teraz tu powiedz jakiego typu argumenty ona przyjmuje - to od razu SAM odpowiesz sobie na to pytanie - no ale jeśli jeszcze czegoś nie będziesz rozumiał z tego co podejrzysz - to śmiało pytaj dalej

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2021, o 13:53 
Offline
Użytkownik

Dołączył(a): 24 cze 2014
Posty: 109
Pomógł: 1

Mirku dziękuję za szybką odpowiedź. Jeśli dobrze kombinuję, to mamy void czyli typ nieokreślony, a w zasadzie wskaźnik nieokreślonego typu.

a elementy buforu zadeklarowane jako (znakowy) char.

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2021, o 19:07 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 26550
Lokalizacja: Szczecin
Pomógł: 1018

dobra ok - zapomniałem, że musiałem troszkę rozbudować tę funkcję - dlatego podpowiedź - oczywiście że bufor ma zawsze elementy jednobajtowe uint8_t (nie wiem gdzie tam wypatrzyłeś typ char)

tylko nie pamiętam dlaczego dałem maksymalny rozmiar bufora 255 znaków bo typu uint8_t jest dla size

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


Kurczę no - ale jakby ktoś chciał więcej przesyłać to trzeba sobie nie tylko ten typ w nagłówku zmienić ale też w pętlach for( uint8_t i=0; .... pozamieniać na for( uint16_t i=0; ...

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2021, o 19:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2015
Posty: 149
Pomógł: 8

To już lepiej użyć auto. Kompilator sam dopasuje typ..



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 paź 2021, o 19:11 
Offline
Nowy

Dołączył(a): 27 lut 2021
Posty: 11
Pomógł: 0

Auto w C? W sumie jest, ale robi coś innego niż w C++, plus w takim przypadku i to by nie zadzałało



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 paź 2021, o 10:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2015
Posty: 149
Pomógł: 8

Racja autor tematu projektuje aplikację w języku C. Wspomniane słowo kluczowe auto jest dostępne w C++11, o czym można dowiedzieć się czytając wpis. Natomiast auto w C, tak jak kolega @embedownik jest dostępne ale pełni inną funkcję.

W tym przypadku, jeśli zajdzie taka potrzeba, należy ręcznie zmieniać typ danych w wszystkich wymaganych miejscach. Ewentualnie można pomyśleć nad programowaniem w C++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 paź 2021, o 14:29 
Offline
Nowy

Dołączył(a): 27 lut 2021
Posty: 11
Pomógł: 0

no ale w C++ też tego magicznie nie rozwiążesz przez "auto" - sprowadzi się do tego samego co podałeś dla C -> "ręcznie zmieniać typ danych w wymaganych miejscach" - ew. na upartego można dać customowy typedef i to będzie działać i w C i w C++.
Moim nie ma tutaj żadnej podstawy, żeby stwierdzić, że "można pomyśleć nad programowaniem w C++" żeby to samo rozwiązało jakieś problemy



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2021, o 12:45 
Offline
Użytkownik

Dołączył(a): 24 cze 2014
Posty: 109
Pomógł: 1

OK, przerobiłem funkcję:

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


buf1 zadeklarowałem jako

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


Teraz wywołuję funkcję

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

Przebiegi otrzymuję poprawne, tylko nie bardzo rozumiem działanie tej funkcji, szczególnie tego jakie dane mam w buforze odbiorczym. Jak się do nich dobrać? Potrzebowałbym bym jakiegoś łopatologicznego naprowadzenia :oops:

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2021, o 13:37 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 26550
Lokalizacja: Szczecin
Pomógł: 1018

tec-dive napisał(a):
buf1 zadeklarowałem jako

void *buf1



No to źle - poza tym nie zdeklarowałem tylko zdefiniowałem bo to jest definicja zmiennej a nie deklaracja.

Panie kochany

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


to jest w C bufor i masz 100 elementów - każdy 8-bajtowy, oczywiście możesz sobie zmieniać wielkość bufora w bajtach jak chcesz - i to jego przekazujesz do funkcji - rozumiesz? Podając jednocześnie jego rozmiar w bajtach, np


spi_xmit_buf( buf1, NULL, 100 );

i jeśli przerobiłeś że dodałeś możliwość przesyłania większej ilości bajtów niż 255 to nie zmieniaj nazwy funkcji - po co - wszystko później będzie ci się rypać

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

krótko mówiąc TAK należy ją przerobić - bo niestety dość okrutnie ją przerobiłeś ;) ale ok to moja wina więc podaję jak ma być

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


jak widzisz ZASZŁY TYLKO DWIE DROBNE zmiany:

Cytuj:
void spi_xmit_buf( void * buf_in, void * buf_out, uint8_t size ) {

uint8_t b_out = 0xFF;
for( uint8_t i = 0; i < size; i++ ) {
if( (uint8_t*)buf_out ) b_out = *((uint8_t*)buf_out++);
#if SEND_ONLY == 0
if( (uint8_t*)buf_in ) *((uint8_t*)buf_in++) = spi_xmit_byte( b_out );
#else
else spi_xmit_byte( b_out );
#endif

#if SEND_ONLY == 0
else spi_xmit_byte( b_out );
#endif
}
}


to co na czerwono zostało zastąpione uint16_t - to wszystko

i broń Boże żadnych innych nie rób ;)

------------------------ [ Dodano po: 7 minutach ]

mam nadzieję, że teraz już jest to jasne do końca

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2021, o 16:30 
Offline
Użytkownik

Dołączył(a): 24 cze 2014
Posty: 109
Pomógł: 1

No to teraz chyba coś zaczynam łapać. Utwierdzę się: chcę wczytać do bufora 16 bitów, które dostaję ze slave-a czyli definiuję sobie 2-bajtowy (16 bitów) bufor

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


teraz przekazuję bufor (buf1) i jego rozmiar (2 bajty) do funkcji:

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


A do bufora dobieram się np tak:

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


Odczytując w ten sposób zapisane w buforze dane otrzymuję wartości zgodne z oczekiwaniami. Jeśli to nie jest elegancki sposób i można to zrobić poprawniej/prościej, to proszę o nakierowanie. Na tą chwilę pozostaje mi wyłuskać informację o samej temperaturze, ale to już są proste przesunięcia bitowe :)

_________________
.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 paź 2021, o 16:47 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 26550
Lokalizacja: Szczecin
Pomógł: 1018

Równie dobrze mógłbyś zrobić

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


ale później odczytywać młodszy i starszy bajt za pomocą przesunięć

albo

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


tylko w tym wypadku trzeba przekazać adres zmiennej która zadziała jak tablica dwóch bajtów ! ;)

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


i też tak samo odczytywać z niej starszy i młodszy bajt

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


albo tak jak ty zrobiłeś co jest właśnie bardzo wygodne.

A po to żeby można było używać bufora w dowolnej postaci są tam w argumentach funkcji typy: void *, żeby się dostosowały do tego co podajesz - musisz doczytać o typie void ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 paź 2021, o 07:49 
Offline
Użytkownik

Dołączył(a): 24 cze 2014
Posty: 109
Pomógł: 1

Myślałem, że to będzie długa dyskusja, ale po tych kilku konkretnych postach od Was bezproblemowo udało mi się uzyskać oczekiwany efekt i w zasadzie ta część urządzenia już jest zrobiona i działa zgodnie z oczekiwaniami. Nie bardzo już mam o co zapytać ;)

W związku z tym dziękuję wszystkim za pomoc, cenne wskazówki i zwrócenie uwagi na braki wiedzy, które w pierwszej kolejności muszę sobie uzupełnić.

_________________
.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 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