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



Teraz jest 30 gru 2025, o 13:34


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 21 ] 
Autor Wiadomość
 Tytuł: Moduł SPI
PostNapisane: 7 lut 2017, o 20:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 mar 2016
Posty: 30
Pomógł: 0

Witam mam pytanie dotyczące sprzętowej obsługi modułu SPI.

Aktualnie zapoznaję się z tym modułem ponieważ będzie mi potrzebny do projektu. Podstawy mam w miarę ogarniete, A więc połączyłem kaskadowo cztery 8-bitowe rejestry przesuwne, mózgiem jest ATmega16A taktowany wewnętrznym oscylatorem 8Mhz, pod każdy pin wyjściowy rejestru przesuwnego mam podpięte diody RGB oraz zwykłe diody LED. Celem jest przesówanie się jedenej świecącej diody od najmłodszego bitu do najstarszego i spowrotem, oglądałem poradnik pana Mirka na temat rejestrów przesuwnych i postanowiłem zrobić to na 4 rejestrach. Pytanie brzmi czy dobrze napisałem funkcję wysyłania bitów

Kod:
void SendSpiWorD(uint32_t word)
{
   SPDR = word>>24; // Przypisanie danych do rejestru danych Spi
   while(!(SPSR & (1<<SPIF) ) ); // Czekamy aż zostanie wysłany ostatni bit

   SPDR = word>>16; // Przypisanie danych do rejestru danych Spi
   while(!(SPSR & (1<<SPIF) ) ); // Czekamy aż zostanie wysłany ostatni bit

   SPDR = word>>8; // Przypisanie danych do rejestru danych Spi
   while(!(SPSR & (1<<SPIF) ) ); // Czekamy aż zostanie wysłany ostatni bit

   SPDR = word>>0; // Przypisanie danych do rejestru danych Spi
   while(!(SPSR & (1<<SPIF) ) ); // Czekamy aż zostanie wysłany ostatni bit

   LT_ON;
   LT_OFF;  // Zatrzask
   
}



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Moduł SPI
PostNapisane: 7 lut 2017, o 20:16 
Offline
Moderator
Avatar użytkownika

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

dobrze tylko co byś zrobił gdybyś miał przesyłać np dane do 5 rejestrów ?

co uint64_t ?

a jeśli do 12 rejestrów ? to ? ... nie ma nawet takiego typu w AVR

więc to mało elastyczne rozwiązanie i trzeba jeszcze te przesunięcia banglować - hmm trochę bez sensu powiem szczerze

czemu nie zrobisz tego przez tablicę? która może mieć tyle bajtów ile zechcesz

a w środku funkcji pętla która za jednym zamachem wysyła wszystkie bajty po kolei

_________________
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  
 Tytuł: Re: Moduł SPI
PostNapisane: 7 lut 2017, o 20:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 mar 2016
Posty: 30
Pomógł: 0

Dziękuję za odpowiedź i podpowiedź o tablicach będę nad tym myślał, Ale jak tak ustawiałem 4 rejestry i właśnie się zastanawiałem czy to mam sens, ponieważ do projektu będą mi potrzebne 6 rejestrów, a już przy 4 ustawiając najstarszy bit w hex była to liczba 0x80000000 więc zmieniam tok myślenia i przełączam się na tablice



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Moduł SPI
PostNapisane: 14 lut 2017, o 12:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 mar 2016
Posty: 30
Pomógł: 0

Witam po krótkiej przerwie, jestem właśnie w trakcie pisania funkcji wysyłającej bity do rejestrów przesuwnych opartej o tablice, podpowie ktoś czy idę dobrym tokiem rozumowania jeżeli chodzi o ten wątek, Sama funkcja jest wycięta z projektu który jest podzielony na pliki.

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Moduł SPI
PostNapisane: 14 lut 2017, o 12:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 gru 2014
Posty: 1540
Pomógł: 269

Zatrzask daj po wysłaniu wszystkich bajtów, a nie po każdym bajcie z osobna.
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łę


Ostatnio edytowano 14 lut 2017, o 17:14 przez anshar, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Moduł SPI
PostNapisane: 14 lut 2017, o 12:49 
Offline
Moderator
Avatar użytkownika

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

no widzisz ... i teraz sam chyba czujesz, że ma to przyszłość ;)

tylko ... to przekazywanie argumentu ..... do funkcji ... . brrrrr - niśt gut ... niśt gut- tzn no na upartego można ale nie polecam ;)

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


przekazuj WSKAŹNIK na tablicę a nie tablicę, to jedno, dodaj drugi argument, żeby funkcja była mega uniwersalna i żebyś mógł wysyłać tyle ile potrzebujesz w każdym miejscu programu czy w każdym projekcie - a nie żeby za każdym razem grzebać w brzuchu funkcji i zmieniać jej flaki - przecież to grozi "zakażeniem" ;) czyli większym ryzykiem błędu

