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



Teraz jest 1 gru 2024, o 18:58


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 ]
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 
Online
Moderator
Avatar użytkownika

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

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 
Online
Moderator
Avatar użytkownika

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

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 
Online
Moderator
Avatar użytkownika

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

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 
Online
Moderator
Avatar użytkownika

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

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 ]
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 
Online
Moderator
Avatar użytkownika

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

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