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



Teraz jest 16 sty 2025, o 00:52


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
PostNapisane: 11 lis 2013, o 19:39 
Offline
Nowy

Dołączył(a): 11 lis 2013
Posty: 9
Pomógł: 0

Witam.
Ostatnio oglądałem poradnik od Pana Mirosława na temat rejestrów przesuwnych 74HC595. Tutaj zrodziło się moje pytanie, a mianowicie na początku jest pokazane, że piny od rejestru są podłączone do pinów PC0, PC1, PC2 natomiast później w kodzie C jest mowa o podłączeniu ich do portów MOSI (albo MISO nie pamiętam teraz), SCK oraz chyba PB5. Czy można sobie podłączyć te 3 nóżki rejestru do innych portów mikrokontrolera i jak to wygląda w C?

Z góry dziękuję :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lis 2013, o 19:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 18 lip 2012
Posty: 208
Lokalizacja: Kraków
Pomógł: 16

Można to zrobić na 2 sposoby:
1: Podłączamy 74HC595 do nóżek MISO, MOSI, SCK, SS w procesorze. Do sterowania rejestrem wykorzystamy sprzętowy interfejs procesora SPI, ustawiając odpowiednie rejestry konfiguracyjne w procesorze.

2: Podłaczamy 74HC595 do dowolnych pinów I/O procesora. Aby sterować rejestrem musimy napisać kod, który tak będzie sterował tymi nóżkami, jak robi to wbudowany interfejs SPI. Nazywa się to programowym SPI.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lis 2013, o 20:12 
Offline
Moderator
Avatar użytkownika

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

Juffre napisał(a):
2: Podłaczamy 74HC595 do dowolnych pinów I/O procesora. Aby sterować rejestrem musimy napisać kod, który tak będzie sterował tymi nóżkami, jak robi to wbudowany interfejs SPI. Nazywa się to programowym SPI.


Ja tylko uzupełnię że w Bluebooku jest właśnie opisane programowe SPI, i właśnie to można wykorzystać do podłączenia np 74595 do dowolnych pinów procka


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  
PostNapisane: 12 lis 2013, o 13:36 
Offline
Nowy

Dołączył(a): 11 lis 2013
Posty: 9
Pomógł: 0

Dziękuje za odpowiedź. Była bardzooooo pomocna :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2014, o 23:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 sty 2013
Posty: 106
Pomógł: 0

Znalazłem ten temat więc nie będę zakładał nowego. Ja też po obejrzeniu filmiku o rejestrach przesuwnych postanowiłem zapoznać się z tematem i spróbować wysterować 3 rejestry.
Schemacik testowego układu tak jak poniżej:
Obrazek

A wykonaną płytkę PCB widać tutaj:
Obrazek

Jest to jedna z pierwszych płytek mojego autorstwa, więc chciałem się podpytać o kondensatory C1, C6 i C7 przy zasilaniu rejestrów. Czy powinny być one jak najbliżej nóżek zasilania, czy też ich pozycja nie jest aż tak ważna ?

Po wgraniu kodu o ISP z niebieskiej książki diody wysterowane są tak jak na tym filmiku:


Interesuje mnie sposób rozszerzenia funkcji SendISP z uint8 tak aby z łatwością móc wysterować każdą z 24 diod dołączonych do 3 rejestrów. Czy możecie mi podać rozdział w niebieskiej książce bądź w innym poradniku Mirka gdzie omawiany jest sposób wysłania większego ciągi bitów przed ich zatrzaśnięciem.

Rozumiem, że teraz przed każdym zatrzaskiem wysyłam 8 bitów, ale co gdybym chciał móc uzyskać efekt wędrowania jednej diody w górę i w dół dla 24 diod :oops: ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 lut 2014, o 23:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Wyślij po kolei wszystkie bity
do połączonych w łańcuch rejestrów i na końcu "zatrzaśnij"



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lut 2014, o 16:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 sty 2013
Posty: 106
Pomógł: 0

na szybko przeleciałem przez dwa poradniki dotyczące SPI i rejestrów przesuwnych (wstawie odnosniki do poradników poniżej, to kolejni początkujący nie będą musieli ich szukać ) :
i


Ostatnim razem część dotycząca wysyłania 2 bajtów umknęła mej uwadze. Dzięki temu przykładowi udało mi się wysterować 3 rejestry. Po raz kolejny fachowe wyjaśnienie no i końcowy efekt widać poniżej :


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


Na pierwszym filmiku zauważalne jest zjawisko dodatkowych mignięć innych diod. Tutaj jest to bardziej widoczne:


Czy może mi ktoś wytłumaczyć w jaki sposób one powstają i jak się ich pozbyć ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lut 2014, o 16:32 
Offline
Moderator
Avatar użytkownika

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

barszczz napisał(a):
Czy może mi ktoś wytłumaczyć w jaki sposób one powstają i jak się ich pozbyć ?


przez to ci się to dzieje

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


pomijam już że to _delay_us(1) w książce było jako przykład i nie należy go stosować i że chyba niedobrze obejrzałeś te moje poradniki do których sam podałeś linki

