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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 10 lip 2025, o 01:06


    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: 113
    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: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 113
    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: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 190
    Pomógł: 11

    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: 23
    Zbananowany użytkownik

    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: 190
    Pomógł: 11

    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: 23
    Zbananowany użytkownik

    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: 113
    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: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 113
    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: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 113
    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 6 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:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO