ATNEL tech-forum
https://forum.atnel.pl/

NRF24L01 - problem z czytaniem rejestru z modułu
https://forum.atnel.pl/topic21977.html
Strona 1 z 1

Autor:  Irrehaare [ 18 lut 2019, o 14:00 ]
Tytuł:  NRF24L01 - problem z czytaniem rejestru z modułu

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.

Autor:  Szofer [ 18 lut 2019, o 15:31 ]
Tytuł:  Re: NRF24L01 - problem z czytaniem rejestru z modułu

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.

Autor:  Irrehaare [ 18 lut 2019, o 15:39 ]
Tytuł:  Re: NRF24L01 - problem z czytaniem rejestru z modułu

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

Autor:  Szofer [ 18 lut 2019, o 15:52 ]
Tytuł:  Re: NRF24L01 - problem z czytaniem rejestru z modułu

Poprawiłem się.

Autor:  Irrehaare [ 18 lut 2019, o 16:04 ]
Tytuł:  Re: NRF24L01 - problem z czytaniem rejestru z modułu

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

Autor:  Irrehaare [ 18 lut 2019, o 17:16 ]
Tytuł:  Re: NRF24L01 - problem z czytaniem rejestru z modułu

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.

Autor:  Irrehaare [ 18 lut 2019, o 18:37 ]
Tytuł:  Re: NRF24L01 - problem z czytaniem rejestru z modułu

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.

Autor:  Irrehaare [ 18 lut 2019, o 20:44 ]
Tytuł:  Re: NRF24L01 - problem z czytaniem rejestru z modułu

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.

Autor:  Wirnick [ 18 lut 2019, o 20:58 ]
Tytuł:  Re: NRF24L01 - problem z czytaniem rejestru z modułu

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

Autor:  Irrehaare [ 18 lut 2019, o 21:06 ]
Tytuł:  Re: NRF24L01 - problem z czytaniem rejestru z modułu

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.

Autor:  Irrehaare [ 18 lut 2019, o 22:28 ]
Tytuł:  Re: NRF24L01 - problem z czytaniem rejestru z modułu

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

Autor:  Szofer [ 18 lut 2019, o 22:35 ]
Tytuł:  Re: NRF24L01 - problem z czytaniem rejestru z modułu

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.

Autor:  Irrehaare [ 19 lut 2019, o 01:11 ]
Tytuł:  Re: NRF24L01 - problem z czytaniem rejestru z modułu

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?

Autor:  Szofer [ 19 lut 2019, o 02:28 ]
Tytuł:  Re: NRF24L01 - problem z czytaniem rejestru z modułu

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

Autor:  Irrehaare [ 19 lut 2019, o 08:43 ]
Tytuł:  Re: NRF24L01 - problem z czytaniem rejestru z modułu

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

Autor:  JarekK [ 19 lut 2019, o 09:45 ]
Tytuł:  Re: NRF24L01 - problem z czytaniem rejestru z modułu

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

Autor:  Irrehaare [ 19 lut 2019, o 10:49 ]
Tytuł:  Re: NRF24L01 - problem z czytaniem rejestru z modułu

@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...?

Autor:  JarekK [ 19 lut 2019, o 11:58 ]
Tytuł:  Re: NRF24L01 - problem z czytaniem rejestru z modułu

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

Autor:  Irrehaare [ 19 lut 2019, o 19:04 ]
Tytuł:  Re: NRF24L01 - problem z czytaniem rejestru z modułu

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

Autor:  Irrehaare [ 26 lut 2019, o 17:56 ]
Tytuł:  Re: NRF24L01 - problem z czytaniem rejestru z modułu

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.

Autor:  micky [ 26 lut 2019, o 18:45 ]
Tytuł:  Re: NRF24L01 - problem z czytaniem rejestru z modułu

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

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/