ale nie dziwne że masz takie zjawisko jeśli LATCH'ujesz po wysłaniu każdego bajtu ZAMIAST po wysłaniu WSZYSTKICH bajtów do swojego rejestru czy rejestrów

Pomyśl sobie jaki jest sens LATCH'ować za każdym bajtem gdy naraz wsuwasz np 4 bajty

eeeh jak mówię ;) jeszcze raz obejrzyj ale teraz dokładnie mój poradnik i wtedy zobaczysz w czym rzecz - bo mówię o tym i to wyraźnie

_________________
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: 23 lut 2014, o 17:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 sty 2013
Posty: 106
Pomógł: 0

o kurcze...faktycznie zupełnie zapomniałem o LATCH'owaniu w funkcji sendBajt...w tym wypadku wyzwalałem po każdym bajcie a nie tylko raz po wsunięciu wszystkich trzech. No to teraz wszystko śmiga i miga tak jak zaplanowano :P



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lut 2014, o 18:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 sty 2013
Posty: 106
Pomógł: 0

Zastanawiałem się jak uzyskać efekt zapalania wybranych diod z poziomu użytkownika a nie przesuwając stan logiczny tak jak w poprzednim przykładzie. Za pomocą tego kodu mogę sterować wybraną diodą spośród 1 a 24:

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


Jeśli interesuje mnie zapalenie kilku wybranych diod naraz mogę posłużyć się:

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


W tym przypadku muszę znać wielkość tablicy, ale czy istnieje jakaś wbudowana funkcja w języku C, która podałaby mi rozmiar tablicy ? coś jak length (tablica) ? Gdzie mogę wyszukać tego typu funkcji zaimplementowanych w języku C dla mikrokontrolerów ?

wówczas nie musiałbym definiować wielkości tablicy no i w pętli for nie wstawiałbym na stałe wartości inkrementacji.
Dzięki za pomoc !



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 lut 2014, o 19:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 lut 2013
Posty: 600
Pomógł: 47

barszczz napisał(a):
W tym przypadku muszę znać wielkość tablicy, ale czy istnieje jakaś wbudowana funkcja w języku C, która podałaby mi rozmiar tablicy ? coś jak length (tablica) ? Gdzie mogę wyszukać tego typu funkcji zaimplementowanych w języku C dla mikrokontrolerów ?


Może sizeof(zmienna);

_________________
https://www.instagram.com/myfirstquadcopter/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2014, o 09:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 sty 2013
Posty: 106
Pomógł: 0

Świetnie ! Wielkie dzięki Panowie !

Teraz kolejna rzecz, która mnie zastanawia. W przypadku omawianego sterowania możemy kaskadowo połączyć maksymalnie 8 rejestrów, ponieważ najwyższy typ jaki mamy to uint64_t (64 bity / 8 bajty).
Zapewne niejeden z was kontrolował już znacznie większe ilości rejestrów aniżeli 8 :twisted:

Czy w tym przypadku najbardziej optymalnym rozwiązaniem dla np. 20 rejestrów byłoby utworzenie bufora zawierającego 20 bajtów i wysłanie go do funkcji sendBajt, w której za pomocy pętli for wysłane zostałyby wszystkie 20 bajty a po ostatnim oczywiście Latch'owane ?

Czy dobrze kombinuje :oops: ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2014, o 20:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 sty 2013
Posty: 106
Pomógł: 0

wypróbowałem metody z buforem i tak jakby działa. Dodatkowe części kodu poniżej:

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



Mam dodatkowe pytanie co do kolejnej funkcji języka C, jak widzicie do buffera wpisuje buffer[] = {1,2,4};
czy istnieje jakaś szybka komenda taka jak np. 'flip right to left' (buffer) tak abym odwrócił go w lustrze i otrzymał buffer2= {4,2,1} ?

Dodatkowo chciałem programowo zmienić stany z 1 na 0 i odwrotnie tak aby uzyskać poprawny efekt, gdyż diody połączone mam katodą do VCC. Próbowałem zanegować buffer za pomocą tyldy ~ ale oczywiście wyskakuje błąd. Poradziłem sobie z negacją wysyłanego Bajta w SendBajt, ale czy jest jakiś inny prosty sposób ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2014, o 22:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

negację bufora można by spróbować zanegować przed wysłaniem
w pętli np. for lub while
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

powinno odbyć się to dość szybko

mam taką nadzieję że to się uda :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lut 2014, o 12:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 sty 2013
Posty: 106
Pomógł: 0

tak, udało się z negacją bufera, dzięki !

Powracając do SPI, mam pytanie odnośnie możliwości sygnału SCK na pinie PB7. Po inicjalizacji sprzętowego SPI, na pinie tym pojawia się sygnał prostokątny o ustawionym okresie.

W przypadku noty katalogowej scalaka WS2803, temat -> http://forum.atnel.pl/post71958.html#p71958
opisane jest LACH'owanie układu za pomocą ustawienia stanu niskiego, o czasie >600us, na tymże pinie.

Czy jest jakiś łatwy sposób, aby przez określony czas wymusić stan niski na SCK a następnie powrócić do standardowego trybu pracy ?



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

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