no i zatrzask - chyba zależy ci żeby go zatrzasnąć po wysłaniu już wszystkich bajtów do całego łańcucha rejestrów a nie po wysłaniu każdego bajtu z osobna - bo wtedy miałbyś dopiero ciekawy efekt ;) sprawdź sam jaki


a wywołanie takiej funkcji - proszę bardzo (nie bój się wskaźników)

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


a wszystko za pomocą jednej funkcji - jak widzisz możesz wysłać 1 bajt albo i 20 bajtów naraz i nie jesteś uwiązany typem


Autor postu otrzymał pochwałę

_________________
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  
 Tytuł: Re: Moduł SPI
PostNapisane: 14 lut 2017, o 13:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 mar 2016
Posty: 30
Pomógł: 0

Jeżeli chodzi o ten zatrzask napewno bym doszedł że źle zamknełem pętle, Ale dziękuje. Więc mam trochę materiału do analizy, Postaram się dogłębnie to ogarnąć Dziękuje ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Moduł SPI
PostNapisane: 18 mar 2017, o 09:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 mar 2016
Posty: 30
Pomógł: 0

Witam, Ciąglę pracuję na optymalnym kodem jęzeli chodzi o ten mój projekt, dodam że jest to Led Cube RGB 4x4x4 oparty o mikrokontroler ATmega16A połączony kaskadowo z siedmioma rejestrami przesównymi, jak pisałem wyżej komunikacja między mc a rejestrami odbywa się szeregowo poprzez sprzętowy moduł SPI, Za poradą pana Mirka o przekazaniu wskaźnika na tablicę, w której mam Dane napisałem taką funkcję do wysyłania 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.


Cały czas douczam się na temat wskaźników i tablic zeby dobrzę to zrozumieć i napisać kod optymalny dla tego projektu żeby był szybki i zajmował mało pamięci. Właśnie o pamięć chodzi mi w tym poście hmm,

Chcem utworzyć jedną tablicę w pamięci Flesh W której będą znajdować się wszystkie dane czyli ustawienia wyjściowe dla kolorów w Cubie jak i tranzystorów sterującymi warstwy już sobie trenuję pisanie takiej tablicy i innym mc to działa o to taki kodzik jaki napisałem:

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


Po prostu pobieram sobie dane z 0 elementu tablicy i wysyłam je na PORT B, Cały PORTB jest w stanie wysokim Działa, Widzę w tym przyszłość :)

Może jakieś porady od osób wiedzących coś na ten temat jakieś wskazówki, Dzięki ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Moduł SPI
PostNapisane: 20 mar 2017, o 14:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 mar 2016
Posty: 30
Pomógł: 0

Witam, Mam problem z Pobraniem danych z tablicy utworzonej w pamięci Flash, dane chcem wysłać za pomocą modułu SPI na wyjścia rejestrów przesównych.

Tablica wygląda tak:

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


Funkcja wysyłająca wygląda jak wyżej w postach:

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


Mam na stykówce 2 rejestry połączone kaskadowo chcem wysłać na nie te 2 bajty z tablicy, wiem że muszczę jeszcze użyć makra pgm_read_word, nie będę strzelał gdzie wiec jeżeli ktoś zna się lepiej, może wytłumaczy ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Moduł SPI
PostNapisane: 20 mar 2017, o 15:12 
Offline
Moderator
Avatar użytkownika

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

To może otwórz panie kochany Bluebooka, najważniejszy rozdział o multipleksowaniu wyświetlaczy LED i zobacz tam jak się uzyskuje dostęp do pamięci FLASH ok? danych w tej pamięci

_________________
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  
 Tytuł: Re: Moduł SPI
PostNapisane: 20 mar 2017, o 15:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 mar 2016
Posty: 30
Pomógł: 0

Dzięki, Widzę jest, aż głupio trochę mi trochę zapomniałem o tym dziale może to przez te wskaźnki ostatnio dużo rozkminy. Zabieram się za czytanie ale może jeszcze jakieś linki z tym związane ktoś zna to moze podesłać przyda się wszystko ;))



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Moduł SPI
PostNapisane: 20 mar 2017, o 15:50 
Offline
Moderator
Avatar użytkownika

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

Bez żadnych linków tylko z Bluebookiem sobie poradzisz - gwarantuję, a jak czegoś nie zrozumiesz z BB to tu dopytaj

_________________
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  
 Tytuł: Re: Moduł SPI
PostNapisane: 20 mar 2017, o 16:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 mar 2016
Posty: 30
Pomógł: 0

Zrozumiem bo dobrze wytłumaczone jest W BB wszystko ;) A chodziło mi jeszcze o jakiś poradnik jak istnieje to tego tematu z ksiązki, No ale zabieram się za BB właśnie ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Moduł SPI
PostNapisane: 28 mar 2017, o 22:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 mar 2016
Posty: 30
Pomógł: 0

