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



Teraz jest 11 mar 2026, o 21:47


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 15 cze 2013, o 11:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 lip 2012
Posty: 306
Pomógł: 0

Witam.
Próbuję nauczyć się komunikacji między trzema AVR lecz problem mam już z dwoma.
Wcześniej doszedłem do efektu że dwie atmegi 16 wysyłały w jedną i drugą stronę informacje. Gdy przerobiłem kod by obsługiwał trzecią atmege wszystko się posypało. I chyba lepiej będzie jak wykorzystam przerwanie SPI_STC_vect w układzie slave.
Więc zabrałem się za kod i już na samym początku nie działa mi.
Próbuję wysłać zmieniającą się wartość z master do slave w taki 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.


Gdzieś popełniam błąd ponieważ slave wyświetla cały czas 0. Połączenie między układami było wcześniej testowane innym kodem więc wykluczam błędne podłączenie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 cze 2013, o 20:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Jeżyk przetestowałem Twój kod.
Master na Atmedze32, a slave na Atmedze8. I wszystko działa. Master nadaje a sleve ładnie odbiera dane i wyświetla na LCD.
Oba procki taktowałem wewnętrznym oscylatorem 8MHz.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 cze 2013, o 20:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 lip 2012
Posty: 306
Pomógł: 0

To co może być nie tak.
Mam taki schemat :
Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 cze 2013, o 20:38 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

A spróbuj dwie atmegi połączyć bezpośrednio, czyli pomjając te rezystory 4,7k. Bo z tego co widzę to przy takim połączeniu oba procki są połączone przez 2 rezystory co daję ok. 9,5k. Może tu tkwi problem?


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 cze 2013, o 05:48 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 lip 2012
Posty: 306
Pomógł: 0

No tak Tu był pies pogrzebany. :)
Zmieniłem te rezystory na 2k2 i u mnie też działa.
Mam teraz kolejne pytanie, by wysłać coś do master jak to prawidłowo zrobić ?
W przerwaniu muszę zastosować opóźnienie tego typu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

czy wystarczy jak zrobię 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  
PostNapisane: 16 cze 2013, o 10:06 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Wydaje mi się, że drugi sposób powinien być dobry. SPI to magistrala dwukierunkowa. Więc slave, w czasie odczytu danych z mastera, jednocześnie zapisuje dane do rejestru wyjściowego SPDR. I te dane zostaną wysłane do mastera wtedy gdy master będzie wysyłał cokolwiek do slava. Master, w czasie odbioru danych z slava, nie musi wysyłać konkretnych danych. Może wysyłać np. same zera.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 cze 2013, o 10:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 lip 2012
Posty: 306
Pomógł: 0

Wykonałem kod odbioru danych od dwóch slave który wygląda na to ż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.


Tylko mnie zastanawia czy to jest prawidłowo zrobione ?
Głównie mi zależało na odbieraniu danych od układów slave, dlatego slave może odbierać zero.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 cze 2013, o 10:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

Jeśli układy slave mają wysyłać dane do mastera to mogą to mogą odbierać od mastera same zera. Nic temu nie przeszkadza.

Jak ja bawiłem się SPI to master wysyłał dane do slava, a slave w funkcji odbiorczej odbierał dane i wysyłał pusty bajt do mastera.

Tak na gorąco to zmienił bym w kodzie od mastera funkcję TransferSpi. Zamiast dwóch osobnych funkcji zrobił bym jedną. A za pomocą argumentów przekazywanych do niej można by wybierać do którego procka przeznaczone są dane.
No chyba, że te dwie funkcje zastosowałeś na czas testów.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 cze 2013, o 11:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 lip 2012
Posty: 306
Pomógł: 0

Np coś takiego:
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  
PostNapisane: 16 cze 2013, o 11:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 sty 2012
Posty: 777
Lokalizacja: Karpicko k. Wolsztyna
Pomógł: 197

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

Pisane z głowy. Nietestowane.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 cze 2013, o 11:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 lip 2012
Posty: 306
Pomógł: 0

No dużo ładniej to wygląda :)
Dziękuje za poradę :)
Pozdrawiam.



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

Dołączył(a): 05 sie 2012
Posty: 97
Lokalizacja: Tarnów
Pomógł: 2

Witam

Podobnie jak kolega Jeżyk-1 robię transmisję przez SPI pomiędzy dwoma w moim przypadku atmegami (32 i 48). Linie MISO, MOSI i SCK połączyłem bezpośrednio ze sobą bez żadnych rezystorów i mam taki problem że programując programatorem USBasp z wykorzystaniem ISP musze rozłączyć połączenie między atmegą32 i atmegą48 bo inaczej programator nie wykrywa żadnego z nich. Przy programowaniu prototypu to nie był jakiś wielki problem, ale teraz chcę to zmontować w jeden obwód drukowany więc nie będzie fizycznej możliwości rozłączenia tego połączenia, no chyba że jakimiś zworkami, innego pomysłu nie mam. Próbowałem linie łączyć jak kolega wyżej miał na schemacie, rezystorami 2,2k ale to nic nie dało. Może ktoś podpowie coś ? Czy po prostu to musi być rozłączone i nie ma innej opcji.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 lis 2013, o 13:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2012
Posty: 97
Lokalizacja: Tarnów
Pomógł: 2

Dzięki faktycznie jest tam poruszany ten problem.



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