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



Teraz jest 26 maja 2019, o 13:55


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 28 ] 
Autor Wiadomość
PostNapisane: 18 lut 2019, o 14:00 
Offline
Nowy

Dołączył(a): 09 lut 2019
Posty: 18
Pomógł: 0

Hej,

Po otrzymaniu porad na forum w wątku "Komunikacja radiowa dwóch ATmeg przez FS100A" dobrałem się do wspomnianych modułów nRF. W oparciu o poradnik, który pojawia się na pierwszym miejscu w google po wpisaniu "nrf24l01 avr tutorial" zacząłem próbować coś z nimi zrobić. Linków nie zamieszczę, bo mi nie wolno.

Próbowałem tylko, z tego co rozumiem, odczytać rejestr STATUS z modułu. Pracuję na ATmega328P. Korzystam z tego kodu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Piny są podłączone tak jak w poradniku:
CE do PB1
CSN do PB2
SPI Clock do PB5
MOSI i MISO do odpowiednio PB3 i PB4
IRQ do PD2

Dzięki diodom potrafiłem wskazać gdzie program się zawiesza (wstawiłem komentarza w kodzie wyżej), ale nie mogę znaleźć przyczyny. Pin SS jest ustawiony jako wyjście, więc ustawić SPIF na 1 powinno tylko zakończenie transmisji. Oczywiście nRF jest grzecznie podpięty do 3.3V, co sprawdziłem dwa razy przed włożeniem go do płytki stykowej.

Wiem, że Mirek zrobił fajne biblioteki i nawet kupiłem tą z SPI, jednak potrzebuję raczej wyjaśnienia niż gotowej biblioteki, którą musiałbym mozolnie badać linijka po linijce, gdy sam potrzebuję bardzo ograniczonej funkcjonalności: ja tylko chcę przesyłać po jednym bajcie kilka metrów dalej! Do tego dochodzi jeszcze szczera niechęć do poradników, tłumaczeń na YT.

Jeśli ktoś może mi pomóc i wskazać co robię źle, to będę szczerze wdzięczny.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lut 2019, o 15:31 
Online
Użytkownik

Dołączył(a): 05 sty 2015
Posty: 71
Pomógł: 1

SPIF (SPI Interrupt Flag) bit: This is a read only bit. It is set by hardware when a serial transfer is complete. SPIF is cleared by hardware when the SPI interrupt handling vector is executed, or when the SPIF bit and the SPDR register are read.



Ostatnio edytowano 18 lut 2019, o 15:41 przez Szofer, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lut 2019, o 15:39 
Offline
Nowy

Dołączył(a): 09 lut 2019
Posty: 18
Pomógł: 0

Szofer napisał(a):
/ Wait for transmission complete
while(!(SPSR & (1<<SPIF))); //tutaj kod sie zatrzymuje, tylko żółta dioda się świeci
PORTB |= (1<<PB0);

Literówka w kodzie? Nie powinno byc
while(!(SPDR & (1<<SPIF)));

?


SPIF to bit 7 rejestru SPSR, przynajmniej wg dokumentacji. Dlaczego miałoby być SPDR?

Poz tym, w praktyce też nie zadziałało po takiej zmianie ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lut 2019, o 15:52 
Online
Użytkownik

Dołączył(a): 05 sty 2015
Posty: 71
Pomógł: 1

Poprawiłem się.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lut 2019, o 16:04 
Offline
Nowy

Dołączył(a): 09 lut 2019
Posty: 18
Pomógł: 0

Niestety, przeczytałem wszystko z dokumentacji ATmegi o SPIF co tam było i zacytowanie jej niestety niewiele mi pomoże.

Skoro zapis w SPDR powoduje rozpoczęcie transmisji, a jej koniec ustawienie bitu SPIF, to w momencie zakończenia transmisji !(SPSR & (1<<SPIF)) powinno być równe 0 i pętla while powinna się skończyć.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lut 2019, o 16:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 sty 2016
Posty: 607
Pomógł: 36

A jak masz te diody podłączone? Przecież
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Ustawiasz stan wysoki, po czym w spełnionym ifie
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
zerujesz pin(bo wcześniej był w stanie wysokim) i powtarzasz warunek po 200ms

------------------------ [ Dodano po: 1 minucie ]

jeśli diodę masz podpiętą katodą do nóżki uC to zawsze przy spełnionym warunku będzie świeciła(tj będzie mrugała ale bardzo szybko)

------------------------ [ Dodano po: 6 minutach ]

jeśli dioda ma mrugać przy spełnionym warunku to wywal
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
w funkcji od SPI



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lut 2019, o 17:16 
Offline
Nowy

