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 w 2025? 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 9 kwi 2025, o 02:40


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 17 ] 
    Autor Wiadomość
    PostNapisane: 4 cze 2013, o 11:27 

    Pomógł: 0

    Witam i jak zwykle mam dziwny problem ;)

    Mam ci ja przetwornik CS5532, który po dostarczeniu do niego 8bitowego rozkazu, wysyła 32bitową zmienną po SPI, abstrahując że SPI w AVR jest 8bitowe, próbuję jakoś złożyć tą daną do jednej 32bitowej (lub 24bitowej, bo 24bity ma sama wartość ADC, reszta to bity kontrolne)

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


    Niestety z racji tego że następuje rzutowanie typów bo SPDR jest 8bitowy, nic co ponad 16bit nie chce mi działać ;).

    Tu przykład jak testuje czy mi działa to składanie 8bitowych na 32bit

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

    Niestety biblioteki LCD nie są przewidziane na tak duże liczby (łykają tylko max 16bit , stąd te dziwne złożenie).

    W przykładowym kodzie obsługi CS5532 wykorzystywane jest tylko 16bitów (przynajmniej tak wynika z analizy) kod jest pisany co najmniej dziwnie, bo i komentarze są po ichniemu ;).
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    Góra
      
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 cze 2013, o 11:56 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 12 maja 2013
    Posty: 568
    Zbananowany użytkownik

    Pomógł: 31

    Uważam że przesunięcia o wielokrotność 8 nie mają sensu, lepiej jest podać adres większy o 1.

    lub użyć uni

    UWAGA: Nie tesotwałem tego na AVR !!!

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


    UWAGA: Nie tesotwałem tego na AVR !!!

    _________________
    Und schreien

    Spring
    Erlöse mich
    Spring
    ...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 cze 2013, o 12:19 
    Offline
    Moderator
    Avatar użytkownika

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

    Panowie ale ja już niejednokrotnie pisałem na tym forum, że to całkowicie KARKOŁOMNA i wręcz wypaczona droga aby programując w C na 8 bitowcu, i chcąc odebrać coś czy wysłać w postaci kilku czy więcej bajtów zaczynać od "rozbebeszania" że tak powiem podstawowych funkcji do wysyłania pojedynczego bajtu :( ... no kilka dni temu był iście podobny temat tyle że tam kolega pytał o przesyłanie 4 czy 8 bajtów za pomocą kodowania Manchester ... i zaczął podobnie ....

    tzn owszem dałoby radę to zrobić ale .... ale nie tędy droga w C :(

    GIGANTYCZNĄ ZALETĄ w C jest to - że jak piszesz obsługę CZEGOKOLWIEK jakieś transmisji itp ... to zakoduj sobie w pamięci że ZAWSZE ale to ZAWSZE - PIERWSZY KROK to napisanie funkcji do odbierającej czy wysyłającej najmniejszy fragment zjadliwy dla twojego procka. Czyli np w 8-bitowcu będziesz pisał funkcję do wysyłania/odbierania pojedynczego bajtu, w 16-bitowym procku funkcję do transferu słowa a w ARM ? często do transferu podwójnego słowa

    A co później - a później to już ZAWSZE tak samo - gdy masz najmniejszy klocuszek LEGO to składasz z niego większą funkcję, po prostu wywołując w przypadku 8-bitowca 4-krotnie ten najmniejszy klocek

    to tyle odnośnie idei

    a teraz - oczywiście że przesunięcia są tu tak samo dobre jak unie - tyle że trzeba jedno i drugie dobrze zakodować. Tzn ta twoja funkcja

    ReadDWordSpi()

    nie działa z prostego powodu .... o czym za chwilę - ale pomyśl sobie - gdybyś miał za chwilę z jakiegoś innego układu po SPI odebrać nie 4 a 8 bajtów to co ? pisałbyś funkcję do odbioru zmiennej 64-bitowej ? ... ok a jeśli miałbyś odebrać 12 bajtów to co? ... to QUNIEC tak ? nie ma większych zmiennych ... ?

    dlatego podpowiem ci co robisz źle w tej swojej funkcji ale na prawdę uwierz mi - przerób ją tak żeby 4 razy wywołać funkcję odbioru jednego bajtu - pomyśl - przecież już przez to zaoszczędzisz niepotrzebnemu traceniu pamięci FLASH ok ???

    a teraz dlaczego masz kłopot z przesunięciami - tak na szybko i na oko - bo pewnie znowu (piszę znowu bo już chyba kiedyś też miałeś z tym problem - ale zwróciłem ci uwagę i poradziłeś sobie a teraz pewnie zapomniałeś ;) ) ... otóż zapomniałeś o tym:

    http://atnel.pl/domyslna-promocja-do-typu-int.html

    a u ciebie - hmm sam się przyjrzyj pod tym kątem tej linijce w swojej funkcji:

    DwordADC = SPDR << 24;

    i myślę że od razu dostrzeżesz co w niej się złego dzieje ;) ale jak nie to pytaj śmiało 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: 4 cze 2013, o 12:22 

    Pomógł: 0

    No tak coś mi się nie podobało, tj. wiedziałem że gdzieś dzwoni, ale nie wiedziałem gdzie :).

    Tylko, nie wiem, jak się zachowa CS5532, gdy będę 4razy zmieniał linie CS/ hmmm. Zrobię testy i przekażę co i jak.

    Dzięki Mirku.



    Góra
      
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 cze 2013, o 12:36 
    Offline
    Moderator
    Avatar użytkownika

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

    rezasurmar napisał(a):
    Tylko, nie wiem, jak się zachowa CS5532, gdy będę 4razy zmieniał linie CS/ hmmm


    to wtedy wystarczy wyjąć z funkcji do odbioru pojedynczego bajtu banglowanie CS'em i dać to wyżej ok? gdyby było coś nie tak

    _________________
    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: 4 cze 2013, o 12:56 

    Pomógł: 0

    mirekk36 napisał(a):
    rezasurmar napisał(a):
    Tylko, nie wiem, jak się zachowa CS5532, gdy będę 4razy zmieniał linie CS/ hmmm


    to wtedy wystarczy wyjąć z funkcji do odbioru pojedynczego bajtu banglowanie CS'em i dać to wyżej ok? gdyby było coś nie tak


    Odpowiedziałem bez zastanowienia ;), przecież można zrobić for między sterowaniem CS/ ;)

    Teraz walczę z wskaźnikiem do tablicy ;)

    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
      
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 cze 2013, o 13:06 
    Offline
    Moderator
    Avatar użytkownika

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

    No to zobacz powołałeś tablicę jako zmienną lokalną, owszem po wyjściu z funkcji zanim coś się nie stanie na stosie to jeszcze dane w niej będą aktualne ale jak tylko coś (np kolejna funkcja) dobierze się do stosu to masz już pozamiatane ... więc albo tablica static albo globalna. A sposób rzeczywiście banalnie prosty wymyśliłeś jak widzisz ;)

    _________________
    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: 4 cze 2013, o 13:16 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 12 maja 2013
    Posty: 568
    Zbananowany użytkownik

    Pomógł: 31

    Można tak:
    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łę

    _________________
    Und schreien

    Spring
    Erlöse mich
    Spring
    ...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 cze 2013, o 14:08 
    Offline
    Moderator
    Avatar użytkownika

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

    Dokładnie bo to jest naturalna droga :) ... odczyt bajtu, a jak więcej to do bufora ...

    _________________
    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: 6 cze 2013, o 12:56 

    Pomógł: 0

    Problemów ciąg dalszy, bo teraz w drugą stronę czyli rozbijamy 32bity na 4x8bit

    Tu tylko przykładowy kod by sprawdzić czy da się rozbić 32bitową "liczbę" na 4x 8bit wszystko ładnie działa nic się nie rzuca
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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

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


    Od razu wywala warnig Description Resource Path Location Type
    left shift count >= width of type [enabled by default] CS5532.c /ADC_CS5532/CS5532 line 105 C/C++ Problem
    No przecież w przykładowym kodzie, nie trzeba robić żadnych rzutowań, promocji do typu itp.
    kompilator mnie chyba nie lubi ;).

    Rejestr konfiguracji jest 32bitowy w CS5532 i najwygodniej było by się do niego odwoływać przez 32bitową zmienną,a nie
    bawić sie w jakies tablice, po prostymi definami możemy sobie wszystkie potrzebne setupy załatwić i potem tylko
    wpisywać za jednym razem do zmiennej 32bitowej............kurcze trzeba było jednak zostać przy analogówce i lampach ;).

    link do PDFa, Configuration Register jest na 26stronie opisany, jak by się komuś chciało zajrzeć.
    https://docs.google.com/file/d/0B85u4HQ ... sp=sharing



    Ostatnio edytowano 6 cze 2013, o 13:13 przez rezasurmar, łącznie edytowano 2 razy

    Góra
      
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 cze 2013, o 13:06 
    Offline
    Moderator
    Avatar użytkownika

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

    rezasurmar napisał(a):
    No przecież w przykładowym kodzie, nie trzeba robić żadnych rzutowań, promocji do typu itp


    A możesz tę myśl , swój pomysł rozwinąć ? bo ja kompletnie nie wiem o co chodzi ? tzn nigdy o tym nie słyszałem, że w jakichś tam przypadkach można robić rzutowania a w innych nie .... Skąd kompilator ma wiedzieć czy to kod przykładowy czy nie przykładowy ? ;) .... no chyba że coś źle zrozumiałem dlatego proszę o doprecyzowanie ;)

    _________________
    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: 6 cze 2013, o 13:12 

    Pomógł: 0

    No chodzi mi o to, że (przynajmniej dla mnie) sytacja w obu w/w przypadkach taka sama
    tj. czy w pierwszym kodzie robimy przesunięcie
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


    No a kompilator twierdzi co innego, no i w drugim przypadku wysyłane są tylko zera......mimo, że 29 bit jest ustawiony........



    Góra
      
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 cze 2013, o 13:33 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 12 maja 2013
    Posty: 568
    Zbananowany użytkownik

    Pomógł: 31

    A po co robisz przesunięcia?

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


    uint16_t i uint32_t należy używać praktycznie tylko przy mnożeniu i dzieleniu dużych liczb

    _________________
    Und schreien

    Spring
    Erlöse mich
    Spring
    ...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 cze 2013, o 13:44 

    Pomógł: 0

    No wszystko pięknie ładnie, ale po pierwsze ten kawałek kodu działa, zrobiłem go tylko jako przykład.

    Chodzi mi o to, że rejestr CS5532 jest 32bitowy tj. jak niżej
    Obrazek

    No i idąc dalej tym tropem, mając delfiny ;) wyprowadzone w ten sposób
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Dzięki temu, że mam rejestr 32bitowy mogę ustawić kilka rzeczy na raz, bez większych problemów.......
    No ale przy wysyłaniu po SPI trzeba to jakoś rozbić.......



    Góra
      
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 cze 2013, o 14:24 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 12 maja 2013
    Posty: 568
    Zbananowany użytkownik

    Pomógł: 31

    rezasurmar napisał(a):
    No ale przy wysyłaniu po SPI trzeba to jakoś rozbić.......


    Uparłeś się na uint32_t zamiast zrobić to na buforze, da się, proszę:

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


    AVR jest little endian więc pod val1 masz 0x89, pod val2 masz 0xBA, itd...


    Autor postu otrzymał pochwałę

    _________________
    Und schreien

    Spring
    Erlöse mich
    Spring
    ...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 cze 2013, o 14:31 

    Pomógł: 0

    No i kolejny raz wyszło jak to mało wiem, kombinowałem z wskaźnikami, ale za cholere mi to nie wychodziło.

    Teraz tylko wymyślić jak odwrócić kolejność, bez używania dodatkowych tablic i zmiennych ;).

    Banalne (mam nadzieje, że to nie przypadek, że działa ;))
    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
      
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 cze 2013, o 14:56 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 12 maja 2013
    Posty: 568
    Zbananowany użytkownik

    Pomógł: 31

    Nie potrzebnie sobie życie utrudniasz, ja bym zrobił to tak, podziel uint32_u na bufor 4x uint8_u:
    Obrazek

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


    Dla takich prostych funkcji warto używać inline, kompilator zamiast wywoływać funkcję wstawi jej zawartość w miejscu wywołania.

    _________________
    Und schreien

    Spring
    Erlöse mich
    Spring
    ...



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

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