Witam,

Tak sobię pracuję nad tą Funkcją wysyłającą dane z tablicy w pamięci Flesh poprzez sprzętowy moduł Spi, w sumie się udało ale nie tak jak tego chcem czyli za pomocą funkcji (Oczywiście zajrzałem do BB) Tam jest to w przerwaniu i do tego dojdę, narazie tak.

otóż napisałem sobie taki programik:

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


Oczywiście mam na stykówce dwa rejestry przesuwne do testów, i na takim programie wszystko działa, diody się zapalają w takim układzie jak w hex zapisałem czyli wysyła, hmm problem się pojawia jak chcę za pomocą funkcji przesłać, pojawia się warning:

passing argument 1 of 'SendSpiWord' makes pointer from integer without a cast [enabled by default]

A kod jest taki:

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


Hmm wiec pgm_read_byte jako argument pobiera adres pamięci programu a zwraca wartość znajdującą się pod tym adresem więc jest operator adresu do pierwszego elementu tablicy, i chcem tylko 2 bajty pobrać, hmm Tak się zastanawiam czy warning wyskakuje z powodu ze funkcja SendSpiWord ma dwa argumenty typu uint8_t i z tego co wynika jest problem z pierwszym argumentem wiec widzi funkcję jako argument czyli void? i dlatego spina się ?

Tak wygląda Funkcja:

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  
 Tytuł: Re: Moduł SPI
PostNapisane: 29 mar 2017, o 06:51 
Offline
Moderator
Avatar użytkownika

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

nic się nie spina tylko babola robisz ...

Jaki dałeś argument funkcji ? .... uint8_t * bajt

a tymczasem chcesz przesyłać argument uint8_t bajt

więc zastanów się

_________________
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  
 Tytuł: Re: Moduł SPI
PostNapisane: 29 mar 2017, o 08:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 mar 2016
Posty: 30
Pomógł: 0

Więc krzyczy mi że chce wskaźnik na uint8_t a nie samego uint8_t w takim razie rozumiem ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Moduł SPI
PostNapisane: 29 mar 2017, o 08:45 
Offline
Moderator
Avatar użytkownika

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

to nie "coś" tam chce wskaźnik tylko przecież ty sam żeś napisał tak tą funkcję, że chcesz wskaźnik - TY chcesz wskaźnik, a później wywołujesz funkcję i przekazujesz do niej "nie wskaźnik"

_________________
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  
 Tytuł: Re: Moduł SPI
PostNapisane: 29 mar 2017, o 09:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 mar 2016
Posty: 30
Pomógł: 0

Wiem wiem panie Mirku, Uczymy się na własnych babolach ;)

A więc skupiam się na tym kodzie żeby stwierdzić co nie tak jest, hmm jeżeli wywalę operator pobrania adresu sama nazwa tablicy będzie wskaźnikiem na pierwszy element Font_Tab w teori bo ten sam warning jest... coś dalej nie tak kurdę ;/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Moduł SPI
PostNapisane: 29 mar 2017, o 09:14 
Offline
Moderator
Avatar użytkownika

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

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


wewnątrz funkcji:

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




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

_________________
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  
 Tytuł: Re: Moduł SPI
PostNapisane: 29 mar 2017, o 09:30 
Offline
Użytkownik

Dołączył(a): 02 gru 2015
Posty: 562
Pomógł: 28

Cytuj:
A więc skupiam się na tym kodzie żeby stwierdzić co nie tak jest, hmm jeżeli wywalę operator pobrania adresu sama nazwa tablicy będzie wskaźnikiem na pierwszy element Font_Tab w teori bo ten sam warning jest... coś dalej nie tak kurdę ;/


nie w tym problem funkcja pgm_read_byte zwraca wartość tablicy pod adresem pierwszego elementu a nie adres tej komórki a funkcja do wysyłania oczekuje adresu .
spróbuj tak
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  
 Tytuł: Re: Moduł SPI
PostNapisane: 29 mar 2017, o 10:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 mar 2016
Posty: 30
Pomógł: 0

Hej kolego tonygryps

Ja dobrze myślałem żeby przy wywołaniu funkcji nie dawać operatora pobrania adresu bo mi pobierało odrazu wartość z tablicy uint8_t a w funkcji chciałem wskaźnik wiec nie szło.

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


Więc takie przekształcenie wewnątrz funkcji SendSpiWord jest odpowiednie.

Do rejestru SPDR przypisujemy kolejno wartości spod adresu i wysyłamy na piny rejestrów przesównych

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


A tu wskaźnik na pierwszy element i ilość bajtów do wysłania

wszystko działa, twoje wywołanie ma takie skutki jak u mnie na początku



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

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