Dołączył(a): 09 lut 2019
Posty: 18
Pomógł: 0

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


Po zrestartowaniu:
Najpierw zgodnie z oczekiwaniami wszystkie trzy diody zaświecają się na krótko, potem gasną i żółta zostaje zapalona. Jedyne wyjaśnienie, to zatrzymanie się w pętli
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
. Myślę więc, że nie jest to kwestia tego, co było gdziekolwiek w kodzie po tej linijce.

Wspomniany if jest w pętli while(1), więc wykonywałby się co 200ms, więc jakbym cokolwiek czytał z tego nRF to któraś dioda by migała. Obecnie żółta, czyli PD7 świeci bez przerwania.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lut 2019, o 17:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 sty 2016
Posty: 607
Pomógł: 36

Dalej to masz nie tak. Proponuję togglować PD7 w funkcji spi

------------------------ [ Dodano po: 1 minucie ]

W main wyrzuć wszystkie odwołania do PD7 oprócz inicjalizacji portu



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lut 2019, o 18:37 
Offline
Nowy

Dołączył(a): 09 lut 2019
Posty: 18
Pomógł: 0

Zastosowałem się do rady, PD7 po zainicjowaniu jest ruszane tylko wewnątrz funkcji WRByteSPI.

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


Efekt wciąż ten sam (program zatrzymuje się na świeceniu żółtej diody), poza tym że po restarcie żółta nie mruga razem z resztą na starcie.

Program z całą pewnością zatrzymuje się na while(!(SPSR & (1<<SPIF))); - jest ono otoczone włączeniem i wyłączeniem żółtej diody i jest to jedyne miejsce, gdzie zmieniam stan tego pinu.



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

Dołączył(a): 13 sty 2016
Posty: 607
Pomógł: 36

To już jakieś cuda są wg mnie musi to działać, nie wiem co jeszcze, spróbuj zrobić clean projektu.

------------------------ [ Dodano po: 18 minutach ]

Irrehaare napisał(a):
jest ono otoczone włączeniem i wyłączeniem żółtej diody i jest to jedyne miejsce, gdzie zmieniam stan tego pinu.
chodziło mi o PORTD ^=(1<<PD7)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lut 2019, o 20:44 
Offline
Nowy

Dołączył(a): 09 lut 2019
Posty: 18
Pomógł: 0

Ok, bo się tu pogubimy. Cały kod, jeszcze raz.

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


Dioda żółta (PD7) jest włączana TYLKO na czas while(!(SPSR & (1<<SPIF))). W razie poprawnego działania programu powinna się zapalać na niezauważalnie krótkie momenty czasu, przez obecność _delay_ms(200) w main. W moim rozumieniu fakt, że świeci się ona i tylko ona przez cały czas stabilnym światłem sugeruje, że program zatrzymuje się na while(!(SPSR & (1<<SPIF))) - w przeciwnym razie jej miganie nie byłoby zauważalne. To z kolei oznaczałoby, że SPIF nie jest ustawiane, z jakiegoś nieznanego mi powodu.

Dioda zielona (PB0) jest potencjalnie przełączana co 200ms wewnątrz maina. Działoby się tak, gdyby program działał w sposób zamierzony.

Dioda czerwona (PC3) podobnie jak zielona wyżej, ale w wypadku gdy z rejestru będzie odczytana inna wartość niż oczekiwana.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lut 2019, o 20:58 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 mar 2015
Posty: 233
Pomógł: 15

Takie pytanie! Includujesz stdio.h - korzystasz z consoli?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lut 2019, o 21:06 
Offline
Nowy

Dołączył(a): 09 lut 2019
Posty: 18
Pomógł: 0

Wirnick napisał(a):
Takie pytanie! Includujesz stdio.h - korzystasz z consoli?


Ach, to mi zostało z poprzedniego projektu, gdzie mierzyłem odległość US-015 i wrzucałem wynik na konsolę właśnie. Do wywalenia jako zbędne, dzięki. #include <avr/interrupt.h> też poszło. Niestety, kłopotów to nie rozwiązuje.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lut 2019, o 22:28 
Offline
Nowy

Dołączył(a): 09 lut 2019
Posty: 18
Pomógł: 0

Więc JarekK wysłał mi na PW link do gotowych bibliotek na forum, ale dla ATmegi32, nie 328P. Zasugerował od razu potrzebne zmiany:
JarekK napisał(a):
Może warto spróbować gotową bibliotekę z tego forum kolegi Nefarious19.
topic11377.html
Jedyny kłopot to przeportowanie z atmegi 32 na atmege 328p.

******************************************************
Jeśli nic nie pomyliłem to wystarczy:
w pliku nRF24L01.c poprawić:

void Initialize_INTERRUPT_For_nRF(void)
{
//JKA dla ATmega32: GICR |= (1<<INT2); //enable INT2 intterupt source in GICR register
//JKA zmieniamy na przerwanie INT0 w atmega328p bo INT2 zwyczajnie nie maa
EIMSK |= (1<<INT0); //enable INT0 intterupt source in EIMSK register

//JKA dla ATmega32: MCUCSR |= (0<<ISC2); //set intterupt active on falling edge
EICRA |= (1<<ISC01); //The falling edge of INT0 generates an interrupt request.
}

//'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
// Here is external intterupt handler, if you are using interupts change the name of the vector interrupt ore live the same if you are using the same
//...................................................................................................................................................
ISR(INT0_vect) //JKA wazne ma byc w tym przypadku INT0


w pliku nRF24L01.h poprawić:
//JKA dla Atmegi 32: #define IRQ PB2 //IRQ PIN
#define IRQ PD2 //IRQ PIN JKA dla Atmega328p -> INT0


Powodzenia bo sam nie mam nRF24L01 by to sprawdzić.


Co też zrobiłem. Niestety, linku do wątku z bibliotekami nie wolno mi zamieścić, jako nowemu użytkownikowi.

Osobny program, który powinien wypisać rejestr STATUS na konsolę 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.


I na konsoli pojawia się:
Obrazek

Przypomnę, że skoro STATUS wynosi 0x0E to spodziewałbym się na konsoli linii typu "Test it! x=155, y=14".

Twórca bibliotek sugerował podłączenie zasilania nRFa przez tranzystor, jutro za dnia pewnie tego spróbuję. Byłbym też super wdzięczny, jeśli ktoś dałby radę potwierdzić, że ten program powinien działać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 lut 2019, o 22:35 
Online
Użytkownik

Dołączył(a): 05 sty 2015
Posty: 71
Pomógł: 1

Radio nie odbiera danych z SPDR i dlatego nie zeruje bitu SPIF,
Dobrze sterujesz bitem CE bo caly czas jest w low, a żeby odczytać przez radio powinjen być high wiecej jak 10us.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lut 2019, o 01:11 
Offline
Nowy

Dołączył(a): 09 lut 2019
Posty: 18
Pomógł: 0

Nie rozumiem, ja tu nic nie próbuję odczytać przez radio z innego modułu, tylko z tego który mam w danej chwili podpięty za pomocą SPI. CE jest używany przy wysyłaniu lub odbieraniu sygnałów, jak to ma się do mojej sytuacji?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lut 2019, o 02:28 
Online
Użytkownik

Dołączył(a): 05 sty 2015
Posty: 71
Pomógł: 1

Jeśli z bufora nie odbierasz danych to jak flaga ma się kasować sprzętowo?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lut 2019, o 07:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 sty 2016
Posty: 607
Pomógł: 36

Szofer napisał(a):
Jeśli z bufora nie odbierasz danych to jak flaga ma się kasować sprzętowo?

Po wykonaniu 8 cykli zegarowych, bez znaczenia co jest w buforze.
Wg mnie kolega @Irrehare powinien w pierwszej kolejności odpalić spi kody które były pokazane wcześniej MUSZĄ działać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lut 2019, o 08:43 
Offline
Nowy

Dołączył(a): 09 lut 2019
Posty: 18
Pomógł: 0

@zubik mógłbyś wyjaśnić, jak jeszcze miałbym odpalić spi? Jest to pierwsza rzecz w kodzie po deklaracjach.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lut 2019, o 08:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 sty 2016
Posty: 607
Pomógł: 36

No właśnie uruchomienie SPI jest kluczowe w tym projekcie. Załóż całkiem nowy projekt z tym przykładem wtedy będzie jasne czy moduł 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.


w ten sposób sprawdzisz czy masz sprawny moduł SPI oczywiście dodaj odpowiednie pliki nagłówkowe. Niezależnie od tego co masz lub nie masz podłączone na porct SPI dioda powinna mrugać co będzie oznaczało pracę modułu.

------------------------ [ Dodano po: 4 minutach ]

Ja podejrzewam że masz coś nie tak w ustawieniach projektu, źle wybrany mikrokontroler?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lut 2019, o 09:45 
Offline
Użytkownik

Dołączył(a): 13 lut 2012
Posty: 71
Pomógł: 6

Faktycznie, przeportowanie z atmegi32 na 328p wymaga wiekszych modyfikacji w pliku nRF24L01.h
zmiana na
#define IRQ PD2
to za mało



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lut 2019, o 10:49 
Offline
Nowy

Dołączył(a): 09 lut 2019
Posty: 18
Pomógł: 0

@zubik
Wgrałem i najpierw dioda zaczęła mrugać bez ładu i składu. Po chwili kombinowania kabelkami zauważyłem, że dioda mruga regularnie, gdy nRF nie jest podłączony. Jeśli jest, to po resecie dioda zapala się raz i tak już zostaje. W tym programie z tego co rozumiem nic go nie uruchamia, czyli może problem polega na tym, że tam też jest coś nie tak w tej kwestii?

Szczerze wątpię, żeby coś było nie tak w ustawieniach projektu: zrobiłem ich dość sporo, przy ustawianiu wszystkiego szedłem grzecznie kroczek po kroczku jak Mirek mówił na blogu i przede wszystkim: jak dotąd wszystko działało, wliczając trochę bardziej skomplikowany pomiar odległości z US-015 z wyświetleniem go na konsolę na komputerze przez USART.

Co ciekawe, w czasie jak pisałem to wyżej dioda zaczęła mrugać przez sekundę.

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


EDIT: Dioda mruga, gdy podpięty jest USBasp, który korzysta z SPI, nie mruga jak podpięty jest nRF lub obydwa. Czyli moduł w którymś momencie zepsułem...?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lut 2019, o 11:58 
Offline
Użytkownik

Dołączył(a): 13 lut 2012
Posty: 71
Pomógł: 6

Czy przeportowanie w pliku nRF24L01.h pinów dla SPI odpowiednio do atmega328p coś pomogło?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lut 2019, o 19:04 
Offline
Nowy

Dołączył(a): 09 lut 2019
Posty: 18
Pomógł: 0

@JarekK dopiero wieczorem będę miał czas, żeby to posprawdzać. Pamiętam o tej opcji, napiszę jak tylko spróbuję.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 lut 2019, o 21:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 sty 2016
Posty: 607
Pomógł: 36

Irrehaare napisał(a):
@zubik
Wgrałem i najpierw dioda zaczęła mrugać bez ładu i składu. Po chwili kombinowania kabelkami zauważyłem, że dioda mruga regularnie, gdy nRF nie jest podłączony. Jeśli jest, to po resecie dioda zapala się raz i tak już zostaje. W tym programie z tego co rozumiem nic go nie uruchamia, czyli może problem polega na tym, że tam też jest coś nie tak w tej kwestii?
To znaczy że SPI działa a jeśli są takie nietypowe problemy świadczy to o nieprawidłowościach w połączeniu, taki urok stykówek. Programator jaki masz? Jeśli chińczyka, to też może mieć wpływ na działanie całości.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lut 2019, o 17:56 
Offline
Nowy

Dołączył(a): 09 lut 2019
Posty: 18
Pomógł: 0

Po pierwsze przepraszam najmocniej za nagłe zniknięcie z tematu. W życiu mnie ciut pogoniło i nie miałem kiedy ogarnąć sprawy.

Po uwadze na temat połączeń od zubika udało mi się wyłapać problem i programem od mrugania diodą udało mi się to mruganie wygenerować od modułu NRF - niestety tylko, jeśli go mocno trzymam w określony sposób jak na pierwszym zdjęciu, dociskając goldpiny do kabli.

ObrazekObrazek

Wiem, że cyna z jednej strony PCB jest połączona z pinami z drugiej. Goldpiny były już przylutowane, wyglądają w porządku. Z drugiej strony problem wygląda jakby był w kablach, ale nie wiem co tu można zrobić lepiej. Jak ktoś na pomysł, jak najlepiej takie dwa rzędy pinów podpiąć do płytki stykowej to będę szczerze wdzięczny.

@Jarekk oczywiście w związku z powyższym wstrzymam się z software na razie, ale jak z tym poradzę, to dam Ci później znać, tutaj lub w PW.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lut 2019, o 18:45 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 1796
Pomógł: 83

Nie tylko dobry kontakt ale i długość kabli może mieć wpływ na działanie.
Stykówki potrafią napsuć krwi...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 lut 2019, o 20:29 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 13 sty 2016
Posty: 607
Pomógł: 36

Te moduły nie lubią długich przewodów, ukróć je ile się tylko da. Dodaj kondensator filtrujący na goldpiny (od góry) najlepiej tantalowy około 10uF i/lub przynajmniej ceramik 100nF.



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 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