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



Teraz jest 5 kwi 2026, o 22:40


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 29 gru 2014, o 15:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 sie 2013
Posty: 795
Lokalizacja: Poznań
Pomógł: 59

Od kilku nocy, po raz kolejny, próbuję ogarnąć SPI slave. O ile master mam ogarnięte dzięki Mirkowi i jego poradnikom, to slave mnie powalił. Nie mogę nigdzie znaleźć konkretnego poradnika i możliwe, że mylę się co do pracy tego trybu.

Moje założenia:
1. Slave otrzymuje sygnał CLK, co 8 tyknięć jest generowane przerwanie ISR(SPI_STC_vect) lub wychodzimy z pętli while( !SPSR & (1<<SPIF))
2. Po otrzymaniu przerwania lub wyjściu z pułapki przepisujemy SPDR do zmiennej
3. Czekamy na kolejne przepisanie zmiennej.

Pisałem lub ponieważ próbowałem dwóch metod.

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


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


Połączenia:

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


Master wysyła co 500ms, diody na shieldzie migają zgodnie z tym, co wysyła master, dioda cały czas świeci. Chciałem, by dioda zmieniała swój stan po każdym wysłaniu z mastera, więc co 1s. Dlaczego żaden kod slave nie działa?



Ostatnio edytowano 29 gru 2014, o 15:47 przez icer_cmg, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2014, o 15:34 
Offline
Użytkownik
Avatar użytkownika

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

Mam kawałek kodu pod atmegę32, która prajcuje jako SLAVE pod SPI.

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


W Twoim kodzie z przerwaniem w ogóle nie inicjalizujesz SPI. Napisałeś funkcję inicjalizującą SPI ale nigdzie jej nie wywołujesz. Jako SLAVE nie definiujesz użycia SS.
Sprawdź czy spiąłeś masy procesorów.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2014, o 15:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 sie 2013
Posty: 795
Lokalizacja: Poznań
Pomógł: 59

Fakt, nie było wywołania, ale to nie pomogło.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2014, o 15:52 
Offline
Użytkownik
Avatar użytkownika

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

Zrób coś takiego jak ja.
Zrób sobie zmienną z atrybutem volatile i wykorzystaj ją tylko jako flagę, że masz przerwanie.
W pętli głównej sprawdzaj tę flagę. Gdy okaże się że jest == 1 to blinkuj diodę.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2014, o 16:06 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Sprawdź połączenia. I upewnij się, że taktowanie SPI nie jest wyższe niż F_CPU/4 slave'a

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2014, o 16:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 sie 2013
Posty: 795
Lokalizacja: Poznań
Pomógł: 59

Master ma 16MHz ale SPI jest F_CPU/128
Slave ma 11,0592

Nie uwierzycie. Po rzuceniu o ścianę zadziałało. Problemem było połączenie Atmega32 a podstawka precyzyjna w ATB.



Ostatnio edytowano 29 gru 2014, o 22:08 przez icer_cmg, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2014, o 21:58 
Offline
Użytkownik
Avatar użytkownika

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

A sprawdzałeś mój kod?
Jeżeli on nie działa to znaczy że masz błąd albo w połączeniach albo w kodzie dla mastera



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 gru 2014, o 22:19 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 20 sie 2013
Posty: 795
Lokalizacja: Poznań
Pomógł: 59

Po rzucie mój kod zadziałał - i przerwanie i pułapka. Dołożyłem synchronizację przez LT z 585.

Juffre - z Twoim kodem również eksperymentowałem.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Majestic-12 [Bot] i 3 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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO